From 632422286085d7a6bd95913b7224027c97df006a Mon Sep 17 00:00:00 2001
From: Carsten Schoenert <c.schoenert@t-online.de>
Date: Mon, 27 Apr 2020 09:33:34 +0200
Subject: [PATCH] New upstream version 76.0~b2

---
 Cargo.lock                                    |    11 +-
 accessible/base/nsCoreUtils.cpp               |     4 +-
 accessible/base/nsCoreUtils.h                 |     4 +-
 accessible/mac/mozAccessible.mm               |     3 +-
 accessible/xul/XULTreeAccessible.cpp          |     2 +-
 browser/base/content/tabbrowser-tabs.js       |     5 +
 .../aboutlogins/AboutLoginsChild.jsm          |    25 +-
 .../aboutlogins/AboutLoginsParent.jsm         |   103 +-
 .../content/components/login-item.css         |     2 +-
 .../content/components/login-item.js          |    10 +-
 .../content/components/login-list.js          |    16 +
 .../browser_aaa_eventTelemetry_run_first.js   |    57 +-
 ...r_vulnerableLoginAddedInSecondaryWindow.js |   116 +-
 .../newtab/aboutwelcome/AboutWelcomeChild.jsm |    24 +
 .../aboutwelcome/AboutWelcomeParent.jsm       |    23 +-
 .../aboutwelcome/content/aboutwelcome.css     |    10 +-
 .../aboutwelcome/aboutwelcome.scss            |    16 +-
 .../OnboardingMessage/_OnboardingMessage.scss |     7 +-
 .../templates/Trailhead/_Trailhead.scss       |     4 +-
 .../content-src/lib/selectLayoutRender.js     |     1 +
 .../newtab/css/activity-stream-linux.css      |    10 +-
 .../newtab/css/activity-stream-mac.css        |    10 +-
 .../newtab/css/activity-stream-windows.css    |    10 +-
 .../data/content/activity-stream.bundle.js    |     2 +-
 .../newtab/lib/ASRouterTriggerListeners.jsm   |    27 +-
 .../newtab/lib/CFRMessageProvider.jsm         |    78 +-
 .../newtab/lib/DiscoveryStreamFeed.jsm        |     2 +-
 browser/components/newtab/package-lock.json   |    26 +-
 browser/components/newtab/package.json        |     4 +-
 .../browser/browser_aboutwelcome_observer.js  |    16 +-
 .../browser_asrouter_trigger_listeners.js     |    75 +-
 .../unit/asrouter/CFRMessageProvider.test.js  |     2 +-
 browser/components/newtab/vendor/react-dev.js |  5723 +--
 .../components/newtab/vendor/react-dom-dev.js | 42634 ++++++++--------
 browser/components/newtab/vendor/react-dom.js |   461 +-
 browser/components/newtab/vendor/react.js     |    50 +-
 .../preferences/in-content/privacy.js         |     2 +-
 .../protections/content/protections.css       |     2 +-
 browser/components/urlbar/UrlbarInput.jsm     |     7 +-
 .../urlbar/tests/browser/browser_top_sites.js |    60 +
 browser/config/version_display.txt            |     2 +-
 .../formautofill/FormAutofillParent.jsm       |     4 +-
 browser/installer/windows/nsis/shared.nsh     |    57 +-
 .../installer/windows/nsis/uninstaller.nsi    |     2 +-
 browser/locales/l10n-changesets.json          |   192 +-
 browser/themes/shared/browser.inc.css         |     2 +-
 browser/themes/shared/toolbarbuttons.inc.css  |     8 +-
 .../permissionPrompts/browser.ini             |     5 +-
 build/defines.sh                              |     2 +-
 comm/.gecko_rev.yml                           |     3 +-
 .../public/imIConversationsService.idl        |     6 +-
 comm/chat/components/public/prplIMessage.idl  |     2 +
 comm/chat/components/src/imConversations.jsm  |    22 +-
 comm/chat/modules/OTR.jsm                     |     2 +-
 comm/chat/modules/OTRUI.jsm                   |    14 +-
 comm/chat/modules/imThemes.jsm                |     3 +
 comm/chat/modules/jsProtoHelper.jsm           |     1 +
 comm/mail/base/content/mailWindowOverlay.js   |     8 +-
 comm/mail/base/content/messenger.xhtml        |     5 +-
 .../extensions/ExtensionToolbarButtons.jsm    |     7 +-
 .../browser_ext_browserAction_properties.js   |    70 +-
 .../components/im/messages/bubbles/main.css   |     2 +-
 .../mail/components/im/messages/mail/main.css |     2 +-
 .../components/preferences/general.inc.xhtml  |    24 +-
 .../components/preferences/passwordManager.js |     2 +-
 comm/mail/components/preferences/privacy.js   |     2 +-
 comm/mail/config/version_display.txt          |     2 +-
 comm/mail/locales/l10n-changesets.json        |   122 +-
 config/recurse.mk                             |     6 +-
 .../rules/views/text-property-editor.js       |    12 +-
 .../client/netmonitor/src/utils/tooltips.js   |     4 +-
 .../test/browser_net_copy_as_curl.js          |     2 +-
 .../netmonitor/test/browser_net_curl-utils.js |    12 +-
 devtools/client/shared/curl.js                |     2 +-
 .../client/shared/test/xpcshell/test_curl.js  |    11 +-
 dom/base/CustomElementRegistry.cpp            |     3 +-
 dom/base/CustomElementRegistry.h              |     2 +-
 dom/base/Element.cpp                          |   103 +-
 dom/base/test/common_postMessages.js          |    20 +-
 dom/clients/manager/ClientOpenWindowUtils.cpp |     5 +-
 dom/filehandle/ActorsParent.cpp               |    19 +
 dom/html/HTMLImageElement.cpp                 |    10 +-
 dom/html/HTMLImageElement.h                   |     2 +
 dom/indexedDB/IDBCursor.cpp                   |    14 +-
 dom/indexedDB/test/file.js                    |     8 -
 dom/indexedDB/test/helpers.js                 |    38 +-
 .../test_filehandle_truncate_exceptions.html  |     8 +
 .../test/unit/test_wasm_put_get_values.js     |     6 +-
 .../test/unit/xpcshell-head-parent-process.js |    13 -
 dom/media/MediaManager.cpp                    |    12 +-
 dom/media/webrtc/MediaEnginePrefs.h           |     2 +
 dom/media/webrtc/MediaEngineWebRTCAudio.cpp   |    36 +
 dom/media/webrtc/MediaEngineWebRTCAudio.h     |     2 +
 .../tests/test_webassembly_compile.html       |     1 -
 dom/quota/ActorsParent.cpp                    |     4 +
 dom/quota/FileStreams.cpp                     |     8 +-
 dom/quota/QuotaCommon.cpp                     |    37 +-
 dom/quota/QuotaCommon.h                       |     4 +
 dom/quota/QuotaObject.h                       |     2 +-
 dom/quota/test/unit/head-shared.js            |     6 +
 .../test/test_notification_openWindow.html    |    45 +-
 .../mochitest/general/test_interfaces.js      |     8 +-
 dom/webgpu/mochitest/mochitest.ini            |     1 +
 dom/worklet/tests/test_audioWorklet_WASM.html |    17 +-
 .../tests/test_audioWorklet_options.html      |    18 +-
 dom/worklet/tests/test_promise.html           |    17 +-
 dom/xul/XULTreeElement.cpp                    |     6 +-
 dom/xul/XULTreeElement.h                      |     2 +-
 gfx/thebes/DeviceManagerDx.cpp                |    28 +
 gfx/thebes/DeviceManagerDx.h                  |     4 +
 gfx/thebes/DisplayConfigWindows.cpp           |    78 +
 gfx/thebes/DisplayConfigWindows.h             |    17 +
 gfx/thebes/SharedFontList.h                   |     9 +-
 gfx/thebes/gfxPlatform.cpp                    |     9 +-
 gfx/thebes/gfxPlatformFontList.cpp            |    20 +-
 gfx/thebes/gfxTextRun.cpp                     |     3 +-
 gfx/thebes/gfxWindowsPlatform.cpp             |    40 +-
 gfx/thebes/moz.build                          |     1 +
 gfx/wr/webrender/src/clip.rs                  |    35 +-
 gfx/wr/webrender/src/device/gl.rs             |    46 +-
 gfx/wr/webrender/src/frame_builder.rs         |     1 +
 gfx/wr/webrender/src/picture.rs               |    57 +-
 gfx/wr/webrender/src/renderer.rs              |     5 +-
 gfx/wr/webrender/src/scene.rs                 |     1 +
 gfx/wr/webrender/src/screen_capture.rs        |     2 +-
 .../clip/clip-empty-inner-rect-ref.yaml       |    20 +
 .../reftests/clip/clip-empty-inner-rect.yaml  |    28 +
 gfx/wr/wrench/reftests/clip/reftest.list      |     2 +-
 js/src/builtin/TestingFunctions.cpp           |    94 -
 js/src/jit/AliasAnalysis.cpp                  |     1 +
 js/src/jit/MIR.h                              |     7 +-
 js/src/rust/Cargo.toml                        |     2 +
 js/src/rust/lib.rs                            |     5 +
 js/src/rust/shared/Cargo.toml                 |     1 -
 js/src/rust/shared/lib.rs                     |     2 -
 js/src/{wasm/rust/src/lib.rs => rust/wasm.rs} |     0
 js/src/{wasm => shell}/WasmTesting.cpp        |     2 +-
 js/src/{wasm => shell}/WasmTesting.h          |     6 +-
 js/src/shell/js.cpp                           |    94 +
 js/src/shell/moz.build                        |     3 +-
 js/src/wasm/WasmStubs.cpp                     |     2 +-
 js/src/wasm/moz.build                         |     1 -
 js/src/wasm/rust/Cargo.toml                   |    13 -
 js/xpconnect/src/XPCJSContext.cpp             |     5 +
 layout/base/PresShell.cpp                     |    26 +-
 layout/generic/crashtests/1628804.html        |    21 +
 layout/generic/crashtests/crashtests.list     |     1 +
 layout/generic/nsBlockFrame.cpp               |     3 +-
 layout/generic/nsFrame.cpp                    |     7 +
 layout/generic/nsIFrame.h                     |    12 +-
 layout/generic/nsImageFrame.cpp               |     5 +
 media/libvpx/moz.build                        |     2 +
 .../src/media-conduit/VideoStreamFactory.cpp  |    13 +-
 modules/libpref/init/StaticPrefList.yaml      |    28 +-
 modules/libpref/init/all.js                   |     1 +
 netwerk/base/PartiallySeekableInputStream.cpp |     2 +
 netwerk/dns/effective_tld_names.dat           |    53 +-
 netwerk/protocol/http/nsHttpResponseHead.cpp  |     2 +-
 ...bug_1626381_about_addons_sidebar_titles.py |    45 +
 security/manager/ssl/OSReauthenticator.cpp    |    25 +-
 security/manager/ssl/OSReauthenticator.h      |     3 +-
 .../manager/ssl/OSReauthenticatorDarwin.mm    |    12 +-
 security/manager/ssl/StaticHPKPins.h          |     2 +-
 security/manager/ssl/nsSTSPreloadList.inc     |  2945 +-
 .../ssl/tests/unit/test_osreauthenticator.js  |    20 +-
 .../win/src/sandboxbroker/sandboxBroker.cpp   |    14 +
 .../settings/dumps/blocklists/addons.json     |     2 +-
 .../settings/dumps/main/search-config.json    |     2 +-
 sourcestamp.txt                               |     6 +-
 storage/TelemetryVFS.cpp                      |     8 +-
 taskcluster/ci/test/mochitest.yml             |     1 +
 .../org.mozilla.firefox.appdata.xml.in        |    14 +-
 taskcluster/docker/firefox-flatpak/runme.sh   |    14 +-
 .../tests/benchmarks/raptor-webaudio.ini      |     2 +-
 .../custom-element-reaction-queue.html        |    33 +
 .../contenteditable-with-empty-block-ref.html |     7 +
 .../contenteditable-with-empty-block.html     |    11 +
 .../image-loading-lazy-srcset.html            |    38 +
 ...selection-select-all-move-input-crash.html |    10 +
 third_party/rust/nom/.cargo-checksum.json     |     2 +-
 third_party/rust/nom/.travis.yml              |   101 -
 .../ar/toolkit/about/aboutAddons.ftl          |    14 +
 .../ar/toolkit/global/profileDowngrade.ftl    |    16 +
 thunderbird-l10n/ar/manifest.json             |    58 +-
 .../ast/toolkit/about/aboutAddons.ftl         |    16 +
 .../ast/toolkit/global/profileDowngrade.ftl   |     3 +
 thunderbird-l10n/ast/manifest.json            |    64 +-
 .../be/devtools/client/debugger.properties    |    67 +-
 .../be/devtools/client/inspector.properties   |     4 +
 .../be/devtools/client/jsonview.properties    |     4 +-
 .../be/devtools/client/netmonitor.properties  |    27 +-
 .../global-platform/mac/accessible.properties |     5 +-
 .../chrome/be/locale/be/global/css.properties |     3 +
 .../be/locale/be/global/dom/dom.properties    |     3 +-
 .../be/global/security/security.properties    |    13 +-
 .../be/locale/be/necko/necko.properties       |     8 +-
 .../be/devtools/client/aboutdebugging.ftl     |     3 +
 .../be/toolkit/about/aboutAddons.ftl          |    27 +
 .../be/toolkit/about/aboutSupport.ftl         |     6 +
 .../be/toolkit/about/certviewer.ftl           |    15 +
 .../be/toolkit/global/processTypes.ftl        |     2 +
 .../be/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/be/manifest.json             |    66 +-
 .../bg/toolkit/about/aboutAddons.ftl          |    26 +
 .../bg/toolkit/global/profileDowngrade.ftl    |    15 +
 thunderbird-l10n/bg/manifest.json             |    52 +-
 .../locale/br/global/layout_errors.properties |    14 +-
 .../br/toolkit/about/aboutAddons.ftl          |    26 +
 .../br/toolkit/about/certviewer.ftl           |    18 +
 .../br/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/br/manifest.json             |    72 +-
 .../messengercompose/composeMsgs.properties   |     6 +-
 .../ca/toolkit/about/aboutAddons.ftl          |    26 +
 .../ca/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/ca/manifest.json             |    64 +-
 .../cak/toolkit/about/aboutAddons.ftl         |    26 +
 .../cak/toolkit/global/profileDowngrade.ftl   |    17 +
 thunderbird-l10n/cak/manifest.json            |    64 +-
 .../cs/devtools/client/debugger.properties    |    36 +-
 .../cs/locale/cs/global/dom/dom.properties    |     5 +-
 .../cs/locale/cs/necko/necko.properties       |     3 +
 .../cs/devtools/client/aboutdebugging.ftl     |     4 +
 .../cs/toolkit/about/aboutAddons.ftl          |    40 +-
 .../cs/toolkit/about/aboutPlugins.ftl         |     2 +-
 .../cs/toolkit/about/aboutSupport.ftl         |     6 +
 .../cs/toolkit/about/certviewer.ftl           |    13 +
 .../cs/toolkit/global/processTypes.ftl        |     2 +
 .../cs/toolkit/global/profileDowngrade.ftl    |    19 +
 thunderbird-l10n/cs/manifest.json             |    64 +-
 .../cy/devtools/client/inspector.properties   |     4 +
 .../chrome/cy/locale/cy/global/css.properties |     3 +
 .../cy/global/security/security.properties    |     6 +
 .../cy/locale/cy/messenger/messenger.dtd      |     2 +
 .../cy/locale/cy/messenger/pgpmime.properties |     2 +
 .../cy/locale/cy/necko/necko.properties       |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../cy/messenger/accountCentral.ftl           |     9 +
 .../cy/toolkit/about/aboutAddons.ftl          |    27 +
 .../cy/toolkit/about/aboutSupport.ftl         |     6 +
 .../cy/toolkit/about/certviewer.ftl           |    13 +
 .../cy/toolkit/global/processTypes.ftl        |     2 +
 .../cy/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/cy/manifest.json             |    66 +-
 .../da/devtools/client/debugger.properties    |    67 +-
 .../da/devtools/client/inspector.properties   |     4 +
 .../da/devtools/client/jsonview.properties    |     4 +-
 .../da/devtools/client/netmonitor.properties  |    41 +-
 .../da/devtools/client/toolbox.properties     |    21 -
 .../da/devtools/client/webconsole.properties  |    21 +-
 .../global-platform/mac/accessible.properties |     5 +-
 .../chrome/da/locale/da/global/css.properties |     2 +
 .../da/locale/da/global/dom/dom.properties    |     3 +-
 .../locale/da/global/layout_errors.properties |     2 +-
 .../da/global/security/security.properties    |    12 +-
 .../locale/da/messenger/accountCreation.dtd   |     2 +-
 .../locale/da/messenger/imapMsgs.properties   |    10 +-
 .../da/locale/da/necko/necko.properties       |     8 +-
 .../da/devtools/client/aboutdebugging.ftl     |     4 +
 .../da/toolkit/about/aboutAddons.ftl          |    27 +
 .../da/toolkit/about/aboutSupport.ftl         |     9 +
 .../da/toolkit/about/certviewer.ftl           |    16 +
 .../da/toolkit/global/processTypes.ftl        |     3 +
 .../da/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/da/manifest.json             |    56 +-
 .../de/toolkit/about/aboutAddons.ftl          |    26 +
 .../de/toolkit/about/certviewer.ftl           |     9 +
 .../de/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/de/manifest.json             |    70 +-
 .../dsb/devtools/client/inspector.properties  |     4 +
 .../dsb/locale/dsb/global/css.properties      |     2 +
 .../dsb/global/security/security.properties   |     6 +
 .../dsb/locale/dsb/messenger/messenger.dtd    |     2 +
 .../locale/dsb/messenger/pgpmime.properties   |     2 +
 .../dsb/locale/dsb/necko/necko.properties     |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../dsb/messenger/accountCentral.ftl          |     9 +
 .../dsb/toolkit/about/aboutAddons.ftl         |    27 +
 .../dsb/toolkit/about/aboutSupport.ftl        |     6 +
 .../dsb/toolkit/about/certviewer.ftl          |    13 +
 .../dsb/toolkit/global/processTypes.ftl       |     2 +
 .../dsb/toolkit/global/profileDowngrade.ftl   |    17 +
 thunderbird-l10n/dsb/manifest.json            |    56 +-
 .../devtools/client/font-inspector.properties |     2 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |     5 +
 .../el/toolkit/about/aboutAddons.ftl          |    26 +
 .../el/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/el/manifest.json             |    68 +-
 .../devtools/client/inspector.properties      |     4 +
 .../en-GB/locale/en-GB/global/css.properties  |     3 +
 .../en-GB/global/security/security.properties |     6 +
 .../locale/en-GB/messenger/messenger.dtd      |     2 +
 .../locale/en-GB/messenger/pgpmime.properties |     2 +
 .../en-GB/locale/en-GB/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../en-GB/messenger/accountCentral.ftl        |     9 +
 .../en-GB/toolkit/about/aboutAddons.ftl       |    27 +
 .../en-GB/toolkit/about/aboutSupport.ftl      |     6 +
 .../en-GB/toolkit/about/certviewer.ftl        |    13 +
 .../en-GB/toolkit/global/processTypes.ftl     |     2 +
 .../en-GB/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/en-GB/manifest.json          |    74 +-
 .../devtools/client/inspector.properties      |     4 +
 .../es-AR/locale/es-AR/global/css.properties  |     3 +
 .../es-AR/global/security/security.properties |     6 +
 .../es-AR/locale/es-AR/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../es-AR/toolkit/about/aboutAddons.ftl       |    27 +
 .../es-AR/toolkit/about/aboutSupport.ftl      |     6 +
 .../es-AR/toolkit/about/certviewer.ftl        |    13 +
 .../es-AR/toolkit/global/processTypes.ftl     |     2 +
 .../es-AR/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/es-AR/manifest.json          |    62 +-
 .../devtools/client/inspector.properties      |     4 +
 .../es-ES/locale/es-ES/global/css.properties  |     3 +
 .../es-ES/global/security/security.properties |     6 +
 .../es-ES/locale/es-ES/necko/necko.properties |     3 +
 .../es-ES/toolkit/about/aboutAddons.ftl       |    27 +
 .../es-ES/toolkit/about/aboutSupport.ftl      |     6 +
 .../es-ES/toolkit/about/certviewer.ftl        |    13 +
 .../es-ES/toolkit/global/processTypes.ftl     |     2 +
 .../es-ES/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/es-ES/manifest.json          |    58 +-
 .../et/toolkit/about/aboutAddons.ftl          |    26 +
 .../et/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/et/manifest.json             |    64 +-
 .../eu/devtools/client/inspector.properties   |     4 +
 .../chrome/eu/locale/eu/global/css.properties |     3 +
 .../eu/global/security/security.properties    |     6 +
 .../eu/locale/eu/messenger/addons.properties  |    11 +-
 .../locale/eu/messenger/customizeToolbar.dtd  |     5 +-
 .../locale/eu/messenger/imapMsgs.properties   |    16 +-
 .../eu/locale/eu/messenger/messenger.dtd      |     4 +-
 .../locale/eu/messenger/messenger.properties  |     7 +-
 .../eu/locale/eu/messenger/pgpmime.properties |     2 +
 .../eu/messenger/preferences/general.dtd      |     4 +-
 .../eu/locale/eu/necko/necko.properties       |     3 +
 .../eu/locale/eu/pipnss/nsserrors.properties  |     6 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../eu/messenger/accountCentral.ftl           |    22 +
 .../eu/toolkit/about/aboutAddons.ftl          |    27 +
 .../eu/toolkit/about/aboutSupport.ftl         |     6 +
 .../eu/toolkit/about/certviewer.ftl           |    13 +
 .../eu/toolkit/global/processTypes.ftl        |     2 +
 .../eu/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/eu/manifest.json             |    80 +-
 .../fi/devtools/client/inspector.properties   |     4 +
 .../global-platform/mac/accessible.properties |     5 +-
 .../chrome/fi/locale/fi/global/css.properties |     3 +
 .../fi/locale/fi/global/dom/dom.properties    |     3 +-
 .../locale/fi/global/layout_errors.properties |     1 -
 .../fi/global/security/security.properties    |     6 +
 .../fi/locale/fi/messenger/addons.properties  |    11 +-
 .../locale/fi/messenger/customizeToolbar.dtd  |     3 +-
 .../locale/fi/messenger/imapMsgs.properties   |    16 +-
 .../fi/locale/fi/messenger/messenger.dtd      |     2 +
 .../locale/fi/messenger/messenger.properties  |     7 +-
 .../fi/locale/fi/messenger/pgpmime.properties |     2 +
 .../fi/messenger/preferences/general.dtd      |     4 +-
 .../fi/locale/fi/necko/necko.properties       |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |     8 +
 .../fi/devtools/client/aboutdebugging.ftl     |     3 +
 .../fi/messenger/accountCentral.ftl           |     9 +
 .../fi/toolkit/about/aboutAddons.ftl          |    27 +
 .../fi/toolkit/about/aboutSupport.ftl         |     6 +
 .../fi/toolkit/about/certviewer.ftl           |    15 +
 .../fi/toolkit/global/processTypes.ftl        |     2 +
 .../fi/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/fi/manifest.json             |    66 +-
 .../fr/calendar/preferences/general.dtd       |     2 +-
 .../fr/devtools/client/debugger.properties    |    67 +-
 .../fr/devtools/client/inspector.properties   |     4 +
 .../fr/devtools/client/netmonitor.properties  |    15 +-
 .../chrome/fr/locale/fr/global/css.properties |     3 +
 .../fr/global/security/security.properties    |     6 +
 .../fr/locale/fr/messenger/addons.properties  |    11 +-
 .../locale/fr/messenger/customizeToolbar.dtd  |     5 +-
 .../locale/fr/messenger/imapMsgs.properties   |    16 +-
 .../fr/locale/fr/messenger/messenger.dtd      |     2 +
 .../locale/fr/messenger/messenger.properties  |     7 +-
 .../fr/locale/fr/messenger/pgpmime.properties |     2 +
 .../fr/messenger/preferences/general.dtd      |     4 +-
 .../fr/locale/fr/necko/necko.properties       |     7 +-
 .../fr/locale/fr/pippki/pippki.properties     |   108 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../fr/devtools/client/aboutdebugging.ftl     |     3 +
 .../fr/messenger/accountCentral.ftl           |     9 +
 .../fr/toolkit/about/aboutAddons.ftl          |    27 +
 .../fr/toolkit/about/aboutSupport.ftl         |     6 +
 .../fr/toolkit/about/certviewer.ftl           |    15 +
 .../fr/toolkit/global/processTypes.ftl        |     2 +
 .../fr/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/fr/manifest.json             |    64 +-
 .../devtools/client/inspector.properties      |     4 +
 .../fy-NL/locale/fy-NL/global/css.properties  |     3 +
 .../fy-NL/global/security/security.properties |     6 +
 .../locale/fy-NL/messenger/messenger.dtd      |     2 +
 .../locale/fy-NL/messenger/pgpmime.properties |     3 +
 .../fy-NL/locale/fy-NL/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../fy-NL/messenger/accountCentral.ftl        |     9 +
 .../fy-NL/toolkit/about/aboutAddons.ftl       |    27 +
 .../fy-NL/toolkit/about/aboutSupport.ftl      |     6 +
 .../fy-NL/toolkit/about/certviewer.ftl        |    13 +
 .../fy-NL/toolkit/global/processTypes.ftl     |     2 +
 .../fy-NL/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/fy-NL/manifest.json          |    84 +-
 .../ga-IE/toolkit/about/aboutAddons.ftl       |    12 +
 .../ga-IE/toolkit/global/profileDowngrade.ftl |     3 +
 thunderbird-l10n/ga-IE/manifest.json          |    70 +-
 .../gd/toolkit/about/aboutAddons.ftl          |    24 +
 .../gd/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/gd/manifest.json             |    62 +-
 .../gl/toolkit/about/aboutAddons.ftl          |    22 +
 .../gl/toolkit/global/profileDowngrade.ftl    |     3 +
 thunderbird-l10n/gl/manifest.json             |    82 +-
 .../he/devtools/client/debugger.properties    |     4 +-
 .../he/devtools/client/jsonview.properties    |     4 +-
 .../locale/he/global/commonDialogs.properties |     2 +-
 .../he/locale/he/necko/necko.properties       |    13 +-
 .../he/toolkit/about/aboutAddons.ftl          |    27 +
 .../he/toolkit/about/aboutSupport.ftl         |     1 +
 .../he/toolkit/about/certviewer.ftl           |    15 +
 .../he/toolkit/global/processTypes.ftl        |     2 +
 .../he/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/he/manifest.json             |    70 +-
 .../devtools/client/aboutdebugging.properties |     2 +-
 .../hr/devtools/client/inspector.properties   |     2 +-
 .../hr/devtools/client/webconsole.properties  |     2 +-
 .../hr/devtools/client/webide.properties      |     2 +-
 .../hr/devtools/shared/debugger.properties    |     2 +-
 .../chrome/hr/locale/hr/global/appPicker.dtd  |     2 +-
 .../hr/locale/hr/global/appstrings.properties |    16 +-
 .../locale/hr/global/autocomplete.properties  |     4 +-
 .../hr/locale/hr/global/browser.properties    |     4 +-
 .../hr/locale/hr/global/dom/dom.properties    |     5 +-
 .../hr/locale/hr/global/extensions.properties |     2 +-
 .../hr/global/layout/HtmlForm.properties      |     2 +-
 .../chrome/hr/locale/hr/global/netError.dtd   |    10 +-
 .../locale/hr/global/search/search.properties |     6 +-
 .../hr/locale/hr/messenger/messenger.dtd      |     2 +
 .../hr/locale/hr/messenger/pgpmime.properties |     2 +
 .../mozapps/downloads/unknownContentType.dtd  |     2 +-
 .../hr/mozapps/extensions/extensions.dtd      |     2 +-
 .../profile/profileSelection.properties       |     4 +-
 .../hr/locale/hr/necko/necko.properties       |     2 +-
 .../hr/passwordmgr/passwordmgr.properties     |     2 +-
 .../hr/locale/hr/pipnss/nsserrors.properties  |    18 +-
 .../hr/locale/hr/pipnss/pipnss.properties     |     2 +-
 .../hr/locale/hr/pippki/pippki.properties     |     2 +-
 .../locale/hr/pluginproblem/pluginproblem.dtd |     2 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../hr/messenger/accountCentral.ftl           |     9 +
 .../hr/security/certificates/certManager.ftl  |     4 +-
 .../security/certificates/deviceManager.ftl   |     2 +-
 .../hr/toolkit/about/aboutAddons.ftl          |    32 +-
 .../hr/toolkit/about/aboutRights.ftl          |     2 +-
 .../hr/toolkit/about/aboutSupport.ftl         |     4 +-
 .../hr/toolkit/about/certviewer.ftl           |     2 +-
 .../hr/toolkit/global/createProfileWizard.ftl |     8 +-
 .../hr/toolkit/global/profileDowngrade.ftl    |    17 +
 .../hr/toolkit/global/profileSelection.ftl    |     2 +-
 .../passwordmgr/passwordManagerList.ftl       |     4 +-
 .../hr/toolkit/preferences/preferences.ftl    |     2 +-
 thunderbird-l10n/hr/manifest.json             |    74 +-
 .../locale/hsb/calendar/calendar.properties   |     9 +-
 .../hsb/devtools/client/inspector.properties  |     4 +
 .../locale/hsb/global/appstrings.properties   |     4 +-
 .../hsb/locale/hsb/global/css.properties      |     3 +
 .../chrome/hsb/locale/hsb/global/netError.dtd |     8 +-
 .../hsb/global/security/security.properties   |     6 +
 .../locale/hsb/messenger/addons.properties    |     2 +-
 .../chrome/hsb/locale/hsb/messenger/am-im.dtd |     2 +-
 .../locale/hsb/messenger/imAccountWizard.dtd  |     2 +-
 .../hsb/messenger/importMsgs.properties       |     8 +-
 .../hsb/locale/hsb/messenger/messenger.dtd    |     2 +
 .../hsb/locale/hsb/messenger/netError.dtd     |     8 +-
 .../locale/hsb/messenger/pgpmime.properties   |     2 +
 .../hsb/messenger/preferences/connection.dtd  |    10 +-
 .../hsb/mozapps/update/updates.properties     |     5 +-
 .../hsb/locale/hsb/necko/necko.properties     |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../hsb/messenger/accountCentral.ftl          |     9 +
 .../policies/policies-descriptions.ftl        |     2 +-
 .../hsb/toolkit/about/aboutAddons.ftl         |    27 +
 .../hsb/toolkit/about/aboutSupport.ftl        |     6 +
 .../hsb/toolkit/about/certviewer.ftl          |    13 +
 .../hsb/toolkit/global/processTypes.ftl       |     2 +
 .../hsb/toolkit/global/profileDowngrade.ftl   |    17 +
 thunderbird-l10n/hsb/manifest.json            |    70 +-
 .../hu/devtools/client/debugger.properties    |    67 +-
 .../hu/devtools/client/inspector.properties   |     4 +
 .../hu/devtools/client/jsonview.properties    |     4 +-
 .../hu/devtools/client/netmonitor.properties  |    27 +-
 .../global-platform/mac/accessible.properties |     5 +-
 .../chrome/hu/locale/hu/global/css.properties |     3 +
 .../hu/locale/hu/global/dom/dom.properties    |     3 +-
 .../hu/global/security/security.properties    |    13 +-
 .../hu/locale/hu/messenger/messenger.dtd      |     2 +
 .../hu/locale/hu/messenger/pgpmime.properties |     2 +
 .../hu/locale/hu/necko/necko.properties       |     8 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../hu/devtools/client/aboutdebugging.ftl     |     3 +
 .../hu/messenger/accountCentral.ftl           |     9 +
 .../hu/toolkit/about/aboutAddons.ftl          |    27 +
 .../hu/toolkit/about/aboutSupport.ftl         |     6 +
 .../hu/toolkit/about/certviewer.ftl           |    15 +
 .../hu/toolkit/global/processTypes.ftl        |     2 +
 .../hu/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/hu/manifest.json             |    66 +-
 .../hy-AM/devtools/client/debugger.properties |    45 +-
 .../devtools/client/font-inspector.properties |     2 +-
 .../devtools/client/inspector.properties      |     7 +-
 .../hy-AM/devtools/client/layout.properties   |     2 +-
 .../hy-AM/devtools/client/memory.properties   |     2 +-
 .../devtools/client/netmonitor.properties     |    32 +-
 .../hy-AM/devtools/client/performance.dtd     |     2 +-
 .../global-platform/mac/accessible.properties |     4 +-
 .../hy-AM/global/layout/htmlparser.properties |     4 +-
 .../hy-AM/global/layout/xmlparser.properties  |    24 +-
 .../hy-AM/global/layout_errors.properties     |     5 +-
 .../hy-AM/global/mathml/mathml.properties     |    18 +-
 .../global/nsWebBrowserPersist.properties     |    18 +-
 .../locale/hy-AM/global/printing.properties   |    39 +-
 .../hy-AM/global/security/caps.properties     |    35 +-
 .../hy-AM/global/security/csp.properties      |    50 +-
 .../hy-AM/global/security/security.properties |    17 +-
 .../locale/hy-AM/global/svg/svg.properties    |     2 +-
 .../locale/hy-AM/global/xml/prettyprint.dtd   |     2 +-
 .../locale/hy-AM/global/xslt/xslt.properties  |    60 +-
 .../hy-AM/locale/hy-AM/necko/necko.properties |    40 +-
 .../locale/hy-AM/pipnss/pipnss.properties     |    16 +-
 .../hy-AM/devtools/client/aboutdebugging.ftl  |     2 +-
 .../hy-AM/devtools/client/toolbox-options.ftl |     4 +
 .../hy-AM/toolkit/about/aboutAddons.ftl       |    26 +
 .../hy-AM/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/hy-AM/manifest.json          |    78 +-
 .../locale/id/calendar/calendarCreation.dtd   |     2 +-
 .../chrome/id/locale/id/chat/irc.properties   |     2 +-
 .../id/locale/id/chat/matrix.properties       |     8 +-
 .../chrome/id/locale/id/chat/xmpp.properties  |     3 +-
 .../devtools/client/accessibility.properties  |     2 +-
 .../id/devtools/client/jsonview.properties    |     4 +-
 .../global-platform/mac/accessible.properties |     5 +-
 .../id/locale/id/lightning/lightning.dtd      |     4 +-
 .../id/locale/id/messenger/am-advanced.dtd    |     4 +-
 .../chrome/id/locale/id/messenger/am-main.dtd |     4 +-
 .../locale/id/messenger/imapMsgs.properties   |    17 +-
 .../locale/id/messenger/messenger.properties  |     8 +-
 .../id/security/certificates/certManager.ftl  |    26 +-
 .../id/toolkit/about/aboutAddons.ftl          |    26 +
 .../id/toolkit/global/processTypes.ftl        |     2 +
 .../id/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/id/manifest.json             |    76 +-
 .../is/devtools/client/debugger.properties    |   340 +-
 .../is/toolkit/about/aboutAddons.ftl          |    24 +
 .../is/toolkit/global/profileDowngrade.ftl    |    10 +
 .../is/toolkit/intl/languageNames.ftl         |     1 +
 .../is/toolkit/printing/printPreview.ftl      |     7 +-
 thunderbird-l10n/is/manifest.json             |    74 +-
 .../it/devtools/client/debugger.properties    |     1 +
 .../it/devtools/client/layout.properties      |     4 +-
 .../it/devtools/client/netmonitor.properties  |     4 +
 .../chrome/it/locale/it/global/css.properties |     1 +
 .../it/locale/it/global/dom/dom.properties    |     8 +-
 .../it/global/security/security.properties    |     2 +
 .../it/locale/it/messenger/messenger.dtd      |     2 +
 .../it/locale/it/messenger/pgpmime.properties |    11 +-
 .../it/locale/it/necko/necko.properties       |    17 +-
 .../it/messenger/accountCentral.ftl           |     9 +
 .../it/toolkit/about/aboutAddons.ftl          |    27 +
 .../it/toolkit/about/aboutSupport.ftl         |     1 +
 .../it/toolkit/about/certviewer.ftl           |    18 +
 .../it/toolkit/global/processTypes.ftl        |     1 +
 .../it/toolkit/global/profileDowngrade.ftl    |    13 +
 .../it/toolkit/updates/elevation.ftl          |    14 +
 thunderbird-l10n/it/manifest.json             |    56 +-
 .../ja/devtools/client/debugger.properties    |    67 +-
 .../ja/devtools/client/inspector.properties   |     6 +-
 .../ja/devtools/client/jsonview.properties    |     4 +-
 .../ja/devtools/client/menus.properties       |    10 +-
 .../ja/devtools/client/netmonitor.properties  |    41 +-
 .../ja/devtools/client/toolbox.properties     |    21 -
 .../ja/devtools/client/webconsole.properties  |    46 +-
 .../global-platform/mac/accessible.properties |    11 +-
 .../unix/accessible.properties                |    26 +-
 .../global-platform/win/accessible.properties |    26 +-
 .../chrome/ja/locale/ja/global/css.properties |     2 +
 .../ja/locale/ja/global/dom/dom.properties    |     5 +-
 .../locale/ja/global/layout_errors.properties |     3 +-
 .../ja/global/security/security.properties    |     6 +-
 .../locale/ja/messenger/accountCreation.dtd   |     3 +-
 .../ja/locale/ja/messenger/addons.properties  |    68 +-
 .../ja/locale/ja/messenger/am-e2e.properties  |     2 +-
 .../ja/locale/ja/messenger/am-smime.dtd       |   105 +-
 .../locale/ja/messenger/am-smime.properties   |     2 +
 .../locale/ja/messenger/customizeToolbar.dtd  |     5 +-
 .../locale/ja/messenger/imapMsgs.properties   |    18 +-
 .../ja/locale/ja/messenger/messenger.dtd      |     2 +
 .../locale/ja/messenger/messenger.properties  |     9 +-
 .../messengercompose/messengercompose.dtd     |     9 +-
 .../ja/locale/ja/messenger/pgpmime.properties |     5 +-
 .../ja/messenger/preferences/general.dtd      |     4 +-
 .../ja/locale/ja/necko/necko.properties       |     5 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    14 +
 .../ja/calendar/calendar-widgets.ftl          |     6 +
 .../ja/devtools/client/aboutdebugging.ftl     |     4 +
 .../ja/messenger/accountCentral.ftl           |    69 +
 .../policies/policies-descriptions.ftl        |     2 +
 .../messenger/preferences/passwordManager.ftl |    14 +
 .../ja/messenger/preferences/preferences.ftl  |    14 +
 .../ja/toolkit/about/aboutAddons.ftl          |    27 +
 .../ja/toolkit/about/aboutSupport.ftl         |    26 +-
 .../ja/toolkit/about/certviewer.ftl           |     2 +
 .../ja/toolkit/extensions/blocklist.ftl       |     2 +-
 .../ja/toolkit/global/processTypes.ftl        |     3 +
 .../ja/toolkit/global/profileDowngrade.ftl    |    17 +
 .../ja/toolkit/global/profileSelection.ftl    |     2 +-
 thunderbird-l10n/ja/manifest.json             |    68 +-
 .../chrome/ka/locale/ka/calendar/calendar.dtd |     2 +-
 .../ka/devtools/client/inspector.properties   |     4 +
 .../ka/locale/ka/global/appstrings.properties |     2 +-
 .../chrome/ka/locale/ka/global/css.properties |     3 +
 .../ka/locale/ka/global/dom/dom.properties    |     4 +-
 .../chrome/ka/locale/ka/global/netError.dtd   |     2 +-
 .../ka/global/security/security.properties    |     6 +
 .../ka/locale/ka/messenger/messenger.dtd      |     2 +
 .../ka/locale/ka/messenger/pgpmime.properties |     2 +
 .../ka/locale/ka/necko/necko.properties       |    51 +-
 .../ka/locale/ka/pippki/pippki.properties     |     2 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../ka/devtools/startup/aboutDevTools.ftl     |     2 +-
 .../ka/messenger/accountCentral.ftl           |     9 +
 .../ka/security/certificates/certManager.ftl  |     2 +-
 .../ka/toolkit/about/aboutAddons.ftl          |    27 +
 .../ka/toolkit/about/aboutSupport.ftl         |     6 +
 .../ka/toolkit/about/certviewer.ftl           |    15 +-
 .../ka/toolkit/about/url-classifier.ftl       |     8 +-
 .../ka/toolkit/global/processTypes.ftl        |     4 +-
 .../ka/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/ka/manifest.json             |    82 +-
 .../locale/kab/calendar/calendar.properties   |     2 +-
 .../chrome/kab/locale/kab/chat/irc.properties |     6 +-
 .../kab/locale/kab/chat/xmpp.properties       |     3 +-
 .../kab/devtools/client/inspector.properties  |     4 +
 .../kab/devtools/client/scratchpad.properties |     2 +-
 .../kab/locale/kab/global/css.properties      |     2 +
 .../kab/global/security/security.properties   |     6 +
 .../kab/locale/kab/messenger/messenger.dtd    |     2 +
 .../locale/kab/messenger/pgpmime.properties   |     2 +
 .../kab/messenger/preferences/advanced.dtd    |     2 +-
 .../kab/messenger/search-operators.properties |     4 +-
 .../kab/locale/kab/necko/necko.properties     |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../kab/messenger/accountCentral.ftl          |     9 +
 .../kab/toolkit/about/aboutAddons.ftl         |    27 +
 .../kab/toolkit/about/aboutSupport.ftl        |     6 +
 .../kab/toolkit/about/aboutTelemetry.ftl      |     2 +-
 .../kab/toolkit/about/certviewer.ftl          |    15 +-
 .../kab/toolkit/global/processTypes.ftl       |     2 +
 .../kab/toolkit/global/profileDowngrade.ftl   |    17 +
 .../kab/toolkit/printing/printPreview.ftl     |     2 +-
 thunderbird-l10n/kab/manifest.json            |    66 +-
 .../chrome/kk/locale/kk/calendar/calendar.dtd |     4 +-
 .../kk/calendar/preferences/preferences.dtd   |     2 +-
 .../kk/locale/kk/lightning/lightning.dtd      |     5 +
 .../locale/kk/lightning/lightning.properties  |    31 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../kk/calendar/calendar-widgets.ftl          |     6 +
 .../kk/toolkit/about/aboutAddons.ftl          |    26 +
 .../kk/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/kk/manifest.json             |    72 +-
 .../chrome/ko/locale/ko/calendar/calendar.dtd |     6 +-
 .../ko/devtools/client/connection-screen.dtd  |     2 +-
 .../ko/devtools/client/debugger.properties    |     4 +-
 .../ko/devtools/client/inspector.properties   |     6 +-
 .../ko/devtools/client/netmonitor.properties  |     2 +-
 .../ko/devtools/client/webconsole.properties  |    35 +-
 .../ko/locale/ko/global/appstrings.properties |     2 +-
 .../chrome/ko/locale/ko/global/css.properties |     2 +
 .../ko/locale/ko/global/dom/dom.properties    |     2 +-
 .../ko/global/security/security.properties    |     6 +
 .../ko/locale/ko/lightning/lightning.dtd      |     9 +-
 .../locale/ko/lightning/lightning.properties  |    33 +-
 .../ko/locale/ko/messenger/addons.properties  |    11 +-
 .../ko/locale/ko/messenger/am-e2e.properties  |     2 +-
 .../ko/locale/ko/messenger/am-smime.dtd       |    64 +-
 .../locale/ko/messenger/customizeToolbar.dtd  |     5 +-
 .../locale/ko/messenger/imapMsgs.properties   |    16 +-
 .../locale/ko/messenger/messenger.properties  |     6 +-
 .../ko/messenger/preferences/general.dtd      |     2 +-
 .../ko/mozapps/handling/handling.properties   |     2 +-
 .../ko/locale/ko/necko/necko.properties       |     5 +-
 .../ko/calendar/calendar-widgets.ftl          |     6 +
 .../ko/devtools/client/aboutdebugging.ftl     |     6 +-
 .../ko/devtools/startup/aboutDevTools.ftl     |     8 +-
 .../ko/messenger/accountCentral.ftl           |    34 +
 .../messenger/preferences/passwordManager.ftl |    12 +
 .../ko/messenger/preferences/preferences.ftl  |    12 +
 .../ko/toolkit/about/aboutAddons.ftl          |    27 +
 .../ko/toolkit/about/aboutPerformance.ftl     |     2 +-
 .../ko/toolkit/about/aboutSupport.ftl         |    10 +-
 .../ko/toolkit/about/aboutTelemetry.ftl       |     2 +-
 .../ko/toolkit/about/certviewer.ftl           |    13 +
 .../ko/toolkit/global/processTypes.ftl        |     2 +
 .../ko/toolkit/global/profileDowngrade.ftl    |    17 +
 .../ko/toolkit/printing/printDialogs.ftl      |     2 +-
 thunderbird-l10n/ko/manifest.json             |    60 +-
 .../lt/devtools/client/debugger.properties    |    67 +-
 .../lt/devtools/client/inspector.properties   |     4 +
 .../lt/devtools/client/jsonview.properties    |     4 +-
 .../lt/devtools/client/netmonitor.properties  |    27 +-
 .../lt/devtools/client/webconsole.properties  |    35 +-
 .../global-platform/mac/accessible.properties |     5 +-
 .../chrome/lt/locale/lt/global/css.properties |     3 +
 .../lt/locale/lt/global/dom/dom.properties    |     3 +-
 .../lt/global/security/security.properties    |    13 +-
 .../lt/locale/lt/necko/necko.properties       |     8 +-
 .../lt/devtools/client/aboutdebugging.ftl     |     3 +
 .../lt/toolkit/about/aboutAddons.ftl          |    27 +
 .../lt/toolkit/about/aboutSupport.ftl         |     6 +
 .../lt/toolkit/about/certviewer.ftl           |    15 +
 .../lt/toolkit/global/processTypes.ftl        |     2 +
 .../lt/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/lt/manifest.json             |    82 +-
 .../ms/toolkit/about/aboutAddons.ftl          |    22 +
 .../ms/toolkit/global/profileDowngrade.ftl    |     3 +
 thunderbird-l10n/ms/manifest.json             |    68 +-
 .../devtools/client/inspector.properties      |     4 +
 .../nb-NO/locale/nb-NO/global/css.properties  |     3 +
 .../nb-NO/global/security/security.properties |     6 +
 .../nb-NO/locale/nb-NO/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../nb-NO/toolkit/about/aboutAddons.ftl       |    27 +
 .../nb-NO/toolkit/about/aboutSupport.ftl      |     6 +
 .../nb-NO/toolkit/about/certviewer.ftl        |    13 +
 .../nb-NO/toolkit/global/processTypes.ftl     |     2 +
 .../nb-NO/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/nb-NO/manifest.json          |    76 +-
 .../nl/devtools/client/inspector.properties   |     4 +
 .../chrome/nl/locale/nl/global/css.properties |     3 +
 .../nl/global/security/security.properties    |     6 +
 .../nl/locale/nl/messenger/messenger.dtd      |     2 +
 .../nl/locale/nl/messenger/pgpmime.properties |     3 +
 .../nl/messenger/preferences/advanced.dtd     |    13 +-
 .../nl/locale/nl/necko/necko.properties       |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../nl/messenger/accountCentral.ftl           |     9 +
 .../nl/toolkit/about/aboutAddons.ftl          |    27 +
 .../nl/toolkit/about/aboutSupport.ftl         |     6 +
 .../nl/toolkit/about/certviewer.ftl           |    13 +
 .../nl/toolkit/global/processTypes.ftl        |     2 +
 .../nl/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/nl/manifest.json             |    78 +-
 .../nn-NO/locale/nn-NO/calendar/calendar.dtd  |     4 +-
 .../calendar/preferences/preferences.dtd      |     4 +-
 .../devtools/client/inspector.properties      |     4 +
 .../global-platform/mac/accessible.properties |     5 +-
 .../nn-NO/locale/nn-NO/global/css.properties  |     2 +
 .../locale/nn-NO/global/dom/dom.properties    |     3 +-
 .../nn-NO/global/security/security.properties |    13 +-
 .../locale/nn-NO/global/videocontrols.dtd     |     2 +-
 .../locale/nn-NO/lightning/lightning.dtd      |     9 +-
 .../nn-NO/lightning/lightning.properties      |     3 +-
 .../messenger-smime/msgCompSMIMEOverlay.dtd   |    14 +-
 .../nn-NO/locale/nn-NO/messenger/am-smime.dtd |    23 +-
 .../messengercompose/composeMsgs.properties   |    15 +-
 .../nn-NO/locale/nn-NO/necko/necko.properties |     8 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../nn-NO/calendar/calendar-widgets.ftl       |     6 +
 .../nn-NO/toolkit/about/aboutAddons.ftl       |    27 +
 .../nn-NO/toolkit/about/aboutSupport.ftl      |     6 +
 .../nn-NO/toolkit/about/certviewer.ftl        |    15 +
 .../nn-NO/toolkit/global/processTypes.ftl     |     2 +
 .../nn-NO/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/nn-NO/manifest.json          |    64 +-
 .../pl/devtools/client/inspector.properties   |     4 +
 .../pl/devtools/client/netmonitor.properties  |     2 +-
 .../chrome/pl/locale/pl/global/css.properties |     3 +
 .../pl/global/security/security.properties    |     6 +
 .../pl/locale/pl/messenger/messenger.dtd      |     2 +
 .../messengercompose/composeMsgs.properties   |     8 +-
 .../pl/locale/pl/messenger/pgpmime.properties |    11 +-
 .../pl/locale/pl/necko/necko.properties       |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../pl/messenger/accountCentral.ftl           |    15 +-
 .../pl/toolkit/about/aboutAddons.ftl          |    27 +
 .../pl/toolkit/about/aboutSupport.ftl         |     6 +
 .../pl/toolkit/about/certviewer.ftl           |    13 +
 .../pl/toolkit/global/processTypes.ftl        |     2 +
 .../pl/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/pl/manifest.json             |    62 +-
 .../devtools/client/inspector.properties      |     4 +
 .../pt-BR/locale/pt-BR/global/css.properties  |     3 +
 .../global/nsWebBrowserPersist.properties     |     4 +-
 .../pt-BR/global/security/security.properties |     6 +
 .../locale/pt-BR/messenger/addons.properties  |    11 +-
 .../pt-BR/messenger/customizeToolbar.dtd      |     5 +-
 .../pt-BR/messenger/imapMsgs.properties       |    16 +-
 .../locale/pt-BR/messenger/messenger.dtd      |     2 +
 .../pt-BR/messenger/messenger.properties      |     7 +-
 .../locale/pt-BR/messenger/pgpmime.properties |     2 +
 .../pt-BR/messenger/preferences/general.dtd   |     2 +-
 .../pt-BR/locale/pt-BR/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../pt-BR/messenger/accountCentral.ftl        |    20 +
 .../policies/policies-descriptions.ftl        |     1 +
 .../pt-BR/toolkit/about/aboutAddons.ftl       |    27 +
 .../pt-BR/toolkit/about/aboutSupport.ftl      |     6 +
 .../pt-BR/toolkit/about/certviewer.ftl        |    13 +
 .../pt-BR/toolkit/global/processTypes.ftl     |     2 +
 .../pt-BR/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/pt-BR/manifest.json          |    82 +-
 .../devtools/client/inspector.properties      |     4 +
 .../pt-PT/locale/pt-PT/global/css.properties  |     3 +
 .../pt-PT/global/security/security.properties |     6 +
 .../locale/pt-PT/global/videocontrols.dtd     |     2 +-
 .../locale/pt-PT/messenger/messenger.dtd      |     2 +
 .../locale/pt-PT/messenger/pgpmime.properties |     2 +
 .../pt-PT/locale/pt-PT/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../pt-PT/messenger/accountCentral.ftl        |     9 +
 .../pt-PT/toolkit/about/aboutAddons.ftl       |    27 +
 .../pt-PT/toolkit/about/aboutRights.ftl       |     2 +-
 .../pt-PT/toolkit/about/aboutSupport.ftl      |     6 +
 .../pt-PT/toolkit/about/certviewer.ftl        |    13 +
 .../pt-PT/toolkit/global/processTypes.ftl     |     2 +
 .../pt-PT/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/pt-PT/manifest.json          |    56 +-
 .../rm/devtools/client/inspector.properties   |     4 +
 .../rm/toolkit/about/aboutAddons.ftl          |    26 +
 .../rm/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/rm/manifest.json             |    72 +-
 .../ro/devtools/client/netmonitor.properties  |    15 +-
 .../chrome/ro/locale/ro/global/css.properties |     3 +
 .../ro/locale/ro/messenger/addons.properties  |    11 +-
 .../locale/ro/messenger/customizeToolbar.dtd  |     5 +-
 .../locale/ro/messenger/imapMsgs.properties   |    16 +-
 .../locale/ro/messenger/messenger.properties  |     6 +-
 .../ro/locale/ro/messenger/pgpmime.properties |     3 +
 .../ro/messenger/preferences/general.dtd      |     2 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../ro/devtools/client/aboutdebugging.ftl     |     3 +
 .../ro/messenger/accountCentral.ftl           |     9 +
 .../ro/toolkit/about/aboutAddons.ftl          |    27 +
 .../ro/toolkit/about/aboutSupport.ftl         |     6 +
 .../ro/toolkit/about/certviewer.ftl           |     2 +
 .../ro/toolkit/global/processTypes.ftl        |     2 +
 .../ro/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/ro/manifest.json             |    64 +-
 .../ru/locale/ru/messenger/messenger.dtd      |     2 +
 .../ru/locale/ru/messenger/pgpmime.properties |     4 +-
 .../ru/locale/ru/necko/necko.properties       |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../ru/messenger/accountCentral.ftl           |    16 +
 .../ru/toolkit/about/aboutAddons.ftl          |    26 +
 .../ru/toolkit/about/aboutSupport.ftl         |     2 +
 .../ru/toolkit/about/certviewer.ftl           |    13 +
 .../ru/toolkit/global/processTypes.ftl        |     2 +
 .../ru/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/ru/manifest.json             |    68 +-
 .../si/toolkit/about/aboutAddons.ftl          |    20 +
 .../si/toolkit/global/profileDowngrade.ftl    |    15 +
 thunderbird-l10n/si/manifest.json             |    58 +-
 .../locale/sk/messenger/accountCreation.dtd   |     3 +-
 .../sk/locale/sk/messenger/addons.properties  |    60 +-
 .../locale/sk/messenger/customizeToolbar.dtd  |     5 +-
 .../locale/sk/messenger/imapMsgs.properties   |    18 +-
 .../locale/sk/messenger/messenger.properties  |     7 +-
 .../sk/locale/sk/messenger/pgpmime.properties |     2 +
 .../sk/messenger/preferences/general.dtd      |     3 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../sk/calendar/calendar-widgets.ftl          |     6 +
 .../sk/devtools/client/aboutdebugging.ftl     |     3 +
 .../sk/devtools/client/tooltips.ftl           |     6 +-
 .../sk/messenger/accountCentral.ftl           |     8 +
 .../messenger/preferences/passwordManager.ftl |    12 +
 .../sk/messenger/preferences/preferences.ftl  |    12 +
 .../sk/toolkit/about/aboutAddons.ftl          |    27 +
 .../sk/toolkit/about/aboutNetworking.ftl      |     7 +
 .../sk/toolkit/about/aboutTelemetry.ftl       |     5 +
 .../sk/toolkit/about/certviewer.ftl           |     9 +
 .../sk/toolkit/global/processTypes.ftl        |     2 +
 .../sk/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/sk/manifest.json             |    68 +-
 .../sl/calendar/preferences/general.dtd       |     2 +-
 .../global-platform/mac/accessible.properties |     5 +-
 .../sl/locale/sl/messenger/addons.properties  |     5 +-
 .../sl/locale/sl/messenger/am-smime.dtd       |     2 +-
 .../locale/sl/messenger/imapMsgs.properties   |    12 +-
 .../sl/locale/sl/messenger/messenger.dtd      |     1 +
 .../locale/sl/messenger/messenger.properties  |     7 +-
 .../sl/locale/sl/messenger/pgpmime.properties |     2 +
 .../locale/sl/messenger/preferences/chat.dtd  |     2 +-
 .../sl/messenger/preferences/general.dtd      |     2 +-
 .../sl/locale/sl/necko/necko.properties       |    19 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |     6 +
 .../sl/calendar/calendar-widgets.ftl          |     6 +
 .../sl/messenger/accountCentral.ftl           |    13 +
 .../messenger/preferences/passwordManager.ftl |     2 +
 .../sl/toolkit/about/aboutAddons.ftl          |    27 +
 .../sl/toolkit/about/aboutSupport.ftl         |     6 +
 .../sl/toolkit/about/certviewer.ftl           |    17 +-
 .../sl/toolkit/global/processTypes.ftl        |     2 +
 .../sl/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/sl/manifest.json             |    72 +-
 .../sq/toolkit/about/aboutAddons.ftl          |    26 +
 .../sq/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/sq/manifest.json             |    66 +-
 .../devtools/client/accessibility.properties  |     5 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../sr/devtools/client/aboutdebugging.ftl     |     2 +-
 .../sr/toolkit/about/aboutAddons.ftl          |    44 +
 .../sr/toolkit/about/aboutTelemetry.ftl       |    26 +
 .../sr/toolkit/about/abuseReports.ftl         |    43 +
 .../sr/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/sr/manifest.json             |    62 +-
 .../devtools/client/inspector.properties      |     4 +
 .../sv-SE/locale/sv-SE/global/css.properties  |     3 +
 .../sv-SE/global/security/security.properties |     6 +
 .../locale/sv-SE/messenger/messenger.dtd      |     2 +
 .../locale/sv-SE/messenger/pgpmime.properties |     2 +
 .../sv-SE/locale/sv-SE/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../sv-SE/messenger/accountCentral.ftl        |     9 +
 .../sv-SE/toolkit/about/aboutAddons.ftl       |    27 +
 .../sv-SE/toolkit/about/aboutSupport.ftl      |     6 +
 .../sv-SE/toolkit/about/certviewer.ftl        |    13 +
 .../sv-SE/toolkit/global/processTypes.ftl     |     2 +
 .../sv-SE/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/sv-SE/manifest.json          |    76 +-
 .../tr/devtools/client/debugger.properties    |    67 +-
 .../tr/devtools/client/netmonitor.properties  |    10 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../tr/calendar/calendar-widgets.ftl          |     6 +
 .../tr/devtools/client/aboutdebugging.ftl     |     3 +
 .../tr/toolkit/about/aboutAddons.ftl          |    27 +
 .../tr/toolkit/about/aboutSupport.ftl         |     5 +
 .../tr/toolkit/global/processTypes.ftl        |     2 +
 .../tr/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/tr/manifest.json             |    78 +-
 .../uk/devtools/client/inspector.properties   |     4 +
 .../chrome/uk/locale/uk/global/css.properties |     3 +
 .../uk/global/security/security.properties    |     6 +
 .../uk/locale/uk/messenger/messenger.dtd      |     2 +
 .../messengercompose/EdDialogOverlay.dtd      |     4 +-
 .../uk/locale/uk/messenger/pgpmime.properties |     2 +
 .../uk/locale/uk/necko/necko.properties       |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../uk/messenger/accountCentral.ftl           |     9 +
 .../uk/toolkit/about/aboutAddons.ftl          |    27 +
 .../uk/toolkit/about/aboutSupport.ftl         |     6 +
 .../uk/toolkit/about/certviewer.ftl           |    13 +
 .../uk/toolkit/global/processTypes.ftl        |     2 +
 .../uk/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/uk/manifest.json             |    76 +-
 .../devtools/client/aboutdebugging.properties |    25 +-
 .../uz/devtools/client/connection-screen.dtd  |     8 +-
 .../uz/devtools/client/debugger.properties    |   731 +-
 .../devtools/client/filterwidget.properties   |     4 +-
 .../uz/devtools/client/netmonitor.properties  |   474 +-
 .../uz/locale/uz/devtools/client/storage.dtd  |    10 +-
 .../locale/uz/global/aboutStudies.properties  |    23 +-
 .../locale/uz/global/aboutWebrtc.properties   |    24 +-
 .../locale/uz/global/autocomplete.properties  |    14 +-
 .../uz/mozapps/downloads/downloads.properties |    20 +-
 .../mozapps/extensions/extensions.properties  |   107 +-
 .../uz/devtools/client/toolbox-options.ftl    |     5 +-
 .../uz/toolkit/about/aboutAddons.ftl          |    38 +
 .../uz/toolkit/about/abuseReports.ftl         |    23 +
 .../uz/toolkit/global/profileDowngrade.ftl    |     3 +
 thunderbird-l10n/uz/manifest.json             |    74 +-
 .../vi/devtools/client/jsonview.properties    |     4 +-
 .../vi/devtools/client/webconsole.properties  |   116 +-
 .../global-platform/mac/accessible.properties |     5 +-
 .../vi/locale/vi/global/dom/dom.properties    |    31 +-
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../vi/devtools/client/aboutdebugging.ftl     |     3 +
 .../vi/messenger/preferences/preferences.ftl  |     2 +-
 .../vi/security/certificates/certManager.ftl  |    32 +-
 .../vi/toolkit/about/aboutAddons.ftl          |    27 +
 .../vi/toolkit/about/aboutSupport.ftl         |     8 +-
 .../vi/toolkit/about/certviewer.ftl           |    15 +
 .../vi/toolkit/global/processTypes.ftl        |     2 +
 .../vi/toolkit/global/profileDowngrade.ftl    |    17 +
 thunderbird-l10n/vi/manifest.json             |    64 +-
 .../devtools/client/inspector.properties      |     4 +
 .../zh-CN/locale/zh-CN/global/css.properties  |     3 +
 .../zh-CN/global/security/security.properties |     6 +
 .../locale/zh-CN/messenger/messenger.dtd      |     2 +
 .../locale/zh-CN/messenger/pgpmime.properties |     2 +
 .../zh-CN/locale/zh-CN/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../zh-CN/messenger/accountCentral.ftl        |     9 +
 .../zh-CN/toolkit/about/aboutAddons.ftl       |    27 +
 .../zh-CN/toolkit/about/aboutSupport.ftl      |     6 +
 .../zh-CN/toolkit/about/certviewer.ftl        |    13 +
 .../zh-CN/toolkit/global/processTypes.ftl     |     2 +
 .../zh-CN/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/zh-CN/manifest.json          |    64 +-
 .../devtools/client/inspector.properties      |     4 +
 .../zh-TW/locale/zh-TW/global/css.properties  |     2 +
 .../zh-TW/global/security/security.properties |     6 +
 .../locale/zh-TW/messenger/messenger.dtd      |     2 +
 .../locale/zh-TW/messenger/pgpmime.properties |     3 +-
 .../zh-TW/locale/zh-TW/necko/necko.properties |     3 +
 .../calendar/calendar-uri-redirect-dialog.ftl |    11 +
 .../zh-TW/messenger/accountCentral.ftl        |     9 +
 .../zh-TW/toolkit/about/aboutAddons.ftl       |    27 +
 .../zh-TW/toolkit/about/aboutSupport.ftl      |     6 +
 .../zh-TW/toolkit/about/aboutTelemetry.ftl    |     4 +-
 .../zh-TW/toolkit/about/certviewer.ftl        |    13 +
 .../zh-TW/toolkit/global/processTypes.ftl     |     2 +
 .../zh-TW/toolkit/global/profileDowngrade.ftl |    17 +
 thunderbird-l10n/zh-TW/manifest.json          |    62 +-
 .../components/extensions/ExtensionChild.jsm  |     6 +-
 .../test/xpcshell/test_ext_runtime_ports.js   |    69 +
 .../test/xpcshell/xpcshell-common.ini         |     1 +
 .../components/passwordmgr/LoginHelper.jsm    |    37 +-
 .../passwordmgr/LoginManagerChild.jsm         |    44 +-
 .../passwordmgr/LoginManagerPrompter.jsm      |     4 +
 .../passwordmgr/NewPasswordModel.jsm          |   417 +-
 .../browser/browser_doorhanger_remembering.js |     5 +
 .../passwordmgr/test/browser/head.js          |     2 +
 .../passwordmgr/test/mochitest/mochitest.ini  |     4 +-
 ...st_submit_without_field_modifications.html |   162 +-
 .../pictureinpicture/content/player.js        |    24 +
 .../places/PageIconProtocolHandler.cpp        |    18 +-
 .../components/printing/content/printUtils.js |    40 +-
 toolkit/components/telemetry/Events.yaml      |    32 +-
 toolkit/components/telemetry/Histograms.json  |    10 +-
 toolkit/components/telemetry/Scalars.yaml     |    55 +
 .../telemetry/histogram-allowlists.json       |     3 -
 .../en-US/toolkit/about/aboutAddons.ftl       |    28 +-
 toolkit/modules/OSKeyStore.jsm                |    38 +-
 .../modules/tests/xpcshell/test_osKeyStore.js |    10 +-
 toolkit/mozapps/defaultagent/Telemetry.cpp    |     6 +-
 .../extensions/content/aboutaddons.html       |     2 +-
 .../mozapps/extensions/content/aboutaddons.js |     4 +
 widget/cocoa/nsCocoaUtils.mm                  |     3 +-
 widget/cocoa/nsCocoaWindow.mm                 |     3 +
 widget/gtk/WindowSurfaceWayland.cpp           |    37 +-
 widget/gtk/WindowSurfaceWayland.h             |    10 +-
 widget/windows/GfxInfo.cpp                    |     6 -
 widget/windows/nsWindow.cpp                   |     3 +-
 xpcom/io/SlicedInputStream.cpp                |     2 +
 1045 files changed, 36886 insertions(+), 33148 deletions(-)
 create mode 100644 gfx/thebes/DisplayConfigWindows.cpp
 create mode 100644 gfx/thebes/DisplayConfigWindows.h
 create mode 100644 gfx/wr/wrench/reftests/clip/clip-empty-inner-rect-ref.yaml
 create mode 100644 gfx/wr/wrench/reftests/clip/clip-empty-inner-rect.yaml
 rename js/src/{wasm/rust/src/lib.rs => rust/wasm.rs} (100%)
 rename js/src/{wasm => shell}/WasmTesting.cpp (98%)
 rename js/src/{wasm => shell}/WasmTesting.h (95%)
 delete mode 100644 js/src/wasm/rust/Cargo.toml
 create mode 100644 layout/generic/crashtests/1628804.html
 create mode 100644 python/l10n/fluent_migrations/bug_1626381_about_addons_sidebar_titles.py
 create mode 100644 testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block-ref.html
 create mode 100644 testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block.html
 create mode 100644 testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-srcset.html
 create mode 100644 testing/web-platform/tests/selection/selection-select-all-move-input-crash.html
 delete mode 100644 third_party/rust/nom/.travis.yml
 create mode 100644 thunderbird-l10n/ar/localization/ar/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ast/localization/ast/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/be/localization/be/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/bg/localization/bg/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/br/localization/br/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ca/localization/ca/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/cak/localization/cak/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/cs/localization/cs/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/cy/localization/cy/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/cy/localization/cy/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/da/localization/da/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/de/localization/de/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/dsb/localization/dsb/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/dsb/localization/dsb/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/el/localization/el/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/el/localization/el/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/en-GB/localization/en-GB/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/es-AR/localization/es-AR/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/et/localization/et/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/eu/localization/eu/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/eu/localization/eu/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/fi/localization/fi/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/fi/localization/fi/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/fr/localization/fr/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/fr/localization/fr/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/fy-NL/localization/fy-NL/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/gd/localization/gd/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/gl/localization/gl/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/he/localization/he/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/hr/localization/hr/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/hr/localization/hr/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/hsb/localization/hsb/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/hsb/localization/hsb/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/hu/localization/hu/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/hu/localization/hu/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/id/localization/id/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/is/localization/is/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/it/localization/it/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/it/localization/it/toolkit/updates/elevation.ftl
 create mode 100644 thunderbird-l10n/ja/localization/ja/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/ja/localization/ja/calendar/calendar-widgets.ftl
 create mode 100644 thunderbird-l10n/ja/localization/ja/messenger/accountCentral.ftl
 create mode 100644 thunderbird-l10n/ja/localization/ja/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ka/localization/ka/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/ka/localization/ka/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/kab/localization/kab/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/kab/localization/kab/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/kk/localization/kk/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/kk/localization/kk/calendar/calendar-widgets.ftl
 create mode 100644 thunderbird-l10n/kk/localization/kk/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ko/localization/ko/calendar/calendar-widgets.ftl
 create mode 100644 thunderbird-l10n/ko/localization/ko/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/lt/localization/lt/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ms/localization/ms/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/nb-NO/localization/nb-NO/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/nl/localization/nl/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/nl/localization/nl/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-widgets.ftl
 create mode 100644 thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/pl/localization/pl/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/pl/localization/pl/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/pt-BR/localization/pt-BR/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/pt-PT/localization/pt-PT/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/rm/localization/rm/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ro/localization/ro/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/ro/localization/ro/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/ru/localization/ru/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/ru/localization/ru/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/si/localization/si/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/sk/localization/sk/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/sk/localization/sk/calendar/calendar-widgets.ftl
 create mode 100644 thunderbird-l10n/sk/localization/sk/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/sl/localization/sl/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/sl/localization/sl/calendar/calendar-widgets.ftl
 create mode 100644 thunderbird-l10n/sl/localization/sl/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/sq/localization/sq/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/sr/localization/sr/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/sr/localization/sr/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/sv-SE/localization/sv-SE/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/tr/localization/tr/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/tr/localization/tr/calendar/calendar-widgets.ftl
 create mode 100644 thunderbird-l10n/tr/localization/tr/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/uk/localization/uk/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/uk/localization/uk/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/uz/localization/uz/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/vi/localization/vi/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/vi/localization/vi/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/zh-CN/localization/zh-CN/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/profileDowngrade.ftl
 create mode 100644 thunderbird-l10n/zh-TW/localization/zh-TW/calendar/calendar-uri-redirect-dialog.ftl
 create mode 100644 thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/profileDowngrade.ftl
 create mode 100644 toolkit/components/extensions/test/xpcshell/test_ext_runtime_ports.js

diff --git a/Cargo.lock b/Cargo.lock
index 22baf22eabb3..12be06045ed3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2121,6 +2121,8 @@ version = "0.1.0"
 dependencies = [
  "jsrust_shared",
  "mozglue-static",
+ "wasmparser 0.48.2",
+ "wat",
 ]
 
 [[package]]
@@ -2133,7 +2135,6 @@ dependencies = [
  "mozglue-static",
  "mozilla-central-workspace-hack",
  "smoosh",
- "wasm-rust",
 ]
 
 [[package]]
@@ -4828,14 +4829,6 @@ dependencies = [
  "urlencoding",
 ]
 
-[[package]]
-name = "wasm-rust"
-version = "0.1.0"
-dependencies = [
- "wasmparser 0.48.2",
- "wat",
-]
-
 [[package]]
 name = "wasmparser"
 version = "0.48.2"
diff --git a/accessible/base/nsCoreUtils.cpp b/accessible/base/nsCoreUtils.cpp
index 0824a31a645c..bf109562c537 100644
--- a/accessible/base/nsCoreUtils.cpp
+++ b/accessible/base/nsCoreUtils.cpp
@@ -435,12 +435,12 @@ XULTreeElement* nsCoreUtils::GetTree(nsIContent* aContent) {
 }
 
 already_AddRefed<nsTreeColumn> nsCoreUtils::GetFirstSensibleColumn(
-    XULTreeElement* aTree) {
+    XULTreeElement* aTree, FlushType aFlushType) {
   if (!aTree) {
     return nullptr;
   }
 
-  RefPtr<nsTreeColumns> cols = aTree->GetColumns();
+  RefPtr<nsTreeColumns> cols = aTree->GetColumns(aFlushType);
   if (!cols) {
     return nullptr;
   }
diff --git a/accessible/base/nsCoreUtils.h b/accessible/base/nsCoreUtils.h
index b0afa2c4c7d3..48f8f4aef3af 100644
--- a/accessible/base/nsCoreUtils.h
+++ b/accessible/base/nsCoreUtils.h
@@ -11,6 +11,7 @@
 #include "nsIAccessibleEvent.h"
 #include "nsIContent.h"
 #include "mozilla/dom/Document.h"  // for GetPresShell()
+#include "mozilla/FlushType.h"
 
 #include "nsPoint.h"
 #include "nsTArray.h"
@@ -253,7 +254,8 @@ class nsCoreUtils {
    * Return first sensible column for the given tree box object.
    */
   static already_AddRefed<nsTreeColumn> GetFirstSensibleColumn(
-      mozilla::dom::XULTreeElement* aTree);
+      mozilla::dom::XULTreeElement* aTree,
+      mozilla::FlushType = mozilla::FlushType::Frames);
 
   /**
    * Return sensible columns count for the given tree box object.
diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm
index 8ff219496b14..b3f5a66c6fa6 100644
--- a/accessible/mac/mozAccessible.mm
+++ b/accessible/mac/mozAccessible.mm
@@ -649,7 +649,8 @@ static const uint64_t kCacheInitialized = ((uint64_t)0x1) << 63;
           GetNativeFromGeckoAccessible(proxy->OuterDocOfRemoteBrowser()->RootAccessible()));
     }
 
-    LayoutDeviceIntPoint p = LayoutDeviceIntPoint(geckoRect.X(), geckoRect.Y());
+    LayoutDeviceIntPoint p = LayoutDeviceIntPoint(geckoRect.X() + (geckoRect.Width() / 2),
+                                                  geckoRect.Y() + (geckoRect.Height() / 2));
     nsIWidget* widget = [objOrView widget];
     // XXX: NSRightMouseDown is depreciated in 10.12, should be
     // changed to NSEventTypeRightMouseDown after refactoring.
diff --git a/accessible/xul/XULTreeAccessible.cpp b/accessible/xul/XULTreeAccessible.cpp
index 2d2efdd71dba..da748f68cb46 100644
--- a/accessible/xul/XULTreeAccessible.cpp
+++ b/accessible/xul/XULTreeAccessible.cpp
@@ -904,7 +904,7 @@ XULTreeItemAccessible::XULTreeItemAccessible(
     : XULTreeItemAccessibleBase(aContent, aDoc, aParent, aTree, aTreeView,
                                 aRow) {
   mStateFlags |= eNoKidsFromDOM;
-  mColumn = nsCoreUtils::GetFirstSensibleColumn(mTree);
+  mColumn = nsCoreUtils::GetFirstSensibleColumn(mTree, FlushType::None);
   GetCellName(mColumn, mCachedName);
 }
 
diff --git a/browser/base/content/tabbrowser-tabs.js b/browser/base/content/tabbrowser-tabs.js
index 755624e6147f..77526839f22e 100644
--- a/browser/base/content/tabbrowser-tabs.js
+++ b/browser/base/content/tabbrowser-tabs.js
@@ -67,6 +67,11 @@
       var tab = this.allTabs[0];
       tab.label = this.emptyTabTitle;
 
+      this.newTabButton.setAttribute(
+        "aria-label",
+        GetDynamicShortcutTooltipText("tabs-newtab-button")
+      );
+
       window.addEventListener("resize", this);
 
       this.boundObserve = (...args) => this.observe(...args);
diff --git a/browser/components/aboutlogins/AboutLoginsChild.jsm b/browser/components/aboutlogins/AboutLoginsChild.jsm
index 39e9a9bd166f..a4cd976dd5a2 100644
--- a/browser/components/aboutlogins/AboutLoginsChild.jsm
+++ b/browser/components/aboutlogins/AboutLoginsChild.jsm
@@ -137,7 +137,7 @@ class AboutLoginsChild extends JSWindowActorChild {
         break;
       }
       case "AboutLoginsRecordTelemetryEvent": {
-        let { method, object, extra = {} } = event.detail;
+        let { method, object, extra = {}, value = null } = event.detail;
 
         if (method == "open_management") {
           let { docShell } = this.browsingContext;
@@ -163,7 +163,7 @@ class AboutLoginsChild extends JSWindowActorChild {
             TELEMETRY_EVENT_CATEGORY,
             method,
             object,
-            null,
+            value,
             extra
           );
         } catch (ex) {
@@ -198,7 +198,26 @@ class AboutLoginsChild extends JSWindowActorChild {
     switch (message.name) {
       case "AboutLogins:MasterPasswordResponse":
         if (masterPasswordPromise) {
-          masterPasswordPromise.resolve(message.data);
+          masterPasswordPromise.resolve(message.data.result);
+          try {
+            let {
+              method,
+              object,
+              extra = {},
+              value = null,
+            } = message.data.telemetryEvent;
+            Services.telemetry.recordEvent(
+              TELEMETRY_EVENT_CATEGORY,
+              method,
+              object,
+              value,
+              extra
+            );
+          } catch (ex) {
+            Cu.reportError(
+              "AboutLoginsChild: error recording telemetry event: " + ex.message
+            );
+          }
         }
         break;
       case "AboutLogins:Setup":
diff --git a/browser/components/aboutlogins/AboutLoginsParent.jsm b/browser/components/aboutlogins/AboutLoginsParent.jsm
index f3c0ab344c5e..21210ad79c05 100644
--- a/browser/components/aboutlogins/AboutLoginsParent.jsm
+++ b/browser/components/aboutlogins/AboutLoginsParent.jsm
@@ -323,51 +323,74 @@ class AboutLoginsParent extends JSWindowActorParent {
           );
         }
 
-        if (Date.now() < AboutLogins._authExpirationTime) {
-          this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", true);
-          return;
-        }
+        let loggedIn = false;
+        let telemetryEvent;
 
-        // This does no harm if master password isn't set.
-        let tokendb = Cc["@mozilla.org/security/pk11tokendb;1"].createInstance(
-          Ci.nsIPK11TokenDB
-        );
-        let token = tokendb.getInternalKeyToken();
+        try {
+          // This does no harm if master password isn't set.
+          let tokendb = Cc[
+            "@mozilla.org/security/pk11tokendb;1"
+          ].createInstance(Ci.nsIPK11TokenDB);
+          let token = tokendb.getInternalKeyToken();
+
+          if (Date.now() < AboutLogins._authExpirationTime) {
+            loggedIn = true;
+            telemetryEvent = {
+              object: token.hasPassword ? "master_password" : "os_auth",
+              method: "reauthenticate",
+              value: "success_no_prompt",
+            };
+            return;
+          }
 
-        let loggedIn = false;
-        // Use the OS auth dialog if there is no master password
-        if (!token.hasPassword && !OS_AUTH_ENABLED) {
-          loggedIn = true;
-        } else if (!token.hasPassword && OS_AUTH_ENABLED) {
-          if (AppConstants.platform == "macosx") {
-            // OS Auth dialogs on macOS must only provide the "reason" that the prompt
-            // is being displayed.
-            messageId += "-macosx";
+          // Use the OS auth dialog if there is no master password
+          if (!token.hasPassword && !OS_AUTH_ENABLED) {
+            loggedIn = true;
+            telemetryEvent = {
+              object: "os_auth",
+              method: "reauthenticate",
+              value: "success_disabled",
+            };
+            return;
           }
-          let [messageText, captionText] = await AboutLoginsL10n.formatMessages(
-            [
+          if (!token.hasPassword && OS_AUTH_ENABLED) {
+            if (AppConstants.platform == "macosx") {
+              // OS Auth dialogs on macOS must only provide the "reason" that the prompt
+              // is being displayed.
+              messageId += "-macosx";
+            }
+            let [
+              messageText,
+              captionText,
+            ] = await AboutLoginsL10n.formatMessages([
               {
                 id: messageId,
               },
               {
                 id: "about-logins-os-auth-dialog-caption",
               },
-            ]
-          );
-          loggedIn = await OSKeyStore.ensureLoggedIn(
-            messageText.value,
-            captionText.value,
-            ownerGlobal,
-            false
-          );
-        } else {
+            ]);
+            let result = await OSKeyStore.ensureLoggedIn(
+              messageText.value,
+              captionText.value,
+              ownerGlobal,
+              false
+            );
+            loggedIn = result.authenticated;
+            telemetryEvent = {
+              object: "os_auth",
+              method: "reauthenticate",
+              value: result.auth_details,
+            };
+            return;
+          }
           // Force a log-out of the Master Password.
           token.checkPassword("");
 
           // If a master password prompt is already open, just exit early and return false.
           // The user can re-trigger it after responding to the already open dialog.
           if (Services.logins.uiBusy) {
-            this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", false);
+            loggedIn = false;
             return;
           }
 
@@ -381,13 +404,21 @@ class AboutLoginsParent extends JSWindowActorParent {
             // User is also logged out of Software Security Device.
           }
           loggedIn = token.isLoggedIn();
+          telemetryEvent = {
+            object: "master_password",
+            method: "reauthenticate",
+            value: loggedIn ? "success" : "fail",
+          };
+        } finally {
+          if (loggedIn) {
+            const AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
+            AboutLogins._authExpirationTime = Date.now() + AUTH_TIMEOUT_MS;
+          }
+          this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", {
+            result: loggedIn,
+            telemetryEvent,
+          });
         }
-
-        if (loggedIn) {
-          const AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
-          AboutLogins._authExpirationTime = Date.now() + AUTH_TIMEOUT_MS;
-        }
-        this.sendAsyncMessage("AboutLogins:MasterPasswordResponse", loggedIn);
         break;
       }
       case "AboutLogins:Subscribe": {
diff --git a/browser/components/aboutlogins/content/components/login-item.css b/browser/components/aboutlogins/content/components/login-item.css
index 054e526fd353..73202aadb3d7 100644
--- a/browser/components/aboutlogins/content/components/login-item.css
+++ b/browser/components/aboutlogins/content/components/login-item.css
@@ -222,7 +222,6 @@ input[type="url"][readOnly]:hover:active {
 
 .meta-info {
   font-size: smaller;
-  font-weight: 300;
   color: var(--in-content-deemphasized-text);
   margin-top: 0;
   margin-bottom: 8px;
@@ -338,6 +337,7 @@ input[name="password"] {
 .alert-link:visited,
 .alert-link {
   font-weight: 600;
+  overflow-wrap: anywhere;
 }
 
 .breach-alert > .alert-link:visited,
diff --git a/browser/components/aboutlogins/content/components/login-item.js b/browser/components/aboutlogins/content/components/login-item.js
index 8a16be4deb67..e083430c2320 100644
--- a/browser/components/aboutlogins/content/components/login-item.js
+++ b/browser/components/aboutlogins/content/components/login-item.js
@@ -96,7 +96,7 @@ export default class LoginItem extends HTMLElement {
 
     this.render();
 
-    this._breachAlertLink.addEventListener("click", this);
+    this._breachAlertLearnMoreLink.addEventListener("click", this);
     this._cancelButton.addEventListener("click", this);
     this._copyPasswordButton.addEventListener("click", this);
     this._copyUsernameButton.addEventListener("click", this);
@@ -110,6 +110,7 @@ export default class LoginItem extends HTMLElement {
     this._originInput.addEventListener("auxclick", this);
     this._originDisplayInput.addEventListener("click", this);
     this._revealCheckbox.addEventListener("click", this);
+    this._vulnerableAlertLearnMoreLink.addEventListener("click", this);
     window.addEventListener("AboutLoginsInitialLoginSelected", this);
     window.addEventListener("AboutLoginsLoadInitialFavicon", this);
     window.addEventListener("AboutLoginsLoginSelected", this);
@@ -492,14 +493,17 @@ export default class LoginItem extends HTMLElement {
         if (classList.contains("origin-input")) {
           this._handleOriginClick();
         }
-        if (classList.contains("alert-link")) {
+        if (classList.contains("alert-learn-more-link")) {
           if (event.currentTarget.closest(".breach-alert")) {
             this._recordTelemetryEvent({
               object: "existing_login",
               method: "learn_more_breach",
             });
           } else if (event.currentTarget.closest(".vulnerable-alert")) {
-            // TODO: Add telemetry event
+            this._recordTelemetryEvent({
+              object: "existing_login",
+              method: "learn_more_vuln",
+            });
           }
         }
         break;
diff --git a/browser/components/aboutlogins/content/components/login-list.js b/browser/components/aboutlogins/content/components/login-list.js
index 6f816814e0fa..f63cec354b3e 100644
--- a/browser/components/aboutlogins/content/components/login-list.js
+++ b/browser/components/aboutlogins/content/components/login-list.js
@@ -147,6 +147,22 @@ export default class LoginList extends HTMLElement {
         this._list.setAttribute("aria-activedescendant", visibleListItem.id);
       }
     }
+
+    if (
+      this._sortSelect.namedItem("alerts").hidden &&
+      ((this._breachesByLoginGUID &&
+        this._loginGuidsSortedOrder.some(loginGuid =>
+          this._breachesByLoginGUID.has(loginGuid)
+        )) ||
+        (this._vulnerableLoginsByLoginGUID &&
+          this._loginGuidsSortedOrder.some(loginGuid =>
+            this._vulnerableLoginsByLoginGUID.has(loginGuid)
+          )))
+    ) {
+      // Make available the "alerts" option but don't change the
+      // selected sort so the user's current task isn't interrupted.
+      this._sortSelect.namedItem("alerts").hidden = false;
+    }
   }
 
   handleEvent(event) {
diff --git a/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js b/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js
index 0d90adb4f2eb..ae13ab2e7ae0 100644
--- a/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js
+++ b/browser/components/aboutlogins/tests/browser/browser_aaa_eventTelemetry_run_first.js
@@ -63,6 +63,29 @@ add_task(async function test_telemetry_events() {
   });
   await LoginTestUtils.telemetry.waitForEventCount(2);
 
+  // Need to change the learn-more to a local address for testing.
+  const FAKE_LEARN_MORE_URL = "https://learn-more.example.com/";
+  let promiseNewTab = BrowserTestUtils.waitForNewTab(
+    gBrowser,
+    FAKE_LEARN_MORE_URL
+  );
+  await SpecialPowers.spawn(
+    gBrowser.selectedBrowser,
+    [FAKE_LEARN_MORE_URL],
+    async function(fakeLearnMoreUrl) {
+      let loginItem = content.document.querySelector("login-item");
+      let learnMoreLink = loginItem.shadowRoot.querySelector(
+        ".alert-learn-more-link"
+      );
+      learnMoreLink.href = fakeLearnMoreUrl;
+      learnMoreLink.click();
+    }
+  );
+  let newTab = await promiseNewTab;
+  ok(true, "New tab opened to " + FAKE_LEARN_MORE_URL);
+  BrowserTestUtils.removeTab(newTab);
+  await LoginTestUtils.telemetry.waitForEventCount(3);
+
   await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
     let loginItem = content.document.querySelector("login-item");
     let copyButton = loginItem.shadowRoot.querySelector(
@@ -70,7 +93,7 @@ add_task(async function test_telemetry_events() {
     );
     copyButton.click();
   });
-  await LoginTestUtils.telemetry.waitForEventCount(3);
+  await LoginTestUtils.telemetry.waitForEventCount(4);
 
   if (OSKeyStoreTestUtils.canTestOSKeyStoreLogin()) {
     let reauthObserved = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(true);
@@ -82,13 +105,16 @@ add_task(async function test_telemetry_events() {
       copyButton.click();
     });
     await reauthObserved;
-    await LoginTestUtils.telemetry.waitForEventCount(4);
+    // When reauth is observed an extra telemetry event will be recorded
+    // for the reauth, hence the event count increasing by 2 here, and later
+    // in the test as well.
+    await LoginTestUtils.telemetry.waitForEventCount(6);
   }
   let nextTelemetryEventCount = OSKeyStoreTestUtils.canTestOSKeyStoreLogin()
-    ? 5
-    : 4;
+    ? 7
+    : 5;
 
-  let promiseNewTab = BrowserTestUtils.waitForNewTab(
+  promiseNewTab = BrowserTestUtils.waitForNewTab(
     gBrowser,
     TEST_LOGIN3.origin + "/"
   );
@@ -97,7 +123,7 @@ add_task(async function test_telemetry_events() {
     let originInput = loginItem.shadowRoot.querySelector(".origin-input");
     originInput.click();
   });
-  let newTab = await promiseNewTab;
+  newTab = await promiseNewTab;
   ok(true, "New tab opened to " + TEST_LOGIN3.origin);
   BrowserTestUtils.removeTab(newTab);
   await LoginTestUtils.telemetry.waitForEventCount(nextTelemetryEventCount++);
@@ -107,6 +133,7 @@ add_task(async function test_telemetry_events() {
     let reauthObserved = forceAuthTimeoutAndWaitForOSKeyStoreLogin({
       loginResult: true,
     });
+    nextTelemetryEventCount++; // An extra event is observed for the reauth event.
     await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
       let loginItem = content.document.querySelector("login-item");
       let revealCheckbox = loginItem.shadowRoot.querySelector(
@@ -127,15 +154,14 @@ add_task(async function test_telemetry_events() {
     });
     await LoginTestUtils.telemetry.waitForEventCount(nextTelemetryEventCount++);
 
-    reauthObserved = forceAuthTimeoutAndWaitForOSKeyStoreLogin({
-      loginResult: true,
-    });
+    // Don't force the auth timeout here to check that `auth_skipped: true` is set as
+    // in `extra`.
+    nextTelemetryEventCount++; // An extra event is observed for the reauth event.
     await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
       let loginItem = content.document.querySelector("login-item");
       let editButton = loginItem.shadowRoot.querySelector(".edit-button");
       editButton.click();
     });
-    await reauthObserved;
     await LoginTestUtils.telemetry.waitForEventCount(nextTelemetryEventCount++);
 
     await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
@@ -237,11 +263,22 @@ add_task(async function test_telemetry_events() {
   let expectedEvents = [
     [true, "pwmgr", "open_management", "direct"],
     [true, "pwmgr", "select", "existing_login", null, { breached: "true" }],
+    [
+      true,
+      "pwmgr",
+      "learn_more_breach",
+      "existing_login",
+      null,
+      { breached: "true" },
+    ],
     [true, "pwmgr", "copy", "username", null, { breached: "true" }],
+    [testOSAuth, "pwmgr", "reauthenticate", "os_auth", "success"],
     [testOSAuth, "pwmgr", "copy", "password", null, { breached: "true" }],
     [true, "pwmgr", "open_site", "existing_login", null, { breached: "true" }],
+    [testOSAuth, "pwmgr", "reauthenticate", "os_auth", "success"],
     [testOSAuth, "pwmgr", "show", "password", null, { breached: "true" }],
     [testOSAuth, "pwmgr", "hide", "password", null, { breached: "true" }],
+    [testOSAuth, "pwmgr", "reauthenticate", "os_auth", "success_no_prompt"],
     [testOSAuth, "pwmgr", "edit", "existing_login", null, { breached: "true" }],
     [testOSAuth, "pwmgr", "save", "existing_login", null, { breached: "true" }],
     [true, "pwmgr", "delete", "existing_login", null, { breached: "true" }],
diff --git a/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js b/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js
index c312e44a52b1..27877f87c47b 100644
--- a/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js
+++ b/browser/components/aboutlogins/tests/browser/browser_vulnerableLoginAddedInSecondaryWindow.js
@@ -21,6 +21,15 @@ add_task(async function setup() {
   TEST_LOGIN2 = await addLogin(TEST_LOGIN2);
   TEST_LOGIN3 = await addLogin(TEST_LOGIN3);
 
+  let breaches = await LoginBreaches.getPotentialBreachesByLoginGUID([
+    TEST_LOGIN3,
+  ]);
+  ok(breaches.size, "TEST_LOGIN3 should be marked as breached");
+
+  // Remove the breached login so the 'alerts' option
+  // is hidden when opening about:logins.
+  Services.logins.removeLogin(TEST_LOGIN3);
+
   await BrowserTestUtils.openNewForegroundTab({
     gBrowser,
     url: "about:logins",
@@ -41,6 +50,14 @@ add_task(async function setup() {
 
 add_task(async function test_new_login_marked_vulnerable_in_both_windows() {
   const ORIGIN_FOR_NEW_VULNERABLE_LOGIN = "https://vulnerable";
+  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
+    let loginList = Cu.waiveXrays(content.document.querySelector("login-list"));
+    ok(
+      loginList.shadowRoot.querySelector("#login-sort").namedItem("alerts")
+        .hidden,
+      "The 'alerts' option should be hidden before adding a vulnerable login to the list"
+    );
+  });
 
   await SpecialPowers.spawn(
     tabInSecondWindow.linkedBrowser,
@@ -51,8 +68,14 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() {
       await ContentTaskUtils.waitForCondition(
         () =>
           loginList.shadowRoot.querySelectorAll(".login-list-item[data-guid]")
-            .length == 3,
-        "waiting for all three initials logins to get added to login-list"
+            .length == 2,
+        "waiting for all two initials logins to get added to login-list"
+      );
+
+      let loginSort = loginList.shadowRoot.querySelector("#login-sort");
+      ok(
+        loginSort.namedItem("alerts").hidden,
+        "The 'alerts' option should be hidden when there are no breached or vulnerable logins in the list"
       );
 
       let createButton = loginList.shadowRoot.querySelector(
@@ -83,7 +106,7 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() {
       await ContentTaskUtils.waitForCondition(
         () =>
           loginList.shadowRoot.querySelectorAll(".login-list-item[data-guid]")
-            .length == 4,
+            .length == 3,
         "waiting for new login to get added to login-list"
       );
 
@@ -101,25 +124,43 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() {
         "vulnerable alert on login-item should be visible"
       );
 
-      is(
-        Cu.waiveXrays(loginList)._sortSelect.value,
-        "alerts",
-        "The login list should be sorted by Alerts"
-      );
-      let loginListItems = loginList.shadowRoot.querySelectorAll(
-        ".login-list-item[data-guid]"
+      ok(
+        !loginSort.namedItem("alerts").hidden,
+        "The 'alerts' option should be visible after adding a vulnerable login to the list"
       );
-      for (let i = 1; i < loginListItems.length; i++) {
-        if (loginListItems[i].matches(".vulnerable, .breached")) {
-          ok(
-            loginListItems[i - 1].matches(".vulnerable, .breached"),
-            `The previous login-list-item must be vulnerable or breached if the current one is (second window, i=${i})`
-          );
-        }
-      }
     }
   );
 
+  tabInSecondWindow.linkedBrowser.reload();
+  await BrowserTestUtils.browserLoaded(
+    tabInSecondWindow.linkedBrowser,
+    false,
+    "about:logins"
+  );
+
+  await SpecialPowers.spawn(tabInSecondWindow.linkedBrowser, [], async () => {
+    let loginList = content.document.querySelector("login-list");
+    let loginSort = loginList.shadowRoot.querySelector("#login-sort");
+
+    await ContentTaskUtils.waitForCondition(
+      () => loginSort.value == "alerts",
+      "waiting for sort to get updated to 'alerts'"
+    );
+
+    is(loginSort.value, "alerts", "The login list should be sorted by Alerts");
+    let loginListItems = loginList.shadowRoot.querySelectorAll(
+      ".login-list-item[data-guid]"
+    );
+    for (let i = 1; i < loginListItems.length; i++) {
+      if (loginListItems[i].matches(".vulnerable, .breached")) {
+        ok(
+          loginListItems[i - 1].matches(".vulnerable, .breached"),
+          `The previous login-list-item must be vulnerable or breached if the current one is (second window, i=${i})`
+        );
+      }
+    }
+  });
+
   await SpecialPowers.spawn(
     gBrowser.selectedBrowser,
     [ORIGIN_FOR_NEW_VULNERABLE_LOGIN],
@@ -141,17 +182,36 @@ add_task(async function test_new_login_marked_vulnerable_in_both_windows() {
         "vulnerable login list item should be marked as such"
       );
 
-      let loginListItems = loginList.shadowRoot.querySelectorAll(
-        ".login-list-item[data-guid]"
+      ok(
+        !loginList.shadowRoot.querySelector("#login-sort").namedItem("alerts")
+          .hidden,
+        "The 'alerts' option should be visible after adding a vulnerable login to the list"
       );
-      for (let i = 1; i < loginListItems.length; i++) {
-        if (loginListItems[i].matches(".vulnerable, .breached")) {
-          ok(
-            loginListItems[i - 1].matches(".vulnerable, .breached"),
-            `The previous login-list-item must be vulnerable or breached if the current one is (first window, i=${i})`
-          );
-        }
-      }
     }
   );
+  gBrowser.selectedBrowser.reload();
+  await BrowserTestUtils.browserLoaded(
+    gBrowser.selectedBrowser,
+    false,
+    "about:logins"
+  );
+
+  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
+    let loginList = Cu.waiveXrays(content.document.querySelector("login-list"));
+    await ContentTaskUtils.waitForCondition(
+      () => loginList.shadowRoot.querySelector("#login-sort").value == "alerts",
+      "waiting for sort to get updated to 'alerts'"
+    );
+    let loginListItems = loginList.shadowRoot.querySelectorAll(
+      ".login-list-item[data-guid]"
+    );
+    for (let i = 1; i < loginListItems.length; i++) {
+      if (loginListItems[i].matches(".vulnerable, .breached")) {
+        ok(
+          loginListItems[i - 1].matches(".vulnerable, .breached"),
+          `The previous login-list-item must be vulnerable or breached if the current one is (first window, i=${i})`
+        );
+      }
+    }
+  });
 });
diff --git a/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm b/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm
index a69573b8869c..452479ca8ea2 100644
--- a/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm
+++ b/browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm
@@ -25,6 +25,30 @@ XPCOMUtils.defineLazyGetter(this, "log", () => {
 class AboutWelcomeChild extends JSWindowActorChild {
   actorCreated() {
     this.exportFunctions();
+    this.initWebProgressListener();
+  }
+
+  initWebProgressListener() {
+    const webProgress = this.manager.browsingContext.top.docShell
+      .QueryInterface(Ci.nsIInterfaceRequestor)
+      .getInterface(Ci.nsIWebProgress);
+
+    const listener = {
+      QueryInterface: ChromeUtils.generateQI([
+        Ci.nsIWebProgressListener,
+        Ci.nsISupportsWeakReference,
+      ]),
+    };
+
+    listener.onLocationChange = (aWebProgress, aRequest, aLocation, aFlags) => {
+      log.debug(`onLocationChange handled: ${aWebProgress.DOMWindow}`);
+      this.AWSendToParent("LOCATION_CHANGED");
+    };
+
+    webProgress.addProgressListener(
+      listener,
+      Ci.nsIWebProgress.NOTIFY_LOCATION
+    );
   }
 
   /**
diff --git a/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm b/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm
index 3e10cd1cef21..403222f812f5 100644
--- a/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm
+++ b/browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm
@@ -42,7 +42,13 @@ const AWTerminate = {
 
 class AboutWelcomeObserver {
   constructor() {
+    Services.obs.addObserver(this, "quit-application");
+
     this.win = Services.focus.activeWindow;
+    if (!this.win) {
+      return;
+    }
+
     this.terminateReason = AWTerminate.UNKNOWN;
 
     this.onWindowClose = () => {
@@ -55,8 +61,6 @@ class AboutWelcomeObserver {
 
     this.win.addEventListener("TabClose", this.onTabClose, { once: true });
     this.win.addEventListener("unload", this.onWindowClose, { once: true });
-    this.win.gBrowser.addTabsProgressListener(this);
-    Services.obs.addObserver(this, "quit-application");
   }
 
   observe(aSubject, aTopic, aData) {
@@ -67,10 +71,6 @@ class AboutWelcomeObserver {
     }
   }
 
-  onLocationChange() {
-    this.terminateReason = AWTerminate.ADDRESS_BAR_NAVIGATED;
-  }
-
   // Added for testing
   get AWTerminate() {
     return AWTerminate;
@@ -78,10 +78,13 @@ class AboutWelcomeObserver {
 
   stop() {
     log.debug(`Terminate reason is ${this.terminateReason}`);
+    Services.obs.removeObserver(this, "quit-application");
+    if (!this.win) {
+      return;
+    }
     this.win.removeEventListener("TabClose", this.onTabClose);
     this.win.removeEventListener("unload", this.onWindowClose);
-    this.win.gBrowser.removeTabsProgressListener(this);
-    Services.obs.removeObserver(this, "quit-application");
+    this.win = null;
   }
 }
 
@@ -141,6 +144,10 @@ class AboutWelcomeParent extends JSWindowActorParent {
       case "AWPage:TELEMETRY_EVENT":
         Telemetry.sendTelemetry(data);
         break;
+      case "AWPage:LOCATION_CHANGED":
+        this.AboutWelcomeObserver.terminateReason =
+          AWTerminate.ADDRESS_BAR_NAVIGATED;
+        break;
       default:
         log.debug(`Unexpected event ${type} was not handled.`);
     }
diff --git a/browser/components/newtab/aboutwelcome/content/aboutwelcome.css b/browser/components/newtab/aboutwelcome/content/aboutwelcome.css
index 7f903d6d0d46..dd8176e33ac0 100644
--- a/browser/components/newtab/aboutwelcome/content/aboutwelcome.css
+++ b/browser/components/newtab/aboutwelcome/content/aboutwelcome.css
@@ -173,10 +173,10 @@ body {
   border-radius: 4px;
   box-shadow: var(--newtab-card-shadow);
   font-size: 13px;
-  padding: 20px 40px 60px; }
+  padding: 20px 20px 60px; }
   @media (max-width: 866px) {
     .welcomeCard {
-      padding: 20px 40px; } }
+      padding: 20px; } }
   @media (min-width: 1122px) {
     .welcomeCard {
       font-size: 15px; } }
@@ -223,7 +223,7 @@ body {
 
 .onboardingMessageImage {
   height: 112px;
-  width: 140px;
+  width: 180px;
   background-size: auto 140px;
   background-position: center center;
   background-repeat: no-repeat;
@@ -233,10 +233,6 @@ body {
       height: 75px;
       min-width: 80px;
       background-size: 140px; } }
-  @media (min-width: 1122px) {
-    .onboardingMessageImage {
-      width: 140px;
-      background-size: auto 140px; } }
 
 .start-button {
   border: 0;
diff --git a/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss b/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss
index 34ca78c144c2..56579062b0ab 100644
--- a/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss
+++ b/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss
@@ -8,7 +8,6 @@
 $break-point-medium: 610px;
 $break-point-large: 866px;
 $break-point-widest: 1122px;
-$onboarding-card-image-width: 140px;
 
 html {
   height: 100%;
@@ -131,10 +130,10 @@ body {
   border-radius: 4px;
   box-shadow: var(--newtab-card-shadow);
   font-size: 13px;
-  padding: 20px 40px 60px;
+  padding: 20px 20px 60px;
 
   @media (max-width: $break-point-large) {
-    padding: 20px 40px;
+    padding: 20px;
   }
 
   @media (min-width: $break-point-widest) {
@@ -196,8 +195,8 @@ body {
 
 .onboardingMessageImage {
   height: 112px;
-  width: $onboarding-card-image-width;
-  background-size: auto $onboarding-card-image-width;
+  width: 180px;
+  background-size: auto 140px;
   background-position: center center;
   background-repeat: no-repeat;
   display: inline-block;
@@ -205,12 +204,7 @@ body {
   @media (max-width: $break-point-large) {
     height: 75px;
     min-width: 80px;
-    background-size: $onboarding-card-image-width;
-  }
-
-  @media (min-width: $break-point-widest) {
-    width: $onboarding-card-image-width;
-    background-size: auto $onboarding-card-image-width;
+    background-size: 140px;
   }
 }
 
diff --git a/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss b/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss
index 1fe0ef7472fe..fa88c8ebdb7b 100644
--- a/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss
+++ b/browser/components/newtab/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss
@@ -117,7 +117,7 @@
 // Also used for Trailhead
 .onboardingMessageImage {
   height: 112px;
-  width: 120px;
+  width: 180px;
   background-size: auto 140px;
   background-position: center center;
   background-repeat: no-repeat;
@@ -129,9 +129,4 @@
     min-width: 80px;
     background-size: 140px;
   }
-
-  @media (min-width: $break-point-widest) {
-    width: 230px;
-    background-size: auto 140px;
-  }
 }
diff --git a/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss b/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
index fc4bdd4ccda7..56d0e8d26ed1 100644
--- a/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
+++ b/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
@@ -266,10 +266,10 @@
   box-shadow: var(--newtab-card-shadow);
 
   font-size: 13px;
-  padding: 20px 40px 60px;
+  padding: 20px 20px 60px;
 
   @media (max-width: 865px) {
-    padding: 20px 40px;
+    padding: 20px;
   }
 
   @media (min-width: $break-point-widest) {
diff --git a/browser/components/newtab/content-src/lib/selectLayoutRender.js b/browser/components/newtab/content-src/lib/selectLayoutRender.js
index c28e7be383fd..0d348358b2a9 100644
--- a/browser/components/newtab/content-src/lib/selectLayoutRender.js
+++ b/browser/components/newtab/content-src/lib/selectLayoutRender.js
@@ -57,6 +57,7 @@ export const selectLayoutRender = ({
     "SectionTitle",
     "Navigation",
     "CardGrid",
+    "CollectionCardGrid",
     "Hero",
     "HorizontalRule",
     "List",
diff --git a/browser/components/newtab/css/activity-stream-linux.css b/browser/components/newtab/css/activity-stream-linux.css
index 26787e5131ff..e4384f5b3221 100644
--- a/browser/components/newtab/css/activity-stream-linux.css
+++ b/browser/components/newtab/css/activity-stream-linux.css
@@ -3996,7 +3996,7 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
 
 .onboardingMessageImage {
   height: 112px;
-  width: 120px;
+  width: 180px;
   background-size: auto 140px;
   background-position: center center;
   background-repeat: no-repeat;
@@ -4006,10 +4006,6 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
       height: 75px;
       min-width: 80px;
       background-size: 140px; } }
-  @media (min-width: 1122px) {
-    .onboardingMessageImage {
-      width: 230px;
-      background-size: auto 140px; } }
 
 .EOYSnippetForm {
   margin: 10px 0 8px;
@@ -4301,10 +4297,10 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
   border-radius: 4px;
   box-shadow: var(--newtab-card-shadow);
   font-size: 13px;
-  padding: 20px 40px 60px; }
+  padding: 20px 20px 60px; }
   @media (max-width: 865px) {
     .trailheadCard {
-      padding: 20px 40px; } }
+      padding: 20px; } }
   @media (min-width: 1122px) {
     .trailheadCard {
       font-size: 15px; } }
diff --git a/browser/components/newtab/css/activity-stream-mac.css b/browser/components/newtab/css/activity-stream-mac.css
index c9c2b9fec6fe..903c03697c08 100644
--- a/browser/components/newtab/css/activity-stream-mac.css
+++ b/browser/components/newtab/css/activity-stream-mac.css
@@ -3999,7 +3999,7 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
 
 .onboardingMessageImage {
   height: 112px;
-  width: 120px;
+  width: 180px;
   background-size: auto 140px;
   background-position: center center;
   background-repeat: no-repeat;
@@ -4009,10 +4009,6 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
       height: 75px;
       min-width: 80px;
       background-size: 140px; } }
-  @media (min-width: 1122px) {
-    .onboardingMessageImage {
-      width: 230px;
-      background-size: auto 140px; } }
 
 .EOYSnippetForm {
   margin: 10px 0 8px;
@@ -4304,10 +4300,10 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
   border-radius: 4px;
   box-shadow: var(--newtab-card-shadow);
   font-size: 13px;
-  padding: 20px 40px 60px; }
+  padding: 20px 20px 60px; }
   @media (max-width: 865px) {
     .trailheadCard {
-      padding: 20px 40px; } }
+      padding: 20px; } }
   @media (min-width: 1122px) {
     .trailheadCard {
       font-size: 15px; } }
diff --git a/browser/components/newtab/css/activity-stream-windows.css b/browser/components/newtab/css/activity-stream-windows.css
index 4fd63f1a37aa..2f5284e7f4b0 100644
--- a/browser/components/newtab/css/activity-stream-windows.css
+++ b/browser/components/newtab/css/activity-stream-windows.css
@@ -3996,7 +3996,7 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
 
 .onboardingMessageImage {
   height: 112px;
-  width: 120px;
+  width: 180px;
   background-size: auto 140px;
   background-position: center center;
   background-repeat: no-repeat;
@@ -4006,10 +4006,6 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
       height: 75px;
       min-width: 80px;
       background-size: 140px; } }
-  @media (min-width: 1122px) {
-    .onboardingMessageImage {
-      width: 230px;
-      background-size: auto 140px; } }
 
 .EOYSnippetForm {
   margin: 10px 0 8px;
@@ -4301,10 +4297,10 @@ body[lwt-newtab-brighttext] .scene2Icon .icon-light-theme {
   border-radius: 4px;
   box-shadow: var(--newtab-card-shadow);
   font-size: 13px;
-  padding: 20px 40px 60px; }
+  padding: 20px 20px 60px; }
   @media (max-width: 865px) {
     .trailheadCard {
-      padding: 20px 40px; } }
+      padding: 20px; } }
   @media (min-width: 1122px) {
     .trailheadCard {
       font-size: 15px; } }
diff --git a/browser/components/newtab/data/content/activity-stream.bundle.js b/browser/components/newtab/data/content/activity-stream.bundle.js
index 55019ae36ced..fdc6270ba16f 100644
--- a/browser/components/newtab/data/content/activity-stream.bundle.js
+++ b/browser/components/newtab/data/content/activity-stream.bundle.js
@@ -10432,7 +10432,7 @@ const selectLayoutRender = ({
   }
 
   const positions = {};
-  const DS_COMPONENTS = ["Message", "TextPromo", "SectionTitle", "Navigation", "CardGrid", "Hero", "HorizontalRule", "List"];
+  const DS_COMPONENTS = ["Message", "TextPromo", "SectionTitle", "Navigation", "CardGrid", "CollectionCardGrid", "Hero", "HorizontalRule", "List"];
   const filterArray = [];
 
   if (!prefs["feeds.topsites"]) {
diff --git a/browser/components/newtab/lib/ASRouterTriggerListeners.jsm b/browser/components/newtab/lib/ASRouterTriggerListeners.jsm
index 81a8b97e4556..9a4256c6e931 100644
--- a/browser/components/newtab/lib/ASRouterTriggerListeners.jsm
+++ b/browser/components/newtab/lib/ASRouterTriggerListeners.jsm
@@ -396,8 +396,8 @@ this.ASRouterTriggerListeners = new Map([
   ],
 
   /**
-   * Add an observer notification to notify the trigger handler whenever the user saves a new login
-   * via the login capture doorhanger.
+   * Add an observer notification to notify the trigger handler whenever the user
+   * saves or updates a login via the login capture doorhanger.
    */
   [
     "newSavedLogin",
@@ -412,6 +412,7 @@ this.ASRouterTriggerListeners = new Map([
       init(triggerHandler) {
         if (!this._initialized) {
           Services.obs.addObserver(this, "LoginStats:NewSavedPassword");
+          Services.obs.addObserver(this, "LoginStats:LoginUpdateSaved");
           this._initialized = true;
         }
         this._triggerHandler = triggerHandler;
@@ -420,6 +421,7 @@ this.ASRouterTriggerListeners = new Map([
       uninit() {
         if (this._initialized) {
           Services.obs.removeObserver(this, "LoginStats:NewSavedPassword");
+          Services.obs.removeObserver(this, "LoginStats:LoginUpdateSaved");
 
           this._initialized = false;
           this._triggerHandler = null;
@@ -433,7 +435,26 @@ this.ASRouterTriggerListeners = new Map([
           // to enable Sync during the sign up process is a bad UX.
           return;
         }
-        this._triggerHandler(aSubject, { id: "newSavedLogin" });
+
+        switch (aTopic) {
+          case "LoginStats:NewSavedPassword": {
+            this._triggerHandler(aSubject, {
+              id: "newSavedLogin",
+              context: { type: "save" },
+            });
+            break;
+          }
+          case "LoginStats:LoginUpdateSaved": {
+            this._triggerHandler(aSubject, {
+              id: "newSavedLogin",
+              context: { type: "update" },
+            });
+            break;
+          }
+          default: {
+            throw new Error(`Unexpected observer notification: ${aTopic}`);
+          }
+        }
       },
     },
   ],
diff --git a/browser/components/newtab/lib/CFRMessageProvider.jsm b/browser/components/newtab/lib/CFRMessageProvider.jsm
index fbce85c2cfaa..9908bf15f3e7 100644
--- a/browser/components/newtab/lib/CFRMessageProvider.jsm
+++ b/browser/components/newtab/lib/CFRMessageProvider.jsm
@@ -547,9 +547,9 @@ const CFR_MESSAGES = [
     frequency: {
       lifetime: 3,
     },
-    targeting: "usesFirefoxSync == false",
+    targeting:
+      "(!type || type == 'save') && isFxAEnabled == true && usesFirefoxSync == false",
     template: "cfr_doorhanger",
-    last_modified: 1565907636313,
     content: {
       layout: "icon_and_message",
       text: {
@@ -616,6 +616,80 @@ const CFR_MESSAGES = [
       id: "newSavedLogin",
     },
   },
+  {
+    id: "UPDATE_LOGIN",
+    frequency: {
+      lifetime: 3,
+    },
+    targeting:
+      "type == 'update' && isFxAEnabled == true && usesFirefoxSync == false",
+    template: "cfr_doorhanger",
+    content: {
+      layout: "icon_and_message",
+      text: {
+        string_id: "cfr-doorhanger-sync-logins-body",
+      },
+      icon: "chrome://browser/content/aboutlogins/icons/intro-illustration.svg",
+      icon_class: "cfr-doorhanger-large-icon",
+      buttons: {
+        secondary: [
+          {
+            label: {
+              string_id: "cfr-doorhanger-extension-cancel-button",
+            },
+            action: {
+              type: "CANCEL",
+            },
+          },
+          {
+            label: {
+              string_id: "cfr-doorhanger-extension-never-show-recommendation",
+            },
+          },
+          {
+            label: {
+              string_id: "cfr-doorhanger-extension-manage-settings-button",
+            },
+            action: {
+              type: "OPEN_PREFERENCES_PAGE",
+              data: {
+                category: "general-cfrfeatures",
+              },
+            },
+          },
+        ],
+        primary: {
+          label: {
+            string_id: "cfr-doorhanger-sync-logins-ok-button",
+          },
+          action: {
+            type: "OPEN_PREFERENCES_PAGE",
+            data: {
+              category: "sync",
+              entrypoint: "cfr-update-login",
+            },
+          },
+        },
+      },
+      bucket_id: "CFR_UPDATE_LOGIN",
+      heading_text: {
+        string_id: "cfr-doorhanger-sync-logins-header",
+      },
+      info_icon: {
+        label: {
+          string_id: "cfr-doorhanger-extension-sumo-link",
+        },
+        sumo_path: "extensionrecommendations",
+      },
+      notification_text: {
+        string_id: "cfr-doorhanger-feature-notification",
+      },
+      category: "cfrFeatures",
+    },
+    trigger: {
+      id: "newSavedLogin",
+    },
+  },
   {
     id: "SOCIAL_TRACKING_PROTECTION",
     template: "cfr_doorhanger",
diff --git a/browser/components/newtab/lib/DiscoveryStreamFeed.jsm b/browser/components/newtab/lib/DiscoveryStreamFeed.jsm
index 19f736f7bfb6..71d3fb4dc913 100644
--- a/browser/components/newtab/lib/DiscoveryStreamFeed.jsm
+++ b/browser/components/newtab/lib/DiscoveryStreamFeed.jsm
@@ -1924,7 +1924,7 @@ getHardcodedLayout = isBasicLayout => ({
               },
               {
                 name: "More Recommendations ›",
-                url: "https://getpocket.com/explore/trending?src=fx_new_tab",
+                url: "https://getpocket.com/explore?src=fx_new_tab&cdn=0",
               },
             ],
           },
diff --git a/browser/components/newtab/package-lock.json b/browser/components/newtab/package-lock.json
index f320722871c6..ec2279f02572 100644
--- a/browser/components/newtab/package-lock.json
+++ b/browser/components/newtab/package-lock.json
@@ -7900,9 +7900,9 @@
       }
     },
     "react": {
-      "version": "16.12.0",
-      "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz",
-      "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==",
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
+      "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
       "requires": {
         "loose-envify": "^1.1.0",
         "object-assign": "^4.1.1",
@@ -7910,14 +7910,25 @@
       }
     },
     "react-dom": {
-      "version": "16.12.0",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz",
-      "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==",
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
+      "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
       "requires": {
         "loose-envify": "^1.1.0",
         "object-assign": "^4.1.1",
         "prop-types": "^15.6.2",
-        "scheduler": "^0.18.0"
+        "scheduler": "^0.19.1"
+      },
+      "dependencies": {
+        "scheduler": {
+          "version": "0.19.1",
+          "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+          "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+          "requires": {
+            "loose-envify": "^1.1.0",
+            "object-assign": "^4.1.1"
+          }
+        }
       }
     },
     "react-is": {
@@ -8946,6 +8957,7 @@
       "version": "0.18.0",
       "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz",
       "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==",
+      "dev": true,
       "requires": {
         "loose-envify": "^1.1.0",
         "object-assign": "^4.1.1"
diff --git a/browser/components/newtab/package.json b/browser/components/newtab/package.json
index 0f050776a6dc..14ce0d8fad46 100644
--- a/browser/components/newtab/package.json
+++ b/browser/components/newtab/package.json
@@ -9,8 +9,8 @@
   "dependencies": {
     "fluent": "0.13.0",
     "fluent-react": "0.9.0",
-    "react": "16.12.0",
-    "react-dom": "16.12.0",
+    "react": "16.13.1",
+    "react-dom": "16.13.1",
     "react-redux": "7.2.0",
     "react-transition-group": "4.3.0",
     "redux": "4.0.5",
diff --git a/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js b/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js
index d68e50795190..0da72c730085 100644
--- a/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js
+++ b/browser/components/newtab/test/browser/browser_aboutwelcome_observer.js
@@ -16,8 +16,7 @@ async function openAboutWelcomeTab() {
   await setAboutWelcomePref(true);
   let tab = await BrowserTestUtils.openNewForegroundTab(
     gBrowser,
-    "about:welcome",
-    false
+    "about:welcome"
   );
   registerCleanupFunction(() => {
     BrowserTestUtils.removeTab(tab);
@@ -54,10 +53,15 @@ add_task(async function test_About_Welcome_Tab_Close() {
  */
 add_task(async function test_About_Welcome_Location_Change() {
   await openAboutWelcomeTab();
+  let windowGlobalParent =
+    gBrowser.selectedBrowser.browsingContext.currentWindowGlobal;
 
-  let AWP = new AboutWelcomeParent();
-  Assert.ok(AWP.AboutWelcomeObserver, "AboutWelcomeObserver is not null");
+  let aboutWelcomeActor = await windowGlobalParent.getActor("AboutWelcome");
 
+  Assert.ok(
+    aboutWelcomeActor.AboutWelcomeObserver,
+    "AboutWelcomeObserver is not null"
+  );
   await BrowserTestUtils.loadURI(
     gBrowser.selectedBrowser,
     "http://example.com/#foo"
@@ -68,8 +72,8 @@ add_task(async function test_About_Welcome_Location_Change() {
   );
 
   Assert.equal(
-    AWP.AboutWelcomeObserver.terminateReason,
-    AWP.AboutWelcomeObserver.AWTerminate.ADDRESS_BAR_NAVIGATED,
+    aboutWelcomeActor.AboutWelcomeObserver.terminateReason,
+    aboutWelcomeActor.AboutWelcomeObserver.AWTerminate.ADDRESS_BAR_NAVIGATED,
     "Terminated due to location uri changed"
   );
 });
diff --git a/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js b/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js
index c4e5eec46d7d..3a8b839819dd 100644
--- a/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js
+++ b/browser/components/newtab/test/browser/browser_asrouter_trigger_listeners.js
@@ -162,12 +162,18 @@ add_task(async function check_openURL_listener() {
   await Promise.all(windows.map(win => BrowserTestUtils.closeWindow(win)));
 });
 
-add_task(async function check_newSavedLogin_listener() {
+add_task(async function check_newSavedLogin_save_listener() {
   const TEST_URL =
     "https://example.com/browser/browser/components/newtab/test/browser/red_page.html";
 
-  let loginsSaved = 0;
-  const triggerHandler = () => loginsSaved++;
+  let triggerTypesHandled = {
+    save: 0,
+    update: 0,
+  };
+  const triggerHandler = (sub, { id, context }) => {
+    is(id, "newSavedLogin", "Check trigger id");
+    triggerTypesHandled[context.type]++;
+  };
   const newSavedLoginListener = ASRouterTriggerListeners.get("newSavedLogin");
 
   // Previously initialized by the Router
@@ -181,13 +187,15 @@ add_task(async function check_newSavedLogin_listener() {
     async function triggerNewSavedPassword(browser) {
       Services.obs.notifyObservers(browser, "LoginStats:NewSavedPassword");
       await BrowserTestUtils.waitForCondition(
-        () => loginsSaved !== 0,
+        () => triggerTypesHandled.save !== 0,
         "Wait for the observer notification to run"
       );
-      is(loginsSaved, 1, "should receive observer notification");
+      is(triggerTypesHandled.save, 1, "should receive observer notification");
     }
   );
 
+  is(triggerTypesHandled.update, 0, "shouldn't have handled other trigger");
+
   // Uninitialise listener
   newSavedLoginListener.uninit();
 
@@ -196,7 +204,62 @@ add_task(async function check_newSavedLogin_listener() {
     async function triggerNewSavedPasswordAfterUninit(browser) {
       Services.obs.notifyObservers(browser, "LoginStats:NewSavedPassword");
       await new Promise(resolve => executeSoon(resolve));
-      is(loginsSaved, 1, "shouldn't receive obs. notification after uninit");
+      is(
+        triggerTypesHandled.save,
+        1,
+        "shouldn't receive obs. notification after uninit"
+      );
+    }
+  );
+});
+
+add_task(async function check_newSavedLogin_update_listener() {
+  const TEST_URL =
+    "https://example.com/browser/browser/components/newtab/test/browser/red_page.html";
+
+  let triggerTypesHandled = {
+    save: 0,
+    update: 0,
+  };
+  const triggerHandler = (sub, { id, context }) => {
+    is(id, "newSavedLogin", "Check trigger id");
+    triggerTypesHandled[context.type]++;
+  };
+  const newSavedLoginListener = ASRouterTriggerListeners.get("newSavedLogin");
+
+  // Previously initialized by the Router
+  newSavedLoginListener.uninit();
+
+  // Initialise listener
+  await newSavedLoginListener.init(triggerHandler);
+
+  await BrowserTestUtils.withNewTab(
+    TEST_URL,
+    async function triggerLoginUpdateSaved(browser) {
+      Services.obs.notifyObservers(browser, "LoginStats:LoginUpdateSaved");
+      await BrowserTestUtils.waitForCondition(
+        () => triggerTypesHandled.update !== 0,
+        "Wait for the observer notification to run"
+      );
+      is(triggerTypesHandled.update, 1, "should receive observer notification");
+    }
+  );
+
+  is(triggerTypesHandled.save, 0, "shouldn't have handled other trigger");
+
+  // Uninitialise listener
+  newSavedLoginListener.uninit();
+
+  await BrowserTestUtils.withNewTab(
+    TEST_URL,
+    async function triggerLoginUpdateSavedAfterUninit(browser) {
+      Services.obs.notifyObservers(browser, "LoginStats:LoginUpdateSaved");
+      await new Promise(resolve => executeSoon(resolve));
+      is(
+        triggerTypesHandled.update,
+        1,
+        "shouldn't receive obs. notification after uninit"
+      );
     }
   );
 });
diff --git a/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js b/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js
index 6411278a221c..0393bdd0a0a9 100644
--- a/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js
+++ b/browser/components/newtab/test/unit/asrouter/CFRMessageProvider.test.js
@@ -12,7 +12,7 @@ const REGULAR_IDS = [
 
 describe("CFRMessageProvider", () => {
   it("should have a total of 10 messages", () => {
-    assert.lengthOf(messages, 10);
+    assert.lengthOf(messages, 11);
   });
   it("should have one message each for the three regular addons", () => {
     for (const id of REGULAR_IDS) {
diff --git a/browser/components/newtab/vendor/react-dev.js b/browser/components/newtab/vendor/react-dev.js
index 75d9af668968..6d64de135047 100644
--- a/browser/components/newtab/vendor/react-dev.js
+++ b/browser/components/newtab/vendor/react-dev.js
@@ -1,4 +1,4 @@
-/** @license React v16.12.0
+/** @license React v16.13.1
  * react.development.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -10,3784 +10,3309 @@
 'use strict';
 
 (function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-	typeof define === 'function' && define.amd ? define(factory) :
-	(global.React = factory());
-}(this, (function () { 'use strict';
-
-// TODO: this is special because it gets imported during build.
-
-var ReactVersion = '16.12.0';
-
-// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
-// nor polyfill, then a plain number is used for performance.
-var hasSymbol = typeof Symbol === 'function' && Symbol.for;
-var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
-var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
-var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
-var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
-var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
-var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
-var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
-// (unstable) APIs that have been removed. Can we remove the symbols?
-
-
-var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
-var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
-var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
-var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
-var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
-var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
-var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
-var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
-var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
-var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
-var FAUX_ITERATOR_SYMBOL = '@@iterator';
-function getIteratorFn(maybeIterable) {
-  if (maybeIterable === null || typeof maybeIterable !== 'object') {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+  typeof define === 'function' && define.amd ? define(['exports'], factory) :
+  (global = global || self, factory(global.React = {}));
+}(this, (function (exports) { 'use strict';
+
+  var ReactVersion = '16.13.1';
+
+  // The Symbol used to tag the ReactElement-like types. If there is no native Symbol
+  // nor polyfill, then a plain number is used for performance.
+  var hasSymbol = typeof Symbol === 'function' && Symbol.for;
+  var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
+  var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
+  var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
+  var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
+  var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
+  var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
+  var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
+  var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
+  var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
+  var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
+  var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
+  var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
+  var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
+  var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;
+  var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
+  var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
+  var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
+  var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
+  var FAUX_ITERATOR_SYMBOL = '@@iterator';
+  function getIteratorFn(maybeIterable) {
+    if (maybeIterable === null || typeof maybeIterable !== 'object') {
+      return null;
+    }
+
+    var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
+
+    if (typeof maybeIterator === 'function') {
+      return maybeIterator;
+    }
+
     return null;
   }
 
-  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
-
-  if (typeof maybeIterator === 'function') {
-    return maybeIterator;
-  }
-
-  return null;
-}
-
-/*
-object-assign
-(c) Sindre Sorhus
-@license MIT
-*/
-
-
-/* eslint-disable no-unused-vars */
-var getOwnPropertySymbols = Object.getOwnPropertySymbols;
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-var propIsEnumerable = Object.prototype.propertyIsEnumerable;
-
-function toObject(val) {
-	if (val === null || val === undefined) {
-		throw new TypeError('Object.assign cannot be called with null or undefined');
-	}
-
-	return Object(val);
-}
-
-function shouldUseNative() {
-	try {
-		if (!Object.assign) {
-			return false;
-		}
-
-		// Detect buggy property enumeration order in older V8 versions.
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
-		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
-		test1[5] = 'de';
-		if (Object.getOwnPropertyNames(test1)[0] === '5') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test2 = {};
-		for (var i = 0; i < 10; i++) {
-			test2['_' + String.fromCharCode(i)] = i;
-		}
-		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
-			return test2[n];
-		});
-		if (order2.join('') !== '0123456789') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test3 = {};
-		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
-			test3[letter] = letter;
-		});
-		if (Object.keys(Object.assign({}, test3)).join('') !==
-				'abcdefghijklmnopqrst') {
-			return false;
-		}
-
-		return true;
-	} catch (err) {
-		// We don't expect any of the above to throw, but better to be safe.
-		return false;
-	}
-}
-
-var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
-	var from;
-	var to = toObject(target);
-	var symbols;
-
-	for (var s = 1; s < arguments.length; s++) {
-		from = Object(arguments[s]);
-
-		for (var key in from) {
-			if (hasOwnProperty.call(from, key)) {
-				to[key] = from[key];
-			}
-		}
-
-		if (getOwnPropertySymbols) {
-			symbols = getOwnPropertySymbols(from);
-			for (var i = 0; i < symbols.length; i++) {
-				if (propIsEnumerable.call(from, symbols[i])) {
-					to[symbols[i]] = from[symbols[i]];
-				}
-			}
-		}
-	}
-
-	return to;
-};
-
-// Do not require this module directly! Use normal `invariant` calls with
-// template literal strings. The messages will be replaced with error codes
-// during build.
-
-/**
- * Use invariant() to assert state which your program assumes to be true.
- *
- * Provide sprintf-style format (only %s is supported) and arguments
- * to provide information about what broke and what you were
- * expecting.
- *
- * The invariant message will be stripped in production, but the invariant
- * will remain to ensure logic does not differ in production.
- */
-
-/**
- * Forked from fbjs/warning:
- * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
- *
- * Only change is we use console.warn instead of console.error,
- * and do nothing when 'console' is not supported.
- * This really simplifies the code.
- * ---
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
-var lowPriorityWarningWithoutStack = function () {};
-
-{
-  var printWarning = function (format) {
-    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
-      args[_key - 1] = arguments[_key];
-    }
+  /*
+  object-assign
+  (c) Sindre Sorhus
+  @license MIT
+  */
+  /* eslint-disable no-unused-vars */
+  var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+  function toObject(val) {
+  	if (val === null || val === undefined) {
+  		throw new TypeError('Object.assign cannot be called with null or undefined');
+  	}
+
+  	return Object(val);
+  }
+
+  function shouldUseNative() {
+  	try {
+  		if (!Object.assign) {
+  			return false;
+  		}
+
+  		// Detect buggy property enumeration order in older V8 versions.
+
+  		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
+  		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
+  		test1[5] = 'de';
+  		if (Object.getOwnPropertyNames(test1)[0] === '5') {
+  			return false;
+  		}
+
+  		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
+  		var test2 = {};
+  		for (var i = 0; i < 10; i++) {
+  			test2['_' + String.fromCharCode(i)] = i;
+  		}
+  		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
+  			return test2[n];
+  		});
+  		if (order2.join('') !== '0123456789') {
+  			return false;
+  		}
+
+  		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
+  		var test3 = {};
+  		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
+  			test3[letter] = letter;
+  		});
+  		if (Object.keys(Object.assign({}, test3)).join('') !==
+  				'abcdefghijklmnopqrst') {
+  			return false;
+  		}
+
+  		return true;
+  	} catch (err) {
+  		// We don't expect any of the above to throw, but better to be safe.
+  		return false;
+  	}
+  }
+
+  var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
+  	var from;
+  	var to = toObject(target);
+  	var symbols;
+
+  	for (var s = 1; s < arguments.length; s++) {
+  		from = Object(arguments[s]);
+
+  		for (var key in from) {
+  			if (hasOwnProperty.call(from, key)) {
+  				to[key] = from[key];
+  			}
+  		}
+
+  		if (getOwnPropertySymbols) {
+  			symbols = getOwnPropertySymbols(from);
+  			for (var i = 0; i < symbols.length; i++) {
+  				if (propIsEnumerable.call(from, symbols[i])) {
+  					to[symbols[i]] = from[symbols[i]];
+  				}
+  			}
+  		}
+  	}
+
+  	return to;
+  };
 
-    var argIndex = 0;
-    var message = 'Warning: ' + format.replace(/%s/g, function () {
-      return args[argIndex++];
-    });
+  /**
+   * Keeps track of the current dispatcher.
+   */
+  var ReactCurrentDispatcher = {
+    /**
+     * @internal
+     * @type {ReactComponent}
+     */
+    current: null
+  };
 
-    if (typeof console !== 'undefined') {
-      console.warn(message);
-    }
+  /**
+   * Keeps track of the current batch's configuration such as how long an update
+   * should suspend for if it needs to.
+   */
+  var ReactCurrentBatchConfig = {
+    suspense: null
+  };
 
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
+  /**
+   * Keeps track of the current owner.
+   *
+   * The current owner is the component who should own any components that are
+   * currently being constructed.
+   */
+  var ReactCurrentOwner = {
+    /**
+     * @internal
+     * @type {ReactComponent}
+     */
+    current: null
   };
 
-  lowPriorityWarningWithoutStack = function (condition, format) {
-    if (format === undefined) {
-      throw new Error('`lowPriorityWarningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument');
-    }
+  var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
+  function describeComponentFrame (name, source, ownerName) {
+    var sourceInfo = '';
+
+    if (source) {
+      var path = source.fileName;
+      var fileName = path.replace(BEFORE_SLASH_RE, '');
 
-    if (!condition) {
-      for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
-        args[_key2 - 2] = arguments[_key2];
+      {
+        // In DEV, include code for a common special case:
+        // prefer "folder/index.js" instead of just "index.js".
+        if (/^index\./.test(fileName)) {
+          var match = path.match(BEFORE_SLASH_RE);
+
+          if (match) {
+            var pathBeforeSlash = match[1];
+
+            if (pathBeforeSlash) {
+              var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
+              fileName = folderName + '/' + fileName;
+            }
+          }
+        }
       }
 
-      printWarning.apply(void 0, [format].concat(args));
+      sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
+    } else if (ownerName) {
+      sourceInfo = ' (created by ' + ownerName + ')';
     }
-  };
-}
 
-var lowPriorityWarningWithoutStack$1 = lowPriorityWarningWithoutStack;
+    return '\n    in ' + (name || 'Unknown') + sourceInfo;
+  }
 
-/**
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
-var warningWithoutStack = function () {};
+  var Resolved = 1;
+  function refineResolvedLazyComponent(lazyComponent) {
+    return lazyComponent._status === Resolved ? lazyComponent._result : null;
+  }
 
-{
-  warningWithoutStack = function (condition, format) {
-    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
-    }
+  function getWrappedName(outerType, innerType, wrapperName) {
+    var functionName = innerType.displayName || innerType.name || '';
+    return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
+  }
 
-    if (format === undefined) {
-      throw new Error('`warningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument');
+  function getComponentName(type) {
+    if (type == null) {
+      // Host root, text node or just invalid type.
+      return null;
     }
 
-    if (args.length > 8) {
-      // Check before the condition to catch violations early.
-      throw new Error('warningWithoutStack() currently supports at most 8 arguments.');
+    {
+      if (typeof type.tag === 'number') {
+        error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
+      }
     }
 
-    if (condition) {
-      return;
+    if (typeof type === 'function') {
+      return type.displayName || type.name || null;
     }
 
-    if (typeof console !== 'undefined') {
-      var argsWithFormat = args.map(function (item) {
-        return '' + item;
-      });
-      argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
-      // breaks IE9: https://github.com/facebook/react/issues/13610
-
-      Function.prototype.apply.call(console.error, console, argsWithFormat);
+    if (typeof type === 'string') {
+      return type;
     }
 
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      var argIndex = 0;
-      var message = 'Warning: ' + format.replace(/%s/g, function () {
-        return args[argIndex++];
-      });
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
-
-var warningWithoutStack$1 = warningWithoutStack;
-
-var didWarnStateUpdateForUnmountedComponent = {};
-
-function warnNoop(publicInstance, callerName) {
-  {
-    var _constructor = publicInstance.constructor;
-    var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';
-    var warningKey = componentName + "." + callerName;
+    switch (type) {
+      case REACT_FRAGMENT_TYPE:
+        return 'Fragment';
 
-    if (didWarnStateUpdateForUnmountedComponent[warningKey]) {
-      return;
-    }
+      case REACT_PORTAL_TYPE:
+        return 'Portal';
 
-    warningWithoutStack$1(false, "Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);
-    didWarnStateUpdateForUnmountedComponent[warningKey] = true;
-  }
-}
-/**
- * This is the abstract API for an update queue.
- */
+      case REACT_PROFILER_TYPE:
+        return "Profiler";
 
+      case REACT_STRICT_MODE_TYPE:
+        return 'StrictMode';
 
-var ReactNoopUpdateQueue = {
-  /**
-   * Checks whether or not this composite component is mounted.
-   * @param {ReactClass} publicInstance The instance we want to test.
-   * @return {boolean} True if mounted, false otherwise.
-   * @protected
-   * @final
-   */
-  isMounted: function (publicInstance) {
-    return false;
-  },
+      case REACT_SUSPENSE_TYPE:
+        return 'Suspense';
 
-  /**
-   * Forces an update. This should only be invoked when it is known with
-   * certainty that we are **not** in a DOM transaction.
-   *
-   * You may want to call this when you know that some deeper aspect of the
-   * component's state has changed but `setState` was not called.
-   *
-   * This will not invoke `shouldComponentUpdate`, but it will invoke
-   * `componentWillUpdate` and `componentDidUpdate`.
-   *
-   * @param {ReactClass} publicInstance The instance that should rerender.
-   * @param {?function} callback Called after component is updated.
-   * @param {?string} callerName name of the calling function in the public API.
-   * @internal
-   */
-  enqueueForceUpdate: function (publicInstance, callback, callerName) {
-    warnNoop(publicInstance, 'forceUpdate');
-  },
+      case REACT_SUSPENSE_LIST_TYPE:
+        return 'SuspenseList';
+    }
 
-  /**
-   * Replaces all of the state. Always use this or `setState` to mutate state.
-   * You should treat `this.state` as immutable.
-   *
-   * There is no guarantee that `this.state` will be immediately updated, so
-   * accessing `this.state` after calling this method may return the old value.
-   *
-   * @param {ReactClass} publicInstance The instance that should rerender.
-   * @param {object} completeState Next state.
-   * @param {?function} callback Called after component is updated.
-   * @param {?string} callerName name of the calling function in the public API.
-   * @internal
-   */
-  enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {
-    warnNoop(publicInstance, 'replaceState');
-  },
+    if (typeof type === 'object') {
+      switch (type.$$typeof) {
+        case REACT_CONTEXT_TYPE:
+          return 'Context.Consumer';
 
-  /**
-   * Sets a subset of the state. This only exists because _pendingState is
-   * internal. This provides a merging strategy that is not available to deep
-   * properties which is confusing. TODO: Expose pendingState or don't use it
-   * during the merge.
-   *
-   * @param {ReactClass} publicInstance The instance that should rerender.
-   * @param {object} partialState Next partial state to be merged with state.
-   * @param {?function} callback Called after component is updated.
-   * @param {?string} Name of the calling function in the public API.
-   * @internal
-   */
-  enqueueSetState: function (publicInstance, partialState, callback, callerName) {
-    warnNoop(publicInstance, 'setState');
-  }
-};
+        case REACT_PROVIDER_TYPE:
+          return 'Context.Provider';
 
-var emptyObject = {};
+        case REACT_FORWARD_REF_TYPE:
+          return getWrappedName(type, type.render, 'ForwardRef');
 
-{
-  Object.freeze(emptyObject);
-}
-/**
- * Base class helpers for the updating state of a component.
- */
+        case REACT_MEMO_TYPE:
+          return getComponentName(type.type);
 
+        case REACT_BLOCK_TYPE:
+          return getComponentName(type.render);
 
-function Component(props, context, updater) {
-  this.props = props;
-  this.context = context; // If a component has string refs, we will assign a different object later.
+        case REACT_LAZY_TYPE:
+          {
+            var thenable = type;
+            var resolvedThenable = refineResolvedLazyComponent(thenable);
 
-  this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the
-  // renderer.
+            if (resolvedThenable) {
+              return getComponentName(resolvedThenable);
+            }
 
-  this.updater = updater || ReactNoopUpdateQueue;
-}
+            break;
+          }
+      }
+    }
 
-Component.prototype.isReactComponent = {};
-/**
- * Sets a subset of the state. Always use this to mutate
- * state. You should treat `this.state` as immutable.
- *
- * There is no guarantee that `this.state` will be immediately updated, so
- * accessing `this.state` after calling this method may return the old value.
- *
- * There is no guarantee that calls to `setState` will run synchronously,
- * as they may eventually be batched together.  You can provide an optional
- * callback that will be executed when the call to setState is actually
- * completed.
- *
- * When a function is provided to setState, it will be called at some point in
- * the future (not synchronously). It will be called with the up to date
- * component arguments (state, props, context). These values can be different
- * from this.* because your function may be called after receiveProps but before
- * shouldComponentUpdate, and this new state, props, and context will not yet be
- * assigned to this.
- *
- * @param {object|function} partialState Next partial state or function to
- *        produce next partial state to be merged with current state.
- * @param {?function} callback Called after state is updated.
- * @final
- * @protected
- */
+    return null;
+  }
 
-Component.prototype.setState = function (partialState, callback) {
-  if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {
+  var ReactDebugCurrentFrame = {};
+  var currentlyValidatingElement = null;
+  function setCurrentlyValidatingElement(element) {
     {
-      throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");
+      currentlyValidatingElement = element;
     }
   }
 
-  this.updater.enqueueSetState(this, partialState, callback, 'setState');
-};
-/**
- * Forces an update. This should only be invoked when it is known with
- * certainty that we are **not** in a DOM transaction.
- *
- * You may want to call this when you know that some deeper aspect of the
- * component's state has changed but `setState` was not called.
- *
- * This will not invoke `shouldComponentUpdate`, but it will invoke
- * `componentWillUpdate` and `componentDidUpdate`.
- *
- * @param {?function} callback Called after update is complete.
- * @final
- * @protected
- */
+  {
+    // Stack implementation injected by the current renderer.
+    ReactDebugCurrentFrame.getCurrentStack = null;
 
+    ReactDebugCurrentFrame.getStackAddendum = function () {
+      var stack = ''; // Add an extra top frame while an element is being validated
 
-Component.prototype.forceUpdate = function (callback) {
-  this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');
-};
-/**
- * Deprecated APIs. These APIs used to exist on classic React classes but since
- * we would like to deprecate them, we're not going to move them over to this
- * modern base class. Instead, we define a getter that warns if it's accessed.
- */
+      if (currentlyValidatingElement) {
+        var name = getComponentName(currentlyValidatingElement.type);
+        var owner = currentlyValidatingElement._owner;
+        stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type));
+      } // Delegate to the injected renderer-specific implementation
 
 
-{
-  var deprecatedAPIs = {
-    isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],
-    replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']
-  };
+      var impl = ReactDebugCurrentFrame.getCurrentStack;
 
-  var defineDeprecationWarning = function (methodName, info) {
-    Object.defineProperty(Component.prototype, methodName, {
-      get: function () {
-        lowPriorityWarningWithoutStack$1(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);
-        return undefined;
+      if (impl) {
+        stack += impl() || '';
       }
-    });
-  };
 
-  for (var fnName in deprecatedAPIs) {
-    if (deprecatedAPIs.hasOwnProperty(fnName)) {
-      defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
-    }
+      return stack;
+    };
   }
-}
-
-function ComponentDummy() {}
-
-ComponentDummy.prototype = Component.prototype;
-/**
- * Convenience component with default shallow equality check for sCU.
- */
-
-function PureComponent(props, context, updater) {
-  this.props = props;
-  this.context = context; // If a component has string refs, we will assign a different object later.
-
-  this.refs = emptyObject;
-  this.updater = updater || ReactNoopUpdateQueue;
-}
-
-var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();
-pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.
 
-objectAssign(pureComponentPrototype, Component.prototype);
-
-pureComponentPrototype.isPureReactComponent = true;
+  /**
+   * Used by act() to track whether you're inside an act() scope.
+   */
+  var IsSomeRendererActing = {
+    current: false
+  };
 
-// an immutable object with a single mutable value
-function createRef() {
-  var refObject = {
-    current: null
+  var ReactSharedInternals = {
+    ReactCurrentDispatcher: ReactCurrentDispatcher,
+    ReactCurrentBatchConfig: ReactCurrentBatchConfig,
+    ReactCurrentOwner: ReactCurrentOwner,
+    IsSomeRendererActing: IsSomeRendererActing,
+    // Used by renderers to avoid bundling object-assign twice in UMD bundles:
+    assign: objectAssign
   };
 
   {
-    Object.seal(refObject);
+    objectAssign(ReactSharedInternals, {
+      // These should not be included in production.
+      ReactDebugCurrentFrame: ReactDebugCurrentFrame,
+      // Shim for React DOM 16.0.0 which still destructured (but not used) this.
+      // TODO: remove in React 17.0.
+      ReactComponentTreeHook: {}
+    });
   }
 
-  return refObject;
-}
-
-/**
- * Keeps track of the current dispatcher.
- */
-var ReactCurrentDispatcher = {
-  /**
-   * @internal
-   * @type {ReactComponent}
-   */
-  current: null
-};
-
-/**
- * Keeps track of the current batch's configuration such as how long an update
- * should suspend for if it needs to.
- */
-var ReactCurrentBatchConfig = {
-  suspense: null
-};
+  // by calls to these methods by a Babel plugin.
+  //
+  // In PROD (or in packages without access to React internals),
+  // they are left as they are instead.
 
-/**
- * Keeps track of the current owner.
- *
- * The current owner is the component who should own any components that are
- * currently being constructed.
- */
-var ReactCurrentOwner = {
-  /**
-   * @internal
-   * @type {ReactComponent}
-   */
-  current: null
-};
+  function warn(format) {
+    {
+      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+        args[_key - 1] = arguments[_key];
+      }
 
-var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
-var describeComponentFrame = function (name, source, ownerName) {
-  var sourceInfo = '';
+      printWarning('warn', format, args);
+    }
+  }
+  function error(format) {
+    {
+      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+        args[_key2 - 1] = arguments[_key2];
+      }
 
-  if (source) {
-    var path = source.fileName;
-    var fileName = path.replace(BEFORE_SLASH_RE, '');
+      printWarning('error', format, args);
+    }
+  }
 
+  function printWarning(level, format, args) {
+    // When changing this logic, you might want to also
+    // update consoleWithStackDev.www.js as well.
     {
-      // In DEV, include code for a common special case:
-      // prefer "folder/index.js" instead of just "index.js".
-      if (/^index\./.test(fileName)) {
-        var match = path.match(BEFORE_SLASH_RE);
+      var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\n    in') === 0;
 
-        if (match) {
-          var pathBeforeSlash = match[1];
+      if (!hasExistingStack) {
+        var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
+        var stack = ReactDebugCurrentFrame.getStackAddendum();
 
-          if (pathBeforeSlash) {
-            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
-            fileName = folderName + '/' + fileName;
-          }
+        if (stack !== '') {
+          format += '%s';
+          args = args.concat([stack]);
         }
       }
-    }
 
-    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
-  } else if (ownerName) {
-    sourceInfo = ' (created by ' + ownerName + ')';
+      var argsWithFormat = args.map(function (item) {
+        return '' + item;
+      }); // Careful: RN currently depends on this prefix
+
+      argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
+      // breaks IE9: https://github.com/facebook/react/issues/13610
+      // eslint-disable-next-line react-internal/no-production-logging
+
+      Function.prototype.apply.call(console[level], console, argsWithFormat);
+
+      try {
+        // --- Welcome to debugging React ---
+        // This error was thrown as a convenience so that you can use this stack
+        // to find the callsite that caused this warning to fire.
+        var argIndex = 0;
+        var message = 'Warning: ' + format.replace(/%s/g, function () {
+          return args[argIndex++];
+        });
+        throw new Error(message);
+      } catch (x) {}
+    }
   }
 
-  return '\n    in ' + (name || 'Unknown') + sourceInfo;
-};
+  var didWarnStateUpdateForUnmountedComponent = {};
 
-var Resolved = 1;
+  function warnNoop(publicInstance, callerName) {
+    {
+      var _constructor = publicInstance.constructor;
+      var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';
+      var warningKey = componentName + "." + callerName;
 
-function refineResolvedLazyComponent(lazyComponent) {
-  return lazyComponent._status === Resolved ? lazyComponent._result : null;
-}
+      if (didWarnStateUpdateForUnmountedComponent[warningKey]) {
+        return;
+      }
 
-function getWrappedName(outerType, innerType, wrapperName) {
-  var functionName = innerType.displayName || innerType.name || '';
-  return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
-}
+      error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);
 
-function getComponentName(type) {
-  if (type == null) {
-    // Host root, text node or just invalid type.
-    return null;
+      didWarnStateUpdateForUnmountedComponent[warningKey] = true;
+    }
   }
+  /**
+   * This is the abstract API for an update queue.
+   */
 
-  {
-    if (typeof type.tag === 'number') {
-      warningWithoutStack$1(false, 'Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
+
+  var ReactNoopUpdateQueue = {
+    /**
+     * Checks whether or not this composite component is mounted.
+     * @param {ReactClass} publicInstance The instance we want to test.
+     * @return {boolean} True if mounted, false otherwise.
+     * @protected
+     * @final
+     */
+    isMounted: function (publicInstance) {
+      return false;
+    },
+
+    /**
+     * Forces an update. This should only be invoked when it is known with
+     * certainty that we are **not** in a DOM transaction.
+     *
+     * You may want to call this when you know that some deeper aspect of the
+     * component's state has changed but `setState` was not called.
+     *
+     * This will not invoke `shouldComponentUpdate`, but it will invoke
+     * `componentWillUpdate` and `componentDidUpdate`.
+     *
+     * @param {ReactClass} publicInstance The instance that should rerender.
+     * @param {?function} callback Called after component is updated.
+     * @param {?string} callerName name of the calling function in the public API.
+     * @internal
+     */
+    enqueueForceUpdate: function (publicInstance, callback, callerName) {
+      warnNoop(publicInstance, 'forceUpdate');
+    },
+
+    /**
+     * Replaces all of the state. Always use this or `setState` to mutate state.
+     * You should treat `this.state` as immutable.
+     *
+     * There is no guarantee that `this.state` will be immediately updated, so
+     * accessing `this.state` after calling this method may return the old value.
+     *
+     * @param {ReactClass} publicInstance The instance that should rerender.
+     * @param {object} completeState Next state.
+     * @param {?function} callback Called after component is updated.
+     * @param {?string} callerName name of the calling function in the public API.
+     * @internal
+     */
+    enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {
+      warnNoop(publicInstance, 'replaceState');
+    },
+
+    /**
+     * Sets a subset of the state. This only exists because _pendingState is
+     * internal. This provides a merging strategy that is not available to deep
+     * properties which is confusing. TODO: Expose pendingState or don't use it
+     * during the merge.
+     *
+     * @param {ReactClass} publicInstance The instance that should rerender.
+     * @param {object} partialState Next partial state to be merged with state.
+     * @param {?function} callback Called after component is updated.
+     * @param {?string} Name of the calling function in the public API.
+     * @internal
+     */
+    enqueueSetState: function (publicInstance, partialState, callback, callerName) {
+      warnNoop(publicInstance, 'setState');
     }
-  }
+  };
 
-  if (typeof type === 'function') {
-    return type.displayName || type.name || null;
-  }
+  var emptyObject = {};
 
-  if (typeof type === 'string') {
-    return type;
+  {
+    Object.freeze(emptyObject);
   }
+  /**
+   * Base class helpers for the updating state of a component.
+   */
 
-  switch (type) {
-    case REACT_FRAGMENT_TYPE:
-      return 'Fragment';
 
-    case REACT_PORTAL_TYPE:
-      return 'Portal';
+  function Component(props, context, updater) {
+    this.props = props;
+    this.context = context; // If a component has string refs, we will assign a different object later.
 
-    case REACT_PROFILER_TYPE:
-      return "Profiler";
+    this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the
+    // renderer.
 
-    case REACT_STRICT_MODE_TYPE:
-      return 'StrictMode';
+    this.updater = updater || ReactNoopUpdateQueue;
+  }
 
-    case REACT_SUSPENSE_TYPE:
-      return 'Suspense';
+  Component.prototype.isReactComponent = {};
+  /**
+   * Sets a subset of the state. Always use this to mutate
+   * state. You should treat `this.state` as immutable.
+   *
+   * There is no guarantee that `this.state` will be immediately updated, so
+   * accessing `this.state` after calling this method may return the old value.
+   *
+   * There is no guarantee that calls to `setState` will run synchronously,
+   * as they may eventually be batched together.  You can provide an optional
+   * callback that will be executed when the call to setState is actually
+   * completed.
+   *
+   * When a function is provided to setState, it will be called at some point in
+   * the future (not synchronously). It will be called with the up to date
+   * component arguments (state, props, context). These values can be different
+   * from this.* because your function may be called after receiveProps but before
+   * shouldComponentUpdate, and this new state, props, and context will not yet be
+   * assigned to this.
+   *
+   * @param {object|function} partialState Next partial state or function to
+   *        produce next partial state to be merged with current state.
+   * @param {?function} callback Called after state is updated.
+   * @final
+   * @protected
+   */
 
-    case REACT_SUSPENSE_LIST_TYPE:
-      return 'SuspenseList';
-  }
+  Component.prototype.setState = function (partialState, callback) {
+    if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {
+      {
+        throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." );
+      }
+    }
 
-  if (typeof type === 'object') {
-    switch (type.$$typeof) {
-      case REACT_CONTEXT_TYPE:
-        return 'Context.Consumer';
+    this.updater.enqueueSetState(this, partialState, callback, 'setState');
+  };
+  /**
+   * Forces an update. This should only be invoked when it is known with
+   * certainty that we are **not** in a DOM transaction.
+   *
+   * You may want to call this when you know that some deeper aspect of the
+   * component's state has changed but `setState` was not called.
+   *
+   * This will not invoke `shouldComponentUpdate`, but it will invoke
+   * `componentWillUpdate` and `componentDidUpdate`.
+   *
+   * @param {?function} callback Called after update is complete.
+   * @final
+   * @protected
+   */
 
-      case REACT_PROVIDER_TYPE:
-        return 'Context.Provider';
 
-      case REACT_FORWARD_REF_TYPE:
-        return getWrappedName(type, type.render, 'ForwardRef');
+  Component.prototype.forceUpdate = function (callback) {
+    this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');
+  };
+  /**
+   * Deprecated APIs. These APIs used to exist on classic React classes but since
+   * we would like to deprecate them, we're not going to move them over to this
+   * modern base class. Instead, we define a getter that warns if it's accessed.
+   */
 
-      case REACT_MEMO_TYPE:
-        return getComponentName(type.type);
 
-      case REACT_LAZY_TYPE:
-        {
-          var thenable = type;
-          var resolvedThenable = refineResolvedLazyComponent(thenable);
+  {
+    var deprecatedAPIs = {
+      isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],
+      replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']
+    };
 
-          if (resolvedThenable) {
-            return getComponentName(resolvedThenable);
-          }
+    var defineDeprecationWarning = function (methodName, info) {
+      Object.defineProperty(Component.prototype, methodName, {
+        get: function () {
+          warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);
 
-          break;
+          return undefined;
         }
+      });
+    };
+
+    for (var fnName in deprecatedAPIs) {
+      if (deprecatedAPIs.hasOwnProperty(fnName)) {
+        defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
+      }
     }
   }
 
-  return null;
-}
+  function ComponentDummy() {}
 
-var ReactDebugCurrentFrame = {};
-var currentlyValidatingElement = null;
-function setCurrentlyValidatingElement(element) {
-  {
-    currentlyValidatingElement = element;
-  }
-}
+  ComponentDummy.prototype = Component.prototype;
+  /**
+   * Convenience component with default shallow equality check for sCU.
+   */
+
+  function PureComponent(props, context, updater) {
+    this.props = props;
+    this.context = context; // If a component has string refs, we will assign a different object later.
 
-{
-  // Stack implementation injected by the current renderer.
-  ReactDebugCurrentFrame.getCurrentStack = null;
+    this.refs = emptyObject;
+    this.updater = updater || ReactNoopUpdateQueue;
+  }
 
-  ReactDebugCurrentFrame.getStackAddendum = function () {
-    var stack = ''; // Add an extra top frame while an element is being validated
+  var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();
+  pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.
 
-    if (currentlyValidatingElement) {
-      var name = getComponentName(currentlyValidatingElement.type);
-      var owner = currentlyValidatingElement._owner;
-      stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type));
-    } // Delegate to the injected renderer-specific implementation
+  objectAssign(pureComponentPrototype, Component.prototype);
 
+  pureComponentPrototype.isPureReactComponent = true;
 
-    var impl = ReactDebugCurrentFrame.getCurrentStack;
+  // an immutable object with a single mutable value
+  function createRef() {
+    var refObject = {
+      current: null
+    };
 
-    if (impl) {
-      stack += impl() || '';
+    {
+      Object.seal(refObject);
     }
 
-    return stack;
-  };
-}
+    return refObject;
+  }
 
-/**
- * Used by act() to track whether you're inside an act() scope.
- */
-var IsSomeRendererActing = {
-  current: false
-};
-
-var ReactSharedInternals = {
-  ReactCurrentDispatcher: ReactCurrentDispatcher,
-  ReactCurrentBatchConfig: ReactCurrentBatchConfig,
-  ReactCurrentOwner: ReactCurrentOwner,
-  IsSomeRendererActing: IsSomeRendererActing,
-  // Used by renderers to avoid bundling object-assign twice in UMD bundles:
-  assign: objectAssign
-};
-
-{
-  objectAssign(ReactSharedInternals, {
-    // These should not be included in production.
-    ReactDebugCurrentFrame: ReactDebugCurrentFrame,
-    // Shim for React DOM 16.0.0 which still destructured (but not used) this.
-    // TODO: remove in React 17.0.
-    ReactComponentTreeHook: {}
-  });
-}
+  var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+  var RESERVED_PROPS = {
+    key: true,
+    ref: true,
+    __self: true,
+    __source: true
+  };
+  var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;
 
-/**
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
+  {
+    didWarnAboutStringRefs = {};
+  }
 
-var warning = warningWithoutStack$1;
+  function hasValidRef(config) {
+    {
+      if (hasOwnProperty$1.call(config, 'ref')) {
+        var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
 
-{
-  warning = function (condition, format) {
-    if (condition) {
-      return;
+        if (getter && getter.isReactWarning) {
+          return false;
+        }
+      }
     }
 
-    var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
-    var stack = ReactDebugCurrentFrame.getStackAddendum(); // eslint-disable-next-line react-internal/warning-and-invariant-args
+    return config.ref !== undefined;
+  }
+
+  function hasValidKey(config) {
+    {
+      if (hasOwnProperty$1.call(config, 'key')) {
+        var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
 
-    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
+        if (getter && getter.isReactWarning) {
+          return false;
+        }
+      }
     }
 
-    warningWithoutStack$1.apply(void 0, [false, format + '%s'].concat(args, [stack]));
-  };
-}
+    return config.key !== undefined;
+  }
+
+  function defineKeyPropWarningGetter(props, displayName) {
+    var warnAboutAccessingKey = function () {
+      {
+        if (!specialPropKeyWarningShown) {
+          specialPropKeyWarningShown = true;
 
-var warning$1 = warning;
+          error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);
+        }
+      }
+    };
 
-var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
-var RESERVED_PROPS = {
-  key: true,
-  ref: true,
-  __self: true,
-  __source: true
-};
-var specialPropKeyWarningShown;
-var specialPropRefWarningShown;
+    warnAboutAccessingKey.isReactWarning = true;
+    Object.defineProperty(props, 'key', {
+      get: warnAboutAccessingKey,
+      configurable: true
+    });
+  }
 
-function hasValidRef(config) {
-  {
-    if (hasOwnProperty$1.call(config, 'ref')) {
-      var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
+  function defineRefPropWarningGetter(props, displayName) {
+    var warnAboutAccessingRef = function () {
+      {
+        if (!specialPropRefWarningShown) {
+          specialPropRefWarningShown = true;
 
-      if (getter && getter.isReactWarning) {
-        return false;
+          error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);
+        }
       }
-    }
+    };
+
+    warnAboutAccessingRef.isReactWarning = true;
+    Object.defineProperty(props, 'ref', {
+      get: warnAboutAccessingRef,
+      configurable: true
+    });
   }
 
-  return config.ref !== undefined;
-}
+  function warnIfStringRefCannotBeAutoConverted(config) {
+    {
+      if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {
+        var componentName = getComponentName(ReactCurrentOwner.current.type);
 
-function hasValidKey(config) {
-  {
-    if (hasOwnProperty$1.call(config, 'key')) {
-      var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
+        if (!didWarnAboutStringRefs[componentName]) {
+          error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);
 
-      if (getter && getter.isReactWarning) {
-        return false;
+          didWarnAboutStringRefs[componentName] = true;
+        }
       }
     }
   }
+  /**
+   * Factory method to create a new React element. This no longer adheres to
+   * the class pattern, so do not use new to call it. Also, instanceof check
+   * will not work. Instead test $$typeof field against Symbol.for('react.element') to check
+   * if something is a React Element.
+   *
+   * @param {*} type
+   * @param {*} props
+   * @param {*} key
+   * @param {string|object} ref
+   * @param {*} owner
+   * @param {*} self A *temporary* helper to detect places where `this` is
+   * different from the `owner` when React.createElement is called, so that we
+   * can warn. We want to get rid of owner and replace string `ref`s with arrow
+   * functions, and as long as `this` and owner are the same, there will be no
+   * change in behavior.
+   * @param {*} source An annotation object (added by a transpiler or otherwise)
+   * indicating filename, line number, and/or other information.
+   * @internal
+   */
 
-  return config.key !== undefined;
-}
-
-function defineKeyPropWarningGetter(props, displayName) {
-  var warnAboutAccessingKey = function () {
-    if (!specialPropKeyWarningShown) {
-      specialPropKeyWarningShown = true;
-      warningWithoutStack$1(false, '%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);
-    }
-  };
 
-  warnAboutAccessingKey.isReactWarning = true;
-  Object.defineProperty(props, 'key', {
-    get: warnAboutAccessingKey,
-    configurable: true
-  });
-}
+  var ReactElement = function (type, key, ref, self, source, owner, props) {
+    var element = {
+      // This tag allows us to uniquely identify this as a React Element
+      $$typeof: REACT_ELEMENT_TYPE,
+      // Built-in properties that belong on the element
+      type: type,
+      key: key,
+      ref: ref,
+      props: props,
+      // Record the component responsible for creating this element.
+      _owner: owner
+    };
 
-function defineRefPropWarningGetter(props, displayName) {
-  var warnAboutAccessingRef = function () {
-    if (!specialPropRefWarningShown) {
-      specialPropRefWarningShown = true;
-      warningWithoutStack$1(false, '%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);
+    {
+      // The validation flag is currently mutative. We put it on
+      // an external backing store so that we can freeze the whole object.
+      // This can be replaced with a WeakMap once they are implemented in
+      // commonly used development environments.
+      element._store = {}; // To make comparing ReactElements easier for testing purposes, we make
+      // the validation flag non-enumerable (where possible, which should
+      // include every environment we run tests in), so the test framework
+      // ignores it.
+
+      Object.defineProperty(element._store, 'validated', {
+        configurable: false,
+        enumerable: false,
+        writable: true,
+        value: false
+      }); // self and source are DEV only properties.
+
+      Object.defineProperty(element, '_self', {
+        configurable: false,
+        enumerable: false,
+        writable: false,
+        value: self
+      }); // Two elements created in two different places should be considered
+      // equal for testing purposes and therefore we hide it from enumeration.
+
+      Object.defineProperty(element, '_source', {
+        configurable: false,
+        enumerable: false,
+        writable: false,
+        value: source
+      });
+
+      if (Object.freeze) {
+        Object.freeze(element.props);
+        Object.freeze(element);
+      }
     }
+
+    return element;
   };
+  /**
+   * Create and return a new ReactElement of the given type.
+   * See https://reactjs.org/docs/react-api.html#createelement
+   */
 
-  warnAboutAccessingRef.isReactWarning = true;
-  Object.defineProperty(props, 'ref', {
-    get: warnAboutAccessingRef,
-    configurable: true
-  });
-}
-/**
- * Factory method to create a new React element. This no longer adheres to
- * the class pattern, so do not use new to call it. Also, instanceof check
- * will not work. Instead test $$typeof field against Symbol.for('react.element') to check
- * if something is a React Element.
- *
- * @param {*} type
- * @param {*} props
- * @param {*} key
- * @param {string|object} ref
- * @param {*} owner
- * @param {*} self A *temporary* helper to detect places where `this` is
- * different from the `owner` when React.createElement is called, so that we
- * can warn. We want to get rid of owner and replace string `ref`s with arrow
- * functions, and as long as `this` and owner are the same, there will be no
- * change in behavior.
- * @param {*} source An annotation object (added by a transpiler or otherwise)
- * indicating filename, line number, and/or other information.
- * @internal
- */
+  function createElement(type, config, children) {
+    var propName; // Reserved names are extracted
 
+    var props = {};
+    var key = null;
+    var ref = null;
+    var self = null;
+    var source = null;
 
-var ReactElement = function (type, key, ref, self, source, owner, props) {
-  var element = {
-    // This tag allows us to uniquely identify this as a React Element
-    $$typeof: REACT_ELEMENT_TYPE,
-    // Built-in properties that belong on the element
-    type: type,
-    key: key,
-    ref: ref,
-    props: props,
-    // Record the component responsible for creating this element.
-    _owner: owner
-  };
+    if (config != null) {
+      if (hasValidRef(config)) {
+        ref = config.ref;
 
-  {
-    // The validation flag is currently mutative. We put it on
-    // an external backing store so that we can freeze the whole object.
-    // This can be replaced with a WeakMap once they are implemented in
-    // commonly used development environments.
-    element._store = {}; // To make comparing ReactElements easier for testing purposes, we make
-    // the validation flag non-enumerable (where possible, which should
-    // include every environment we run tests in), so the test framework
-    // ignores it.
-
-    Object.defineProperty(element._store, 'validated', {
-      configurable: false,
-      enumerable: false,
-      writable: true,
-      value: false
-    }); // self and source are DEV only properties.
-
-    Object.defineProperty(element, '_self', {
-      configurable: false,
-      enumerable: false,
-      writable: false,
-      value: self
-    }); // Two elements created in two different places should be considered
-    // equal for testing purposes and therefore we hide it from enumeration.
-
-    Object.defineProperty(element, '_source', {
-      configurable: false,
-      enumerable: false,
-      writable: false,
-      value: source
-    });
+        {
+          warnIfStringRefCannotBeAutoConverted(config);
+        }
+      }
 
-    if (Object.freeze) {
-      Object.freeze(element.props);
-      Object.freeze(element);
-    }
-  }
+      if (hasValidKey(config)) {
+        key = '' + config.key;
+      }
 
-  return element;
-};
-/**
- * https://github.com/reactjs/rfcs/pull/107
- * @param {*} type
- * @param {object} props
- * @param {string} key
- */
+      self = config.__self === undefined ? null : config.__self;
+      source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object
 
+      for (propName in config) {
+        if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
+          props[propName] = config[propName];
+        }
+      }
+    } // Children can be more than one argument, and those are transferred onto
+    // the newly allocated props object.
 
 
-/**
- * https://github.com/reactjs/rfcs/pull/107
- * @param {*} type
- * @param {object} props
- * @param {string} key
- */
+    var childrenLength = arguments.length - 2;
 
-function jsxDEV(type, config, maybeKey, source, self) {
-  var propName; // Reserved names are extracted
+    if (childrenLength === 1) {
+      props.children = children;
+    } else if (childrenLength > 1) {
+      var childArray = Array(childrenLength);
 
-  var props = {};
-  var key = null;
-  var ref = null; // Currently, key can be spread in as a prop. This causes a potential
-  // issue if key is also explicitly declared (ie. <div {...props} key="Hi" />
-  // or <div key="Hi" {...props} /> ). We want to deprecate key spread,
-  // but as an intermediary step, we will use jsxDEV for everything except
-  // <div {...props} key="Hi" />, because we aren't currently able to tell if
-  // key is explicitly declared to be undefined or not.
+      for (var i = 0; i < childrenLength; i++) {
+        childArray[i] = arguments[i + 2];
+      }
 
-  if (maybeKey !== undefined) {
-    key = '' + maybeKey;
-  }
+      {
+        if (Object.freeze) {
+          Object.freeze(childArray);
+        }
+      }
 
-  if (hasValidKey(config)) {
-    key = '' + config.key;
-  }
+      props.children = childArray;
+    } // Resolve default props
 
-  if (hasValidRef(config)) {
-    ref = config.ref;
-  } // Remaining properties are added to a new props object
 
+    if (type && type.defaultProps) {
+      var defaultProps = type.defaultProps;
 
-  for (propName in config) {
-    if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
-      props[propName] = config[propName];
+      for (propName in defaultProps) {
+        if (props[propName] === undefined) {
+          props[propName] = defaultProps[propName];
+        }
+      }
     }
-  } // Resolve default props
 
+    {
+      if (key || ref) {
+        var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
 
-  if (type && type.defaultProps) {
-    var defaultProps = type.defaultProps;
+        if (key) {
+          defineKeyPropWarningGetter(props, displayName);
+        }
 
-    for (propName in defaultProps) {
-      if (props[propName] === undefined) {
-        props[propName] = defaultProps[propName];
+        if (ref) {
+          defineRefPropWarningGetter(props, displayName);
+        }
       }
     }
-  }
 
-  if (key || ref) {
-    var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
+    return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
+  }
+  function cloneAndReplaceKey(oldElement, newKey) {
+    var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
+    return newElement;
+  }
+  /**
+   * Clone and return a new ReactElement using element as the starting point.
+   * See https://reactjs.org/docs/react-api.html#cloneelement
+   */
 
-    if (key) {
-      defineKeyPropWarningGetter(props, displayName);
+  function cloneElement(element, config, children) {
+    if (!!(element === null || element === undefined)) {
+      {
+        throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." );
+      }
     }
 
-    if (ref) {
-      defineRefPropWarningGetter(props, displayName);
-    }
-  }
+    var propName; // Original props are copied
 
-  return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
-}
-/**
- * Create and return a new ReactElement of the given type.
- * See https://reactjs.org/docs/react-api.html#createelement
- */
+    var props = objectAssign({}, element.props); // Reserved names are extracted
 
-function createElement(type, config, children) {
-  var propName; // Reserved names are extracted
 
-  var props = {};
-  var key = null;
-  var ref = null;
-  var self = null;
-  var source = null;
+    var key = element.key;
+    var ref = element.ref; // Self is preserved since the owner is preserved.
 
-  if (config != null) {
-    if (hasValidRef(config)) {
-      ref = config.ref;
-    }
+    var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a
+    // transpiler, and the original source is probably a better indicator of the
+    // true owner.
 
-    if (hasValidKey(config)) {
-      key = '' + config.key;
-    }
+    var source = element._source; // Owner will be preserved, unless ref is overridden
 
-    self = config.__self === undefined ? null : config.__self;
-    source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object
+    var owner = element._owner;
 
-    for (propName in config) {
-      if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
-        props[propName] = config[propName];
+    if (config != null) {
+      if (hasValidRef(config)) {
+        // Silently steal the ref from the parent.
+        ref = config.ref;
+        owner = ReactCurrentOwner.current;
       }
-    }
-  } // Children can be more than one argument, and those are transferred onto
-  // the newly allocated props object.
 
+      if (hasValidKey(config)) {
+        key = '' + config.key;
+      } // Remaining properties override existing props
 
-  var childrenLength = arguments.length - 2;
 
-  if (childrenLength === 1) {
-    props.children = children;
-  } else if (childrenLength > 1) {
-    var childArray = Array(childrenLength);
+      var defaultProps;
 
-    for (var i = 0; i < childrenLength; i++) {
-      childArray[i] = arguments[i + 2];
-    }
+      if (element.type && element.type.defaultProps) {
+        defaultProps = element.type.defaultProps;
+      }
 
-    {
-      if (Object.freeze) {
-        Object.freeze(childArray);
+      for (propName in config) {
+        if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
+          if (config[propName] === undefined && defaultProps !== undefined) {
+            // Resolve default props
+            props[propName] = defaultProps[propName];
+          } else {
+            props[propName] = config[propName];
+          }
+        }
       }
-    }
+    } // Children can be more than one argument, and those are transferred onto
+    // the newly allocated props object.
 
-    props.children = childArray;
-  } // Resolve default props
 
+    var childrenLength = arguments.length - 2;
 
-  if (type && type.defaultProps) {
-    var defaultProps = type.defaultProps;
+    if (childrenLength === 1) {
+      props.children = children;
+    } else if (childrenLength > 1) {
+      var childArray = Array(childrenLength);
 
-    for (propName in defaultProps) {
-      if (props[propName] === undefined) {
-        props[propName] = defaultProps[propName];
+      for (var i = 0; i < childrenLength; i++) {
+        childArray[i] = arguments[i + 2];
       }
+
+      props.children = childArray;
     }
+
+    return ReactElement(element.type, key, ref, self, source, owner, props);
   }
+  /**
+   * Verifies the object is a ReactElement.
+   * See https://reactjs.org/docs/react-api.html#isvalidelement
+   * @param {?object} object
+   * @return {boolean} True if `object` is a ReactElement.
+   * @final
+   */
 
-  {
-    if (key || ref) {
-      var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
+  function isValidElement(object) {
+    return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
+  }
 
-      if (key) {
-        defineKeyPropWarningGetter(props, displayName);
-      }
+  var SEPARATOR = '.';
+  var SUBSEPARATOR = ':';
+  /**
+   * Escape and wrap key so it is safe to use as a reactid
+   *
+   * @param {string} key to be escaped.
+   * @return {string} the escaped key.
+   */
 
-      if (ref) {
-        defineRefPropWarningGetter(props, displayName);
-      }
-    }
+  function escape(key) {
+    var escapeRegex = /[=:]/g;
+    var escaperLookup = {
+      '=': '=0',
+      ':': '=2'
+    };
+    var escapedString = ('' + key).replace(escapeRegex, function (match) {
+      return escaperLookup[match];
+    });
+    return '$' + escapedString;
   }
-
-  return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
-}
-/**
- * Return a function that produces ReactElements of a given type.
- * See https://reactjs.org/docs/react-api.html#createfactory
- */
+  /**
+   * TODO: Test that a single child and an array with one item have the same key
+   * pattern.
+   */
 
 
-function cloneAndReplaceKey(oldElement, newKey) {
-  var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
-  return newElement;
-}
-/**
- * Clone and return a new ReactElement using element as the starting point.
- * See https://reactjs.org/docs/react-api.html#cloneelement
- */
+  var didWarnAboutMaps = false;
+  var userProvidedKeyEscapeRegex = /\/+/g;
 
-function cloneElement(element, config, children) {
-  if (!!(element === null || element === undefined)) {
-    {
-      throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + ".");
-    }
+  function escapeUserProvidedKey(text) {
+    return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');
   }
 
-  var propName; // Original props are copied
-
-  var props = objectAssign({}, element.props); // Reserved names are extracted
+  var POOL_SIZE = 10;
+  var traverseContextPool = [];
 
+  function getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {
+    if (traverseContextPool.length) {
+      var traverseContext = traverseContextPool.pop();
+      traverseContext.result = mapResult;
+      traverseContext.keyPrefix = keyPrefix;
+      traverseContext.func = mapFunction;
+      traverseContext.context = mapContext;
+      traverseContext.count = 0;
+      return traverseContext;
+    } else {
+      return {
+        result: mapResult,
+        keyPrefix: keyPrefix,
+        func: mapFunction,
+        context: mapContext,
+        count: 0
+      };
+    }
+  }
 
-  var key = element.key;
-  var ref = element.ref; // Self is preserved since the owner is preserved.
+  function releaseTraverseContext(traverseContext) {
+    traverseContext.result = null;
+    traverseContext.keyPrefix = null;
+    traverseContext.func = null;
+    traverseContext.context = null;
+    traverseContext.count = 0;
 
-  var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a
-  // transpiler, and the original source is probably a better indicator of the
-  // true owner.
+    if (traverseContextPool.length < POOL_SIZE) {
+      traverseContextPool.push(traverseContext);
+    }
+  }
+  /**
+   * @param {?*} children Children tree container.
+   * @param {!string} nameSoFar Name of the key path so far.
+   * @param {!function} callback Callback to invoke with each child found.
+   * @param {?*} traverseContext Used to pass information throughout the traversal
+   * process.
+   * @return {!number} The number of children in this subtree.
+   */
 
-  var source = element._source; // Owner will be preserved, unless ref is overridden
 
-  var owner = element._owner;
+  function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {
+    var type = typeof children;
 
-  if (config != null) {
-    if (hasValidRef(config)) {
-      // Silently steal the ref from the parent.
-      ref = config.ref;
-      owner = ReactCurrentOwner.current;
+    if (type === 'undefined' || type === 'boolean') {
+      // All of the above are perceived as null.
+      children = null;
     }
 
-    if (hasValidKey(config)) {
-      key = '' + config.key;
-    } // Remaining properties override existing props
+    var invokeCallback = false;
 
+    if (children === null) {
+      invokeCallback = true;
+    } else {
+      switch (type) {
+        case 'string':
+        case 'number':
+          invokeCallback = true;
+          break;
 
-    var defaultProps;
-
-    if (element.type && element.type.defaultProps) {
-      defaultProps = element.type.defaultProps;
-    }
+        case 'object':
+          switch (children.$$typeof) {
+            case REACT_ELEMENT_TYPE:
+            case REACT_PORTAL_TYPE:
+              invokeCallback = true;
+          }
 
-    for (propName in config) {
-      if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
-        if (config[propName] === undefined && defaultProps !== undefined) {
-          // Resolve default props
-          props[propName] = defaultProps[propName];
-        } else {
-          props[propName] = config[propName];
-        }
       }
     }
-  } // Children can be more than one argument, and those are transferred onto
-  // the newly allocated props object.
 
+    if (invokeCallback) {
+      callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array
+      // so that it's consistent if the number of children grows.
+      nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);
+      return 1;
+    }
 
-  var childrenLength = arguments.length - 2;
-
-  if (childrenLength === 1) {
-    props.children = children;
-  } else if (childrenLength > 1) {
-    var childArray = Array(childrenLength);
+    var child;
+    var nextName;
+    var subtreeCount = 0; // Count of children found in the current subtree.
 
-    for (var i = 0; i < childrenLength; i++) {
-      childArray[i] = arguments[i + 2];
-    }
+    var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
 
-    props.children = childArray;
-  }
+    if (Array.isArray(children)) {
+      for (var i = 0; i < children.length; i++) {
+        child = children[i];
+        nextName = nextNamePrefix + getComponentKey(child, i);
+        subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
+      }
+    } else {
+      var iteratorFn = getIteratorFn(children);
 
-  return ReactElement(element.type, key, ref, self, source, owner, props);
-}
-/**
- * Verifies the object is a ReactElement.
- * See https://reactjs.org/docs/react-api.html#isvalidelement
- * @param {?object} object
- * @return {boolean} True if `object` is a ReactElement.
- * @final
- */
+      if (typeof iteratorFn === 'function') {
 
-function isValidElement(object) {
-  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
-}
+        {
+          // Warn about using Maps as children
+          if (iteratorFn === children.entries) {
+            if (!didWarnAboutMaps) {
+              warn('Using Maps as children is deprecated and will be removed in ' + 'a future major release. Consider converting children to ' + 'an array of keyed ReactElements instead.');
+            }
 
-var SEPARATOR = '.';
-var SUBSEPARATOR = ':';
-/**
- * Escape and wrap key so it is safe to use as a reactid
- *
- * @param {string} key to be escaped.
- * @return {string} the escaped key.
- */
+            didWarnAboutMaps = true;
+          }
+        }
 
-function escape(key) {
-  var escapeRegex = /[=:]/g;
-  var escaperLookup = {
-    '=': '=0',
-    ':': '=2'
-  };
-  var escapedString = ('' + key).replace(escapeRegex, function (match) {
-    return escaperLookup[match];
-  });
-  return '$' + escapedString;
-}
-/**
- * TODO: Test that a single child and an array with one item have the same key
- * pattern.
- */
+        var iterator = iteratorFn.call(children);
+        var step;
+        var ii = 0;
 
+        while (!(step = iterator.next()).done) {
+          child = step.value;
+          nextName = nextNamePrefix + getComponentKey(child, ii++);
+          subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
+        }
+      } else if (type === 'object') {
+        var addendum = '';
 
-var didWarnAboutMaps = false;
-var userProvidedKeyEscapeRegex = /\/+/g;
+        {
+          addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();
+        }
 
-function escapeUserProvidedKey(text) {
-  return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');
-}
+        var childrenString = '' + children;
 
-var POOL_SIZE = 10;
-var traverseContextPool = [];
+        {
+          {
+            throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + ")." + addendum );
+          }
+        }
+      }
+    }
 
-function getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {
-  if (traverseContextPool.length) {
-    var traverseContext = traverseContextPool.pop();
-    traverseContext.result = mapResult;
-    traverseContext.keyPrefix = keyPrefix;
-    traverseContext.func = mapFunction;
-    traverseContext.context = mapContext;
-    traverseContext.count = 0;
-    return traverseContext;
-  } else {
-    return {
-      result: mapResult,
-      keyPrefix: keyPrefix,
-      func: mapFunction,
-      context: mapContext,
-      count: 0
-    };
+    return subtreeCount;
   }
-}
-
-function releaseTraverseContext(traverseContext) {
-  traverseContext.result = null;
-  traverseContext.keyPrefix = null;
-  traverseContext.func = null;
-  traverseContext.context = null;
-  traverseContext.count = 0;
-
-  if (traverseContextPool.length < POOL_SIZE) {
-    traverseContextPool.push(traverseContext);
-  }
-}
-/**
- * @param {?*} children Children tree container.
- * @param {!string} nameSoFar Name of the key path so far.
- * @param {!function} callback Callback to invoke with each child found.
- * @param {?*} traverseContext Used to pass information throughout the traversal
- * process.
- * @return {!number} The number of children in this subtree.
- */
+  /**
+   * Traverses children that are typically specified as `props.children`, but
+   * might also be specified through attributes:
+   *
+   * - `traverseAllChildren(this.props.children, ...)`
+   * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
+   *
+   * The `traverseContext` is an optional argument that is passed through the
+   * entire traversal. It can be used to store accumulations or anything else that
+   * the callback might find relevant.
+   *
+   * @param {?*} children Children tree object.
+   * @param {!function} callback To invoke upon traversing each child.
+   * @param {?*} traverseContext Context for traversal.
+   * @return {!number} The number of children in this subtree.
+   */
 
 
-function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {
-  var type = typeof children;
+  function traverseAllChildren(children, callback, traverseContext) {
+    if (children == null) {
+      return 0;
+    }
 
-  if (type === 'undefined' || type === 'boolean') {
-    // All of the above are perceived as null.
-    children = null;
+    return traverseAllChildrenImpl(children, '', callback, traverseContext);
   }
+  /**
+   * Generate a key string that identifies a component within a set.
+   *
+   * @param {*} component A component that could contain a manual key.
+   * @param {number} index Index that is used if a manual key is not provided.
+   * @return {string}
+   */
 
-  var invokeCallback = false;
 
-  if (children === null) {
-    invokeCallback = true;
-  } else {
-    switch (type) {
-      case 'string':
-      case 'number':
-        invokeCallback = true;
-        break;
+  function getComponentKey(component, index) {
+    // Do some typechecking here since we call this blindly. We want to ensure
+    // that we don't block potential future ES APIs.
+    if (typeof component === 'object' && component !== null && component.key != null) {
+      // Explicit key
+      return escape(component.key);
+    } // Implicit key determined by the index in the set
 
-      case 'object':
-        switch (children.$$typeof) {
-          case REACT_ELEMENT_TYPE:
-          case REACT_PORTAL_TYPE:
-            invokeCallback = true;
-        }
 
-    }
+    return index.toString(36);
   }
 
-  if (invokeCallback) {
-    callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array
-    // so that it's consistent if the number of children grows.
-    nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);
-    return 1;
+  function forEachSingleChild(bookKeeping, child, name) {
+    var func = bookKeeping.func,
+        context = bookKeeping.context;
+    func.call(context, child, bookKeeping.count++);
   }
+  /**
+   * Iterates through children that are typically specified as `props.children`.
+   *
+   * See https://reactjs.org/docs/react-api.html#reactchildrenforeach
+   *
+   * The provided forEachFunc(child, index) will be called for each
+   * leaf child.
+   *
+   * @param {?*} children Children tree container.
+   * @param {function(*, int)} forEachFunc
+   * @param {*} forEachContext Context for forEachContext.
+   */
 
-  var child;
-  var nextName;
-  var subtreeCount = 0; // Count of children found in the current subtree.
-
-  var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
 
-  if (Array.isArray(children)) {
-    for (var i = 0; i < children.length; i++) {
-      child = children[i];
-      nextName = nextNamePrefix + getComponentKey(child, i);
-      subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
+  function forEachChildren(children, forEachFunc, forEachContext) {
+    if (children == null) {
+      return children;
     }
-  } else {
-    var iteratorFn = getIteratorFn(children);
 
-    if (typeof iteratorFn === 'function') {
-      {
-        // Warn about using Maps as children
-        if (iteratorFn === children.entries) {
-          !didWarnAboutMaps ? warning$1(false, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.') : void 0;
-          didWarnAboutMaps = true;
-        }
-      }
-
-      var iterator = iteratorFn.call(children);
-      var step;
-      var ii = 0;
+    var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);
+    traverseAllChildren(children, forEachSingleChild, traverseContext);
+    releaseTraverseContext(traverseContext);
+  }
 
-      while (!(step = iterator.next()).done) {
-        child = step.value;
-        nextName = nextNamePrefix + getComponentKey(child, ii++);
-        subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
-      }
-    } else if (type === 'object') {
-      var addendum = '';
+  function mapSingleChildIntoContext(bookKeeping, child, childKey) {
+    var result = bookKeeping.result,
+        keyPrefix = bookKeeping.keyPrefix,
+        func = bookKeeping.func,
+        context = bookKeeping.context;
+    var mappedChild = func.call(context, child, bookKeeping.count++);
 
-      {
-        addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();
+    if (Array.isArray(mappedChild)) {
+      mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) {
+        return c;
+      });
+    } else if (mappedChild != null) {
+      if (isValidElement(mappedChild)) {
+        mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as
+        // traverseAllChildren used to do for objects as children
+        keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);
       }
 
-      var childrenString = '' + children;
-
-      {
-        {
-          throw Error("Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + ")." + addendum);
-        }
-      }
+      result.push(mappedChild);
     }
   }
 
-  return subtreeCount;
-}
-/**
- * Traverses children that are typically specified as `props.children`, but
- * might also be specified through attributes:
- *
- * - `traverseAllChildren(this.props.children, ...)`
- * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
- *
- * The `traverseContext` is an optional argument that is passed through the
- * entire traversal. It can be used to store accumulations or anything else that
- * the callback might find relevant.
- *
- * @param {?*} children Children tree object.
- * @param {!function} callback To invoke upon traversing each child.
- * @param {?*} traverseContext Context for traversal.
- * @return {!number} The number of children in this subtree.
- */
+  function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {
+    var escapedPrefix = '';
 
+    if (prefix != null) {
+      escapedPrefix = escapeUserProvidedKey(prefix) + '/';
+    }
 
-function traverseAllChildren(children, callback, traverseContext) {
-  if (children == null) {
-    return 0;
+    var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);
+    traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);
+    releaseTraverseContext(traverseContext);
   }
+  /**
+   * Maps children that are typically specified as `props.children`.
+   *
+   * See https://reactjs.org/docs/react-api.html#reactchildrenmap
+   *
+   * The provided mapFunction(child, key, index) will be called for each
+   * leaf child.
+   *
+   * @param {?*} children Children tree container.
+   * @param {function(*, int)} func The map function.
+   * @param {*} context Context for mapFunction.
+   * @return {object} Object containing the ordered map of results.
+   */
 
-  return traverseAllChildrenImpl(children, '', callback, traverseContext);
-}
-/**
- * Generate a key string that identifies a component within a set.
- *
- * @param {*} component A component that could contain a manual key.
- * @param {number} index Index that is used if a manual key is not provided.
- * @return {string}
- */
-
-
-function getComponentKey(component, index) {
-  // Do some typechecking here since we call this blindly. We want to ensure
-  // that we don't block potential future ES APIs.
-  if (typeof component === 'object' && component !== null && component.key != null) {
-    // Explicit key
-    return escape(component.key);
-  } // Implicit key determined by the index in the set
-
-
-  return index.toString(36);
-}
-
-function forEachSingleChild(bookKeeping, child, name) {
-  var func = bookKeeping.func,
-      context = bookKeeping.context;
-  func.call(context, child, bookKeeping.count++);
-}
-/**
- * Iterates through children that are typically specified as `props.children`.
- *
- * See https://reactjs.org/docs/react-api.html#reactchildrenforeach
- *
- * The provided forEachFunc(child, index) will be called for each
- * leaf child.
- *
- * @param {?*} children Children tree container.
- * @param {function(*, int)} forEachFunc
- * @param {*} forEachContext Context for forEachContext.
- */
 
+  function mapChildren(children, func, context) {
+    if (children == null) {
+      return children;
+    }
 
-function forEachChildren(children, forEachFunc, forEachContext) {
-  if (children == null) {
-    return children;
+    var result = [];
+    mapIntoWithKeyPrefixInternal(children, result, null, func, context);
+    return result;
   }
+  /**
+   * Count the number of children that are typically specified as
+   * `props.children`.
+   *
+   * See https://reactjs.org/docs/react-api.html#reactchildrencount
+   *
+   * @param {?*} children Children tree container.
+   * @return {number} The number of children.
+   */
 
-  var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);
-  traverseAllChildren(children, forEachSingleChild, traverseContext);
-  releaseTraverseContext(traverseContext);
-}
-
-function mapSingleChildIntoContext(bookKeeping, child, childKey) {
-  var result = bookKeeping.result,
-      keyPrefix = bookKeeping.keyPrefix,
-      func = bookKeeping.func,
-      context = bookKeeping.context;
-  var mappedChild = func.call(context, child, bookKeeping.count++);
 
-  if (Array.isArray(mappedChild)) {
-    mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) {
-      return c;
-    });
-  } else if (mappedChild != null) {
-    if (isValidElement(mappedChild)) {
-      mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as
-      // traverseAllChildren used to do for objects as children
-      keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);
-    }
-
-    result.push(mappedChild);
+  function countChildren(children) {
+    return traverseAllChildren(children, function () {
+      return null;
+    }, null);
   }
-}
+  /**
+   * Flatten a children object (typically specified as `props.children`) and
+   * return an array with appropriately re-keyed children.
+   *
+   * See https://reactjs.org/docs/react-api.html#reactchildrentoarray
+   */
 
-function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {
-  var escapedPrefix = '';
 
-  if (prefix != null) {
-    escapedPrefix = escapeUserProvidedKey(prefix) + '/';
+  function toArray(children) {
+    var result = [];
+    mapIntoWithKeyPrefixInternal(children, result, null, function (child) {
+      return child;
+    });
+    return result;
   }
+  /**
+   * Returns the first child in a collection of children and verifies that there
+   * is only one child in the collection.
+   *
+   * See https://reactjs.org/docs/react-api.html#reactchildrenonly
+   *
+   * The current implementation of this function assumes that a single child gets
+   * passed without a wrapper, but the purpose of this helper function is to
+   * abstract away the particular structure of children.
+   *
+   * @param {?object} children Child collection structure.
+   * @return {ReactElement} The first and only `ReactElement` contained in the
+   * structure.
+   */
 
-  var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);
-  traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);
-  releaseTraverseContext(traverseContext);
-}
-/**
- * Maps children that are typically specified as `props.children`.
- *
- * See https://reactjs.org/docs/react-api.html#reactchildrenmap
- *
- * The provided mapFunction(child, key, index) will be called for each
- * leaf child.
- *
- * @param {?*} children Children tree container.
- * @param {function(*, int)} func The map function.
- * @param {*} context Context for mapFunction.
- * @return {object} Object containing the ordered map of results.
- */
 
+  function onlyChild(children) {
+    if (!isValidElement(children)) {
+      {
+        throw Error( "React.Children.only expected to receive a single React element child." );
+      }
+    }
 
-function mapChildren(children, func, context) {
-  if (children == null) {
     return children;
   }
 
-  var result = [];
-  mapIntoWithKeyPrefixInternal(children, result, null, func, context);
-  return result;
-}
-/**
- * Count the number of children that are typically specified as
- * `props.children`.
- *
- * See https://reactjs.org/docs/react-api.html#reactchildrencount
- *
- * @param {?*} children Children tree container.
- * @return {number} The number of children.
- */
+  function createContext(defaultValue, calculateChangedBits) {
+    if (calculateChangedBits === undefined) {
+      calculateChangedBits = null;
+    } else {
+      {
+        if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') {
+          error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits);
+        }
+      }
+    }
 
+    var context = {
+      $$typeof: REACT_CONTEXT_TYPE,
+      _calculateChangedBits: calculateChangedBits,
+      // As a workaround to support multiple concurrent renderers, we categorize
+      // some renderers as primary and others as secondary. We only expect
+      // there to be two concurrent renderers at most: React Native (primary) and
+      // Fabric (secondary); React DOM (primary) and React ART (secondary).
+      // Secondary renderers store their context values on separate fields.
+      _currentValue: defaultValue,
+      _currentValue2: defaultValue,
+      // Used to track how many concurrent renderers this context currently
+      // supports within in a single renderer. Such as parallel server rendering.
+      _threadCount: 0,
+      // These are circular
+      Provider: null,
+      Consumer: null
+    };
+    context.Provider = {
+      $$typeof: REACT_PROVIDER_TYPE,
+      _context: context
+    };
+    var hasWarnedAboutUsingNestedContextConsumers = false;
+    var hasWarnedAboutUsingConsumerProvider = false;
 
-function countChildren(children) {
-  return traverseAllChildren(children, function () {
-    return null;
-  }, null);
-}
-/**
- * Flatten a children object (typically specified as `props.children`) and
- * return an array with appropriately re-keyed children.
- *
- * See https://reactjs.org/docs/react-api.html#reactchildrentoarray
- */
+    {
+      // A separate object, but proxies back to the original context object for
+      // backwards compatibility. It has a different $$typeof, so we can properly
+      // warn for the incorrect usage of Context as a Consumer.
+      var Consumer = {
+        $$typeof: REACT_CONTEXT_TYPE,
+        _context: context,
+        _calculateChangedBits: context._calculateChangedBits
+      }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here
+
+      Object.defineProperties(Consumer, {
+        Provider: {
+          get: function () {
+            if (!hasWarnedAboutUsingConsumerProvider) {
+              hasWarnedAboutUsingConsumerProvider = true;
+
+              error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');
+            }
+
+            return context.Provider;
+          },
+          set: function (_Provider) {
+            context.Provider = _Provider;
+          }
+        },
+        _currentValue: {
+          get: function () {
+            return context._currentValue;
+          },
+          set: function (_currentValue) {
+            context._currentValue = _currentValue;
+          }
+        },
+        _currentValue2: {
+          get: function () {
+            return context._currentValue2;
+          },
+          set: function (_currentValue2) {
+            context._currentValue2 = _currentValue2;
+          }
+        },
+        _threadCount: {
+          get: function () {
+            return context._threadCount;
+          },
+          set: function (_threadCount) {
+            context._threadCount = _threadCount;
+          }
+        },
+        Consumer: {
+          get: function () {
+            if (!hasWarnedAboutUsingNestedContextConsumers) {
+              hasWarnedAboutUsingNestedContextConsumers = true;
 
+              error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
+            }
 
-function toArray(children) {
-  var result = [];
-  mapIntoWithKeyPrefixInternal(children, result, null, function (child) {
-    return child;
-  });
-  return result;
-}
-/**
- * Returns the first child in a collection of children and verifies that there
- * is only one child in the collection.
- *
- * See https://reactjs.org/docs/react-api.html#reactchildrenonly
- *
- * The current implementation of this function assumes that a single child gets
- * passed without a wrapper, but the purpose of this helper function is to
- * abstract away the particular structure of children.
- *
- * @param {?object} children Child collection structure.
- * @return {ReactElement} The first and only `ReactElement` contained in the
- * structure.
- */
+            return context.Consumer;
+          }
+        }
+      }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty
 
+      context.Consumer = Consumer;
+    }
 
-function onlyChild(children) {
-  if (!isValidElement(children)) {
     {
-      throw Error("React.Children.only expected to receive a single React element child.");
+      context._currentRenderer = null;
+      context._currentRenderer2 = null;
     }
+
+    return context;
   }
 
-  return children;
-}
+  function lazy(ctor) {
+    var lazyType = {
+      $$typeof: REACT_LAZY_TYPE,
+      _ctor: ctor,
+      // React uses these fields to store the result.
+      _status: -1,
+      _result: null
+    };
 
-function createContext(defaultValue, calculateChangedBits) {
-  if (calculateChangedBits === undefined) {
-    calculateChangedBits = null;
-  } else {
     {
-      !(calculateChangedBits === null || typeof calculateChangedBits === 'function') ? warningWithoutStack$1(false, 'createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits) : void 0;
-    }
-  }
-
-  var context = {
-    $$typeof: REACT_CONTEXT_TYPE,
-    _calculateChangedBits: calculateChangedBits,
-    // As a workaround to support multiple concurrent renderers, we categorize
-    // some renderers as primary and others as secondary. We only expect
-    // there to be two concurrent renderers at most: React Native (primary) and
-    // Fabric (secondary); React DOM (primary) and React ART (secondary).
-    // Secondary renderers store their context values on separate fields.
-    _currentValue: defaultValue,
-    _currentValue2: defaultValue,
-    // Used to track how many concurrent renderers this context currently
-    // supports within in a single renderer. Such as parallel server rendering.
-    _threadCount: 0,
-    // These are circular
-    Provider: null,
-    Consumer: null
-  };
-  context.Provider = {
-    $$typeof: REACT_PROVIDER_TYPE,
-    _context: context
-  };
-  var hasWarnedAboutUsingNestedContextConsumers = false;
-  var hasWarnedAboutUsingConsumerProvider = false;
-
-  {
-    // A separate object, but proxies back to the original context object for
-    // backwards compatibility. It has a different $$typeof, so we can properly
-    // warn for the incorrect usage of Context as a Consumer.
-    var Consumer = {
-      $$typeof: REACT_CONTEXT_TYPE,
-      _context: context,
-      _calculateChangedBits: context._calculateChangedBits
-    }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here
-
-    Object.defineProperties(Consumer, {
-      Provider: {
-        get: function () {
-          if (!hasWarnedAboutUsingConsumerProvider) {
-            hasWarnedAboutUsingConsumerProvider = true;
-            warning$1(false, 'Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');
+      // In production, this would just set it on the object.
+      var defaultProps;
+      var propTypes;
+      Object.defineProperties(lazyType, {
+        defaultProps: {
+          configurable: true,
+          get: function () {
+            return defaultProps;
+          },
+          set: function (newDefaultProps) {
+            error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
+
+            defaultProps = newDefaultProps; // Match production behavior more closely:
+
+            Object.defineProperty(lazyType, 'defaultProps', {
+              enumerable: true
+            });
           }
-
-          return context.Provider;
-        },
-        set: function (_Provider) {
-          context.Provider = _Provider;
-        }
-      },
-      _currentValue: {
-        get: function () {
-          return context._currentValue;
-        },
-        set: function (_currentValue) {
-          context._currentValue = _currentValue;
-        }
-      },
-      _currentValue2: {
-        get: function () {
-          return context._currentValue2;
-        },
-        set: function (_currentValue2) {
-          context._currentValue2 = _currentValue2;
-        }
-      },
-      _threadCount: {
-        get: function () {
-          return context._threadCount;
         },
-        set: function (_threadCount) {
-          context._threadCount = _threadCount;
-        }
-      },
-      Consumer: {
-        get: function () {
-          if (!hasWarnedAboutUsingNestedContextConsumers) {
-            hasWarnedAboutUsingNestedContextConsumers = true;
-            warning$1(false, 'Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
+        propTypes: {
+          configurable: true,
+          get: function () {
+            return propTypes;
+          },
+          set: function (newPropTypes) {
+            error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
+
+            propTypes = newPropTypes; // Match production behavior more closely:
+
+            Object.defineProperty(lazyType, 'propTypes', {
+              enumerable: true
+            });
           }
-
-          return context.Consumer;
         }
-      }
-    }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty
-
-    context.Consumer = Consumer;
-  }
+      });
+    }
 
-  {
-    context._currentRenderer = null;
-    context._currentRenderer2 = null;
+    return lazyType;
   }
 
-  return context;
-}
-
-function lazy(ctor) {
-  var lazyType = {
-    $$typeof: REACT_LAZY_TYPE,
-    _ctor: ctor,
-    // React uses these fields to store the result.
-    _status: -1,
-    _result: null
-  };
-
-  {
-    // In production, this would just set it on the object.
-    var defaultProps;
-    var propTypes;
-    Object.defineProperties(lazyType, {
-      defaultProps: {
-        configurable: true,
-        get: function () {
-          return defaultProps;
-        },
-        set: function (newDefaultProps) {
-          warning$1(false, 'React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
-          defaultProps = newDefaultProps; // Match production behavior more closely:
-
-          Object.defineProperty(lazyType, 'defaultProps', {
-            enumerable: true
-          });
+  function forwardRef(render) {
+    {
+      if (render != null && render.$$typeof === REACT_MEMO_TYPE) {
+        error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');
+      } else if (typeof render !== 'function') {
+        error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);
+      } else {
+        if (render.length !== 0 && render.length !== 2) {
+          error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');
         }
-      },
-      propTypes: {
-        configurable: true,
-        get: function () {
-          return propTypes;
-        },
-        set: function (newPropTypes) {
-          warning$1(false, 'React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
-          propTypes = newPropTypes; // Match production behavior more closely:
+      }
 
-          Object.defineProperty(lazyType, 'propTypes', {
-            enumerable: true
-          });
+      if (render != null) {
+        if (render.defaultProps != null || render.propTypes != null) {
+          error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');
         }
       }
-    });
-  }
-
-  return lazyType;
-}
-
-function forwardRef(render) {
-  {
-    if (render != null && render.$$typeof === REACT_MEMO_TYPE) {
-      warningWithoutStack$1(false, 'forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');
-    } else if (typeof render !== 'function') {
-      warningWithoutStack$1(false, 'forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);
-    } else {
-      !( // Do not warn for 0 arguments because it could be due to usage of the 'arguments' object
-      render.length === 0 || render.length === 2) ? warningWithoutStack$1(false, 'forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.') : void 0;
     }
 
-    if (render != null) {
-      !(render.defaultProps == null && render.propTypes == null) ? warningWithoutStack$1(false, 'forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?') : void 0;
-    }
+    return {
+      $$typeof: REACT_FORWARD_REF_TYPE,
+      render: render
+    };
   }
 
-  return {
-    $$typeof: REACT_FORWARD_REF_TYPE,
-    render: render
-  };
-}
-
-function isValidElementType(type) {
-  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
-  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE);
-}
-
-function memo(type, compare) {
-  {
-    if (!isValidElementType(type)) {
-      warningWithoutStack$1(false, 'memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);
-    }
+  function isValidElementType(type) {
+    return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
+    type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);
   }
 
-  return {
-    $$typeof: REACT_MEMO_TYPE,
-    type: type,
-    compare: compare === undefined ? null : compare
-  };
-}
-
-function resolveDispatcher() {
-  var dispatcher = ReactCurrentDispatcher.current;
-
-  if (!(dispatcher !== null)) {
+  function memo(type, compare) {
     {
-      throw Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.");
+      if (!isValidElementType(type)) {
+        error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);
+      }
     }
-  }
-
-  return dispatcher;
-}
 
-function useContext(Context, unstable_observedBits) {
-  var dispatcher = resolveDispatcher();
-
-  {
-    !(unstable_observedBits === undefined) ? warning$1(false, 'useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '') : void 0; // TODO: add a more generic warning for invalid values.
-
-    if (Context._context !== undefined) {
-      var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs
-      // and nobody should be using this in existing code.
-
-      if (realContext.Consumer === Context) {
-        warning$1(false, 'Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');
-      } else if (realContext.Provider === Context) {
-        warning$1(false, 'Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');
-      }
-    }
-  }
-
-  return dispatcher.useContext(Context, unstable_observedBits);
-}
-function useState(initialState) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useState(initialState);
-}
-function useReducer(reducer, initialArg, init) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useReducer(reducer, initialArg, init);
-}
-function useRef(initialValue) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useRef(initialValue);
-}
-function useEffect(create, inputs) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useEffect(create, inputs);
-}
-function useLayoutEffect(create, inputs) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useLayoutEffect(create, inputs);
-}
-function useCallback(callback, inputs) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useCallback(callback, inputs);
-}
-function useMemo(create, inputs) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useMemo(create, inputs);
-}
-function useImperativeHandle(ref, create, inputs) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useImperativeHandle(ref, create, inputs);
-}
-function useDebugValue(value, formatterFn) {
-  {
-    var dispatcher = resolveDispatcher();
-    return dispatcher.useDebugValue(value, formatterFn);
-  }
-}
-var emptyObject$1 = {};
-function useResponder(responder, listenerProps) {
-  var dispatcher = resolveDispatcher();
-
-  {
-    if (responder == null || responder.$$typeof !== REACT_RESPONDER_TYPE) {
-      warning$1(false, 'useResponder: invalid first argument. Expected an event responder, but instead got %s', responder);
-      return;
-    }
+    return {
+      $$typeof: REACT_MEMO_TYPE,
+      type: type,
+      compare: compare === undefined ? null : compare
+    };
   }
 
-  return dispatcher.useResponder(responder, listenerProps || emptyObject$1);
-}
-function useTransition(config) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useTransition(config);
-}
-function useDeferredValue(value, config) {
-  var dispatcher = resolveDispatcher();
-  return dispatcher.useDeferredValue(value, config);
-}
+  function resolveDispatcher() {
+    var dispatcher = ReactCurrentDispatcher.current;
 
-function withSuspenseConfig(scope, config) {
-  var previousConfig = ReactCurrentBatchConfig.suspense;
-  ReactCurrentBatchConfig.suspense = config === undefined ? null : config;
+    if (!(dispatcher !== null)) {
+      {
+        throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem." );
+      }
+    }
 
-  try {
-    scope();
-  } finally {
-    ReactCurrentBatchConfig.suspense = previousConfig;
+    return dispatcher;
   }
-}
-
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-
-
-var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
-
-var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
-
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-
 
-var printWarning$1 = function() {};
-
-{
-  var ReactPropTypesSecret = ReactPropTypesSecret_1;
-  var loggedTypeFailures = {};
-  var has = Function.call.bind(Object.prototype.hasOwnProperty);
+  function useContext(Context, unstable_observedBits) {
+    var dispatcher = resolveDispatcher();
 
-  printWarning$1 = function(text) {
-    var message = 'Warning: ' + text;
-    if (typeof console !== 'undefined') {
-      console.error(message);
-    }
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
+    {
+      if (unstable_observedBits !== undefined) {
+        error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '');
+      } // TODO: add a more generic warning for invalid values.
 
-/**
- * Assert that the values match with the type specs.
- * Error messages are memorized and will only be shown once.
- *
- * @param {object} typeSpecs Map of name to a ReactPropType
- * @param {object} values Runtime values that need to be type-checked
- * @param {string} location e.g. "prop", "context", "child context"
- * @param {string} componentName Name of the component for error messages.
- * @param {?Function} getStack Returns the component stack.
- * @private
- */
-function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
-  {
-    for (var typeSpecName in typeSpecs) {
-      if (has(typeSpecs, typeSpecName)) {
-        var error;
-        // Prop type validation may throw. In case they do, we don't want to
-        // fail the render phase where it didn't fail before. So we log it.
-        // After these have been cleaned up, we'll let them throw.
-        try {
-          // This is intentionally an invariant that gets caught. It's the same
-          // behavior as without this statement except with a better message.
-          if (typeof typeSpecs[typeSpecName] !== 'function') {
-            var err = Error(
-              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
-              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
-            );
-            err.name = 'Invariant Violation';
-            throw err;
-          }
-          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
-        } catch (ex) {
-          error = ex;
-        }
-        if (error && !(error instanceof Error)) {
-          printWarning$1(
-            (componentName || 'React class') + ': type specification of ' +
-            location + ' `' + typeSpecName + '` is invalid; the type checker ' +
-            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
-            'You may have forgotten to pass an argument to the type checker ' +
-            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
-            'shape all require an argument).'
-          );
-        }
-        if (error instanceof Error && !(error.message in loggedTypeFailures)) {
-          // Only monitor this failure once because there tends to be a lot of the
-          // same error.
-          loggedTypeFailures[error.message] = true;
 
-          var stack = getStack ? getStack() : '';
+      if (Context._context !== undefined) {
+        var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs
+        // and nobody should be using this in existing code.
 
-          printWarning$1(
-            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
-          );
+        if (realContext.Consumer === Context) {
+          error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');
+        } else if (realContext.Provider === Context) {
+          error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');
         }
       }
     }
-  }
-}
 
-/**
- * Resets warning cache when testing.
- *
- * @private
- */
-checkPropTypes.resetWarningCache = function() {
-  {
-    loggedTypeFailures = {};
+    return dispatcher.useContext(Context, unstable_observedBits);
   }
-};
-
-var checkPropTypes_1 = checkPropTypes;
-
-/**
- * ReactElementValidator provides a wrapper around a element factory
- * which validates the props passed to the element. This is intended to be
- * used only in DEV and could be replaced by a static type checker for languages
- * that support it.
- */
-var propTypesMisspellWarningShown;
-
-{
-  propTypesMisspellWarningShown = false;
-}
-
-var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
-
-function getDeclarationErrorAddendum() {
-  if (ReactCurrentOwner.current) {
-    var name = getComponentName(ReactCurrentOwner.current.type);
-
-    if (name) {
-      return '\n\nCheck the render method of `' + name + '`.';
-    }
+  function useState(initialState) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useState(initialState);
   }
-
-  return '';
-}
-
-function getSourceInfoErrorAddendum(source) {
-  if (source !== undefined) {
-    var fileName = source.fileName.replace(/^.*[\\\/]/, '');
-    var lineNumber = source.lineNumber;
-    return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.';
+  function useReducer(reducer, initialArg, init) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useReducer(reducer, initialArg, init);
   }
-
-  return '';
-}
-
-function getSourceInfoErrorAddendumForProps(elementProps) {
-  if (elementProps !== null && elementProps !== undefined) {
-    return getSourceInfoErrorAddendum(elementProps.__source);
+  function useRef(initialValue) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useRef(initialValue);
   }
-
-  return '';
-}
-/**
- * Warn if there's no key explicitly set on dynamic arrays of children or
- * object keys are not valid. This allows us to keep track of children between
- * updates.
- */
-
-
-var ownerHasKeyUseWarning = {};
-
-function getCurrentComponentErrorInfo(parentType) {
-  var info = getDeclarationErrorAddendum();
-
-  if (!info) {
-    var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
-
-    if (parentName) {
-      info = "\n\nCheck the top-level render call using <" + parentName + ">.";
+  function useEffect(create, deps) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useEffect(create, deps);
+  }
+  function useLayoutEffect(create, deps) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useLayoutEffect(create, deps);
+  }
+  function useCallback(callback, deps) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useCallback(callback, deps);
+  }
+  function useMemo(create, deps) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useMemo(create, deps);
+  }
+  function useImperativeHandle(ref, create, deps) {
+    var dispatcher = resolveDispatcher();
+    return dispatcher.useImperativeHandle(ref, create, deps);
+  }
+  function useDebugValue(value, formatterFn) {
+    {
+      var dispatcher = resolveDispatcher();
+      return dispatcher.useDebugValue(value, formatterFn);
     }
   }
 
-  return info;
-}
-/**
- * Warn if the element doesn't have an explicit key assigned to it.
- * This element is in an array. The array could grow and shrink or be
- * reordered. All children that haven't already been validated are required to
- * have a "key" property assigned to it. Error statuses are cached so a warning
- * will only be shown once.
- *
- * @internal
- * @param {ReactElement} element Element that requires a key.
- * @param {*} parentType element's parent's type.
- */
+  /**
+   * Copyright (c) 2013-present, Facebook, Inc.
+   *
+   * This source code is licensed under the MIT license found in the
+   * LICENSE file in the root directory of this source tree.
+   */
 
+  var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
 
-function validateExplicitKey(element, parentType) {
-  if (!element._store || element._store.validated || element.key != null) {
-    return;
-  }
+  var ReactPropTypesSecret_1 = ReactPropTypesSecret;
 
-  element._store.validated = true;
-  var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
+  var printWarning$1 = function() {};
 
-  if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
-    return;
+  {
+    var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;
+    var loggedTypeFailures = {};
+    var has = Function.call.bind(Object.prototype.hasOwnProperty);
+
+    printWarning$1 = function(text) {
+      var message = 'Warning: ' + text;
+      if (typeof console !== 'undefined') {
+        console.error(message);
+      }
+      try {
+        // --- Welcome to debugging React ---
+        // This error was thrown as a convenience so that you can use this stack
+        // to find the callsite that caused this warning to fire.
+        throw new Error(message);
+      } catch (x) {}
+    };
   }
 
-  ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a
-  // property, it may be the creator of the child that's responsible for
-  // assigning it a key.
+  /**
+   * Assert that the values match with the type specs.
+   * Error messages are memorized and will only be shown once.
+   *
+   * @param {object} typeSpecs Map of name to a ReactPropType
+   * @param {object} values Runtime values that need to be type-checked
+   * @param {string} location e.g. "prop", "context", "child context"
+   * @param {string} componentName Name of the component for error messages.
+   * @param {?Function} getStack Returns the component stack.
+   * @private
+   */
+  function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
+    {
+      for (var typeSpecName in typeSpecs) {
+        if (has(typeSpecs, typeSpecName)) {
+          var error;
+          // Prop type validation may throw. In case they do, we don't want to
+          // fail the render phase where it didn't fail before. So we log it.
+          // After these have been cleaned up, we'll let them throw.
+          try {
+            // This is intentionally an invariant that gets caught. It's the same
+            // behavior as without this statement except with a better message.
+            if (typeof typeSpecs[typeSpecName] !== 'function') {
+              var err = Error(
+                (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
+                'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
+              );
+              err.name = 'Invariant Violation';
+              throw err;
+            }
+            error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);
+          } catch (ex) {
+            error = ex;
+          }
+          if (error && !(error instanceof Error)) {
+            printWarning$1(
+              (componentName || 'React class') + ': type specification of ' +
+              location + ' `' + typeSpecName + '` is invalid; the type checker ' +
+              'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
+              'You may have forgotten to pass an argument to the type checker ' +
+              'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
+              'shape all require an argument).'
+            );
+          }
+          if (error instanceof Error && !(error.message in loggedTypeFailures)) {
+            // Only monitor this failure once because there tends to be a lot of the
+            // same error.
+            loggedTypeFailures[error.message] = true;
 
-  var childOwner = '';
+            var stack = getStack ? getStack() : '';
 
-  if (element && element._owner && element._owner !== ReactCurrentOwner.current) {
-    // Give the component that originally created this child.
-    childOwner = " It was passed a child from " + getComponentName(element._owner.type) + ".";
+            printWarning$1(
+              'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
+            );
+          }
+        }
+      }
+    }
   }
 
-  setCurrentlyValidatingElement(element);
-
-  {
-    warning$1(false, 'Each child in a list should have a unique "key" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner);
-  }
+  /**
+   * Resets warning cache when testing.
+   *
+   * @private
+   */
+  checkPropTypes.resetWarningCache = function() {
+    {
+      loggedTypeFailures = {};
+    }
+  };
 
-  setCurrentlyValidatingElement(null);
-}
-/**
- * Ensure that every element either is passed in a static location, in an
- * array with an explicit keys property defined, or in an object literal
- * with valid key property.
- *
- * @internal
- * @param {ReactNode} node Statically passed child of any type.
- * @param {*} parentType node's parent's type.
- */
+  var checkPropTypes_1 = checkPropTypes;
 
+  var propTypesMisspellWarningShown;
 
-function validateChildKeys(node, parentType) {
-  if (typeof node !== 'object') {
-    return;
+  {
+    propTypesMisspellWarningShown = false;
   }
 
-  if (Array.isArray(node)) {
-    for (var i = 0; i < node.length; i++) {
-      var child = node[i];
+  function getDeclarationErrorAddendum() {
+    if (ReactCurrentOwner.current) {
+      var name = getComponentName(ReactCurrentOwner.current.type);
 
-      if (isValidElement(child)) {
-        validateExplicitKey(child, parentType);
+      if (name) {
+        return '\n\nCheck the render method of `' + name + '`.';
       }
     }
-  } else if (isValidElement(node)) {
-    // This element was passed in a valid location.
-    if (node._store) {
-      node._store.validated = true;
-    }
-  } else if (node) {
-    var iteratorFn = getIteratorFn(node);
 
-    if (typeof iteratorFn === 'function') {
-      // Entry iterators used to provide implicit keys,
-      // but now we print a separate warning for them later.
-      if (iteratorFn !== node.entries) {
-        var iterator = iteratorFn.call(node);
-        var step;
-
-        while (!(step = iterator.next()).done) {
-          if (isValidElement(step.value)) {
-            validateExplicitKey(step.value, parentType);
-          }
-        }
-      }
-    }
+    return '';
   }
-}
-/**
- * Given an element, validate that its props follow the propTypes definition,
- * provided by the type.
- *
- * @param {ReactElement} element
- */
 
+  function getSourceInfoErrorAddendum(source) {
+    if (source !== undefined) {
+      var fileName = source.fileName.replace(/^.*[\\\/]/, '');
+      var lineNumber = source.lineNumber;
+      return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.';
+    }
 
-function validatePropTypes(element) {
-  var type = element.type;
-
-  if (type === null || type === undefined || typeof type === 'string') {
-    return;
+    return '';
   }
 
-  var name = getComponentName(type);
-  var propTypes;
+  function getSourceInfoErrorAddendumForProps(elementProps) {
+    if (elementProps !== null && elementProps !== undefined) {
+      return getSourceInfoErrorAddendum(elementProps.__source);
+    }
 
-  if (typeof type === 'function') {
-    propTypes = type.propTypes;
-  } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.
-  // Inner props are checked in the reconciler.
-  type.$$typeof === REACT_MEMO_TYPE)) {
-    propTypes = type.propTypes;
-  } else {
-    return;
-  }
-
-  if (propTypes) {
-    setCurrentlyValidatingElement(element);
-    checkPropTypes_1(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum);
-    setCurrentlyValidatingElement(null);
-  } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {
-    propTypesMisspellWarningShown = true;
-    warningWithoutStack$1(false, 'Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');
+    return '';
   }
+  /**
+   * Warn if there's no key explicitly set on dynamic arrays of children or
+   * object keys are not valid. This allows us to keep track of children between
+   * updates.
+   */
 
-  if (typeof type.getDefaultProps === 'function') {
-    !type.getDefaultProps.isReactClassApproved ? warningWithoutStack$1(false, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : void 0;
-  }
-}
-/**
- * Given a fragment, validate that it can only be provided with fragment props
- * @param {ReactElement} fragment
- */
 
+  var ownerHasKeyUseWarning = {};
 
-function validateFragmentProps(fragment) {
-  setCurrentlyValidatingElement(fragment);
-  var keys = Object.keys(fragment.props);
+  function getCurrentComponentErrorInfo(parentType) {
+    var info = getDeclarationErrorAddendum();
 
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i];
+    if (!info) {
+      var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
 
-    if (key !== 'children' && key !== 'key') {
-      warning$1(false, 'Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);
-      break;
+      if (parentName) {
+        info = "\n\nCheck the top-level render call using <" + parentName + ">.";
+      }
     }
-  }
 
-  if (fragment.ref !== null) {
-    warning$1(false, 'Invalid attribute `ref` supplied to `React.Fragment`.');
+    return info;
   }
+  /**
+   * Warn if the element doesn't have an explicit key assigned to it.
+   * This element is in an array. The array could grow and shrink or be
+   * reordered. All children that haven't already been validated are required to
+   * have a "key" property assigned to it. Error statuses are cached so a warning
+   * will only be shown once.
+   *
+   * @internal
+   * @param {ReactElement} element Element that requires a key.
+   * @param {*} parentType element's parent's type.
+   */
 
-  setCurrentlyValidatingElement(null);
-}
 
-function jsxWithValidation(type, props, key, isStaticChildren, source, self) {
-  var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to
-  // succeed and there will likely be errors in render.
+  function validateExplicitKey(element, parentType) {
+    if (!element._store || element._store.validated || element.key != null) {
+      return;
+    }
 
-  if (!validType) {
-    var info = '';
+    element._store.validated = true;
+    var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
 
-    if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
-      info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports.";
+    if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
+      return;
     }
 
-    var sourceInfo = getSourceInfoErrorAddendum(source);
+    ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a
+    // property, it may be the creator of the child that's responsible for
+    // assigning it a key.
 
-    if (sourceInfo) {
-      info += sourceInfo;
-    } else {
-      info += getDeclarationErrorAddendum();
+    var childOwner = '';
+
+    if (element && element._owner && element._owner !== ReactCurrentOwner.current) {
+      // Give the component that originally created this child.
+      childOwner = " It was passed a child from " + getComponentName(element._owner.type) + ".";
     }
 
-    var typeString;
+    setCurrentlyValidatingElement(element);
 
-    if (type === null) {
-      typeString = 'null';
-    } else if (Array.isArray(type)) {
-      typeString = 'array';
-    } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
-      typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />";
-      info = ' Did you accidentally export a JSX literal instead of a component?';
-    } else {
-      typeString = typeof type;
+    {
+      error('Each child in a list should have a unique "key" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner);
     }
 
-    warning$1(false, 'React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);
+    setCurrentlyValidatingElement(null);
   }
-
-  var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.
-  // TODO: Drop this when these are no longer allowed as the type argument.
-
-  if (element == null) {
-    return element;
-  } // Skip key warning if the type isn't valid since our key validation logic
-  // doesn't expect a non-string/function type and can throw confusing errors.
-  // We don't want exception behavior to differ between dev and prod.
-  // (Rendering will throw with a helpful message and as soon as the type is
-  // fixed, the key warnings will appear.)
+  /**
+   * Ensure that every element either is passed in a static location, in an
+   * array with an explicit keys property defined, or in an object literal
+   * with valid key property.
+   *
+   * @internal
+   * @param {ReactNode} node Statically passed child of any type.
+   * @param {*} parentType node's parent's type.
+   */
 
 
-  if (validType) {
-    var children = props.children;
+  function validateChildKeys(node, parentType) {
+    if (typeof node !== 'object') {
+      return;
+    }
 
-    if (children !== undefined) {
-      if (isStaticChildren) {
-        if (Array.isArray(children)) {
-          for (var i = 0; i < children.length; i++) {
-            validateChildKeys(children[i], type);
-          }
+    if (Array.isArray(node)) {
+      for (var i = 0; i < node.length; i++) {
+        var child = node[i];
 
-          if (Object.freeze) {
-            Object.freeze(children);
+        if (isValidElement(child)) {
+          validateExplicitKey(child, parentType);
+        }
+      }
+    } else if (isValidElement(node)) {
+      // This element was passed in a valid location.
+      if (node._store) {
+        node._store.validated = true;
+      }
+    } else if (node) {
+      var iteratorFn = getIteratorFn(node);
+
+      if (typeof iteratorFn === 'function') {
+        // Entry iterators used to provide implicit keys,
+        // but now we print a separate warning for them later.
+        if (iteratorFn !== node.entries) {
+          var iterator = iteratorFn.call(node);
+          var step;
+
+          while (!(step = iterator.next()).done) {
+            if (isValidElement(step.value)) {
+              validateExplicitKey(step.value, parentType);
+            }
           }
-        } else {
-          warning$1(false, 'React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');
         }
-      } else {
-        validateChildKeys(children, type);
       }
     }
   }
+  /**
+   * Given an element, validate that its props follow the propTypes definition,
+   * provided by the type.
+   *
+   * @param {ReactElement} element
+   */
 
-  if (hasOwnProperty$2.call(props, 'key')) {
-    warning$1(false, 'React.jsx: Spreading a key to JSX is a deprecated pattern. ' + 'Explicitly pass a key after spreading props in your JSX call. ' + 'E.g. <ComponentName {...props} key={key} />');
-  }
 
-  if (type === REACT_FRAGMENT_TYPE) {
-    validateFragmentProps(element);
-  } else {
-    validatePropTypes(element);
-  }
+  function validatePropTypes(element) {
+    {
+      var type = element.type;
 
-  return element;
-} // These two functions exist to still get child warnings in dev
-// even with the prod transform. This means that jsxDEV is purely
-// opt-in behavior for better messages but that we won't stop
-// giving you warnings if you use production apis.
+      if (type === null || type === undefined || typeof type === 'string') {
+        return;
+      }
 
-function jsxWithValidationStatic(type, props, key) {
-  return jsxWithValidation(type, props, key, true);
-}
-function jsxWithValidationDynamic(type, props, key) {
-  return jsxWithValidation(type, props, key, false);
-}
-function createElementWithValidation(type, props, children) {
-  var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to
-  // succeed and there will likely be errors in render.
+      var name = getComponentName(type);
+      var propTypes;
 
-  if (!validType) {
-    var info = '';
+      if (typeof type === 'function') {
+        propTypes = type.propTypes;
+      } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.
+      // Inner props are checked in the reconciler.
+      type.$$typeof === REACT_MEMO_TYPE)) {
+        propTypes = type.propTypes;
+      } else {
+        return;
+      }
 
-    if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
-      info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports.";
-    }
+      if (propTypes) {
+        setCurrentlyValidatingElement(element);
+        checkPropTypes_1(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum);
+        setCurrentlyValidatingElement(null);
+      } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {
+        propTypesMisspellWarningShown = true;
 
-    var sourceInfo = getSourceInfoErrorAddendumForProps(props);
+        error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');
+      }
 
-    if (sourceInfo) {
-      info += sourceInfo;
-    } else {
-      info += getDeclarationErrorAddendum();
+      if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {
+        error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');
+      }
     }
+  }
+  /**
+   * Given a fragment, validate that it can only be provided with fragment props
+   * @param {ReactElement} fragment
+   */
 
-    var typeString;
 
-    if (type === null) {
-      typeString = 'null';
-    } else if (Array.isArray(type)) {
-      typeString = 'array';
-    } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
-      typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />";
-      info = ' Did you accidentally export a JSX literal instead of a component?';
-    } else {
-      typeString = typeof type;
-    }
+  function validateFragmentProps(fragment) {
+    {
+      setCurrentlyValidatingElement(fragment);
+      var keys = Object.keys(fragment.props);
 
-    warning$1(false, 'React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);
-  }
+      for (var i = 0; i < keys.length; i++) {
+        var key = keys[i];
 
-  var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.
-  // TODO: Drop this when these are no longer allowed as the type argument.
+        if (key !== 'children' && key !== 'key') {
+          error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);
 
-  if (element == null) {
-    return element;
-  } // Skip key warning if the type isn't valid since our key validation logic
-  // doesn't expect a non-string/function type and can throw confusing errors.
-  // We don't want exception behavior to differ between dev and prod.
-  // (Rendering will throw with a helpful message and as soon as the type is
-  // fixed, the key warnings will appear.)
+          break;
+        }
+      }
 
+      if (fragment.ref !== null) {
+        error('Invalid attribute `ref` supplied to `React.Fragment`.');
+      }
 
-  if (validType) {
-    for (var i = 2; i < arguments.length; i++) {
-      validateChildKeys(arguments[i], type);
+      setCurrentlyValidatingElement(null);
     }
   }
+  function createElementWithValidation(type, props, children) {
+    var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to
+    // succeed and there will likely be errors in render.
 
-  if (type === REACT_FRAGMENT_TYPE) {
-    validateFragmentProps(element);
-  } else {
-    validatePropTypes(element);
-  }
-
-  return element;
-}
-function createFactoryWithValidation(type) {
-  var validatedFactory = createElementWithValidation.bind(null, type);
-  validatedFactory.type = type; // Legacy hook: remove it
+    if (!validType) {
+      var info = '';
 
-  {
-    Object.defineProperty(validatedFactory, 'type', {
-      enumerable: false,
-      get: function () {
-        lowPriorityWarningWithoutStack$1(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');
-        Object.defineProperty(this, 'type', {
-          value: type
-        });
-        return type;
+      if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
+        info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports.";
       }
-    });
-  }
 
-  return validatedFactory;
-}
-function cloneElementWithValidation(element, props, children) {
-  var newElement = cloneElement.apply(this, arguments);
+      var sourceInfo = getSourceInfoErrorAddendumForProps(props);
 
-  for (var i = 2; i < arguments.length; i++) {
-    validateChildKeys(arguments[i], newElement.type);
-  }
-
-  validatePropTypes(newElement);
-  return newElement;
-}
+      if (sourceInfo) {
+        info += sourceInfo;
+      } else {
+        info += getDeclarationErrorAddendum();
+      }
 
-var enableSchedulerDebugging = false;
-var enableIsInputPending = false;
-var enableProfiling = true;
+      var typeString;
 
-var requestHostCallback;
+      if (type === null) {
+        typeString = 'null';
+      } else if (Array.isArray(type)) {
+        typeString = 'array';
+      } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
+        typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />";
+        info = ' Did you accidentally export a JSX literal instead of a component?';
+      } else {
+        typeString = typeof type;
+      }
 
-var requestHostTimeout;
-var cancelHostTimeout;
-var shouldYieldToHost;
-var requestPaint;
-var getCurrentTime;
-var forceFrameRate;
+      {
+        error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);
+      }
+    }
 
-if ( // If Scheduler runs in a non-DOM environment, it falls back to a naive
-// implementation using setTimeout.
-typeof window === 'undefined' || // Check if MessageChannel is supported, too.
-typeof MessageChannel !== 'function') {
-  // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,
-  // fallback to a naive implementation.
-  var _callback = null;
-  var _timeoutID = null;
+    var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.
+    // TODO: Drop this when these are no longer allowed as the type argument.
 
-  var _flushCallback = function () {
-    if (_callback !== null) {
-      try {
-        var currentTime = getCurrentTime();
-        var hasRemainingTime = true;
+    if (element == null) {
+      return element;
+    } // Skip key warning if the type isn't valid since our key validation logic
+    // doesn't expect a non-string/function type and can throw confusing errors.
+    // We don't want exception behavior to differ between dev and prod.
+    // (Rendering will throw with a helpful message and as soon as the type is
+    // fixed, the key warnings will appear.)
 
-        _callback(hasRemainingTime, currentTime);
 
-        _callback = null;
-      } catch (e) {
-        setTimeout(_flushCallback, 0);
-        throw e;
+    if (validType) {
+      for (var i = 2; i < arguments.length; i++) {
+        validateChildKeys(arguments[i], type);
       }
     }
-  };
-
-  var initialTime = Date.now();
-
-  getCurrentTime = function () {
-    return Date.now() - initialTime;
-  };
 
-  requestHostCallback = function (cb) {
-    if (_callback !== null) {
-      // Protect against re-entrancy.
-      setTimeout(requestHostCallback, 0, cb);
+    if (type === REACT_FRAGMENT_TYPE) {
+      validateFragmentProps(element);
     } else {
-      _callback = cb;
-      setTimeout(_flushCallback, 0);
+      validatePropTypes(element);
     }
-  };
 
-  requestHostTimeout = function (cb, ms) {
-    _timeoutID = setTimeout(cb, ms);
-  };
+    return element;
+  }
+  var didWarnAboutDeprecatedCreateFactory = false;
+  function createFactoryWithValidation(type) {
+    var validatedFactory = createElementWithValidation.bind(null, type);
+    validatedFactory.type = type;
 
-  cancelHostTimeout = function () {
-    clearTimeout(_timeoutID);
-  };
+    {
+      if (!didWarnAboutDeprecatedCreateFactory) {
+        didWarnAboutDeprecatedCreateFactory = true;
 
-  shouldYieldToHost = function () {
-    return false;
-  };
+        warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');
+      } // Legacy hook: remove it
 
-  requestPaint = forceFrameRate = function () {};
-} else {
-  // Capture local references to native APIs, in case a polyfill overrides them.
-  var performance = window.performance;
-  var _Date = window.Date;
-  var _setTimeout = window.setTimeout;
-  var _clearTimeout = window.clearTimeout;
 
-  if (typeof console !== 'undefined') {
-    // TODO: Scheduler no longer requires these methods to be polyfilled. But
-    // maybe we want to continue warning if they don't exist, to preserve the
-    // option to rely on it in the future?
-    var requestAnimationFrame = window.requestAnimationFrame;
-    var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link
+      Object.defineProperty(validatedFactory, 'type', {
+        enumerable: false,
+        get: function () {
+          warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');
 
-    if (typeof requestAnimationFrame !== 'function') {
-      console.error("This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
+          Object.defineProperty(this, 'type', {
+            value: type
+          });
+          return type;
+        }
+      });
     }
 
-    if (typeof cancelAnimationFrame !== 'function') {
-      console.error("This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
-    }
+    return validatedFactory;
   }
+  function cloneElementWithValidation(element, props, children) {
+    var newElement = cloneElement.apply(this, arguments);
 
-  if (typeof performance === 'object' && typeof performance.now === 'function') {
-    getCurrentTime = function () {
-      return performance.now();
-    };
-  } else {
-    var _initialTime = _Date.now();
+    for (var i = 2; i < arguments.length; i++) {
+      validateChildKeys(arguments[i], newElement.type);
+    }
 
-    getCurrentTime = function () {
-      return _Date.now() - _initialTime;
-    };
+    validatePropTypes(newElement);
+    return newElement;
   }
 
-  var isMessageLoopRunning = false;
-  var scheduledHostCallback = null;
-  var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main
-  // thread, like user events. By default, it yields multiple times per frame.
-  // It does not attempt to align with frame boundaries, since most tasks don't
-  // need to be frame aligned; for those that do, use requestAnimationFrame.
+  var enableSchedulerDebugging = false;
+  var enableProfiling = true;
+
+  var requestHostCallback;
+  var requestHostTimeout;
+  var cancelHostTimeout;
+  var shouldYieldToHost;
+  var requestPaint;
+  var getCurrentTime;
+  var forceFrameRate;
 
-  var yieldInterval = 5;
-  var deadline = 0; // TODO: Make this configurable
-  // TODO: Adjust this based on priority?
+  if ( // If Scheduler runs in a non-DOM environment, it falls back to a naive
+  // implementation using setTimeout.
+  typeof window === 'undefined' || // Check if MessageChannel is supported, too.
+  typeof MessageChannel !== 'function') {
+    // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,
+    // fallback to a naive implementation.
+    var _callback = null;
+    var _timeoutID = null;
 
-  var maxYieldInterval = 300;
-  var needsPaint = false;
+    var _flushCallback = function () {
+      if (_callback !== null) {
+        try {
+          var currentTime = getCurrentTime();
+          var hasRemainingTime = true;
 
-  if (enableIsInputPending && navigator !== undefined && navigator.scheduling !== undefined && navigator.scheduling.isInputPending !== undefined) {
-    var scheduling = navigator.scheduling;
+          _callback(hasRemainingTime, currentTime);
 
-    shouldYieldToHost = function () {
-      var currentTime = getCurrentTime();
-
-      if (currentTime >= deadline) {
-        // There's no time left. We may want to yield control of the main
-        // thread, so the browser can perform high priority tasks. The main ones
-        // are painting and user input. If there's a pending paint or a pending
-        // input, then we should yield. But if there's neither, then we can
-        // yield less often while remaining responsive. We'll eventually yield
-        // regardless, since there could be a pending paint that wasn't
-        // accompanied by a call to `requestPaint`, or other main thread tasks
-        // like network events.
-        if (needsPaint || scheduling.isInputPending()) {
-          // There is either a pending paint or a pending input.
-          return true;
-        } // There's no pending input. Only yield if we've reached the max
-        // yield interval.
-
-
-        return currentTime >= maxYieldInterval;
+          _callback = null;
+        } catch (e) {
+          setTimeout(_flushCallback, 0);
+          throw e;
+        }
+      }
+    };
+
+    var initialTime = Date.now();
+
+    getCurrentTime = function () {
+      return Date.now() - initialTime;
+    };
+
+    requestHostCallback = function (cb) {
+      if (_callback !== null) {
+        // Protect against re-entrancy.
+        setTimeout(requestHostCallback, 0, cb);
       } else {
-        // There's still time left in the frame.
-        return false;
+        _callback = cb;
+        setTimeout(_flushCallback, 0);
       }
     };
 
-    requestPaint = function () {
-      needsPaint = true;
+    requestHostTimeout = function (cb, ms) {
+      _timeoutID = setTimeout(cb, ms);
     };
-  } else {
-    // `isInputPending` is not available. Since we have no way of knowing if
-    // there's pending input, always yield at the end of the frame.
+
+    cancelHostTimeout = function () {
+      clearTimeout(_timeoutID);
+    };
+
     shouldYieldToHost = function () {
-      return getCurrentTime() >= deadline;
-    }; // Since we yield every frame regardless, `requestPaint` has no effect.
+      return false;
+    };
 
+    requestPaint = forceFrameRate = function () {};
+  } else {
+    // Capture local references to native APIs, in case a polyfill overrides them.
+    var performance = window.performance;
+    var _Date = window.Date;
+    var _setTimeout = window.setTimeout;
+    var _clearTimeout = window.clearTimeout;
 
-    requestPaint = function () {};
-  }
+    if (typeof console !== 'undefined') {
+      // TODO: Scheduler no longer requires these methods to be polyfilled. But
+      // maybe we want to continue warning if they don't exist, to preserve the
+      // option to rely on it in the future?
+      var requestAnimationFrame = window.requestAnimationFrame;
+      var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link
+
+      if (typeof requestAnimationFrame !== 'function') {
+        // Using console['error'] to evade Babel and ESLint
+        console['error']("This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
+      }
 
-  forceFrameRate = function (fps) {
-    if (fps < 0 || fps > 125) {
-      console.error('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported');
-      return;
+      if (typeof cancelAnimationFrame !== 'function') {
+        // Using console['error'] to evade Babel and ESLint
+        console['error']("This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
+      }
     }
 
-    if (fps > 0) {
-      yieldInterval = Math.floor(1000 / fps);
+    if (typeof performance === 'object' && typeof performance.now === 'function') {
+      getCurrentTime = function () {
+        return performance.now();
+      };
     } else {
-      // reset the framerate
-      yieldInterval = 5;
+      var _initialTime = _Date.now();
+
+      getCurrentTime = function () {
+        return _Date.now() - _initialTime;
+      };
     }
-  };
 
-  var performWorkUntilDeadline = function () {
-    if (scheduledHostCallback !== null) {
-      var currentTime = getCurrentTime(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync
-      // cycle. This means there's always time remaining at the beginning of
-      // the message event.
+    var isMessageLoopRunning = false;
+    var scheduledHostCallback = null;
+    var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main
+    // thread, like user events. By default, it yields multiple times per frame.
+    // It does not attempt to align with frame boundaries, since most tasks don't
+    // need to be frame aligned; for those that do, use requestAnimationFrame.
 
-      deadline = currentTime + yieldInterval;
-      var hasTimeRemaining = true;
+    var yieldInterval = 5;
+    var deadline = 0; // TODO: Make this configurable
 
-      try {
-        var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime);
+    {
+      // `isInputPending` is not available. Since we have no way of knowing if
+      // there's pending input, always yield at the end of the frame.
+      shouldYieldToHost = function () {
+        return getCurrentTime() >= deadline;
+      }; // Since we yield every frame regardless, `requestPaint` has no effect.
 
-        if (!hasMoreWork) {
-          isMessageLoopRunning = false;
-          scheduledHostCallback = null;
-        } else {
-          // If there's more work, schedule the next message event at the end
-          // of the preceding one.
-          port.postMessage(null);
-        }
-      } catch (error) {
-        // If a scheduler task throws, exit the current browser task so the
-        // error can be observed.
-        port.postMessage(null);
-        throw error;
-      }
-    } else {
-      isMessageLoopRunning = false;
-    } // Yielding to the browser will give it a chance to paint, so we can
-    // reset this.
 
+      requestPaint = function () {};
+    }
 
-    needsPaint = false;
-  };
+    forceFrameRate = function (fps) {
+      if (fps < 0 || fps > 125) {
+        // Using console['error'] to evade Babel and ESLint
+        console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported');
+        return;
+      }
 
-  var channel = new MessageChannel();
-  var port = channel.port2;
-  channel.port1.onmessage = performWorkUntilDeadline;
+      if (fps > 0) {
+        yieldInterval = Math.floor(1000 / fps);
+      } else {
+        // reset the framerate
+        yieldInterval = 5;
+      }
+    };
 
-  requestHostCallback = function (callback) {
-    scheduledHostCallback = callback;
+    var performWorkUntilDeadline = function () {
+      if (scheduledHostCallback !== null) {
+        var currentTime = getCurrentTime(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync
+        // cycle. This means there's always time remaining at the beginning of
+        // the message event.
 
-    if (!isMessageLoopRunning) {
-      isMessageLoopRunning = true;
-      port.postMessage(null);
-    }
-  };
+        deadline = currentTime + yieldInterval;
+        var hasTimeRemaining = true;
 
-  requestHostTimeout = function (callback, ms) {
-    taskTimeoutID = _setTimeout(function () {
-      callback(getCurrentTime());
-    }, ms);
-  };
+        try {
+          var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime);
+
+          if (!hasMoreWork) {
+            isMessageLoopRunning = false;
+            scheduledHostCallback = null;
+          } else {
+            // If there's more work, schedule the next message event at the end
+            // of the preceding one.
+            port.postMessage(null);
+          }
+        } catch (error) {
+          // If a scheduler task throws, exit the current browser task so the
+          // error can be observed.
+          port.postMessage(null);
+          throw error;
+        }
+      } else {
+        isMessageLoopRunning = false;
+      } // Yielding to the browser will give it a chance to paint, so we can
+    };
 
-  cancelHostTimeout = function () {
-    _clearTimeout(taskTimeoutID);
+    var channel = new MessageChannel();
+    var port = channel.port2;
+    channel.port1.onmessage = performWorkUntilDeadline;
 
-    taskTimeoutID = -1;
-  };
-}
+    requestHostCallback = function (callback) {
+      scheduledHostCallback = callback;
 
-function push(heap, node) {
-  var index = heap.length;
-  heap.push(node);
-  siftUp(heap, node, index);
-}
-function peek(heap) {
-  var first = heap[0];
-  return first === undefined ? null : first;
-}
-function pop(heap) {
-  var first = heap[0];
+      if (!isMessageLoopRunning) {
+        isMessageLoopRunning = true;
+        port.postMessage(null);
+      }
+    };
 
-  if (first !== undefined) {
-    var last = heap.pop();
+    requestHostTimeout = function (callback, ms) {
+      taskTimeoutID = _setTimeout(function () {
+        callback(getCurrentTime());
+      }, ms);
+    };
 
-    if (last !== first) {
-      heap[0] = last;
-      siftDown(heap, last, 0);
-    }
+    cancelHostTimeout = function () {
+      _clearTimeout(taskTimeoutID);
 
-    return first;
-  } else {
-    return null;
+      taskTimeoutID = -1;
+    };
+  }
+
+  function push(heap, node) {
+    var index = heap.length;
+    heap.push(node);
+    siftUp(heap, node, index);
+  }
+  function peek(heap) {
+    var first = heap[0];
+    return first === undefined ? null : first;
   }
-}
+  function pop(heap) {
+    var first = heap[0];
 
-function siftUp(heap, node, i) {
-  var index = i;
+    if (first !== undefined) {
+      var last = heap.pop();
 
-  while (true) {
-    var parentIndex = Math.floor((index - 1) / 2);
-    var parent = heap[parentIndex];
+      if (last !== first) {
+        heap[0] = last;
+        siftDown(heap, last, 0);
+      }
 
-    if (parent !== undefined && compare(parent, node) > 0) {
-      // The parent is larger. Swap positions.
-      heap[parentIndex] = node;
-      heap[index] = parent;
-      index = parentIndex;
+      return first;
     } else {
-      // The parent is smaller. Exit.
-      return;
+      return null;
+    }
+  }
+
+  function siftUp(heap, node, i) {
+    var index = i;
+
+    while (true) {
+      var parentIndex = index - 1 >>> 1;
+      var parent = heap[parentIndex];
+
+      if (parent !== undefined && compare(parent, node) > 0) {
+        // The parent is larger. Swap positions.
+        heap[parentIndex] = node;
+        heap[index] = parent;
+        index = parentIndex;
+      } else {
+        // The parent is smaller. Exit.
+        return;
+      }
     }
   }
-}
 
-function siftDown(heap, node, i) {
-  var index = i;
-  var length = heap.length;
+  function siftDown(heap, node, i) {
+    var index = i;
+    var length = heap.length;
 
-  while (index < length) {
-    var leftIndex = (index + 1) * 2 - 1;
-    var left = heap[leftIndex];
-    var rightIndex = leftIndex + 1;
-    var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.
+    while (index < length) {
+      var leftIndex = (index + 1) * 2 - 1;
+      var left = heap[leftIndex];
+      var rightIndex = leftIndex + 1;
+      var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.
 
-    if (left !== undefined && compare(left, node) < 0) {
-      if (right !== undefined && compare(right, left) < 0) {
+      if (left !== undefined && compare(left, node) < 0) {
+        if (right !== undefined && compare(right, left) < 0) {
+          heap[index] = right;
+          heap[rightIndex] = node;
+          index = rightIndex;
+        } else {
+          heap[index] = left;
+          heap[leftIndex] = node;
+          index = leftIndex;
+        }
+      } else if (right !== undefined && compare(right, node) < 0) {
         heap[index] = right;
         heap[rightIndex] = node;
         index = rightIndex;
       } else {
-        heap[index] = left;
-        heap[leftIndex] = node;
-        index = leftIndex;
-      }
-    } else if (right !== undefined && compare(right, node) < 0) {
-      heap[index] = right;
-      heap[rightIndex] = node;
-      index = rightIndex;
-    } else {
-      // Neither child is smaller. Exit.
-      return;
-    }
-  }
-}
-
-function compare(a, b) {
-  // Compare sort index first, then task id.
-  var diff = a.sortIndex - b.sortIndex;
-  return diff !== 0 ? diff : a.id - b.id;
-}
-
-// TODO: Use symbols?
-var NoPriority = 0;
-var ImmediatePriority = 1;
-var UserBlockingPriority = 2;
-var NormalPriority = 3;
-var LowPriority = 4;
-var IdlePriority = 5;
-
-var runIdCounter = 0;
-var mainThreadIdCounter = 0;
-var profilingStateSize = 4;
-var sharedProfilingBuffer = enableProfiling ? // $FlowFixMe Flow doesn't know about SharedArrayBuffer
-typeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer
-typeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9
-: null;
-var profilingState = enableProfiling && sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks
-
-var PRIORITY = 0;
-var CURRENT_TASK_ID = 1;
-var CURRENT_RUN_ID = 2;
-var QUEUE_SIZE = 3;
-
-if (enableProfiling) {
-  profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue
-  // array might include canceled tasks.
-
-  profilingState[QUEUE_SIZE] = 0;
-  profilingState[CURRENT_TASK_ID] = 0;
-} // Bytes per element is 4
-
-
-var INITIAL_EVENT_LOG_SIZE = 131072;
-var MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes
-
-var eventLogSize = 0;
-var eventLogBuffer = null;
-var eventLog = null;
-var eventLogIndex = 0;
-var TaskStartEvent = 1;
-var TaskCompleteEvent = 2;
-var TaskErrorEvent = 3;
-var TaskCancelEvent = 4;
-var TaskRunEvent = 5;
-var TaskYieldEvent = 6;
-var SchedulerSuspendEvent = 7;
-var SchedulerResumeEvent = 8;
-
-function logEvent(entries) {
-  if (eventLog !== null) {
-    var offset = eventLogIndex;
-    eventLogIndex += entries.length;
-
-    if (eventLogIndex + 1 > eventLogSize) {
-      eventLogSize *= 2;
-
-      if (eventLogSize > MAX_EVENT_LOG_SIZE) {
-        console.error("Scheduler Profiling: Event log exceeded maximum size. Don't " + 'forget to call `stopLoggingProfilingEvents()`.');
-        stopLoggingProfilingEvents();
+        // Neither child is smaller. Exit.
         return;
       }
-
-      var newEventLog = new Int32Array(eventLogSize * 4);
-      newEventLog.set(eventLog);
-      eventLogBuffer = newEventLog.buffer;
-      eventLog = newEventLog;
     }
+  }
 
-    eventLog.set(entries, offset);
+  function compare(a, b) {
+    // Compare sort index first, then task id.
+    var diff = a.sortIndex - b.sortIndex;
+    return diff !== 0 ? diff : a.id - b.id;
   }
-}
 
-function startLoggingProfilingEvents() {
-  eventLogSize = INITIAL_EVENT_LOG_SIZE;
-  eventLogBuffer = new ArrayBuffer(eventLogSize * 4);
-  eventLog = new Int32Array(eventLogBuffer);
-  eventLogIndex = 0;
-}
-function stopLoggingProfilingEvents() {
-  var buffer = eventLogBuffer;
-  eventLogSize = 0;
-  eventLogBuffer = null;
-  eventLog = null;
-  eventLogIndex = 0;
-  return buffer;
-}
-function markTaskStart(task, ms) {
-  if (enableProfiling) {
-    profilingState[QUEUE_SIZE]++;
+  // TODO: Use symbols?
+  var NoPriority = 0;
+  var ImmediatePriority = 1;
+  var UserBlockingPriority = 2;
+  var NormalPriority = 3;
+  var LowPriority = 4;
+  var IdlePriority = 5;
 
-    if (eventLog !== null) {
-      // performance.now returns a float, representing milliseconds. When the
-      // event is logged, it's coerced to an int. Convert to microseconds to
-      // maintain extra degrees of precision.
-      logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);
-    }
-  }
-}
-function markTaskCompleted(task, ms) {
-  if (enableProfiling) {
-    profilingState[PRIORITY] = NoPriority;
-    profilingState[CURRENT_TASK_ID] = 0;
-    profilingState[QUEUE_SIZE]--;
+  var runIdCounter = 0;
+  var mainThreadIdCounter = 0;
+  var profilingStateSize = 4;
+  var sharedProfilingBuffer =  // $FlowFixMe Flow doesn't know about SharedArrayBuffer
+  typeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer
+  typeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9
+  ;
+  var profilingState =  sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks
+
+  var PRIORITY = 0;
+  var CURRENT_TASK_ID = 1;
+  var CURRENT_RUN_ID = 2;
+  var QUEUE_SIZE = 3;
+
+  {
+    profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue
+    // array might include canceled tasks.
 
+    profilingState[QUEUE_SIZE] = 0;
+    profilingState[CURRENT_TASK_ID] = 0;
+  } // Bytes per element is 4
+
+
+  var INITIAL_EVENT_LOG_SIZE = 131072;
+  var MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes
+
+  var eventLogSize = 0;
+  var eventLogBuffer = null;
+  var eventLog = null;
+  var eventLogIndex = 0;
+  var TaskStartEvent = 1;
+  var TaskCompleteEvent = 2;
+  var TaskErrorEvent = 3;
+  var TaskCancelEvent = 4;
+  var TaskRunEvent = 5;
+  var TaskYieldEvent = 6;
+  var SchedulerSuspendEvent = 7;
+  var SchedulerResumeEvent = 8;
+
+  function logEvent(entries) {
     if (eventLog !== null) {
-      logEvent([TaskCompleteEvent, ms * 1000, task.id]);
+      var offset = eventLogIndex;
+      eventLogIndex += entries.length;
+
+      if (eventLogIndex + 1 > eventLogSize) {
+        eventLogSize *= 2;
+
+        if (eventLogSize > MAX_EVENT_LOG_SIZE) {
+          // Using console['error'] to evade Babel and ESLint
+          console['error']("Scheduler Profiling: Event log exceeded maximum size. Don't " + 'forget to call `stopLoggingProfilingEvents()`.');
+          stopLoggingProfilingEvents();
+          return;
+        }
+
+        var newEventLog = new Int32Array(eventLogSize * 4);
+        newEventLog.set(eventLog);
+        eventLogBuffer = newEventLog.buffer;
+        eventLog = newEventLog;
+      }
+
+      eventLog.set(entries, offset);
     }
   }
-}
-function markTaskCanceled(task, ms) {
-  if (enableProfiling) {
-    profilingState[QUEUE_SIZE]--;
 
-    if (eventLog !== null) {
-      logEvent([TaskCancelEvent, ms * 1000, task.id]);
-    }
+  function startLoggingProfilingEvents() {
+    eventLogSize = INITIAL_EVENT_LOG_SIZE;
+    eventLogBuffer = new ArrayBuffer(eventLogSize * 4);
+    eventLog = new Int32Array(eventLogBuffer);
+    eventLogIndex = 0;
   }
-}
-function markTaskErrored(task, ms) {
-  if (enableProfiling) {
-    profilingState[PRIORITY] = NoPriority;
-    profilingState[CURRENT_TASK_ID] = 0;
-    profilingState[QUEUE_SIZE]--;
+  function stopLoggingProfilingEvents() {
+    var buffer = eventLogBuffer;
+    eventLogSize = 0;
+    eventLogBuffer = null;
+    eventLog = null;
+    eventLogIndex = 0;
+    return buffer;
+  }
+  function markTaskStart(task, ms) {
+    {
+      profilingState[QUEUE_SIZE]++;
 
-    if (eventLog !== null) {
-      logEvent([TaskErrorEvent, ms * 1000, task.id]);
+      if (eventLog !== null) {
+        // performance.now returns a float, representing milliseconds. When the
+        // event is logged, it's coerced to an int. Convert to microseconds to
+        // maintain extra degrees of precision.
+        logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);
+      }
     }
   }
-}
-function markTaskRun(task, ms) {
-  if (enableProfiling) {
-    runIdCounter++;
-    profilingState[PRIORITY] = task.priorityLevel;
-    profilingState[CURRENT_TASK_ID] = task.id;
-    profilingState[CURRENT_RUN_ID] = runIdCounter;
+  function markTaskCompleted(task, ms) {
+    {
+      profilingState[PRIORITY] = NoPriority;
+      profilingState[CURRENT_TASK_ID] = 0;
+      profilingState[QUEUE_SIZE]--;
 
-    if (eventLog !== null) {
-      logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);
+      if (eventLog !== null) {
+        logEvent([TaskCompleteEvent, ms * 1000, task.id]);
+      }
     }
   }
-}
-function markTaskYield(task, ms) {
-  if (enableProfiling) {
-    profilingState[PRIORITY] = NoPriority;
-    profilingState[CURRENT_TASK_ID] = 0;
-    profilingState[CURRENT_RUN_ID] = 0;
+  function markTaskCanceled(task, ms) {
+    {
+      profilingState[QUEUE_SIZE]--;
 
-    if (eventLog !== null) {
-      logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);
+      if (eventLog !== null) {
+        logEvent([TaskCancelEvent, ms * 1000, task.id]);
+      }
     }
   }
-}
-function markSchedulerSuspended(ms) {
-  if (enableProfiling) {
-    mainThreadIdCounter++;
+  function markTaskErrored(task, ms) {
+    {
+      profilingState[PRIORITY] = NoPriority;
+      profilingState[CURRENT_TASK_ID] = 0;
+      profilingState[QUEUE_SIZE]--;
 
-    if (eventLog !== null) {
-      logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);
+      if (eventLog !== null) {
+        logEvent([TaskErrorEvent, ms * 1000, task.id]);
+      }
     }
   }
-}
-function markSchedulerUnsuspended(ms) {
-  if (enableProfiling) {
-    if (eventLog !== null) {
-      logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);
+  function markTaskRun(task, ms) {
+    {
+      runIdCounter++;
+      profilingState[PRIORITY] = task.priorityLevel;
+      profilingState[CURRENT_TASK_ID] = task.id;
+      profilingState[CURRENT_RUN_ID] = runIdCounter;
+
+      if (eventLog !== null) {
+        logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);
+      }
     }
   }
-}
-
-/* eslint-disable no-var */
-// Math.pow(2, 30) - 1
-// 0b111111111111111111111111111111
-
-var maxSigned31BitInt = 1073741823; // Times out immediately
-
-var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out
-
-var USER_BLOCKING_PRIORITY = 250;
-var NORMAL_PRIORITY_TIMEOUT = 5000;
-var LOW_PRIORITY_TIMEOUT = 10000; // Never times out
-
-var IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap
-
-var taskQueue = [];
-var timerQueue = []; // Incrementing id counter. Used to maintain insertion order.
-
-var taskIdCounter = 1; // Pausing the scheduler is useful for debugging.
-
-var isSchedulerPaused = false;
-var currentTask = null;
-var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.
-
-var isPerformingWork = false;
-var isHostCallbackScheduled = false;
-var isHostTimeoutScheduled = false;
-
-function advanceTimers(currentTime) {
-  // Check for tasks that are no longer delayed and add them to the queue.
-  var timer = peek(timerQueue);
-
-  while (timer !== null) {
-    if (timer.callback === null) {
-      // Timer was cancelled.
-      pop(timerQueue);
-    } else if (timer.startTime <= currentTime) {
-      // Timer fired. Transfer to the task queue.
-      pop(timerQueue);
-      timer.sortIndex = timer.expirationTime;
-      push(taskQueue, timer);
+  function markTaskYield(task, ms) {
+    {
+      profilingState[PRIORITY] = NoPriority;
+      profilingState[CURRENT_TASK_ID] = 0;
+      profilingState[CURRENT_RUN_ID] = 0;
 
-      if (enableProfiling) {
-        markTaskStart(timer, currentTime);
-        timer.isQueued = true;
+      if (eventLog !== null) {
+        logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);
       }
-    } else {
-      // Remaining timers are pending.
-      return;
     }
-
-    timer = peek(timerQueue);
   }
-}
-
-function handleTimeout(currentTime) {
-  isHostTimeoutScheduled = false;
-  advanceTimers(currentTime);
-
-  if (!isHostCallbackScheduled) {
-    if (peek(taskQueue) !== null) {
-      isHostCallbackScheduled = true;
-      requestHostCallback(flushWork);
-    } else {
-      var firstTimer = peek(timerQueue);
+  function markSchedulerSuspended(ms) {
+    {
+      mainThreadIdCounter++;
 
-      if (firstTimer !== null) {
-        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
+      if (eventLog !== null) {
+        logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);
       }
     }
   }
-}
-
-function flushWork(hasTimeRemaining, initialTime) {
-  if (enableProfiling) {
-    markSchedulerUnsuspended(initialTime);
-  } // We'll need a host callback the next time work is scheduled.
-
-
-  isHostCallbackScheduled = false;
-
-  if (isHostTimeoutScheduled) {
-    // We scheduled a timeout but it's no longer needed. Cancel it.
-    isHostTimeoutScheduled = false;
-    cancelHostTimeout();
+  function markSchedulerUnsuspended(ms) {
+    {
+      if (eventLog !== null) {
+        logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);
+      }
+    }
   }
 
-  isPerformingWork = true;
-  var previousPriorityLevel = currentPriorityLevel;
+  /* eslint-disable no-var */
+  // Math.pow(2, 30) - 1
+  // 0b111111111111111111111111111111
 
-  try {
-    if (enableProfiling) {
-      try {
-        return workLoop(hasTimeRemaining, initialTime);
-      } catch (error) {
-        if (currentTask !== null) {
-          var currentTime = getCurrentTime();
-          markTaskErrored(currentTask, currentTime);
-          currentTask.isQueued = false;
-        }
+  var maxSigned31BitInt = 1073741823; // Times out immediately
 
-        throw error;
-      }
-    } else {
-      // No catch in prod codepath.
-      return workLoop(hasTimeRemaining, initialTime);
-    }
-  } finally {
-    currentTask = null;
-    currentPriorityLevel = previousPriorityLevel;
-    isPerformingWork = false;
+  var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out
 
-    if (enableProfiling) {
-      var _currentTime = getCurrentTime();
+  var USER_BLOCKING_PRIORITY = 250;
+  var NORMAL_PRIORITY_TIMEOUT = 5000;
+  var LOW_PRIORITY_TIMEOUT = 10000; // Never times out
 
-      markSchedulerSuspended(_currentTime);
-    }
-  }
-}
+  var IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap
 
-function workLoop(hasTimeRemaining, initialTime) {
-  var currentTime = initialTime;
-  advanceTimers(currentTime);
-  currentTask = peek(taskQueue);
+  var taskQueue = [];
+  var timerQueue = []; // Incrementing id counter. Used to maintain insertion order.
 
-  while (currentTask !== null && !(enableSchedulerDebugging && isSchedulerPaused)) {
-    if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {
-      // This currentTask hasn't expired, and we've reached the deadline.
-      break;
-    }
+  var taskIdCounter = 1; // Pausing the scheduler is useful for debugging.
+  var currentTask = null;
+  var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.
 
-    var callback = currentTask.callback;
+  var isPerformingWork = false;
+  var isHostCallbackScheduled = false;
+  var isHostTimeoutScheduled = false;
 
-    if (callback !== null) {
-      currentTask.callback = null;
-      currentPriorityLevel = currentTask.priorityLevel;
-      var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;
-      markTaskRun(currentTask, currentTime);
-      var continuationCallback = callback(didUserCallbackTimeout);
-      currentTime = getCurrentTime();
+  function advanceTimers(currentTime) {
+    // Check for tasks that are no longer delayed and add them to the queue.
+    var timer = peek(timerQueue);
 
-      if (typeof continuationCallback === 'function') {
-        currentTask.callback = continuationCallback;
-        markTaskYield(currentTask, currentTime);
-      } else {
-        if (enableProfiling) {
-          markTaskCompleted(currentTask, currentTime);
-          currentTask.isQueued = false;
-        }
+    while (timer !== null) {
+      if (timer.callback === null) {
+        // Timer was cancelled.
+        pop(timerQueue);
+      } else if (timer.startTime <= currentTime) {
+        // Timer fired. Transfer to the task queue.
+        pop(timerQueue);
+        timer.sortIndex = timer.expirationTime;
+        push(taskQueue, timer);
 
-        if (currentTask === peek(taskQueue)) {
-          pop(taskQueue);
+        {
+          markTaskStart(timer, currentTime);
+          timer.isQueued = true;
         }
+      } else {
+        // Remaining timers are pending.
+        return;
       }
 
-      advanceTimers(currentTime);
-    } else {
-      pop(taskQueue);
-    }
-
-    currentTask = peek(taskQueue);
-  } // Return whether there's additional work
-
-
-  if (currentTask !== null) {
-    return true;
-  } else {
-    var firstTimer = peek(timerQueue);
-
-    if (firstTimer !== null) {
-      requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
+      timer = peek(timerQueue);
     }
-
-    return false;
   }
-}
-
-function unstable_runWithPriority(priorityLevel, eventHandler) {
-  switch (priorityLevel) {
-    case ImmediatePriority:
-    case UserBlockingPriority:
-    case NormalPriority:
-    case LowPriority:
-    case IdlePriority:
-      break;
 
-    default:
-      priorityLevel = NormalPriority;
-  }
+  function handleTimeout(currentTime) {
+    isHostTimeoutScheduled = false;
+    advanceTimers(currentTime);
 
-  var previousPriorityLevel = currentPriorityLevel;
-  currentPriorityLevel = priorityLevel;
+    if (!isHostCallbackScheduled) {
+      if (peek(taskQueue) !== null) {
+        isHostCallbackScheduled = true;
+        requestHostCallback(flushWork);
+      } else {
+        var firstTimer = peek(timerQueue);
 
-  try {
-    return eventHandler();
-  } finally {
-    currentPriorityLevel = previousPriorityLevel;
+        if (firstTimer !== null) {
+          requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
+        }
+      }
+    }
   }
-}
 
-function unstable_next(eventHandler) {
-  var priorityLevel;
-
-  switch (currentPriorityLevel) {
-    case ImmediatePriority:
-    case UserBlockingPriority:
-    case NormalPriority:
-      // Shift down to normal priority
-      priorityLevel = NormalPriority;
-      break;
+  function flushWork(hasTimeRemaining, initialTime) {
+    {
+      markSchedulerUnsuspended(initialTime);
+    } // We'll need a host callback the next time work is scheduled.
 
-    default:
-      // Anything lower than normal priority should remain at the current level.
-      priorityLevel = currentPriorityLevel;
-      break;
-  }
 
-  var previousPriorityLevel = currentPriorityLevel;
-  currentPriorityLevel = priorityLevel;
+    isHostCallbackScheduled = false;
 
-  try {
-    return eventHandler();
-  } finally {
-    currentPriorityLevel = previousPriorityLevel;
-  }
-}
+    if (isHostTimeoutScheduled) {
+      // We scheduled a timeout but it's no longer needed. Cancel it.
+      isHostTimeoutScheduled = false;
+      cancelHostTimeout();
+    }
 
-function unstable_wrapCallback(callback) {
-  var parentPriorityLevel = currentPriorityLevel;
-  return function () {
-    // This is a fork of runWithPriority, inlined for performance.
+    isPerformingWork = true;
     var previousPriorityLevel = currentPriorityLevel;
-    currentPriorityLevel = parentPriorityLevel;
 
     try {
-      return callback.apply(this, arguments);
+      if (enableProfiling) {
+        try {
+          return workLoop(hasTimeRemaining, initialTime);
+        } catch (error) {
+          if (currentTask !== null) {
+            var currentTime = getCurrentTime();
+            markTaskErrored(currentTask, currentTime);
+            currentTask.isQueued = false;
+          }
+
+          throw error;
+        }
+      } else {
+        // No catch in prod codepath.
+        return workLoop(hasTimeRemaining, initialTime);
+      }
     } finally {
+      currentTask = null;
       currentPriorityLevel = previousPriorityLevel;
-    }
-  };
-}
-
-function timeoutForPriorityLevel(priorityLevel) {
-  switch (priorityLevel) {
-    case ImmediatePriority:
-      return IMMEDIATE_PRIORITY_TIMEOUT;
-
-    case UserBlockingPriority:
-      return USER_BLOCKING_PRIORITY;
-
-    case IdlePriority:
-      return IDLE_PRIORITY;
+      isPerformingWork = false;
 
-    case LowPriority:
-      return LOW_PRIORITY_TIMEOUT;
+      {
+        var _currentTime = getCurrentTime();
 
-    case NormalPriority:
-    default:
-      return NORMAL_PRIORITY_TIMEOUT;
+        markSchedulerSuspended(_currentTime);
+      }
+    }
   }
-}
 
-function unstable_scheduleCallback(priorityLevel, callback, options) {
-  var currentTime = getCurrentTime();
-  var startTime;
-  var timeout;
+  function workLoop(hasTimeRemaining, initialTime) {
+    var currentTime = initialTime;
+    advanceTimers(currentTime);
+    currentTask = peek(taskQueue);
 
-  if (typeof options === 'object' && options !== null) {
-    var delay = options.delay;
+    while (currentTask !== null && !(enableSchedulerDebugging )) {
+      if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {
+        // This currentTask hasn't expired, and we've reached the deadline.
+        break;
+      }
 
-    if (typeof delay === 'number' && delay > 0) {
-      startTime = currentTime + delay;
-    } else {
-      startTime = currentTime;
-    }
+      var callback = currentTask.callback;
 
-    timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);
-  } else {
-    timeout = timeoutForPriorityLevel(priorityLevel);
-    startTime = currentTime;
-  }
-
-  var expirationTime = startTime + timeout;
-  var newTask = {
-    id: taskIdCounter++,
-    callback: callback,
-    priorityLevel: priorityLevel,
-    startTime: startTime,
-    expirationTime: expirationTime,
-    sortIndex: -1
-  };
+      if (callback !== null) {
+        currentTask.callback = null;
+        currentPriorityLevel = currentTask.priorityLevel;
+        var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;
+        markTaskRun(currentTask, currentTime);
+        var continuationCallback = callback(didUserCallbackTimeout);
+        currentTime = getCurrentTime();
 
-  if (enableProfiling) {
-    newTask.isQueued = false;
-  }
+        if (typeof continuationCallback === 'function') {
+          currentTask.callback = continuationCallback;
+          markTaskYield(currentTask, currentTime);
+        } else {
+          {
+            markTaskCompleted(currentTask, currentTime);
+            currentTask.isQueued = false;
+          }
 
-  if (startTime > currentTime) {
-    // This is a delayed task.
-    newTask.sortIndex = startTime;
-    push(timerQueue, newTask);
+          if (currentTask === peek(taskQueue)) {
+            pop(taskQueue);
+          }
+        }
 
-    if (peek(taskQueue) === null && newTask === peek(timerQueue)) {
-      // All tasks are delayed, and this is the task with the earliest delay.
-      if (isHostTimeoutScheduled) {
-        // Cancel an existing timeout.
-        cancelHostTimeout();
+        advanceTimers(currentTime);
       } else {
-        isHostTimeoutScheduled = true;
-      } // Schedule a timeout.
+        pop(taskQueue);
+      }
 
+      currentTask = peek(taskQueue);
+    } // Return whether there's additional work
 
-      requestHostTimeout(handleTimeout, startTime - currentTime);
-    }
-  } else {
-    newTask.sortIndex = expirationTime;
-    push(taskQueue, newTask);
 
-    if (enableProfiling) {
-      markTaskStart(newTask, currentTime);
-      newTask.isQueued = true;
-    } // Schedule a host callback, if needed. If we're already performing work,
-    // wait until the next time we yield.
+    if (currentTask !== null) {
+      return true;
+    } else {
+      var firstTimer = peek(timerQueue);
 
+      if (firstTimer !== null) {
+        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
+      }
 
-    if (!isHostCallbackScheduled && !isPerformingWork) {
-      isHostCallbackScheduled = true;
-      requestHostCallback(flushWork);
+      return false;
     }
   }
 
-  return newTask;
-}
-
-function unstable_pauseExecution() {
-  isSchedulerPaused = true;
-}
-
-function unstable_continueExecution() {
-  isSchedulerPaused = false;
-
-  if (!isHostCallbackScheduled && !isPerformingWork) {
-    isHostCallbackScheduled = true;
-    requestHostCallback(flushWork);
-  }
-}
-
-function unstable_getFirstCallbackNode() {
-  return peek(taskQueue);
-}
+  function unstable_runWithPriority(priorityLevel, eventHandler) {
+    switch (priorityLevel) {
+      case ImmediatePriority:
+      case UserBlockingPriority:
+      case NormalPriority:
+      case LowPriority:
+      case IdlePriority:
+        break;
 
-function unstable_cancelCallback(task) {
-  if (enableProfiling) {
-    if (task.isQueued) {
-      var currentTime = getCurrentTime();
-      markTaskCanceled(task, currentTime);
-      task.isQueued = false;
+      default:
+        priorityLevel = NormalPriority;
     }
-  } // Null out the callback to indicate the task has been canceled. (Can't
-  // remove from the queue because you can't remove arbitrary nodes from an
-  // array based heap, only the first one.)
-
 
-  task.callback = null;
-}
+    var previousPriorityLevel = currentPriorityLevel;
+    currentPriorityLevel = priorityLevel;
 
-function unstable_getCurrentPriorityLevel() {
-  return currentPriorityLevel;
-}
+    try {
+      return eventHandler();
+    } finally {
+      currentPriorityLevel = previousPriorityLevel;
+    }
+  }
 
-function unstable_shouldYield() {
-  var currentTime = getCurrentTime();
-  advanceTimers(currentTime);
-  var firstTask = peek(taskQueue);
-  return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();
-}
+  function unstable_next(eventHandler) {
+    var priorityLevel;
 
-var unstable_requestPaint = requestPaint;
-var unstable_Profiling = enableProfiling ? {
-  startLoggingProfilingEvents: startLoggingProfilingEvents,
-  stopLoggingProfilingEvents: stopLoggingProfilingEvents,
-  sharedProfilingBuffer: sharedProfilingBuffer
-} : null;
+    switch (currentPriorityLevel) {
+      case ImmediatePriority:
+      case UserBlockingPriority:
+      case NormalPriority:
+        // Shift down to normal priority
+        priorityLevel = NormalPriority;
+        break;
 
+      default:
+        // Anything lower than normal priority should remain at the current level.
+        priorityLevel = currentPriorityLevel;
+        break;
+    }
 
+    var previousPriorityLevel = currentPriorityLevel;
+    currentPriorityLevel = priorityLevel;
 
-var Scheduler = Object.freeze({
-	unstable_ImmediatePriority: ImmediatePriority,
-	unstable_UserBlockingPriority: UserBlockingPriority,
-	unstable_NormalPriority: NormalPriority,
-	unstable_IdlePriority: IdlePriority,
-	unstable_LowPriority: LowPriority,
-	unstable_runWithPriority: unstable_runWithPriority,
-	unstable_next: unstable_next,
-	unstable_scheduleCallback: unstable_scheduleCallback,
-	unstable_cancelCallback: unstable_cancelCallback,
-	unstable_wrapCallback: unstable_wrapCallback,
-	unstable_getCurrentPriorityLevel: unstable_getCurrentPriorityLevel,
-	unstable_shouldYield: unstable_shouldYield,
-	unstable_requestPaint: unstable_requestPaint,
-	unstable_continueExecution: unstable_continueExecution,
-	unstable_pauseExecution: unstable_pauseExecution,
-	unstable_getFirstCallbackNode: unstable_getFirstCallbackNode,
-	get unstable_now () { return getCurrentTime; },
-	get unstable_forceFrameRate () { return forceFrameRate; },
-	unstable_Profiling: unstable_Profiling
-});
+    try {
+      return eventHandler();
+    } finally {
+      currentPriorityLevel = previousPriorityLevel;
+    }
+  }
 
-// Helps identify side effects in render-phase lifecycle hooks and setState
-// reducers by double invoking them in Strict Mode.
+  function unstable_wrapCallback(callback) {
+    var parentPriorityLevel = currentPriorityLevel;
+    return function () {
+      // This is a fork of runWithPriority, inlined for performance.
+      var previousPriorityLevel = currentPriorityLevel;
+      currentPriorityLevel = parentPriorityLevel;
 
- // To preserve the "Pause on caught exceptions" behavior of the debugger, we
-// replay the begin phase of a failed component inside invokeGuardedCallback.
+      try {
+        return callback.apply(this, arguments);
+      } finally {
+        currentPriorityLevel = previousPriorityLevel;
+      }
+    };
+  }
 
- // Warn about deprecated, async-unsafe lifecycles; relates to RFC #6:
+  function timeoutForPriorityLevel(priorityLevel) {
+    switch (priorityLevel) {
+      case ImmediatePriority:
+        return IMMEDIATE_PRIORITY_TIMEOUT;
 
- // Gather advanced timing metrics for Profiler subtrees.
+      case UserBlockingPriority:
+        return USER_BLOCKING_PRIORITY;
 
- // Trace which interactions trigger each commit.
+      case IdlePriority:
+        return IDLE_PRIORITY;
 
-var enableSchedulerTracing = true; // SSR experiments
+      case LowPriority:
+        return LOW_PRIORITY_TIMEOUT;
 
+      case NormalPriority:
+      default:
+        return NORMAL_PRIORITY_TIMEOUT;
+    }
+  }
 
- // Only used in www builds.
+  function unstable_scheduleCallback(priorityLevel, callback, options) {
+    var currentTime = getCurrentTime();
+    var startTime;
+    var timeout;
 
- // Only used in www builds.
+    if (typeof options === 'object' && options !== null) {
+      var delay = options.delay;
 
- // Disable javascript: URL strings in href for XSS protection.
+      if (typeof delay === 'number' && delay > 0) {
+        startTime = currentTime + delay;
+      } else {
+        startTime = currentTime;
+      }
 
- // React Fire: prevent the value and checked attributes from syncing
-// with their related DOM properties
+      timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);
+    } else {
+      timeout = timeoutForPriorityLevel(priorityLevel);
+      startTime = currentTime;
+    }
 
- // These APIs will no longer be "unstable" in the upcoming 16.7 release,
-// Control this behavior with a flag to support 16.6 minor releases in the meanwhile.
+    var expirationTime = startTime + timeout;
+    var newTask = {
+      id: taskIdCounter++,
+      callback: callback,
+      priorityLevel: priorityLevel,
+      startTime: startTime,
+      expirationTime: expirationTime,
+      sortIndex: -1
+    };
 
-var exposeConcurrentModeAPIs = false;
- // Experimental React Flare event system and event components support.
+    {
+      newTask.isQueued = false;
+    }
 
-var enableFlareAPI = false; // Experimental Host Component support.
+    if (startTime > currentTime) {
+      // This is a delayed task.
+      newTask.sortIndex = startTime;
+      push(timerQueue, newTask);
 
-var enableFundamentalAPI = false; // Experimental Scope support.
+      if (peek(taskQueue) === null && newTask === peek(timerQueue)) {
+        // All tasks are delayed, and this is the task with the earliest delay.
+        if (isHostTimeoutScheduled) {
+          // Cancel an existing timeout.
+          cancelHostTimeout();
+        } else {
+          isHostTimeoutScheduled = true;
+        } // Schedule a timeout.
 
-var enableScopeAPI = false; // New API for JSX transforms to target - https://github.com/reactjs/rfcs/pull/107
 
-var enableJSXTransformAPI = false; // We will enforce mocking scheduler with scheduler/unstable_mock at some point. (v17?)
-// Till then, we warn about the missing mock, but still fallback to a legacy mode compatible version
+        requestHostTimeout(handleTimeout, startTime - currentTime);
+      }
+    } else {
+      newTask.sortIndex = expirationTime;
+      push(taskQueue, newTask);
 
- // For tests, we flush suspense fallbacks in an act scope;
-// *except* in some of our own tests, where we test incremental loading states.
+      {
+        markTaskStart(newTask, currentTime);
+        newTask.isQueued = true;
+      } // Schedule a host callback, if needed. If we're already performing work,
+      // wait until the next time we yield.
 
- // Add a callback property to suspense to notify which promises are currently
-// in the update queue. This allows reporting and tracing of what is causing
-// the user to see a loading state.
-// Also allows hydration callbacks to fire when a dehydrated boundary gets
-// hydrated or deleted.
 
- // Part of the simplification of React.createElement so we can eventually move
-// from React.createElement to React.jsx
-// https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md
+      if (!isHostCallbackScheduled && !isPerformingWork) {
+        isHostCallbackScheduled = true;
+        requestHostCallback(flushWork);
+      }
+    }
 
+    return newTask;
+  }
 
+  function unstable_pauseExecution() {
+  }
 
+  function unstable_continueExecution() {
 
+    if (!isHostCallbackScheduled && !isPerformingWork) {
+      isHostCallbackScheduled = true;
+      requestHostCallback(flushWork);
+    }
+  }
 
- // Flag to turn event.target and event.currentTarget in ReactNative from a reactTag to a component instance
+  function unstable_getFirstCallbackNode() {
+    return peek(taskQueue);
+  }
 
-var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs.
+  function unstable_cancelCallback(task) {
+    {
+      if (task.isQueued) {
+        var currentTime = getCurrentTime();
+        markTaskCanceled(task, currentTime);
+        task.isQueued = false;
+      }
+    } // Null out the callback to indicate the task has been canceled. (Can't
+    // remove from the queue because you can't remove arbitrary nodes from an
+    // array based heap, only the first one.)
+
+
+    task.callback = null;
+  }
+
+  function unstable_getCurrentPriorityLevel() {
+    return currentPriorityLevel;
+  }
+
+  function unstable_shouldYield() {
+    var currentTime = getCurrentTime();
+    advanceTimers(currentTime);
+    var firstTask = peek(taskQueue);
+    return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();
+  }
+
+  var unstable_requestPaint = requestPaint;
+  var unstable_Profiling =  {
+    startLoggingProfilingEvents: startLoggingProfilingEvents,
+    stopLoggingProfilingEvents: stopLoggingProfilingEvents,
+    sharedProfilingBuffer: sharedProfilingBuffer
+  } ;
+
+
+
+  var Scheduler = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    unstable_ImmediatePriority: ImmediatePriority,
+    unstable_UserBlockingPriority: UserBlockingPriority,
+    unstable_NormalPriority: NormalPriority,
+    unstable_IdlePriority: IdlePriority,
+    unstable_LowPriority: LowPriority,
+    unstable_runWithPriority: unstable_runWithPriority,
+    unstable_next: unstable_next,
+    unstable_scheduleCallback: unstable_scheduleCallback,
+    unstable_cancelCallback: unstable_cancelCallback,
+    unstable_wrapCallback: unstable_wrapCallback,
+    unstable_getCurrentPriorityLevel: unstable_getCurrentPriorityLevel,
+    unstable_shouldYield: unstable_shouldYield,
+    unstable_requestPaint: unstable_requestPaint,
+    unstable_continueExecution: unstable_continueExecution,
+    unstable_pauseExecution: unstable_pauseExecution,
+    unstable_getFirstCallbackNode: unstable_getFirstCallbackNode,
+    get unstable_now () { return getCurrentTime; },
+    get unstable_forceFrameRate () { return forceFrameRate; },
+    unstable_Profiling: unstable_Profiling
+  });
 
-var interactionIDCounter = 0;
-var threadIDCounter = 0; // Set of currently traced interactions.
-// Interactions "stack"–
-// Meaning that newly traced interactions are appended to the previously active set.
-// When an interaction goes out of scope, the previous set (if any) is restored.
+  var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs.
 
-var interactionsRef = null; // Listener(s) to notify when interactions begin and end.
+  var interactionIDCounter = 0;
+  var threadIDCounter = 0; // Set of currently traced interactions.
+  // Interactions "stack"–
+  // Meaning that newly traced interactions are appended to the previously active set.
+  // When an interaction goes out of scope, the previous set (if any) is restored.
 
-var subscriberRef = null;
+  var interactionsRef = null; // Listener(s) to notify when interactions begin and end.
 
-if (enableSchedulerTracing) {
-  interactionsRef = {
-    current: new Set()
-  };
-  subscriberRef = {
-    current: null
-  };
-}
+  var subscriberRef = null;
 
-function unstable_clear(callback) {
-  if (!enableSchedulerTracing) {
-    return callback();
+  {
+    interactionsRef = {
+      current: new Set()
+    };
+    subscriberRef = {
+      current: null
+    };
   }
+  function unstable_clear(callback) {
 
-  var prevInteractions = interactionsRef.current;
-  interactionsRef.current = new Set();
+    var prevInteractions = interactionsRef.current;
+    interactionsRef.current = new Set();
 
-  try {
-    return callback();
-  } finally {
-    interactionsRef.current = prevInteractions;
+    try {
+      return callback();
+    } finally {
+      interactionsRef.current = prevInteractions;
+    }
   }
-}
-function unstable_getCurrent() {
-  if (!enableSchedulerTracing) {
-    return null;
-  } else {
-    return interactionsRef.current;
+  function unstable_getCurrent() {
+    {
+      return interactionsRef.current;
+    }
   }
-}
-function unstable_getThreadID() {
-  return ++threadIDCounter;
-}
-function unstable_trace(name, timestamp, callback) {
-  var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;
-
-  if (!enableSchedulerTracing) {
-    return callback();
+  function unstable_getThreadID() {
+    return ++threadIDCounter;
   }
+  function unstable_trace(name, timestamp, callback) {
+    var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;
 
-  var interaction = {
-    __count: 1,
-    id: interactionIDCounter++,
-    name: name,
-    timestamp: timestamp
-  };
-  var prevInteractions = interactionsRef.current; // Traced interactions should stack/accumulate.
-  // To do that, clone the current interactions.
-  // The previous set will be restored upon completion.
+    var interaction = {
+      __count: 1,
+      id: interactionIDCounter++,
+      name: name,
+      timestamp: timestamp
+    };
+    var prevInteractions = interactionsRef.current; // Traced interactions should stack/accumulate.
+    // To do that, clone the current interactions.
+    // The previous set will be restored upon completion.
 
-  var interactions = new Set(prevInteractions);
-  interactions.add(interaction);
-  interactionsRef.current = interactions;
-  var subscriber = subscriberRef.current;
-  var returnValue;
+    var interactions = new Set(prevInteractions);
+    interactions.add(interaction);
+    interactionsRef.current = interactions;
+    var subscriber = subscriberRef.current;
+    var returnValue;
 
-  try {
-    if (subscriber !== null) {
-      subscriber.onInteractionTraced(interaction);
-    }
-  } finally {
     try {
       if (subscriber !== null) {
-        subscriber.onWorkStarted(interactions, threadID);
+        subscriber.onInteractionTraced(interaction);
       }
     } finally {
       try {
-        returnValue = callback();
+        if (subscriber !== null) {
+          subscriber.onWorkStarted(interactions, threadID);
+        }
       } finally {
-        interactionsRef.current = prevInteractions;
-
         try {
-          if (subscriber !== null) {
-            subscriber.onWorkStopped(interactions, threadID);
-          }
+          returnValue = callback();
         } finally {
-          interaction.__count--; // If no async work was scheduled for this interaction,
-          // Notify subscribers that it's completed.
+          interactionsRef.current = prevInteractions;
 
-          if (subscriber !== null && interaction.__count === 0) {
-            subscriber.onInteractionScheduledWorkCompleted(interaction);
+          try {
+            if (subscriber !== null) {
+              subscriber.onWorkStopped(interactions, threadID);
+            }
+          } finally {
+            interaction.__count--; // If no async work was scheduled for this interaction,
+            // Notify subscribers that it's completed.
+
+            if (subscriber !== null && interaction.__count === 0) {
+              subscriber.onInteractionScheduledWorkCompleted(interaction);
+            }
           }
         }
       }
     }
-  }
 
-  return returnValue;
-}
-function unstable_wrap(callback) {
-  var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;
-
-  if (!enableSchedulerTracing) {
-    return callback;
+    return returnValue;
   }
+  function unstable_wrap(callback) {
+    var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;
 
-  var wrappedInteractions = interactionsRef.current;
-  var subscriber = subscriberRef.current;
-
-  if (subscriber !== null) {
-    subscriber.onWorkScheduled(wrappedInteractions, threadID);
-  } // Update the pending async work count for the current interactions.
-  // Update after calling subscribers in case of error.
+    var wrappedInteractions = interactionsRef.current;
+    var subscriber = subscriberRef.current;
 
+    if (subscriber !== null) {
+      subscriber.onWorkScheduled(wrappedInteractions, threadID);
+    } // Update the pending async work count for the current interactions.
+    // Update after calling subscribers in case of error.
 
-  wrappedInteractions.forEach(function (interaction) {
-    interaction.__count++;
-  });
-  var hasRun = false;
 
-  function wrapped() {
-    var prevInteractions = interactionsRef.current;
-    interactionsRef.current = wrappedInteractions;
-    subscriber = subscriberRef.current;
+    wrappedInteractions.forEach(function (interaction) {
+      interaction.__count++;
+    });
+    var hasRun = false;
 
-    try {
-      var returnValue;
+    function wrapped() {
+      var prevInteractions = interactionsRef.current;
+      interactionsRef.current = wrappedInteractions;
+      subscriber = subscriberRef.current;
 
       try {
-        if (subscriber !== null) {
-          subscriber.onWorkStarted(wrappedInteractions, threadID);
-        }
-      } finally {
-        try {
-          returnValue = callback.apply(undefined, arguments);
-        } finally {
-          interactionsRef.current = prevInteractions;
+        var returnValue;
 
+        try {
           if (subscriber !== null) {
-            subscriber.onWorkStopped(wrappedInteractions, threadID);
+            subscriber.onWorkStarted(wrappedInteractions, threadID);
           }
+        } finally {
+          try {
+            returnValue = callback.apply(undefined, arguments);
+          } finally {
+            interactionsRef.current = prevInteractions;
+
+            if (subscriber !== null) {
+              subscriber.onWorkStopped(wrappedInteractions, threadID);
+            }
+          }
+        }
+
+        return returnValue;
+      } finally {
+        if (!hasRun) {
+          // We only expect a wrapped function to be executed once,
+          // But in the event that it's executed more than once–
+          // Only decrement the outstanding interaction counts once.
+          hasRun = true; // Update pending async counts for all wrapped interactions.
+          // If this was the last scheduled async work for any of them,
+          // Mark them as completed.
+
+          wrappedInteractions.forEach(function (interaction) {
+            interaction.__count--;
+
+            if (subscriber !== null && interaction.__count === 0) {
+              subscriber.onInteractionScheduledWorkCompleted(interaction);
+            }
+          });
         }
       }
+    }
 
-      return returnValue;
-    } finally {
-      if (!hasRun) {
-        // We only expect a wrapped function to be executed once,
-        // But in the event that it's executed more than once–
-        // Only decrement the outstanding interaction counts once.
-        hasRun = true; // Update pending async counts for all wrapped interactions.
+    wrapped.cancel = function cancel() {
+      subscriber = subscriberRef.current;
+
+      try {
+        if (subscriber !== null) {
+          subscriber.onWorkCanceled(wrappedInteractions, threadID);
+        }
+      } finally {
+        // Update pending async counts for all wrapped interactions.
         // If this was the last scheduled async work for any of them,
         // Mark them as completed.
-
         wrappedInteractions.forEach(function (interaction) {
           interaction.__count--;
 
-          if (subscriber !== null && interaction.__count === 0) {
+          if (subscriber && interaction.__count === 0) {
             subscriber.onInteractionScheduledWorkCompleted(interaction);
           }
         });
       }
-    }
-  }
-
-  wrapped.cancel = function cancel() {
-    subscriber = subscriberRef.current;
-
-    try {
-      if (subscriber !== null) {
-        subscriber.onWorkCanceled(wrappedInteractions, threadID);
-      }
-    } finally {
-      // Update pending async counts for all wrapped interactions.
-      // If this was the last scheduled async work for any of them,
-      // Mark them as completed.
-      wrappedInteractions.forEach(function (interaction) {
-        interaction.__count--;
-
-        if (subscriber && interaction.__count === 0) {
-          subscriber.onInteractionScheduledWorkCompleted(interaction);
-        }
-      });
-    }
-  };
-
-  return wrapped;
-}
-
-var subscribers = null;
+    };
 
-if (enableSchedulerTracing) {
-  subscribers = new Set();
-}
+    return wrapped;
+  }
 
-function unstable_subscribe(subscriber) {
-  if (enableSchedulerTracing) {
-    subscribers.add(subscriber);
+  var subscribers = null;
 
-    if (subscribers.size === 1) {
-      subscriberRef.current = {
-        onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,
-        onInteractionTraced: onInteractionTraced,
-        onWorkCanceled: onWorkCanceled,
-        onWorkScheduled: onWorkScheduled,
-        onWorkStarted: onWorkStarted,
-        onWorkStopped: onWorkStopped
-      };
-    }
+  {
+    subscribers = new Set();
   }
-}
-function unstable_unsubscribe(subscriber) {
-  if (enableSchedulerTracing) {
-    subscribers.delete(subscriber);
 
-    if (subscribers.size === 0) {
-      subscriberRef.current = null;
+  function unstable_subscribe(subscriber) {
+    {
+      subscribers.add(subscriber);
+
+      if (subscribers.size === 1) {
+        subscriberRef.current = {
+          onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,
+          onInteractionTraced: onInteractionTraced,
+          onWorkCanceled: onWorkCanceled,
+          onWorkScheduled: onWorkScheduled,
+          onWorkStarted: onWorkStarted,
+          onWorkStopped: onWorkStopped
+        };
+      }
     }
   }
-}
+  function unstable_unsubscribe(subscriber) {
+    {
+      subscribers.delete(subscriber);
 
-function onInteractionTraced(interaction) {
-  var didCatchError = false;
-  var caughtError = null;
-  subscribers.forEach(function (subscriber) {
-    try {
-      subscriber.onInteractionTraced(interaction);
-    } catch (error) {
-      if (!didCatchError) {
-        didCatchError = true;
-        caughtError = error;
+      if (subscribers.size === 0) {
+        subscriberRef.current = null;
       }
     }
-  });
-
-  if (didCatchError) {
-    throw caughtError;
   }
-}
 
-function onInteractionScheduledWorkCompleted(interaction) {
-  var didCatchError = false;
-  var caughtError = null;
-  subscribers.forEach(function (subscriber) {
-    try {
-      subscriber.onInteractionScheduledWorkCompleted(interaction);
-    } catch (error) {
-      if (!didCatchError) {
-        didCatchError = true;
-        caughtError = error;
+  function onInteractionTraced(interaction) {
+    var didCatchError = false;
+    var caughtError = null;
+    subscribers.forEach(function (subscriber) {
+      try {
+        subscriber.onInteractionTraced(interaction);
+      } catch (error) {
+        if (!didCatchError) {
+          didCatchError = true;
+          caughtError = error;
+        }
       }
-    }
-  });
+    });
 
-  if (didCatchError) {
-    throw caughtError;
+    if (didCatchError) {
+      throw caughtError;
+    }
   }
-}
 
-function onWorkScheduled(interactions, threadID) {
-  var didCatchError = false;
-  var caughtError = null;
-  subscribers.forEach(function (subscriber) {
-    try {
-      subscriber.onWorkScheduled(interactions, threadID);
-    } catch (error) {
-      if (!didCatchError) {
-        didCatchError = true;
-        caughtError = error;
+  function onInteractionScheduledWorkCompleted(interaction) {
+    var didCatchError = false;
+    var caughtError = null;
+    subscribers.forEach(function (subscriber) {
+      try {
+        subscriber.onInteractionScheduledWorkCompleted(interaction);
+      } catch (error) {
+        if (!didCatchError) {
+          didCatchError = true;
+          caughtError = error;
+        }
       }
-    }
-  });
+    });
 
-  if (didCatchError) {
-    throw caughtError;
+    if (didCatchError) {
+      throw caughtError;
+    }
   }
-}
 
-function onWorkStarted(interactions, threadID) {
-  var didCatchError = false;
-  var caughtError = null;
-  subscribers.forEach(function (subscriber) {
-    try {
-      subscriber.onWorkStarted(interactions, threadID);
-    } catch (error) {
-      if (!didCatchError) {
-        didCatchError = true;
-        caughtError = error;
+  function onWorkScheduled(interactions, threadID) {
+    var didCatchError = false;
+    var caughtError = null;
+    subscribers.forEach(function (subscriber) {
+      try {
+        subscriber.onWorkScheduled(interactions, threadID);
+      } catch (error) {
+        if (!didCatchError) {
+          didCatchError = true;
+          caughtError = error;
+        }
       }
-    }
-  });
+    });
 
-  if (didCatchError) {
-    throw caughtError;
+    if (didCatchError) {
+      throw caughtError;
+    }
   }
-}
 
-function onWorkStopped(interactions, threadID) {
-  var didCatchError = false;
-  var caughtError = null;
-  subscribers.forEach(function (subscriber) {
-    try {
-      subscriber.onWorkStopped(interactions, threadID);
-    } catch (error) {
-      if (!didCatchError) {
-        didCatchError = true;
-        caughtError = error;
+  function onWorkStarted(interactions, threadID) {
+    var didCatchError = false;
+    var caughtError = null;
+    subscribers.forEach(function (subscriber) {
+      try {
+        subscriber.onWorkStarted(interactions, threadID);
+      } catch (error) {
+        if (!didCatchError) {
+          didCatchError = true;
+          caughtError = error;
+        }
       }
-    }
-  });
+    });
 
-  if (didCatchError) {
-    throw caughtError;
+    if (didCatchError) {
+      throw caughtError;
+    }
   }
-}
 
-function onWorkCanceled(interactions, threadID) {
-  var didCatchError = false;
-  var caughtError = null;
-  subscribers.forEach(function (subscriber) {
-    try {
-      subscriber.onWorkCanceled(interactions, threadID);
-    } catch (error) {
-      if (!didCatchError) {
-        didCatchError = true;
-        caughtError = error;
+  function onWorkStopped(interactions, threadID) {
+    var didCatchError = false;
+    var caughtError = null;
+    subscribers.forEach(function (subscriber) {
+      try {
+        subscriber.onWorkStopped(interactions, threadID);
+      } catch (error) {
+        if (!didCatchError) {
+          didCatchError = true;
+          caughtError = error;
+        }
       }
+    });
+
+    if (didCatchError) {
+      throw caughtError;
     }
-  });
+  }
 
-  if (didCatchError) {
-    throw caughtError;
-  }
-}
-
-
-
-var SchedulerTracing = Object.freeze({
-	get __interactionsRef () { return interactionsRef; },
-	get __subscriberRef () { return subscriberRef; },
-	unstable_clear: unstable_clear,
-	unstable_getCurrent: unstable_getCurrent,
-	unstable_getThreadID: unstable_getThreadID,
-	unstable_trace: unstable_trace,
-	unstable_wrap: unstable_wrap,
-	unstable_subscribe: unstable_subscribe,
-	unstable_unsubscribe: unstable_unsubscribe
-});
-
-var ReactSharedInternals$2 = {
-  ReactCurrentDispatcher: ReactCurrentDispatcher,
-  ReactCurrentOwner: ReactCurrentOwner,
-  IsSomeRendererActing: IsSomeRendererActing,
-  // Used by renderers to avoid bundling object-assign twice in UMD bundles:
-  assign: objectAssign
-};
-
-{
-  objectAssign(ReactSharedInternals$2, {
-    // These should not be included in production.
-    ReactDebugCurrentFrame: ReactDebugCurrentFrame,
-    // Shim for React DOM 16.0.0 which still destructured (but not used) this.
-    // TODO: remove in React 17.0.
-    ReactComponentTreeHook: {}
-  });
-} // Re-export the schedule API(s) for UMD bundles.
-// This avoids introducing a dependency on a new UMD global in a minor update,
-// Since that would be a breaking change (e.g. for all existing CodeSandboxes).
-// This re-export is only required for UMD bundles;
-// CJS bundles use the shared NPM package.
+  function onWorkCanceled(interactions, threadID) {
+    var didCatchError = false;
+    var caughtError = null;
+    subscribers.forEach(function (subscriber) {
+      try {
+        subscriber.onWorkCanceled(interactions, threadID);
+      } catch (error) {
+        if (!didCatchError) {
+          didCatchError = true;
+          caughtError = error;
+        }
+      }
+    });
 
+    if (didCatchError) {
+      throw caughtError;
+    }
+  }
 
-objectAssign(ReactSharedInternals$2, {
-  Scheduler: Scheduler,
-  SchedulerTracing: SchedulerTracing
-});
 
-var hasBadMapPolyfill;
 
-{
-  hasBadMapPolyfill = false;
+  var SchedulerTracing = /*#__PURE__*/Object.freeze({
+    __proto__: null,
+    get __interactionsRef () { return interactionsRef; },
+    get __subscriberRef () { return subscriberRef; },
+    unstable_clear: unstable_clear,
+    unstable_getCurrent: unstable_getCurrent,
+    unstable_getThreadID: unstable_getThreadID,
+    unstable_trace: unstable_trace,
+    unstable_wrap: unstable_wrap,
+    unstable_subscribe: unstable_subscribe,
+    unstable_unsubscribe: unstable_unsubscribe
+  });
 
-  try {
-    var frozenObject = Object.freeze({});
-    var testMap = new Map([[frozenObject, null]]);
-    var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused.
-    // https://github.com/rollup/rollup/issues/1771
-    // TODO: we can remove these if Rollup fixes the bug.
+  var ReactSharedInternals$1 = {
+    ReactCurrentDispatcher: ReactCurrentDispatcher,
+    ReactCurrentOwner: ReactCurrentOwner,
+    IsSomeRendererActing: IsSomeRendererActing,
+    // Used by renderers to avoid bundling object-assign twice in UMD bundles:
+    assign: objectAssign
+  };
 
-    testMap.set(0, 0);
-    testSet.add(0);
-  } catch (e) {
-    // TODO: Consider warning about bad polyfills
-    hasBadMapPolyfill = true;
-  }
-}
+  {
+    objectAssign(ReactSharedInternals$1, {
+      // These should not be included in production.
+      ReactDebugCurrentFrame: ReactDebugCurrentFrame,
+      // Shim for React DOM 16.0.0 which still destructured (but not used) this.
+      // TODO: remove in React 17.0.
+      ReactComponentTreeHook: {}
+    });
+  } // Re-export the schedule API(s) for UMD bundles.
+  // This avoids introducing a dependency on a new UMD global in a minor update,
+  // Since that would be a breaking change (e.g. for all existing CodeSandboxes).
+  // This re-export is only required for UMD bundles;
+  // CJS bundles use the shared NPM package.
 
-function createFundamentalComponent(impl) {
-  // We use responder as a Map key later on. When we have a bad
-  // polyfill, then we can't use it as a key as the polyfill tries
-  // to add a property to the object.
-  if (true && !hasBadMapPolyfill) {
-    Object.freeze(impl);
-  }
 
-  var fundamantalComponent = {
-    $$typeof: REACT_FUNDAMENTAL_TYPE,
-    impl: impl
-  };
+  objectAssign(ReactSharedInternals$1, {
+    Scheduler: Scheduler,
+    SchedulerTracing: SchedulerTracing
+  });
 
   {
-    Object.freeze(fundamantalComponent);
-  }
-
-  return fundamantalComponent;
-}
-
-function createEventResponder(displayName, responderConfig) {
-  var getInitialState = responderConfig.getInitialState,
-      onEvent = responderConfig.onEvent,
-      onMount = responderConfig.onMount,
-      onUnmount = responderConfig.onUnmount,
-      onRootEvent = responderConfig.onRootEvent,
-      rootEventTypes = responderConfig.rootEventTypes,
-      targetEventTypes = responderConfig.targetEventTypes,
-      targetPortalPropagation = responderConfig.targetPortalPropagation;
-  var eventResponder = {
-    $$typeof: REACT_RESPONDER_TYPE,
-    displayName: displayName,
-    getInitialState: getInitialState || null,
-    onEvent: onEvent || null,
-    onMount: onMount || null,
-    onRootEvent: onRootEvent || null,
-    onUnmount: onUnmount || null,
-    rootEventTypes: rootEventTypes || null,
-    targetEventTypes: targetEventTypes || null,
-    targetPortalPropagation: targetPortalPropagation || false
-  }; // We use responder as a Map key later on. When we have a bad
-  // polyfill, then we can't use it as a key as the polyfill tries
-  // to add a property to the object.
-
-  if (true && !hasBadMapPolyfill) {
-    Object.freeze(eventResponder);
-  }
-
-  return eventResponder;
-}
-
-function createScope() {
-  var scopeComponent = {
-    $$typeof: REACT_SCOPE_TYPE
-  };
 
-  {
-    Object.freeze(scopeComponent);
-  }
+    try {
+      var frozenObject = Object.freeze({});
+      var testMap = new Map([[frozenObject, null]]);
+      var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused.
+      // https://github.com/rollup/rollup/issues/1771
+      // TODO: we can remove these if Rollup fixes the bug.
 
-  return scopeComponent;
-}
+      testMap.set(0, 0);
+      testSet.add(0);
+    } catch (e) {
+    }
+  }
 
-var React = {
-  Children: {
+  var createElement$1 =  createElementWithValidation ;
+  var cloneElement$1 =  cloneElementWithValidation ;
+  var createFactory =  createFactoryWithValidation ;
+  var Children = {
     map: mapChildren,
     forEach: forEachChildren,
     count: countChildren,
     toArray: toArray,
     only: onlyChild
-  },
-  createRef: createRef,
-  Component: Component,
-  PureComponent: PureComponent,
-  createContext: createContext,
-  forwardRef: forwardRef,
-  lazy: lazy,
-  memo: memo,
-  useCallback: useCallback,
-  useContext: useContext,
-  useEffect: useEffect,
-  useImperativeHandle: useImperativeHandle,
-  useDebugValue: useDebugValue,
-  useLayoutEffect: useLayoutEffect,
-  useMemo: useMemo,
-  useReducer: useReducer,
-  useRef: useRef,
-  useState: useState,
-  Fragment: REACT_FRAGMENT_TYPE,
-  Profiler: REACT_PROFILER_TYPE,
-  StrictMode: REACT_STRICT_MODE_TYPE,
-  Suspense: REACT_SUSPENSE_TYPE,
-  createElement: createElementWithValidation,
-  cloneElement: cloneElementWithValidation,
-  createFactory: createFactoryWithValidation,
-  isValidElement: isValidElement,
-  version: ReactVersion,
-  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: ReactSharedInternals$2
-};
-
-if (exposeConcurrentModeAPIs) {
-  React.useTransition = useTransition;
-  React.useDeferredValue = useDeferredValue;
-  React.SuspenseList = REACT_SUSPENSE_LIST_TYPE;
-  React.unstable_withSuspenseConfig = withSuspenseConfig;
-}
-
-if (enableFlareAPI) {
-  React.unstable_useResponder = useResponder;
-  React.unstable_createResponder = createEventResponder;
-}
-
-if (enableFundamentalAPI) {
-  React.unstable_createFundamental = createFundamentalComponent;
-}
-
-if (enableScopeAPI) {
-  React.unstable_createScope = createScope;
-} // Note: some APIs are added with feature flags.
-// Make sure that stable builds for open source
-// don't modify the React object to avoid deopts.
-// Also let's not expose their names in stable builds.
-
-
-if (enableJSXTransformAPI) {
-  {
-    React.jsxDEV = jsxWithValidation;
-    React.jsx = jsxWithValidationDynamic;
-    React.jsxs = jsxWithValidationStatic;
-  }
-}
-
-
-
-var React$2 = Object.freeze({
-	default: React
-});
-
-var React$3 = ( React$2 && React ) || React$2;
-
-// TODO: decide on the top-level export form.
-// This is hacky but makes it work with both Rollup and Jest.
-
-
-var react = React$3.default || React$3;
+  };
 
-return react;
+  exports.Children = Children;
+  exports.Component = Component;
+  exports.Fragment = REACT_FRAGMENT_TYPE;
+  exports.Profiler = REACT_PROFILER_TYPE;
+  exports.PureComponent = PureComponent;
+  exports.StrictMode = REACT_STRICT_MODE_TYPE;
+  exports.Suspense = REACT_SUSPENSE_TYPE;
+  exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals$1;
+  exports.cloneElement = cloneElement$1;
+  exports.createContext = createContext;
+  exports.createElement = createElement$1;
+  exports.createFactory = createFactory;
+  exports.createRef = createRef;
+  exports.forwardRef = forwardRef;
+  exports.isValidElement = isValidElement;
+  exports.lazy = lazy;
+  exports.memo = memo;
+  exports.useCallback = useCallback;
+  exports.useContext = useContext;
+  exports.useDebugValue = useDebugValue;
+  exports.useEffect = useEffect;
+  exports.useImperativeHandle = useImperativeHandle;
+  exports.useLayoutEffect = useLayoutEffect;
+  exports.useMemo = useMemo;
+  exports.useReducer = useReducer;
+  exports.useRef = useRef;
+  exports.useState = useState;
+  exports.version = ReactVersion;
 
 })));
diff --git a/browser/components/newtab/vendor/react-dom-dev.js b/browser/components/newtab/vendor/react-dom-dev.js
index a484d1d9d2ad..2bc860246f88 100644
--- a/browser/components/newtab/vendor/react-dom-dev.js
+++ b/browser/components/newtab/vendor/react-dom-dev.js
@@ -1,4 +1,4 @@
-/** @license React v16.12.0
+/** @license React v16.13.1
  * react-dom.development.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -10,24394 +10,21869 @@
 'use strict';
 
 (function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react')) :
-	typeof define === 'function' && define.amd ? define(['react'], factory) :
-	(global.ReactDOM = factory(global.React));
-}(this, (function (React) { 'use strict';
-
-// Do not require this module directly! Use normal `invariant` calls with
-// template literal strings. The messages will be replaced with error codes
-// during build.
-
-/**
- * Use invariant() to assert state which your program assumes to be true.
- *
- * Provide sprintf-style format (only %s is supported) and arguments
- * to provide information about what broke and what you were
- * expecting.
- *
- * The invariant message will be stripped in production, but the invariant
- * will remain to ensure logic does not differ in production.
- */
-
-if (!React) {
-  {
-    throw Error("ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.");
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
+  typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
+  (global = global || self, factory(global.ReactDOM = {}, global.React));
+}(this, (function (exports, React) { 'use strict';
+
+  var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions.
+  // Current owner and dispatcher used to share the same ref,
+  // but PR #14548 split them out to better support the react-debug-tools package.
+
+  if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {
+    ReactSharedInternals.ReactCurrentDispatcher = {
+      current: null
+    };
   }
-}
 
-/**
- * Injectable ordering of event plugins.
- */
-var eventPluginOrder = null;
-/**
- * Injectable mapping from names to event plugin modules.
- */
-
-var namesToPlugins = {};
-/**
- * Recomputes the plugin list using the injected plugins and plugin ordering.
- *
- * @private
- */
-
-function recomputePluginOrdering() {
-  if (!eventPluginOrder) {
-    // Wait until an `eventPluginOrder` is injected.
-    return;
+  if (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) {
+    ReactSharedInternals.ReactCurrentBatchConfig = {
+      suspense: null
+    };
   }
 
-  for (var pluginName in namesToPlugins) {
-    var pluginModule = namesToPlugins[pluginName];
-    var pluginIndex = eventPluginOrder.indexOf(pluginName);
+  // by calls to these methods by a Babel plugin.
+  //
+  // In PROD (or in packages without access to React internals),
+  // they are left as they are instead.
 
-    if (!(pluginIndex > -1)) {
-      {
-        throw Error("EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `" + pluginName + "`.");
+  function warn(format) {
+    {
+      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+        args[_key - 1] = arguments[_key];
       }
-    }
 
-    if (plugins[pluginIndex]) {
-      continue;
+      printWarning('warn', format, args);
     }
-
-    if (!pluginModule.extractEvents) {
-      {
-        throw Error("EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `" + pluginName + "` does not.");
+  }
+  function error(format) {
+    {
+      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+        args[_key2 - 1] = arguments[_key2];
       }
-    }
 
-    plugins[pluginIndex] = pluginModule;
-    var publishedEvents = pluginModule.eventTypes;
-
-    for (var eventName in publishedEvents) {
-      if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) {
-        {
-          throw Error("EventPluginRegistry: Failed to publish event `" + eventName + "` for plugin `" + pluginName + "`.");
-        }
-      }
+      printWarning('error', format, args);
     }
   }
-}
-/**
- * Publishes an event so that it can be dispatched by the supplied plugin.
- *
- * @param {object} dispatchConfig Dispatch configuration for the event.
- * @param {object} PluginModule Plugin publishing the event.
- * @return {boolean} True if the event was successfully published.
- * @private
- */
 
-
-function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
-  if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) {
+  function printWarning(level, format, args) {
+    // When changing this logic, you might want to also
+    // update consoleWithStackDev.www.js as well.
     {
-      throw Error("EventPluginHub: More than one plugin attempted to publish the same event name, `" + eventName + "`.");
-    }
-  }
+      var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\n    in') === 0;
 
-  eventNameDispatchConfigs[eventName] = dispatchConfig;
-  var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
+      if (!hasExistingStack) {
+        var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
+        var stack = ReactDebugCurrentFrame.getStackAddendum();
 
-  if (phasedRegistrationNames) {
-    for (var phaseName in phasedRegistrationNames) {
-      if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
-        var phasedRegistrationName = phasedRegistrationNames[phaseName];
-        publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
+        if (stack !== '') {
+          format += '%s';
+          args = args.concat([stack]);
+        }
       }
-    }
-
-    return true;
-  } else if (dispatchConfig.registrationName) {
-    publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);
-    return true;
-  }
-
-  return false;
-}
-/**
- * Publishes a registration name that is used to identify dispatched events.
- *
- * @param {string} registrationName Registration name to add.
- * @param {object} PluginModule Plugin publishing the event.
- * @private
- */
 
+      var argsWithFormat = args.map(function (item) {
+        return '' + item;
+      }); // Careful: RN currently depends on this prefix
 
-function publishRegistrationName(registrationName, pluginModule, eventName) {
-  if (!!registrationNameModules[registrationName]) {
-    {
-      throw Error("EventPluginHub: More than one plugin attempted to publish the same registration name, `" + registrationName + "`.");
-    }
-  }
-
-  registrationNameModules[registrationName] = pluginModule;
-  registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
+      argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
+      // breaks IE9: https://github.com/facebook/react/issues/13610
+      // eslint-disable-next-line react-internal/no-production-logging
 
-  {
-    var lowerCasedName = registrationName.toLowerCase();
-    possibleRegistrationNames[lowerCasedName] = registrationName;
+      Function.prototype.apply.call(console[level], console, argsWithFormat);
 
-    if (registrationName === 'onDoubleClick') {
-      possibleRegistrationNames.ondblclick = registrationName;
+      try {
+        // --- Welcome to debugging React ---
+        // This error was thrown as a convenience so that you can use this stack
+        // to find the callsite that caused this warning to fire.
+        var argIndex = 0;
+        var message = 'Warning: ' + format.replace(/%s/g, function () {
+          return args[argIndex++];
+        });
+        throw new Error(message);
+      } catch (x) {}
     }
   }
-}
-/**
- * Registers plugins so that they can extract and dispatch events.
- *
- * @see {EventPluginHub}
- */
-
-/**
- * Ordered list of injected plugins.
- */
-
-
-var plugins = [];
-/**
- * Mapping from event name to dispatch config
- */
-
-var eventNameDispatchConfigs = {};
-/**
- * Mapping from registration name to plugin module
- */
-
-var registrationNameModules = {};
-/**
- * Mapping from registration name to event name
- */
 
-var registrationNameDependencies = {};
-/**
- * Mapping from lowercase registration names to the properly cased version,
- * used to warn in the case of missing event handlers. Available
- * only in true.
- * @type {Object}
- */
-
-var possibleRegistrationNames = {}; // Trust the developer to only use possibleRegistrationNames in true
-
-/**
- * Injects an ordering of plugins (by plugin name). This allows the ordering
- * to be decoupled from injection of the actual plugins so that ordering is
- * always deterministic regardless of packaging, on-the-fly injection, etc.
- *
- * @param {array} InjectedEventPluginOrder
- * @internal
- * @see {EventPluginHub.injection.injectEventPluginOrder}
- */
-
-function injectEventPluginOrder(injectedEventPluginOrder) {
-  if (!!eventPluginOrder) {
+  if (!React) {
     {
-      throw Error("EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.");
-    }
-  } // Clone the ordering so it cannot be dynamically mutated.
-
-
-  eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
-  recomputePluginOrdering();
-}
-/**
- * Injects plugins to be used by `EventPluginHub`. The plugin names must be
- * in the ordering injected by `injectEventPluginOrder`.
- *
- * Plugins can be injected as part of page initialization or on-the-fly.
- *
- * @param {object} injectedNamesToPlugins Map from names to plugin modules.
- * @internal
- * @see {EventPluginHub.injection.injectEventPluginsByName}
- */
-
-function injectEventPluginsByName(injectedNamesToPlugins) {
-  var isOrderingDirty = false;
-
-  for (var pluginName in injectedNamesToPlugins) {
-    if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
-      continue;
-    }
-
-    var pluginModule = injectedNamesToPlugins[pluginName];
-
-    if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {
-      if (!!namesToPlugins[pluginName]) {
-        {
-          throw Error("EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + pluginName + "`.");
-        }
-      }
-
-      namesToPlugins[pluginName] = pluginModule;
-      isOrderingDirty = true;
+      throw Error( "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM." );
     }
   }
 
-  if (isOrderingDirty) {
-    recomputePluginOrdering();
-  }
-}
-
-var invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {
-  var funcArgs = Array.prototype.slice.call(arguments, 3);
+  var invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {
+    var funcArgs = Array.prototype.slice.call(arguments, 3);
 
-  try {
-    func.apply(context, funcArgs);
-  } catch (error) {
-    this.onError(error);
-  }
-};
+    try {
+      func.apply(context, funcArgs);
+    } catch (error) {
+      this.onError(error);
+    }
+  };
 
-{
-  // In DEV mode, we swap out invokeGuardedCallback for a special version
-  // that plays more nicely with the browser's DevTools. The idea is to preserve
-  // "Pause on exceptions" behavior. Because React wraps all user-provided
-  // functions in invokeGuardedCallback, and the production version of
-  // invokeGuardedCallback uses a try-catch, all user exceptions are treated
-  // like caught exceptions, and the DevTools won't pause unless the developer
-  // takes the extra step of enabling pause on caught exceptions. This is
-  // unintuitive, though, because even though React has caught the error, from
-  // the developer's perspective, the error is uncaught.
-  //
-  // To preserve the expected "Pause on exceptions" behavior, we don't use a
-  // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
-  // DOM node, and call the user-provided callback from inside an event handler
-  // for that fake event. If the callback throws, the error is "captured" using
-  // a global event handler. But because the error happens in a different
-  // event loop context, it does not interrupt the normal program flow.
-  // Effectively, this gives us try-catch behavior without actually using
-  // try-catch. Neat!
-  // Check that the browser supports the APIs we need to implement our special
-  // DEV version of invokeGuardedCallback
-  if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
-    var fakeNode = document.createElement('react');
-
-    var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {
-      // If document doesn't exist we know for sure we will crash in this method
-      // when we call document.createEvent(). However this can cause confusing
-      // errors: https://github.com/facebookincubator/create-react-app/issues/3482
-      // So we preemptively throw with a better message instead.
-      if (!(typeof document !== 'undefined')) {
-        {
-          throw Error("The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.");
+  {
+    // In DEV mode, we swap out invokeGuardedCallback for a special version
+    // that plays more nicely with the browser's DevTools. The idea is to preserve
+    // "Pause on exceptions" behavior. Because React wraps all user-provided
+    // functions in invokeGuardedCallback, and the production version of
+    // invokeGuardedCallback uses a try-catch, all user exceptions are treated
+    // like caught exceptions, and the DevTools won't pause unless the developer
+    // takes the extra step of enabling pause on caught exceptions. This is
+    // unintuitive, though, because even though React has caught the error, from
+    // the developer's perspective, the error is uncaught.
+    //
+    // To preserve the expected "Pause on exceptions" behavior, we don't use a
+    // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
+    // DOM node, and call the user-provided callback from inside an event handler
+    // for that fake event. If the callback throws, the error is "captured" using
+    // a global event handler. But because the error happens in a different
+    // event loop context, it does not interrupt the normal program flow.
+    // Effectively, this gives us try-catch behavior without actually using
+    // try-catch. Neat!
+    // Check that the browser supports the APIs we need to implement our special
+    // DEV version of invokeGuardedCallback
+    if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
+      var fakeNode = document.createElement('react');
+
+      var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {
+        // If document doesn't exist we know for sure we will crash in this method
+        // when we call document.createEvent(). However this can cause confusing
+        // errors: https://github.com/facebookincubator/create-react-app/issues/3482
+        // So we preemptively throw with a better message instead.
+        if (!(typeof document !== 'undefined')) {
+          {
+            throw Error( "The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous." );
+          }
         }
-      }
 
-      var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We
-      // set this to true at the beginning, then set it to false right after
-      // calling the function. If the function errors, `didError` will never be
-      // set to false. This strategy works even if the browser is flaky and
-      // fails to call our global error handler, because it doesn't rely on
-      // the error event at all.
+        var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We
+        // set this to true at the beginning, then set it to false right after
+        // calling the function. If the function errors, `didError` will never be
+        // set to false. This strategy works even if the browser is flaky and
+        // fails to call our global error handler, because it doesn't rely on
+        // the error event at all.
 
-      var didError = true; // Keeps track of the value of window.event so that we can reset it
-      // during the callback to let user code access window.event in the
-      // browsers that support it.
+        var didError = true; // Keeps track of the value of window.event so that we can reset it
+        // during the callback to let user code access window.event in the
+        // browsers that support it.
 
-      var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event
-      // dispatching: https://github.com/facebook/react/issues/13688
+        var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event
+        // dispatching: https://github.com/facebook/react/issues/13688
 
-      var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously
-      // dispatch our fake event using `dispatchEvent`. Inside the handler, we
-      // call the user-provided callback.
+        var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously
+        // dispatch our fake event using `dispatchEvent`. Inside the handler, we
+        // call the user-provided callback.
 
-      var funcArgs = Array.prototype.slice.call(arguments, 3);
+        var funcArgs = Array.prototype.slice.call(arguments, 3);
 
-      function callCallback() {
-        // We immediately remove the callback from event listeners so that
-        // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
-        // nested call would trigger the fake event handlers of any call higher
-        // in the stack.
-        fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the
-        // window.event assignment in both IE <= 10 as they throw an error
-        // "Member not found" in strict mode, and in Firefox which does not
-        // support window.event.
+        function callCallback() {
+          // We immediately remove the callback from event listeners so that
+          // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
+          // nested call would trigger the fake event handlers of any call higher
+          // in the stack.
+          fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the
+          // window.event assignment in both IE <= 10 as they throw an error
+          // "Member not found" in strict mode, and in Firefox which does not
+          // support window.event.
 
-        if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {
-          window.event = windowEvent;
-        }
+          if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {
+            window.event = windowEvent;
+          }
 
-        func.apply(context, funcArgs);
-        didError = false;
-      } // Create a global error event handler. We use this to capture the value
-      // that was thrown. It's possible that this error handler will fire more
-      // than once; for example, if non-React code also calls `dispatchEvent`
-      // and a handler for that event throws. We should be resilient to most of
-      // those cases. Even if our error event handler fires more than once, the
-      // last error event is always used. If the callback actually does error,
-      // we know that the last error event is the correct one, because it's not
-      // possible for anything else to have happened in between our callback
-      // erroring and the code that follows the `dispatchEvent` call below. If
-      // the callback doesn't error, but the error event was fired, we know to
-      // ignore it because `didError` will be false, as described above.
+          func.apply(context, funcArgs);
+          didError = false;
+        } // Create a global error event handler. We use this to capture the value
+        // that was thrown. It's possible that this error handler will fire more
+        // than once; for example, if non-React code also calls `dispatchEvent`
+        // and a handler for that event throws. We should be resilient to most of
+        // those cases. Even if our error event handler fires more than once, the
+        // last error event is always used. If the callback actually does error,
+        // we know that the last error event is the correct one, because it's not
+        // possible for anything else to have happened in between our callback
+        // erroring and the code that follows the `dispatchEvent` call below. If
+        // the callback doesn't error, but the error event was fired, we know to
+        // ignore it because `didError` will be false, as described above.
 
 
-      var error; // Use this to track whether the error event is ever called.
+        var error; // Use this to track whether the error event is ever called.
 
-      var didSetError = false;
-      var isCrossOriginError = false;
+        var didSetError = false;
+        var isCrossOriginError = false;
 
-      function handleWindowError(event) {
-        error = event.error;
-        didSetError = true;
+        function handleWindowError(event) {
+          error = event.error;
+          didSetError = true;
 
-        if (error === null && event.colno === 0 && event.lineno === 0) {
-          isCrossOriginError = true;
-        }
+          if (error === null && event.colno === 0 && event.lineno === 0) {
+            isCrossOriginError = true;
+          }
 
-        if (event.defaultPrevented) {
-          // Some other error handler has prevented default.
-          // Browsers silence the error report if this happens.
-          // We'll remember this to later decide whether to log it or not.
-          if (error != null && typeof error === 'object') {
-            try {
-              error._suppressLogging = true;
-            } catch (inner) {// Ignore.
+          if (event.defaultPrevented) {
+            // Some other error handler has prevented default.
+            // Browsers silence the error report if this happens.
+            // We'll remember this to later decide whether to log it or not.
+            if (error != null && typeof error === 'object') {
+              try {
+                error._suppressLogging = true;
+              } catch (inner) {// Ignore.
+              }
             }
           }
-        }
-      } // Create a fake event type.
-
+        } // Create a fake event type.
 
-      var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers
 
-      window.addEventListener('error', handleWindowError);
-      fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function
-      // errors, it will trigger our global error handler.
+        var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers
 
-      evt.initEvent(evtType, false, false);
-      fakeNode.dispatchEvent(evt);
+        window.addEventListener('error', handleWindowError);
+        fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function
+        // errors, it will trigger our global error handler.
 
-      if (windowEventDescriptor) {
-        Object.defineProperty(window, 'event', windowEventDescriptor);
-      }
+        evt.initEvent(evtType, false, false);
+        fakeNode.dispatchEvent(evt);
 
-      if (didError) {
-        if (!didSetError) {
-          // The callback errored, but the error event never fired.
-          error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');
-        } else if (isCrossOriginError) {
-          error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');
+        if (windowEventDescriptor) {
+          Object.defineProperty(window, 'event', windowEventDescriptor);
         }
 
-        this.onError(error);
-      } // Remove our event listeners
-
-
-      window.removeEventListener('error', handleWindowError);
-    };
+        if (didError) {
+          if (!didSetError) {
+            // The callback errored, but the error event never fired.
+            error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');
+          } else if (isCrossOriginError) {
+            error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');
+          }
 
-    invokeGuardedCallbackImpl = invokeGuardedCallbackDev;
-  }
-}
+          this.onError(error);
+        } // Remove our event listeners
 
-var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
 
-var hasError = false;
-var caughtError = null; // Used by event system to capture/rethrow the first error.
+        window.removeEventListener('error', handleWindowError);
+      };
 
-var hasRethrowError = false;
-var rethrowError = null;
-var reporter = {
-  onError: function (error) {
-    hasError = true;
-    caughtError = error;
+      invokeGuardedCallbackImpl = invokeGuardedCallbackDev;
+    }
   }
-};
-/**
- * Call a function while guarding against errors that happens within it.
- * Returns an error if it throws, otherwise null.
- *
- * In production, this is implemented using a try-catch. The reason we don't
- * use a try-catch directly is so that we can swap out a different
- * implementation in DEV mode.
- *
- * @param {String} name of the guard to use for logging or debugging
- * @param {Function} func The function to invoke
- * @param {*} context The context to use when calling the function
- * @param {...*} args Arguments for function
- */
-
-function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
-  hasError = false;
-  caughtError = null;
-  invokeGuardedCallbackImpl$1.apply(reporter, arguments);
-}
-/**
- * Same as invokeGuardedCallback, but instead of returning an error, it stores
- * it in a global so it can be rethrown by `rethrowCaughtError` later.
- * TODO: See if caughtError and rethrowError can be unified.
- *
- * @param {String} name of the guard to use for logging or debugging
- * @param {Function} func The function to invoke
- * @param {*} context The context to use when calling the function
- * @param {...*} args Arguments for function
- */
 
-function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
-  invokeGuardedCallback.apply(this, arguments);
+  var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
 
-  if (hasError) {
-    var error = clearCaughtError();
+  var hasError = false;
+  var caughtError = null; // Used by event system to capture/rethrow the first error.
 
-    if (!hasRethrowError) {
-      hasRethrowError = true;
-      rethrowError = error;
+  var hasRethrowError = false;
+  var rethrowError = null;
+  var reporter = {
+    onError: function (error) {
+      hasError = true;
+      caughtError = error;
     }
-  }
-}
-/**
- * During execution of guarded functions we will capture the first error which
- * we will rethrow to be handled by the top level error handler.
- */
+  };
+  /**
+   * Call a function while guarding against errors that happens within it.
+   * Returns an error if it throws, otherwise null.
+   *
+   * In production, this is implemented using a try-catch. The reason we don't
+   * use a try-catch directly is so that we can swap out a different
+   * implementation in DEV mode.
+   *
+   * @param {String} name of the guard to use for logging or debugging
+   * @param {Function} func The function to invoke
+   * @param {*} context The context to use when calling the function
+   * @param {...*} args Arguments for function
+   */
 
-function rethrowCaughtError() {
-  if (hasRethrowError) {
-    var error = rethrowError;
-    hasRethrowError = false;
-    rethrowError = null;
-    throw error;
-  }
-}
-function hasCaughtError() {
-  return hasError;
-}
-function clearCaughtError() {
-  if (hasError) {
-    var error = caughtError;
+  function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
     hasError = false;
     caughtError = null;
-    return error;
-  } else {
-    {
-      {
-        throw Error("clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.");
-      }
-    }
+    invokeGuardedCallbackImpl$1.apply(reporter, arguments);
   }
-}
+  /**
+   * Same as invokeGuardedCallback, but instead of returning an error, it stores
+   * it in a global so it can be rethrown by `rethrowCaughtError` later.
+   * TODO: See if caughtError and rethrowError can be unified.
+   *
+   * @param {String} name of the guard to use for logging or debugging
+   * @param {Function} func The function to invoke
+   * @param {*} context The context to use when calling the function
+   * @param {...*} args Arguments for function
+   */
 
-/**
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
-var warningWithoutStack = function () {};
+  function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
+    invokeGuardedCallback.apply(this, arguments);
 
-{
-  warningWithoutStack = function (condition, format) {
-    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
-    }
+    if (hasError) {
+      var error = clearCaughtError();
 
-    if (format === undefined) {
-      throw new Error('`warningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument');
+      if (!hasRethrowError) {
+        hasRethrowError = true;
+        rethrowError = error;
+      }
     }
+  }
+  /**
+   * During execution of guarded functions we will capture the first error which
+   * we will rethrow to be handled by the top level error handler.
+   */
 
-    if (args.length > 8) {
-      // Check before the condition to catch violations early.
-      throw new Error('warningWithoutStack() currently supports at most 8 arguments.');
+  function rethrowCaughtError() {
+    if (hasRethrowError) {
+      var error = rethrowError;
+      hasRethrowError = false;
+      rethrowError = null;
+      throw error;
     }
-
-    if (condition) {
-      return;
+  }
+  function hasCaughtError() {
+    return hasError;
+  }
+  function clearCaughtError() {
+    if (hasError) {
+      var error = caughtError;
+      hasError = false;
+      caughtError = null;
+      return error;
+    } else {
+      {
+        {
+          throw Error( "clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue." );
+        }
+      }
     }
+  }
 
-    if (typeof console !== 'undefined') {
-      var argsWithFormat = args.map(function (item) {
-        return '' + item;
-      });
-      argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
-      // breaks IE9: https://github.com/facebook/react/issues/13610
+  var getFiberCurrentPropsFromNode = null;
+  var getInstanceFromNode = null;
+  var getNodeFromInstance = null;
+  function setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {
+    getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;
+    getInstanceFromNode = getInstanceFromNodeImpl;
+    getNodeFromInstance = getNodeFromInstanceImpl;
 
-      Function.prototype.apply.call(console.error, console, argsWithFormat);
+    {
+      if (!getNodeFromInstance || !getInstanceFromNode) {
+        error('EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.');
+      }
     }
+  }
+  var validateEventDispatches;
 
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      var argIndex = 0;
-      var message = 'Warning: ' + format.replace(/%s/g, function () {
-        return args[argIndex++];
-      });
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
+  {
+    validateEventDispatches = function (event) {
+      var dispatchListeners = event._dispatchListeners;
+      var dispatchInstances = event._dispatchInstances;
+      var listenersIsArr = Array.isArray(dispatchListeners);
+      var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;
+      var instancesIsArr = Array.isArray(dispatchInstances);
+      var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;
 
-var warningWithoutStack$1 = warningWithoutStack;
+      if (instancesIsArr !== listenersIsArr || instancesLen !== listenersLen) {
+        error('EventPluginUtils: Invalid `event`.');
+      }
+    };
+  }
+  /**
+   * Dispatch the event to the listener.
+   * @param {SyntheticEvent} event SyntheticEvent to handle
+   * @param {function} listener Application-level callback
+   * @param {*} inst Internal component instance
+   */
 
-var getFiberCurrentPropsFromNode = null;
-var getInstanceFromNode = null;
-var getNodeFromInstance = null;
-function setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {
-  getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;
-  getInstanceFromNode = getInstanceFromNodeImpl;
-  getNodeFromInstance = getNodeFromInstanceImpl;
 
-  {
-    !(getNodeFromInstance && getInstanceFromNode) ? warningWithoutStack$1(false, 'EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0;
+  function executeDispatch(event, listener, inst) {
+    var type = event.type || 'unknown-event';
+    event.currentTarget = getNodeFromInstance(inst);
+    invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);
+    event.currentTarget = null;
   }
-}
-var validateEventDispatches;
+  /**
+   * Standard/simple iteration through an event's collected dispatches.
+   */
 
-{
-  validateEventDispatches = function (event) {
+  function executeDispatchesInOrder(event) {
     var dispatchListeners = event._dispatchListeners;
     var dispatchInstances = event._dispatchInstances;
-    var listenersIsArr = Array.isArray(dispatchListeners);
-    var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;
-    var instancesIsArr = Array.isArray(dispatchInstances);
-    var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;
-    !(instancesIsArr === listenersIsArr && instancesLen === listenersLen) ? warningWithoutStack$1(false, 'EventPluginUtils: Invalid `event`.') : void 0;
-  };
-}
-/**
- * Dispatch the event to the listener.
- * @param {SyntheticEvent} event SyntheticEvent to handle
- * @param {function} listener Application-level callback
- * @param {*} inst Internal component instance
- */
 
+    {
+      validateEventDispatches(event);
+    }
 
-function executeDispatch(event, listener, inst) {
-  var type = event.type || 'unknown-event';
-  event.currentTarget = getNodeFromInstance(inst);
-  invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);
-  event.currentTarget = null;
-}
-/**
- * Standard/simple iteration through an event's collected dispatches.
- */
+    if (Array.isArray(dispatchListeners)) {
+      for (var i = 0; i < dispatchListeners.length; i++) {
+        if (event.isPropagationStopped()) {
+          break;
+        } // Listeners and Instances are two parallel arrays that are always in sync.
 
-function executeDispatchesInOrder(event) {
-  var dispatchListeners = event._dispatchListeners;
-  var dispatchInstances = event._dispatchInstances;
 
-  {
-    validateEventDispatches(event);
+        executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);
+      }
+    } else if (dispatchListeners) {
+      executeDispatch(event, dispatchListeners, dispatchInstances);
+    }
+
+    event._dispatchListeners = null;
+    event._dispatchInstances = null;
   }
 
-  if (Array.isArray(dispatchListeners)) {
-    for (var i = 0; i < dispatchListeners.length; i++) {
-      if (event.isPropagationStopped()) {
-        break;
-      } // Listeners and Instances are two parallel arrays that are always in sync.
+  var FunctionComponent = 0;
+  var ClassComponent = 1;
+  var IndeterminateComponent = 2; // Before we know whether it is function or class
 
+  var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
 
-      executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);
-    }
-  } else if (dispatchListeners) {
-    executeDispatch(event, dispatchListeners, dispatchInstances);
-  }
+  var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
 
-  event._dispatchListeners = null;
-  event._dispatchInstances = null;
-}
-/**
- * @see executeDispatchesInOrderStopAtTrueImpl
- */
+  var HostComponent = 5;
+  var HostText = 6;
+  var Fragment = 7;
+  var Mode = 8;
+  var ContextConsumer = 9;
+  var ContextProvider = 10;
+  var ForwardRef = 11;
+  var Profiler = 12;
+  var SuspenseComponent = 13;
+  var MemoComponent = 14;
+  var SimpleMemoComponent = 15;
+  var LazyComponent = 16;
+  var IncompleteClassComponent = 17;
+  var DehydratedFragment = 18;
+  var SuspenseListComponent = 19;
+  var FundamentalComponent = 20;
+  var ScopeComponent = 21;
+  var Block = 22;
+
+  /**
+   * Injectable ordering of event plugins.
+   */
+  var eventPluginOrder = null;
+  /**
+   * Injectable mapping from names to event plugin modules.
+   */
 
+  var namesToPlugins = {};
+  /**
+   * Recomputes the plugin list using the injected plugins and plugin ordering.
+   *
+   * @private
+   */
 
+  function recomputePluginOrdering() {
+    if (!eventPluginOrder) {
+      // Wait until an `eventPluginOrder` is injected.
+      return;
+    }
 
-/**
- * Execution of a "direct" dispatch - there must be at most one dispatch
- * accumulated on the event or it is considered an error. It doesn't really make
- * sense for an event with multiple dispatches (bubbled) to keep track of the
- * return values at each dispatch execution, but it does tend to make sense when
- * dealing with "direct" dispatches.
- *
- * @return {*} The return value of executing the single dispatch.
- */
+    for (var pluginName in namesToPlugins) {
+      var pluginModule = namesToPlugins[pluginName];
+      var pluginIndex = eventPluginOrder.indexOf(pluginName);
 
+      if (!(pluginIndex > -1)) {
+        {
+          throw Error( "EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `" + pluginName + "`." );
+        }
+      }
 
-/**
- * @param {SyntheticEvent} event
- * @return {boolean} True iff number of dispatches accumulated is greater than 0.
- */
+      if (plugins[pluginIndex]) {
+        continue;
+      }
 
-/**
- * Accumulates items that must not be null or undefined into the first one. This
- * is used to conserve memory by avoiding array allocations, and thus sacrifices
- * API cleanness. Since `current` can be null before being passed in and not
- * null after this function, make sure to assign it back to `current`:
- *
- * `a = accumulateInto(a, b);`
- *
- * This API should be sparingly used. Try `accumulate` for something cleaner.
- *
- * @return {*|array<*>} An accumulation of items.
- */
+      if (!pluginModule.extractEvents) {
+        {
+          throw Error( "EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `" + pluginName + "` does not." );
+        }
+      }
 
-function accumulateInto(current, next) {
-  if (!(next != null)) {
-    {
-      throw Error("accumulateInto(...): Accumulated items must not be null or undefined.");
+      plugins[pluginIndex] = pluginModule;
+      var publishedEvents = pluginModule.eventTypes;
+
+      for (var eventName in publishedEvents) {
+        if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) {
+          {
+            throw Error( "EventPluginRegistry: Failed to publish event `" + eventName + "` for plugin `" + pluginName + "`." );
+          }
+        }
+      }
     }
   }
-
-  if (current == null) {
-    return next;
-  } // Both are not empty. Warning: Never call x.concat(y) when you are not
-  // certain that x is an Array (x could be a string with concat method).
+  /**
+   * Publishes an event so that it can be dispatched by the supplied plugin.
+   *
+   * @param {object} dispatchConfig Dispatch configuration for the event.
+   * @param {object} PluginModule Plugin publishing the event.
+   * @return {boolean} True if the event was successfully published.
+   * @private
+   */
 
 
-  if (Array.isArray(current)) {
-    if (Array.isArray(next)) {
-      current.push.apply(current, next);
-      return current;
+  function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
+    if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) {
+      {
+        throw Error( "EventPluginRegistry: More than one plugin attempted to publish the same event name, `" + eventName + "`." );
+      }
     }
 
-    current.push(next);
-    return current;
-  }
+    eventNameDispatchConfigs[eventName] = dispatchConfig;
+    var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
 
-  if (Array.isArray(next)) {
-    // A bit too dangerous to mutate `next`.
-    return [current].concat(next);
-  }
+    if (phasedRegistrationNames) {
+      for (var phaseName in phasedRegistrationNames) {
+        if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
+          var phasedRegistrationName = phasedRegistrationNames[phaseName];
+          publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
+        }
+      }
 
-  return [current, next];
-}
+      return true;
+    } else if (dispatchConfig.registrationName) {
+      publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);
+      return true;
+    }
 
-/**
- * @param {array} arr an "accumulation" of items which is either an Array or
- * a single item. Useful when paired with the `accumulate` module. This is a
- * simple utility that allows us to reason about a collection of items, but
- * handling the case when there is exactly one item (and we do not need to
- * allocate an array).
- * @param {function} cb Callback invoked with each element or a collection.
- * @param {?} [scope] Scope used as `this` in a callback.
- */
-function forEachAccumulated(arr, cb, scope) {
-  if (Array.isArray(arr)) {
-    arr.forEach(cb, scope);
-  } else if (arr) {
-    cb.call(scope, arr);
+    return false;
   }
-}
+  /**
+   * Publishes a registration name that is used to identify dispatched events.
+   *
+   * @param {string} registrationName Registration name to add.
+   * @param {object} PluginModule Plugin publishing the event.
+   * @private
+   */
 
-/**
- * Internal queue of events that have accumulated their dispatches and are
- * waiting to have their dispatches executed.
- */
 
-var eventQueue = null;
-/**
- * Dispatches an event and releases it back into the pool, unless persistent.
- *
- * @param {?object} event Synthetic event to be dispatched.
- * @private
- */
+  function publishRegistrationName(registrationName, pluginModule, eventName) {
+    if (!!registrationNameModules[registrationName]) {
+      {
+        throw Error( "EventPluginRegistry: More than one plugin attempted to publish the same registration name, `" + registrationName + "`." );
+      }
+    }
 
-var executeDispatchesAndRelease = function (event) {
-  if (event) {
-    executeDispatchesInOrder(event);
+    registrationNameModules[registrationName] = pluginModule;
+    registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
+
+    {
+      var lowerCasedName = registrationName.toLowerCase();
+      possibleRegistrationNames[lowerCasedName] = registrationName;
 
-    if (!event.isPersistent()) {
-      event.constructor.release(event);
+      if (registrationName === 'onDoubleClick') {
+        possibleRegistrationNames.ondblclick = registrationName;
+      }
     }
   }
-};
-
-var executeDispatchesAndReleaseTopLevel = function (e) {
-  return executeDispatchesAndRelease(e);
-};
+  /**
+   * Registers plugins so that they can extract and dispatch events.
+   */
 
-function runEventsInBatch(events) {
-  if (events !== null) {
-    eventQueue = accumulateInto(eventQueue, events);
-  } // Set `eventQueue` to null before processing it so that we can tell if more
-  // events get enqueued while processing.
+  /**
+   * Ordered list of injected plugins.
+   */
 
 
-  var processingEventQueue = eventQueue;
-  eventQueue = null;
+  var plugins = [];
+  /**
+   * Mapping from event name to dispatch config
+   */
 
-  if (!processingEventQueue) {
-    return;
-  }
-
-  forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);
-
-  if (!!eventQueue) {
-    {
-      throw Error("processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.");
-    }
-  } // This would be a good time to rethrow if any of the event handlers threw.
-
-
-  rethrowCaughtError();
-}
-
-function isInteractive(tag) {
-  return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
-}
-
-function shouldPreventMouseEvent(name, type, props) {
-  switch (name) {
-    case 'onClick':
-    case 'onClickCapture':
-    case 'onDoubleClick':
-    case 'onDoubleClickCapture':
-    case 'onMouseDown':
-    case 'onMouseDownCapture':
-    case 'onMouseMove':
-    case 'onMouseMoveCapture':
-    case 'onMouseUp':
-    case 'onMouseUpCapture':
-      return !!(props.disabled && isInteractive(type));
-
-    default:
-      return false;
-  }
-}
-/**
- * This is a unified interface for event plugins to be installed and configured.
- *
- * Event plugins can implement the following properties:
- *
- *   `extractEvents` {function(string, DOMEventTarget, string, object): *}
- *     Required. When a top-level event is fired, this method is expected to
- *     extract synthetic events that will in turn be queued and dispatched.
- *
- *   `eventTypes` {object}
- *     Optional, plugins that fire events must publish a mapping of registration
- *     names that are used to register listeners. Values of this mapping must
- *     be objects that contain `registrationName` or `phasedRegistrationNames`.
- *
- *   `executeDispatch` {function(object, function, string)}
- *     Optional, allows plugins to override how an event gets dispatched. By
- *     default, the listener is simply invoked.
- *
- * Each plugin that is injected into `EventsPluginHub` is immediately operable.
- *
- * @public
- */
-
-/**
- * Methods for injecting dependencies.
- */
-
-
-var injection = {
+  var eventNameDispatchConfigs = {};
   /**
-   * @param {array} InjectedEventPluginOrder
-   * @public
+   * Mapping from registration name to plugin module
    */
-  injectEventPluginOrder: injectEventPluginOrder,
 
+  var registrationNameModules = {};
   /**
-   * @param {object} injectedNamesToPlugins Map from names to plugin modules.
+   * Mapping from registration name to event name
    */
-  injectEventPluginsByName: injectEventPluginsByName
-};
-/**
- * @param {object} inst The instance, which is the source of events.
- * @param {string} registrationName Name of listener (e.g. `onClick`).
- * @return {?function} The stored callback.
- */
-
-function getListener(inst, registrationName) {
-  var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
-  // live here; needs to be moved to a better place soon
-
-  var stateNode = inst.stateNode;
 
-  if (!stateNode) {
-    // Work in progress (ex: onload events in incremental mode).
-    return null;
-  }
+  var registrationNameDependencies = {};
+  /**
+   * Mapping from lowercase registration names to the properly cased version,
+   * used to warn in the case of missing event handlers. Available
+   * only in true.
+   * @type {Object}
+   */
 
-  var props = getFiberCurrentPropsFromNode(stateNode);
+  var possibleRegistrationNames =  {} ; // Trust the developer to only use possibleRegistrationNames in true
 
-  if (!props) {
-    // Work in progress.
-    return null;
-  }
+  /**
+   * Injects an ordering of plugins (by plugin name). This allows the ordering
+   * to be decoupled from injection of the actual plugins so that ordering is
+   * always deterministic regardless of packaging, on-the-fly injection, etc.
+   *
+   * @param {array} InjectedEventPluginOrder
+   * @internal
+   */
 
-  listener = props[registrationName];
+  function injectEventPluginOrder(injectedEventPluginOrder) {
+    if (!!eventPluginOrder) {
+      {
+        throw Error( "EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React." );
+      }
+    } // Clone the ordering so it cannot be dynamically mutated.
 
-  if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
-    return null;
-  }
 
-  if (!(!listener || typeof listener === 'function')) {
-    {
-      throw Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type.");
-    }
+    eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
+    recomputePluginOrdering();
   }
+  /**
+   * Injects plugins to be used by plugin event system. The plugin names must be
+   * in the ordering injected by `injectEventPluginOrder`.
+   *
+   * Plugins can be injected as part of page initialization or on-the-fly.
+   *
+   * @param {object} injectedNamesToPlugins Map from names to plugin modules.
+   * @internal
+   */
 
-  return listener;
-}
-/**
- * Allows registered plugins an opportunity to extract events from top-level
- * native browser events.
- *
- * @return {*} An accumulation of synthetic events.
- * @internal
- */
+  function injectEventPluginsByName(injectedNamesToPlugins) {
+    var isOrderingDirty = false;
 
-function extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
-  var events = null;
+    for (var pluginName in injectedNamesToPlugins) {
+      if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
+        continue;
+      }
 
-  for (var i = 0; i < plugins.length; i++) {
-    // Not every plugin in the ordering may be loaded at runtime.
-    var possiblePlugin = plugins[i];
+      var pluginModule = injectedNamesToPlugins[pluginName];
 
-    if (possiblePlugin) {
-      var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
+      if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {
+        if (!!namesToPlugins[pluginName]) {
+          {
+            throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + pluginName + "`." );
+          }
+        }
 
-      if (extractedEvents) {
-        events = accumulateInto(events, extractedEvents);
+        namesToPlugins[pluginName] = pluginModule;
+        isOrderingDirty = true;
       }
     }
-  }
 
-  return events;
-}
+    if (isOrderingDirty) {
+      recomputePluginOrdering();
+    }
+  }
 
-function runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
-  var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
-  runEventsInBatch(events);
-}
+  var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
 
-var FunctionComponent = 0;
-var ClassComponent = 1;
-var IndeterminateComponent = 2; // Before we know whether it is function or class
+  var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
+  var _assign = ReactInternals.assign;
 
-var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
+  var PLUGIN_EVENT_SYSTEM = 1;
+  var IS_REPLAYED = 1 << 5;
+  var IS_FIRST_ANCESTOR = 1 << 6;
 
-var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
+  var restoreImpl = null;
+  var restoreTarget = null;
+  var restoreQueue = null;
 
-var HostComponent = 5;
-var HostText = 6;
-var Fragment = 7;
-var Mode = 8;
-var ContextConsumer = 9;
-var ContextProvider = 10;
-var ForwardRef = 11;
-var Profiler = 12;
-var SuspenseComponent = 13;
-var MemoComponent = 14;
-var SimpleMemoComponent = 15;
-var LazyComponent = 16;
-var IncompleteClassComponent = 17;
-var DehydratedFragment = 18;
-var SuspenseListComponent = 19;
-var FundamentalComponent = 20;
-var ScopeComponent = 21;
+  function restoreStateOfTarget(target) {
+    // We perform this translation at the end of the event loop so that we
+    // always receive the correct fiber here
+    var internalInstance = getInstanceFromNode(target);
 
-var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions.
-// Current owner and dispatcher used to share the same ref,
-// but PR #14548 split them out to better support the react-debug-tools package.
+    if (!internalInstance) {
+      // Unmounted
+      return;
+    }
 
-if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {
-  ReactSharedInternals.ReactCurrentDispatcher = {
-    current: null
-  };
-}
+    if (!(typeof restoreImpl === 'function')) {
+      {
+        throw Error( "setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue." );
+      }
+    }
 
-if (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) {
-  ReactSharedInternals.ReactCurrentBatchConfig = {
-    suspense: null
-  };
-}
+    var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.
 
-var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
-var describeComponentFrame = function (name, source, ownerName) {
-  var sourceInfo = '';
+    if (stateNode) {
+      var _props = getFiberCurrentPropsFromNode(stateNode);
 
-  if (source) {
-    var path = source.fileName;
-    var fileName = path.replace(BEFORE_SLASH_RE, '');
+      restoreImpl(internalInstance.stateNode, internalInstance.type, _props);
+    }
+  }
 
-    {
-      // In DEV, include code for a common special case:
-      // prefer "folder/index.js" instead of just "index.js".
-      if (/^index\./.test(fileName)) {
-        var match = path.match(BEFORE_SLASH_RE);
+  function setRestoreImplementation(impl) {
+    restoreImpl = impl;
+  }
+  function enqueueStateRestore(target) {
+    if (restoreTarget) {
+      if (restoreQueue) {
+        restoreQueue.push(target);
+      } else {
+        restoreQueue = [target];
+      }
+    } else {
+      restoreTarget = target;
+    }
+  }
+  function needsStateRestore() {
+    return restoreTarget !== null || restoreQueue !== null;
+  }
+  function restoreStateIfNeeded() {
+    if (!restoreTarget) {
+      return;
+    }
 
-        if (match) {
-          var pathBeforeSlash = match[1];
+    var target = restoreTarget;
+    var queuedTargets = restoreQueue;
+    restoreTarget = null;
+    restoreQueue = null;
+    restoreStateOfTarget(target);
 
-          if (pathBeforeSlash) {
-            var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
-            fileName = folderName + '/' + fileName;
-          }
-        }
+    if (queuedTargets) {
+      for (var i = 0; i < queuedTargets.length; i++) {
+        restoreStateOfTarget(queuedTargets[i]);
       }
     }
-
-    sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
-  } else if (ownerName) {
-    sourceInfo = ' (created by ' + ownerName + ')';
   }
 
-  return '\n    in ' + (name || 'Unknown') + sourceInfo;
-};
+  var enableProfilerTimer = true; // Trace which interactions trigger each commit.
 
-// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
-// nor polyfill, then a plain number is used for performance.
-var hasSymbol = typeof Symbol === 'function' && Symbol.for;
-var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
-var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
-var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
-var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
-var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
-var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
-var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
-// (unstable) APIs that have been removed. Can we remove the symbols?
+  var enableDeprecatedFlareAPI = false; // Experimental Host Component support.
 
+  var enableFundamentalAPI = false; // Experimental Scope support.
+  var warnAboutStringRefs = false;
 
-var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
-var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
-var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
-var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
-var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
-var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
-var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
-var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
-var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
-var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
-var FAUX_ITERATOR_SYMBOL = '@@iterator';
-function getIteratorFn(maybeIterable) {
-  if (maybeIterable === null || typeof maybeIterable !== 'object') {
-    return null;
-  }
+  // the renderer. Such as when we're dispatching events or if third party
+  // libraries need to call batchedUpdates. Eventually, this API will go away when
+  // everything is batched by default. We'll then have a similar API to opt-out of
+  // scheduled work and instead do synchronous work.
+  // Defaults
 
-  var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
+  var batchedUpdatesImpl = function (fn, bookkeeping) {
+    return fn(bookkeeping);
+  };
 
-  if (typeof maybeIterator === 'function') {
-    return maybeIterator;
-  }
+  var discreteUpdatesImpl = function (fn, a, b, c, d) {
+    return fn(a, b, c, d);
+  };
 
-  return null;
-}
+  var flushDiscreteUpdatesImpl = function () {};
 
-/**
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
+  var batchedEventUpdatesImpl = batchedUpdatesImpl;
+  var isInsideEventHandler = false;
+  var isBatchingEventUpdates = false;
 
-var warning = warningWithoutStack$1;
+  function finishEventHandler() {
+    // Here we wait until all updates have propagated, which is important
+    // when using controlled components within layers:
+    // https://github.com/facebook/react/issues/1698
+    // Then we restore state of any controlled component.
+    var controlledComponentsHavePendingUpdates = needsStateRestore();
 
-{
-  warning = function (condition, format) {
-    if (condition) {
-      return;
+    if (controlledComponentsHavePendingUpdates) {
+      // If a controlled event was fired, we may need to restore the state of
+      // the DOM node back to the controlled value. This is necessary when React
+      // bails out of the update without touching the DOM.
+      flushDiscreteUpdatesImpl();
+      restoreStateIfNeeded();
     }
+  }
 
-    var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
-    var stack = ReactDebugCurrentFrame.getStackAddendum(); // eslint-disable-next-line react-internal/warning-and-invariant-args
-
-    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
+  function batchedUpdates(fn, bookkeeping) {
+    if (isInsideEventHandler) {
+      // If we are currently inside another batch, we need to wait until it
+      // fully completes before restoring state.
+      return fn(bookkeeping);
     }
 
-    warningWithoutStack$1.apply(void 0, [false, format + '%s'].concat(args, [stack]));
-  };
-}
-
-var warning$1 = warning;
-
-var Uninitialized = -1;
-var Pending = 0;
-var Resolved = 1;
-var Rejected = 2;
-function refineResolvedLazyComponent(lazyComponent) {
-  return lazyComponent._status === Resolved ? lazyComponent._result : null;
-}
-function initializeLazyComponentType(lazyComponent) {
-  if (lazyComponent._status === Uninitialized) {
-    lazyComponent._status = Pending;
-    var ctor = lazyComponent._ctor;
-    var thenable = ctor();
-    lazyComponent._result = thenable;
-    thenable.then(function (moduleObject) {
-      if (lazyComponent._status === Pending) {
-        var defaultExport = moduleObject.default;
-
-        {
-          if (defaultExport === undefined) {
-            warning$1(false, 'lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n  ' + "const MyComponent = lazy(() => import('./MyComponent'))", moduleObject);
-          }
-        }
+    isInsideEventHandler = true;
 
-        lazyComponent._status = Resolved;
-        lazyComponent._result = defaultExport;
-      }
-    }, function (error) {
-      if (lazyComponent._status === Pending) {
-        lazyComponent._status = Rejected;
-        lazyComponent._result = error;
-      }
-    });
+    try {
+      return batchedUpdatesImpl(fn, bookkeeping);
+    } finally {
+      isInsideEventHandler = false;
+      finishEventHandler();
+    }
   }
-}
+  function batchedEventUpdates(fn, a, b) {
+    if (isBatchingEventUpdates) {
+      // If we are currently inside another batch, we need to wait until it
+      // fully completes before restoring state.
+      return fn(a, b);
+    }
 
-function getWrappedName(outerType, innerType, wrapperName) {
-  var functionName = innerType.displayName || innerType.name || '';
-  return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
-}
+    isBatchingEventUpdates = true;
 
-function getComponentName(type) {
-  if (type == null) {
-    // Host root, text node or just invalid type.
-    return null;
-  }
+    try {
+      return batchedEventUpdatesImpl(fn, a, b);
+    } finally {
+      isBatchingEventUpdates = false;
+      finishEventHandler();
+    }
+  } // This is for the React Flare event system
+  function discreteUpdates(fn, a, b, c, d) {
+    var prevIsInsideEventHandler = isInsideEventHandler;
+    isInsideEventHandler = true;
 
-  {
-    if (typeof type.tag === 'number') {
-      warningWithoutStack$1(false, 'Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
+    try {
+      return discreteUpdatesImpl(fn, a, b, c, d);
+    } finally {
+      isInsideEventHandler = prevIsInsideEventHandler;
+
+      if (!isInsideEventHandler) {
+        finishEventHandler();
+      }
+    }
+  }
+  function flushDiscreteUpdatesIfNeeded(timeStamp) {
+    // event.timeStamp isn't overly reliable due to inconsistencies in
+    // how different browsers have historically provided the time stamp.
+    // Some browsers provide high-resolution time stamps for all events,
+    // some provide low-resolution time stamps for all events. FF < 52
+    // even mixes both time stamps together. Some browsers even report
+    // negative time stamps or time stamps that are 0 (iOS9) in some cases.
+    // Given we are only comparing two time stamps with equality (!==),
+    // we are safe from the resolution differences. If the time stamp is 0
+    // we bail-out of preventing the flush, which can affect semantics,
+    // such as if an earlier flush removes or adds event listeners that
+    // are fired in the subsequent flush. However, this is the same
+    // behaviour as we had before this change, so the risks are low.
+    if (!isInsideEventHandler && (!enableDeprecatedFlareAPI  )) {
+      flushDiscreteUpdatesImpl();
+    }
+  }
+  function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) {
+    batchedUpdatesImpl = _batchedUpdatesImpl;
+    discreteUpdatesImpl = _discreteUpdatesImpl;
+    flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl;
+    batchedEventUpdatesImpl = _batchedEventUpdatesImpl;
+  }
+
+  var DiscreteEvent = 0;
+  var UserBlockingEvent = 1;
+  var ContinuousEvent = 2;
+
+  var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
+  var _ReactInternals$Sched = ReactInternals$1.Scheduler,
+      unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback,
+      unstable_now = _ReactInternals$Sched.unstable_now,
+      unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback,
+      unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield,
+      unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint,
+      unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode,
+      unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority,
+      unstable_next = _ReactInternals$Sched.unstable_next,
+      unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution,
+      unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution,
+      unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel,
+      unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority,
+      unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority,
+      unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority,
+      unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority,
+      unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority,
+      unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate,
+      unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting;
+
+  // A reserved attribute.
+  // It is handled by React separately and shouldn't be written to the DOM.
+  var RESERVED = 0; // A simple string attribute.
+  // Attributes that aren't in the whitelist are presumed to have this type.
+
+  var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
+  // "enumerated" attributes with "true" and "false" as possible values.
+  // When true, it should be set to a "true" string.
+  // When false, it should be set to a "false" string.
+
+  var BOOLEANISH_STRING = 2; // A real boolean attribute.
+  // When true, it should be present (set either to an empty string or its name).
+  // When false, it should be omitted.
+
+  var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
+  // When true, it should be present (set either to an empty string or its name).
+  // When false, it should be omitted.
+  // For any other value, should be present with that value.
+
+  var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
+  // When falsy, it should be removed.
+
+  var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
+  // When falsy, it should be removed.
+
+  var POSITIVE_NUMERIC = 6;
+
+  /* eslint-disable max-len */
+  var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
+  /* eslint-enable max-len */
+
+  var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
+  var ROOT_ATTRIBUTE_NAME = 'data-reactroot';
+  var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var illegalAttributeNameCache = {};
+  var validatedAttributeNameCache = {};
+  function isAttributeNameSafe(attributeName) {
+    if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
+      return true;
     }
-  }
 
-  if (typeof type === 'function') {
-    return type.displayName || type.name || null;
-  }
+    if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
+      return false;
+    }
 
-  if (typeof type === 'string') {
-    return type;
-  }
+    if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
+      validatedAttributeNameCache[attributeName] = true;
+      return true;
+    }
 
-  switch (type) {
-    case REACT_FRAGMENT_TYPE:
-      return 'Fragment';
+    illegalAttributeNameCache[attributeName] = true;
 
-    case REACT_PORTAL_TYPE:
-      return 'Portal';
+    {
+      error('Invalid attribute name: `%s`', attributeName);
+    }
 
-    case REACT_PROFILER_TYPE:
-      return "Profiler";
+    return false;
+  }
+  function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
+    if (propertyInfo !== null) {
+      return propertyInfo.type === RESERVED;
+    }
 
-    case REACT_STRICT_MODE_TYPE:
-      return 'StrictMode';
+    if (isCustomComponentTag) {
+      return false;
+    }
 
-    case REACT_SUSPENSE_TYPE:
-      return 'Suspense';
+    if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
+      return true;
+    }
 
-    case REACT_SUSPENSE_LIST_TYPE:
-      return 'SuspenseList';
+    return false;
   }
+  function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
+    if (propertyInfo !== null && propertyInfo.type === RESERVED) {
+      return false;
+    }
 
-  if (typeof type === 'object') {
-    switch (type.$$typeof) {
-      case REACT_CONTEXT_TYPE:
-        return 'Context.Consumer';
-
-      case REACT_PROVIDER_TYPE:
-        return 'Context.Provider';
-
-      case REACT_FORWARD_REF_TYPE:
-        return getWrappedName(type, type.render, 'ForwardRef');
+    switch (typeof value) {
+      case 'function': // $FlowIssue symbol is perfectly valid here
 
-      case REACT_MEMO_TYPE:
-        return getComponentName(type.type);
+      case 'symbol':
+        // eslint-disable-line
+        return true;
 
-      case REACT_LAZY_TYPE:
+      case 'boolean':
         {
-          var thenable = type;
-          var resolvedThenable = refineResolvedLazyComponent(thenable);
-
-          if (resolvedThenable) {
-            return getComponentName(resolvedThenable);
+          if (isCustomComponentTag) {
+            return false;
           }
 
-          break;
+          if (propertyInfo !== null) {
+            return !propertyInfo.acceptsBooleans;
+          } else {
+            var prefix = name.toLowerCase().slice(0, 5);
+            return prefix !== 'data-' && prefix !== 'aria-';
+          }
         }
+
+      default:
+        return false;
     }
   }
+  function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
+    if (value === null || typeof value === 'undefined') {
+      return true;
+    }
 
-  return null;
-}
+    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
+      return true;
+    }
+
+    if (isCustomComponentTag) {
+      return false;
+    }
 
-var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
+    if (propertyInfo !== null) {
+      switch (propertyInfo.type) {
+        case BOOLEAN:
+          return !value;
 
-function describeFiber(fiber) {
-  switch (fiber.tag) {
-    case HostRoot:
-    case HostPortal:
-    case HostText:
-    case Fragment:
-    case ContextProvider:
-    case ContextConsumer:
-      return '';
+        case OVERLOADED_BOOLEAN:
+          return value === false;
 
-    default:
-      var owner = fiber._debugOwner;
-      var source = fiber._debugSource;
-      var name = getComponentName(fiber.type);
-      var ownerName = null;
+        case NUMERIC:
+          return isNaN(value);
 
-      if (owner) {
-        ownerName = getComponentName(owner.type);
+        case POSITIVE_NUMERIC:
+          return isNaN(value) || value < 1;
       }
+    }
 
-      return describeComponentFrame(name, source, ownerName);
+    return false;
   }
-}
-
-function getStackByFiberInDevAndProd(workInProgress) {
-  var info = '';
-  var node = workInProgress;
+  function getPropertyInfo(name) {
+    return properties.hasOwnProperty(name) ? properties[name] : null;
+  }
+
+  function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) {
+    this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
+    this.attributeName = attributeName;
+    this.attributeNamespace = attributeNamespace;
+    this.mustUseProperty = mustUseProperty;
+    this.propertyName = name;
+    this.type = type;
+    this.sanitizeURL = sanitizeURL;
+  } // When adding attributes to this list, be sure to also add them to
+  // the `possibleStandardNames` module to ensure casing and incorrect
+  // name warnings.
+
+
+  var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
+
+  var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
+  // elements (not just inputs). Now that ReactDOMInput assigns to the
+  // defaultValue property -- do we need this?
+  'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];
+
+  reservedProps.forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
+    name, // attributeName
+    null, // attributeNamespace
+    false);
+  }); // A few React string attributes have a different name.
+  // This is a mapping from React prop names to the attribute names.
+
+  [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
+    var name = _ref[0],
+        attributeName = _ref[1];
+    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
+    attributeName, // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These are "enumerated" HTML attributes that accept "true" and "false".
+  // In React, we let users pass `true` and `false` even though technically
+  // these aren't boolean attributes (they are coerced to strings).
+
+  ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
+    name.toLowerCase(), // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These are "enumerated" SVG attributes that accept "true" and "false".
+  // In React, we let users pass `true` and `false` even though technically
+  // these aren't boolean attributes (they are coerced to strings).
+  // Since these are SVG attributes, their attribute names are case-sensitive.
+
+  ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
+    name, // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These are HTML boolean attributes.
+
+  ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
+  // on the client side because the browsers are inconsistent. Instead we call focus().
+  'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
+  'itemScope'].forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
+    name.toLowerCase(), // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These are the few React props that we set as DOM properties
+  // rather than attributes. These are all booleans.
+
+  ['checked', // Note: `option.selected` is not updated if `select.multiple` is
+  // disabled with `removeAttribute`. We have special logic for handling this.
+  'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,
+  // you'll need to set attributeName to name.toLowerCase()
+  // instead in the assignment below.
+  ].forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
+    name, // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These are HTML attributes that are "overloaded booleans": they behave like
+  // booleans, but can also accept a string value.
+
+  ['capture', 'download' // NOTE: if you add a camelCased prop to this list,
+  // you'll need to set attributeName to name.toLowerCase()
+  // instead in the assignment below.
+  ].forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
+    name, // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These are HTML attributes that must be positive numbers.
+
+  ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,
+  // you'll need to set attributeName to name.toLowerCase()
+  // instead in the assignment below.
+  ].forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
+    name, // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These are HTML attributes that must be numbers.
+
+  ['rowSpan', 'start'].forEach(function (name) {
+    properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
+    name.toLowerCase(), // attributeName
+    null, // attributeNamespace
+    false);
+  });
+  var CAMELIZE = /[\-\:]([a-z])/g;
+
+  var capitalize = function (token) {
+    return token[1].toUpperCase();
+  }; // This is a list of all SVG attributes that need special casing, namespacing,
+  // or boolean value assignment. Regular attributes that just accept strings
+  // and have the same names are omitted, just like in the HTML whitelist.
+  // Some of these attributes can be hard to find. This list was created by
+  // scraping the MDN documentation.
+
+
+  ['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,
+  // you'll need to set attributeName to name.toLowerCase()
+  // instead in the assignment below.
+  ].forEach(function (attributeName) {
+    var name = attributeName.replace(CAMELIZE, capitalize);
+    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
+    attributeName, null, // attributeNamespace
+    false);
+  }); // String SVG attributes with the xlink namespace.
+
+  ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,
+  // you'll need to set attributeName to name.toLowerCase()
+  // instead in the assignment below.
+  ].forEach(function (attributeName) {
+    var name = attributeName.replace(CAMELIZE, capitalize);
+    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
+    attributeName, 'http://www.w3.org/1999/xlink', false);
+  }); // String SVG attributes with the xml namespace.
+
+  ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,
+  // you'll need to set attributeName to name.toLowerCase()
+  // instead in the assignment below.
+  ].forEach(function (attributeName) {
+    var name = attributeName.replace(CAMELIZE, capitalize);
+    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
+    attributeName, 'http://www.w3.org/XML/1998/namespace', false);
+  }); // These attribute exists both in HTML and SVG.
+  // The attribute name is case-sensitive in SVG so we can't just use
+  // the React name like we do for attributes that exist only in HTML.
+
+  ['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
+    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
+    attributeName.toLowerCase(), // attributeName
+    null, // attributeNamespace
+    false);
+  }); // These attributes accept URLs. These must not allow javascript: URLS.
+  // These will also need to accept Trusted Types object in the future.
+
+  var xlinkHref = 'xlinkHref';
+  properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
+  'xlink:href', 'http://www.w3.org/1999/xlink', true);
+  ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
+    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
+    attributeName.toLowerCase(), // attributeName
+    null, // attributeNamespace
+    true);
+  });
 
-  do {
-    info += describeFiber(node);
-    node = node.return;
-  } while (node);
+  var ReactDebugCurrentFrame = null;
 
-  return info;
-}
-var current = null;
-var phase = null;
-function getCurrentFiberOwnerNameInDevOrNull() {
   {
-    if (current === null) {
-      return null;
-    }
+    ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
+  } // A javascript: URL can contain leading C0 control or \u0020 SPACE,
+  // and any newline or tab are filtered out as if they're not part of the URL.
+  // https://url.spec.whatwg.org/#url-parsing
+  // Tab or newline are defined as \r\n\t:
+  // https://infra.spec.whatwg.org/#ascii-tab-or-newline
+  // A C0 control is a code point in the range \u0000 NULL to \u001F
+  // INFORMATION SEPARATOR ONE, inclusive:
+  // https://infra.spec.whatwg.org/#c0-control-or-space
+
+  /* eslint-disable max-len */
 
-    var owner = current._debugOwner;
 
-    if (owner !== null && typeof owner !== 'undefined') {
-      return getComponentName(owner.type);
+  var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;
+  var didWarn = false;
+
+  function sanitizeURL(url) {
+    {
+      if (!didWarn && isJavaScriptProtocol.test(url)) {
+        didWarn = true;
+
+        error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));
+      }
     }
   }
 
-  return null;
-}
-function getCurrentFiberStackInDev() {
-  {
-    if (current === null) {
-      return '';
-    } // Safe because if current fiber exists, we are reconciling,
-    // and it is guaranteed to be the work-in-progress version.
+  /**
+   * Get the value for a property on a node. Only used in DEV for SSR validation.
+   * The "expected" argument is used as a hint of what the expected value is.
+   * Some properties have multiple equivalent values.
+   */
+  function getValueForProperty(node, name, expected, propertyInfo) {
+    {
+      if (propertyInfo.mustUseProperty) {
+        var propertyName = propertyInfo.propertyName;
+        return node[propertyName];
+      } else {
+        if ( propertyInfo.sanitizeURL) {
+          // If we haven't fully disabled javascript: URLs, and if
+          // the hydration is successful of a javascript: URL, we
+          // still want to warn on the client.
+          sanitizeURL('' + expected);
+        }
 
+        var attributeName = propertyInfo.attributeName;
+        var stringValue = null;
 
-    return getStackByFiberInDevAndProd(current);
-  }
+        if (propertyInfo.type === OVERLOADED_BOOLEAN) {
+          if (node.hasAttribute(attributeName)) {
+            var value = node.getAttribute(attributeName);
 
-  return '';
-}
-function resetCurrentFiber() {
-  {
-    ReactDebugCurrentFrame.getCurrentStack = null;
-    current = null;
-    phase = null;
-  }
-}
-function setCurrentFiber(fiber) {
-  {
-    ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackInDev;
-    current = fiber;
-    phase = null;
-  }
-}
-function setCurrentPhase(lifeCyclePhase) {
-  {
-    phase = lifeCyclePhase;
-  }
-}
+            if (value === '') {
+              return true;
+            }
 
-var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
+            if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
+              return value;
+            }
 
-function endsWith(subject, search) {
-  var length = subject.length;
-  return subject.substring(length - search.length, length) === search;
-}
+            if (value === '' + expected) {
+              return expected;
+            }
 
-var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
-var _assign = ReactInternals.assign;
+            return value;
+          }
+        } else if (node.hasAttribute(attributeName)) {
+          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
+            // We had an attribute but shouldn't have had one, so read it
+            // for the error message.
+            return node.getAttribute(attributeName);
+          }
 
-var PLUGIN_EVENT_SYSTEM = 1;
-var RESPONDER_EVENT_SYSTEM = 1 << 1;
-var IS_PASSIVE = 1 << 2;
-var IS_ACTIVE = 1 << 3;
-var PASSIVE_NOT_SUPPORTED = 1 << 4;
-var IS_REPLAYED = 1 << 5;
+          if (propertyInfo.type === BOOLEAN) {
+            // If this was a boolean, it doesn't matter what the value is
+            // the fact that we have it is the same as the expected.
+            return expected;
+          } // Even if this property uses a namespace we use getAttribute
+          // because we assume its namespaced name is the same as our config.
+          // To use getAttributeNS we need the local name which we don't have
+          // in our config atm.
 
-var restoreImpl = null;
-var restoreTarget = null;
-var restoreQueue = null;
 
-function restoreStateOfTarget(target) {
-  // We perform this translation at the end of the event loop so that we
-  // always receive the correct fiber here
-  var internalInstance = getInstanceFromNode(target);
+          stringValue = node.getAttribute(attributeName);
+        }
 
-  if (!internalInstance) {
-    // Unmounted
-    return;
+        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
+          return stringValue === null ? expected : stringValue;
+        } else if (stringValue === '' + expected) {
+          return expected;
+        } else {
+          return stringValue;
+        }
+      }
+    }
   }
+  /**
+   * Get the value for a attribute on a node. Only used in DEV for SSR validation.
+   * The third argument is used as a hint of what the expected value is. Some
+   * attributes have multiple equivalent values.
+   */
 
-  if (!(typeof restoreImpl === 'function')) {
+  function getValueForAttribute(node, name, expected) {
     {
-      throw Error("setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.");
-    }
-  }
+      if (!isAttributeNameSafe(name)) {
+        return;
+      }
 
-  var props = getFiberCurrentPropsFromNode(internalInstance.stateNode);
-  restoreImpl(internalInstance.stateNode, internalInstance.type, props);
-}
+      if (!node.hasAttribute(name)) {
+        return expected === undefined ? undefined : null;
+      }
 
-function setRestoreImplementation(impl) {
-  restoreImpl = impl;
-}
-function enqueueStateRestore(target) {
-  if (restoreTarget) {
-    if (restoreQueue) {
-      restoreQueue.push(target);
-    } else {
-      restoreQueue = [target];
-    }
-  } else {
-    restoreTarget = target;
-  }
-}
-function needsStateRestore() {
-  return restoreTarget !== null || restoreQueue !== null;
-}
-function restoreStateIfNeeded() {
-  if (!restoreTarget) {
-    return;
-  }
+      var value = node.getAttribute(name);
 
-  var target = restoreTarget;
-  var queuedTargets = restoreQueue;
-  restoreTarget = null;
-  restoreQueue = null;
-  restoreStateOfTarget(target);
+      if (value === '' + expected) {
+        return expected;
+      }
 
-  if (queuedTargets) {
-    for (var i = 0; i < queuedTargets.length; i++) {
-      restoreStateOfTarget(queuedTargets[i]);
+      return value;
     }
   }
-}
-
-var enableUserTimingAPI = true; // Helps identify side effects in render-phase lifecycle hooks and setState
-// reducers by double invoking them in Strict Mode.
+  /**
+   * Sets the value for a property on a node.
+   *
+   * @param {DOMElement} node
+   * @param {string} name
+   * @param {*} value
+   */
 
-var debugRenderPhaseSideEffectsForStrictMode = true; // To preserve the "Pause on caught exceptions" behavior of the debugger, we
-// replay the begin phase of a failed component inside invokeGuardedCallback.
+  function setValueForProperty(node, name, value, isCustomComponentTag) {
+    var propertyInfo = getPropertyInfo(name);
 
-var replayFailedUnitOfWorkWithInvokeGuardedCallback = true; // Warn about deprecated, async-unsafe lifecycles; relates to RFC #6:
+    if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {
+      return;
+    }
 
-var warnAboutDeprecatedLifecycles = true; // Gather advanced timing metrics for Profiler subtrees.
+    if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {
+      value = null;
+    } // If the prop isn't in the special list, treat it as a simple attribute.
 
-var enableProfilerTimer = true; // Trace which interactions trigger each commit.
 
-var enableSchedulerTracing = true; // SSR experiments
+    if (isCustomComponentTag || propertyInfo === null) {
+      if (isAttributeNameSafe(name)) {
+        var _attributeName = name;
 
-var enableSuspenseServerRenderer = false;
-var enableSelectiveHydration = false; // Only used in www builds.
+        if (value === null) {
+          node.removeAttribute(_attributeName);
+        } else {
+          node.setAttribute(_attributeName,  '' + value);
+        }
+      }
 
- // Only used in www builds.
+      return;
+    }
 
- // Disable javascript: URL strings in href for XSS protection.
+    var mustUseProperty = propertyInfo.mustUseProperty;
 
-var disableJavaScriptURLs = false; // React Fire: prevent the value and checked attributes from syncing
-// with their related DOM properties
+    if (mustUseProperty) {
+      var propertyName = propertyInfo.propertyName;
 
-var disableInputAttributeSyncing = false; // These APIs will no longer be "unstable" in the upcoming 16.7 release,
-// Control this behavior with a flag to support 16.6 minor releases in the meanwhile.
+      if (value === null) {
+        var type = propertyInfo.type;
+        node[propertyName] = type === BOOLEAN ? false : '';
+      } else {
+        // Contrary to `setAttribute`, object properties are properly
+        // `toString`ed by IE8/9.
+        node[propertyName] = value;
+      }
 
-var exposeConcurrentModeAPIs = false;
-var warnAboutShorthandPropertyCollision = false; // Experimental React Flare event system and event components support.
+      return;
+    } // The rest are treated as attributes with special cases.
 
-var enableFlareAPI = false; // Experimental Host Component support.
 
-var enableFundamentalAPI = false; // Experimental Scope support.
+    var attributeName = propertyInfo.attributeName,
+        attributeNamespace = propertyInfo.attributeNamespace;
 
-var enableScopeAPI = false; // New API for JSX transforms to target - https://github.com/reactjs/rfcs/pull/107
+    if (value === null) {
+      node.removeAttribute(attributeName);
+    } else {
+      var _type = propertyInfo.type;
+      var attributeValue;
 
- // We will enforce mocking scheduler with scheduler/unstable_mock at some point. (v17?)
-// Till then, we warn about the missing mock, but still fallback to a legacy mode compatible version
+      if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {
+        // If attribute type is boolean, we know for sure it won't be an execution sink
+        // and we won't require Trusted Type here.
+        attributeValue = '';
+      } else {
+        // `setAttribute` with objects becomes only `[object]` in IE8/9,
+        // ('' + value) makes it output the correct toString()-value.
+        {
+          attributeValue = '' + value;
+        }
 
-var warnAboutUnmockedScheduler = false; // For tests, we flush suspense fallbacks in an act scope;
-// *except* in some of our own tests, where we test incremental loading states.
+        if (propertyInfo.sanitizeURL) {
+          sanitizeURL(attributeValue.toString());
+        }
+      }
 
-var flushSuspenseFallbacksInTests = true; // Add a callback property to suspense to notify which promises are currently
-// in the update queue. This allows reporting and tracing of what is causing
-// the user to see a loading state.
-// Also allows hydration callbacks to fire when a dehydrated boundary gets
-// hydrated or deleted.
+      if (attributeNamespace) {
+        node.setAttributeNS(attributeNamespace, attributeName, attributeValue);
+      } else {
+        node.setAttribute(attributeName, attributeValue);
+      }
+    }
+  }
 
-var enableSuspenseCallback = false; // Part of the simplification of React.createElement so we can eventually move
-// from React.createElement to React.jsx
-// https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md
+  var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
+  function describeComponentFrame (name, source, ownerName) {
+    var sourceInfo = '';
 
-var warnAboutDefaultPropsOnFunctionComponents = false;
-var warnAboutStringRefs = false;
-var disableLegacyContext = false;
-var disableSchedulerTimeoutBasedOnReactExpirationTime = false;
-var enableTrustedTypesIntegration = false; // Flag to turn event.target and event.currentTarget in ReactNative from a reactTag to a component instance
+    if (source) {
+      var path = source.fileName;
+      var fileName = path.replace(BEFORE_SLASH_RE, '');
 
-// the renderer. Such as when we're dispatching events or if third party
-// libraries need to call batchedUpdates. Eventually, this API will go away when
-// everything is batched by default. We'll then have a similar API to opt-out of
-// scheduled work and instead do synchronous work.
-// Defaults
+      {
+        // In DEV, include code for a common special case:
+        // prefer "folder/index.js" instead of just "index.js".
+        if (/^index\./.test(fileName)) {
+          var match = path.match(BEFORE_SLASH_RE);
 
-var batchedUpdatesImpl = function (fn, bookkeeping) {
-  return fn(bookkeeping);
-};
+          if (match) {
+            var pathBeforeSlash = match[1];
 
-var discreteUpdatesImpl = function (fn, a, b, c) {
-  return fn(a, b, c);
-};
+            if (pathBeforeSlash) {
+              var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
+              fileName = folderName + '/' + fileName;
+            }
+          }
+        }
+      }
 
-var flushDiscreteUpdatesImpl = function () {};
+      sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
+    } else if (ownerName) {
+      sourceInfo = ' (created by ' + ownerName + ')';
+    }
+
+    return '\n    in ' + (name || 'Unknown') + sourceInfo;
+  }
+
+  // The Symbol used to tag the ReactElement-like types. If there is no native Symbol
+  // nor polyfill, then a plain number is used for performance.
+  var hasSymbol = typeof Symbol === 'function' && Symbol.for;
+  var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
+  var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
+  var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
+  var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
+  var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
+  var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
+  var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
+  var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
+  var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
+  var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
+  var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
+  var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
+  var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
+  var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;
+  var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
+  var FAUX_ITERATOR_SYMBOL = '@@iterator';
+  function getIteratorFn(maybeIterable) {
+    if (maybeIterable === null || typeof maybeIterable !== 'object') {
+      return null;
+    }
 
-var batchedEventUpdatesImpl = batchedUpdatesImpl;
-var isInsideEventHandler = false;
-var isBatchingEventUpdates = false;
+    var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
 
-function finishEventHandler() {
-  // Here we wait until all updates have propagated, which is important
-  // when using controlled components within layers:
-  // https://github.com/facebook/react/issues/1698
-  // Then we restore state of any controlled component.
-  var controlledComponentsHavePendingUpdates = needsStateRestore();
+    if (typeof maybeIterator === 'function') {
+      return maybeIterator;
+    }
 
-  if (controlledComponentsHavePendingUpdates) {
-    // If a controlled event was fired, we may need to restore the state of
-    // the DOM node back to the controlled value. This is necessary when React
-    // bails out of the update without touching the DOM.
-    flushDiscreteUpdatesImpl();
-    restoreStateIfNeeded();
+    return null;
   }
-}
 
-function batchedUpdates(fn, bookkeeping) {
-  if (isInsideEventHandler) {
-    // If we are currently inside another batch, we need to wait until it
-    // fully completes before restoring state.
-    return fn(bookkeeping);
+  var Uninitialized = -1;
+  var Pending = 0;
+  var Resolved = 1;
+  var Rejected = 2;
+  function refineResolvedLazyComponent(lazyComponent) {
+    return lazyComponent._status === Resolved ? lazyComponent._result : null;
   }
+  function initializeLazyComponentType(lazyComponent) {
+    if (lazyComponent._status === Uninitialized) {
+      lazyComponent._status = Pending;
+      var ctor = lazyComponent._ctor;
+      var thenable = ctor();
+      lazyComponent._result = thenable;
+      thenable.then(function (moduleObject) {
+        if (lazyComponent._status === Pending) {
+          var defaultExport = moduleObject.default;
 
-  isInsideEventHandler = true;
+          {
+            if (defaultExport === undefined) {
+              error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n  ' + "const MyComponent = lazy(() => import('./MyComponent'))", moduleObject);
+            }
+          }
 
-  try {
-    return batchedUpdatesImpl(fn, bookkeeping);
-  } finally {
-    isInsideEventHandler = false;
-    finishEventHandler();
-  }
-}
-function batchedEventUpdates(fn, a, b) {
-  if (isBatchingEventUpdates) {
-    // If we are currently inside another batch, we need to wait until it
-    // fully completes before restoring state.
-    return fn(a, b);
-  }
-
-  isBatchingEventUpdates = true;
+          lazyComponent._status = Resolved;
+          lazyComponent._result = defaultExport;
+        }
+      }, function (error) {
+        if (lazyComponent._status === Pending) {
+          lazyComponent._status = Rejected;
+          lazyComponent._result = error;
+        }
+      });
+    }
+  }
 
-  try {
-    return batchedEventUpdatesImpl(fn, a, b);
-  } finally {
-    isBatchingEventUpdates = false;
-    finishEventHandler();
+  function getWrappedName(outerType, innerType, wrapperName) {
+    var functionName = innerType.displayName || innerType.name || '';
+    return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
   }
-} // This is for the React Flare event system
 
-function executeUserEventHandler(fn, value) {
-  var previouslyInEventHandler = isInsideEventHandler;
+  function getComponentName(type) {
+    if (type == null) {
+      // Host root, text node or just invalid type.
+      return null;
+    }
 
-  try {
-    isInsideEventHandler = true;
-    var type = typeof value === 'object' && value !== null ? value.type : '';
-    invokeGuardedCallbackAndCatchFirstError(type, fn, undefined, value);
-  } finally {
-    isInsideEventHandler = previouslyInEventHandler;
-  }
-}
-function discreteUpdates(fn, a, b, c) {
-  var prevIsInsideEventHandler = isInsideEventHandler;
-  isInsideEventHandler = true;
-
-  try {
-    return discreteUpdatesImpl(fn, a, b, c);
-  } finally {
-    isInsideEventHandler = prevIsInsideEventHandler;
-
-    if (!isInsideEventHandler) {
-      finishEventHandler();
+    {
+      if (typeof type.tag === 'number') {
+        error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
+      }
     }
-  }
-}
-var lastFlushedEventTimeStamp = 0;
-function flushDiscreteUpdatesIfNeeded(timeStamp) {
-  // event.timeStamp isn't overly reliable due to inconsistencies in
-  // how different browsers have historically provided the time stamp.
-  // Some browsers provide high-resolution time stamps for all events,
-  // some provide low-resolution time stamps for all events. FF < 52
-  // even mixes both time stamps together. Some browsers even report
-  // negative time stamps or time stamps that are 0 (iOS9) in some cases.
-  // Given we are only comparing two time stamps with equality (!==),
-  // we are safe from the resolution differences. If the time stamp is 0
-  // we bail-out of preventing the flush, which can affect semantics,
-  // such as if an earlier flush removes or adds event listeners that
-  // are fired in the subsequent flush. However, this is the same
-  // behaviour as we had before this change, so the risks are low.
-  if (!isInsideEventHandler && (!enableFlareAPI || timeStamp === 0 || lastFlushedEventTimeStamp !== timeStamp)) {
-    lastFlushedEventTimeStamp = timeStamp;
-    flushDiscreteUpdatesImpl();
-  }
-}
-function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) {
-  batchedUpdatesImpl = _batchedUpdatesImpl;
-  discreteUpdatesImpl = _discreteUpdatesImpl;
-  flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl;
-  batchedEventUpdatesImpl = _batchedEventUpdatesImpl;
-}
-
-var DiscreteEvent = 0;
-var UserBlockingEvent = 1;
-var ContinuousEvent = 2;
-
-var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
-var _ReactInternals$Sched = ReactInternals$1.Scheduler;
-var unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback;
-var unstable_now = _ReactInternals$Sched.unstable_now;
-var unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback;
-var unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield;
-var unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint;
-var unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode;
-var unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority;
-var unstable_next = _ReactInternals$Sched.unstable_next;
-var unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution;
-var unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution;
-var unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel;
-var unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority;
-var unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority;
-var unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority;
-var unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority;
-var unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority;
-var unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate;
-var unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting;
-
-// CommonJS interop named imports.
-
-var UserBlockingPriority = unstable_UserBlockingPriority;
-var runWithPriority = unstable_runWithPriority;
-var listenToResponderEventTypesImpl;
-function setListenToResponderEventTypes(_listenToResponderEventTypesImpl) {
-  listenToResponderEventTypesImpl = _listenToResponderEventTypesImpl;
-}
-var rootEventTypesToEventResponderInstances = new Map();
-var DoNotPropagateToNextResponder = 0;
-var PropagateToNextResponder = 1;
-var currentTimeStamp = 0;
-var currentInstance = null;
-var currentDocument = null;
-var currentPropagationBehavior = DoNotPropagateToNextResponder;
-var eventResponderContext = {
-  dispatchEvent: function (eventValue, eventListener, eventPriority) {
-    validateResponderContext();
-    validateEventValue(eventValue);
-
-    switch (eventPriority) {
-      case DiscreteEvent:
-        {
-          flushDiscreteUpdatesIfNeeded(currentTimeStamp);
-          discreteUpdates(function () {
-            return executeUserEventHandler(eventListener, eventValue);
-          });
-          break;
-        }
 
-      case UserBlockingEvent:
-        {
-          runWithPriority(UserBlockingPriority, function () {
-            return executeUserEventHandler(eventListener, eventValue);
-          });
-          break;
-        }
+    if (typeof type === 'function') {
+      return type.displayName || type.name || null;
+    }
 
-      case ContinuousEvent:
-        {
-          executeUserEventHandler(eventListener, eventValue);
-          break;
-        }
+    if (typeof type === 'string') {
+      return type;
     }
-  },
-  isTargetWithinResponder: function (target) {
-    validateResponderContext();
 
-    if (target != null) {
-      var fiber = getClosestInstanceFromNode(target);
-      var responderFiber = currentInstance.fiber;
+    switch (type) {
+      case REACT_FRAGMENT_TYPE:
+        return 'Fragment';
 
-      while (fiber !== null) {
-        if (fiber === responderFiber || fiber.alternate === responderFiber) {
-          return true;
-        }
+      case REACT_PORTAL_TYPE:
+        return 'Portal';
 
-        fiber = fiber.return;
-      }
-    }
+      case REACT_PROFILER_TYPE:
+        return "Profiler";
 
-    return false;
-  },
-  isTargetWithinResponderScope: function (target) {
-    validateResponderContext();
-    var componentInstance = currentInstance;
-    var responder = componentInstance.responder;
-
-    if (target != null) {
-      var fiber = getClosestInstanceFromNode(target);
-      var responderFiber = currentInstance.fiber;
-
-      while (fiber !== null) {
-        if (fiber === responderFiber || fiber.alternate === responderFiber) {
-          return true;
-        }
+      case REACT_STRICT_MODE_TYPE:
+        return 'StrictMode';
 
-        if (doesFiberHaveResponder(fiber, responder)) {
-          return false;
-        }
+      case REACT_SUSPENSE_TYPE:
+        return 'Suspense';
 
-        fiber = fiber.return;
-      }
+      case REACT_SUSPENSE_LIST_TYPE:
+        return 'SuspenseList';
     }
 
-    return false;
-  },
-  isTargetWithinNode: function (childTarget, parentTarget) {
-    validateResponderContext();
-    var childFiber = getClosestInstanceFromNode(childTarget);
-    var parentFiber = getClosestInstanceFromNode(parentTarget);
+    if (typeof type === 'object') {
+      switch (type.$$typeof) {
+        case REACT_CONTEXT_TYPE:
+          return 'Context.Consumer';
 
-    if (childFiber != null && parentFiber != null) {
-      var parentAlternateFiber = parentFiber.alternate;
-      var node = childFiber;
+        case REACT_PROVIDER_TYPE:
+          return 'Context.Provider';
 
-      while (node !== null) {
-        if (node === parentFiber || node === parentAlternateFiber) {
-          return true;
-        }
+        case REACT_FORWARD_REF_TYPE:
+          return getWrappedName(type, type.render, 'ForwardRef');
 
-        node = node.return;
+        case REACT_MEMO_TYPE:
+          return getComponentName(type.type);
+
+        case REACT_BLOCK_TYPE:
+          return getComponentName(type.render);
+
+        case REACT_LAZY_TYPE:
+          {
+            var thenable = type;
+            var resolvedThenable = refineResolvedLazyComponent(thenable);
+
+            if (resolvedThenable) {
+              return getComponentName(resolvedThenable);
+            }
+
+            break;
+          }
       }
+    }
 
-      return false;
-    } // Fallback to DOM APIs
+    return null;
+  }
+
+  var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
+
+  function describeFiber(fiber) {
+    switch (fiber.tag) {
+      case HostRoot:
+      case HostPortal:
+      case HostText:
+      case Fragment:
+      case ContextProvider:
+      case ContextConsumer:
+        return '';
 
+      default:
+        var owner = fiber._debugOwner;
+        var source = fiber._debugSource;
+        var name = getComponentName(fiber.type);
+        var ownerName = null;
 
-    return parentTarget.contains(childTarget);
-  },
-  addRootEventTypes: function (rootEventTypes) {
-    validateResponderContext();
-    listenToResponderEventTypesImpl(rootEventTypes, currentDocument);
+        if (owner) {
+          ownerName = getComponentName(owner.type);
+        }
 
-    for (var i = 0; i < rootEventTypes.length; i++) {
-      var rootEventType = rootEventTypes[i];
-      var eventResponderInstance = currentInstance;
-      registerRootEventType(rootEventType, eventResponderInstance);
+        return describeComponentFrame(name, source, ownerName);
     }
-  },
-  removeRootEventTypes: function (rootEventTypes) {
-    validateResponderContext();
+  }
 
-    for (var i = 0; i < rootEventTypes.length; i++) {
-      var rootEventType = rootEventTypes[i];
-      var rootEventResponders = rootEventTypesToEventResponderInstances.get(rootEventType);
-      var rootEventTypesSet = currentInstance.rootEventTypes;
+  function getStackByFiberInDevAndProd(workInProgress) {
+    var info = '';
+    var node = workInProgress;
+
+    do {
+      info += describeFiber(node);
+      node = node.return;
+    } while (node);
 
-      if (rootEventTypesSet !== null) {
-        rootEventTypesSet.delete(rootEventType);
+    return info;
+  }
+  var current = null;
+  var isRendering = false;
+  function getCurrentFiberOwnerNameInDevOrNull() {
+    {
+      if (current === null) {
+        return null;
       }
 
-      if (rootEventResponders !== undefined) {
-        rootEventResponders.delete(currentInstance);
+      var owner = current._debugOwner;
+
+      if (owner !== null && typeof owner !== 'undefined') {
+        return getComponentName(owner.type);
       }
     }
-  },
-  getActiveDocument: getActiveDocument,
-  objectAssign: _assign,
-  getTimeStamp: function () {
-    validateResponderContext();
-    return currentTimeStamp;
-  },
-  isTargetWithinHostComponent: function (target, elementType) {
-    validateResponderContext();
-    var fiber = getClosestInstanceFromNode(target);
 
-    while (fiber !== null) {
-      if (fiber.tag === HostComponent && fiber.type === elementType) {
-        return true;
-      }
+    return null;
+  }
+  function getCurrentFiberStackInDev() {
+    {
+      if (current === null) {
+        return '';
+      } // Safe because if current fiber exists, we are reconciling,
+      // and it is guaranteed to be the work-in-progress version.
 
-      fiber = fiber.return;
-    }
 
-    return false;
-  },
-  continuePropagation: function () {
-    currentPropagationBehavior = PropagateToNextResponder;
-  },
-  enqueueStateRestore: enqueueStateRestore,
-  getResponderNode: function () {
-    validateResponderContext();
-    var responderFiber = currentInstance.fiber;
-
-    if (responderFiber.tag === ScopeComponent) {
-      return null;
+      return getStackByFiberInDevAndProd(current);
+    }
+  }
+  function resetCurrentFiber() {
+    {
+      ReactDebugCurrentFrame$1.getCurrentStack = null;
+      current = null;
+      isRendering = false;
+    }
+  }
+  function setCurrentFiber(fiber) {
+    {
+      ReactDebugCurrentFrame$1.getCurrentStack = getCurrentFiberStackInDev;
+      current = fiber;
+      isRendering = false;
+    }
+  }
+  function setIsRendering(rendering) {
+    {
+      isRendering = rendering;
     }
-
-    return responderFiber.stateNode;
   }
-};
 
-function validateEventValue(eventValue) {
-  if (typeof eventValue === 'object' && eventValue !== null) {
-    var target = eventValue.target,
-        type = eventValue.type,
-        timeStamp = eventValue.timeStamp;
+  // Flow does not allow string concatenation of most non-string types. To work
+  // around this limitation, we use an opaque type that can only be obtained by
+  // passing the value through getToStringValue first.
+  function toString(value) {
+    return '' + value;
+  }
+  function getToStringValue(value) {
+    switch (typeof value) {
+      case 'boolean':
+      case 'number':
+      case 'object':
+      case 'string':
+      case 'undefined':
+        return value;
 
-    if (target == null || type == null || timeStamp == null) {
-      throw new Error('context.dispatchEvent: "target", "timeStamp", and "type" fields on event object are required.');
+      default:
+        // function, symbol are assigned as empty strings
+        return '';
     }
+  }
 
-    var showWarning = function (name) {
-      {
-        warning$1(false, '%s is not available on event objects created from event responder modules (React Flare). ' + 'Try wrapping in a conditional, i.e. `if (event.type !== "press") { event.%s }`', name, name);
-      }
-    };
+  /**
+   * Copyright (c) 2013-present, Facebook, Inc.
+   *
+   * This source code is licensed under the MIT license found in the
+   * LICENSE file in the root directory of this source tree.
+   */
 
-    eventValue.isDefaultPrevented = function () {
-      {
-        showWarning('isDefaultPrevented()');
-      }
-    };
+  var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
 
-    eventValue.isPropagationStopped = function () {
-      {
-        showWarning('isPropagationStopped()');
-      }
-    }; // $FlowFixMe: we don't need value, Flow thinks we do
+  var ReactPropTypesSecret_1 = ReactPropTypesSecret;
 
+  var printWarning$1 = function() {};
 
-    Object.defineProperty(eventValue, 'nativeEvent', {
-      get: function () {
-        {
-          showWarning('nativeEvent');
-        }
+  {
+    var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;
+    var loggedTypeFailures = {};
+    var has = Function.call.bind(Object.prototype.hasOwnProperty);
+
+    printWarning$1 = function(text) {
+      var message = 'Warning: ' + text;
+      if (typeof console !== 'undefined') {
+        console.error(message);
       }
-    });
+      try {
+        // --- Welcome to debugging React ---
+        // This error was thrown as a convenience so that you can use this stack
+        // to find the callsite that caused this warning to fire.
+        throw new Error(message);
+      } catch (x) {}
+    };
   }
-}
 
-function doesFiberHaveResponder(fiber, responder) {
-  var tag = fiber.tag;
-
-  if (tag === HostComponent || tag === ScopeComponent) {
-    var dependencies = fiber.dependencies;
+  /**
+   * Assert that the values match with the type specs.
+   * Error messages are memorized and will only be shown once.
+   *
+   * @param {object} typeSpecs Map of name to a ReactPropType
+   * @param {object} values Runtime values that need to be type-checked
+   * @param {string} location e.g. "prop", "context", "child context"
+   * @param {string} componentName Name of the component for error messages.
+   * @param {?Function} getStack Returns the component stack.
+   * @private
+   */
+  function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
+    {
+      for (var typeSpecName in typeSpecs) {
+        if (has(typeSpecs, typeSpecName)) {
+          var error;
+          // Prop type validation may throw. In case they do, we don't want to
+          // fail the render phase where it didn't fail before. So we log it.
+          // After these have been cleaned up, we'll let them throw.
+          try {
+            // This is intentionally an invariant that gets caught. It's the same
+            // behavior as without this statement except with a better message.
+            if (typeof typeSpecs[typeSpecName] !== 'function') {
+              var err = Error(
+                (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
+                'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
+              );
+              err.name = 'Invariant Violation';
+              throw err;
+            }
+            error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);
+          } catch (ex) {
+            error = ex;
+          }
+          if (error && !(error instanceof Error)) {
+            printWarning$1(
+              (componentName || 'React class') + ': type specification of ' +
+              location + ' `' + typeSpecName + '` is invalid; the type checker ' +
+              'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
+              'You may have forgotten to pass an argument to the type checker ' +
+              'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
+              'shape all require an argument).'
+            );
+          }
+          if (error instanceof Error && !(error.message in loggedTypeFailures)) {
+            // Only monitor this failure once because there tends to be a lot of the
+            // same error.
+            loggedTypeFailures[error.message] = true;
 
-    if (dependencies !== null) {
-      var respondersMap = dependencies.responders;
+            var stack = getStack ? getStack() : '';
 
-      if (respondersMap !== null && respondersMap.has(responder)) {
-        return true;
+            printWarning$1(
+              'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
+            );
+          }
+        }
       }
     }
   }
 
-  return false;
-}
-
-function getActiveDocument() {
-  return currentDocument;
-}
-
-function createDOMResponderEvent(topLevelType, nativeEvent, nativeEventTarget, passive, passiveSupported) {
-  var _ref = nativeEvent,
-      buttons = _ref.buttons,
-      pointerType = _ref.pointerType;
-  var eventPointerType = '';
+  /**
+   * Resets warning cache when testing.
+   *
+   * @private
+   */
+  checkPropTypes.resetWarningCache = function() {
+    {
+      loggedTypeFailures = {};
+    }
+  };
 
-  if (pointerType !== undefined) {
-    eventPointerType = pointerType;
-  } else if (nativeEvent.key !== undefined) {
-    eventPointerType = 'keyboard';
-  } else if (buttons !== undefined) {
-    eventPointerType = 'mouse';
-  } else if (nativeEvent.changedTouches !== undefined) {
-    eventPointerType = 'touch';
-  }
+  var checkPropTypes_1 = checkPropTypes;
 
-  return {
-    nativeEvent: nativeEvent,
-    passive: passive,
-    passiveSupported: passiveSupported,
-    pointerType: eventPointerType,
-    target: nativeEventTarget,
-    type: topLevelType
+  var ReactDebugCurrentFrame$2 = null;
+  var ReactControlledValuePropTypes = {
+    checkPropTypes: null
   };
-}
 
-function responderEventTypesContainType(eventTypes, type) {
-  for (var i = 0, len = eventTypes.length; i < len; i++) {
-    if (eventTypes[i] === type) {
-      return true;
-    }
-  }
+  {
+    ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;
+    var hasReadOnlyValue = {
+      button: true,
+      checkbox: true,
+      image: true,
+      hidden: true,
+      radio: true,
+      reset: true,
+      submit: true
+    };
+    var propTypes = {
+      value: function (props, propName, componentName) {
+        if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {
+          return null;
+        }
 
-  return false;
-}
+        return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
+      },
+      checked: function (props, propName, componentName) {
+        if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {
+          return null;
+        }
 
-function validateResponderTargetEventTypes(eventType, responder) {
-  var targetEventTypes = responder.targetEventTypes; // Validate the target event type exists on the responder
+        return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
+      }
+    };
+    /**
+     * Provide a linked `value` attribute for controlled forms. You should not use
+     * this outside of the ReactDOM controlled form components.
+     */
 
-  if (targetEventTypes !== null) {
-    return responderEventTypesContainType(targetEventTypes, eventType);
+    ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {
+      checkPropTypes_1(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum);
+    };
   }
 
-  return false;
-}
+  function isCheckable(elem) {
+    var type = elem.type;
+    var nodeName = elem.nodeName;
+    return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
+  }
 
-function traverseAndHandleEventResponderInstances(topLevelType, targetFiber, nativeEvent, nativeEventTarget, eventSystemFlags) {
-  var isPassiveEvent = (eventSystemFlags & IS_PASSIVE) !== 0;
-  var isPassiveSupported = (eventSystemFlags & PASSIVE_NOT_SUPPORTED) === 0;
-  var isPassive = isPassiveEvent || !isPassiveSupported;
-  var eventType = isPassive ? topLevelType : topLevelType + '_active'; // Trigger event responders in this order:
-  // - Bubble target responder phase
-  // - Root responder phase
+  function getTracker(node) {
+    return node._valueTracker;
+  }
 
-  var visitedResponders = new Set();
-  var responderEvent = createDOMResponderEvent(topLevelType, nativeEvent, nativeEventTarget, isPassiveEvent, isPassiveSupported);
-  var node = targetFiber;
-  var insidePortal = false;
+  function detachTracker(node) {
+    node._valueTracker = null;
+  }
 
-  while (node !== null) {
-    var _node = node,
-        dependencies = _node.dependencies,
-        tag = _node.tag;
+  function getValueFromNode(node) {
+    var value = '';
 
-    if (tag === HostPortal) {
-      insidePortal = true;
-    } else if ((tag === HostComponent || tag === ScopeComponent) && dependencies !== null) {
-      var respondersMap = dependencies.responders;
+    if (!node) {
+      return value;
+    }
 
-      if (respondersMap !== null) {
-        var responderInstances = Array.from(respondersMap.values());
+    if (isCheckable(node)) {
+      value = node.checked ? 'true' : 'false';
+    } else {
+      value = node.value;
+    }
 
-        for (var i = 0, length = responderInstances.length; i < length; i++) {
-          var responderInstance = responderInstances[i];
-          var props = responderInstance.props,
-              responder = responderInstance.responder,
-              state = responderInstance.state;
+    return value;
+  }
 
-          if (!visitedResponders.has(responder) && validateResponderTargetEventTypes(eventType, responder) && (!insidePortal || responder.targetPortalPropagation)) {
-            visitedResponders.add(responder);
-            var onEvent = responder.onEvent;
+  function trackValueOnNode(node) {
+    var valueField = isCheckable(node) ? 'checked' : 'value';
+    var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
+    var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail
+    // and don't track value will cause over reporting of changes,
+    // but it's better then a hard failure
+    // (needed for certain tests that spyOn input values and Safari)
 
-            if (onEvent !== null) {
-              currentInstance = responderInstance;
-              onEvent(responderEvent, eventResponderContext, props, state);
+    if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
+      return;
+    }
 
-              if (currentPropagationBehavior === PropagateToNextResponder) {
-                visitedResponders.delete(responder);
-                currentPropagationBehavior = DoNotPropagateToNextResponder;
-              }
-            }
-          }
-        }
+    var get = descriptor.get,
+        set = descriptor.set;
+    Object.defineProperty(node, valueField, {
+      configurable: true,
+      get: function () {
+        return get.call(this);
+      },
+      set: function (value) {
+        currentValue = '' + value;
+        set.call(this, value);
+      }
+    }); // We could've passed this the first time
+    // but it triggers a bug in IE11 and Edge 14/15.
+    // Calling defineProperty() again should be equivalent.
+    // https://github.com/facebook/react/issues/11768
+
+    Object.defineProperty(node, valueField, {
+      enumerable: descriptor.enumerable
+    });
+    var tracker = {
+      getValue: function () {
+        return currentValue;
+      },
+      setValue: function (value) {
+        currentValue = '' + value;
+      },
+      stopTracking: function () {
+        detachTracker(node);
+        delete node[valueField];
       }
-    }
+    };
+    return tracker;
+  }
+
+  function track(node) {
+    if (getTracker(node)) {
+      return;
+    } // TODO: Once it's just Fiber we can move this to node._wrapperState
 
-    node = node.return;
-  } // Root phase
 
+    node._valueTracker = trackValueOnNode(node);
+  }
+  function updateValueIfChanged(node) {
+    if (!node) {
+      return false;
+    }
 
-  var rootEventResponderInstances = rootEventTypesToEventResponderInstances.get(eventType);
+    var tracker = getTracker(node); // if there is no tracker at this point it's unlikely
+    // that trying again will succeed
 
-  if (rootEventResponderInstances !== undefined) {
-    var _responderInstances = Array.from(rootEventResponderInstances);
+    if (!tracker) {
+      return true;
+    }
 
-    for (var _i = 0; _i < _responderInstances.length; _i++) {
-      var _responderInstance = _responderInstances[_i];
-      var props = _responderInstance.props,
-          responder = _responderInstance.responder,
-          state = _responderInstance.state;
-      var onRootEvent = responder.onRootEvent;
+    var lastValue = tracker.getValue();
+    var nextValue = getValueFromNode(node);
 
-      if (onRootEvent !== null) {
-        currentInstance = _responderInstance;
-        onRootEvent(responderEvent, eventResponderContext, props, state);
-      }
+    if (nextValue !== lastValue) {
+      tracker.setValue(nextValue);
+      return true;
     }
-  }
-}
 
-function mountEventResponder(responder, responderInstance, props, state) {
-  var onMount = responder.onMount;
+    return false;
+  }
 
-  if (onMount !== null) {
-    var previousInstance = currentInstance;
-    currentInstance = responderInstance;
+  var didWarnValueDefaultValue = false;
+  var didWarnCheckedDefaultChecked = false;
+  var didWarnControlledToUncontrolled = false;
+  var didWarnUncontrolledToControlled = false;
 
-    try {
-      batchedEventUpdates(function () {
-        onMount(eventResponderContext, props, state);
-      });
-    } finally {
-      currentInstance = previousInstance;
-    }
+  function isControlled(props) {
+    var usesChecked = props.type === 'checkbox' || props.type === 'radio';
+    return usesChecked ? props.checked != null : props.value != null;
   }
-}
-function unmountEventResponder(responderInstance) {
-  var responder = responderInstance.responder;
-  var onUnmount = responder.onUnmount;
+  /**
+   * Implements an <input> host component that allows setting these optional
+   * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
+   *
+   * If `checked` or `value` are not supplied (or null/undefined), user actions
+   * that affect the checked state or value will trigger updates to the element.
+   *
+   * If they are supplied (and not null/undefined), the rendered element will not
+   * trigger updates to the element. Instead, the props must change in order for
+   * the rendered element to be updated.
+   *
+   * The rendered element will be initialized as unchecked (or `defaultChecked`)
+   * with an empty value (or `defaultValue`).
+   *
+   * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
+   */
 
-  if (onUnmount !== null) {
-    var props = responderInstance.props,
-        state = responderInstance.state;
-    var previousInstance = currentInstance;
-    currentInstance = responderInstance;
 
-    try {
-      batchedEventUpdates(function () {
-        onUnmount(eventResponderContext, props, state);
-      });
-    } finally {
-      currentInstance = previousInstance;
-    }
+  function getHostProps(element, props) {
+    var node = element;
+    var checked = props.checked;
+
+    var hostProps = _assign({}, props, {
+      defaultChecked: undefined,
+      defaultValue: undefined,
+      value: undefined,
+      checked: checked != null ? checked : node._wrapperState.initialChecked
+    });
+
+    return hostProps;
   }
+  function initWrapperState(element, props) {
+    {
+      ReactControlledValuePropTypes.checkPropTypes('input', props);
 
-  var rootEventTypesSet = responderInstance.rootEventTypes;
+      if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {
+        error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
 
-  if (rootEventTypesSet !== null) {
-    var rootEventTypes = Array.from(rootEventTypesSet);
+        didWarnCheckedDefaultChecked = true;
+      }
 
-    for (var i = 0; i < rootEventTypes.length; i++) {
-      var topLevelEventType = rootEventTypes[i];
-      var rootEventResponderInstances = rootEventTypesToEventResponderInstances.get(topLevelEventType);
+      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
+        error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
 
-      if (rootEventResponderInstances !== undefined) {
-        rootEventResponderInstances.delete(responderInstance);
+        didWarnValueDefaultValue = true;
       }
     }
+
+    var node = element;
+    var defaultValue = props.defaultValue == null ? '' : props.defaultValue;
+    node._wrapperState = {
+      initialChecked: props.checked != null ? props.checked : props.defaultChecked,
+      initialValue: getToStringValue(props.value != null ? props.value : defaultValue),
+      controlled: isControlled(props)
+    };
   }
-}
+  function updateChecked(element, props) {
+    var node = element;
+    var checked = props.checked;
 
-function validateResponderContext() {
-  if (!(currentInstance !== null)) {
-    {
-      throw Error("An event responder context was used outside of an event cycle.");
+    if (checked != null) {
+      setValueForProperty(node, 'checked', checked, false);
     }
   }
-}
+  function updateWrapper(element, props) {
+    var node = element;
+
+    {
+      var controlled = isControlled(props);
 
-function dispatchEventForResponderEventSystem(topLevelType, targetFiber, nativeEvent, nativeEventTarget, eventSystemFlags) {
-  if (enableFlareAPI) {
-    var previousInstance = currentInstance;
-    var previousTimeStamp = currentTimeStamp;
-    var previousDocument = currentDocument;
-    var previousPropagationBehavior = currentPropagationBehavior;
-    currentPropagationBehavior = DoNotPropagateToNextResponder; // nodeType 9 is DOCUMENT_NODE
+      if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {
+        error('A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);
 
-    currentDocument = nativeEventTarget.nodeType === 9 ? nativeEventTarget : nativeEventTarget.ownerDocument; // We might want to control timeStamp another way here
+        didWarnUncontrolledToControlled = true;
+      }
 
-    currentTimeStamp = nativeEvent.timeStamp;
+      if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {
+        error('A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);
 
-    try {
-      batchedEventUpdates(function () {
-        traverseAndHandleEventResponderInstances(topLevelType, targetFiber, nativeEvent, nativeEventTarget, eventSystemFlags);
-      });
-    } finally {
-      currentInstance = previousInstance;
-      currentTimeStamp = previousTimeStamp;
-      currentDocument = previousDocument;
-      currentPropagationBehavior = previousPropagationBehavior;
+        didWarnControlledToUncontrolled = true;
+      }
     }
-  }
-}
-function addRootEventTypesForResponderInstance(responderInstance, rootEventTypes) {
-  for (var i = 0; i < rootEventTypes.length; i++) {
-    var rootEventType = rootEventTypes[i];
-    registerRootEventType(rootEventType, responderInstance);
-  }
-}
 
-function registerRootEventType(rootEventType, eventResponderInstance) {
-  var rootEventResponderInstances = rootEventTypesToEventResponderInstances.get(rootEventType);
-
-  if (rootEventResponderInstances === undefined) {
-    rootEventResponderInstances = new Set();
-    rootEventTypesToEventResponderInstances.set(rootEventType, rootEventResponderInstances);
-  }
+    updateChecked(element, props);
+    var value = getToStringValue(props.value);
+    var type = props.type;
 
-  var rootEventTypesSet = eventResponderInstance.rootEventTypes;
+    if (value != null) {
+      if (type === 'number') {
+        if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.
+        // eslint-disable-next-line
+        node.value != value) {
+          node.value = toString(value);
+        }
+      } else if (node.value !== toString(value)) {
+        node.value = toString(value);
+      }
+    } else if (type === 'submit' || type === 'reset') {
+      // Submit/reset inputs need the attribute removed completely to avoid
+      // blank-text buttons.
+      node.removeAttribute('value');
+      return;
+    }
 
-  if (rootEventTypesSet === null) {
-    rootEventTypesSet = eventResponderInstance.rootEventTypes = new Set();
-  }
+    {
+      // When syncing the value attribute, the value comes from a cascade of
+      // properties:
+      //  1. The value React property
+      //  2. The defaultValue React property
+      //  3. Otherwise there should be no change
+      if (props.hasOwnProperty('value')) {
+        setDefaultValue(node, props.type, value);
+      } else if (props.hasOwnProperty('defaultValue')) {
+        setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
+      }
+    }
 
-  if (!!rootEventTypesSet.has(rootEventType)) {
     {
-      throw Error("addRootEventTypes() found a duplicate root event type of \"" + rootEventType + "\". This might be because the event type exists in the event responder \"rootEventTypes\" array or because of a previous addRootEventTypes() using this root event type.");
+      // When syncing the checked attribute, it only changes when it needs
+      // to be removed, such as transitioning from a checkbox into a text input
+      if (props.checked == null && props.defaultChecked != null) {
+        node.defaultChecked = !!props.defaultChecked;
+      }
     }
   }
+  function postMountWrapper(element, props, isHydrating) {
+    var node = element; // Do not assign value if it is already set. This prevents user text input
+    // from being lost during SSR hydration.
 
-  rootEventTypesSet.add(rootEventType);
-  rootEventResponderInstances.add(eventResponderInstance);
-}
-
-// A reserved attribute.
-// It is handled by React separately and shouldn't be written to the DOM.
-var RESERVED = 0; // A simple string attribute.
-// Attributes that aren't in the whitelist are presumed to have this type.
+    if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {
+      var type = props.type;
+      var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the
+      // default value provided by the browser. See: #12872
 
-var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
-// "enumerated" attributes with "true" and "false" as possible values.
-// When true, it should be set to a "true" string.
-// When false, it should be set to a "false" string.
+      if (isButton && (props.value === undefined || props.value === null)) {
+        return;
+      }
 
-var BOOLEANISH_STRING = 2; // A real boolean attribute.
-// When true, it should be present (set either to an empty string or its name).
-// When false, it should be omitted.
+      var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input
+      // from being lost during SSR hydration.
 
-var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
-// When true, it should be present (set either to an empty string or its name).
-// When false, it should be omitted.
-// For any other value, should be present with that value.
+      if (!isHydrating) {
+        {
+          // When syncing the value attribute, the value property should use
+          // the wrapperState._initialValue property. This uses:
+          //
+          //   1. The value React property when present
+          //   2. The defaultValue React property when present
+          //   3. An empty string
+          if (initialValue !== node.value) {
+            node.value = initialValue;
+          }
+        }
+      }
 
-var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
-// When falsy, it should be removed.
+      {
+        // Otherwise, the value attribute is synchronized to the property,
+        // so we assign defaultValue to the same thing as the value property
+        // assignment step above.
+        node.defaultValue = initialValue;
+      }
+    } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
+    // this is needed to work around a chrome bug where setting defaultChecked
+    // will sometimes influence the value of checked (even after detachment).
+    // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
+    // We need to temporarily unset name to avoid disrupting radio button groups.
 
-var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
-// When falsy, it should be removed.
 
-var POSITIVE_NUMERIC = 6;
+    var name = node.name;
 
-/* eslint-disable max-len */
-var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
-/* eslint-enable max-len */
+    if (name !== '') {
+      node.name = '';
+    }
 
-var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
+    {
+      // When syncing the checked attribute, both the checked property and
+      // attribute are assigned at the same time using defaultChecked. This uses:
+      //
+      //   1. The checked React property when present
+      //   2. The defaultChecked React property when present
+      //   3. Otherwise, false
+      node.defaultChecked = !node.defaultChecked;
+      node.defaultChecked = !!node._wrapperState.initialChecked;
+    }
 
-var ROOT_ATTRIBUTE_NAME = 'data-reactroot';
-var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-var illegalAttributeNameCache = {};
-var validatedAttributeNameCache = {};
-function isAttributeNameSafe(attributeName) {
-  if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
-    return true;
+    if (name !== '') {
+      node.name = name;
+    }
   }
-
-  if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
-    return false;
+  function restoreControlledState(element, props) {
+    var node = element;
+    updateWrapper(node, props);
+    updateNamedCousins(node, props);
   }
 
-  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
-    validatedAttributeNameCache[attributeName] = true;
-    return true;
-  }
+  function updateNamedCousins(rootNode, props) {
+    var name = props.name;
 
-  illegalAttributeNameCache[attributeName] = true;
+    if (props.type === 'radio' && name != null) {
+      var queryRoot = rootNode;
 
-  {
-    warning$1(false, 'Invalid attribute name: `%s`', attributeName);
-  }
+      while (queryRoot.parentNode) {
+        queryRoot = queryRoot.parentNode;
+      } // If `rootNode.form` was non-null, then we could try `form.elements`,
+      // but that sometimes behaves strangely in IE8. We could also try using
+      // `form.getElementsByName`, but that will only return direct children
+      // and won't include inputs that use the HTML5 `form=` attribute. Since
+      // the input might not even be in a form. It might not even be in the
+      // document. Let's just use the local `querySelectorAll` to ensure we don't
+      // miss anything.
 
-  return false;
-}
-function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
-  if (propertyInfo !== null) {
-    return propertyInfo.type === RESERVED;
-  }
 
-  if (isCustomComponentTag) {
-    return false;
-  }
+      var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
 
-  if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
-    return true;
-  }
-
-  return false;
-}
-function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
-  if (propertyInfo !== null && propertyInfo.type === RESERVED) {
-    return false;
-  }
-
-  switch (typeof value) {
-    case 'function': // $FlowIssue symbol is perfectly valid here
+      for (var i = 0; i < group.length; i++) {
+        var otherNode = group[i];
 
-    case 'symbol':
-      // eslint-disable-line
-      return true;
+        if (otherNode === rootNode || otherNode.form !== rootNode.form) {
+          continue;
+        } // This will throw if radio buttons rendered by different copies of React
+        // and the same name are rendered into the same form (same as #1939).
+        // That's probably okay; we don't support it just as we don't support
+        // mixing React radio buttons with non-React ones.
 
-    case 'boolean':
-      {
-        if (isCustomComponentTag) {
-          return false;
-        }
 
-        if (propertyInfo !== null) {
-          return !propertyInfo.acceptsBooleans;
-        } else {
-          var prefix = name.toLowerCase().slice(0, 5);
-          return prefix !== 'data-' && prefix !== 'aria-';
-        }
-      }
+        var otherProps = getFiberCurrentPropsFromNode$1(otherNode);
 
-    default:
-      return false;
-  }
-}
-function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
-  if (value === null || typeof value === 'undefined') {
-    return true;
-  }
+        if (!otherProps) {
+          {
+            throw Error( "ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported." );
+          }
+        } // We need update the tracked value on the named cousin since the value
+        // was changed but the input saw no event or value set
 
-  if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
-    return true;
-  }
 
-  if (isCustomComponentTag) {
-    return false;
-  }
+        updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that
+        // was previously checked to update will cause it to be come re-checked
+        // as appropriate.
 
-  if (propertyInfo !== null) {
-    switch (propertyInfo.type) {
-      case BOOLEAN:
-        return !value;
-
-      case OVERLOADED_BOOLEAN:
-        return value === false;
-
-      case NUMERIC:
-        return isNaN(value);
-
-      case POSITIVE_NUMERIC:
-        return isNaN(value) || value < 1;
-    }
-  }
-
-  return false;
-}
-function getPropertyInfo(name) {
-  return properties.hasOwnProperty(name) ? properties[name] : null;
-}
-
-function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) {
-  this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
-  this.attributeName = attributeName;
-  this.attributeNamespace = attributeNamespace;
-  this.mustUseProperty = mustUseProperty;
-  this.propertyName = name;
-  this.type = type;
-  this.sanitizeURL = sanitizeURL;
-} // When adding attributes to this list, be sure to also add them to
-// the `possibleStandardNames` module to ensure casing and incorrect
-// name warnings.
-
-
-var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
-
-['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
-// elements (not just inputs). Now that ReactDOMInput assigns to the
-// defaultValue property -- do we need this?
-'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
-  name, // attributeName
-  null, // attributeNamespace
-  false);
-}); // A few React string attributes have a different name.
-// This is a mapping from React prop names to the attribute names.
-
-[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
-  var name = _ref[0],
-      attributeName = _ref[1];
-  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
-  attributeName, // attributeName
-  null, // attributeNamespace
-  false);
-}); // These are "enumerated" HTML attributes that accept "true" and "false".
-// In React, we let users pass `true` and `false` even though technically
-// these aren't boolean attributes (they are coerced to strings).
-
-['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
-  name.toLowerCase(), // attributeName
-  null, // attributeNamespace
-  false);
-}); // These are "enumerated" SVG attributes that accept "true" and "false".
-// In React, we let users pass `true` and `false` even though technically
-// these aren't boolean attributes (they are coerced to strings).
-// Since these are SVG attributes, their attribute names are case-sensitive.
-
-['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
-  name, // attributeName
-  null, // attributeNamespace
-  false);
-}); // These are HTML boolean attributes.
-
-['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
-// on the client side because the browsers are inconsistent. Instead we call focus().
-'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
-'itemScope'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
-  name.toLowerCase(), // attributeName
-  null, // attributeNamespace
-  false);
-}); // These are the few React props that we set as DOM properties
-// rather than attributes. These are all booleans.
-
-['checked', // Note: `option.selected` is not updated if `select.multiple` is
-// disabled with `removeAttribute`. We have special logic for handling this.
-'multiple', 'muted', 'selected'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
-  name, // attributeName
-  null, // attributeNamespace
-  false);
-}); // These are HTML attributes that are "overloaded booleans": they behave like
-// booleans, but can also accept a string value.
-
-['capture', 'download'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
-  name, // attributeName
-  null, // attributeNamespace
-  false);
-}); // These are HTML attributes that must be positive numbers.
-
-['cols', 'rows', 'size', 'span'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
-  name, // attributeName
-  null, // attributeNamespace
-  false);
-}); // These are HTML attributes that must be numbers.
-
-['rowSpan', 'start'].forEach(function (name) {
-  properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
-  name.toLowerCase(), // attributeName
-  null, // attributeNamespace
-  false);
-});
-var CAMELIZE = /[\-\:]([a-z])/g;
-
-var capitalize = function (token) {
-  return token[1].toUpperCase();
-}; // This is a list of all SVG attributes that need special casing, namespacing,
-// or boolean value assignment. Regular attributes that just accept strings
-// and have the same names are omitted, just like in the HTML whitelist.
-// Some of these attributes can be hard to find. This list was created by
-// scrapping the MDN documentation.
-
-
-['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height'].forEach(function (attributeName) {
-  var name = attributeName.replace(CAMELIZE, capitalize);
-  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
-  attributeName, null, // attributeNamespace
-  false);
-}); // String SVG attributes with the xlink namespace.
-
-['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type'].forEach(function (attributeName) {
-  var name = attributeName.replace(CAMELIZE, capitalize);
-  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
-  attributeName, 'http://www.w3.org/1999/xlink', false);
-}); // String SVG attributes with the xml namespace.
-
-['xml:base', 'xml:lang', 'xml:space'].forEach(function (attributeName) {
-  var name = attributeName.replace(CAMELIZE, capitalize);
-  properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
-  attributeName, 'http://www.w3.org/XML/1998/namespace', false);
-}); // These attribute exists both in HTML and SVG.
-// The attribute name is case-sensitive in SVG so we can't just use
-// the React name like we do for attributes that exist only in HTML.
-
-['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
-  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
-  attributeName.toLowerCase(), // attributeName
-  null, // attributeNamespace
-  false);
-}); // These attributes accept URLs. These must not allow javascript: URLS.
-// These will also need to accept Trusted Types object in the future.
-
-var xlinkHref = 'xlinkHref';
-properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
-'xlink:href', 'http://www.w3.org/1999/xlink', true);
-['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
-  properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
-  attributeName.toLowerCase(), // attributeName
-  null, // attributeNamespace
-  true);
-});
-
-var ReactDebugCurrentFrame$1 = null;
-
-{
-  ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
-} // A javascript: URL can contain leading C0 control or \u0020 SPACE,
-// and any newline or tab are filtered out as if they're not part of the URL.
-// https://url.spec.whatwg.org/#url-parsing
-// Tab or newline are defined as \r\n\t:
-// https://infra.spec.whatwg.org/#ascii-tab-or-newline
-// A C0 control is a code point in the range \u0000 NULL to \u001F
-// INFORMATION SEPARATOR ONE, inclusive:
-// https://infra.spec.whatwg.org/#c0-control-or-space
-
-/* eslint-disable max-len */
-
-
-var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;
-var didWarn = false;
-
-function sanitizeURL(url) {
-  if (disableJavaScriptURLs) {
-    if (!!isJavaScriptProtocol.test(url)) {
-      {
-        throw Error("React has blocked a javascript: URL as a security precaution." + (ReactDebugCurrentFrame$1.getStackAddendum()));
-      }
-    }
-  } else if (true && !didWarn && isJavaScriptProtocol.test(url)) {
-    didWarn = true;
-    warning$1(false, 'A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));
-  }
-}
-
-// Flow does not allow string concatenation of most non-string types. To work
-// around this limitation, we use an opaque type that can only be obtained by
-// passing the value through getToStringValue first.
-function toString(value) {
-  return '' + value;
-}
-function getToStringValue(value) {
-  switch (typeof value) {
-    case 'boolean':
-    case 'number':
-    case 'object':
-    case 'string':
-    case 'undefined':
-      return value;
+        updateWrapper(otherNode, otherProps);
+      }
+    }
+  } // In Chrome, assigning defaultValue to certain input types triggers input validation.
+  // For number inputs, the display value loses trailing decimal points. For email inputs,
+  // Chrome raises "The specified value <x> is not a valid email address".
+  //
+  // Here we check to see if the defaultValue has actually changed, avoiding these problems
+  // when the user is inputting text
+  //
+  // https://github.com/facebook/react/issues/7253
 
-    default:
-      // function, symbol are assigned as empty strings
-      return '';
-  }
-}
-/** Trusted value is a wrapper for "safe" values which can be assigned to DOM execution sinks. */
 
-/**
- * We allow passing objects with toString method as element attributes or in dangerouslySetInnerHTML
- * and we do validations that the value is safe. Once we do validation we want to use the validated
- * value instead of the object (because object.toString may return something else on next call).
- *
- * If application uses Trusted Types we don't stringify trusted values, but preserve them as objects.
- */
-var toStringOrTrustedType = toString;
-
-if (enableTrustedTypesIntegration && typeof trustedTypes !== 'undefined') {
-  toStringOrTrustedType = function (value) {
-    if (typeof value === 'object' && (trustedTypes.isHTML(value) || trustedTypes.isScript(value) || trustedTypes.isScriptURL(value) ||
-    /* TrustedURLs are deprecated and will be removed soon: https://github.com/WICG/trusted-types/pull/204 */
-    trustedTypes.isURL && trustedTypes.isURL(value))) {
-      // Pass Trusted Types through.
-      return value;
+  function setDefaultValue(node, type, value) {
+    if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js
+    type !== 'number' || node.ownerDocument.activeElement !== node) {
+      if (value == null) {
+        node.defaultValue = toString(node._wrapperState.initialValue);
+      } else if (node.defaultValue !== toString(value)) {
+        node.defaultValue = toString(value);
+      }
     }
+  }
 
-    return toString(value);
-  };
-}
-
-/**
- * Set attribute for a node. The attribute value can be either string or
- * Trusted value (if application uses Trusted Types).
- */
-function setAttribute(node, attributeName, attributeValue) {
-  node.setAttribute(attributeName, attributeValue);
-}
-/**
- * Set attribute with namespace for a node. The attribute value can be either string or
- * Trusted value (if application uses Trusted Types).
- */
+  var didWarnSelectedSetOnOption = false;
+  var didWarnInvalidChild = false;
 
-function setAttributeNS(node, attributeNamespace, attributeName, attributeValue) {
-  node.setAttributeNS(attributeNamespace, attributeName, attributeValue);
-}
+  function flattenChildren(children) {
+    var content = ''; // Flatten children. We'll warn if they are invalid
+    // during validateProps() which runs for hydration too.
+    // Note that this would throw on non-element objects.
+    // Elements are stringified (which is normally irrelevant
+    // but matters for <fbt>).
 
-/**
- * Get the value for a property on a node. Only used in DEV for SSR validation.
- * The "expected" argument is used as a hint of what the expected value is.
- * Some properties have multiple equivalent values.
- */
-function getValueForProperty(node, name, expected, propertyInfo) {
-  {
-    if (propertyInfo.mustUseProperty) {
-      var propertyName = propertyInfo.propertyName;
-      return node[propertyName];
-    } else {
-      if (!disableJavaScriptURLs && propertyInfo.sanitizeURL) {
-        // If we haven't fully disabled javascript: URLs, and if
-        // the hydration is successful of a javascript: URL, we
-        // still want to warn on the client.
-        sanitizeURL('' + expected);
+    React.Children.forEach(children, function (child) {
+      if (child == null) {
+        return;
       }
 
-      var attributeName = propertyInfo.attributeName;
-      var stringValue = null;
+      content += child; // Note: we don't warn about invalid children here.
+      // Instead, this is done separately below so that
+      // it happens during the hydration codepath too.
+    });
+    return content;
+  }
+  /**
+   * Implements an <option> host component that warns when `selected` is set.
+   */
 
-      if (propertyInfo.type === OVERLOADED_BOOLEAN) {
-        if (node.hasAttribute(attributeName)) {
-          var value = node.getAttribute(attributeName);
 
-          if (value === '') {
-            return true;
+  function validateProps(element, props) {
+    {
+      // This mirrors the codepath above, but runs for hydration too.
+      // Warn about invalid children here so that client and hydration are consistent.
+      // TODO: this seems like it could cause a DEV-only throw for hydration
+      // if children contains a non-element object. We should try to avoid that.
+      if (typeof props.children === 'object' && props.children !== null) {
+        React.Children.forEach(props.children, function (child) {
+          if (child == null) {
+            return;
           }
 
-          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
-            return value;
+          if (typeof child === 'string' || typeof child === 'number') {
+            return;
           }
 
-          if (value === '' + expected) {
-            return expected;
+          if (typeof child.type !== 'string') {
+            return;
           }
 
-          return value;
-        }
-      } else if (node.hasAttribute(attributeName)) {
-        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
-          // We had an attribute but shouldn't have had one, so read it
-          // for the error message.
-          return node.getAttribute(attributeName);
-        }
+          if (!didWarnInvalidChild) {
+            didWarnInvalidChild = true;
 
-        if (propertyInfo.type === BOOLEAN) {
-          // If this was a boolean, it doesn't matter what the value is
-          // the fact that we have it is the same as the expected.
-          return expected;
-        } // Even if this property uses a namespace we use getAttribute
-        // because we assume its namespaced name is the same as our config.
-        // To use getAttributeNS we need the local name which we don't have
-        // in our config atm.
+            error('Only strings and numbers are supported as <option> children.');
+          }
+        });
+      } // TODO: Remove support for `selected` in <option>.
 
 
-        stringValue = node.getAttribute(attributeName);
-      }
+      if (props.selected != null && !didWarnSelectedSetOnOption) {
+        error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
 
-      if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
-        return stringValue === null ? expected : stringValue;
-      } else if (stringValue === '' + expected) {
-        return expected;
-      } else {
-        return stringValue;
+        didWarnSelectedSetOnOption = true;
       }
     }
   }
-}
-/**
- * Get the value for a attribute on a node. Only used in DEV for SSR validation.
- * The third argument is used as a hint of what the expected value is. Some
- * attributes have multiple equivalent values.
- */
-
-function getValueForAttribute(node, name, expected) {
-  {
-    if (!isAttributeNameSafe(name)) {
-      return;
-    }
-
-    if (!node.hasAttribute(name)) {
-      return expected === undefined ? undefined : null;
+  function postMountWrapper$1(element, props) {
+    // value="" should make a value attribute (#6219)
+    if (props.value != null) {
+      element.setAttribute('value', toString(getToStringValue(props.value)));
     }
+  }
+  function getHostProps$1(element, props) {
+    var hostProps = _assign({
+      children: undefined
+    }, props);
 
-    var value = node.getAttribute(name);
+    var content = flattenChildren(props.children);
 
-    if (value === '' + expected) {
-      return expected;
+    if (content) {
+      hostProps.children = content;
     }
 
-    return value;
+    return hostProps;
   }
-}
-/**
- * Sets the value for a property on a node.
- *
- * @param {DOMElement} node
- * @param {string} name
- * @param {*} value
- */
 
-function setValueForProperty(node, name, value, isCustomComponentTag) {
-  var propertyInfo = getPropertyInfo(name);
+  var didWarnValueDefaultValue$1;
 
-  if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {
-    return;
+  {
+    didWarnValueDefaultValue$1 = false;
   }
 
-  if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {
-    value = null;
-  } // If the prop isn't in the special list, treat it as a simple attribute.
-
-
-  if (isCustomComponentTag || propertyInfo === null) {
-    if (isAttributeNameSafe(name)) {
-      var _attributeName = name;
+  function getDeclarationErrorAddendum() {
+    var ownerName = getCurrentFiberOwnerNameInDevOrNull();
 
-      if (value === null) {
-        node.removeAttribute(_attributeName);
-      } else {
-        setAttribute(node, _attributeName, toStringOrTrustedType(value));
-      }
+    if (ownerName) {
+      return '\n\nCheck the render method of `' + ownerName + '`.';
     }
 
-    return;
+    return '';
   }
 
-  var mustUseProperty = propertyInfo.mustUseProperty;
-
-  if (mustUseProperty) {
-    var propertyName = propertyInfo.propertyName;
-
-    if (value === null) {
-      var type = propertyInfo.type;
-      node[propertyName] = type === BOOLEAN ? false : '';
-    } else {
-      // Contrary to `setAttribute`, object properties are properly
-      // `toString`ed by IE8/9.
-      node[propertyName] = value;
-    }
-
-    return;
-  } // The rest are treated as attributes with special cases.
+  var valuePropNames = ['value', 'defaultValue'];
+  /**
+   * Validation function for `value` and `defaultValue`.
+   */
 
+  function checkSelectPropTypes(props) {
+    {
+      ReactControlledValuePropTypes.checkPropTypes('select', props);
 
-  var attributeName = propertyInfo.attributeName,
-      attributeNamespace = propertyInfo.attributeNamespace;
+      for (var i = 0; i < valuePropNames.length; i++) {
+        var propName = valuePropNames[i];
 
-  if (value === null) {
-    node.removeAttribute(attributeName);
-  } else {
-    var _type = propertyInfo.type;
-    var attributeValue;
+        if (props[propName] == null) {
+          continue;
+        }
 
-    if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {
-      // If attribute type is boolean, we know for sure it won't be an execution sink
-      // and we won't require Trusted Type here.
-      attributeValue = '';
-    } else {
-      // `setAttribute` with objects becomes only `[object]` in IE8/9,
-      // ('' + value) makes it output the correct toString()-value.
-      attributeValue = toStringOrTrustedType(value);
+        var isArray = Array.isArray(props[propName]);
 
-      if (propertyInfo.sanitizeURL) {
-        sanitizeURL(attributeValue.toString());
+        if (props.multiple && !isArray) {
+          error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());
+        } else if (!props.multiple && isArray) {
+          error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());
+        }
       }
     }
-
-    if (attributeNamespace) {
-      setAttributeNS(node, attributeNamespace, attributeName, attributeValue);
-    } else {
-      setAttribute(node, attributeName, attributeValue);
-    }
   }
-}
-
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
 
+  function updateOptions(node, multiple, propValue, setDefaultSelected) {
+    var options = node.options;
 
-var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
+    if (multiple) {
+      var selectedValues = propValue;
+      var selectedValue = {};
 
-var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
-
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
+      for (var i = 0; i < selectedValues.length; i++) {
+        // Prefix to avoid chaos with special keys.
+        selectedValue['$' + selectedValues[i]] = true;
+      }
 
+      for (var _i = 0; _i < options.length; _i++) {
+        var selected = selectedValue.hasOwnProperty('$' + options[_i].value);
 
+        if (options[_i].selected !== selected) {
+          options[_i].selected = selected;
+        }
 
-var printWarning = function() {};
+        if (selected && setDefaultSelected) {
+          options[_i].defaultSelected = true;
+        }
+      }
+    } else {
+      // Do not set `select.value` as exact behavior isn't consistent across all
+      // browsers for all cases.
+      var _selectedValue = toString(getToStringValue(propValue));
 
-{
-  var ReactPropTypesSecret = ReactPropTypesSecret_1;
-  var loggedTypeFailures = {};
-  var has = Function.call.bind(Object.prototype.hasOwnProperty);
+      var defaultSelected = null;
 
-  printWarning = function(text) {
-    var message = 'Warning: ' + text;
-    if (typeof console !== 'undefined') {
-      console.error(message);
-    }
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
+      for (var _i2 = 0; _i2 < options.length; _i2++) {
+        if (options[_i2].value === _selectedValue) {
+          options[_i2].selected = true;
 
-/**
- * Assert that the values match with the type specs.
- * Error messages are memorized and will only be shown once.
- *
- * @param {object} typeSpecs Map of name to a ReactPropType
- * @param {object} values Runtime values that need to be type-checked
- * @param {string} location e.g. "prop", "context", "child context"
- * @param {string} componentName Name of the component for error messages.
- * @param {?Function} getStack Returns the component stack.
- * @private
- */
-function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
-  {
-    for (var typeSpecName in typeSpecs) {
-      if (has(typeSpecs, typeSpecName)) {
-        var error;
-        // Prop type validation may throw. In case they do, we don't want to
-        // fail the render phase where it didn't fail before. So we log it.
-        // After these have been cleaned up, we'll let them throw.
-        try {
-          // This is intentionally an invariant that gets caught. It's the same
-          // behavior as without this statement except with a better message.
-          if (typeof typeSpecs[typeSpecName] !== 'function') {
-            var err = Error(
-              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
-              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
-            );
-            err.name = 'Invariant Violation';
-            throw err;
+          if (setDefaultSelected) {
+            options[_i2].defaultSelected = true;
           }
-          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
-        } catch (ex) {
-          error = ex;
-        }
-        if (error && !(error instanceof Error)) {
-          printWarning(
-            (componentName || 'React class') + ': type specification of ' +
-            location + ' `' + typeSpecName + '` is invalid; the type checker ' +
-            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
-            'You may have forgotten to pass an argument to the type checker ' +
-            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
-            'shape all require an argument).'
-          );
-        }
-        if (error instanceof Error && !(error.message in loggedTypeFailures)) {
-          // Only monitor this failure once because there tends to be a lot of the
-          // same error.
-          loggedTypeFailures[error.message] = true;
 
-          var stack = getStack ? getStack() : '';
-
-          printWarning(
-            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
-          );
+          return;
         }
-      }
-    }
-  }
-}
 
-/**
- * Resets warning cache when testing.
- *
- * @private
- */
-checkPropTypes.resetWarningCache = function() {
-  {
-    loggedTypeFailures = {};
-  }
-};
-
-var checkPropTypes_1 = checkPropTypes;
-
-var ReactDebugCurrentFrame$2 = null;
-var ReactControlledValuePropTypes = {
-  checkPropTypes: null
-};
-
-{
-  ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;
-  var hasReadOnlyValue = {
-    button: true,
-    checkbox: true,
-    image: true,
-    hidden: true,
-    radio: true,
-    reset: true,
-    submit: true
-  };
-  var propTypes = {
-    value: function (props, propName, componentName) {
-      if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableFlareAPI && props.listeners) {
-        return null;
+        if (defaultSelected === null && !options[_i2].disabled) {
+          defaultSelected = options[_i2];
+        }
       }
 
-      return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
-    },
-    checked: function (props, propName, componentName) {
-      if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableFlareAPI && props.listeners) {
-        return null;
+      if (defaultSelected !== null) {
+        defaultSelected.selected = true;
       }
-
-      return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
     }
-  };
+  }
   /**
-   * Provide a linked `value` attribute for controlled forms. You should not use
-   * this outside of the ReactDOM controlled form components.
+   * Implements a <select> host component that allows optionally setting the
+   * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
+   * stringable. If `multiple` is true, the prop must be an array of stringables.
+   *
+   * If `value` is not supplied (or null/undefined), user actions that change the
+   * selected option will trigger updates to the rendered options.
+   *
+   * If it is supplied (and not null/undefined), the rendered options will not
+   * update in response to user actions. Instead, the `value` prop must change in
+   * order for the rendered options to update.
+   *
+   * If `defaultValue` is provided, any options with the supplied values will be
+   * selected.
    */
 
-  ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {
-    checkPropTypes_1(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum);
-  };
-}
 
-function isCheckable(elem) {
-  var type = elem.type;
-  var nodeName = elem.nodeName;
-  return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
-}
+  function getHostProps$2(element, props) {
+    return _assign({}, props, {
+      value: undefined
+    });
+  }
+  function initWrapperState$1(element, props) {
+    var node = element;
 
-function getTracker(node) {
-  return node._valueTracker;
-}
+    {
+      checkSelectPropTypes(props);
+    }
 
-function detachTracker(node) {
-  node._valueTracker = null;
-}
+    node._wrapperState = {
+      wasMultiple: !!props.multiple
+    };
 
-function getValueFromNode(node) {
-  var value = '';
+    {
+      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {
+        error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');
 
-  if (!node) {
-    return value;
+        didWarnValueDefaultValue$1 = true;
+      }
+    }
   }
+  function postMountWrapper$2(element, props) {
+    var node = element;
+    node.multiple = !!props.multiple;
+    var value = props.value;
 
-  if (isCheckable(node)) {
-    value = node.checked ? 'true' : 'false';
-  } else {
-    value = node.value;
+    if (value != null) {
+      updateOptions(node, !!props.multiple, value, false);
+    } else if (props.defaultValue != null) {
+      updateOptions(node, !!props.multiple, props.defaultValue, true);
+    }
   }
+  function postUpdateWrapper(element, props) {
+    var node = element;
+    var wasMultiple = node._wrapperState.wasMultiple;
+    node._wrapperState.wasMultiple = !!props.multiple;
+    var value = props.value;
 
-  return value;
-}
-
-function trackValueOnNode(node) {
-  var valueField = isCheckable(node) ? 'checked' : 'value';
-  var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
-  var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail
-  // and don't track value will cause over reporting of changes,
-  // but it's better then a hard failure
-  // (needed for certain tests that spyOn input values and Safari)
-
-  if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
-    return;
+    if (value != null) {
+      updateOptions(node, !!props.multiple, value, false);
+    } else if (wasMultiple !== !!props.multiple) {
+      // For simplicity, reapply `defaultValue` if `multiple` is toggled.
+      if (props.defaultValue != null) {
+        updateOptions(node, !!props.multiple, props.defaultValue, true);
+      } else {
+        // Revert the select back to its default unselected state.
+        updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);
+      }
+    }
   }
+  function restoreControlledState$1(element, props) {
+    var node = element;
+    var value = props.value;
 
-  var get = descriptor.get,
-      set = descriptor.set;
-  Object.defineProperty(node, valueField, {
-    configurable: true,
-    get: function () {
-      return get.call(this);
-    },
-    set: function (value) {
-      currentValue = '' + value;
-      set.call(this, value);
+    if (value != null) {
+      updateOptions(node, !!props.multiple, value, false);
     }
-  }); // We could've passed this the first time
-  // but it triggers a bug in IE11 and Edge 14/15.
-  // Calling defineProperty() again should be equivalent.
-  // https://github.com/facebook/react/issues/11768
+  }
 
-  Object.defineProperty(node, valueField, {
-    enumerable: descriptor.enumerable
-  });
-  var tracker = {
-    getValue: function () {
-      return currentValue;
-    },
-    setValue: function (value) {
-      currentValue = '' + value;
-    },
-    stopTracking: function () {
-      detachTracker(node);
-      delete node[valueField];
-    }
-  };
-  return tracker;
-}
+  var didWarnValDefaultVal = false;
 
-function track(node) {
-  if (getTracker(node)) {
-    return;
-  } // TODO: Once it's just Fiber we can move this to node._wrapperState
+  /**
+   * Implements a <textarea> host component that allows setting `value`, and
+   * `defaultValue`. This differs from the traditional DOM API because value is
+   * usually set as PCDATA children.
+   *
+   * If `value` is not supplied (or null/undefined), user actions that affect the
+   * value will trigger updates to the element.
+   *
+   * If `value` is supplied (and not null/undefined), the rendered element will
+   * not trigger updates to the element. Instead, the `value` prop must change in
+   * order for the rendered element to be updated.
+   *
+   * The rendered element will be initialized with an empty value, the prop
+   * `defaultValue` if specified, or the children content (deprecated).
+   */
+  function getHostProps$3(element, props) {
+    var node = element;
 
+    if (!(props.dangerouslySetInnerHTML == null)) {
+      {
+        throw Error( "`dangerouslySetInnerHTML` does not make sense on <textarea>." );
+      }
+    } // Always set children to the same thing. In IE9, the selection range will
+    // get reset if `textContent` is mutated.  We could add a check in setTextContent
+    // to only set the value if/when the value differs from the node value (which would
+    // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this
+    // solution. The value can be a boolean or object so that's why it's forced
+    // to be a string.
 
-  node._valueTracker = trackValueOnNode(node);
-}
-function updateValueIfChanged(node) {
-  if (!node) {
-    return false;
-  }
 
-  var tracker = getTracker(node); // if there is no tracker at this point it's unlikely
-  // that trying again will succeed
+    var hostProps = _assign({}, props, {
+      value: undefined,
+      defaultValue: undefined,
+      children: toString(node._wrapperState.initialValue)
+    });
 
-  if (!tracker) {
-    return true;
+    return hostProps;
   }
+  function initWrapperState$2(element, props) {
+    var node = element;
 
-  var lastValue = tracker.getValue();
-  var nextValue = getValueFromNode(node);
+    {
+      ReactControlledValuePropTypes.checkPropTypes('textarea', props);
 
-  if (nextValue !== lastValue) {
-    tracker.setValue(nextValue);
-    return true;
-  }
+      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {
+        error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
 
-  return false;
-}
+        didWarnValDefaultVal = true;
+      }
+    }
 
-// TODO: direct imports like some-package/src/* are bad. Fix me.
-var didWarnValueDefaultValue = false;
-var didWarnCheckedDefaultChecked = false;
-var didWarnControlledToUncontrolled = false;
-var didWarnUncontrolledToControlled = false;
+    var initialValue = props.value; // Only bother fetching default value if we're going to use it
 
-function isControlled(props) {
-  var usesChecked = props.type === 'checkbox' || props.type === 'radio';
-  return usesChecked ? props.checked != null : props.value != null;
-}
-/**
- * Implements an <input> host component that allows setting these optional
- * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
- *
- * If `checked` or `value` are not supplied (or null/undefined), user actions
- * that affect the checked state or value will trigger updates to the element.
- *
- * If they are supplied (and not null/undefined), the rendered element will not
- * trigger updates to the element. Instead, the props must change in order for
- * the rendered element to be updated.
- *
- * The rendered element will be initialized as unchecked (or `defaultChecked`)
- * with an empty value (or `defaultValue`).
- *
- * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
- */
+    if (initialValue == null) {
+      var children = props.children,
+          defaultValue = props.defaultValue;
 
+      if (children != null) {
+        {
+          error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
+        }
 
-function getHostProps(element, props) {
-  var node = element;
-  var checked = props.checked;
+        {
+          if (!(defaultValue == null)) {
+            {
+              throw Error( "If you supply `defaultValue` on a <textarea>, do not pass children." );
+            }
+          }
 
-  var hostProps = _assign({}, props, {
-    defaultChecked: undefined,
-    defaultValue: undefined,
-    value: undefined,
-    checked: checked != null ? checked : node._wrapperState.initialChecked
-  });
+          if (Array.isArray(children)) {
+            if (!(children.length <= 1)) {
+              {
+                throw Error( "<textarea> can only have at most one child." );
+              }
+            }
 
-  return hostProps;
-}
-function initWrapperState(element, props) {
-  {
-    ReactControlledValuePropTypes.checkPropTypes('input', props);
+            children = children[0];
+          }
 
-    if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {
-      warning$1(false, '%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
-      didWarnCheckedDefaultChecked = true;
-    }
+          defaultValue = children;
+        }
+      }
 
-    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
-      warning$1(false, '%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
-      didWarnValueDefaultValue = true;
-    }
-  }
+      if (defaultValue == null) {
+        defaultValue = '';
+      }
 
-  var node = element;
-  var defaultValue = props.defaultValue == null ? '' : props.defaultValue;
-  node._wrapperState = {
-    initialChecked: props.checked != null ? props.checked : props.defaultChecked,
-    initialValue: getToStringValue(props.value != null ? props.value : defaultValue),
-    controlled: isControlled(props)
-  };
-}
-function updateChecked(element, props) {
-  var node = element;
-  var checked = props.checked;
+      initialValue = defaultValue;
+    }
 
-  if (checked != null) {
-    setValueForProperty(node, 'checked', checked, false);
+    node._wrapperState = {
+      initialValue: getToStringValue(initialValue)
+    };
   }
-}
-function updateWrapper(element, props) {
-  var node = element;
+  function updateWrapper$1(element, props) {
+    var node = element;
+    var value = getToStringValue(props.value);
+    var defaultValue = getToStringValue(props.defaultValue);
 
-  {
-    var controlled = isControlled(props);
+    if (value != null) {
+      // Cast `value` to a string to ensure the value is set correctly. While
+      // browsers typically do this as necessary, jsdom doesn't.
+      var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed
+
+      if (newValue !== node.value) {
+        node.value = newValue;
+      }
 
-    if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {
-      warning$1(false, 'A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);
-      didWarnUncontrolledToControlled = true;
+      if (props.defaultValue == null && node.defaultValue !== newValue) {
+        node.defaultValue = newValue;
+      }
     }
 
-    if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {
-      warning$1(false, 'A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);
-      didWarnControlledToUncontrolled = true;
+    if (defaultValue != null) {
+      node.defaultValue = toString(defaultValue);
     }
   }
+  function postMountWrapper$3(element, props) {
+    var node = element; // This is in postMount because we need access to the DOM node, which is not
+    // available until after the component has mounted.
 
-  updateChecked(element, props);
-  var value = getToStringValue(props.value);
-  var type = props.type;
+    var textContent = node.textContent; // Only set node.value if textContent is equal to the expected
+    // initial value. In IE10/IE11 there is a bug where the placeholder attribute
+    // will populate textContent as well.
+    // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
 
-  if (value != null) {
-    if (type === 'number') {
-      if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.
-      // eslint-disable-next-line
-      node.value != value) {
-        node.value = toString(value);
+    if (textContent === node._wrapperState.initialValue) {
+      if (textContent !== '' && textContent !== null) {
+        node.value = textContent;
       }
-    } else if (node.value !== toString(value)) {
-      node.value = toString(value);
-    }
-  } else if (type === 'submit' || type === 'reset') {
-    // Submit/reset inputs need the attribute removed completely to avoid
-    // blank-text buttons.
-    node.removeAttribute('value');
-    return;
-  }
-
-  if (disableInputAttributeSyncing) {
-    // When not syncing the value attribute, React only assigns a new value
-    // whenever the defaultValue React prop has changed. When not present,
-    // React does nothing
-    if (props.hasOwnProperty('defaultValue')) {
-      setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
-    }
-  } else {
-    // When syncing the value attribute, the value comes from a cascade of
-    // properties:
-    //  1. The value React property
-    //  2. The defaultValue React property
-    //  3. Otherwise there should be no change
-    if (props.hasOwnProperty('value')) {
-      setDefaultValue(node, props.type, value);
-    } else if (props.hasOwnProperty('defaultValue')) {
-      setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
-    }
-  }
-
-  if (disableInputAttributeSyncing) {
-    // When not syncing the checked attribute, the attribute is directly
-    // controllable from the defaultValue React property. It needs to be
-    // updated as new props come in.
-    if (props.defaultChecked == null) {
-      node.removeAttribute('checked');
-    } else {
-      node.defaultChecked = !!props.defaultChecked;
-    }
-  } else {
-    // When syncing the checked attribute, it only changes when it needs
-    // to be removed, such as transitioning from a checkbox into a text input
-    if (props.checked == null && props.defaultChecked != null) {
-      node.defaultChecked = !!props.defaultChecked;
     }
   }
-}
-function postMountWrapper(element, props, isHydrating) {
-  var node = element; // Do not assign value if it is already set. This prevents user text input
-  // from being lost during SSR hydration.
-
-  if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {
-    var type = props.type;
-    var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the
-    // default value provided by the browser. See: #12872
+  function restoreControlledState$2(element, props) {
+    // DOM component is still mounted; update
+    updateWrapper$1(element, props);
+  }
 
-    if (isButton && (props.value === undefined || props.value === null)) {
-      return;
-    }
+  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+  var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
+  var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+  var Namespaces = {
+    html: HTML_NAMESPACE,
+    mathml: MATH_NAMESPACE,
+    svg: SVG_NAMESPACE
+  }; // Assumes there is no parent namespace.
 
-    var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input
-    // from being lost during SSR hydration.
+  function getIntrinsicNamespace(type) {
+    switch (type) {
+      case 'svg':
+        return SVG_NAMESPACE;
 
-    if (!isHydrating) {
-      if (disableInputAttributeSyncing) {
-        var value = getToStringValue(props.value); // When not syncing the value attribute, the value property points
-        // directly to the React prop. Only assign it if it exists.
+      case 'math':
+        return MATH_NAMESPACE;
 
-        if (value != null) {
-          // Always assign on buttons so that it is possible to assign an
-          // empty string to clear button text.
-          //
-          // Otherwise, do not re-assign the value property if is empty. This
-          // potentially avoids a DOM write and prevents Firefox (~60.0.1) from
-          // prematurely marking required inputs as invalid. Equality is compared
-          // to the current value in case the browser provided value is not an
-          // empty string.
-          if (isButton || value !== node.value) {
-            node.value = toString(value);
-          }
-        }
-      } else {
-        // When syncing the value attribute, the value property should use
-        // the wrapperState._initialValue property. This uses:
-        //
-        //   1. The value React property when present
-        //   2. The defaultValue React property when present
-        //   3. An empty string
-        if (initialValue !== node.value) {
-          node.value = initialValue;
-        }
-      }
+      default:
+        return HTML_NAMESPACE;
     }
-
-    if (disableInputAttributeSyncing) {
-      // When not syncing the value attribute, assign the value attribute
-      // directly from the defaultValue React property (when present)
-      var defaultValue = getToStringValue(props.defaultValue);
-
-      if (defaultValue != null) {
-        node.defaultValue = toString(defaultValue);
-      }
-    } else {
-      // Otherwise, the value attribute is synchronized to the property,
-      // so we assign defaultValue to the same thing as the value property
-      // assignment step above.
-      node.defaultValue = initialValue;
+  }
+  function getChildNamespace(parentNamespace, type) {
+    if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {
+      // No (or default) parent namespace: potential entry point.
+      return getIntrinsicNamespace(type);
     }
-  } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
-  // this is needed to work around a chrome bug where setting defaultChecked
-  // will sometimes influence the value of checked (even after detachment).
-  // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
-  // We need to temporarily unset name to avoid disrupting radio button groups.
 
+    if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
+      // We're leaving SVG.
+      return HTML_NAMESPACE;
+    } // By default, pass namespace below.
 
-  var name = node.name;
 
-  if (name !== '') {
-    node.name = '';
+    return parentNamespace;
   }
 
-  if (disableInputAttributeSyncing) {
-    // When not syncing the checked attribute, the checked property
-    // never gets assigned. It must be manually set. We don't want
-    // to do this when hydrating so that existing user input isn't
-    // modified
-    if (!isHydrating) {
-      updateChecked(element, props);
-    } // Only assign the checked attribute if it is defined. This saves
-    // a DOM write when controlling the checked attribute isn't needed
-    // (text inputs, submit/reset)
-
+  /* globals MSApp */
 
-    if (props.hasOwnProperty('defaultChecked')) {
-      node.defaultChecked = !node.defaultChecked;
-      node.defaultChecked = !!props.defaultChecked;
+  /**
+   * Create a function which has 'unsafe' privileges (required by windows8 apps)
+   */
+  var createMicrosoftUnsafeLocalFunction = function (func) {
+    if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
+      return function (arg0, arg1, arg2, arg3) {
+        MSApp.execUnsafeLocalFunction(function () {
+          return func(arg0, arg1, arg2, arg3);
+        });
+      };
+    } else {
+      return func;
     }
-  } else {
-    // When syncing the checked attribute, both the checked property and
-    // attribute are assigned at the same time using defaultChecked. This uses:
-    //
-    //   1. The checked React property when present
-    //   2. The defaultChecked React property when present
-    //   3. Otherwise, false
-    node.defaultChecked = !node.defaultChecked;
-    node.defaultChecked = !!node._wrapperState.initialChecked;
-  }
+  };
 
-  if (name !== '') {
-    node.name = name;
-  }
-}
-function restoreControlledState$1(element, props) {
-  var node = element;
-  updateWrapper(node, props);
-  updateNamedCousins(node, props);
-}
+  var reusableSVGContainer;
+  /**
+   * Set the innerHTML property of a node
+   *
+   * @param {DOMElement} node
+   * @param {string} html
+   * @internal
+   */
 
-function updateNamedCousins(rootNode, props) {
-  var name = props.name;
+  var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {
+    if (node.namespaceURI === Namespaces.svg) {
 
-  if (props.type === 'radio' && name != null) {
-    var queryRoot = rootNode;
+      if (!('innerHTML' in node)) {
+        // IE does not have innerHTML for SVG nodes, so instead we inject the
+        // new markup in a temp node and then move the child nodes across into
+        // the target node
+        reusableSVGContainer = reusableSVGContainer || document.createElement('div');
+        reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';
+        var svgNode = reusableSVGContainer.firstChild;
 
-    while (queryRoot.parentNode) {
-      queryRoot = queryRoot.parentNode;
-    } // If `rootNode.form` was non-null, then we could try `form.elements`,
-    // but that sometimes behaves strangely in IE8. We could also try using
-    // `form.getElementsByName`, but that will only return direct children
-    // and won't include inputs that use the HTML5 `form=` attribute. Since
-    // the input might not even be in a form. It might not even be in the
-    // document. Let's just use the local `querySelectorAll` to ensure we don't
-    // miss anything.
+        while (node.firstChild) {
+          node.removeChild(node.firstChild);
+        }
 
+        while (svgNode.firstChild) {
+          node.appendChild(svgNode.firstChild);
+        }
 
-    var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
-
-    for (var i = 0; i < group.length; i++) {
-      var otherNode = group[i];
+        return;
+      }
+    }
 
-      if (otherNode === rootNode || otherNode.form !== rootNode.form) {
-        continue;
-      } // This will throw if radio buttons rendered by different copies of React
-      // and the same name are rendered into the same form (same as #1939).
-      // That's probably okay; we don't support it just as we don't support
-      // mixing React radio buttons with non-React ones.
+    node.innerHTML = html;
+  });
 
+  /**
+   * HTML nodeType values that represent the type of the node
+   */
+  var ELEMENT_NODE = 1;
+  var TEXT_NODE = 3;
+  var COMMENT_NODE = 8;
+  var DOCUMENT_NODE = 9;
+  var DOCUMENT_FRAGMENT_NODE = 11;
 
-      var otherProps = getFiberCurrentPropsFromNode$1(otherNode);
+  /**
+   * Set the textContent property of a node. For text updates, it's faster
+   * to set the `nodeValue` of the Text node directly instead of using
+   * `.textContent` which will remove the existing node and create a new one.
+   *
+   * @param {DOMElement} node
+   * @param {string} text
+   * @internal
+   */
 
-      if (!otherProps) {
-        {
-          throw Error("ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.");
-        }
-      } // We need update the tracked value on the named cousin since the value
-      // was changed but the input saw no event or value set
+  var setTextContent = function (node, text) {
+    if (text) {
+      var firstChild = node.firstChild;
 
+      if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
+        firstChild.nodeValue = text;
+        return;
+      }
+    }
 
-      updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that
-      // was previously checked to update will cause it to be come re-checked
-      // as appropriate.
+    node.textContent = text;
+  };
 
-      updateWrapper(otherNode, otherProps);
-    }
+  // Do not use the below two methods directly!
+  // Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.
+  // (It is the only module that is allowed to access these methods.)
+  function unsafeCastStringToDOMTopLevelType(topLevelType) {
+    return topLevelType;
+  }
+  function unsafeCastDOMTopLevelTypeToString(topLevelType) {
+    return topLevelType;
   }
-} // In Chrome, assigning defaultValue to certain input types triggers input validation.
-// For number inputs, the display value loses trailing decimal points. For email inputs,
-// Chrome raises "The specified value <x> is not a valid email address".
-//
-// Here we check to see if the defaultValue has actually changed, avoiding these problems
-// when the user is inputting text
-//
-// https://github.com/facebook/react/issues/7253
 
+  /**
+   * Generate a mapping of standard vendor prefixes using the defined style property and event name.
+   *
+   * @param {string} styleProp
+   * @param {string} eventName
+   * @returns {object}
+   */
 
-function setDefaultValue(node, type, value) {
-  if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js
-  type !== 'number' || node.ownerDocument.activeElement !== node) {
-    if (value == null) {
-      node.defaultValue = toString(node._wrapperState.initialValue);
-    } else if (node.defaultValue !== toString(value)) {
-      node.defaultValue = toString(value);
-    }
+  function makePrefixMap(styleProp, eventName) {
+    var prefixes = {};
+    prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
+    prefixes['Webkit' + styleProp] = 'webkit' + eventName;
+    prefixes['Moz' + styleProp] = 'moz' + eventName;
+    return prefixes;
   }
-}
+  /**
+   * A list of event names to a configurable list of vendor prefixes.
+   */
 
-var didWarnSelectedSetOnOption = false;
-var didWarnInvalidChild = false;
 
-function flattenChildren(children) {
-  var content = ''; // Flatten children. We'll warn if they are invalid
-  // during validateProps() which runs for hydration too.
-  // Note that this would throw on non-element objects.
-  // Elements are stringified (which is normally irrelevant
-  // but matters for <fbt>).
+  var vendorPrefixes = {
+    animationend: makePrefixMap('Animation', 'AnimationEnd'),
+    animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
+    animationstart: makePrefixMap('Animation', 'AnimationStart'),
+    transitionend: makePrefixMap('Transition', 'TransitionEnd')
+  };
+  /**
+   * Event names that have already been detected and prefixed (if applicable).
+   */
 
-  React.Children.forEach(children, function (child) {
-    if (child == null) {
-      return;
-    }
+  var prefixedEventNames = {};
+  /**
+   * Element to check for prefixes on.
+   */
 
-    content += child; // Note: we don't warn about invalid children here.
-    // Instead, this is done separately below so that
-    // it happens during the hydration codepath too.
-  });
-  return content;
-}
-/**
- * Implements an <option> host component that warns when `selected` is set.
- */
+  var style = {};
+  /**
+   * Bootstrap if a DOM exists.
+   */
 
+  if (canUseDOM) {
+    style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,
+    // the un-prefixed "animation" and "transition" properties are defined on the
+    // style object but the events that fire will still be prefixed, so we need
+    // to check if the un-prefixed events are usable, and if not remove them from the map.
 
-function validateProps(element, props) {
-  {
-    // This mirrors the codepath above, but runs for hydration too.
-    // Warn about invalid children here so that client and hydration are consistent.
-    // TODO: this seems like it could cause a DEV-only throw for hydration
-    // if children contains a non-element object. We should try to avoid that.
-    if (typeof props.children === 'object' && props.children !== null) {
-      React.Children.forEach(props.children, function (child) {
-        if (child == null) {
-          return;
-        }
+    if (!('AnimationEvent' in window)) {
+      delete vendorPrefixes.animationend.animation;
+      delete vendorPrefixes.animationiteration.animation;
+      delete vendorPrefixes.animationstart.animation;
+    } // Same as above
 
-        if (typeof child === 'string' || typeof child === 'number') {
-          return;
-        }
 
-        if (typeof child.type !== 'string') {
-          return;
-        }
+    if (!('TransitionEvent' in window)) {
+      delete vendorPrefixes.transitionend.transition;
+    }
+  }
+  /**
+   * Attempts to determine the correct vendor prefixed event name.
+   *
+   * @param {string} eventName
+   * @returns {string}
+   */
 
-        if (!didWarnInvalidChild) {
-          didWarnInvalidChild = true;
-          warning$1(false, 'Only strings and numbers are supported as <option> children.');
-        }
-      });
-    } // TODO: Remove support for `selected` in <option>.
 
+  function getVendorPrefixedEventName(eventName) {
+    if (prefixedEventNames[eventName]) {
+      return prefixedEventNames[eventName];
+    } else if (!vendorPrefixes[eventName]) {
+      return eventName;
+    }
+
+    var prefixMap = vendorPrefixes[eventName];
 
-    if (props.selected != null && !didWarnSelectedSetOnOption) {
-      warning$1(false, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
-      didWarnSelectedSetOnOption = true;
+    for (var styleProp in prefixMap) {
+      if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
+        return prefixedEventNames[eventName] = prefixMap[styleProp];
+      }
     }
+
+    return eventName;
   }
-}
-function postMountWrapper$1(element, props) {
-  // value="" should make a value attribute (#6219)
-  if (props.value != null) {
-    element.setAttribute('value', toString(getToStringValue(props.value)));
-  }
-}
-function getHostProps$1(element, props) {
-  var hostProps = _assign({
-    children: undefined
-  }, props);
 
-  var content = flattenChildren(props.children);
+  /**
+   * To identify top level events in ReactDOM, we use constants defined by this
+   * module. This is the only module that uses the unsafe* methods to express
+   * that the constants actually correspond to the browser event names. This lets
+   * us save some bundle size by avoiding a top level type -> event name map.
+   * The rest of ReactDOM code should import top level types from this file.
+   */
 
-  if (content) {
-    hostProps.children = content;
+  var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');
+  var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));
+  var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));
+  var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));
+  var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');
+  var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');
+  var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');
+  var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');
+  var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');
+  var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');
+  var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');
+  var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');
+  var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');
+  var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');
+  var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');
+  var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');
+  var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');
+  var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');
+  var TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');
+  var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');
+  var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');
+  var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');
+  var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');
+  var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');
+  var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');
+  var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');
+  var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');
+  var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');
+  var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');
+  var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');
+  var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');
+  var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');
+  var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');
+  var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');
+  var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');
+  var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');
+  var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');
+  var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');
+  var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');
+  var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');
+  var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');
+  var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');
+  var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');
+  var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');
+  var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');
+  var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');
+  var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');
+  var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');
+  var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');
+  var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');
+  var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');
+  var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');
+  var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');
+  var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');
+  var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');
+  var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');
+  var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');
+  var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');
+  var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');
+  var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');
+  var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');
+  var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');
+  var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');
+  var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');
+  var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');
+  var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');
+  var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');
+  var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');
+  var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');
+  var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');
+  var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');
+  var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');
+  var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');
+  var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');
+  var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');
+  var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');
+  var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));
+  var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');
+  var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');
+  var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements.
+  // Note that events in this list will *not* be listened to at the top level
+  // unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.
+
+  var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];
+  function getRawEventName(topLevelType) {
+    return unsafeCastDOMTopLevelTypeToString(topLevelType);
+  }
+
+  var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // prettier-ignore
+
+  var elementListenerMap = new PossiblyWeakMap();
+  function getListenerMapForElement(element) {
+    var listenerMap = elementListenerMap.get(element);
+
+    if (listenerMap === undefined) {
+      listenerMap = new Map();
+      elementListenerMap.set(element, listenerMap);
+    }
+
+    return listenerMap;
   }
 
-  return hostProps;
-}
-
-// TODO: direct imports like some-package/src/* are bad. Fix me.
-var didWarnValueDefaultValue$1;
+  /**
+   * `ReactInstanceMap` maintains a mapping from a public facing stateful
+   * instance (key) and the internal representation (value). This allows public
+   * methods to accept the user facing instance as an argument and map them back
+   * to internal methods.
+   *
+   * Note that this module is currently shared and assumed to be stateless.
+   * If this becomes an actual Map, that will break.
+   */
+  function get(key) {
+    return key._reactInternalFiber;
+  }
+  function has$1(key) {
+    return key._reactInternalFiber !== undefined;
+  }
+  function set(key, value) {
+    key._reactInternalFiber = value;
+  }
+
+  // Don't change these two values. They're used by React Dev Tools.
+  var NoEffect =
+  /*              */
+  0;
+  var PerformedWork =
+  /*         */
+  1; // You can change the rest (and add more).
+
+  var Placement =
+  /*             */
+  2;
+  var Update =
+  /*                */
+  4;
+  var PlacementAndUpdate =
+  /*    */
+  6;
+  var Deletion =
+  /*              */
+  8;
+  var ContentReset =
+  /*          */
+  16;
+  var Callback =
+  /*              */
+  32;
+  var DidCapture =
+  /*            */
+  64;
+  var Ref =
+  /*                   */
+  128;
+  var Snapshot =
+  /*              */
+  256;
+  var Passive =
+  /*               */
+  512;
+  var Hydrating =
+  /*             */
+  1024;
+  var HydratingAndUpdate =
+  /*    */
+  1028; // Passive & Update & Callback & Ref & Snapshot
+
+  var LifecycleEffectMask =
+  /*   */
+  932; // Union of all host effects
+
+  var HostEffectMask =
+  /*        */
+  2047;
+  var Incomplete =
+  /*            */
+  2048;
+  var ShouldCapture =
+  /*         */
+  4096;
+
+  var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
+  function getNearestMountedFiber(fiber) {
+    var node = fiber;
+    var nearestMounted = fiber;
 
-{
-  didWarnValueDefaultValue$1 = false;
-}
+    if (!fiber.alternate) {
+      // If there is no alternate, this might be a new tree that isn't inserted
+      // yet. If it is, then it will have a pending insertion effect on it.
+      var nextNode = node;
 
-function getDeclarationErrorAddendum() {
-  var ownerName = getCurrentFiberOwnerNameInDevOrNull();
+      do {
+        node = nextNode;
 
-  if (ownerName) {
-    return '\n\nCheck the render method of `' + ownerName + '`.';
-  }
+        if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) {
+          // This is an insertion or in-progress hydration. The nearest possible
+          // mounted fiber is the parent but we need to continue to figure out
+          // if that one is still mounted.
+          nearestMounted = node.return;
+        }
 
-  return '';
-}
+        nextNode = node.return;
+      } while (nextNode);
+    } else {
+      while (node.return) {
+        node = node.return;
+      }
+    }
 
-var valuePropNames = ['value', 'defaultValue'];
-/**
- * Validation function for `value` and `defaultValue`.
- */
+    if (node.tag === HostRoot) {
+      // TODO: Check if this was a nested HostRoot when used with
+      // renderContainerIntoSubtree.
+      return nearestMounted;
+    } // If we didn't hit the root, that means that we're in an disconnected tree
+    // that has been unmounted.
 
-function checkSelectPropTypes(props) {
-  ReactControlledValuePropTypes.checkPropTypes('select', props);
 
-  for (var i = 0; i < valuePropNames.length; i++) {
-    var propName = valuePropNames[i];
+    return null;
+  }
+  function getSuspenseInstanceFromFiber(fiber) {
+    if (fiber.tag === SuspenseComponent) {
+      var suspenseState = fiber.memoizedState;
 
-    if (props[propName] == null) {
-      continue;
-    }
+      if (suspenseState === null) {
+        var current = fiber.alternate;
 
-    var isArray = Array.isArray(props[propName]);
+        if (current !== null) {
+          suspenseState = current.memoizedState;
+        }
+      }
 
-    if (props.multiple && !isArray) {
-      warning$1(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());
-    } else if (!props.multiple && isArray) {
-      warning$1(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());
+      if (suspenseState !== null) {
+        return suspenseState.dehydrated;
+      }
     }
+
+    return null;
   }
-}
+  function getContainerFromFiber(fiber) {
+    return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;
+  }
+  function isFiberMounted(fiber) {
+    return getNearestMountedFiber(fiber) === fiber;
+  }
+  function isMounted(component) {
+    {
+      var owner = ReactCurrentOwner.current;
 
-function updateOptions(node, multiple, propValue, setDefaultSelected) {
-  var options = node.options;
+      if (owner !== null && owner.tag === ClassComponent) {
+        var ownerFiber = owner;
+        var instance = ownerFiber.stateNode;
 
-  if (multiple) {
-    var selectedValues = propValue;
-    var selectedValue = {};
+        if (!instance._warnedAboutRefsInRender) {
+          error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component');
+        }
 
-    for (var i = 0; i < selectedValues.length; i++) {
-      // Prefix to avoid chaos with special keys.
-      selectedValue['$' + selectedValues[i]] = true;
+        instance._warnedAboutRefsInRender = true;
+      }
     }
 
-    for (var _i = 0; _i < options.length; _i++) {
-      var selected = selectedValue.hasOwnProperty('$' + options[_i].value);
+    var fiber = get(component);
 
-      if (options[_i].selected !== selected) {
-        options[_i].selected = selected;
-      }
+    if (!fiber) {
+      return false;
+    }
+
+    return getNearestMountedFiber(fiber) === fiber;
+  }
 
-      if (selected && setDefaultSelected) {
-        options[_i].defaultSelected = true;
+  function assertIsMounted(fiber) {
+    if (!(getNearestMountedFiber(fiber) === fiber)) {
+      {
+        throw Error( "Unable to find node on an unmounted component." );
       }
     }
-  } else {
-    // Do not set `select.value` as exact behavior isn't consistent across all
-    // browsers for all cases.
-    var _selectedValue = toString(getToStringValue(propValue));
+  }
 
-    var defaultSelected = null;
+  function findCurrentFiberUsingSlowPath(fiber) {
+    var alternate = fiber.alternate;
 
-    for (var _i2 = 0; _i2 < options.length; _i2++) {
-      if (options[_i2].value === _selectedValue) {
-        options[_i2].selected = true;
+    if (!alternate) {
+      // If there is no alternate, then we only need to check if it is mounted.
+      var nearestMounted = getNearestMountedFiber(fiber);
 
-        if (setDefaultSelected) {
-          options[_i2].defaultSelected = true;
+      if (!(nearestMounted !== null)) {
+        {
+          throw Error( "Unable to find node on an unmounted component." );
         }
+      }
 
-        return;
+      if (nearestMounted !== fiber) {
+        return null;
       }
 
-      if (defaultSelected === null && !options[_i2].disabled) {
-        defaultSelected = options[_i2];
+      return fiber;
+    } // If we have two possible branches, we'll walk backwards up to the root
+    // to see what path the root points to. On the way we may hit one of the
+    // special cases and we'll deal with them.
+
+
+    var a = fiber;
+    var b = alternate;
+
+    while (true) {
+      var parentA = a.return;
+
+      if (parentA === null) {
+        // We're at the root.
+        break;
       }
-    }
 
-    if (defaultSelected !== null) {
-      defaultSelected.selected = true;
-    }
-  }
-}
-/**
- * Implements a <select> host component that allows optionally setting the
- * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
- * stringable. If `multiple` is true, the prop must be an array of stringables.
- *
- * If `value` is not supplied (or null/undefined), user actions that change the
- * selected option will trigger updates to the rendered options.
- *
- * If it is supplied (and not null/undefined), the rendered options will not
- * update in response to user actions. Instead, the `value` prop must change in
- * order for the rendered options to update.
- *
- * If `defaultValue` is provided, any options with the supplied values will be
- * selected.
- */
+      var parentB = parentA.alternate;
 
+      if (parentB === null) {
+        // There is no alternate. This is an unusual case. Currently, it only
+        // happens when a Suspense component is hidden. An extra fragment fiber
+        // is inserted in between the Suspense fiber and its children. Skip
+        // over this extra fragment fiber and proceed to the next parent.
+        var nextParent = parentA.return;
 
-function getHostProps$2(element, props) {
-  return _assign({}, props, {
-    value: undefined
-  });
-}
-function initWrapperState$1(element, props) {
-  var node = element;
+        if (nextParent !== null) {
+          a = b = nextParent;
+          continue;
+        } // If there's no parent, we're at the root.
 
-  {
-    checkSelectPropTypes(props);
-  }
 
-  node._wrapperState = {
-    wasMultiple: !!props.multiple
-  };
+        break;
+      } // If both copies of the parent fiber point to the same child, we can
+      // assume that the child is current. This happens when we bailout on low
+      // priority: the bailed out fiber's child reuses the current child.
 
-  {
-    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {
-      warning$1(false, 'Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');
-      didWarnValueDefaultValue$1 = true;
-    }
-  }
-}
-function postMountWrapper$2(element, props) {
-  var node = element;
-  node.multiple = !!props.multiple;
-  var value = props.value;
-
-  if (value != null) {
-    updateOptions(node, !!props.multiple, value, false);
-  } else if (props.defaultValue != null) {
-    updateOptions(node, !!props.multiple, props.defaultValue, true);
-  }
-}
-function postUpdateWrapper(element, props) {
-  var node = element;
-  var wasMultiple = node._wrapperState.wasMultiple;
-  node._wrapperState.wasMultiple = !!props.multiple;
-  var value = props.value;
-
-  if (value != null) {
-    updateOptions(node, !!props.multiple, value, false);
-  } else if (wasMultiple !== !!props.multiple) {
-    // For simplicity, reapply `defaultValue` if `multiple` is toggled.
-    if (props.defaultValue != null) {
-      updateOptions(node, !!props.multiple, props.defaultValue, true);
-    } else {
-      // Revert the select back to its default unselected state.
-      updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);
-    }
-  }
-}
-function restoreControlledState$2(element, props) {
-  var node = element;
-  var value = props.value;
 
-  if (value != null) {
-    updateOptions(node, !!props.multiple, value, false);
-  }
-}
+      if (parentA.child === parentB.child) {
+        var child = parentA.child;
 
-var didWarnValDefaultVal = false;
+        while (child) {
+          if (child === a) {
+            // We've determined that A is the current branch.
+            assertIsMounted(parentA);
+            return fiber;
+          }
 
-/**
- * Implements a <textarea> host component that allows setting `value`, and
- * `defaultValue`. This differs from the traditional DOM API because value is
- * usually set as PCDATA children.
- *
- * If `value` is not supplied (or null/undefined), user actions that affect the
- * value will trigger updates to the element.
- *
- * If `value` is supplied (and not null/undefined), the rendered element will
- * not trigger updates to the element. Instead, the `value` prop must change in
- * order for the rendered element to be updated.
- *
- * The rendered element will be initialized with an empty value, the prop
- * `defaultValue` if specified, or the children content (deprecated).
- */
-function getHostProps$3(element, props) {
-  var node = element;
+          if (child === b) {
+            // We've determined that B is the current branch.
+            assertIsMounted(parentA);
+            return alternate;
+          }
 
-  if (!(props.dangerouslySetInnerHTML == null)) {
-    {
-      throw Error("`dangerouslySetInnerHTML` does not make sense on <textarea>.");
-    }
-  } // Always set children to the same thing. In IE9, the selection range will
-  // get reset if `textContent` is mutated.  We could add a check in setTextContent
-  // to only set the value if/when the value differs from the node value (which would
-  // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this
-  // solution. The value can be a boolean or object so that's why it's forced
-  // to be a string.
+          child = child.sibling;
+        } // We should never have an alternate for any mounting node. So the only
+        // way this could possibly happen is if this was unmounted, if at all.
 
 
-  var hostProps = _assign({}, props, {
-    value: undefined,
-    defaultValue: undefined,
-    children: toString(node._wrapperState.initialValue)
-  });
+        {
+          {
+            throw Error( "Unable to find node on an unmounted component." );
+          }
+        }
+      }
 
-  return hostProps;
-}
-function initWrapperState$2(element, props) {
-  var node = element;
+      if (a.return !== b.return) {
+        // The return pointer of A and the return pointer of B point to different
+        // fibers. We assume that return pointers never criss-cross, so A must
+        // belong to the child set of A.return, and B must belong to the child
+        // set of B.return.
+        a = parentA;
+        b = parentB;
+      } else {
+        // The return pointers point to the same fiber. We'll have to use the
+        // default, slow path: scan the child sets of each parent alternate to see
+        // which child belongs to which set.
+        //
+        // Search parent A's child set
+        var didFindChild = false;
+        var _child = parentA.child;
 
-  {
-    ReactControlledValuePropTypes.checkPropTypes('textarea', props);
+        while (_child) {
+          if (_child === a) {
+            didFindChild = true;
+            a = parentA;
+            b = parentB;
+            break;
+          }
 
-    if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {
-      warning$1(false, '%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
-      didWarnValDefaultVal = true;
-    }
-  }
+          if (_child === b) {
+            didFindChild = true;
+            b = parentA;
+            a = parentB;
+            break;
+          }
 
-  var initialValue = props.value; // Only bother fetching default value if we're going to use it
+          _child = _child.sibling;
+        }
+
+        if (!didFindChild) {
+          // Search parent B's child set
+          _child = parentB.child;
+
+          while (_child) {
+            if (_child === a) {
+              didFindChild = true;
+              a = parentB;
+              b = parentA;
+              break;
+            }
 
-  if (initialValue == null) {
-    var defaultValue = props.defaultValue; // TODO (yungsters): Remove support for children content in <textarea>.
+            if (_child === b) {
+              didFindChild = true;
+              b = parentB;
+              a = parentA;
+              break;
+            }
 
-    var children = props.children;
+            _child = _child.sibling;
+          }
 
-    if (children != null) {
-      {
-        warning$1(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
+          if (!didFindChild) {
+            {
+              throw Error( "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue." );
+            }
+          }
+        }
       }
 
-      if (!(defaultValue == null)) {
+      if (!(a.alternate === b)) {
         {
-          throw Error("If you supply `defaultValue` on a <textarea>, do not pass children.");
+          throw Error( "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue." );
         }
       }
+    } // If the root is not a host container, we're in a disconnected tree. I.e.
+    // unmounted.
 
-      if (Array.isArray(children)) {
-        if (!(children.length <= 1)) {
-          {
-            throw Error("<textarea> can only have at most one child.");
-          }
-        }
 
-        children = children[0];
+    if (!(a.tag === HostRoot)) {
+      {
+        throw Error( "Unable to find node on an unmounted component." );
       }
-
-      defaultValue = children;
     }
 
-    if (defaultValue == null) {
-      defaultValue = '';
-    }
+    if (a.stateNode.current === a) {
+      // We've determined that A is the current branch.
+      return fiber;
+    } // Otherwise B has to be current branch.
 
-    initialValue = defaultValue;
+
+    return alternate;
   }
+  function findCurrentHostFiber(parent) {
+    var currentParent = findCurrentFiberUsingSlowPath(parent);
 
-  node._wrapperState = {
-    initialValue: getToStringValue(initialValue)
-  };
-}
-function updateWrapper$1(element, props) {
-  var node = element;
-  var value = getToStringValue(props.value);
-  var defaultValue = getToStringValue(props.defaultValue);
+    if (!currentParent) {
+      return null;
+    } // Next we'll drill down this component to find the first HostComponent/Text.
 
-  if (value != null) {
-    // Cast `value` to a string to ensure the value is set correctly. While
-    // browsers typically do this as necessary, jsdom doesn't.
-    var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed
 
-    if (newValue !== node.value) {
-      node.value = newValue;
-    }
+    var node = currentParent;
 
-    if (props.defaultValue == null && node.defaultValue !== newValue) {
-      node.defaultValue = newValue;
-    }
-  }
+    while (true) {
+      if (node.tag === HostComponent || node.tag === HostText) {
+        return node;
+      } else if (node.child) {
+        node.child.return = node;
+        node = node.child;
+        continue;
+      }
 
-  if (defaultValue != null) {
-    node.defaultValue = toString(defaultValue);
-  }
-}
-function postMountWrapper$3(element, props) {
-  var node = element; // This is in postMount because we need access to the DOM node, which is not
-  // available until after the component has mounted.
+      if (node === currentParent) {
+        return null;
+      }
 
-  var textContent = node.textContent; // Only set node.value if textContent is equal to the expected
-  // initial value. In IE10/IE11 there is a bug where the placeholder attribute
-  // will populate textContent as well.
-  // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
+      while (!node.sibling) {
+        if (!node.return || node.return === currentParent) {
+          return null;
+        }
 
-  if (textContent === node._wrapperState.initialValue) {
-    if (textContent !== '' && textContent !== null) {
-      node.value = textContent;
-    }
+        node = node.return;
+      }
+
+      node.sibling.return = node.return;
+      node = node.sibling;
+    } // Flow needs the return null here, but ESLint complains about it.
+    // eslint-disable-next-line no-unreachable
+
+
+    return null;
   }
-}
-function restoreControlledState$3(element, props) {
-  // DOM component is still mounted; update
-  updateWrapper$1(element, props);
-}
+  function findCurrentHostFiberWithNoPortals(parent) {
+    var currentParent = findCurrentFiberUsingSlowPath(parent);
 
-var HTML_NAMESPACE$1 = 'http://www.w3.org/1999/xhtml';
-var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
-var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
-var Namespaces = {
-  html: HTML_NAMESPACE$1,
-  mathml: MATH_NAMESPACE,
-  svg: SVG_NAMESPACE
-}; // Assumes there is no parent namespace.
+    if (!currentParent) {
+      return null;
+    } // Next we'll drill down this component to find the first HostComponent/Text.
 
-function getIntrinsicNamespace(type) {
-  switch (type) {
-    case 'svg':
-      return SVG_NAMESPACE;
 
-    case 'math':
-      return MATH_NAMESPACE;
+    var node = currentParent;
 
-    default:
-      return HTML_NAMESPACE$1;
-  }
-}
-function getChildNamespace(parentNamespace, type) {
-  if (parentNamespace == null || parentNamespace === HTML_NAMESPACE$1) {
-    // No (or default) parent namespace: potential entry point.
-    return getIntrinsicNamespace(type);
-  }
+    while (true) {
+      if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) {
+        return node;
+      } else if (node.child && node.tag !== HostPortal) {
+        node.child.return = node;
+        node = node.child;
+        continue;
+      }
 
-  if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
-    // We're leaving SVG.
-    return HTML_NAMESPACE$1;
-  } // By default, pass namespace below.
+      if (node === currentParent) {
+        return null;
+      }
+
+      while (!node.sibling) {
+        if (!node.return || node.return === currentParent) {
+          return null;
+        }
 
+        node = node.return;
+      }
 
-  return parentNamespace;
-}
+      node.sibling.return = node.return;
+      node = node.sibling;
+    } // Flow needs the return null here, but ESLint complains about it.
+    // eslint-disable-next-line no-unreachable
 
-/* globals MSApp */
 
-/**
- * Create a function which has 'unsafe' privileges (required by windows8 apps)
- */
-var createMicrosoftUnsafeLocalFunction = function (func) {
-  if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
-    return function (arg0, arg1, arg2, arg3) {
-      MSApp.execUnsafeLocalFunction(function () {
-        return func(arg0, arg1, arg2, arg3);
-      });
-    };
-  } else {
-    return func;
+    return null;
   }
-};
 
-var reusableSVGContainer;
-/**
- * Set the innerHTML property of a node
- *
- * @param {DOMElement} node
- * @param {string} html
- * @internal
- */
+  /**
+   * Accumulates items that must not be null or undefined into the first one. This
+   * is used to conserve memory by avoiding array allocations, and thus sacrifices
+   * API cleanness. Since `current` can be null before being passed in and not
+   * null after this function, make sure to assign it back to `current`:
+   *
+   * `a = accumulateInto(a, b);`
+   *
+   * This API should be sparingly used. Try `accumulate` for something cleaner.
+   *
+   * @return {*|array<*>} An accumulation of items.
+   */
 
-var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {
-  if (node.namespaceURI === Namespaces.svg) {
-    {
-      if (enableTrustedTypesIntegration) {
-        // TODO: reconsider the text of this warning and when it should show
-        // before enabling the feature flag.
-        !(typeof trustedTypes === 'undefined') ? warning$1(false, "Using 'dangerouslySetInnerHTML' in an svg element with " + 'Trusted Types enabled in an Internet Explorer will cause ' + 'the trusted value to be converted to string. Assigning string ' + "to 'innerHTML' will throw an error if Trusted Types are enforced. " + "You can try to wrap your svg element inside a div and use 'dangerouslySetInnerHTML' " + 'on the enclosing div instead.') : void 0;
+  function accumulateInto(current, next) {
+    if (!(next != null)) {
+      {
+        throw Error( "accumulateInto(...): Accumulated items must not be null or undefined." );
       }
     }
 
-    if (!('innerHTML' in node)) {
-      // IE does not have innerHTML for SVG nodes, so instead we inject the
-      // new markup in a temp node and then move the child nodes across into
-      // the target node
-      reusableSVGContainer = reusableSVGContainer || document.createElement('div');
-      reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';
-      var svgNode = reusableSVGContainer.firstChild;
+    if (current == null) {
+      return next;
+    } // Both are not empty. Warning: Never call x.concat(y) when you are not
+    // certain that x is an Array (x could be a string with concat method).
 
-      while (node.firstChild) {
-        node.removeChild(node.firstChild);
-      }
 
-      while (svgNode.firstChild) {
-        node.appendChild(svgNode.firstChild);
+    if (Array.isArray(current)) {
+      if (Array.isArray(next)) {
+        current.push.apply(current, next);
+        return current;
       }
 
-      return;
+      current.push(next);
+      return current;
     }
-  }
 
-  node.innerHTML = html;
-});
-
-/**
- * HTML nodeType values that represent the type of the node
- */
-var ELEMENT_NODE = 1;
-var TEXT_NODE = 3;
-var COMMENT_NODE = 8;
-var DOCUMENT_NODE = 9;
-var DOCUMENT_FRAGMENT_NODE = 11;
-
-/**
- * Set the textContent property of a node. For text updates, it's faster
- * to set the `nodeValue` of the Text node directly instead of using
- * `.textContent` which will remove the existing node and create a new one.
- *
- * @param {DOMElement} node
- * @param {string} text
- * @internal
- */
+    if (Array.isArray(next)) {
+      // A bit too dangerous to mutate `next`.
+      return [current].concat(next);
+    }
 
-var setTextContent = function (node, text) {
-  if (text) {
-    var firstChild = node.firstChild;
+    return [current, next];
+  }
 
-    if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
-      firstChild.nodeValue = text;
-      return;
+  /**
+   * @param {array} arr an "accumulation" of items which is either an Array or
+   * a single item. Useful when paired with the `accumulate` module. This is a
+   * simple utility that allows us to reason about a collection of items, but
+   * handling the case when there is exactly one item (and we do not need to
+   * allocate an array).
+   * @param {function} cb Callback invoked with each element or a collection.
+   * @param {?} [scope] Scope used as `this` in a callback.
+   */
+  function forEachAccumulated(arr, cb, scope) {
+    if (Array.isArray(arr)) {
+      arr.forEach(cb, scope);
+    } else if (arr) {
+      cb.call(scope, arr);
     }
   }
 
-  node.textContent = text;
-};
+  /**
+   * Internal queue of events that have accumulated their dispatches and are
+   * waiting to have their dispatches executed.
+   */
 
-// Do not use the below two methods directly!
-// Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.
-// (It is the only module that is allowed to access these methods.)
-function unsafeCastStringToDOMTopLevelType(topLevelType) {
-  return topLevelType;
-}
-function unsafeCastDOMTopLevelTypeToString(topLevelType) {
-  return topLevelType;
-}
+  var eventQueue = null;
+  /**
+   * Dispatches an event and releases it back into the pool, unless persistent.
+   *
+   * @param {?object} event Synthetic event to be dispatched.
+   * @private
+   */
 
-/**
- * Generate a mapping of standard vendor prefixes using the defined style property and event name.
- *
- * @param {string} styleProp
- * @param {string} eventName
- * @returns {object}
- */
-
-function makePrefixMap(styleProp, eventName) {
-  var prefixes = {};
-  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
-  prefixes['Webkit' + styleProp] = 'webkit' + eventName;
-  prefixes['Moz' + styleProp] = 'moz' + eventName;
-  return prefixes;
-}
-/**
- * A list of event names to a configurable list of vendor prefixes.
- */
+  var executeDispatchesAndRelease = function (event) {
+    if (event) {
+      executeDispatchesInOrder(event);
 
+      if (!event.isPersistent()) {
+        event.constructor.release(event);
+      }
+    }
+  };
 
-var vendorPrefixes = {
-  animationend: makePrefixMap('Animation', 'AnimationEnd'),
-  animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
-  animationstart: makePrefixMap('Animation', 'AnimationStart'),
-  transitionend: makePrefixMap('Transition', 'TransitionEnd')
-};
-/**
- * Event names that have already been detected and prefixed (if applicable).
- */
+  var executeDispatchesAndReleaseTopLevel = function (e) {
+    return executeDispatchesAndRelease(e);
+  };
 
-var prefixedEventNames = {};
-/**
- * Element to check for prefixes on.
- */
+  function runEventsInBatch(events) {
+    if (events !== null) {
+      eventQueue = accumulateInto(eventQueue, events);
+    } // Set `eventQueue` to null before processing it so that we can tell if more
+    // events get enqueued while processing.
 
-var style = {};
-/**
- * Bootstrap if a DOM exists.
- */
 
-if (canUseDOM) {
-  style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,
-  // the un-prefixed "animation" and "transition" properties are defined on the
-  // style object but the events that fire will still be prefixed, so we need
-  // to check if the un-prefixed events are usable, and if not remove them from the map.
+    var processingEventQueue = eventQueue;
+    eventQueue = null;
 
-  if (!('AnimationEvent' in window)) {
-    delete vendorPrefixes.animationend.animation;
-    delete vendorPrefixes.animationiteration.animation;
-    delete vendorPrefixes.animationstart.animation;
-  } // Same as above
+    if (!processingEventQueue) {
+      return;
+    }
 
+    forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);
 
-  if (!('TransitionEvent' in window)) {
-    delete vendorPrefixes.transitionend.transition;
-  }
-}
-/**
- * Attempts to determine the correct vendor prefixed event name.
- *
- * @param {string} eventName
- * @returns {string}
- */
+    if (!!eventQueue) {
+      {
+        throw Error( "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." );
+      }
+    } // This would be a good time to rethrow if any of the event handlers threw.
 
 
-function getVendorPrefixedEventName(eventName) {
-  if (prefixedEventNames[eventName]) {
-    return prefixedEventNames[eventName];
-  } else if (!vendorPrefixes[eventName]) {
-    return eventName;
+    rethrowCaughtError();
   }
 
-  var prefixMap = vendorPrefixes[eventName];
-
-  for (var styleProp in prefixMap) {
-    if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
-      return prefixedEventNames[eventName] = prefixMap[styleProp];
-    }
-  }
+  /**
+   * Gets the target node from a native browser event by accounting for
+   * inconsistencies in browser DOM APIs.
+   *
+   * @param {object} nativeEvent Native browser event.
+   * @return {DOMEventTarget} Target node.
+   */
 
-  return eventName;
-}
+  function getEventTarget(nativeEvent) {
+    // Fallback to nativeEvent.srcElement for IE9
+    // https://github.com/facebook/react/issues/12506
+    var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963
 
-/**
- * To identify top level events in ReactDOM, we use constants defined by this
- * module. This is the only module that uses the unsafe* methods to express
- * that the constants actually correspond to the browser event names. This lets
- * us save some bundle size by avoiding a top level type -> event name map.
- * The rest of ReactDOM code should import top level types from this file.
- */
+    if (target.correspondingUseElement) {
+      target = target.correspondingUseElement;
+    } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
+    // @see http://www.quirksmode.org/js/events_properties.html
 
-var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');
-var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));
-var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));
-var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));
-var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');
-var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');
-var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');
-var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');
-var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');
-var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');
-var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');
-var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');
-var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');
-var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');
-var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');
-var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');
-var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');
-var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');
-var TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');
-var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');
-var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');
-var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');
-var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');
-var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');
-var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');
-var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');
-var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');
-var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');
-var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');
-var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');
-var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');
-var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');
-var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');
-var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');
-var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');
-var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');
-var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');
-var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');
-var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');
-var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');
-var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');
-var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');
-var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');
-var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');
-var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');
-var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');
-var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');
-var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');
-var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');
-var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');
-var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');
-var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');
-var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');
-var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');
-var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');
-
-
-var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');
-var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');
-var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');
-var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');
-var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');
-var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');
-var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');
-var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');
-var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');
-var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');
-var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');
-var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');
-var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');
-var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');
-var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');
-var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');
-var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');
-var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');
-var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');
-var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');
-var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');
-var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));
-var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');
-var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');
-var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements.
-// Note that events in this list will *not* be listened to at the top level
-// unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.
-
-var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];
-function getRawEventName(topLevelType) {
-  return unsafeCastDOMTopLevelTypeToString(topLevelType);
-}
-
-/**
- * `ReactInstanceMap` maintains a mapping from a public facing stateful
- * instance (key) and the internal representation (value). This allows public
- * methods to accept the user facing instance as an argument and map them back
- * to internal methods.
- *
- * Note that this module is currently shared and assumed to be stateless.
- * If this becomes an actual Map, that will break.
- */
 
-/**
- * This API should be called `delete` but we'd have to make sure to always
- * transform these to strings for IE support. When this transform is fully
- * supported we can rename it.
- */
+    return target.nodeType === TEXT_NODE ? target.parentNode : target;
+  }
 
-function get(key) {
-  return key._reactInternalFiber;
-}
-function has$1(key) {
-  return key._reactInternalFiber !== undefined;
-}
-function set(key, value) {
-  key._reactInternalFiber = value;
-}
-
-// Don't change these two values. They're used by React Dev Tools.
-var NoEffect =
-/*              */
-0;
-var PerformedWork =
-/*         */
-1; // You can change the rest (and add more).
-
-var Placement =
-/*             */
-2;
-var Update =
-/*                */
-4;
-var PlacementAndUpdate =
-/*    */
-6;
-var Deletion =
-/*              */
-8;
-var ContentReset =
-/*          */
-16;
-var Callback =
-/*              */
-32;
-var DidCapture =
-/*            */
-64;
-var Ref =
-/*                   */
-128;
-var Snapshot =
-/*              */
-256;
-var Passive =
-/*               */
-512;
-var Hydrating =
-/*             */
-1024;
-var HydratingAndUpdate =
-/*    */
-1028; // Passive & Update & Callback & Ref & Snapshot
-
-var LifecycleEffectMask =
-/*   */
-932; // Union of all host effects
-
-var HostEffectMask =
-/*        */
-2047;
-var Incomplete =
-/*            */
-2048;
-var ShouldCapture =
-/*         */
-4096;
-
-var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
-function getNearestMountedFiber(fiber) {
-  var node = fiber;
-  var nearestMounted = fiber;
-
-  if (!fiber.alternate) {
-    // If there is no alternate, this might be a new tree that isn't inserted
-    // yet. If it is, then it will have a pending insertion effect on it.
-    var nextNode = node;
+  /**
+   * Checks if an event is supported in the current execution environment.
+   *
+   * NOTE: This will not work correctly for non-generic events such as `change`,
+   * `reset`, `load`, `error`, and `select`.
+   *
+   * Borrows from Modernizr.
+   *
+   * @param {string} eventNameSuffix Event name, e.g. "click".
+   * @return {boolean} True if the event is supported.
+   * @internal
+   * @license Modernizr 3.0.0pre (Custom Build) | MIT
+   */
 
-    do {
-      node = nextNode;
+  function isEventSupported(eventNameSuffix) {
+    if (!canUseDOM) {
+      return false;
+    }
 
-      if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) {
-        // This is an insertion or in-progress hydration. The nearest possible
-        // mounted fiber is the parent but we need to continue to figure out
-        // if that one is still mounted.
-        nearestMounted = node.return;
-      }
+    var eventName = 'on' + eventNameSuffix;
+    var isSupported = eventName in document;
 
-      nextNode = node.return;
-    } while (nextNode);
-  } else {
-    while (node.return) {
-      node = node.return;
+    if (!isSupported) {
+      var element = document.createElement('div');
+      element.setAttribute(eventName, 'return;');
+      isSupported = typeof element[eventName] === 'function';
     }
-  }
-
-  if (node.tag === HostRoot) {
-    // TODO: Check if this was a nested HostRoot when used with
-    // renderContainerIntoSubtree.
-    return nearestMounted;
-  } // If we didn't hit the root, that means that we're in an disconnected tree
-  // that has been unmounted.
 
+    return isSupported;
+  }
 
-  return null;
-}
-function getSuspenseInstanceFromFiber(fiber) {
-  if (fiber.tag === SuspenseComponent) {
-    var suspenseState = fiber.memoizedState;
+  /**
+   * Summary of `DOMEventPluginSystem` event handling:
+   *
+   *  - Top-level delegation is used to trap most native browser events. This
+   *    may only occur in the main thread and is the responsibility of
+   *    ReactDOMEventListener, which is injected and can therefore support
+   *    pluggable event sources. This is the only work that occurs in the main
+   *    thread.
+   *
+   *  - We normalize and de-duplicate events to account for browser quirks. This
+   *    may be done in the worker thread.
+   *
+   *  - Forward these native events (with the associated top-level type used to
+   *    trap it) to `EventPluginRegistry`, which in turn will ask plugins if they want
+   *    to extract any synthetic events.
+   *
+   *  - The `EventPluginRegistry` will then process each event by annotating them with
+   *    "dispatches", a sequence of listeners and IDs that care about that event.
+   *
+   *  - The `EventPluginRegistry` then dispatches the events.
+   *
+   * Overview of React and the event system:
+   *
+   * +------------+    .
+   * |    DOM     |    .
+   * +------------+    .
+   *       |           .
+   *       v           .
+   * +------------+    .
+   * | ReactEvent |    .
+   * |  Listener  |    .
+   * +------------+    .                         +-----------+
+   *       |           .               +--------+|SimpleEvent|
+   *       |           .               |         |Plugin     |
+   * +-----|------+    .               v         +-----------+
+   * |     |      |    .    +--------------+                    +------------+
+   * |     +-----------.--->|PluginRegistry|                    |    Event   |
+   * |            |    .    |              |     +-----------+  | Propagators|
+   * | ReactEvent |    .    |              |     |TapEvent   |  |------------|
+   * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|
+   * |            |    .    |              |     +-----------+  |  utilities |
+   * |     +-----------.--->|              |                    +------------+
+   * |     |      |    .    +--------------+
+   * +-----|------+    .                ^        +-----------+
+   *       |           .                |        |Enter/Leave|
+   *       +           .                +-------+|Plugin     |
+   * +-------------+   .                         +-----------+
+   * | application |   .
+   * |-------------|   .
+   * |             |   .
+   * |             |   .
+   * +-------------+   .
+   *                   .
+   *    React Core     .  General Purpose Event Plugin System
+   */
 
-    if (suspenseState === null) {
-      var current = fiber.alternate;
+  var CALLBACK_BOOKKEEPING_POOL_SIZE = 10;
+  var callbackBookkeepingPool = [];
 
-      if (current !== null) {
-        suspenseState = current.memoizedState;
-      }
-    }
+  function releaseTopLevelCallbackBookKeeping(instance) {
+    instance.topLevelType = null;
+    instance.nativeEvent = null;
+    instance.targetInst = null;
+    instance.ancestors.length = 0;
 
-    if (suspenseState !== null) {
-      return suspenseState.dehydrated;
+    if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {
+      callbackBookkeepingPool.push(instance);
     }
-  }
+  } // Used to store ancestor hierarchy in top level callback
 
-  return null;
-}
-function getContainerFromFiber(fiber) {
-  return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;
-}
-function isFiberMounted(fiber) {
-  return getNearestMountedFiber(fiber) === fiber;
-}
-function isMounted(component) {
-  {
-    var owner = ReactCurrentOwner.current;
 
-    if (owner !== null && owner.tag === ClassComponent) {
-      var ownerFiber = owner;
-      var instance = ownerFiber.stateNode;
-      !instance._warnedAboutRefsInRender ? warningWithoutStack$1(false, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component') : void 0;
-      instance._warnedAboutRefsInRender = true;
+  function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) {
+    if (callbackBookkeepingPool.length) {
+      var instance = callbackBookkeepingPool.pop();
+      instance.topLevelType = topLevelType;
+      instance.eventSystemFlags = eventSystemFlags;
+      instance.nativeEvent = nativeEvent;
+      instance.targetInst = targetInst;
+      return instance;
     }
-  }
 
-  var fiber = get(component);
-
-  if (!fiber) {
-    return false;
+    return {
+      topLevelType: topLevelType,
+      eventSystemFlags: eventSystemFlags,
+      nativeEvent: nativeEvent,
+      targetInst: targetInst,
+      ancestors: []
+    };
   }
+  /**
+   * Find the deepest React component completely containing the root of the
+   * passed-in instance (for use when entire React trees are nested within each
+   * other). If React trees are not nested, returns null.
+   */
 
-  return getNearestMountedFiber(fiber) === fiber;
-}
-
-function assertIsMounted(fiber) {
-  if (!(getNearestMountedFiber(fiber) === fiber)) {
-    {
-      throw Error("Unable to find node on an unmounted component.");
-    }
-  }
-}
 
-function findCurrentFiberUsingSlowPath(fiber) {
-  var alternate = fiber.alternate;
+  function findRootContainerNode(inst) {
+    if (inst.tag === HostRoot) {
+      return inst.stateNode.containerInfo;
+    } // TODO: It may be a good idea to cache this to prevent unnecessary DOM
+    // traversal, but caching is difficult to do correctly without using a
+    // mutation observer to listen for all DOM changes.
 
-  if (!alternate) {
-    // If there is no alternate, then we only need to check if it is mounted.
-    var nearestMounted = getNearestMountedFiber(fiber);
 
-    if (!(nearestMounted !== null)) {
-      {
-        throw Error("Unable to find node on an unmounted component.");
-      }
+    while (inst.return) {
+      inst = inst.return;
     }
 
-    if (nearestMounted !== fiber) {
+    if (inst.tag !== HostRoot) {
+      // This can happen if we're in a detached tree.
       return null;
     }
 
-    return fiber;
-  } // If we have two possible branches, we'll walk backwards up to the root
-  // to see what path the root points to. On the way we may hit one of the
-  // special cases and we'll deal with them.
+    return inst.stateNode.containerInfo;
+  }
+  /**
+   * Allows registered plugins an opportunity to extract events from top-level
+   * native browser events.
+   *
+   * @return {*} An accumulation of synthetic events.
+   * @internal
+   */
 
 
-  var a = fiber;
-  var b = alternate;
+  function extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
+    var events = null;
 
-  while (true) {
-    var parentA = a.return;
+    for (var i = 0; i < plugins.length; i++) {
+      // Not every plugin in the ordering may be loaded at runtime.
+      var possiblePlugin = plugins[i];
 
-    if (parentA === null) {
-      // We're at the root.
-      break;
+      if (possiblePlugin) {
+        var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
+
+        if (extractedEvents) {
+          events = accumulateInto(events, extractedEvents);
+        }
+      }
     }
 
-    var parentB = parentA.alternate;
+    return events;
+  }
 
-    if (parentB === null) {
-      // There is no alternate. This is an unusual case. Currently, it only
-      // happens when a Suspense component is hidden. An extra fragment fiber
-      // is inserted in between the Suspense fiber and its children. Skip
-      // over this extra fragment fiber and proceed to the next parent.
-      var nextParent = parentA.return;
+  function runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
+    var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
+    runEventsInBatch(events);
+  }
 
-      if (nextParent !== null) {
-        a = b = nextParent;
-        continue;
-      } // If there's no parent, we're at the root.
+  function handleTopLevel(bookKeeping) {
+    var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components.
+    // It's important that we build the array of ancestors before calling any
+    // event handlers, because event handlers can modify the DOM, leading to
+    // inconsistencies with ReactMount's node cache. See #1105.
 
+    var ancestor = targetInst;
 
-      break;
-    } // If both copies of the parent fiber point to the same child, we can
-    // assume that the child is current. This happens when we bailout on low
-    // priority: the bailed out fiber's child reuses the current child.
+    do {
+      if (!ancestor) {
+        var ancestors = bookKeeping.ancestors;
+        ancestors.push(ancestor);
+        break;
+      }
 
+      var root = findRootContainerNode(ancestor);
 
-    if (parentA.child === parentB.child) {
-      var child = parentA.child;
+      if (!root) {
+        break;
+      }
 
-      while (child) {
-        if (child === a) {
-          // We've determined that A is the current branch.
-          assertIsMounted(parentA);
-          return fiber;
-        }
+      var tag = ancestor.tag;
 
-        if (child === b) {
-          // We've determined that B is the current branch.
-          assertIsMounted(parentA);
-          return alternate;
-        }
+      if (tag === HostComponent || tag === HostText) {
+        bookKeeping.ancestors.push(ancestor);
+      }
 
-        child = child.sibling;
-      } // We should never have an alternate for any mounting node. So the only
-      // way this could possibly happen is if this was unmounted, if at all.
+      ancestor = getClosestInstanceFromNode(root);
+    } while (ancestor);
 
+    for (var i = 0; i < bookKeeping.ancestors.length; i++) {
+      targetInst = bookKeeping.ancestors[i];
+      var eventTarget = getEventTarget(bookKeeping.nativeEvent);
+      var topLevelType = bookKeeping.topLevelType;
+      var nativeEvent = bookKeeping.nativeEvent;
+      var eventSystemFlags = bookKeeping.eventSystemFlags; // If this is the first ancestor, we mark it on the system flags
 
-      {
-        {
-          throw Error("Unable to find node on an unmounted component.");
-        }
+      if (i === 0) {
+        eventSystemFlags |= IS_FIRST_ANCESTOR;
       }
+
+      runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, eventSystemFlags);
     }
+  }
 
-    if (a.return !== b.return) {
-      // The return pointer of A and the return pointer of B point to different
-      // fibers. We assume that return pointers never criss-cross, so A must
-      // belong to the child set of A.return, and B must belong to the child
-      // set of B.return.
-      a = parentA;
-      b = parentB;
-    } else {
-      // The return pointers point to the same fiber. We'll have to use the
-      // default, slow path: scan the child sets of each parent alternate to see
-      // which child belongs to which set.
-      //
-      // Search parent A's child set
-      var didFindChild = false;
-      var _child = parentA.child;
-
-      while (_child) {
-        if (_child === a) {
-          didFindChild = true;
-          a = parentA;
-          b = parentB;
-          break;
-        }
+  function dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) {
+    var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags);
+
+    try {
+      // Event queue being processed in the same cycle allows
+      // `preventDefault`.
+      batchedEventUpdates(handleTopLevel, bookKeeping);
+    } finally {
+      releaseTopLevelCallbackBookKeeping(bookKeeping);
+    }
+  }
+  /**
+   * We listen for bubbled touch events on the document object.
+   *
+   * Firefox v8.01 (and possibly others) exhibited strange behavior when
+   * mounting `onmousemove` events at some node that was not the document
+   * element. The symptoms were that if your mouse is not moving over something
+   * contained within that mount point (for example on the background) the
+   * top-level listeners for `onmousemove` won't be called. However, if you
+   * register the `mousemove` on the document object, then it will of course
+   * catch all `mousemove`s. This along with iOS quirks, justifies restricting
+   * top-level listeners to the document object only, at least for these
+   * movement types of events and possibly all events.
+   *
+   * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
+   *
+   * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
+   * they bubble to document.
+   *
+   * @param {string} registrationName Name of listener (e.g. `onClick`).
+   * @param {object} mountAt Container where to mount the listener
+   */
+
+  function legacyListenToEvent(registrationName, mountAt) {
+    var listenerMap = getListenerMapForElement(mountAt);
+    var dependencies = registrationNameDependencies[registrationName];
 
-        if (_child === b) {
-          didFindChild = true;
-          b = parentA;
-          a = parentB;
+    for (var i = 0; i < dependencies.length; i++) {
+      var dependency = dependencies[i];
+      legacyListenToTopLevelEvent(dependency, mountAt, listenerMap);
+    }
+  }
+  function legacyListenToTopLevelEvent(topLevelType, mountAt, listenerMap) {
+    if (!listenerMap.has(topLevelType)) {
+      switch (topLevelType) {
+        case TOP_SCROLL:
+          trapCapturedEvent(TOP_SCROLL, mountAt);
           break;
-        }
 
-        _child = _child.sibling;
-      }
+        case TOP_FOCUS:
+        case TOP_BLUR:
+          trapCapturedEvent(TOP_FOCUS, mountAt);
+          trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function,
+          // but this ensures we mark both as attached rather than just one.
 
-      if (!didFindChild) {
-        // Search parent B's child set
-        _child = parentB.child;
+          listenerMap.set(TOP_BLUR, null);
+          listenerMap.set(TOP_FOCUS, null);
+          break;
 
-        while (_child) {
-          if (_child === a) {
-            didFindChild = true;
-            a = parentB;
-            b = parentA;
-            break;
+        case TOP_CANCEL:
+        case TOP_CLOSE:
+          if (isEventSupported(getRawEventName(topLevelType))) {
+            trapCapturedEvent(topLevelType, mountAt);
           }
 
-          if (_child === b) {
-            didFindChild = true;
-            b = parentB;
-            a = parentA;
-            break;
-          }
+          break;
 
-          _child = _child.sibling;
-        }
+        case TOP_INVALID:
+        case TOP_SUBMIT:
+        case TOP_RESET:
+          // We listen to them on the target DOM elements.
+          // Some of them bubble so we don't want them to fire twice.
+          break;
 
-        if (!didFindChild) {
-          {
-            throw Error("Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.");
+        default:
+          // By default, listen on the top level to all non-media events.
+          // Media events don't bubble so adding the listener wouldn't do anything.
+          var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1;
+
+          if (!isMediaEvent) {
+            trapBubbledEvent(topLevelType, mountAt);
           }
-        }
-      }
-    }
 
-    if (!(a.alternate === b)) {
-      {
-        throw Error("Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.");
+          break;
       }
+
+      listenerMap.set(topLevelType, null);
     }
-  } // If the root is not a host container, we're in a disconnected tree. I.e.
-  // unmounted.
+  }
+  function isListeningToAllDependencies(registrationName, mountAt) {
+    var listenerMap = getListenerMapForElement(mountAt);
+    var dependencies = registrationNameDependencies[registrationName];
 
+    for (var i = 0; i < dependencies.length; i++) {
+      var dependency = dependencies[i];
 
-  if (!(a.tag === HostRoot)) {
-    {
-      throw Error("Unable to find node on an unmounted component.");
+      if (!listenerMap.has(dependency)) {
+        return false;
+      }
     }
-  }
 
-  if (a.stateNode.current === a) {
-    // We've determined that A is the current branch.
-    return fiber;
-  } // Otherwise B has to be current branch.
+    return true;
+  }
 
+  var attemptUserBlockingHydration;
+  function setAttemptUserBlockingHydration(fn) {
+    attemptUserBlockingHydration = fn;
+  }
+  var attemptContinuousHydration;
+  function setAttemptContinuousHydration(fn) {
+    attemptContinuousHydration = fn;
+  }
+  var attemptHydrationAtCurrentPriority;
+  function setAttemptHydrationAtCurrentPriority(fn) {
+    attemptHydrationAtCurrentPriority = fn;
+  } // TODO: Upgrade this definition once we're on a newer version of Flow that
+  var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.
 
-  return alternate;
-}
-function findCurrentHostFiber(parent) {
-  var currentParent = findCurrentFiberUsingSlowPath(parent);
+  var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.
+  // if the last target was dehydrated.
 
-  if (!currentParent) {
-    return null;
-  } // Next we'll drill down this component to find the first HostComponent/Text.
+  var queuedFocus = null;
+  var queuedDrag = null;
+  var queuedMouse = null; // For pointer events there can be one latest event per pointerId.
 
+  var queuedPointers = new Map();
+  var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.
 
-  var node = currentParent;
+  var queuedExplicitHydrationTargets = [];
+  function hasQueuedDiscreteEvents() {
+    return queuedDiscreteEvents.length > 0;
+  }
+  var discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT];
+  var continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE];
+  function isReplayableDiscreteEvent(eventType) {
+    return discreteReplayableEvents.indexOf(eventType) > -1;
+  }
 
-  while (true) {
-    if (node.tag === HostComponent || node.tag === HostText) {
-      return node;
-    } else if (node.child) {
-      node.child.return = node;
-      node = node.child;
-      continue;
-    }
+  function trapReplayableEventForDocument(topLevelType, document, listenerMap) {
+    legacyListenToTopLevelEvent(topLevelType, document, listenerMap);
+  }
 
-    if (node === currentParent) {
-      return null;
-    }
+  function eagerlyTrapReplayableEvents(container, document) {
+    var listenerMapForDoc = getListenerMapForElement(document); // Discrete
 
-    while (!node.sibling) {
-      if (!node.return || node.return === currentParent) {
-        return null;
-      }
+    discreteReplayableEvents.forEach(function (topLevelType) {
+      trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);
+    }); // Continuous
 
-      node = node.return;
-    }
+    continuousReplayableEvents.forEach(function (topLevelType) {
+      trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);
+    });
+  }
 
-    node.sibling.return = node.return;
-    node = node.sibling;
-  } // Flow needs the return null here, but ESLint complains about it.
-  // eslint-disable-next-line no-unreachable
+  function createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {
+    return {
+      blockedOn: blockedOn,
+      topLevelType: topLevelType,
+      eventSystemFlags: eventSystemFlags | IS_REPLAYED,
+      nativeEvent: nativeEvent,
+      container: container
+    };
+  }
 
+  function queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {
+    var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);
+    queuedDiscreteEvents.push(queuedEvent);
+  } // Resets the replaying for this type of continuous event to no event.
 
-  return null;
-}
-function findCurrentHostFiberWithNoPortals(parent) {
-  var currentParent = findCurrentFiberUsingSlowPath(parent);
+  function clearIfContinuousEvent(topLevelType, nativeEvent) {
+    switch (topLevelType) {
+      case TOP_FOCUS:
+      case TOP_BLUR:
+        queuedFocus = null;
+        break;
 
-  if (!currentParent) {
-    return null;
-  } // Next we'll drill down this component to find the first HostComponent/Text.
+      case TOP_DRAG_ENTER:
+      case TOP_DRAG_LEAVE:
+        queuedDrag = null;
+        break;
 
+      case TOP_MOUSE_OVER:
+      case TOP_MOUSE_OUT:
+        queuedMouse = null;
+        break;
 
-  var node = currentParent;
+      case TOP_POINTER_OVER:
+      case TOP_POINTER_OUT:
+        {
+          var pointerId = nativeEvent.pointerId;
+          queuedPointers.delete(pointerId);
+          break;
+        }
 
-  while (true) {
-    if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI && node.tag === FundamentalComponent) {
-      return node;
-    } else if (node.child && node.tag !== HostPortal) {
-      node.child.return = node;
-      node = node.child;
-      continue;
+      case TOP_GOT_POINTER_CAPTURE:
+      case TOP_LOST_POINTER_CAPTURE:
+        {
+          var _pointerId = nativeEvent.pointerId;
+          queuedPointerCaptures.delete(_pointerId);
+          break;
+        }
     }
+  }
 
-    if (node === currentParent) {
-      return null;
-    }
+  function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {
+    if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {
+      var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);
 
-    while (!node.sibling) {
-      if (!node.return || node.return === currentParent) {
-        return null;
+      if (blockedOn !== null) {
+        var _fiber2 = getInstanceFromNode$1(blockedOn);
+
+        if (_fiber2 !== null) {
+          // Attempt to increase the priority of this target.
+          attemptContinuousHydration(_fiber2);
+        }
       }
 
-      node = node.return;
-    }
+      return queuedEvent;
+    } // If we have already queued this exact event, then it's because
+    // the different event systems have different DOM event listeners.
+    // We can accumulate the flags and store a single event to be
+    // replayed.
 
-    node.sibling.return = node.return;
-    node = node.sibling;
-  } // Flow needs the return null here, but ESLint complains about it.
-  // eslint-disable-next-line no-unreachable
 
+    existingQueuedEvent.eventSystemFlags |= eventSystemFlags;
+    return existingQueuedEvent;
+  }
 
-  return null;
-}
+  function queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {
+    // These set relatedTarget to null because the replayed event will be treated as if we
+    // moved from outside the window (no target) onto the target once it hydrates.
+    // Instead of mutating we could clone the event.
+    switch (topLevelType) {
+      case TOP_FOCUS:
+        {
+          var focusEvent = nativeEvent;
+          queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, container, focusEvent);
+          return true;
+        }
 
-var attemptSynchronousHydration;
-function setAttemptSynchronousHydration(fn) {
-  attemptSynchronousHydration = fn;
-}
-var attemptUserBlockingHydration;
-function setAttemptUserBlockingHydration(fn) {
-  attemptUserBlockingHydration = fn;
-}
-var attemptContinuousHydration;
-function setAttemptContinuousHydration(fn) {
-  attemptContinuousHydration = fn;
-}
-var attemptHydrationAtCurrentPriority;
-function setAttemptHydrationAtCurrentPriority(fn) {
-  attemptHydrationAtCurrentPriority = fn;
-} // TODO: Upgrade this definition once we're on a newer version of Flow that
-// has this definition built-in.
+      case TOP_DRAG_ENTER:
+        {
+          var dragEvent = nativeEvent;
+          queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, container, dragEvent);
+          return true;
+        }
 
-var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.
+      case TOP_MOUSE_OVER:
+        {
+          var mouseEvent = nativeEvent;
+          queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, container, mouseEvent);
+          return true;
+        }
 
-var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.
+      case TOP_POINTER_OVER:
+        {
+          var pointerEvent = nativeEvent;
+          var pointerId = pointerEvent.pointerId;
+          queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, container, pointerEvent));
+          return true;
+        }
 
-// if the last target was dehydrated.
+      case TOP_GOT_POINTER_CAPTURE:
+        {
+          var _pointerEvent = nativeEvent;
+          var _pointerId2 = _pointerEvent.pointerId;
+          queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, container, _pointerEvent));
+          return true;
+        }
+    }
 
-var queuedFocus = null;
-var queuedDrag = null;
-var queuedMouse = null; // For pointer events there can be one latest event per pointerId.
+    return false;
+  } // Check if this target is unblocked. Returns true if it's unblocked.
 
-var queuedPointers = new Map();
-var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.
+  function attemptExplicitHydrationTarget(queuedTarget) {
+    // TODO: This function shares a lot of logic with attemptToDispatchEvent.
+    // Try to unify them. It's a bit tricky since it would require two return
+    // values.
+    var targetInst = getClosestInstanceFromNode(queuedTarget.target);
 
-var queuedExplicitHydrationTargets = [];
-function hasQueuedDiscreteEvents() {
-  return queuedDiscreteEvents.length > 0;
-}
+    if (targetInst !== null) {
+      var nearestMounted = getNearestMountedFiber(targetInst);
 
-var discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT];
-var continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE];
-function isReplayableDiscreteEvent(eventType) {
-  return discreteReplayableEvents.indexOf(eventType) > -1;
-}
+      if (nearestMounted !== null) {
+        var tag = nearestMounted.tag;
 
-function trapReplayableEvent(topLevelType, document, listeningSet) {
-  listenToTopLevel(topLevelType, document, listeningSet);
+        if (tag === SuspenseComponent) {
+          var instance = getSuspenseInstanceFromFiber(nearestMounted);
 
-  if (enableFlareAPI) {
-    // Trap events for the responder system.
-    var passiveEventKey = unsafeCastDOMTopLevelTypeToString(topLevelType) + '_passive';
+          if (instance !== null) {
+            // We're blocked on hydrating this boundary.
+            // Increase its priority.
+            queuedTarget.blockedOn = instance;
+            unstable_runWithPriority(queuedTarget.priority, function () {
+              attemptHydrationAtCurrentPriority(nearestMounted);
+            });
+            return;
+          }
+        } else if (tag === HostRoot) {
+          var root = nearestMounted.stateNode;
 
-    if (!listeningSet.has(passiveEventKey)) {
-      trapEventForResponderEventSystem(document, topLevelType, true);
-      listeningSet.add(passiveEventKey);
-    } // TODO: This listens to all events as active which might have
-    // undesirable effects. It's also unnecessary to have both
-    // passive and active listeners. Instead, we could start with
-    // a passive and upgrade it to an active one if needed.
-    // For replaying purposes the active is never needed since we
-    // currently don't preventDefault.
+          if (root.hydrate) {
+            queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of
+            // a root other than sync.
 
+            return;
+          }
+        }
+      }
+    }
 
-    var activeEventKey = unsafeCastDOMTopLevelTypeToString(topLevelType) + '_active';
+    queuedTarget.blockedOn = null;
+  }
 
-    if (!listeningSet.has(activeEventKey)) {
-      trapEventForResponderEventSystem(document, topLevelType, false);
-      listeningSet.add(activeEventKey);
+  function attemptReplayContinuousQueuedEvent(queuedEvent) {
+    if (queuedEvent.blockedOn !== null) {
+      return false;
     }
-  }
-}
 
-function eagerlyTrapReplayableEvents(document) {
-  var listeningSet = getListeningSetForElement(document); // Discrete
+    var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.container, queuedEvent.nativeEvent);
 
-  discreteReplayableEvents.forEach(function (topLevelType) {
-    trapReplayableEvent(topLevelType, document, listeningSet);
-  }); // Continuous
+    if (nextBlockedOn !== null) {
+      // We're still blocked. Try again later.
+      var _fiber3 = getInstanceFromNode$1(nextBlockedOn);
 
-  continuousReplayableEvents.forEach(function (topLevelType) {
-    trapReplayableEvent(topLevelType, document, listeningSet);
-  });
-}
-
-function createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent) {
-  return {
-    blockedOn: blockedOn,
-    topLevelType: topLevelType,
-    eventSystemFlags: eventSystemFlags | IS_REPLAYED,
-    nativeEvent: nativeEvent
-  };
-}
+      if (_fiber3 !== null) {
+        attemptContinuousHydration(_fiber3);
+      }
+
+      queuedEvent.blockedOn = nextBlockedOn;
+      return false;
+    }
 
-function queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent) {
-  var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent);
-  queuedDiscreteEvents.push(queuedEvent);
+    return true;
+  }
 
-  if (enableSelectiveHydration) {
-    if (queuedDiscreteEvents.length === 1) {
-      // If this was the first discrete event, we might be able to
-      // synchronously unblock it so that preventDefault still works.
-      while (queuedEvent.blockedOn !== null) {
-        var _fiber = getInstanceFromNode$1(queuedEvent.blockedOn);
+  function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {
+    if (attemptReplayContinuousQueuedEvent(queuedEvent)) {
+      map.delete(key);
+    }
+  }
 
-        if (_fiber === null) {
-          break;
-        }
+  function replayUnblockedEvents() {
+    hasScheduledReplayAttempt = false; // First replay discrete events.
 
-        attemptSynchronousHydration(_fiber);
+    while (queuedDiscreteEvents.length > 0) {
+      var nextDiscreteEvent = queuedDiscreteEvents[0];
 
-        if (queuedEvent.blockedOn === null) {
-          // We got unblocked by hydration. Let's try again.
-          replayUnblockedEvents(); // If we're reblocked, on an inner boundary, we might need
-          // to attempt hydrating that one.
+      if (nextDiscreteEvent.blockedOn !== null) {
+        // We're still blocked.
+        // Increase the priority of this boundary to unblock
+        // the next discrete event.
+        var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn);
 
-          continue;
-        } else {
-          // We're still blocked from hydation, we have to give up
-          // and replay later.
-          break;
+        if (_fiber4 !== null) {
+          attemptUserBlockingHydration(_fiber4);
         }
-      }
-    }
-  }
-} // Resets the replaying for this type of continuous event to no event.
 
-function clearIfContinuousEvent(topLevelType, nativeEvent) {
-  switch (topLevelType) {
-    case TOP_FOCUS:
-    case TOP_BLUR:
-      queuedFocus = null;
-      break;
+        break;
+      }
 
-    case TOP_DRAG_ENTER:
-    case TOP_DRAG_LEAVE:
-      queuedDrag = null;
-      break;
+      var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.container, nextDiscreteEvent.nativeEvent);
 
-    case TOP_MOUSE_OVER:
-    case TOP_MOUSE_OUT:
-      queuedMouse = null;
-      break;
-
-    case TOP_POINTER_OVER:
-    case TOP_POINTER_OUT:
-      {
-        var pointerId = nativeEvent.pointerId;
-        queuedPointers.delete(pointerId);
-        break;
+      if (nextBlockedOn !== null) {
+        // We're still blocked. Try again later.
+        nextDiscreteEvent.blockedOn = nextBlockedOn;
+      } else {
+        // We've successfully replayed the first event. Let's try the next one.
+        queuedDiscreteEvents.shift();
       }
+    } // Next replay any continuous events.
 
-    case TOP_GOT_POINTER_CAPTURE:
-    case TOP_LOST_POINTER_CAPTURE:
-      {
-        var _pointerId = nativeEvent.pointerId;
-        queuedPointerCaptures.delete(_pointerId);
-        break;
-      }
-  }
-}
 
-function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, nativeEvent) {
-  if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {
-    var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent);
+    if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {
+      queuedFocus = null;
+    }
 
-    if (blockedOn !== null) {
-      var _fiber2 = getInstanceFromNode$1(blockedOn);
+    if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {
+      queuedDrag = null;
+    }
 
-      if (_fiber2 !== null) {
-        // Attempt to increase the priority of this target.
-        attemptContinuousHydration(_fiber2);
-      }
+    if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {
+      queuedMouse = null;
     }
 
-    return queuedEvent;
-  } // If we have already queued this exact event, then it's because
-  // the different event systems have different DOM event listeners.
-  // We can accumulate the flags and store a single event to be
-  // replayed.
+    queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);
+    queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);
+  }
 
+  function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {
+    if (queuedEvent.blockedOn === unblocked) {
+      queuedEvent.blockedOn = null;
 
-  existingQueuedEvent.eventSystemFlags |= eventSystemFlags;
-  return existingQueuedEvent;
-}
+      if (!hasScheduledReplayAttempt) {
+        hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are
+        // now unblocked. This first might not actually be unblocked yet.
+        // We could check it early to avoid scheduling an unnecessary callback.
 
-function queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent) {
-  // These set relatedTarget to null because the replayed event will be treated as if we
-  // moved from outside the window (no target) onto the target once it hydrates.
-  // Instead of mutating we could clone the event.
-  switch (topLevelType) {
-    case TOP_FOCUS:
-      {
-        var focusEvent = nativeEvent;
-        queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, focusEvent);
-        return true;
+        unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents);
       }
+    }
+  }
 
-    case TOP_DRAG_ENTER:
-      {
-        var dragEvent = nativeEvent;
-        queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, dragEvent);
-        return true;
-      }
+  function retryIfBlockedOn(unblocked) {
+    // Mark anything that was blocked on this as no longer blocked
+    // and eligible for a replay.
+    if (queuedDiscreteEvents.length > 0) {
+      scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's
+      // worth it because we expect very few discrete events to queue up and once
+      // we are actually fully unblocked it will be fast to replay them.
 
-    case TOP_MOUSE_OVER:
-      {
-        var mouseEvent = nativeEvent;
-        queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, mouseEvent);
-        return true;
-      }
+      for (var i = 1; i < queuedDiscreteEvents.length; i++) {
+        var queuedEvent = queuedDiscreteEvents[i];
 
-    case TOP_POINTER_OVER:
-      {
-        var pointerEvent = nativeEvent;
-        var pointerId = pointerEvent.pointerId;
-        queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, pointerEvent));
-        return true;
+        if (queuedEvent.blockedOn === unblocked) {
+          queuedEvent.blockedOn = null;
+        }
       }
+    }
 
-    case TOP_GOT_POINTER_CAPTURE:
-      {
-        var _pointerEvent = nativeEvent;
-        var _pointerId2 = _pointerEvent.pointerId;
-        queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, _pointerEvent));
-        return true;
-      }
-  }
+    if (queuedFocus !== null) {
+      scheduleCallbackIfUnblocked(queuedFocus, unblocked);
+    }
 
-  return false;
-} // Check if this target is unblocked. Returns true if it's unblocked.
+    if (queuedDrag !== null) {
+      scheduleCallbackIfUnblocked(queuedDrag, unblocked);
+    }
 
-function attemptExplicitHydrationTarget(queuedTarget) {
-  // TODO: This function shares a lot of logic with attemptToDispatchEvent.
-  // Try to unify them. It's a bit tricky since it would require two return
-  // values.
-  var targetInst = getClosestInstanceFromNode(queuedTarget.target);
+    if (queuedMouse !== null) {
+      scheduleCallbackIfUnblocked(queuedMouse, unblocked);
+    }
 
-  if (targetInst !== null) {
-    var nearestMounted = getNearestMountedFiber(targetInst);
+    var unblock = function (queuedEvent) {
+      return scheduleCallbackIfUnblocked(queuedEvent, unblocked);
+    };
 
-    if (nearestMounted !== null) {
-      var tag = nearestMounted.tag;
+    queuedPointers.forEach(unblock);
+    queuedPointerCaptures.forEach(unblock);
 
-      if (tag === SuspenseComponent) {
-        var instance = getSuspenseInstanceFromFiber(nearestMounted);
+    for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {
+      var queuedTarget = queuedExplicitHydrationTargets[_i];
 
-        if (instance !== null) {
-          // We're blocked on hydrating this boundary.
-          // Increase its priority.
-          queuedTarget.blockedOn = instance;
-          unstable_runWithPriority(queuedTarget.priority, function () {
-            attemptHydrationAtCurrentPriority(nearestMounted);
-          });
-          return;
-        }
-      } else if (tag === HostRoot) {
-        var root = nearestMounted.stateNode;
+      if (queuedTarget.blockedOn === unblocked) {
+        queuedTarget.blockedOn = null;
+      }
+    }
 
-        if (root.hydrate) {
-          queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of
-          // a root other than sync.
+    while (queuedExplicitHydrationTargets.length > 0) {
+      var nextExplicitTarget = queuedExplicitHydrationTargets[0];
 
-          return;
+      if (nextExplicitTarget.blockedOn !== null) {
+        // We're still blocked.
+        break;
+      } else {
+        attemptExplicitHydrationTarget(nextExplicitTarget);
+
+        if (nextExplicitTarget.blockedOn === null) {
+          // We're unblocked.
+          queuedExplicitHydrationTargets.shift();
         }
       }
     }
   }
 
-  queuedTarget.blockedOn = null;
-}
+  function addEventBubbleListener(element, eventType, listener) {
+    element.addEventListener(eventType, listener, false);
+  }
+  function addEventCaptureListener(element, eventType, listener) {
+    element.addEventListener(eventType, listener, true);
+  }
+
+  // do it in two places, which duplicates logic
+  // and increases the bundle size, we do it all
+  // here once. If we remove or refactor the
+  // SimpleEventPlugin, we should also remove or
+  // update the below line.
 
-function queueExplicitHydrationTarget(target) {
-  if (enableSelectiveHydration) {
-    var priority = unstable_getCurrentPriorityLevel();
-    var queuedTarget = {
-      blockedOn: null,
-      target: target,
-      priority: priority
-    };
-    var i = 0;
+  var simpleEventPluginEventTypes = {};
+  var topLevelEventsToDispatchConfig = new Map();
+  var eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use
+  // the code required to apply the same logic for event prioritization and that of the
+  // SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code
+  // duplication (for which there would be quite a bit). For the events that are not needed
+  // for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an
+  // array of top level events.
+  // Lastly, we ignore prettier so we can keep the formatting sane.
+  // prettier-ignore
 
-    for (; i < queuedExplicitHydrationTargets.length; i++) {
-      if (priority <= queuedExplicitHydrationTargets[i].priority) {
-        break;
-      }
-    }
+  var discreteEventPairsForSimpleEventPlugin = [TOP_BLUR, 'blur', TOP_CANCEL, 'cancel', TOP_CLICK, 'click', TOP_CLOSE, 'close', TOP_CONTEXT_MENU, 'contextMenu', TOP_COPY, 'copy', TOP_CUT, 'cut', TOP_AUX_CLICK, 'auxClick', TOP_DOUBLE_CLICK, 'doubleClick', TOP_DRAG_END, 'dragEnd', TOP_DRAG_START, 'dragStart', TOP_DROP, 'drop', TOP_FOCUS, 'focus', TOP_INPUT, 'input', TOP_INVALID, 'invalid', TOP_KEY_DOWN, 'keyDown', TOP_KEY_PRESS, 'keyPress', TOP_KEY_UP, 'keyUp', TOP_MOUSE_DOWN, 'mouseDown', TOP_MOUSE_UP, 'mouseUp', TOP_PASTE, 'paste', TOP_PAUSE, 'pause', TOP_PLAY, 'play', TOP_POINTER_CANCEL, 'pointerCancel', TOP_POINTER_DOWN, 'pointerDown', TOP_POINTER_UP, 'pointerUp', TOP_RATE_CHANGE, 'rateChange', TOP_RESET, 'reset', TOP_SEEKED, 'seeked', TOP_SUBMIT, 'submit', TOP_TOUCH_CANCEL, 'touchCancel', TOP_TOUCH_END, 'touchEnd', TOP_TOUCH_START, 'touchStart', TOP_VOLUME_CHANGE, 'volumeChange'];
+  var otherDiscreteEvents = [TOP_CHANGE, TOP_SELECTION_CHANGE, TOP_TEXT_INPUT, TOP_COMPOSITION_START, TOP_COMPOSITION_END, TOP_COMPOSITION_UPDATE]; // prettier-ignore
 
-    queuedExplicitHydrationTargets.splice(i, 0, queuedTarget);
+  var userBlockingPairsForSimpleEventPlugin = [TOP_DRAG, 'drag', TOP_DRAG_ENTER, 'dragEnter', TOP_DRAG_EXIT, 'dragExit', TOP_DRAG_LEAVE, 'dragLeave', TOP_DRAG_OVER, 'dragOver', TOP_MOUSE_MOVE, 'mouseMove', TOP_MOUSE_OUT, 'mouseOut', TOP_MOUSE_OVER, 'mouseOver', TOP_POINTER_MOVE, 'pointerMove', TOP_POINTER_OUT, 'pointerOut', TOP_POINTER_OVER, 'pointerOver', TOP_SCROLL, 'scroll', TOP_TOGGLE, 'toggle', TOP_TOUCH_MOVE, 'touchMove', TOP_WHEEL, 'wheel']; // prettier-ignore
+
+  var continuousPairsForSimpleEventPlugin = [TOP_ABORT, 'abort', TOP_ANIMATION_END, 'animationEnd', TOP_ANIMATION_ITERATION, 'animationIteration', TOP_ANIMATION_START, 'animationStart', TOP_CAN_PLAY, 'canPlay', TOP_CAN_PLAY_THROUGH, 'canPlayThrough', TOP_DURATION_CHANGE, 'durationChange', TOP_EMPTIED, 'emptied', TOP_ENCRYPTED, 'encrypted', TOP_ENDED, 'ended', TOP_ERROR, 'error', TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', TOP_LOAD, 'load', TOP_LOADED_DATA, 'loadedData', TOP_LOADED_METADATA, 'loadedMetadata', TOP_LOAD_START, 'loadStart', TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', TOP_PLAYING, 'playing', TOP_PROGRESS, 'progress', TOP_SEEKING, 'seeking', TOP_STALLED, 'stalled', TOP_SUSPEND, 'suspend', TOP_TIME_UPDATE, 'timeUpdate', TOP_TRANSITION_END, 'transitionEnd', TOP_WAITING, 'waiting'];
+  /**
+   * Turns
+   * ['abort', ...]
+   * into
+   * eventTypes = {
+   *   'abort': {
+   *     phasedRegistrationNames: {
+   *       bubbled: 'onAbort',
+   *       captured: 'onAbortCapture',
+   *     },
+   *     dependencies: [TOP_ABORT],
+   *   },
+   *   ...
+   * };
+   * topLevelEventsToDispatchConfig = new Map([
+   *   [TOP_ABORT, { sameConfig }],
+   * ]);
+   */
 
-    if (i === 0) {
-      attemptExplicitHydrationTarget(queuedTarget);
+  function processSimpleEventPluginPairsByPriority(eventTypes, priority) {
+    // As the event types are in pairs of two, we need to iterate
+    // through in twos. The events are in pairs of two to save code
+    // and improve init perf of processing this array, as it will
+    // result in far fewer object allocations and property accesses
+    // if we only use three arrays to process all the categories of
+    // instead of tuples.
+    for (var i = 0; i < eventTypes.length; i += 2) {
+      var topEvent = eventTypes[i];
+      var event = eventTypes[i + 1];
+      var capitalizedEvent = event[0].toUpperCase() + event.slice(1);
+      var onEvent = 'on' + capitalizedEvent;
+      var config = {
+        phasedRegistrationNames: {
+          bubbled: onEvent,
+          captured: onEvent + 'Capture'
+        },
+        dependencies: [topEvent],
+        eventPriority: priority
+      };
+      eventPriorities.set(topEvent, priority);
+      topLevelEventsToDispatchConfig.set(topEvent, config);
+      simpleEventPluginEventTypes[event] = config;
     }
   }
-}
 
-function attemptReplayContinuousQueuedEvent(queuedEvent) {
-  if (queuedEvent.blockedOn !== null) {
-    return false;
-  }
+  function processTopEventPairsByPriority(eventTypes, priority) {
+    for (var i = 0; i < eventTypes.length; i++) {
+      eventPriorities.set(eventTypes[i], priority);
+    }
+  } // SimpleEventPlugin
 
-  var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.nativeEvent);
 
-  if (nextBlockedOn !== null) {
-    // We're still blocked. Try again later.
-    var _fiber3 = getInstanceFromNode$1(nextBlockedOn);
+  processSimpleEventPluginPairsByPriority(discreteEventPairsForSimpleEventPlugin, DiscreteEvent);
+  processSimpleEventPluginPairsByPriority(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent);
+  processSimpleEventPluginPairsByPriority(continuousPairsForSimpleEventPlugin, ContinuousEvent); // Not used by SimpleEventPlugin
 
-    if (_fiber3 !== null) {
-      attemptContinuousHydration(_fiber3);
-    }
+  processTopEventPairsByPriority(otherDiscreteEvents, DiscreteEvent);
+  function getEventPriorityForPluginSystem(topLevelType) {
+    var priority = eventPriorities.get(topLevelType); // Default to a ContinuousEvent. Note: we might
+    // want to warn if we can't detect the priority
+    // for the event.
 
-    queuedEvent.blockedOn = nextBlockedOn;
-    return false;
+    return priority === undefined ? ContinuousEvent : priority;
   }
 
-  return true;
-}
+  // Intentionally not named imports because Rollup would use dynamic dispatch for
+  var UserBlockingPriority = unstable_UserBlockingPriority,
+      runWithPriority = unstable_runWithPriority; // TODO: can we stop exporting these?
 
-function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {
-  if (attemptReplayContinuousQueuedEvent(queuedEvent)) {
-    map.delete(key);
+  var _enabled = true;
+  function setEnabled(enabled) {
+    _enabled = !!enabled;
+  }
+  function isEnabled() {
+    return _enabled;
+  }
+  function trapBubbledEvent(topLevelType, element) {
+    trapEventForPluginEventSystem(element, topLevelType, false);
+  }
+  function trapCapturedEvent(topLevelType, element) {
+    trapEventForPluginEventSystem(element, topLevelType, true);
   }
-}
-
-function replayUnblockedEvents() {
-  hasScheduledReplayAttempt = false; // First replay discrete events.
 
-  while (queuedDiscreteEvents.length > 0) {
-    var nextDiscreteEvent = queuedDiscreteEvents[0];
+  function trapEventForPluginEventSystem(container, topLevelType, capture) {
+    var listener;
 
-    if (nextDiscreteEvent.blockedOn !== null) {
-      // We're still blocked.
-      // Increase the priority of this boundary to unblock
-      // the next discrete event.
-      var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn);
+    switch (getEventPriorityForPluginSystem(topLevelType)) {
+      case DiscreteEvent:
+        listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);
+        break;
 
-      if (_fiber4 !== null) {
-        attemptUserBlockingHydration(_fiber4);
-      }
+      case UserBlockingEvent:
+        listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);
+        break;
 
-      break;
+      case ContinuousEvent:
+      default:
+        listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);
+        break;
     }
 
-    var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.nativeEvent);
+    var rawEventName = getRawEventName(topLevelType);
 
-    if (nextBlockedOn !== null) {
-      // We're still blocked. Try again later.
-      nextDiscreteEvent.blockedOn = nextBlockedOn;
+    if (capture) {
+      addEventCaptureListener(container, rawEventName, listener);
     } else {
-      // We've successfully replayed the first event. Let's try the next one.
-      queuedDiscreteEvents.shift();
+      addEventBubbleListener(container, rawEventName, listener);
     }
-  } // Next replay any continuous events.
-
-
-  if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {
-    queuedFocus = null;
   }
 
-  if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {
-    queuedDrag = null;
+  function dispatchDiscreteEvent(topLevelType, eventSystemFlags, container, nativeEvent) {
+    flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp);
+    discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, container, nativeEvent);
   }
 
-  if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {
-    queuedMouse = null;
+  function dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, container, nativeEvent) {
+    runWithPriority(UserBlockingPriority, dispatchEvent.bind(null, topLevelType, eventSystemFlags, container, nativeEvent));
   }
 
-  queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);
-  queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);
-}
+  function dispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {
+    if (!_enabled) {
+      return;
+    }
 
-function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {
-  if (queuedEvent.blockedOn === unblocked) {
-    queuedEvent.blockedOn = null;
+    if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) {
+      // If we already have a queue of discrete events, and this is another discrete
+      // event, then we can't dispatch it regardless of its target, since they
+      // need to dispatch in order.
+      queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know.
+      topLevelType, eventSystemFlags, container, nativeEvent);
+      return;
+    }
 
-    if (!hasScheduledReplayAttempt) {
-      hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are
-      // now unblocked. This first might not actually be unblocked yet.
-      // We could check it early to avoid scheduling an unnecessary callback.
+    var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent);
 
-      unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents);
+    if (blockedOn === null) {
+      // We successfully dispatched this event.
+      clearIfContinuousEvent(topLevelType, nativeEvent);
+      return;
     }
-  }
-}
 
-function retryIfBlockedOn(unblocked) {
-  // Mark anything that was blocked on this as no longer blocked
-  // and eligible for a replay.
-  if (queuedDiscreteEvents.length > 0) {
-    scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's
-    // worth it because we expect very few discrete events to queue up and once
-    // we are actually fully unblocked it will be fast to replay them.
+    if (isReplayableDiscreteEvent(topLevelType)) {
+      // This this to be replayed later once the target is available.
+      queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);
+      return;
+    }
+
+    if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent)) {
+      return;
+    } // We need to clear only if we didn't queue because
+    // queueing is accummulative.
+
 
-    for (var i = 1; i < queuedDiscreteEvents.length; i++) {
-      var queuedEvent = queuedDiscreteEvents[i];
+    clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target,
+    // in case the event system needs to trace it.
 
-      if (queuedEvent.blockedOn === unblocked) {
-        queuedEvent.blockedOn = null;
-      }
+    {
+      dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null);
     }
-  }
+  } // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked.
 
-  if (queuedFocus !== null) {
-    scheduleCallbackIfUnblocked(queuedFocus, unblocked);
-  }
+  function attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {
+    // TODO: Warn if _enabled is false.
+    var nativeEventTarget = getEventTarget(nativeEvent);
+    var targetInst = getClosestInstanceFromNode(nativeEventTarget);
 
-  if (queuedDrag !== null) {
-    scheduleCallbackIfUnblocked(queuedDrag, unblocked);
-  }
+    if (targetInst !== null) {
+      var nearestMounted = getNearestMountedFiber(targetInst);
 
-  if (queuedMouse !== null) {
-    scheduleCallbackIfUnblocked(queuedMouse, unblocked);
-  }
+      if (nearestMounted === null) {
+        // This tree has been unmounted already. Dispatch without a target.
+        targetInst = null;
+      } else {
+        var tag = nearestMounted.tag;
+
+        if (tag === SuspenseComponent) {
+          var instance = getSuspenseInstanceFromFiber(nearestMounted);
+
+          if (instance !== null) {
+            // Queue the event to be replayed later. Abort dispatching since we
+            // don't want this event dispatched twice through the event system.
+            // TODO: If this is the first discrete event in the queue. Schedule an increased
+            // priority for this boundary.
+            return instance;
+          } // This shouldn't happen, something went wrong but to avoid blocking
+          // the whole system, dispatch the event without a target.
+          // TODO: Warn.
+
+
+          targetInst = null;
+        } else if (tag === HostRoot) {
+          var root = nearestMounted.stateNode;
+
+          if (root.hydrate) {
+            // If this happens during a replay something went wrong and it might block
+            // the whole system.
+            return getContainerFromFiber(nearestMounted);
+          }
 
-  var unblock = function (queuedEvent) {
-    return scheduleCallbackIfUnblocked(queuedEvent, unblocked);
-  };
+          targetInst = null;
+        } else if (nearestMounted !== targetInst) {
+          // If we get an event (ex: img onload) before committing that
+          // component's mount, ignore it for now (that is, treat it as if it was an
+          // event on a non-React tree). We might also consider queueing events and
+          // dispatching them after the mount.
+          targetInst = null;
+        }
+      }
+    }
 
-  queuedPointers.forEach(unblock);
-  queuedPointerCaptures.forEach(unblock);
+    {
+      dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst);
+    } // We're not blocked on anything.
 
-  for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {
-    var queuedTarget = queuedExplicitHydrationTargets[_i];
 
-    if (queuedTarget.blockedOn === unblocked) {
-      queuedTarget.blockedOn = null;
-    }
+    return null;
   }
 
-  while (queuedExplicitHydrationTargets.length > 0) {
-    var nextExplicitTarget = queuedExplicitHydrationTargets[0];
+  // List derived from Gecko source code:
+  // https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js
+  var shorthandToLonghand = {
+    animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],
+    background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],
+    backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],
+    border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],
+    borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],
+    borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],
+    borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],
+    borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],
+    borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],
+    borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],
+    borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],
+    borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],
+    borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],
+    borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],
+    borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],
+    borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],
+    borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],
+    columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],
+    columns: ['columnCount', 'columnWidth'],
+    flex: ['flexBasis', 'flexGrow', 'flexShrink'],
+    flexFlow: ['flexDirection', 'flexWrap'],
+    font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],
+    fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],
+    gap: ['columnGap', 'rowGap'],
+    grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
+    gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],
+    gridColumn: ['gridColumnEnd', 'gridColumnStart'],
+    gridColumnGap: ['columnGap'],
+    gridGap: ['columnGap', 'rowGap'],
+    gridRow: ['gridRowEnd', 'gridRowStart'],
+    gridRowGap: ['rowGap'],
+    gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
+    listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],
+    margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],
+    marker: ['markerEnd', 'markerMid', 'markerStart'],
+    mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],
+    maskPosition: ['maskPositionX', 'maskPositionY'],
+    outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],
+    overflow: ['overflowX', 'overflowY'],
+    padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],
+    placeContent: ['alignContent', 'justifyContent'],
+    placeItems: ['alignItems', 'justifyItems'],
+    placeSelf: ['alignSelf', 'justifySelf'],
+    textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],
+    textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],
+    transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],
+    wordWrap: ['overflowWrap']
+  };
 
-    if (nextExplicitTarget.blockedOn !== null) {
-      // We're still blocked.
-      break;
-    } else {
-      attemptExplicitHydrationTarget(nextExplicitTarget);
+  /**
+   * CSS properties which accept numbers but are not in units of "px".
+   */
+  var isUnitlessNumber = {
+    animationIterationCount: true,
+    borderImageOutset: true,
+    borderImageSlice: true,
+    borderImageWidth: true,
+    boxFlex: true,
+    boxFlexGroup: true,
+    boxOrdinalGroup: true,
+    columnCount: true,
+    columns: true,
+    flex: true,
+    flexGrow: true,
+    flexPositive: true,
+    flexShrink: true,
+    flexNegative: true,
+    flexOrder: true,
+    gridArea: true,
+    gridRow: true,
+    gridRowEnd: true,
+    gridRowSpan: true,
+    gridRowStart: true,
+    gridColumn: true,
+    gridColumnEnd: true,
+    gridColumnSpan: true,
+    gridColumnStart: true,
+    fontWeight: true,
+    lineClamp: true,
+    lineHeight: true,
+    opacity: true,
+    order: true,
+    orphans: true,
+    tabSize: true,
+    widows: true,
+    zIndex: true,
+    zoom: true,
+    // SVG-related properties
+    fillOpacity: true,
+    floodOpacity: true,
+    stopOpacity: true,
+    strokeDasharray: true,
+    strokeDashoffset: true,
+    strokeMiterlimit: true,
+    strokeOpacity: true,
+    strokeWidth: true
+  };
+  /**
+   * @param {string} prefix vendor-specific prefix, eg: Webkit
+   * @param {string} key style name, eg: transitionDuration
+   * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
+   * WebkitTransitionDuration
+   */
 
-      if (nextExplicitTarget.blockedOn === null) {
-        // We're unblocked.
-        queuedExplicitHydrationTargets.shift();
-      }
-    }
+  function prefixKey(prefix, key) {
+    return prefix + key.charAt(0).toUpperCase() + key.substring(1);
   }
-}
-
-function addEventBubbleListener(element, eventType, listener) {
-  element.addEventListener(eventType, listener, false);
-}
-function addEventCaptureListener(element, eventType, listener) {
-  element.addEventListener(eventType, listener, true);
-}
-function addEventCaptureListenerWithPassiveFlag(element, eventType, listener, passive) {
-  element.addEventListener(eventType, listener, {
-    capture: true,
-    passive: passive
-  });
-}
+  /**
+   * Support style names that may come passed in prefixed by adding permutations
+   * of vendor prefixes.
+   */
 
-/**
- * Gets the target node from a native browser event by accounting for
- * inconsistencies in browser DOM APIs.
- *
- * @param {object} nativeEvent Native browser event.
- * @return {DOMEventTarget} Target node.
- */
 
-function getEventTarget(nativeEvent) {
-  // Fallback to nativeEvent.srcElement for IE9
-  // https://github.com/facebook/react/issues/12506
-  var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963
+  var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
+  // infinite loop, because it iterates over the newly added props too.
 
-  if (target.correspondingUseElement) {
-    target = target.correspondingUseElement;
-  } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
-  // @see http://www.quirksmode.org/js/events_properties.html
+  Object.keys(isUnitlessNumber).forEach(function (prop) {
+    prefixes.forEach(function (prefix) {
+      isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
+    });
+  });
 
+  /**
+   * Convert a value into the proper css writable value. The style name `name`
+   * should be logical (no hyphens), as specified
+   * in `CSSProperty.isUnitlessNumber`.
+   *
+   * @param {string} name CSS property name such as `topMargin`.
+   * @param {*} value CSS property value such as `10px`.
+   * @return {string} Normalized style value with dimensions applied.
+   */
 
-  return target.nodeType === TEXT_NODE ? target.parentNode : target;
-}
+  function dangerousStyleValue(name, value, isCustomProperty) {
+    // Note that we've removed escapeTextForBrowser() calls here since the
+    // whole string will be escaped when the attribute is injected into
+    // the markup. If you provide unsafe user data here they can inject
+    // arbitrary CSS which may be problematic (I couldn't repro this):
+    // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
+    // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
+    // This is not an XSS hole but instead a potential CSS injection issue
+    // which has lead to a greater discussion about how we're going to
+    // trust URLs moving forward. See #2115901
+    var isEmpty = value == null || typeof value === 'boolean' || value === '';
+
+    if (isEmpty) {
+      return '';
+    }
 
-function getParent(inst) {
-  do {
-    inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.
-    // That is depending on if we want nested subtrees (layers) to bubble
-    // events to their parent. We could also go through parentNode on the
-    // host node but that wouldn't work for React Native and doesn't let us
-    // do the portal feature.
-  } while (inst && inst.tag !== HostComponent);
+    if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
+      return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
+    }
 
-  if (inst) {
-    return inst;
+    return ('' + value).trim();
   }
 
-  return null;
-}
-/**
- * Return the lowest common ancestor of A and B, or null if they are in
- * different trees.
- */
+  var uppercasePattern = /([A-Z])/g;
+  var msPattern = /^ms-/;
+  /**
+   * Hyphenates a camelcased CSS property name, for example:
+   *
+   *   > hyphenateStyleName('backgroundColor')
+   *   < "background-color"
+   *   > hyphenateStyleName('MozTransition')
+   *   < "-moz-transition"
+   *   > hyphenateStyleName('msTransition')
+   *   < "-ms-transition"
+   *
+   * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
+   * is converted to `-ms-`.
+   */
 
+  function hyphenateStyleName(name) {
+    return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');
+  }
 
-function getLowestCommonAncestor(instA, instB) {
-  var depthA = 0;
+  var warnValidStyle = function () {};
 
-  for (var tempA = instA; tempA; tempA = getParent(tempA)) {
-    depthA++;
-  }
+  {
+    // 'msTransform' is correct, but the other prefixes should be capitalized
+    var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
+    var msPattern$1 = /^-ms-/;
+    var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
+
+    var badStyleValueWithSemicolonPattern = /;\s*$/;
+    var warnedStyleNames = {};
+    var warnedStyleValues = {};
+    var warnedForNaNValue = false;
+    var warnedForInfinityValue = false;
+
+    var camelize = function (string) {
+      return string.replace(hyphenPattern, function (_, character) {
+        return character.toUpperCase();
+      });
+    };
 
-  var depthB = 0;
+    var warnHyphenatedStyleName = function (name) {
+      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
+        return;
+      }
 
-  for (var tempB = instB; tempB; tempB = getParent(tempB)) {
-    depthB++;
-  } // If A is deeper, crawl up.
+      warnedStyleNames[name] = true;
 
+      error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
+      // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
+      // is converted to lowercase `ms`.
+      camelize(name.replace(msPattern$1, 'ms-')));
+    };
 
-  while (depthA - depthB > 0) {
-    instA = getParent(instA);
-    depthA--;
-  } // If B is deeper, crawl up.
+    var warnBadVendoredStyleName = function (name) {
+      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
+        return;
+      }
 
+      warnedStyleNames[name] = true;
 
-  while (depthB - depthA > 0) {
-    instB = getParent(instB);
-    depthB--;
-  } // Walk in lockstep until we find a match.
+      error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
+    };
 
+    var warnStyleValueWithSemicolon = function (name, value) {
+      if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
+        return;
+      }
 
-  var depth = depthA;
+      warnedStyleValues[value] = true;
 
-  while (depth--) {
-    if (instA === instB || instA === instB.alternate) {
-      return instA;
-    }
+      error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
+    };
 
-    instA = getParent(instA);
-    instB = getParent(instB);
-  }
+    var warnStyleValueIsNaN = function (name, value) {
+      if (warnedForNaNValue) {
+        return;
+      }
 
-  return null;
-}
-/**
- * Return if A is an ancestor of B.
- */
+      warnedForNaNValue = true;
 
+      error('`NaN` is an invalid value for the `%s` css style property.', name);
+    };
 
-/**
- * Return the parent instance of the passed-in instance.
- */
+    var warnStyleValueIsInfinity = function (name, value) {
+      if (warnedForInfinityValue) {
+        return;
+      }
 
+      warnedForInfinityValue = true;
 
-/**
- * Simulates the traversal of a two-phase, capture/bubble event dispatch.
- */
+      error('`Infinity` is an invalid value for the `%s` css style property.', name);
+    };
 
-function traverseTwoPhase(inst, fn, arg) {
-  var path = [];
+    warnValidStyle = function (name, value) {
+      if (name.indexOf('-') > -1) {
+        warnHyphenatedStyleName(name);
+      } else if (badVendoredStyleNamePattern.test(name)) {
+        warnBadVendoredStyleName(name);
+      } else if (badStyleValueWithSemicolonPattern.test(value)) {
+        warnStyleValueWithSemicolon(name, value);
+      }
 
-  while (inst) {
-    path.push(inst);
-    inst = getParent(inst);
+      if (typeof value === 'number') {
+        if (isNaN(value)) {
+          warnStyleValueIsNaN(name, value);
+        } else if (!isFinite(value)) {
+          warnStyleValueIsInfinity(name, value);
+        }
+      }
+    };
   }
 
-  var i;
+  var warnValidStyle$1 = warnValidStyle;
 
-  for (i = path.length; i-- > 0;) {
-    fn(path[i], 'captured', arg);
-  }
+  /**
+   * Operations for dealing with CSS properties.
+   */
 
-  for (i = 0; i < path.length; i++) {
-    fn(path[i], 'bubbled', arg);
-  }
-}
-/**
- * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
- * should would receive a `mouseEnter` or `mouseLeave` event.
- *
- * Does not invoke the callback on the nearest common ancestor because nothing
- * "entered" or "left" that element.
- */
+  /**
+   * This creates a string that is expected to be equivalent to the style
+   * attribute generated by server-side rendering. It by-passes warnings and
+   * security checks so it's not safe to use this value for anything other than
+   * comparison. It is only used in DEV for SSR validation.
+   */
 
-function traverseEnterLeave(from, to, fn, argFrom, argTo) {
-  var common = from && to ? getLowestCommonAncestor(from, to) : null;
-  var pathFrom = [];
+  function createDangerousStringForStyles(styles) {
+    {
+      var serialized = '';
+      var delimiter = '';
 
-  while (true) {
-    if (!from) {
-      break;
-    }
+      for (var styleName in styles) {
+        if (!styles.hasOwnProperty(styleName)) {
+          continue;
+        }
 
-    if (from === common) {
-      break;
-    }
+        var styleValue = styles[styleName];
 
-    var alternate = from.alternate;
+        if (styleValue != null) {
+          var isCustomProperty = styleName.indexOf('--') === 0;
+          serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';
+          serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
+          delimiter = ';';
+        }
+      }
 
-    if (alternate !== null && alternate === common) {
-      break;
+      return serialized || null;
     }
-
-    pathFrom.push(from);
-    from = getParent(from);
   }
+  /**
+   * Sets the value for multiple styles on a node.  If a value is specified as
+   * '' (empty string), the corresponding style property will be unset.
+   *
+   * @param {DOMElement} node
+   * @param {object} styles
+   */
 
-  var pathTo = [];
+  function setValueForStyles(node, styles) {
+    var style = node.style;
 
-  while (true) {
-    if (!to) {
-      break;
-    }
+    for (var styleName in styles) {
+      if (!styles.hasOwnProperty(styleName)) {
+        continue;
+      }
 
-    if (to === common) {
-      break;
-    }
+      var isCustomProperty = styleName.indexOf('--') === 0;
+
+      {
+        if (!isCustomProperty) {
+          warnValidStyle$1(styleName, styles[styleName]);
+        }
+      }
 
-    var _alternate = to.alternate;
+      var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
 
-    if (_alternate !== null && _alternate === common) {
-      break;
-    }
+      if (styleName === 'float') {
+        styleName = 'cssFloat';
+      }
 
-    pathTo.push(to);
-    to = getParent(to);
+      if (isCustomProperty) {
+        style.setProperty(styleName, styleValue);
+      } else {
+        style[styleName] = styleValue;
+      }
+    }
   }
 
-  for (var i = 0; i < pathFrom.length; i++) {
-    fn(pathFrom[i], 'bubbled', argFrom);
+  function isValueEmpty(value) {
+    return value == null || typeof value === 'boolean' || value === '';
   }
+  /**
+   * Given {color: 'red', overflow: 'hidden'} returns {
+   *   color: 'color',
+   *   overflowX: 'overflow',
+   *   overflowY: 'overflow',
+   * }. This can be read as "the overflowY property was set by the overflow
+   * shorthand". That is, the values are the property that each was derived from.
+   */
 
-  for (var _i = pathTo.length; _i-- > 0;) {
-    fn(pathTo[_i], 'captured', argTo);
-  }
-}
 
-/**
- * Some event types have a notion of different registration names for different
- * "phases" of propagation. This finds listeners by a given phase.
- */
-function listenerAtPhase(inst, event, propagationPhase) {
-  var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
-  return getListener(inst, registrationName);
-}
-/**
- * A small set of propagation patterns, each of which will accept a small amount
- * of information, and generate a set of "dispatch ready event objects" - which
- * are sets of events that have already been annotated with a set of dispatched
- * listener functions/ids. The API is designed this way to discourage these
- * propagation strategies from actually executing the dispatches, since we
- * always want to collect the entire set of dispatches before executing even a
- * single one.
- */
+  function expandShorthandMap(styles) {
+    var expanded = {};
 
-/**
- * Tags a `SyntheticEvent` with dispatched listeners. Creating this function
- * here, allows us to not have to bind or create functions for each event.
- * Mutating the event's members allows us to not have to create a wrapping
- * "dispatch" object that pairs the event with the listener.
- */
+    for (var key in styles) {
+      var longhands = shorthandToLonghand[key] || [key];
 
+      for (var i = 0; i < longhands.length; i++) {
+        expanded[longhands[i]] = key;
+      }
+    }
 
-function accumulateDirectionalDispatches(inst, phase, event) {
-  {
-    !inst ? warningWithoutStack$1(false, 'Dispatching inst must not be null') : void 0;
+    return expanded;
   }
+  /**
+   * When mixing shorthand and longhand property names, we warn during updates if
+   * we expect an incorrect result to occur. In particular, we warn for:
+   *
+   * Updating a shorthand property (longhand gets overwritten):
+   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}
+   *   becomes .style.font = 'baz'
+   * Removing a shorthand property (longhand gets lost too):
+   *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}
+   *   becomes .style.font = ''
+   * Removing a longhand property (should revert to shorthand; doesn't):
+   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}
+   *   becomes .style.fontVariant = ''
+   */
 
-  var listener = listenerAtPhase(inst, event, phase);
 
-  if (listener) {
-    event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
-    event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
-  }
-}
-/**
- * Collect dispatches (must be entirely collected before dispatching - see unit
- * tests). Lazily allocate the array to conserve memory.  We must loop through
- * each event and perform the traversal for each one. We cannot perform a
- * single traversal for the entire collection of events because each event may
- * have a different target.
- */
+  function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {
+    {
 
+      if (!nextStyles) {
+        return;
+      }
 
-function accumulateTwoPhaseDispatchesSingle(event) {
-  if (event && event.dispatchConfig.phasedRegistrationNames) {
-    traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
-  }
-}
-/**
- * Accumulates without regard to direction, does not look for phased
- * registration names. Same as `accumulateDirectDispatchesSingle` but without
- * requiring that the `dispatchMarker` be the same as the dispatched ID.
- */
+      var expandedUpdates = expandShorthandMap(styleUpdates);
+      var expandedStyles = expandShorthandMap(nextStyles);
+      var warnedAbout = {};
 
+      for (var key in expandedUpdates) {
+        var originalKey = expandedUpdates[key];
+        var correctOriginalKey = expandedStyles[key];
 
-function accumulateDispatches(inst, ignoredDirection, event) {
-  if (inst && event && event.dispatchConfig.registrationName) {
-    var registrationName = event.dispatchConfig.registrationName;
-    var listener = getListener(inst, registrationName);
+        if (correctOriginalKey && originalKey !== correctOriginalKey) {
+          var warningKey = originalKey + ',' + correctOriginalKey;
 
-    if (listener) {
-      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
-      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
-    }
-  }
-}
-/**
- * Accumulates dispatches on an `SyntheticEvent`, but only for the
- * `dispatchMarker`.
- * @param {SyntheticEvent} event
- */
+          if (warnedAbout[warningKey]) {
+            continue;
+          }
 
+          warnedAbout[warningKey] = true;
 
-function accumulateDirectDispatchesSingle(event) {
-  if (event && event.dispatchConfig.registrationName) {
-    accumulateDispatches(event._targetInst, null, event);
+          error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);
+        }
+      }
+    }
   }
-}
 
-function accumulateTwoPhaseDispatches(events) {
-  forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
-}
+  // For HTML, certain tags should omit their close tag. We keep a whitelist for
+  // those special-case tags.
+  var omittedCloseTags = {
+    area: true,
+    base: true,
+    br: true,
+    col: true,
+    embed: true,
+    hr: true,
+    img: true,
+    input: true,
+    keygen: true,
+    link: true,
+    meta: true,
+    param: true,
+    source: true,
+    track: true,
+    wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.
 
-function accumulateEnterLeaveDispatches(leave, enter, from, to) {
-  traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
-}
-function accumulateDirectDispatches(events) {
-  forEachAccumulated(events, accumulateDirectDispatchesSingle);
-}
+  };
 
-/* eslint valid-typeof: 0 */
-var EVENT_POOL_SIZE = 10;
-/**
- * @interface Event
- * @see http://www.w3.org/TR/DOM-Level-3-Events/
- */
+  // `omittedCloseTags` except that `menuitem` should still have its closing tag.
 
-var EventInterface = {
-  type: null,
-  target: null,
-  // currentTarget is set when dispatching; no use in copying it here
-  currentTarget: function () {
-    return null;
-  },
-  eventPhase: null,
-  bubbles: null,
-  cancelable: null,
-  timeStamp: function (event) {
-    return event.timeStamp || Date.now();
-  },
-  defaultPrevented: null,
-  isTrusted: null
-};
-
-function functionThatReturnsTrue() {
-  return true;
-}
-
-function functionThatReturnsFalse() {
-  return false;
-}
-/**
- * Synthetic events are dispatched by event plugins, typically in response to a
- * top-level event delegation handler.
- *
- * These systems should generally use pooling to reduce the frequency of garbage
- * collection. The system should check `isPersistent` to determine whether the
- * event should be released into the pool after being dispatched. Users that
- * need a persisted event should invoke `persist`.
- *
- * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
- * normalizing browser quirks. Subclasses do not necessarily have to implement a
- * DOM interface; custom application-specific events can also subclass this.
- *
- * @param {object} dispatchConfig Configuration used to dispatch this event.
- * @param {*} targetInst Marker identifying the event target.
- * @param {object} nativeEvent Native browser event.
- * @param {DOMEventTarget} nativeEventTarget Target node.
- */
+  var voidElementTags = _assign({
+    menuitem: true
+  }, omittedCloseTags);
 
+  var HTML = '__html';
+  var ReactDebugCurrentFrame$3 = null;
 
-function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {
   {
-    // these have a getter/setter for warnings
-    delete this.nativeEvent;
-    delete this.preventDefault;
-    delete this.stopPropagation;
-    delete this.isDefaultPrevented;
-    delete this.isPropagationStopped;
+    ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame;
   }
 
-  this.dispatchConfig = dispatchConfig;
-  this._targetInst = targetInst;
-  this.nativeEvent = nativeEvent;
-  var Interface = this.constructor.Interface;
+  function assertValidProps(tag, props) {
+    if (!props) {
+      return;
+    } // Note the use of `==` which checks for null or undefined.
 
-  for (var propName in Interface) {
-    if (!Interface.hasOwnProperty(propName)) {
-      continue;
-    }
 
-    {
-      delete this[propName]; // this has a getter/setter for warnings
+    if (voidElementTags[tag]) {
+      if (!(props.children == null && props.dangerouslySetInnerHTML == null)) {
+        {
+          throw Error( tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );
+        }
+      }
     }
 
-    var normalize = Interface[propName];
+    if (props.dangerouslySetInnerHTML != null) {
+      if (!(props.children == null)) {
+        {
+          throw Error( "Can only set one of `children` or `props.dangerouslySetInnerHTML`." );
+        }
+      }
 
-    if (normalize) {
-      this[propName] = normalize(nativeEvent);
-    } else {
-      if (propName === 'target') {
-        this.target = nativeEventTarget;
-      } else {
-        this[propName] = nativeEvent[propName];
+      if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) {
+        {
+          throw Error( "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information." );
+        }
       }
     }
-  }
 
-  var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
+    {
+      if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
+        error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');
+      }
+    }
 
-  if (defaultPrevented) {
-    this.isDefaultPrevented = functionThatReturnsTrue;
-  } else {
-    this.isDefaultPrevented = functionThatReturnsFalse;
+    if (!(props.style == null || typeof props.style === 'object')) {
+      {
+        throw Error( "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );
+      }
+    }
   }
 
-  this.isPropagationStopped = functionThatReturnsFalse;
-  return this;
-}
+  function isCustomComponent(tagName, props) {
+    if (tagName.indexOf('-') === -1) {
+      return typeof props.is === 'string';
+    }
 
-_assign(SyntheticEvent.prototype, {
-  preventDefault: function () {
-    this.defaultPrevented = true;
-    var event = this.nativeEvent;
+    switch (tagName) {
+      // These are reserved SVG and MathML elements.
+      // We don't mind this whitelist too much because we expect it to never grow.
+      // The alternative is to track the namespace in a few places which is convoluted.
+      // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
+      case 'annotation-xml':
+      case 'color-profile':
+      case 'font-face':
+      case 'font-face-src':
+      case 'font-face-uri':
+      case 'font-face-format':
+      case 'font-face-name':
+      case 'missing-glyph':
+        return false;
 
-    if (!event) {
-      return;
-    }
-
-    if (event.preventDefault) {
-      event.preventDefault();
-    } else if (typeof event.returnValue !== 'unknown') {
-      event.returnValue = false;
-    }
-
-    this.isDefaultPrevented = functionThatReturnsTrue;
-  },
-  stopPropagation: function () {
-    var event = this.nativeEvent;
-
-    if (!event) {
-      return;
-    }
-
-    if (event.stopPropagation) {
-      event.stopPropagation();
-    } else if (typeof event.cancelBubble !== 'unknown') {
-      // The ChangeEventPlugin registers a "propertychange" event for
-      // IE. This event does not support bubbling or cancelling, and
-      // any references to cancelBubble throw "Member not found".  A
-      // typeof check of "unknown" circumvents this issue (and is also
-      // IE specific).
-      event.cancelBubble = true;
+      default:
+        return true;
     }
+  }
 
-    this.isPropagationStopped = functionThatReturnsTrue;
-  },
-
-  /**
-   * We release all dispatched `SyntheticEvent`s after each event loop, adding
-   * them back into the pool. This allows a way to hold onto a reference that
-   * won't be added back into the pool.
-   */
-  persist: function () {
-    this.isPersistent = functionThatReturnsTrue;
-  },
-
-  /**
-   * Checks if this event should be released back into the pool.
-   *
-   * @return {boolean} True if this should not be released, false otherwise.
-   */
-  isPersistent: functionThatReturnsFalse,
-
-  /**
-   * `PooledClass` looks for `destructor` on each instance it releases.
-   */
-  destructor: function () {
-    var Interface = this.constructor.Interface;
+  // When adding attributes to the HTML or SVG whitelist, be sure to
+  // also add them to this module to ensure casing and incorrect name
+  // warnings.
+  var possibleStandardNames = {
+    // HTML
+    accept: 'accept',
+    acceptcharset: 'acceptCharset',
+    'accept-charset': 'acceptCharset',
+    accesskey: 'accessKey',
+    action: 'action',
+    allowfullscreen: 'allowFullScreen',
+    alt: 'alt',
+    as: 'as',
+    async: 'async',
+    autocapitalize: 'autoCapitalize',
+    autocomplete: 'autoComplete',
+    autocorrect: 'autoCorrect',
+    autofocus: 'autoFocus',
+    autoplay: 'autoPlay',
+    autosave: 'autoSave',
+    capture: 'capture',
+    cellpadding: 'cellPadding',
+    cellspacing: 'cellSpacing',
+    challenge: 'challenge',
+    charset: 'charSet',
+    checked: 'checked',
+    children: 'children',
+    cite: 'cite',
+    class: 'className',
+    classid: 'classID',
+    classname: 'className',
+    cols: 'cols',
+    colspan: 'colSpan',
+    content: 'content',
+    contenteditable: 'contentEditable',
+    contextmenu: 'contextMenu',
+    controls: 'controls',
+    controlslist: 'controlsList',
+    coords: 'coords',
+    crossorigin: 'crossOrigin',
+    dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
+    data: 'data',
+    datetime: 'dateTime',
+    default: 'default',
+    defaultchecked: 'defaultChecked',
+    defaultvalue: 'defaultValue',
+    defer: 'defer',
+    dir: 'dir',
+    disabled: 'disabled',
+    disablepictureinpicture: 'disablePictureInPicture',
+    download: 'download',
+    draggable: 'draggable',
+    enctype: 'encType',
+    for: 'htmlFor',
+    form: 'form',
+    formmethod: 'formMethod',
+    formaction: 'formAction',
+    formenctype: 'formEncType',
+    formnovalidate: 'formNoValidate',
+    formtarget: 'formTarget',
+    frameborder: 'frameBorder',
+    headers: 'headers',
+    height: 'height',
+    hidden: 'hidden',
+    high: 'high',
+    href: 'href',
+    hreflang: 'hrefLang',
+    htmlfor: 'htmlFor',
+    httpequiv: 'httpEquiv',
+    'http-equiv': 'httpEquiv',
+    icon: 'icon',
+    id: 'id',
+    innerhtml: 'innerHTML',
+    inputmode: 'inputMode',
+    integrity: 'integrity',
+    is: 'is',
+    itemid: 'itemID',
+    itemprop: 'itemProp',
+    itemref: 'itemRef',
+    itemscope: 'itemScope',
+    itemtype: 'itemType',
+    keyparams: 'keyParams',
+    keytype: 'keyType',
+    kind: 'kind',
+    label: 'label',
+    lang: 'lang',
+    list: 'list',
+    loop: 'loop',
+    low: 'low',
+    manifest: 'manifest',
+    marginwidth: 'marginWidth',
+    marginheight: 'marginHeight',
+    max: 'max',
+    maxlength: 'maxLength',
+    media: 'media',
+    mediagroup: 'mediaGroup',
+    method: 'method',
+    min: 'min',
+    minlength: 'minLength',
+    multiple: 'multiple',
+    muted: 'muted',
+    name: 'name',
+    nomodule: 'noModule',
+    nonce: 'nonce',
+    novalidate: 'noValidate',
+    open: 'open',
+    optimum: 'optimum',
+    pattern: 'pattern',
+    placeholder: 'placeholder',
+    playsinline: 'playsInline',
+    poster: 'poster',
+    preload: 'preload',
+    profile: 'profile',
+    radiogroup: 'radioGroup',
+    readonly: 'readOnly',
+    referrerpolicy: 'referrerPolicy',
+    rel: 'rel',
+    required: 'required',
+    reversed: 'reversed',
+    role: 'role',
+    rows: 'rows',
+    rowspan: 'rowSpan',
+    sandbox: 'sandbox',
+    scope: 'scope',
+    scoped: 'scoped',
+    scrolling: 'scrolling',
+    seamless: 'seamless',
+    selected: 'selected',
+    shape: 'shape',
+    size: 'size',
+    sizes: 'sizes',
+    span: 'span',
+    spellcheck: 'spellCheck',
+    src: 'src',
+    srcdoc: 'srcDoc',
+    srclang: 'srcLang',
+    srcset: 'srcSet',
+    start: 'start',
+    step: 'step',
+    style: 'style',
+    summary: 'summary',
+    tabindex: 'tabIndex',
+    target: 'target',
+    title: 'title',
+    type: 'type',
+    usemap: 'useMap',
+    value: 'value',
+    width: 'width',
+    wmode: 'wmode',
+    wrap: 'wrap',
+    // SVG
+    about: 'about',
+    accentheight: 'accentHeight',
+    'accent-height': 'accentHeight',
+    accumulate: 'accumulate',
+    additive: 'additive',
+    alignmentbaseline: 'alignmentBaseline',
+    'alignment-baseline': 'alignmentBaseline',
+    allowreorder: 'allowReorder',
+    alphabetic: 'alphabetic',
+    amplitude: 'amplitude',
+    arabicform: 'arabicForm',
+    'arabic-form': 'arabicForm',
+    ascent: 'ascent',
+    attributename: 'attributeName',
+    attributetype: 'attributeType',
+    autoreverse: 'autoReverse',
+    azimuth: 'azimuth',
+    basefrequency: 'baseFrequency',
+    baselineshift: 'baselineShift',
+    'baseline-shift': 'baselineShift',
+    baseprofile: 'baseProfile',
+    bbox: 'bbox',
+    begin: 'begin',
+    bias: 'bias',
+    by: 'by',
+    calcmode: 'calcMode',
+    capheight: 'capHeight',
+    'cap-height': 'capHeight',
+    clip: 'clip',
+    clippath: 'clipPath',
+    'clip-path': 'clipPath',
+    clippathunits: 'clipPathUnits',
+    cliprule: 'clipRule',
+    'clip-rule': 'clipRule',
+    color: 'color',
+    colorinterpolation: 'colorInterpolation',
+    'color-interpolation': 'colorInterpolation',
+    colorinterpolationfilters: 'colorInterpolationFilters',
+    'color-interpolation-filters': 'colorInterpolationFilters',
+    colorprofile: 'colorProfile',
+    'color-profile': 'colorProfile',
+    colorrendering: 'colorRendering',
+    'color-rendering': 'colorRendering',
+    contentscripttype: 'contentScriptType',
+    contentstyletype: 'contentStyleType',
+    cursor: 'cursor',
+    cx: 'cx',
+    cy: 'cy',
+    d: 'd',
+    datatype: 'datatype',
+    decelerate: 'decelerate',
+    descent: 'descent',
+    diffuseconstant: 'diffuseConstant',
+    direction: 'direction',
+    display: 'display',
+    divisor: 'divisor',
+    dominantbaseline: 'dominantBaseline',
+    'dominant-baseline': 'dominantBaseline',
+    dur: 'dur',
+    dx: 'dx',
+    dy: 'dy',
+    edgemode: 'edgeMode',
+    elevation: 'elevation',
+    enablebackground: 'enableBackground',
+    'enable-background': 'enableBackground',
+    end: 'end',
+    exponent: 'exponent',
+    externalresourcesrequired: 'externalResourcesRequired',
+    fill: 'fill',
+    fillopacity: 'fillOpacity',
+    'fill-opacity': 'fillOpacity',
+    fillrule: 'fillRule',
+    'fill-rule': 'fillRule',
+    filter: 'filter',
+    filterres: 'filterRes',
+    filterunits: 'filterUnits',
+    floodopacity: 'floodOpacity',
+    'flood-opacity': 'floodOpacity',
+    floodcolor: 'floodColor',
+    'flood-color': 'floodColor',
+    focusable: 'focusable',
+    fontfamily: 'fontFamily',
+    'font-family': 'fontFamily',
+    fontsize: 'fontSize',
+    'font-size': 'fontSize',
+    fontsizeadjust: 'fontSizeAdjust',
+    'font-size-adjust': 'fontSizeAdjust',
+    fontstretch: 'fontStretch',
+    'font-stretch': 'fontStretch',
+    fontstyle: 'fontStyle',
+    'font-style': 'fontStyle',
+    fontvariant: 'fontVariant',
+    'font-variant': 'fontVariant',
+    fontweight: 'fontWeight',
+    'font-weight': 'fontWeight',
+    format: 'format',
+    from: 'from',
+    fx: 'fx',
+    fy: 'fy',
+    g1: 'g1',
+    g2: 'g2',
+    glyphname: 'glyphName',
+    'glyph-name': 'glyphName',
+    glyphorientationhorizontal: 'glyphOrientationHorizontal',
+    'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
+    glyphorientationvertical: 'glyphOrientationVertical',
+    'glyph-orientation-vertical': 'glyphOrientationVertical',
+    glyphref: 'glyphRef',
+    gradienttransform: 'gradientTransform',
+    gradientunits: 'gradientUnits',
+    hanging: 'hanging',
+    horizadvx: 'horizAdvX',
+    'horiz-adv-x': 'horizAdvX',
+    horizoriginx: 'horizOriginX',
+    'horiz-origin-x': 'horizOriginX',
+    ideographic: 'ideographic',
+    imagerendering: 'imageRendering',
+    'image-rendering': 'imageRendering',
+    in2: 'in2',
+    in: 'in',
+    inlist: 'inlist',
+    intercept: 'intercept',
+    k1: 'k1',
+    k2: 'k2',
+    k3: 'k3',
+    k4: 'k4',
+    k: 'k',
+    kernelmatrix: 'kernelMatrix',
+    kernelunitlength: 'kernelUnitLength',
+    kerning: 'kerning',
+    keypoints: 'keyPoints',
+    keysplines: 'keySplines',
+    keytimes: 'keyTimes',
+    lengthadjust: 'lengthAdjust',
+    letterspacing: 'letterSpacing',
+    'letter-spacing': 'letterSpacing',
+    lightingcolor: 'lightingColor',
+    'lighting-color': 'lightingColor',
+    limitingconeangle: 'limitingConeAngle',
+    local: 'local',
+    markerend: 'markerEnd',
+    'marker-end': 'markerEnd',
+    markerheight: 'markerHeight',
+    markermid: 'markerMid',
+    'marker-mid': 'markerMid',
+    markerstart: 'markerStart',
+    'marker-start': 'markerStart',
+    markerunits: 'markerUnits',
+    markerwidth: 'markerWidth',
+    mask: 'mask',
+    maskcontentunits: 'maskContentUnits',
+    maskunits: 'maskUnits',
+    mathematical: 'mathematical',
+    mode: 'mode',
+    numoctaves: 'numOctaves',
+    offset: 'offset',
+    opacity: 'opacity',
+    operator: 'operator',
+    order: 'order',
+    orient: 'orient',
+    orientation: 'orientation',
+    origin: 'origin',
+    overflow: 'overflow',
+    overlineposition: 'overlinePosition',
+    'overline-position': 'overlinePosition',
+    overlinethickness: 'overlineThickness',
+    'overline-thickness': 'overlineThickness',
+    paintorder: 'paintOrder',
+    'paint-order': 'paintOrder',
+    panose1: 'panose1',
+    'panose-1': 'panose1',
+    pathlength: 'pathLength',
+    patterncontentunits: 'patternContentUnits',
+    patterntransform: 'patternTransform',
+    patternunits: 'patternUnits',
+    pointerevents: 'pointerEvents',
+    'pointer-events': 'pointerEvents',
+    points: 'points',
+    pointsatx: 'pointsAtX',
+    pointsaty: 'pointsAtY',
+    pointsatz: 'pointsAtZ',
+    prefix: 'prefix',
+    preservealpha: 'preserveAlpha',
+    preserveaspectratio: 'preserveAspectRatio',
+    primitiveunits: 'primitiveUnits',
+    property: 'property',
+    r: 'r',
+    radius: 'radius',
+    refx: 'refX',
+    refy: 'refY',
+    renderingintent: 'renderingIntent',
+    'rendering-intent': 'renderingIntent',
+    repeatcount: 'repeatCount',
+    repeatdur: 'repeatDur',
+    requiredextensions: 'requiredExtensions',
+    requiredfeatures: 'requiredFeatures',
+    resource: 'resource',
+    restart: 'restart',
+    result: 'result',
+    results: 'results',
+    rotate: 'rotate',
+    rx: 'rx',
+    ry: 'ry',
+    scale: 'scale',
+    security: 'security',
+    seed: 'seed',
+    shaperendering: 'shapeRendering',
+    'shape-rendering': 'shapeRendering',
+    slope: 'slope',
+    spacing: 'spacing',
+    specularconstant: 'specularConstant',
+    specularexponent: 'specularExponent',
+    speed: 'speed',
+    spreadmethod: 'spreadMethod',
+    startoffset: 'startOffset',
+    stddeviation: 'stdDeviation',
+    stemh: 'stemh',
+    stemv: 'stemv',
+    stitchtiles: 'stitchTiles',
+    stopcolor: 'stopColor',
+    'stop-color': 'stopColor',
+    stopopacity: 'stopOpacity',
+    'stop-opacity': 'stopOpacity',
+    strikethroughposition: 'strikethroughPosition',
+    'strikethrough-position': 'strikethroughPosition',
+    strikethroughthickness: 'strikethroughThickness',
+    'strikethrough-thickness': 'strikethroughThickness',
+    string: 'string',
+    stroke: 'stroke',
+    strokedasharray: 'strokeDasharray',
+    'stroke-dasharray': 'strokeDasharray',
+    strokedashoffset: 'strokeDashoffset',
+    'stroke-dashoffset': 'strokeDashoffset',
+    strokelinecap: 'strokeLinecap',
+    'stroke-linecap': 'strokeLinecap',
+    strokelinejoin: 'strokeLinejoin',
+    'stroke-linejoin': 'strokeLinejoin',
+    strokemiterlimit: 'strokeMiterlimit',
+    'stroke-miterlimit': 'strokeMiterlimit',
+    strokewidth: 'strokeWidth',
+    'stroke-width': 'strokeWidth',
+    strokeopacity: 'strokeOpacity',
+    'stroke-opacity': 'strokeOpacity',
+    suppresscontenteditablewarning: 'suppressContentEditableWarning',
+    suppresshydrationwarning: 'suppressHydrationWarning',
+    surfacescale: 'surfaceScale',
+    systemlanguage: 'systemLanguage',
+    tablevalues: 'tableValues',
+    targetx: 'targetX',
+    targety: 'targetY',
+    textanchor: 'textAnchor',
+    'text-anchor': 'textAnchor',
+    textdecoration: 'textDecoration',
+    'text-decoration': 'textDecoration',
+    textlength: 'textLength',
+    textrendering: 'textRendering',
+    'text-rendering': 'textRendering',
+    to: 'to',
+    transform: 'transform',
+    typeof: 'typeof',
+    u1: 'u1',
+    u2: 'u2',
+    underlineposition: 'underlinePosition',
+    'underline-position': 'underlinePosition',
+    underlinethickness: 'underlineThickness',
+    'underline-thickness': 'underlineThickness',
+    unicode: 'unicode',
+    unicodebidi: 'unicodeBidi',
+    'unicode-bidi': 'unicodeBidi',
+    unicoderange: 'unicodeRange',
+    'unicode-range': 'unicodeRange',
+    unitsperem: 'unitsPerEm',
+    'units-per-em': 'unitsPerEm',
+    unselectable: 'unselectable',
+    valphabetic: 'vAlphabetic',
+    'v-alphabetic': 'vAlphabetic',
+    values: 'values',
+    vectoreffect: 'vectorEffect',
+    'vector-effect': 'vectorEffect',
+    version: 'version',
+    vertadvy: 'vertAdvY',
+    'vert-adv-y': 'vertAdvY',
+    vertoriginx: 'vertOriginX',
+    'vert-origin-x': 'vertOriginX',
+    vertoriginy: 'vertOriginY',
+    'vert-origin-y': 'vertOriginY',
+    vhanging: 'vHanging',
+    'v-hanging': 'vHanging',
+    videographic: 'vIdeographic',
+    'v-ideographic': 'vIdeographic',
+    viewbox: 'viewBox',
+    viewtarget: 'viewTarget',
+    visibility: 'visibility',
+    vmathematical: 'vMathematical',
+    'v-mathematical': 'vMathematical',
+    vocab: 'vocab',
+    widths: 'widths',
+    wordspacing: 'wordSpacing',
+    'word-spacing': 'wordSpacing',
+    writingmode: 'writingMode',
+    'writing-mode': 'writingMode',
+    x1: 'x1',
+    x2: 'x2',
+    x: 'x',
+    xchannelselector: 'xChannelSelector',
+    xheight: 'xHeight',
+    'x-height': 'xHeight',
+    xlinkactuate: 'xlinkActuate',
+    'xlink:actuate': 'xlinkActuate',
+    xlinkarcrole: 'xlinkArcrole',
+    'xlink:arcrole': 'xlinkArcrole',
+    xlinkhref: 'xlinkHref',
+    'xlink:href': 'xlinkHref',
+    xlinkrole: 'xlinkRole',
+    'xlink:role': 'xlinkRole',
+    xlinkshow: 'xlinkShow',
+    'xlink:show': 'xlinkShow',
+    xlinktitle: 'xlinkTitle',
+    'xlink:title': 'xlinkTitle',
+    xlinktype: 'xlinkType',
+    'xlink:type': 'xlinkType',
+    xmlbase: 'xmlBase',
+    'xml:base': 'xmlBase',
+    xmllang: 'xmlLang',
+    'xml:lang': 'xmlLang',
+    xmlns: 'xmlns',
+    'xml:space': 'xmlSpace',
+    xmlnsxlink: 'xmlnsXlink',
+    'xmlns:xlink': 'xmlnsXlink',
+    xmlspace: 'xmlSpace',
+    y1: 'y1',
+    y2: 'y2',
+    y: 'y',
+    ychannelselector: 'yChannelSelector',
+    z: 'z',
+    zoomandpan: 'zoomAndPan'
+  };
 
-    for (var propName in Interface) {
-      {
-        Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));
-      }
-    }
+  var ariaProperties = {
+    'aria-current': 0,
+    // state
+    'aria-details': 0,
+    'aria-disabled': 0,
+    // state
+    'aria-hidden': 0,
+    // state
+    'aria-invalid': 0,
+    // state
+    'aria-keyshortcuts': 0,
+    'aria-label': 0,
+    'aria-roledescription': 0,
+    // Widget Attributes
+    'aria-autocomplete': 0,
+    'aria-checked': 0,
+    'aria-expanded': 0,
+    'aria-haspopup': 0,
+    'aria-level': 0,
+    'aria-modal': 0,
+    'aria-multiline': 0,
+    'aria-multiselectable': 0,
+    'aria-orientation': 0,
+    'aria-placeholder': 0,
+    'aria-pressed': 0,
+    'aria-readonly': 0,
+    'aria-required': 0,
+    'aria-selected': 0,
+    'aria-sort': 0,
+    'aria-valuemax': 0,
+    'aria-valuemin': 0,
+    'aria-valuenow': 0,
+    'aria-valuetext': 0,
+    // Live Region Attributes
+    'aria-atomic': 0,
+    'aria-busy': 0,
+    'aria-live': 0,
+    'aria-relevant': 0,
+    // Drag-and-Drop Attributes
+    'aria-dropeffect': 0,
+    'aria-grabbed': 0,
+    // Relationship Attributes
+    'aria-activedescendant': 0,
+    'aria-colcount': 0,
+    'aria-colindex': 0,
+    'aria-colspan': 0,
+    'aria-controls': 0,
+    'aria-describedby': 0,
+    'aria-errormessage': 0,
+    'aria-flowto': 0,
+    'aria-labelledby': 0,
+    'aria-owns': 0,
+    'aria-posinset': 0,
+    'aria-rowcount': 0,
+    'aria-rowindex': 0,
+    'aria-rowspan': 0,
+    'aria-setsize': 0
+  };
 
-    this.dispatchConfig = null;
-    this._targetInst = null;
-    this.nativeEvent = null;
-    this.isDefaultPrevented = functionThatReturnsFalse;
-    this.isPropagationStopped = functionThatReturnsFalse;
-    this._dispatchListeners = null;
-    this._dispatchInstances = null;
+  var warnedProperties = {};
+  var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
+  var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
+  var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
 
+  function validateProperty(tagName, name) {
     {
-      Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));
-      Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));
-      Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));
-      Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));
-      Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));
-    }
-  }
-});
+      if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) {
+        return true;
+      }
 
-SyntheticEvent.Interface = EventInterface;
-/**
- * Helper to reduce boilerplate when creating subclasses.
- */
+      if (rARIACamel.test(name)) {
+        var ariaName = 'aria-' + name.slice(4).toLowerCase();
+        var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
+        // DOM properties, then it is an invalid aria-* attribute.
 
-SyntheticEvent.extend = function (Interface) {
-  var Super = this;
+        if (correctName == null) {
+          error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
 
-  var E = function () {};
+          warnedProperties[name] = true;
+          return true;
+        } // aria-* attributes should be lowercase; suggest the lowercase version.
 
-  E.prototype = Super.prototype;
-  var prototype = new E();
 
-  function Class() {
-    return Super.apply(this, arguments);
-  }
+        if (name !== correctName) {
+          error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
 
-  _assign(prototype, Class.prototype);
+          warnedProperties[name] = true;
+          return true;
+        }
+      }
 
-  Class.prototype = prototype;
-  Class.prototype.constructor = Class;
-  Class.Interface = _assign({}, Super.Interface, Interface);
-  Class.extend = Super.extend;
-  addEventPoolingTo(Class);
-  return Class;
-};
+      if (rARIA.test(name)) {
+        var lowerCasedName = name.toLowerCase();
+        var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
+        // DOM properties, then it is an invalid aria-* attribute.
 
-addEventPoolingTo(SyntheticEvent);
-/**
- * Helper to nullify syntheticEvent instance properties when destructing
- *
- * @param {String} propName
- * @param {?object} getVal
- * @return {object} defineProperty object
- */
+        if (standardName == null) {
+          warnedProperties[name] = true;
+          return false;
+        } // aria-* attributes should be lowercase; suggest the lowercase version.
 
-function getPooledWarningPropertyDefinition(propName, getVal) {
-  var isFunction = typeof getVal === 'function';
-  return {
-    configurable: true,
-    set: set,
-    get: get
-  };
 
-  function set(val) {
-    var action = isFunction ? 'setting the method' : 'setting the property';
-    warn(action, 'This is effectively a no-op');
-    return val;
-  }
+        if (name !== standardName) {
+          error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
 
-  function get() {
-    var action = isFunction ? 'accessing the method' : 'accessing the property';
-    var result = isFunction ? 'This is a no-op function' : 'This is set to null';
-    warn(action, result);
-    return getVal;
-  }
+          warnedProperties[name] = true;
+          return true;
+        }
+      }
+    }
 
-  function warn(action, result) {
-    var warningCondition = false;
-    !warningCondition ? warningWithoutStack$1(false, "This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0;
+    return true;
   }
-}
 
-function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {
-  var EventConstructor = this;
+  function warnInvalidARIAProps(type, props) {
+    {
+      var invalidProps = [];
 
-  if (EventConstructor.eventPool.length) {
-    var instance = EventConstructor.eventPool.pop();
-    EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);
-    return instance;
-  }
+      for (var key in props) {
+        var isValid = validateProperty(type, key);
 
-  return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);
-}
+        if (!isValid) {
+          invalidProps.push(key);
+        }
+      }
 
-function releasePooledEvent(event) {
-  var EventConstructor = this;
+      var unknownPropString = invalidProps.map(function (prop) {
+        return '`' + prop + '`';
+      }).join(', ');
 
-  if (!(event instanceof EventConstructor)) {
-    {
-      throw Error("Trying to release an event instance into a pool of a different type.");
+      if (invalidProps.length === 1) {
+        error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
+      } else if (invalidProps.length > 1) {
+        error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
+      }
     }
   }
 
-  event.destructor();
+  function validateProperties(type, props) {
+    if (isCustomComponent(type, props)) {
+      return;
+    }
 
-  if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {
-    EventConstructor.eventPool.push(event);
+    warnInvalidARIAProps(type, props);
   }
-}
 
-function addEventPoolingTo(EventConstructor) {
-  EventConstructor.eventPool = [];
-  EventConstructor.getPooled = getPooledEvent;
-  EventConstructor.release = releasePooledEvent;
-}
-
-/**
- * @interface Event
- * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
- * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
- */
-
-var SyntheticAnimationEvent = SyntheticEvent.extend({
-  animationName: null,
-  elapsedTime: null,
-  pseudoElement: null
-});
+  var didWarnValueNull = false;
+  function validateProperties$1(type, props) {
+    {
+      if (type !== 'input' && type !== 'textarea' && type !== 'select') {
+        return;
+      }
 
-/**
- * @interface Event
- * @see http://www.w3.org/TR/clipboard-apis/
- */
+      if (props != null && props.value === null && !didWarnValueNull) {
+        didWarnValueNull = true;
 
-var SyntheticClipboardEvent = SyntheticEvent.extend({
-  clipboardData: function (event) {
-    return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
+        if (type === 'select' && props.multiple) {
+          error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);
+        } else {
+          error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
+        }
+      }
+    }
   }
-});
 
-var SyntheticUIEvent = SyntheticEvent.extend({
-  view: null,
-  detail: null
-});
+  var validateProperty$1 = function () {};
 
-/**
- * @interface FocusEvent
- * @see http://www.w3.org/TR/DOM-Level-3-Events/
- */
+  {
+    var warnedProperties$1 = {};
+    var _hasOwnProperty = Object.prototype.hasOwnProperty;
+    var EVENT_NAME_REGEX = /^on./;
+    var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
+    var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
+    var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
+
+    validateProperty$1 = function (tagName, name, value, canUseEventSystem) {
+      if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
+        return true;
+      }
 
-var SyntheticFocusEvent = SyntheticUIEvent.extend({
-  relatedTarget: null
-});
+      var lowerCasedName = name.toLowerCase();
 
-/**
- * `charCode` represents the actual "character code" and is safe to use with
- * `String.fromCharCode`. As such, only keys that correspond to printable
- * characters produce a valid `charCode`, the only exception to this is Enter.
- * The Tab-key is considered non-printable and does not have a `charCode`,
- * presumably because it does not produce a tab-character in browsers.
- *
- * @param {object} nativeEvent Native browser event.
- * @return {number} Normalized `charCode` property.
- */
-function getEventCharCode(nativeEvent) {
-  var charCode;
-  var keyCode = nativeEvent.keyCode;
+      if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
+        error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');
 
-  if ('charCode' in nativeEvent) {
-    charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.
+        warnedProperties$1[name] = true;
+        return true;
+      } // We can't rely on the event system being injected on the server.
 
-    if (charCode === 0 && keyCode === 13) {
-      charCode = 13;
-    }
-  } else {
-    // IE8 does not implement `charCode`, but `keyCode` has the correct value.
-    charCode = keyCode;
-  } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)
-  // report Enter as charCode 10 when ctrl is pressed.
 
+      if (canUseEventSystem) {
+        if (registrationNameModules.hasOwnProperty(name)) {
+          return true;
+        }
 
-  if (charCode === 10) {
-    charCode = 13;
-  } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
-  // Must not discard the (non-)printable Enter-key.
+        var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
 
+        if (registrationName != null) {
+          error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
 
-  if (charCode >= 32 || charCode === 13) {
-    return charCode;
-  }
+          warnedProperties$1[name] = true;
+          return true;
+        }
 
-  return 0;
-}
+        if (EVENT_NAME_REGEX.test(name)) {
+          error('Unknown event handler property `%s`. It will be ignored.', name);
 
-/**
- * Normalization of deprecated HTML5 `key` values
- * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
- */
+          warnedProperties$1[name] = true;
+          return true;
+        }
+      } else if (EVENT_NAME_REGEX.test(name)) {
+        // If no event plugins have been injected, we are in a server environment.
+        // So we can't tell if the event name is correct for sure, but we can filter
+        // out known bad ones like `onclick`. We can't suggest a specific replacement though.
+        if (INVALID_EVENT_NAME_REGEX.test(name)) {
+          error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
+        }
 
-var normalizeKey = {
-  Esc: 'Escape',
-  Spacebar: ' ',
-  Left: 'ArrowLeft',
-  Up: 'ArrowUp',
-  Right: 'ArrowRight',
-  Down: 'ArrowDown',
-  Del: 'Delete',
-  Win: 'OS',
-  Menu: 'ContextMenu',
-  Apps: 'ContextMenu',
-  Scroll: 'ScrollLock',
-  MozPrintableKey: 'Unidentified'
-};
-/**
- * Translation from legacy `keyCode` to HTML5 `key`
- * Only special keys supported, all others depend on keyboard layout or browser
- * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
- */
+        warnedProperties$1[name] = true;
+        return true;
+      } // Let the ARIA attribute hook validate ARIA attributes
 
-var translateToKey = {
-  '8': 'Backspace',
-  '9': 'Tab',
-  '12': 'Clear',
-  '13': 'Enter',
-  '16': 'Shift',
-  '17': 'Control',
-  '18': 'Alt',
-  '19': 'Pause',
-  '20': 'CapsLock',
-  '27': 'Escape',
-  '32': ' ',
-  '33': 'PageUp',
-  '34': 'PageDown',
-  '35': 'End',
-  '36': 'Home',
-  '37': 'ArrowLeft',
-  '38': 'ArrowUp',
-  '39': 'ArrowRight',
-  '40': 'ArrowDown',
-  '45': 'Insert',
-  '46': 'Delete',
-  '112': 'F1',
-  '113': 'F2',
-  '114': 'F3',
-  '115': 'F4',
-  '116': 'F5',
-  '117': 'F6',
-  '118': 'F7',
-  '119': 'F8',
-  '120': 'F9',
-  '121': 'F10',
-  '122': 'F11',
-  '123': 'F12',
-  '144': 'NumLock',
-  '145': 'ScrollLock',
-  '224': 'Meta'
-};
-/**
- * @param {object} nativeEvent Native browser event.
- * @return {string} Normalized `key` property.
- */
 
-function getEventKey(nativeEvent) {
-  if (nativeEvent.key) {
-    // Normalize inconsistent values reported by browsers due to
-    // implementations of a working draft specification.
-    // FireFox implements `key` but returns `MozPrintableKey` for all
-    // printable characters (normalized to `Unidentified`), ignore it.
-    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
+      if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
+        return true;
+      }
 
-    if (key !== 'Unidentified') {
-      return key;
-    }
-  } // Browser does not implement `key`, polyfill as much of it as we can.
+      if (lowerCasedName === 'innerhtml') {
+        error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
 
+        warnedProperties$1[name] = true;
+        return true;
+      }
 
-  if (nativeEvent.type === 'keypress') {
-    var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can
-    // thus be captured by `keypress`, no other non-printable key should.
+      if (lowerCasedName === 'aria') {
+        error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
 
-    return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
-  }
+        warnedProperties$1[name] = true;
+        return true;
+      }
 
-  if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
-    // While user keyboard layout determines the actual meaning of each
-    // `keyCode` value, almost all function keys have a universal value.
-    return translateToKey[nativeEvent.keyCode] || 'Unidentified';
-  }
+      if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
+        error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
 
-  return '';
-}
+        warnedProperties$1[name] = true;
+        return true;
+      }
 
-/**
- * Translation from modifier key to the associated property in the event.
- * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
- */
-var modifierKeyToProp = {
-  Alt: 'altKey',
-  Control: 'ctrlKey',
-  Meta: 'metaKey',
-  Shift: 'shiftKey'
-}; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support
-// getModifierState. If getModifierState is not supported, we map it to a set of
-// modifier keys exposed by the event. In this case, Lock-keys are not supported.
-
-function modifierStateGetter(keyArg) {
-  var syntheticEvent = this;
-  var nativeEvent = syntheticEvent.nativeEvent;
-
-  if (nativeEvent.getModifierState) {
-    return nativeEvent.getModifierState(keyArg);
-  }
-
-  var keyProp = modifierKeyToProp[keyArg];
-  return keyProp ? !!nativeEvent[keyProp] : false;
-}
-
-function getEventModifierState(nativeEvent) {
-  return modifierStateGetter;
-}
-
-/**
- * @interface KeyboardEvent
- * @see http://www.w3.org/TR/DOM-Level-3-Events/
- */
+      if (typeof value === 'number' && isNaN(value)) {
+        error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
 
-var SyntheticKeyboardEvent = SyntheticUIEvent.extend({
-  key: getEventKey,
-  location: null,
-  ctrlKey: null,
-  shiftKey: null,
-  altKey: null,
-  metaKey: null,
-  repeat: null,
-  locale: null,
-  getModifierState: getEventModifierState,
-  // Legacy Interface
-  charCode: function (event) {
-    // `charCode` is the result of a KeyPress event and represents the value of
-    // the actual printable character.
-    // KeyPress is deprecated, but its replacement is not yet final and not
-    // implemented in any major browser. Only KeyPress has charCode.
-    if (event.type === 'keypress') {
-      return getEventCharCode(event);
-    }
+        warnedProperties$1[name] = true;
+        return true;
+      }
 
-    return 0;
-  },
-  keyCode: function (event) {
-    // `keyCode` is the result of a KeyDown/Up event and represents the value of
-    // physical keyboard key.
-    // The actual meaning of the value depends on the users' keyboard layout
-    // which cannot be detected. Assuming that it is a US keyboard layout
-    // provides a surprisingly accurate mapping for US and European users.
-    // Due to this, it is left to the user to implement at this time.
-    if (event.type === 'keydown' || event.type === 'keyup') {
-      return event.keyCode;
-    }
+      var propertyInfo = getPropertyInfo(name);
+      var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
 
-    return 0;
-  },
-  which: function (event) {
-    // `which` is an alias for either `keyCode` or `charCode` depending on the
-    // type of the event.
-    if (event.type === 'keypress') {
-      return getEventCharCode(event);
-    }
+      if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
+        var standardName = possibleStandardNames[lowerCasedName];
 
-    if (event.type === 'keydown' || event.type === 'keyup') {
-      return event.keyCode;
-    }
+        if (standardName !== name) {
+          error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
 
-    return 0;
-  }
-});
+          warnedProperties$1[name] = true;
+          return true;
+        }
+      } else if (!isReserved && name !== lowerCasedName) {
+        // Unknown attributes should have lowercase casing since that's how they
+        // will be cased anyway with server rendering.
+        error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);
 
-var previousScreenX = 0;
-var previousScreenY = 0; // Use flags to signal movementX/Y has already been set
+        warnedProperties$1[name] = true;
+        return true;
+      }
 
-var isMovementXSet = false;
-var isMovementYSet = false;
-/**
- * @interface MouseEvent
- * @see http://www.w3.org/TR/DOM-Level-3-Events/
- */
+      if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
+        if (value) {
+          error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name);
+        } else {
+          error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);
+        }
 
-var SyntheticMouseEvent = SyntheticUIEvent.extend({
-  screenX: null,
-  screenY: null,
-  clientX: null,
-  clientY: null,
-  pageX: null,
-  pageY: null,
-  ctrlKey: null,
-  shiftKey: null,
-  altKey: null,
-  metaKey: null,
-  getModifierState: getEventModifierState,
-  button: null,
-  buttons: null,
-  relatedTarget: function (event) {
-    return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);
-  },
-  movementX: function (event) {
-    if ('movementX' in event) {
-      return event.movementX;
-    }
-
-    var screenX = previousScreenX;
-    previousScreenX = event.screenX;
-
-    if (!isMovementXSet) {
-      isMovementXSet = true;
-      return 0;
-    }
+        warnedProperties$1[name] = true;
+        return true;
+      } // Now that we've validated casing, do not validate
+      // data types for reserved props
 
-    return event.type === 'mousemove' ? event.screenX - screenX : 0;
-  },
-  movementY: function (event) {
-    if ('movementY' in event) {
-      return event.movementY;
-    }
 
-    var screenY = previousScreenY;
-    previousScreenY = event.screenY;
+      if (isReserved) {
+        return true;
+      } // Warn when a known attribute is a bad type
 
-    if (!isMovementYSet) {
-      isMovementYSet = true;
-      return 0;
-    }
 
-    return event.type === 'mousemove' ? event.screenY - screenY : 0;
-  }
-});
+      if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
+        warnedProperties$1[name] = true;
+        return false;
+      } // Warn when passing the strings 'false' or 'true' into a boolean prop
 
-/**
- * @interface PointerEvent
- * @see http://www.w3.org/TR/pointerevents/
- */
 
-var SyntheticPointerEvent = SyntheticMouseEvent.extend({
-  pointerId: null,
-  width: null,
-  height: null,
-  pressure: null,
-  tangentialPressure: null,
-  tiltX: null,
-  tiltY: null,
-  twist: null,
-  pointerType: null,
-  isPrimary: null
-});
-
-/**
- * @interface DragEvent
- * @see http://www.w3.org/TR/DOM-Level-3-Events/
- */
+      if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
+        error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value);
 
-var SyntheticDragEvent = SyntheticMouseEvent.extend({
-  dataTransfer: null
-});
+        warnedProperties$1[name] = true;
+        return true;
+      }
 
-/**
- * @interface TouchEvent
- * @see http://www.w3.org/TR/touch-events/
- */
+      return true;
+    };
+  }
 
-var SyntheticTouchEvent = SyntheticUIEvent.extend({
-  touches: null,
-  targetTouches: null,
-  changedTouches: null,
-  altKey: null,
-  metaKey: null,
-  ctrlKey: null,
-  shiftKey: null,
-  getModifierState: getEventModifierState
-});
-
-/**
- * @interface Event
- * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
- * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
- */
+  var warnUnknownProperties = function (type, props, canUseEventSystem) {
+    {
+      var unknownProps = [];
 
-var SyntheticTransitionEvent = SyntheticEvent.extend({
-  propertyName: null,
-  elapsedTime: null,
-  pseudoElement: null
-});
+      for (var key in props) {
+        var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);
 
-/**
- * @interface WheelEvent
- * @see http://www.w3.org/TR/DOM-Level-3-Events/
- */
+        if (!isValid) {
+          unknownProps.push(key);
+        }
+      }
 
-var SyntheticWheelEvent = SyntheticMouseEvent.extend({
-  deltaX: function (event) {
-    return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
-    'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
-  },
-  deltaY: function (event) {
-    return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
-    'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
-    'wheelDelta' in event ? -event.wheelDelta : 0;
-  },
-  deltaZ: null,
-  // Browsers without "deltaMode" is reporting in raw wheel delta where one
-  // notch on the scroll is always +/- 120, roughly equivalent to pixels.
-  // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
-  // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
-  deltaMode: null
-});
-
-/**
- * Turns
- * ['abort', ...]
- * into
- * eventTypes = {
- *   'abort': {
- *     phasedRegistrationNames: {
- *       bubbled: 'onAbort',
- *       captured: 'onAbortCapture',
- *     },
- *     dependencies: [TOP_ABORT],
- *   },
- *   ...
- * };
- * topLevelEventsToDispatchConfig = new Map([
- *   [TOP_ABORT, { sameConfig }],
- * ]);
- */
+      var unknownPropString = unknownProps.map(function (prop) {
+        return '`' + prop + '`';
+      }).join(', ');
 
-var eventTuples = [// Discrete events
-[TOP_BLUR, 'blur', DiscreteEvent], [TOP_CANCEL, 'cancel', DiscreteEvent], [TOP_CLICK, 'click', DiscreteEvent], [TOP_CLOSE, 'close', DiscreteEvent], [TOP_CONTEXT_MENU, 'contextMenu', DiscreteEvent], [TOP_COPY, 'copy', DiscreteEvent], [TOP_CUT, 'cut', DiscreteEvent], [TOP_AUX_CLICK, 'auxClick', DiscreteEvent], [TOP_DOUBLE_CLICK, 'doubleClick', DiscreteEvent], [TOP_DRAG_END, 'dragEnd', DiscreteEvent], [TOP_DRAG_START, 'dragStart', DiscreteEvent], [TOP_DROP, 'drop', DiscreteEvent], [TOP_FOCUS, 'focus', DiscreteEvent], [TOP_INPUT, 'input', DiscreteEvent], [TOP_INVALID, 'invalid', DiscreteEvent], [TOP_KEY_DOWN, 'keyDown', DiscreteEvent], [TOP_KEY_PRESS, 'keyPress', DiscreteEvent], [TOP_KEY_UP, 'keyUp', DiscreteEvent], [TOP_MOUSE_DOWN, 'mouseDown', DiscreteEvent], [TOP_MOUSE_UP, 'mouseUp', DiscreteEvent], [TOP_PASTE, 'paste', DiscreteEvent], [TOP_PAUSE, 'pause', DiscreteEvent], [TOP_PLAY, 'play', DiscreteEvent], [TOP_POINTER_CANCEL, 'pointerCancel', DiscreteEvent], [TOP_POINTER_DOWN, 'pointerDown', DiscreteEvent], [TOP_POINTER_UP, 'pointerUp', DiscreteEvent], [TOP_RATE_CHANGE, 'rateChange', DiscreteEvent], [TOP_RESET, 'reset', DiscreteEvent], [TOP_SEEKED, 'seeked', DiscreteEvent], [TOP_SUBMIT, 'submit', DiscreteEvent], [TOP_TOUCH_CANCEL, 'touchCancel', DiscreteEvent], [TOP_TOUCH_END, 'touchEnd', DiscreteEvent], [TOP_TOUCH_START, 'touchStart', DiscreteEvent], [TOP_VOLUME_CHANGE, 'volumeChange', DiscreteEvent], // User-blocking events
-[TOP_DRAG, 'drag', UserBlockingEvent], [TOP_DRAG_ENTER, 'dragEnter', UserBlockingEvent], [TOP_DRAG_EXIT, 'dragExit', UserBlockingEvent], [TOP_DRAG_LEAVE, 'dragLeave', UserBlockingEvent], [TOP_DRAG_OVER, 'dragOver', UserBlockingEvent], [TOP_MOUSE_MOVE, 'mouseMove', UserBlockingEvent], [TOP_MOUSE_OUT, 'mouseOut', UserBlockingEvent], [TOP_MOUSE_OVER, 'mouseOver', UserBlockingEvent], [TOP_POINTER_MOVE, 'pointerMove', UserBlockingEvent], [TOP_POINTER_OUT, 'pointerOut', UserBlockingEvent], [TOP_POINTER_OVER, 'pointerOver', UserBlockingEvent], [TOP_SCROLL, 'scroll', UserBlockingEvent], [TOP_TOGGLE, 'toggle', UserBlockingEvent], [TOP_TOUCH_MOVE, 'touchMove', UserBlockingEvent], [TOP_WHEEL, 'wheel', UserBlockingEvent], // Continuous events
-[TOP_ABORT, 'abort', ContinuousEvent], [TOP_ANIMATION_END, 'animationEnd', ContinuousEvent], [TOP_ANIMATION_ITERATION, 'animationIteration', ContinuousEvent], [TOP_ANIMATION_START, 'animationStart', ContinuousEvent], [TOP_CAN_PLAY, 'canPlay', ContinuousEvent], [TOP_CAN_PLAY_THROUGH, 'canPlayThrough', ContinuousEvent], [TOP_DURATION_CHANGE, 'durationChange', ContinuousEvent], [TOP_EMPTIED, 'emptied', ContinuousEvent], [TOP_ENCRYPTED, 'encrypted', ContinuousEvent], [TOP_ENDED, 'ended', ContinuousEvent], [TOP_ERROR, 'error', ContinuousEvent], [TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', ContinuousEvent], [TOP_LOAD, 'load', ContinuousEvent], [TOP_LOADED_DATA, 'loadedData', ContinuousEvent], [TOP_LOADED_METADATA, 'loadedMetadata', ContinuousEvent], [TOP_LOAD_START, 'loadStart', ContinuousEvent], [TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', ContinuousEvent], [TOP_PLAYING, 'playing', ContinuousEvent], [TOP_PROGRESS, 'progress', ContinuousEvent], [TOP_SEEKING, 'seeking', ContinuousEvent], [TOP_STALLED, 'stalled', ContinuousEvent], [TOP_SUSPEND, 'suspend', ContinuousEvent], [TOP_TIME_UPDATE, 'timeUpdate', ContinuousEvent], [TOP_TRANSITION_END, 'transitionEnd', ContinuousEvent], [TOP_WAITING, 'waiting', ContinuousEvent]];
-var eventTypes = {};
-var topLevelEventsToDispatchConfig = {};
-
-for (var i = 0; i < eventTuples.length; i++) {
-  var eventTuple = eventTuples[i];
-  var topEvent = eventTuple[0];
-  var event = eventTuple[1];
-  var eventPriority = eventTuple[2];
-  var capitalizedEvent = event[0].toUpperCase() + event.slice(1);
-  var onEvent = 'on' + capitalizedEvent;
-  var config = {
-    phasedRegistrationNames: {
-      bubbled: onEvent,
-      captured: onEvent + 'Capture'
-    },
-    dependencies: [topEvent],
-    eventPriority: eventPriority
-  };
-  eventTypes[event] = config;
-  topLevelEventsToDispatchConfig[topEvent] = config;
-} // Only used in DEV for exhaustiveness validation.
-
-
-var knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING];
-var SimpleEventPlugin = {
-  eventTypes: eventTypes,
-  getEventPriority: function (topLevelType) {
-    var config = topLevelEventsToDispatchConfig[topLevelType];
-    return config !== undefined ? config.eventPriority : ContinuousEvent;
-  },
-  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
-    var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
-
-    if (!dispatchConfig) {
-      return null;
+      if (unknownProps.length === 1) {
+        error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);
+      } else if (unknownProps.length > 1) {
+        error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);
+      }
     }
+  };
 
-    var EventConstructor;
+  function validateProperties$2(type, props, canUseEventSystem) {
+    if (isCustomComponent(type, props)) {
+      return;
+    }
 
-    switch (topLevelType) {
-      case TOP_KEY_PRESS:
-        // Firefox creates a keypress event for function keys too. This removes
-        // the unwanted keypress events. Enter is however both printable and
-        // non-printable. One would expect Tab to be as well (but it isn't).
-        if (getEventCharCode(nativeEvent) === 0) {
-          return null;
-        }
+    warnUnknownProperties(type, props, canUseEventSystem);
+  }
+
+  var didWarnInvalidHydration = false;
+  var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
+  var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';
+  var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
+  var AUTOFOCUS = 'autoFocus';
+  var CHILDREN = 'children';
+  var STYLE = 'style';
+  var HTML$1 = '__html';
+  var HTML_NAMESPACE$1 = Namespaces.html;
+  var warnedUnknownTags;
+  var suppressHydrationWarning;
+  var validatePropertiesInDevelopment;
+  var warnForTextDifference;
+  var warnForPropDifference;
+  var warnForExtraAttributes;
+  var warnForInvalidEventListener;
+  var canDiffStyleForHydrationWarning;
+  var normalizeMarkupForTextOrAttribute;
+  var normalizeHTML;
 
-      /* falls through */
+  {
+    warnedUnknownTags = {
+      // Chrome is the only major browser not shipping <time>. But as of July
+      // 2017 it intends to ship it due to widespread usage. We intentionally
+      // *don't* warn for <time> even if it's unrecognized by Chrome because
+      // it soon will be, and many apps have been using it anyway.
+      time: true,
+      // There are working polyfills for <dialog>. Let people use it.
+      dialog: true,
+      // Electron ships a custom <webview> tag to display external web content in
+      // an isolated frame and process.
+      // This tag is not present in non Electron environments such as JSDom which
+      // is often used for testing purposes.
+      // @see https://electronjs.org/docs/api/webview-tag
+      webview: true
+    };
 
-      case TOP_KEY_DOWN:
-      case TOP_KEY_UP:
-        EventConstructor = SyntheticKeyboardEvent;
-        break;
+    validatePropertiesInDevelopment = function (type, props) {
+      validateProperties(type, props);
+      validateProperties$1(type, props);
+      validateProperties$2(type, props,
+      /* canUseEventSystem */
+      true);
+    }; // IE 11 parses & normalizes the style attribute as opposed to other
+    // browsers. It adds spaces and sorts the properties in some
+    // non-alphabetical order. Handling that would require sorting CSS
+    // properties in the client & server versions or applying
+    // `expectedStyle` to a temporary DOM node to read its `style` attribute
+    // normalized. Since it only affects IE, we're skipping style warnings
+    // in that browser completely in favor of doing all that work.
+    // See https://github.com/facebook/react/issues/11807
+
+
+    canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF.
+    // It also can turn \u0000 into \uFFFD inside attributes.
+    // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream
+    // If we have a mismatch, it might be caused by that.
+    // We will still patch up in this case but not fire the warning.
+
+    var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
+    var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
+
+    normalizeMarkupForTextOrAttribute = function (markup) {
+      var markupString = typeof markup === 'string' ? markup : '' + markup;
+      return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');
+    };
 
-      case TOP_BLUR:
-      case TOP_FOCUS:
-        EventConstructor = SyntheticFocusEvent;
-        break;
+    warnForTextDifference = function (serverText, clientText) {
+      if (didWarnInvalidHydration) {
+        return;
+      }
 
-      case TOP_CLICK:
-        // Firefox creates a click event on right mouse clicks. This removes the
-        // unwanted click events.
-        if (nativeEvent.button === 2) {
-          return null;
-        }
+      var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);
+      var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
 
-      /* falls through */
+      if (normalizedServerText === normalizedClientText) {
+        return;
+      }
 
-      case TOP_AUX_CLICK:
-      case TOP_DOUBLE_CLICK:
-      case TOP_MOUSE_DOWN:
-      case TOP_MOUSE_MOVE:
-      case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events
+      didWarnInvalidHydration = true;
 
-      /* falls through */
+      error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText);
+    };
 
-      case TOP_MOUSE_OUT:
-      case TOP_MOUSE_OVER:
-      case TOP_CONTEXT_MENU:
-        EventConstructor = SyntheticMouseEvent;
-        break;
+    warnForPropDifference = function (propName, serverValue, clientValue) {
+      if (didWarnInvalidHydration) {
+        return;
+      }
 
-      case TOP_DRAG:
-      case TOP_DRAG_END:
-      case TOP_DRAG_ENTER:
-      case TOP_DRAG_EXIT:
-      case TOP_DRAG_LEAVE:
-      case TOP_DRAG_OVER:
-      case TOP_DRAG_START:
-      case TOP_DROP:
-        EventConstructor = SyntheticDragEvent;
-        break;
+      var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);
+      var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
 
-      case TOP_TOUCH_CANCEL:
-      case TOP_TOUCH_END:
-      case TOP_TOUCH_MOVE:
-      case TOP_TOUCH_START:
-        EventConstructor = SyntheticTouchEvent;
-        break;
+      if (normalizedServerValue === normalizedClientValue) {
+        return;
+      }
 
-      case TOP_ANIMATION_END:
-      case TOP_ANIMATION_ITERATION:
-      case TOP_ANIMATION_START:
-        EventConstructor = SyntheticAnimationEvent;
-        break;
+      didWarnInvalidHydration = true;
 
-      case TOP_TRANSITION_END:
-        EventConstructor = SyntheticTransitionEvent;
-        break;
+      error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));
+    };
 
-      case TOP_SCROLL:
-        EventConstructor = SyntheticUIEvent;
-        break;
+    warnForExtraAttributes = function (attributeNames) {
+      if (didWarnInvalidHydration) {
+        return;
+      }
 
-      case TOP_WHEEL:
-        EventConstructor = SyntheticWheelEvent;
-        break;
+      didWarnInvalidHydration = true;
+      var names = [];
+      attributeNames.forEach(function (name) {
+        names.push(name);
+      });
 
-      case TOP_COPY:
-      case TOP_CUT:
-      case TOP_PASTE:
-        EventConstructor = SyntheticClipboardEvent;
-        break;
+      error('Extra attributes from the server: %s', names);
+    };
 
-      case TOP_GOT_POINTER_CAPTURE:
-      case TOP_LOST_POINTER_CAPTURE:
-      case TOP_POINTER_CANCEL:
-      case TOP_POINTER_DOWN:
-      case TOP_POINTER_MOVE:
-      case TOP_POINTER_OUT:
-      case TOP_POINTER_OVER:
-      case TOP_POINTER_UP:
-        EventConstructor = SyntheticPointerEvent;
-        break;
+    warnForInvalidEventListener = function (registrationName, listener) {
+      if (listener === false) {
+        error('Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);
+      } else {
+        error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);
+      }
+    }; // Parse the HTML and read it back to normalize the HTML string so that it
+    // can be used for comparison.
 
-      default:
-        {
-          if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {
-            warningWithoutStack$1(false, 'SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);
-          }
-        } // HTML Events
-        // @see http://www.w3.org/TR/html5/index.html#events-0
 
+    normalizeHTML = function (parent, html) {
+      // We could have created a separate document here to avoid
+      // re-initializing custom elements if they exist. But this breaks
+      // how <noscript> is being handled. So we use the same document.
+      // See the discussion in https://github.com/facebook/react/pull/11157.
+      var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
+      testElement.innerHTML = html;
+      return testElement.innerHTML;
+    };
+  }
 
-        EventConstructor = SyntheticEvent;
-        break;
-    }
+  function ensureListeningTo(rootContainerElement, registrationName) {
+    var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;
+    var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;
+    legacyListenToEvent(registrationName, doc);
+  }
 
-    var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);
-    accumulateTwoPhaseDispatches(event);
-    return event;
+  function getOwnerDocumentFromRootContainer(rootContainerElement) {
+    return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
   }
-};
 
-var passiveBrowserEventsSupported = false; // Check if browser support events with passive listeners
-// https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support
+  function noop() {}
 
-if (enableFlareAPI && canUseDOM) {
-  try {
-    var options = {}; // $FlowFixMe: Ignore Flow complaining about needing a value
+  function trapClickOnNonInteractiveElement(node) {
+    // Mobile Safari does not fire properly bubble click events on
+    // non-interactive elements, which means delegated click listeners do not
+    // fire. The workaround for this bug involves attaching an empty click
+    // listener on the target node.
+    // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
+    // Just set it using the onclick property so that we don't have to manage any
+    // bookkeeping for it. Not sure if we need to clear it when the listener is
+    // removed.
+    // TODO: Only do this for the relevant Safaris maybe?
+    node.onclick = noop;
+  }
 
-    Object.defineProperty(options, 'passive', {
-      get: function () {
-        passiveBrowserEventsSupported = true;
+  function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
+    for (var propKey in nextProps) {
+      if (!nextProps.hasOwnProperty(propKey)) {
+        continue;
       }
-    });
-    window.addEventListener('test', options, options);
-    window.removeEventListener('test', options, options);
-  } catch (e) {
-    passiveBrowserEventsSupported = false;
-  }
-}
-
-// Intentionally not named imports because Rollup would use dynamic dispatch for
-// CommonJS interop named imports.
-var UserBlockingPriority$1 = unstable_UserBlockingPriority;
-var runWithPriority$1 = unstable_runWithPriority;
-var getEventPriority = SimpleEventPlugin.getEventPriority;
-var CALLBACK_BOOKKEEPING_POOL_SIZE = 10;
-var callbackBookkeepingPool = [];
-
-/**
- * Find the deepest React component completely containing the root of the
- * passed-in instance (for use when entire React trees are nested within each
- * other). If React trees are not nested, returns null.
- */
-function findRootContainerNode(inst) {
-  if (inst.tag === HostRoot) {
-    return inst.stateNode.containerInfo;
-  } // TODO: It may be a good idea to cache this to prevent unnecessary DOM
-  // traversal, but caching is difficult to do correctly without using a
-  // mutation observer to listen for all DOM changes.
 
+      var nextProp = nextProps[propKey];
 
-  while (inst.return) {
-    inst = inst.return;
-  }
+      if (propKey === STYLE) {
+        {
+          if (nextProp) {
+            // Freeze the next style object so that we can assume it won't be
+            // mutated. We have already warned for this in the past.
+            Object.freeze(nextProp);
+          }
+        } // Relies on `updateStylesByID` not mutating `styleUpdates`.
 
-  if (inst.tag !== HostRoot) {
-    // This can happen if we're in a detached tree.
-    return null;
-  }
 
-  return inst.stateNode.containerInfo;
-} // Used to store ancestor hierarchy in top level callback
+        setValueForStyles(domElement, nextProp);
+      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
 
+        if (nextHtml != null) {
+          setInnerHTML(domElement, nextHtml);
+        }
+      } else if (propKey === CHILDREN) {
+        if (typeof nextProp === 'string') {
+          // Avoid setting initial textContent when the text is empty. In IE11 setting
+          // textContent on a <textarea> will cause the placeholder to not
+          // show within the <textarea> until it has been focused and blurred again.
+          // https://github.com/facebook/react/issues/6731#issuecomment-254874553
+          var canSetTextContent = tag !== 'textarea' || nextProp !== '';
 
-function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) {
-  if (callbackBookkeepingPool.length) {
-    var instance = callbackBookkeepingPool.pop();
-    instance.topLevelType = topLevelType;
-    instance.eventSystemFlags = eventSystemFlags;
-    instance.nativeEvent = nativeEvent;
-    instance.targetInst = targetInst;
-    return instance;
-  }
+          if (canSetTextContent) {
+            setTextContent(domElement, nextProp);
+          }
+        } else if (typeof nextProp === 'number') {
+          setTextContent(domElement, '' + nextProp);
+        }
+      } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {
+        if (nextProp != null) {
+          if ( typeof nextProp !== 'function') {
+            warnForInvalidEventListener(propKey, nextProp);
+          }
 
-  return {
-    topLevelType: topLevelType,
-    eventSystemFlags: eventSystemFlags,
-    nativeEvent: nativeEvent,
-    targetInst: targetInst,
-    ancestors: []
-  };
-}
+          ensureListeningTo(rootContainerElement, propKey);
+        }
+      } else if (nextProp != null) {
+        setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);
+      }
+    }
+  }
 
-function releaseTopLevelCallbackBookKeeping(instance) {
-  instance.topLevelType = null;
-  instance.nativeEvent = null;
-  instance.targetInst = null;
-  instance.ancestors.length = 0;
+  function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
+    // TODO: Handle wasCustomComponentTag
+    for (var i = 0; i < updatePayload.length; i += 2) {
+      var propKey = updatePayload[i];
+      var propValue = updatePayload[i + 1];
 
-  if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {
-    callbackBookkeepingPool.push(instance);
+      if (propKey === STYLE) {
+        setValueForStyles(domElement, propValue);
+      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+        setInnerHTML(domElement, propValue);
+      } else if (propKey === CHILDREN) {
+        setTextContent(domElement, propValue);
+      } else {
+        setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);
+      }
+    }
   }
-}
 
-function handleTopLevel(bookKeeping) {
-  var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components.
-  // It's important that we build the array of ancestors before calling any
-  // event handlers, because event handlers can modify the DOM, leading to
-  // inconsistencies with ReactMount's node cache. See #1105.
+  function createElement(type, props, rootContainerElement, parentNamespace) {
+    var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML
+    // tags get no namespace.
 
-  var ancestor = targetInst;
+    var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);
+    var domElement;
+    var namespaceURI = parentNamespace;
 
-  do {
-    if (!ancestor) {
-      var ancestors = bookKeeping.ancestors;
-      ancestors.push(ancestor);
-      break;
+    if (namespaceURI === HTML_NAMESPACE$1) {
+      namespaceURI = getIntrinsicNamespace(type);
     }
 
-    var root = findRootContainerNode(ancestor);
-
-    if (!root) {
-      break;
-    }
+    if (namespaceURI === HTML_NAMESPACE$1) {
+      {
+        isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to
+        // allow <SVG> or <mATH>.
 
-    var tag = ancestor.tag;
+        if (!isCustomComponentTag && type !== type.toLowerCase()) {
+          error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);
+        }
+      }
 
-    if (tag === HostComponent || tag === HostText) {
-      bookKeeping.ancestors.push(ancestor);
-    }
+      if (type === 'script') {
+        // Create the script via .innerHTML so its "parser-inserted" flag is
+        // set to true and it does not execute
+        var div = ownerDocument.createElement('div');
 
-    ancestor = getClosestInstanceFromNode(root);
-  } while (ancestor);
+        div.innerHTML = '<script><' + '/script>'; // eslint-disable-line
+        // This is guaranteed to yield a script element.
 
-  for (var i = 0; i < bookKeeping.ancestors.length; i++) {
-    targetInst = bookKeeping.ancestors[i];
-    var eventTarget = getEventTarget(bookKeeping.nativeEvent);
-    var topLevelType = bookKeeping.topLevelType;
-    var nativeEvent = bookKeeping.nativeEvent;
-    runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, bookKeeping.eventSystemFlags);
-  }
-} // TODO: can we stop exporting these?
-
-
-var _enabled = true;
-function setEnabled(enabled) {
-  _enabled = !!enabled;
-}
-function isEnabled() {
-  return _enabled;
-}
-function trapBubbledEvent(topLevelType, element) {
-  trapEventForPluginEventSystem(element, topLevelType, false);
-}
-function trapCapturedEvent(topLevelType, element) {
-  trapEventForPluginEventSystem(element, topLevelType, true);
-}
-function trapEventForResponderEventSystem(element, topLevelType, passive) {
-  if (enableFlareAPI) {
-    var rawEventName = getRawEventName(topLevelType);
-    var eventFlags = RESPONDER_EVENT_SYSTEM; // If passive option is not supported, then the event will be
-    // active and not passive, but we flag it as using not being
-    // supported too. This way the responder event plugins know,
-    // and can provide polyfills if needed.
-
-    if (passive) {
-      if (passiveBrowserEventsSupported) {
-        eventFlags |= IS_PASSIVE;
+        var firstChild = div.firstChild;
+        domElement = div.removeChild(firstChild);
+      } else if (typeof props.is === 'string') {
+        // $FlowIssue `createElement` should be updated for Web Components
+        domElement = ownerDocument.createElement(type, {
+          is: props.is
+        });
       } else {
-        eventFlags |= IS_ACTIVE;
-        eventFlags |= PASSIVE_NOT_SUPPORTED;
-        passive = false;
+        // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.
+        // See discussion in https://github.com/facebook/react/pull/6896
+        // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
+        domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`
+        // attributes on `select`s needs to be added before `option`s are inserted.
+        // This prevents:
+        // - a bug where the `select` does not scroll to the correct option because singular
+        //  `select` elements automatically pick the first item #13222
+        // - a bug where the `select` set the first item as selected despite the `size` attribute #14239
+        // See https://github.com/facebook/react/issues/13222
+        // and https://github.com/facebook/react/issues/14239
+
+        if (type === 'select') {
+          var node = domElement;
+
+          if (props.multiple) {
+            node.multiple = true;
+          } else if (props.size) {
+            // Setting a size greater than 1 causes a select to behave like `multiple=true`, where
+            // it is possible that no option is selected.
+            //
+            // This is only necessary when a select in "single selection mode".
+            node.size = props.size;
+          }
+        }
       }
     } else {
-      eventFlags |= IS_ACTIVE;
-    } // Check if interactive and wrap in discreteUpdates
-
-
-    var listener = dispatchEvent.bind(null, topLevelType, eventFlags);
-
-    if (passiveBrowserEventsSupported) {
-      addEventCaptureListenerWithPassiveFlag(element, rawEventName, listener, passive);
-    } else {
-      addEventCaptureListener(element, rawEventName, listener);
+      domElement = ownerDocument.createElementNS(namespaceURI, type);
     }
-  }
-}
-
-function trapEventForPluginEventSystem(element, topLevelType, capture) {
-  var listener;
 
-  switch (getEventPriority(topLevelType)) {
-    case DiscreteEvent:
-      listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM);
-      break;
+    {
+      if (namespaceURI === HTML_NAMESPACE$1) {
+        if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {
+          warnedUnknownTags[type] = true;
 
-    case UserBlockingEvent:
-      listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM);
-      break;
+          error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);
+        }
+      }
+    }
 
-    case ContinuousEvent:
-    default:
-      listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM);
-      break;
+    return domElement;
   }
+  function createTextNode(text, rootContainerElement) {
+    return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
+  }
+  function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
+    var isCustomComponentTag = isCustomComponent(tag, rawProps);
 
-  var rawEventName = getRawEventName(topLevelType);
+    {
+      validatePropertiesInDevelopment(tag, rawProps);
+    } // TODO: Make sure that we check isMounted before firing any of these events.
 
-  if (capture) {
-    addEventCaptureListener(element, rawEventName, listener);
-  } else {
-    addEventBubbleListener(element, rawEventName, listener);
-  }
-}
 
-function dispatchDiscreteEvent(topLevelType, eventSystemFlags, nativeEvent) {
-  flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp);
-  discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, nativeEvent);
-}
+    var props;
 
-function dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, nativeEvent) {
-  runWithPriority$1(UserBlockingPriority$1, dispatchEvent.bind(null, topLevelType, eventSystemFlags, nativeEvent));
-}
+    switch (tag) {
+      case 'iframe':
+      case 'object':
+      case 'embed':
+        trapBubbledEvent(TOP_LOAD, domElement);
+        props = rawProps;
+        break;
 
-function dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) {
-  var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags);
+      case 'video':
+      case 'audio':
+        // Create listener for each media event
+        for (var i = 0; i < mediaEventTypes.length; i++) {
+          trapBubbledEvent(mediaEventTypes[i], domElement);
+        }
 
-  try {
-    // Event queue being processed in the same cycle allows
-    // `preventDefault`.
-    batchedEventUpdates(handleTopLevel, bookKeeping);
-  } finally {
-    releaseTopLevelCallbackBookKeeping(bookKeeping);
-  }
-}
+        props = rawProps;
+        break;
 
-function dispatchEvent(topLevelType, eventSystemFlags, nativeEvent) {
-  if (!_enabled) {
-    return;
-  }
+      case 'source':
+        trapBubbledEvent(TOP_ERROR, domElement);
+        props = rawProps;
+        break;
 
-  if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) {
-    // If we already have a queue of discrete events, and this is another discrete
-    // event, then we can't dispatch it regardless of its target, since they
-    // need to dispatch in order.
-    queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know.
-    topLevelType, eventSystemFlags, nativeEvent);
-    return;
-  }
+      case 'img':
+      case 'image':
+      case 'link':
+        trapBubbledEvent(TOP_ERROR, domElement);
+        trapBubbledEvent(TOP_LOAD, domElement);
+        props = rawProps;
+        break;
 
-  var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, nativeEvent);
+      case 'form':
+        trapBubbledEvent(TOP_RESET, domElement);
+        trapBubbledEvent(TOP_SUBMIT, domElement);
+        props = rawProps;
+        break;
 
-  if (blockedOn === null) {
-    // We successfully dispatched this event.
-    clearIfContinuousEvent(topLevelType, nativeEvent);
-    return;
-  }
+      case 'details':
+        trapBubbledEvent(TOP_TOGGLE, domElement);
+        props = rawProps;
+        break;
 
-  if (isReplayableDiscreteEvent(topLevelType)) {
-    // This this to be replayed later once the target is available.
-    queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent);
-    return;
-  }
+      case 'input':
+        initWrapperState(domElement, rawProps);
+        props = getHostProps(domElement, rawProps);
+        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
+        // to onChange. Even if there is no listener.
 
-  if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, nativeEvent)) {
-    return;
-  } // We need to clear only if we didn't queue because
-  // queueing is accummulative.
+        ensureListeningTo(rootContainerElement, 'onChange');
+        break;
 
+      case 'option':
+        validateProps(domElement, rawProps);
+        props = getHostProps$1(domElement, rawProps);
+        break;
 
-  clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target,
-  // in case the event system needs to trace it.
+      case 'select':
+        initWrapperState$1(domElement, rawProps);
+        props = getHostProps$2(domElement, rawProps);
+        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
+        // to onChange. Even if there is no listener.
 
-  if (enableFlareAPI) {
-    if (eventSystemFlags & PLUGIN_EVENT_SYSTEM) {
-      dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null);
-    }
+        ensureListeningTo(rootContainerElement, 'onChange');
+        break;
 
-    if (eventSystemFlags & RESPONDER_EVENT_SYSTEM) {
-      // React Flare event system
-      dispatchEventForResponderEventSystem(topLevelType, null, nativeEvent, getEventTarget(nativeEvent), eventSystemFlags);
-    }
-  } else {
-    dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null);
-  }
-} // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked.
+      case 'textarea':
+        initWrapperState$2(domElement, rawProps);
+        props = getHostProps$3(domElement, rawProps);
+        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
+        // to onChange. Even if there is no listener.
 
-function attemptToDispatchEvent(topLevelType, eventSystemFlags, nativeEvent) {
-  // TODO: Warn if _enabled is false.
-  var nativeEventTarget = getEventTarget(nativeEvent);
-  var targetInst = getClosestInstanceFromNode(nativeEventTarget);
+        ensureListeningTo(rootContainerElement, 'onChange');
+        break;
 
-  if (targetInst !== null) {
-    var nearestMounted = getNearestMountedFiber(targetInst);
+      default:
+        props = rawProps;
+    }
 
-    if (nearestMounted === null) {
-      // This tree has been unmounted already. Dispatch without a target.
-      targetInst = null;
-    } else {
-      var tag = nearestMounted.tag;
+    assertValidProps(tag, props);
+    setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
 
-      if (tag === SuspenseComponent) {
-        var instance = getSuspenseInstanceFromFiber(nearestMounted);
+    switch (tag) {
+      case 'input':
+        // TODO: Make sure we check if this is still unmounted or do any clean
+        // up necessary since we never stop tracking anymore.
+        track(domElement);
+        postMountWrapper(domElement, rawProps, false);
+        break;
 
-        if (instance !== null) {
-          // Queue the event to be replayed later. Abort dispatching since we
-          // don't want this event dispatched twice through the event system.
-          // TODO: If this is the first discrete event in the queue. Schedule an increased
-          // priority for this boundary.
-          return instance;
-        } // This shouldn't happen, something went wrong but to avoid blocking
-        // the whole system, dispatch the event without a target.
-        // TODO: Warn.
+      case 'textarea':
+        // TODO: Make sure we check if this is still unmounted or do any clean
+        // up necessary since we never stop tracking anymore.
+        track(domElement);
+        postMountWrapper$3(domElement);
+        break;
 
+      case 'option':
+        postMountWrapper$1(domElement, rawProps);
+        break;
 
-        targetInst = null;
-      } else if (tag === HostRoot) {
-        var root = nearestMounted.stateNode;
+      case 'select':
+        postMountWrapper$2(domElement, rawProps);
+        break;
 
-        if (root.hydrate) {
-          // If this happens during a replay something went wrong and it might block
-          // the whole system.
-          return getContainerFromFiber(nearestMounted);
+      default:
+        if (typeof props.onClick === 'function') {
+          // TODO: This cast may not be sound for SVG, MathML or custom elements.
+          trapClickOnNonInteractiveElement(domElement);
         }
 
-        targetInst = null;
-      } else if (nearestMounted !== targetInst) {
-        // If we get an event (ex: img onload) before committing that
-        // component's mount, ignore it for now (that is, treat it as if it was an
-        // event on a non-React tree). We might also consider queueing events and
-        // dispatching them after the mount.
-        targetInst = null;
-      }
-    }
-  }
-
-  if (enableFlareAPI) {
-    if (eventSystemFlags & PLUGIN_EVENT_SYSTEM) {
-      dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst);
+        break;
     }
+  } // Calculate the diff between the two objects.
 
-    if (eventSystemFlags & RESPONDER_EVENT_SYSTEM) {
-      // React Flare event system
-      dispatchEventForResponderEventSystem(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
+  function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
+    {
+      validatePropertiesInDevelopment(tag, nextRawProps);
     }
-  } else {
-    dispatchEventForPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst);
-  } // We're not blocked on anything.
-
-
-  return null;
-}
-
-/**
- * Checks if an event is supported in the current execution environment.
- *
- * NOTE: This will not work correctly for non-generic events such as `change`,
- * `reset`, `load`, `error`, and `select`.
- *
- * Borrows from Modernizr.
- *
- * @param {string} eventNameSuffix Event name, e.g. "click".
- * @return {boolean} True if the event is supported.
- * @internal
- * @license Modernizr 3.0.0pre (Custom Build) | MIT
- */
-
-function isEventSupported(eventNameSuffix) {
-  if (!canUseDOM) {
-    return false;
-  }
-
-  var eventName = 'on' + eventNameSuffix;
-  var isSupported = eventName in document;
-
-  if (!isSupported) {
-    var element = document.createElement('div');
-    element.setAttribute(eventName, 'return;');
-    isSupported = typeof element[eventName] === 'function';
-  }
-
-  return isSupported;
-}
-
-/**
- * Summary of `ReactBrowserEventEmitter` event handling:
- *
- *  - Top-level delegation is used to trap most native browser events. This
- *    may only occur in the main thread and is the responsibility of
- *    ReactDOMEventListener, which is injected and can therefore support
- *    pluggable event sources. This is the only work that occurs in the main
- *    thread.
- *
- *  - We normalize and de-duplicate events to account for browser quirks. This
- *    may be done in the worker thread.
- *
- *  - Forward these native events (with the associated top-level type used to
- *    trap it) to `EventPluginHub`, which in turn will ask plugins if they want
- *    to extract any synthetic events.
- *
- *  - The `EventPluginHub` will then process each event by annotating them with
- *    "dispatches", a sequence of listeners and IDs that care about that event.
- *
- *  - The `EventPluginHub` then dispatches the events.
- *
- * Overview of React and the event system:
- *
- * +------------+    .
- * |    DOM     |    .
- * +------------+    .
- *       |           .
- *       v           .
- * +------------+    .
- * | ReactEvent |    .
- * |  Listener  |    .
- * +------------+    .                         +-----------+
- *       |           .               +--------+|SimpleEvent|
- *       |           .               |         |Plugin     |
- * +-----|------+    .               v         +-----------+
- * |     |      |    .    +--------------+                    +------------+
- * |     +-----------.--->|EventPluginHub|                    |    Event   |
- * |            |    .    |              |     +-----------+  | Propagators|
- * | ReactEvent |    .    |              |     |TapEvent   |  |------------|
- * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|
- * |            |    .    |              |     +-----------+  |  utilities |
- * |     +-----------.--->|              |                    +------------+
- * |     |      |    .    +--------------+
- * +-----|------+    .                ^        +-----------+
- *       |           .                |        |Enter/Leave|
- *       +           .                +-------+|Plugin     |
- * +-------------+   .                         +-----------+
- * | application |   .
- * |-------------|   .
- * |             |   .
- * |             |   .
- * +-------------+   .
- *                   .
- *    React Core     .  General Purpose Event Plugin System
- */
-
-var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
-var elementListeningSets = new PossiblyWeakMap();
-function getListeningSetForElement(element) {
-  var listeningSet = elementListeningSets.get(element);
-
-  if (listeningSet === undefined) {
-    listeningSet = new Set();
-    elementListeningSets.set(element, listeningSet);
-  }
-
-  return listeningSet;
-}
-/**
- * We listen for bubbled touch events on the document object.
- *
- * Firefox v8.01 (and possibly others) exhibited strange behavior when
- * mounting `onmousemove` events at some node that was not the document
- * element. The symptoms were that if your mouse is not moving over something
- * contained within that mount point (for example on the background) the
- * top-level listeners for `onmousemove` won't be called. However, if you
- * register the `mousemove` on the document object, then it will of course
- * catch all `mousemove`s. This along with iOS quirks, justifies restricting
- * top-level listeners to the document object only, at least for these
- * movement types of events and possibly all events.
- *
- * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
- *
- * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
- * they bubble to document.
- *
- * @param {string} registrationName Name of listener (e.g. `onClick`).
- * @param {object} mountAt Container where to mount the listener
- */
 
-function listenTo(registrationName, mountAt) {
-  var listeningSet = getListeningSetForElement(mountAt);
-  var dependencies = registrationNameDependencies[registrationName];
+    var updatePayload = null;
+    var lastProps;
+    var nextProps;
 
-  for (var i = 0; i < dependencies.length; i++) {
-    var dependency = dependencies[i];
-    listenToTopLevel(dependency, mountAt, listeningSet);
-  }
-}
-function listenToTopLevel(topLevelType, mountAt, listeningSet) {
-  if (!listeningSet.has(topLevelType)) {
-    switch (topLevelType) {
-      case TOP_SCROLL:
-        trapCapturedEvent(TOP_SCROLL, mountAt);
+    switch (tag) {
+      case 'input':
+        lastProps = getHostProps(domElement, lastRawProps);
+        nextProps = getHostProps(domElement, nextRawProps);
+        updatePayload = [];
         break;
 
-      case TOP_FOCUS:
-      case TOP_BLUR:
-        trapCapturedEvent(TOP_FOCUS, mountAt);
-        trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function,
-        // but this ensures we mark both as attached rather than just one.
-
-        listeningSet.add(TOP_BLUR);
-        listeningSet.add(TOP_FOCUS);
+      case 'option':
+        lastProps = getHostProps$1(domElement, lastRawProps);
+        nextProps = getHostProps$1(domElement, nextRawProps);
+        updatePayload = [];
         break;
 
-      case TOP_CANCEL:
-      case TOP_CLOSE:
-        if (isEventSupported(getRawEventName(topLevelType))) {
-          trapCapturedEvent(topLevelType, mountAt);
-        }
-
+      case 'select':
+        lastProps = getHostProps$2(domElement, lastRawProps);
+        nextProps = getHostProps$2(domElement, nextRawProps);
+        updatePayload = [];
         break;
 
-      case TOP_INVALID:
-      case TOP_SUBMIT:
-      case TOP_RESET:
-        // We listen to them on the target DOM elements.
-        // Some of them bubble so we don't want them to fire twice.
+      case 'textarea':
+        lastProps = getHostProps$3(domElement, lastRawProps);
+        nextProps = getHostProps$3(domElement, nextRawProps);
+        updatePayload = [];
         break;
 
       default:
-        // By default, listen on the top level to all non-media events.
-        // Media events don't bubble so adding the listener wouldn't do anything.
-        var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1;
+        lastProps = lastRawProps;
+        nextProps = nextRawProps;
 
-        if (!isMediaEvent) {
-          trapBubbledEvent(topLevelType, mountAt);
+        if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
+          // TODO: This cast may not be sound for SVG, MathML or custom elements.
+          trapClickOnNonInteractiveElement(domElement);
         }
 
         break;
     }
 
-    listeningSet.add(topLevelType);
-  }
-}
-function isListeningToAllDependencies(registrationName, mountAt) {
-  var listeningSet = getListeningSetForElement(mountAt);
-  var dependencies = registrationNameDependencies[registrationName];
-
-  for (var i = 0; i < dependencies.length; i++) {
-    var dependency = dependencies[i];
-
-    if (!listeningSet.has(dependency)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-// List derived from Gecko source code:
-// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js
-var shorthandToLonghand = {
-  animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],
-  background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],
-  backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],
-  border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],
-  borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],
-  borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],
-  borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],
-  borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],
-  borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],
-  borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],
-  borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],
-  borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],
-  borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],
-  borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],
-  borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],
-  borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],
-  borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],
-  columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],
-  columns: ['columnCount', 'columnWidth'],
-  flex: ['flexBasis', 'flexGrow', 'flexShrink'],
-  flexFlow: ['flexDirection', 'flexWrap'],
-  font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],
-  fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],
-  gap: ['columnGap', 'rowGap'],
-  grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
-  gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],
-  gridColumn: ['gridColumnEnd', 'gridColumnStart'],
-  gridColumnGap: ['columnGap'],
-  gridGap: ['columnGap', 'rowGap'],
-  gridRow: ['gridRowEnd', 'gridRowStart'],
-  gridRowGap: ['rowGap'],
-  gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
-  listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],
-  margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],
-  marker: ['markerEnd', 'markerMid', 'markerStart'],
-  mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],
-  maskPosition: ['maskPositionX', 'maskPositionY'],
-  outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],
-  overflow: ['overflowX', 'overflowY'],
-  padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],
-  placeContent: ['alignContent', 'justifyContent'],
-  placeItems: ['alignItems', 'justifyItems'],
-  placeSelf: ['alignSelf', 'justifySelf'],
-  textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],
-  textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],
-  transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],
-  wordWrap: ['overflowWrap']
-};
-
-/**
- * CSS properties which accept numbers but are not in units of "px".
- */
-var isUnitlessNumber = {
-  animationIterationCount: true,
-  borderImageOutset: true,
-  borderImageSlice: true,
-  borderImageWidth: true,
-  boxFlex: true,
-  boxFlexGroup: true,
-  boxOrdinalGroup: true,
-  columnCount: true,
-  columns: true,
-  flex: true,
-  flexGrow: true,
-  flexPositive: true,
-  flexShrink: true,
-  flexNegative: true,
-  flexOrder: true,
-  gridArea: true,
-  gridRow: true,
-  gridRowEnd: true,
-  gridRowSpan: true,
-  gridRowStart: true,
-  gridColumn: true,
-  gridColumnEnd: true,
-  gridColumnSpan: true,
-  gridColumnStart: true,
-  fontWeight: true,
-  lineClamp: true,
-  lineHeight: true,
-  opacity: true,
-  order: true,
-  orphans: true,
-  tabSize: true,
-  widows: true,
-  zIndex: true,
-  zoom: true,
-  // SVG-related properties
-  fillOpacity: true,
-  floodOpacity: true,
-  stopOpacity: true,
-  strokeDasharray: true,
-  strokeDashoffset: true,
-  strokeMiterlimit: true,
-  strokeOpacity: true,
-  strokeWidth: true
-};
-/**
- * @param {string} prefix vendor-specific prefix, eg: Webkit
- * @param {string} key style name, eg: transitionDuration
- * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
- * WebkitTransitionDuration
- */
+    assertValidProps(tag, nextProps);
+    var propKey;
+    var styleName;
+    var styleUpdates = null;
 
-function prefixKey(prefix, key) {
-  return prefix + key.charAt(0).toUpperCase() + key.substring(1);
-}
-/**
- * Support style names that may come passed in prefixed by adding permutations
- * of vendor prefixes.
- */
+    for (propKey in lastProps) {
+      if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
+        continue;
+      }
 
+      if (propKey === STYLE) {
+        var lastStyle = lastProps[propKey];
 
-var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
-// infinite loop, because it iterates over the newly added props too.
+        for (styleName in lastStyle) {
+          if (lastStyle.hasOwnProperty(styleName)) {
+            if (!styleUpdates) {
+              styleUpdates = {};
+            }
 
-Object.keys(isUnitlessNumber).forEach(function (prop) {
-  prefixes.forEach(function (prefix) {
-    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
-  });
-});
+            styleUpdates[styleName] = '';
+          }
+        }
+      } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {
+        // This is a special case. If any listener updates we need to ensure
+        // that the "current" fiber pointer gets updated so we need a commit
+        // to update this element.
+        if (!updatePayload) {
+          updatePayload = [];
+        }
+      } else {
+        // For all other deleted properties we add it to the queue. We use
+        // the whitelist in the commit phase instead.
+        (updatePayload = updatePayload || []).push(propKey, null);
+      }
+    }
 
-/**
- * Convert a value into the proper css writable value. The style name `name`
- * should be logical (no hyphens), as specified
- * in `CSSProperty.isUnitlessNumber`.
- *
- * @param {string} name CSS property name such as `topMargin`.
- * @param {*} value CSS property value such as `10px`.
- * @return {string} Normalized style value with dimensions applied.
- */
+    for (propKey in nextProps) {
+      var nextProp = nextProps[propKey];
+      var lastProp = lastProps != null ? lastProps[propKey] : undefined;
 
-function dangerousStyleValue(name, value, isCustomProperty) {
-  // Note that we've removed escapeTextForBrowser() calls here since the
-  // whole string will be escaped when the attribute is injected into
-  // the markup. If you provide unsafe user data here they can inject
-  // arbitrary CSS which may be problematic (I couldn't repro this):
-  // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
-  // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
-  // This is not an XSS hole but instead a potential CSS injection issue
-  // which has lead to a greater discussion about how we're going to
-  // trust URLs moving forward. See #2115901
-  var isEmpty = value == null || typeof value === 'boolean' || value === '';
-
-  if (isEmpty) {
-    return '';
-  }
+      if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
+        continue;
+      }
 
-  if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
-    return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
-  }
+      if (propKey === STYLE) {
+        {
+          if (nextProp) {
+            // Freeze the next style object so that we can assume it won't be
+            // mutated. We have already warned for this in the past.
+            Object.freeze(nextProp);
+          }
+        }
 
-  return ('' + value).trim();
-}
+        if (lastProp) {
+          // Unset styles on `lastProp` but not on `nextProp`.
+          for (styleName in lastProp) {
+            if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
+              if (!styleUpdates) {
+                styleUpdates = {};
+              }
 
-var uppercasePattern = /([A-Z])/g;
-var msPattern = /^ms-/;
-/**
- * Hyphenates a camelcased CSS property name, for example:
- *
- *   > hyphenateStyleName('backgroundColor')
- *   < "background-color"
- *   > hyphenateStyleName('MozTransition')
- *   < "-moz-transition"
- *   > hyphenateStyleName('msTransition')
- *   < "-ms-transition"
- *
- * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
- * is converted to `-ms-`.
- */
+              styleUpdates[styleName] = '';
+            }
+          } // Update styles that changed since `lastProp`.
 
-function hyphenateStyleName(name) {
-  return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');
-}
 
-var warnValidStyle = function () {};
+          for (styleName in nextProp) {
+            if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
+              if (!styleUpdates) {
+                styleUpdates = {};
+              }
 
-{
-  // 'msTransform' is correct, but the other prefixes should be capitalized
-  var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
-  var msPattern$1 = /^-ms-/;
-  var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
+              styleUpdates[styleName] = nextProp[styleName];
+            }
+          }
+        } else {
+          // Relies on `updateStylesByID` not mutating `styleUpdates`.
+          if (!styleUpdates) {
+            if (!updatePayload) {
+              updatePayload = [];
+            }
 
-  var badStyleValueWithSemicolonPattern = /;\s*$/;
-  var warnedStyleNames = {};
-  var warnedStyleValues = {};
-  var warnedForNaNValue = false;
-  var warnedForInfinityValue = false;
+            updatePayload.push(propKey, styleUpdates);
+          }
 
-  var camelize = function (string) {
-    return string.replace(hyphenPattern, function (_, character) {
-      return character.toUpperCase();
-    });
-  };
+          styleUpdates = nextProp;
+        }
+      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
+        var lastHtml = lastProp ? lastProp[HTML$1] : undefined;
 
-  var warnHyphenatedStyleName = function (name) {
-    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
-      return;
-    }
+        if (nextHtml != null) {
+          if (lastHtml !== nextHtml) {
+            (updatePayload = updatePayload || []).push(propKey, nextHtml);
+          }
+        }
+      } else if (propKey === CHILDREN) {
+        if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {
+          (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
+        }
+      } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameModules.hasOwnProperty(propKey)) {
+        if (nextProp != null) {
+          // We eagerly listen to this even though we haven't committed yet.
+          if ( typeof nextProp !== 'function') {
+            warnForInvalidEventListener(propKey, nextProp);
+          }
 
-    warnedStyleNames[name] = true;
-    warning$1(false, 'Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
-    // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
-    // is converted to lowercase `ms`.
-    camelize(name.replace(msPattern$1, 'ms-')));
-  };
+          ensureListeningTo(rootContainerElement, propKey);
+        }
 
-  var warnBadVendoredStyleName = function (name) {
-    if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
-      return;
+        if (!updatePayload && lastProp !== nextProp) {
+          // This is a special case. If any listener updates we need to ensure
+          // that the "current" props pointer gets updated so we need a commit
+          // to update this element.
+          updatePayload = [];
+        }
+      } else {
+        // For any other property we always add it to the queue and then we
+        // filter it out using the whitelist during the commit.
+        (updatePayload = updatePayload || []).push(propKey, nextProp);
+      }
     }
 
-    warnedStyleNames[name] = true;
-    warning$1(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
-  };
+    if (styleUpdates) {
+      {
+        validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);
+      }
 
-  var warnStyleValueWithSemicolon = function (name, value) {
-    if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
-      return;
+      (updatePayload = updatePayload || []).push(STYLE, styleUpdates);
     }
 
-    warnedStyleValues[value] = true;
-    warning$1(false, "Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
-  };
+    return updatePayload;
+  } // Apply the diff.
 
-  var warnStyleValueIsNaN = function (name, value) {
-    if (warnedForNaNValue) {
-      return;
+  function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
+    // Update checked *before* name.
+    // In the middle of an update, it is possible to have multiple checked.
+    // When a checked radio tries to change name, browser makes another radio's checked false.
+    if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
+      updateChecked(domElement, nextRawProps);
     }
 
-    warnedForNaNValue = true;
-    warning$1(false, '`NaN` is an invalid value for the `%s` css style property.', name);
-  };
+    var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
+    var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.
 
-  var warnStyleValueIsInfinity = function (name, value) {
-    if (warnedForInfinityValue) {
-      return;
-    }
+    updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props
+    // changed.
 
-    warnedForInfinityValue = true;
-    warning$1(false, '`Infinity` is an invalid value for the `%s` css style property.', name);
-  };
+    switch (tag) {
+      case 'input':
+        // Update the wrapper around inputs *after* updating props. This has to
+        // happen after `updateDOMProperties`. Otherwise HTML5 input validations
+        // raise warnings and prevent the new value from being assigned.
+        updateWrapper(domElement, nextRawProps);
+        break;
 
-  warnValidStyle = function (name, value) {
-    if (name.indexOf('-') > -1) {
-      warnHyphenatedStyleName(name);
-    } else if (badVendoredStyleNamePattern.test(name)) {
-      warnBadVendoredStyleName(name);
-    } else if (badStyleValueWithSemicolonPattern.test(value)) {
-      warnStyleValueWithSemicolon(name, value);
-    }
+      case 'textarea':
+        updateWrapper$1(domElement, nextRawProps);
+        break;
 
-    if (typeof value === 'number') {
-      if (isNaN(value)) {
-        warnStyleValueIsNaN(name, value);
-      } else if (!isFinite(value)) {
-        warnStyleValueIsInfinity(name, value);
-      }
+      case 'select':
+        // <select> value update needs to occur after <option> children
+        // reconciliation
+        postUpdateWrapper(domElement, nextRawProps);
+        break;
     }
-  };
-}
+  }
 
-var warnValidStyle$1 = warnValidStyle;
+  function getPossibleStandardName(propName) {
+    {
+      var lowerCasedName = propName.toLowerCase();
 
-/**
- * Operations for dealing with CSS properties.
- */
+      if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
+        return null;
+      }
 
-/**
- * This creates a string that is expected to be equivalent to the style
- * attribute generated by server-side rendering. It by-passes warnings and
- * security checks so it's not safe to use this value for anything other than
- * comparison. It is only used in DEV for SSR validation.
- */
+      return possibleStandardNames[lowerCasedName] || null;
+    }
+  }
 
-function createDangerousStringForStyles(styles) {
-  {
-    var serialized = '';
-    var delimiter = '';
+  function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {
+    var isCustomComponentTag;
+    var extraAttributeNames;
 
-    for (var styleName in styles) {
-      if (!styles.hasOwnProperty(styleName)) {
-        continue;
-      }
+    {
+      suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true;
+      isCustomComponentTag = isCustomComponent(tag, rawProps);
+      validatePropertiesInDevelopment(tag, rawProps);
+    } // TODO: Make sure that we check isMounted before firing any of these events.
 
-      var styleValue = styles[styleName];
 
-      if (styleValue != null) {
-        var isCustomProperty = styleName.indexOf('--') === 0;
-        serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';
-        serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
-        delimiter = ';';
-      }
-    }
+    switch (tag) {
+      case 'iframe':
+      case 'object':
+      case 'embed':
+        trapBubbledEvent(TOP_LOAD, domElement);
+        break;
 
-    return serialized || null;
-  }
-}
-/**
- * Sets the value for multiple styles on a node.  If a value is specified as
- * '' (empty string), the corresponding style property will be unset.
- *
- * @param {DOMElement} node
- * @param {object} styles
- */
+      case 'video':
+      case 'audio':
+        // Create listener for each media event
+        for (var i = 0; i < mediaEventTypes.length; i++) {
+          trapBubbledEvent(mediaEventTypes[i], domElement);
+        }
 
-function setValueForStyles(node, styles) {
-  var style = node.style;
+        break;
 
-  for (var styleName in styles) {
-    if (!styles.hasOwnProperty(styleName)) {
-      continue;
-    }
+      case 'source':
+        trapBubbledEvent(TOP_ERROR, domElement);
+        break;
 
-    var isCustomProperty = styleName.indexOf('--') === 0;
+      case 'img':
+      case 'image':
+      case 'link':
+        trapBubbledEvent(TOP_ERROR, domElement);
+        trapBubbledEvent(TOP_LOAD, domElement);
+        break;
 
-    {
-      if (!isCustomProperty) {
-        warnValidStyle$1(styleName, styles[styleName]);
-      }
-    }
+      case 'form':
+        trapBubbledEvent(TOP_RESET, domElement);
+        trapBubbledEvent(TOP_SUBMIT, domElement);
+        break;
 
-    var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
+      case 'details':
+        trapBubbledEvent(TOP_TOGGLE, domElement);
+        break;
 
-    if (styleName === 'float') {
-      styleName = 'cssFloat';
-    }
+      case 'input':
+        initWrapperState(domElement, rawProps);
+        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
+        // to onChange. Even if there is no listener.
 
-    if (isCustomProperty) {
-      style.setProperty(styleName, styleValue);
-    } else {
-      style[styleName] = styleValue;
-    }
-  }
-}
+        ensureListeningTo(rootContainerElement, 'onChange');
+        break;
 
-function isValueEmpty(value) {
-  return value == null || typeof value === 'boolean' || value === '';
-}
-/**
- * Given {color: 'red', overflow: 'hidden'} returns {
- *   color: 'color',
- *   overflowX: 'overflow',
- *   overflowY: 'overflow',
- * }. This can be read as "the overflowY property was set by the overflow
- * shorthand". That is, the values are the property that each was derived from.
- */
+      case 'option':
+        validateProps(domElement, rawProps);
+        break;
 
+      case 'select':
+        initWrapperState$1(domElement, rawProps);
+        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
+        // to onChange. Even if there is no listener.
 
-function expandShorthandMap(styles) {
-  var expanded = {};
+        ensureListeningTo(rootContainerElement, 'onChange');
+        break;
 
-  for (var key in styles) {
-    var longhands = shorthandToLonghand[key] || [key];
+      case 'textarea':
+        initWrapperState$2(domElement, rawProps);
+        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
+        // to onChange. Even if there is no listener.
 
-    for (var i = 0; i < longhands.length; i++) {
-      expanded[longhands[i]] = key;
+        ensureListeningTo(rootContainerElement, 'onChange');
+        break;
     }
-  }
 
-  return expanded;
-}
-/**
- * When mixing shorthand and longhand property names, we warn during updates if
- * we expect an incorrect result to occur. In particular, we warn for:
- *
- * Updating a shorthand property (longhand gets overwritten):
- *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}
- *   becomes .style.font = 'baz'
- * Removing a shorthand property (longhand gets lost too):
- *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}
- *   becomes .style.font = ''
- * Removing a longhand property (should revert to shorthand; doesn't):
- *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}
- *   becomes .style.fontVariant = ''
- */
+    assertValidProps(tag, rawProps);
 
+    {
+      extraAttributeNames = new Set();
+      var attributes = domElement.attributes;
 
-function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {
-  if (!warnAboutShorthandPropertyCollision) {
-    return;
-  }
+      for (var _i = 0; _i < attributes.length; _i++) {
+        var name = attributes[_i].name.toLowerCase();
 
-  if (!nextStyles) {
-    return;
-  }
+        switch (name) {
+          // Built-in SSR attribute is whitelisted
+          case 'data-reactroot':
+            break;
+          // Controlled attributes are not validated
+          // TODO: Only ignore them on controlled tags.
 
-  var expandedUpdates = expandShorthandMap(styleUpdates);
-  var expandedStyles = expandShorthandMap(nextStyles);
-  var warnedAbout = {};
+          case 'value':
+            break;
 
-  for (var key in expandedUpdates) {
-    var originalKey = expandedUpdates[key];
-    var correctOriginalKey = expandedStyles[key];
+          case 'checked':
+            break;
 
-    if (correctOriginalKey && originalKey !== correctOriginalKey) {
-      var warningKey = originalKey + ',' + correctOriginalKey;
+          case 'selected':
+            break;
 
-      if (warnedAbout[warningKey]) {
-        continue;
+          default:
+            // Intentionally use the original name.
+            // See discussion in https://github.com/facebook/react/pull/10676.
+            extraAttributeNames.add(attributes[_i].name);
+        }
       }
-
-      warnedAbout[warningKey] = true;
-      warning$1(false, '%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);
     }
-  }
-}
 
-// For HTML, certain tags should omit their close tag. We keep a whitelist for
-// those special-case tags.
-var omittedCloseTags = {
-  area: true,
-  base: true,
-  br: true,
-  col: true,
-  embed: true,
-  hr: true,
-  img: true,
-  input: true,
-  keygen: true,
-  link: true,
-  meta: true,
-  param: true,
-  source: true,
-  track: true,
-  wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.
+    var updatePayload = null;
 
-};
+    for (var propKey in rawProps) {
+      if (!rawProps.hasOwnProperty(propKey)) {
+        continue;
+      }
 
-// `omittedCloseTags` except that `menuitem` should still have its closing tag.
+      var nextProp = rawProps[propKey];
+
+      if (propKey === CHILDREN) {
+        // For text content children we compare against textContent. This
+        // might match additional HTML that is hidden when we read it using
+        // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
+        // satisfies our requirement. Our requirement is not to produce perfect
+        // HTML and attributes. Ideally we should preserve structure but it's
+        // ok not to if the visible content is still enough to indicate what
+        // even listeners these nodes might be wired up to.
+        // TODO: Warn if there is more than a single textNode as a child.
+        // TODO: Should we use domElement.firstChild.nodeValue to compare?
+        if (typeof nextProp === 'string') {
+          if (domElement.textContent !== nextProp) {
+            if ( !suppressHydrationWarning) {
+              warnForTextDifference(domElement.textContent, nextProp);
+            }
 
-var voidElementTags = _assign({
-  menuitem: true
-}, omittedCloseTags);
+            updatePayload = [CHILDREN, nextProp];
+          }
+        } else if (typeof nextProp === 'number') {
+          if (domElement.textContent !== '' + nextProp) {
+            if ( !suppressHydrationWarning) {
+              warnForTextDifference(domElement.textContent, nextProp);
+            }
 
-// or add stack by default to invariants where possible.
+            updatePayload = [CHILDREN, '' + nextProp];
+          }
+        }
+      } else if (registrationNameModules.hasOwnProperty(propKey)) {
+        if (nextProp != null) {
+          if ( typeof nextProp !== 'function') {
+            warnForInvalidEventListener(propKey, nextProp);
+          }
 
-var HTML$1 = '__html';
-var ReactDebugCurrentFrame$3 = null;
+          ensureListeningTo(rootContainerElement, propKey);
+        }
+      } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.)
+      typeof isCustomComponentTag === 'boolean') {
+        // Validate that the properties correspond to their expected values.
+        var serverValue = void 0;
+        var propertyInfo = getPropertyInfo(propKey);
 
-{
-  ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame;
-}
+        if (suppressHydrationWarning) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated
+        // TODO: Only ignore them on controlled tags.
+        propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+          var serverHTML = domElement.innerHTML;
+          var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
+          var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');
 
-function assertValidProps(tag, props) {
-  if (!props) {
-    return;
-  } // Note the use of `==` which checks for null or undefined.
+          if (expectedHTML !== serverHTML) {
+            warnForPropDifference(propKey, serverHTML, expectedHTML);
+          }
+        } else if (propKey === STYLE) {
+          // $FlowFixMe - Should be inferred as not undefined.
+          extraAttributeNames.delete(propKey);
 
+          if (canDiffStyleForHydrationWarning) {
+            var expectedStyle = createDangerousStringForStyles(nextProp);
+            serverValue = domElement.getAttribute('style');
 
-  if (voidElementTags[tag]) {
-    if (!(props.children == null && props.dangerouslySetInnerHTML == null)) {
-      {
-        throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." + (ReactDebugCurrentFrame$3.getStackAddendum()));
-      }
-    }
-  }
+            if (expectedStyle !== serverValue) {
+              warnForPropDifference(propKey, serverValue, expectedStyle);
+            }
+          }
+        } else if (isCustomComponentTag) {
+          // $FlowFixMe - Should be inferred as not undefined.
+          extraAttributeNames.delete(propKey.toLowerCase());
+          serverValue = getValueForAttribute(domElement, propKey, nextProp);
 
-  if (props.dangerouslySetInnerHTML != null) {
-    if (!(props.children == null)) {
-      {
-        throw Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`.");
-      }
-    }
+          if (nextProp !== serverValue) {
+            warnForPropDifference(propKey, serverValue, nextProp);
+          }
+        } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
+          var isMismatchDueToBadCasing = false;
 
-    if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML$1 in props.dangerouslySetInnerHTML)) {
-      {
-        throw Error("`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.");
-      }
-    }
-  }
+          if (propertyInfo !== null) {
+            // $FlowFixMe - Should be inferred as not undefined.
+            extraAttributeNames.delete(propertyInfo.attributeName);
+            serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
+          } else {
+            var ownNamespace = parentNamespace;
 
-  {
-    !(props.suppressContentEditableWarning || !props.contentEditable || props.children == null) ? warning$1(false, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : void 0;
-  }
+            if (ownNamespace === HTML_NAMESPACE$1) {
+              ownNamespace = getIntrinsicNamespace(tag);
+            }
 
-  if (!(props.style == null || typeof props.style === 'object')) {
-    {
-      throw Error("The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." + (ReactDebugCurrentFrame$3.getStackAddendum()));
-    }
-  }
-}
+            if (ownNamespace === HTML_NAMESPACE$1) {
+              // $FlowFixMe - Should be inferred as not undefined.
+              extraAttributeNames.delete(propKey.toLowerCase());
+            } else {
+              var standardName = getPossibleStandardName(propKey);
 
-function isCustomComponent(tagName, props) {
-  if (tagName.indexOf('-') === -1) {
-    return typeof props.is === 'string';
-  }
+              if (standardName !== null && standardName !== propKey) {
+                // If an SVG prop is supplied with bad casing, it will
+                // be successfully parsed from HTML, but will produce a mismatch
+                // (and would be incorrectly rendered on the client).
+                // However, we already warn about bad casing elsewhere.
+                // So we'll skip the misleading extra mismatch warning in this case.
+                isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.
 
-  switch (tagName) {
-    // These are reserved SVG and MathML elements.
-    // We don't mind this whitelist too much because we expect it to never grow.
-    // The alternative is to track the namespace in a few places which is convoluted.
-    // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
-    case 'annotation-xml':
-    case 'color-profile':
-    case 'font-face':
-    case 'font-face-src':
-    case 'font-face-uri':
-    case 'font-face-format':
-    case 'font-face-name':
-    case 'missing-glyph':
-      return false;
+                extraAttributeNames.delete(standardName);
+              } // $FlowFixMe - Should be inferred as not undefined.
 
-    default:
-      return true;
-  }
-}
-
-// When adding attributes to the HTML or SVG whitelist, be sure to
-// also add them to this module to ensure casing and incorrect name
-// warnings.
-var possibleStandardNames = {
-  // HTML
-  accept: 'accept',
-  acceptcharset: 'acceptCharset',
-  'accept-charset': 'acceptCharset',
-  accesskey: 'accessKey',
-  action: 'action',
-  allowfullscreen: 'allowFullScreen',
-  alt: 'alt',
-  as: 'as',
-  async: 'async',
-  autocapitalize: 'autoCapitalize',
-  autocomplete: 'autoComplete',
-  autocorrect: 'autoCorrect',
-  autofocus: 'autoFocus',
-  autoplay: 'autoPlay',
-  autosave: 'autoSave',
-  capture: 'capture',
-  cellpadding: 'cellPadding',
-  cellspacing: 'cellSpacing',
-  challenge: 'challenge',
-  charset: 'charSet',
-  checked: 'checked',
-  children: 'children',
-  cite: 'cite',
-  class: 'className',
-  classid: 'classID',
-  classname: 'className',
-  cols: 'cols',
-  colspan: 'colSpan',
-  content: 'content',
-  contenteditable: 'contentEditable',
-  contextmenu: 'contextMenu',
-  controls: 'controls',
-  controlslist: 'controlsList',
-  coords: 'coords',
-  crossorigin: 'crossOrigin',
-  dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
-  data: 'data',
-  datetime: 'dateTime',
-  default: 'default',
-  defaultchecked: 'defaultChecked',
-  defaultvalue: 'defaultValue',
-  defer: 'defer',
-  dir: 'dir',
-  disabled: 'disabled',
-  disablepictureinpicture: 'disablePictureInPicture',
-  download: 'download',
-  draggable: 'draggable',
-  enctype: 'encType',
-  for: 'htmlFor',
-  form: 'form',
-  formmethod: 'formMethod',
-  formaction: 'formAction',
-  formenctype: 'formEncType',
-  formnovalidate: 'formNoValidate',
-  formtarget: 'formTarget',
-  frameborder: 'frameBorder',
-  headers: 'headers',
-  height: 'height',
-  hidden: 'hidden',
-  high: 'high',
-  href: 'href',
-  hreflang: 'hrefLang',
-  htmlfor: 'htmlFor',
-  httpequiv: 'httpEquiv',
-  'http-equiv': 'httpEquiv',
-  icon: 'icon',
-  id: 'id',
-  innerhtml: 'innerHTML',
-  inputmode: 'inputMode',
-  integrity: 'integrity',
-  is: 'is',
-  itemid: 'itemID',
-  itemprop: 'itemProp',
-  itemref: 'itemRef',
-  itemscope: 'itemScope',
-  itemtype: 'itemType',
-  keyparams: 'keyParams',
-  keytype: 'keyType',
-  kind: 'kind',
-  label: 'label',
-  lang: 'lang',
-  list: 'list',
-  loop: 'loop',
-  low: 'low',
-  manifest: 'manifest',
-  marginwidth: 'marginWidth',
-  marginheight: 'marginHeight',
-  max: 'max',
-  maxlength: 'maxLength',
-  media: 'media',
-  mediagroup: 'mediaGroup',
-  method: 'method',
-  min: 'min',
-  minlength: 'minLength',
-  multiple: 'multiple',
-  muted: 'muted',
-  name: 'name',
-  nomodule: 'noModule',
-  nonce: 'nonce',
-  novalidate: 'noValidate',
-  open: 'open',
-  optimum: 'optimum',
-  pattern: 'pattern',
-  placeholder: 'placeholder',
-  playsinline: 'playsInline',
-  poster: 'poster',
-  preload: 'preload',
-  profile: 'profile',
-  radiogroup: 'radioGroup',
-  readonly: 'readOnly',
-  referrerpolicy: 'referrerPolicy',
-  rel: 'rel',
-  required: 'required',
-  reversed: 'reversed',
-  role: 'role',
-  rows: 'rows',
-  rowspan: 'rowSpan',
-  sandbox: 'sandbox',
-  scope: 'scope',
-  scoped: 'scoped',
-  scrolling: 'scrolling',
-  seamless: 'seamless',
-  selected: 'selected',
-  shape: 'shape',
-  size: 'size',
-  sizes: 'sizes',
-  span: 'span',
-  spellcheck: 'spellCheck',
-  src: 'src',
-  srcdoc: 'srcDoc',
-  srclang: 'srcLang',
-  srcset: 'srcSet',
-  start: 'start',
-  step: 'step',
-  style: 'style',
-  summary: 'summary',
-  tabindex: 'tabIndex',
-  target: 'target',
-  title: 'title',
-  type: 'type',
-  usemap: 'useMap',
-  value: 'value',
-  width: 'width',
-  wmode: 'wmode',
-  wrap: 'wrap',
-  // SVG
-  about: 'about',
-  accentheight: 'accentHeight',
-  'accent-height': 'accentHeight',
-  accumulate: 'accumulate',
-  additive: 'additive',
-  alignmentbaseline: 'alignmentBaseline',
-  'alignment-baseline': 'alignmentBaseline',
-  allowreorder: 'allowReorder',
-  alphabetic: 'alphabetic',
-  amplitude: 'amplitude',
-  arabicform: 'arabicForm',
-  'arabic-form': 'arabicForm',
-  ascent: 'ascent',
-  attributename: 'attributeName',
-  attributetype: 'attributeType',
-  autoreverse: 'autoReverse',
-  azimuth: 'azimuth',
-  basefrequency: 'baseFrequency',
-  baselineshift: 'baselineShift',
-  'baseline-shift': 'baselineShift',
-  baseprofile: 'baseProfile',
-  bbox: 'bbox',
-  begin: 'begin',
-  bias: 'bias',
-  by: 'by',
-  calcmode: 'calcMode',
-  capheight: 'capHeight',
-  'cap-height': 'capHeight',
-  clip: 'clip',
-  clippath: 'clipPath',
-  'clip-path': 'clipPath',
-  clippathunits: 'clipPathUnits',
-  cliprule: 'clipRule',
-  'clip-rule': 'clipRule',
-  color: 'color',
-  colorinterpolation: 'colorInterpolation',
-  'color-interpolation': 'colorInterpolation',
-  colorinterpolationfilters: 'colorInterpolationFilters',
-  'color-interpolation-filters': 'colorInterpolationFilters',
-  colorprofile: 'colorProfile',
-  'color-profile': 'colorProfile',
-  colorrendering: 'colorRendering',
-  'color-rendering': 'colorRendering',
-  contentscripttype: 'contentScriptType',
-  contentstyletype: 'contentStyleType',
-  cursor: 'cursor',
-  cx: 'cx',
-  cy: 'cy',
-  d: 'd',
-  datatype: 'datatype',
-  decelerate: 'decelerate',
-  descent: 'descent',
-  diffuseconstant: 'diffuseConstant',
-  direction: 'direction',
-  display: 'display',
-  divisor: 'divisor',
-  dominantbaseline: 'dominantBaseline',
-  'dominant-baseline': 'dominantBaseline',
-  dur: 'dur',
-  dx: 'dx',
-  dy: 'dy',
-  edgemode: 'edgeMode',
-  elevation: 'elevation',
-  enablebackground: 'enableBackground',
-  'enable-background': 'enableBackground',
-  end: 'end',
-  exponent: 'exponent',
-  externalresourcesrequired: 'externalResourcesRequired',
-  fill: 'fill',
-  fillopacity: 'fillOpacity',
-  'fill-opacity': 'fillOpacity',
-  fillrule: 'fillRule',
-  'fill-rule': 'fillRule',
-  filter: 'filter',
-  filterres: 'filterRes',
-  filterunits: 'filterUnits',
-  floodopacity: 'floodOpacity',
-  'flood-opacity': 'floodOpacity',
-  floodcolor: 'floodColor',
-  'flood-color': 'floodColor',
-  focusable: 'focusable',
-  fontfamily: 'fontFamily',
-  'font-family': 'fontFamily',
-  fontsize: 'fontSize',
-  'font-size': 'fontSize',
-  fontsizeadjust: 'fontSizeAdjust',
-  'font-size-adjust': 'fontSizeAdjust',
-  fontstretch: 'fontStretch',
-  'font-stretch': 'fontStretch',
-  fontstyle: 'fontStyle',
-  'font-style': 'fontStyle',
-  fontvariant: 'fontVariant',
-  'font-variant': 'fontVariant',
-  fontweight: 'fontWeight',
-  'font-weight': 'fontWeight',
-  format: 'format',
-  from: 'from',
-  fx: 'fx',
-  fy: 'fy',
-  g1: 'g1',
-  g2: 'g2',
-  glyphname: 'glyphName',
-  'glyph-name': 'glyphName',
-  glyphorientationhorizontal: 'glyphOrientationHorizontal',
-  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
-  glyphorientationvertical: 'glyphOrientationVertical',
-  'glyph-orientation-vertical': 'glyphOrientationVertical',
-  glyphref: 'glyphRef',
-  gradienttransform: 'gradientTransform',
-  gradientunits: 'gradientUnits',
-  hanging: 'hanging',
-  horizadvx: 'horizAdvX',
-  'horiz-adv-x': 'horizAdvX',
-  horizoriginx: 'horizOriginX',
-  'horiz-origin-x': 'horizOriginX',
-  ideographic: 'ideographic',
-  imagerendering: 'imageRendering',
-  'image-rendering': 'imageRendering',
-  in2: 'in2',
-  in: 'in',
-  inlist: 'inlist',
-  intercept: 'intercept',
-  k1: 'k1',
-  k2: 'k2',
-  k3: 'k3',
-  k4: 'k4',
-  k: 'k',
-  kernelmatrix: 'kernelMatrix',
-  kernelunitlength: 'kernelUnitLength',
-  kerning: 'kerning',
-  keypoints: 'keyPoints',
-  keysplines: 'keySplines',
-  keytimes: 'keyTimes',
-  lengthadjust: 'lengthAdjust',
-  letterspacing: 'letterSpacing',
-  'letter-spacing': 'letterSpacing',
-  lightingcolor: 'lightingColor',
-  'lighting-color': 'lightingColor',
-  limitingconeangle: 'limitingConeAngle',
-  local: 'local',
-  markerend: 'markerEnd',
-  'marker-end': 'markerEnd',
-  markerheight: 'markerHeight',
-  markermid: 'markerMid',
-  'marker-mid': 'markerMid',
-  markerstart: 'markerStart',
-  'marker-start': 'markerStart',
-  markerunits: 'markerUnits',
-  markerwidth: 'markerWidth',
-  mask: 'mask',
-  maskcontentunits: 'maskContentUnits',
-  maskunits: 'maskUnits',
-  mathematical: 'mathematical',
-  mode: 'mode',
-  numoctaves: 'numOctaves',
-  offset: 'offset',
-  opacity: 'opacity',
-  operator: 'operator',
-  order: 'order',
-  orient: 'orient',
-  orientation: 'orientation',
-  origin: 'origin',
-  overflow: 'overflow',
-  overlineposition: 'overlinePosition',
-  'overline-position': 'overlinePosition',
-  overlinethickness: 'overlineThickness',
-  'overline-thickness': 'overlineThickness',
-  paintorder: 'paintOrder',
-  'paint-order': 'paintOrder',
-  panose1: 'panose1',
-  'panose-1': 'panose1',
-  pathlength: 'pathLength',
-  patterncontentunits: 'patternContentUnits',
-  patterntransform: 'patternTransform',
-  patternunits: 'patternUnits',
-  pointerevents: 'pointerEvents',
-  'pointer-events': 'pointerEvents',
-  points: 'points',
-  pointsatx: 'pointsAtX',
-  pointsaty: 'pointsAtY',
-  pointsatz: 'pointsAtZ',
-  prefix: 'prefix',
-  preservealpha: 'preserveAlpha',
-  preserveaspectratio: 'preserveAspectRatio',
-  primitiveunits: 'primitiveUnits',
-  property: 'property',
-  r: 'r',
-  radius: 'radius',
-  refx: 'refX',
-  refy: 'refY',
-  renderingintent: 'renderingIntent',
-  'rendering-intent': 'renderingIntent',
-  repeatcount: 'repeatCount',
-  repeatdur: 'repeatDur',
-  requiredextensions: 'requiredExtensions',
-  requiredfeatures: 'requiredFeatures',
-  resource: 'resource',
-  restart: 'restart',
-  result: 'result',
-  results: 'results',
-  rotate: 'rotate',
-  rx: 'rx',
-  ry: 'ry',
-  scale: 'scale',
-  security: 'security',
-  seed: 'seed',
-  shaperendering: 'shapeRendering',
-  'shape-rendering': 'shapeRendering',
-  slope: 'slope',
-  spacing: 'spacing',
-  specularconstant: 'specularConstant',
-  specularexponent: 'specularExponent',
-  speed: 'speed',
-  spreadmethod: 'spreadMethod',
-  startoffset: 'startOffset',
-  stddeviation: 'stdDeviation',
-  stemh: 'stemh',
-  stemv: 'stemv',
-  stitchtiles: 'stitchTiles',
-  stopcolor: 'stopColor',
-  'stop-color': 'stopColor',
-  stopopacity: 'stopOpacity',
-  'stop-opacity': 'stopOpacity',
-  strikethroughposition: 'strikethroughPosition',
-  'strikethrough-position': 'strikethroughPosition',
-  strikethroughthickness: 'strikethroughThickness',
-  'strikethrough-thickness': 'strikethroughThickness',
-  string: 'string',
-  stroke: 'stroke',
-  strokedasharray: 'strokeDasharray',
-  'stroke-dasharray': 'strokeDasharray',
-  strokedashoffset: 'strokeDashoffset',
-  'stroke-dashoffset': 'strokeDashoffset',
-  strokelinecap: 'strokeLinecap',
-  'stroke-linecap': 'strokeLinecap',
-  strokelinejoin: 'strokeLinejoin',
-  'stroke-linejoin': 'strokeLinejoin',
-  strokemiterlimit: 'strokeMiterlimit',
-  'stroke-miterlimit': 'strokeMiterlimit',
-  strokewidth: 'strokeWidth',
-  'stroke-width': 'strokeWidth',
-  strokeopacity: 'strokeOpacity',
-  'stroke-opacity': 'strokeOpacity',
-  suppresscontenteditablewarning: 'suppressContentEditableWarning',
-  suppresshydrationwarning: 'suppressHydrationWarning',
-  surfacescale: 'surfaceScale',
-  systemlanguage: 'systemLanguage',
-  tablevalues: 'tableValues',
-  targetx: 'targetX',
-  targety: 'targetY',
-  textanchor: 'textAnchor',
-  'text-anchor': 'textAnchor',
-  textdecoration: 'textDecoration',
-  'text-decoration': 'textDecoration',
-  textlength: 'textLength',
-  textrendering: 'textRendering',
-  'text-rendering': 'textRendering',
-  to: 'to',
-  transform: 'transform',
-  typeof: 'typeof',
-  u1: 'u1',
-  u2: 'u2',
-  underlineposition: 'underlinePosition',
-  'underline-position': 'underlinePosition',
-  underlinethickness: 'underlineThickness',
-  'underline-thickness': 'underlineThickness',
-  unicode: 'unicode',
-  unicodebidi: 'unicodeBidi',
-  'unicode-bidi': 'unicodeBidi',
-  unicoderange: 'unicodeRange',
-  'unicode-range': 'unicodeRange',
-  unitsperem: 'unitsPerEm',
-  'units-per-em': 'unitsPerEm',
-  unselectable: 'unselectable',
-  valphabetic: 'vAlphabetic',
-  'v-alphabetic': 'vAlphabetic',
-  values: 'values',
-  vectoreffect: 'vectorEffect',
-  'vector-effect': 'vectorEffect',
-  version: 'version',
-  vertadvy: 'vertAdvY',
-  'vert-adv-y': 'vertAdvY',
-  vertoriginx: 'vertOriginX',
-  'vert-origin-x': 'vertOriginX',
-  vertoriginy: 'vertOriginY',
-  'vert-origin-y': 'vertOriginY',
-  vhanging: 'vHanging',
-  'v-hanging': 'vHanging',
-  videographic: 'vIdeographic',
-  'v-ideographic': 'vIdeographic',
-  viewbox: 'viewBox',
-  viewtarget: 'viewTarget',
-  visibility: 'visibility',
-  vmathematical: 'vMathematical',
-  'v-mathematical': 'vMathematical',
-  vocab: 'vocab',
-  widths: 'widths',
-  wordspacing: 'wordSpacing',
-  'word-spacing': 'wordSpacing',
-  writingmode: 'writingMode',
-  'writing-mode': 'writingMode',
-  x1: 'x1',
-  x2: 'x2',
-  x: 'x',
-  xchannelselector: 'xChannelSelector',
-  xheight: 'xHeight',
-  'x-height': 'xHeight',
-  xlinkactuate: 'xlinkActuate',
-  'xlink:actuate': 'xlinkActuate',
-  xlinkarcrole: 'xlinkArcrole',
-  'xlink:arcrole': 'xlinkArcrole',
-  xlinkhref: 'xlinkHref',
-  'xlink:href': 'xlinkHref',
-  xlinkrole: 'xlinkRole',
-  'xlink:role': 'xlinkRole',
-  xlinkshow: 'xlinkShow',
-  'xlink:show': 'xlinkShow',
-  xlinktitle: 'xlinkTitle',
-  'xlink:title': 'xlinkTitle',
-  xlinktype: 'xlinkType',
-  'xlink:type': 'xlinkType',
-  xmlbase: 'xmlBase',
-  'xml:base': 'xmlBase',
-  xmllang: 'xmlLang',
-  'xml:lang': 'xmlLang',
-  xmlns: 'xmlns',
-  'xml:space': 'xmlSpace',
-  xmlnsxlink: 'xmlnsXlink',
-  'xmlns:xlink': 'xmlnsXlink',
-  xmlspace: 'xmlSpace',
-  y1: 'y1',
-  y2: 'y2',
-  y: 'y',
-  ychannelselector: 'yChannelSelector',
-  z: 'z',
-  zoomandpan: 'zoomAndPan'
-};
-
-var ariaProperties = {
-  'aria-current': 0,
-  // state
-  'aria-details': 0,
-  'aria-disabled': 0,
-  // state
-  'aria-hidden': 0,
-  // state
-  'aria-invalid': 0,
-  // state
-  'aria-keyshortcuts': 0,
-  'aria-label': 0,
-  'aria-roledescription': 0,
-  // Widget Attributes
-  'aria-autocomplete': 0,
-  'aria-checked': 0,
-  'aria-expanded': 0,
-  'aria-haspopup': 0,
-  'aria-level': 0,
-  'aria-modal': 0,
-  'aria-multiline': 0,
-  'aria-multiselectable': 0,
-  'aria-orientation': 0,
-  'aria-placeholder': 0,
-  'aria-pressed': 0,
-  'aria-readonly': 0,
-  'aria-required': 0,
-  'aria-selected': 0,
-  'aria-sort': 0,
-  'aria-valuemax': 0,
-  'aria-valuemin': 0,
-  'aria-valuenow': 0,
-  'aria-valuetext': 0,
-  // Live Region Attributes
-  'aria-atomic': 0,
-  'aria-busy': 0,
-  'aria-live': 0,
-  'aria-relevant': 0,
-  // Drag-and-Drop Attributes
-  'aria-dropeffect': 0,
-  'aria-grabbed': 0,
-  // Relationship Attributes
-  'aria-activedescendant': 0,
-  'aria-colcount': 0,
-  'aria-colindex': 0,
-  'aria-colspan': 0,
-  'aria-controls': 0,
-  'aria-describedby': 0,
-  'aria-errormessage': 0,
-  'aria-flowto': 0,
-  'aria-labelledby': 0,
-  'aria-owns': 0,
-  'aria-posinset': 0,
-  'aria-rowcount': 0,
-  'aria-rowindex': 0,
-  'aria-rowspan': 0,
-  'aria-setsize': 0
-};
-
-var warnedProperties = {};
-var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
-var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
-var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
-
-function validateProperty(tagName, name) {
-  if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) {
-    return true;
-  }
 
-  if (rARIACamel.test(name)) {
-    var ariaName = 'aria-' + name.slice(4).toLowerCase();
-    var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
-    // DOM properties, then it is an invalid aria-* attribute.
+              extraAttributeNames.delete(propKey);
+            }
 
-    if (correctName == null) {
-      warning$1(false, 'Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
-      warnedProperties[name] = true;
-      return true;
-    } // aria-* attributes should be lowercase; suggest the lowercase version.
+            serverValue = getValueForAttribute(domElement, propKey, nextProp);
+          }
 
+          if (nextProp !== serverValue && !isMismatchDueToBadCasing) {
+            warnForPropDifference(propKey, serverValue, nextProp);
+          }
+        }
+      }
+    }
 
-    if (name !== correctName) {
-      warning$1(false, 'Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
-      warnedProperties[name] = true;
-      return true;
+    {
+      // $FlowFixMe - Should be inferred as not undefined.
+      if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {
+        // $FlowFixMe - Should be inferred as not undefined.
+        warnForExtraAttributes(extraAttributeNames);
+      }
     }
-  }
 
-  if (rARIA.test(name)) {
-    var lowerCasedName = name.toLowerCase();
-    var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
-    // DOM properties, then it is an invalid aria-* attribute.
+    switch (tag) {
+      case 'input':
+        // TODO: Make sure we check if this is still unmounted or do any clean
+        // up necessary since we never stop tracking anymore.
+        track(domElement);
+        postMountWrapper(domElement, rawProps, true);
+        break;
 
-    if (standardName == null) {
-      warnedProperties[name] = true;
-      return false;
-    } // aria-* attributes should be lowercase; suggest the lowercase version.
+      case 'textarea':
+        // TODO: Make sure we check if this is still unmounted or do any clean
+        // up necessary since we never stop tracking anymore.
+        track(domElement);
+        postMountWrapper$3(domElement);
+        break;
+
+      case 'select':
+      case 'option':
+        // For input and textarea we current always set the value property at
+        // post mount to force it to diverge from attributes. However, for
+        // option and select we don't quite do the same thing and select
+        // is not resilient to the DOM state changing so we don't do that here.
+        // TODO: Consider not doing this for input and textarea.
+        break;
 
+      default:
+        if (typeof rawProps.onClick === 'function') {
+          // TODO: This cast may not be sound for SVG, MathML or custom elements.
+          trapClickOnNonInteractiveElement(domElement);
+        }
 
-    if (name !== standardName) {
-      warning$1(false, 'Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
-      warnedProperties[name] = true;
-      return true;
+        break;
+    }
+
+    return updatePayload;
+  }
+  function diffHydratedText(textNode, text) {
+    var isDifferent = textNode.nodeValue !== text;
+    return isDifferent;
+  }
+  function warnForUnmatchedText(textNode, text) {
+    {
+      warnForTextDifference(textNode.nodeValue, text);
     }
   }
+  function warnForDeletedHydratableElement(parentNode, child) {
+    {
+      if (didWarnInvalidHydration) {
+        return;
+      }
 
-  return true;
-}
+      didWarnInvalidHydration = true;
 
-function warnInvalidARIAProps(type, props) {
-  var invalidProps = [];
+      error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
+    }
+  }
+  function warnForDeletedHydratableText(parentNode, child) {
+    {
+      if (didWarnInvalidHydration) {
+        return;
+      }
 
-  for (var key in props) {
-    var isValid = validateProperty(type, key);
+      didWarnInvalidHydration = true;
 
-    if (!isValid) {
-      invalidProps.push(key);
+      error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
     }
   }
+  function warnForInsertedHydratedElement(parentNode, tag, props) {
+    {
+      if (didWarnInvalidHydration) {
+        return;
+      }
 
-  var unknownPropString = invalidProps.map(function (prop) {
-    return '`' + prop + '`';
-  }).join(', ');
+      didWarnInvalidHydration = true;
 
-  if (invalidProps.length === 1) {
-    warning$1(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
-  } else if (invalidProps.length > 1) {
-    warning$1(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);
+      error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
+    }
   }
-}
+  function warnForInsertedHydratedText(parentNode, text) {
+    {
+      if (text === '') {
+        // We expect to insert empty text nodes since they're not represented in
+        // the HTML.
+        // TODO: Remove this special case if we can just avoid inserting empty
+        // text nodes.
+        return;
+      }
 
-function validateProperties(type, props) {
-  if (isCustomComponent(type, props)) {
-    return;
-  }
+      if (didWarnInvalidHydration) {
+        return;
+      }
 
-  warnInvalidARIAProps(type, props);
-}
+      didWarnInvalidHydration = true;
 
-var didWarnValueNull = false;
-function validateProperties$1(type, props) {
-  if (type !== 'input' && type !== 'textarea' && type !== 'select') {
-    return;
+      error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
+    }
   }
+  function restoreControlledState$3(domElement, tag, props) {
+    switch (tag) {
+      case 'input':
+        restoreControlledState(domElement, props);
+        return;
 
-  if (props != null && props.value === null && !didWarnValueNull) {
-    didWarnValueNull = true;
+      case 'textarea':
+        restoreControlledState$2(domElement, props);
+        return;
 
-    if (type === 'select' && props.multiple) {
-      warning$1(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);
-    } else {
-      warning$1(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
+      case 'select':
+        restoreControlledState$1(domElement, props);
+        return;
     }
   }
-}
 
-var validateProperty$1 = function () {};
+  function getActiveElement(doc) {
+    doc = doc || (typeof document !== 'undefined' ? document : undefined);
 
-{
-  var warnedProperties$1 = {};
-  var _hasOwnProperty = Object.prototype.hasOwnProperty;
-  var EVENT_NAME_REGEX = /^on./;
-  var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
-  var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
-  var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
+    if (typeof doc === 'undefined') {
+      return null;
+    }
 
-  validateProperty$1 = function (tagName, name, value, canUseEventSystem) {
-    if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
-      return true;
+    try {
+      return doc.activeElement || doc.body;
+    } catch (e) {
+      return doc.body;
     }
+  }
 
-    var lowerCasedName = name.toLowerCase();
+  /**
+   * Given any node return the first leaf node without children.
+   *
+   * @param {DOMElement|DOMTextNode} node
+   * @return {DOMElement|DOMTextNode}
+   */
 
-    if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
-      warning$1(false, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');
-      warnedProperties$1[name] = true;
-      return true;
-    } // We can't rely on the event system being injected on the server.
+  function getLeafNode(node) {
+    while (node && node.firstChild) {
+      node = node.firstChild;
+    }
+
+    return node;
+  }
+  /**
+   * Get the next sibling within a container. This will walk up the
+   * DOM if a node's siblings have been exhausted.
+   *
+   * @param {DOMElement|DOMTextNode} node
+   * @return {?DOMElement|DOMTextNode}
+   */
 
 
-    if (canUseEventSystem) {
-      if (registrationNameModules.hasOwnProperty(name)) {
-        return true;
+  function getSiblingNode(node) {
+    while (node) {
+      if (node.nextSibling) {
+        return node.nextSibling;
       }
 
-      var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
+      node = node.parentNode;
+    }
+  }
+  /**
+   * Get object describing the nodes which contain characters at offset.
+   *
+   * @param {DOMElement|DOMTextNode} root
+   * @param {number} offset
+   * @return {?object}
+   */
 
-      if (registrationName != null) {
-        warning$1(false, 'Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
-        warnedProperties$1[name] = true;
-        return true;
-      }
 
-      if (EVENT_NAME_REGEX.test(name)) {
-        warning$1(false, 'Unknown event handler property `%s`. It will be ignored.', name);
-        warnedProperties$1[name] = true;
-        return true;
-      }
-    } else if (EVENT_NAME_REGEX.test(name)) {
-      // If no event plugins have been injected, we are in a server environment.
-      // So we can't tell if the event name is correct for sure, but we can filter
-      // out known bad ones like `onclick`. We can't suggest a specific replacement though.
-      if (INVALID_EVENT_NAME_REGEX.test(name)) {
-        warning$1(false, 'Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
-      }
+  function getNodeForCharacterOffset(root, offset) {
+    var node = getLeafNode(root);
+    var nodeStart = 0;
+    var nodeEnd = 0;
 
-      warnedProperties$1[name] = true;
-      return true;
-    } // Let the ARIA attribute hook validate ARIA attributes
+    while (node) {
+      if (node.nodeType === TEXT_NODE) {
+        nodeEnd = nodeStart + node.textContent.length;
+
+        if (nodeStart <= offset && nodeEnd >= offset) {
+          return {
+            node: node,
+            offset: offset - nodeStart
+          };
+        }
 
+        nodeStart = nodeEnd;
+      }
 
-    if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
-      return true;
+      node = getLeafNode(getSiblingNode(node));
     }
+  }
 
-    if (lowerCasedName === 'innerhtml') {
-      warning$1(false, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
-      warnedProperties$1[name] = true;
-      return true;
-    }
+  /**
+   * @param {DOMElement} outerNode
+   * @return {?object}
+   */
 
-    if (lowerCasedName === 'aria') {
-      warning$1(false, 'The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
-      warnedProperties$1[name] = true;
-      return true;
-    }
+  function getOffsets(outerNode) {
+    var ownerDocument = outerNode.ownerDocument;
+    var win = ownerDocument && ownerDocument.defaultView || window;
+    var selection = win.getSelection && win.getSelection();
 
-    if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
-      warning$1(false, 'Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
-      warnedProperties$1[name] = true;
-      return true;
+    if (!selection || selection.rangeCount === 0) {
+      return null;
     }
 
-    if (typeof value === 'number' && isNaN(value)) {
-      warning$1(false, 'Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
-      warnedProperties$1[name] = true;
-      return true;
+    var anchorNode = selection.anchorNode,
+        anchorOffset = selection.anchorOffset,
+        focusNode = selection.focusNode,
+        focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the
+    // up/down buttons on an <input type="number">. Anonymous divs do not seem to
+    // expose properties, triggering a "Permission denied error" if any of its
+    // properties are accessed. The only seemingly possible way to avoid erroring
+    // is to access a property that typically works for non-anonymous divs and
+    // catch any error that may otherwise arise. See
+    // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
+
+    try {
+      /* eslint-disable no-unused-expressions */
+      anchorNode.nodeType;
+      focusNode.nodeType;
+      /* eslint-enable no-unused-expressions */
+    } catch (e) {
+      return null;
     }
 
-    var propertyInfo = getPropertyInfo(name);
-    var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
+    return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);
+  }
+  /**
+   * Returns {start, end} where `start` is the character/codepoint index of
+   * (anchorNode, anchorOffset) within the textContent of `outerNode`, and
+   * `end` is the index of (focusNode, focusOffset).
+   *
+   * Returns null if you pass in garbage input but we should probably just crash.
+   *
+   * Exported only for testing.
+   */
 
-    if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
-      var standardName = possibleStandardNames[lowerCasedName];
+  function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {
+    var length = 0;
+    var start = -1;
+    var end = -1;
+    var indexWithinAnchor = 0;
+    var indexWithinFocus = 0;
+    var node = outerNode;
+    var parentNode = null;
 
-      if (standardName !== name) {
-        warning$1(false, 'Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
-        warnedProperties$1[name] = true;
-        return true;
-      }
-    } else if (!isReserved && name !== lowerCasedName) {
-      // Unknown attributes should have lowercase casing since that's how they
-      // will be cased anyway with server rendering.
-      warning$1(false, 'React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);
-      warnedProperties$1[name] = true;
-      return true;
-    }
+    outer: while (true) {
+      var next = null;
 
-    if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
-      if (value) {
-        warning$1(false, 'Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name);
-      } else {
-        warning$1(false, 'Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);
-      }
+      while (true) {
+        if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {
+          start = length + anchorOffset;
+        }
 
-      warnedProperties$1[name] = true;
-      return true;
-    } // Now that we've validated casing, do not validate
-    // data types for reserved props
+        if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {
+          end = length + focusOffset;
+        }
 
+        if (node.nodeType === TEXT_NODE) {
+          length += node.nodeValue.length;
+        }
 
-    if (isReserved) {
-      return true;
-    } // Warn when a known attribute is a bad type
+        if ((next = node.firstChild) === null) {
+          break;
+        } // Moving from `node` to its first child `next`.
 
 
-    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
-      warnedProperties$1[name] = true;
-      return false;
-    } // Warn when passing the strings 'false' or 'true' into a boolean prop
+        parentNode = node;
+        node = next;
+      }
 
+      while (true) {
+        if (node === outerNode) {
+          // If `outerNode` has children, this is always the second time visiting
+          // it. If it has no children, this is still the first loop, and the only
+          // valid selection is anchorNode and focusNode both equal to this node
+          // and both offsets 0, in which case we will have handled above.
+          break outer;
+        }
 
-    if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
-      warning$1(false, 'Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value);
-      warnedProperties$1[name] = true;
-      return true;
-    }
+        if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {
+          start = length;
+        }
 
-    return true;
-  };
-}
-
-var warnUnknownProperties = function (type, props, canUseEventSystem) {
-  var unknownProps = [];
-
-  for (var key in props) {
-    var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);
-
-    if (!isValid) {
-      unknownProps.push(key);
-    }
-  }
-
-  var unknownPropString = unknownProps.map(function (prop) {
-    return '`' + prop + '`';
-  }).join(', ');
-
-  if (unknownProps.length === 1) {
-    warning$1(false, 'Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);
-  } else if (unknownProps.length > 1) {
-    warning$1(false, 'Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);
-  }
-};
-
-function validateProperties$2(type, props, canUseEventSystem) {
-  if (isCustomComponent(type, props)) {
-    return;
-  }
-
-  warnUnknownProperties(type, props, canUseEventSystem);
-}
-
-// TODO: direct imports like some-package/src/* are bad. Fix me.
-var didWarnInvalidHydration = false;
-var didWarnShadyDOM = false;
-var didWarnScriptTags = false;
-var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
-var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';
-var SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';
-var AUTOFOCUS = 'autoFocus';
-var CHILDREN = 'children';
-var STYLE$1 = 'style';
-var HTML = '__html';
-var LISTENERS = 'listeners';
-var HTML_NAMESPACE = Namespaces.html;
-var warnedUnknownTags;
-var suppressHydrationWarning;
-var validatePropertiesInDevelopment;
-var warnForTextDifference;
-var warnForPropDifference;
-var warnForExtraAttributes;
-var warnForInvalidEventListener;
-var canDiffStyleForHydrationWarning;
-var normalizeMarkupForTextOrAttribute;
-var normalizeHTML;
-
-{
-  warnedUnknownTags = {
-    // Chrome is the only major browser not shipping <time>. But as of July
-    // 2017 it intends to ship it due to widespread usage. We intentionally
-    // *don't* warn for <time> even if it's unrecognized by Chrome because
-    // it soon will be, and many apps have been using it anyway.
-    time: true,
-    // There are working polyfills for <dialog>. Let people use it.
-    dialog: true,
-    // Electron ships a custom <webview> tag to display external web content in
-    // an isolated frame and process.
-    // This tag is not present in non Electron environments such as JSDom which
-    // is often used for testing purposes.
-    // @see https://electronjs.org/docs/api/webview-tag
-    webview: true
-  };
+        if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {
+          end = length;
+        }
 
-  validatePropertiesInDevelopment = function (type, props) {
-    validateProperties(type, props);
-    validateProperties$1(type, props);
-    validateProperties$2(type, props,
-    /* canUseEventSystem */
-    true);
-  }; // IE 11 parses & normalizes the style attribute as opposed to other
-  // browsers. It adds spaces and sorts the properties in some
-  // non-alphabetical order. Handling that would require sorting CSS
-  // properties in the client & server versions or applying
-  // `expectedStyle` to a temporary DOM node to read its `style` attribute
-  // normalized. Since it only affects IE, we're skipping style warnings
-  // in that browser completely in favor of doing all that work.
-  // See https://github.com/facebook/react/issues/11807
-
-
-  canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF.
-  // It also can turn \u0000 into \uFFFD inside attributes.
-  // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream
-  // If we have a mismatch, it might be caused by that.
-  // We will still patch up in this case but not fire the warning.
-
-  var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
-  var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
-
-  normalizeMarkupForTextOrAttribute = function (markup) {
-    var markupString = typeof markup === 'string' ? markup : '' + markup;
-    return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');
-  };
+        if ((next = node.nextSibling) !== null) {
+          break;
+        }
 
-  warnForTextDifference = function (serverText, clientText) {
-    if (didWarnInvalidHydration) {
-      return;
-    }
+        node = parentNode;
+        parentNode = node.parentNode;
+      } // Moving from `node` to its next sibling `next`.
 
-    var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);
-    var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
 
-    if (normalizedServerText === normalizedClientText) {
-      return;
+      node = next;
     }
 
-    didWarnInvalidHydration = true;
-    warningWithoutStack$1(false, 'Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText);
-  };
-
-  warnForPropDifference = function (propName, serverValue, clientValue) {
-    if (didWarnInvalidHydration) {
-      return;
+    if (start === -1 || end === -1) {
+      // This should never happen. (Would happen if the anchor/focus nodes aren't
+      // actually inside the passed-in node.)
+      return null;
     }
 
-    var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);
-    var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
-
-    if (normalizedServerValue === normalizedClientValue) {
-      return;
-    }
+    return {
+      start: start,
+      end: end
+    };
+  }
+  /**
+   * In modern non-IE browsers, we can support both forward and backward
+   * selections.
+   *
+   * Note: IE10+ supports the Selection object, but it does not support
+   * the `extend` method, which means that even in modern IE, it's not possible
+   * to programmatically create a backward selection. Thus, for all IE
+   * versions, we use the old IE API to create our selections.
+   *
+   * @param {DOMElement|DOMTextNode} node
+   * @param {object} offsets
+   */
 
-    didWarnInvalidHydration = true;
-    warningWithoutStack$1(false, 'Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));
-  };
+  function setOffsets(node, offsets) {
+    var doc = node.ownerDocument || document;
+    var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios.
+    // (For instance: TinyMCE editor used in a list component that supports pasting to add more,
+    // fails when pasting 100+ items)
 
-  warnForExtraAttributes = function (attributeNames) {
-    if (didWarnInvalidHydration) {
+    if (!win.getSelection) {
       return;
     }
 
-    didWarnInvalidHydration = true;
-    var names = [];
-    attributeNames.forEach(function (name) {
-      names.push(name);
-    });
-    warningWithoutStack$1(false, 'Extra attributes from the server: %s', names);
-  };
+    var selection = win.getSelection();
+    var length = node.textContent.length;
+    var start = Math.min(offsets.start, length);
+    var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.
+    // Flip backward selections, so we can set with a single range.
 
-  warnForInvalidEventListener = function (registrationName, listener) {
-    if (listener === false) {
-      warning$1(false, 'Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);
-    } else {
-      warning$1(false, 'Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);
+    if (!selection.extend && start > end) {
+      var temp = end;
+      end = start;
+      start = temp;
     }
-  }; // Parse the HTML and read it back to normalize the HTML string so that it
-  // can be used for comparison.
-
-
-  normalizeHTML = function (parent, html) {
-    // We could have created a separate document here to avoid
-    // re-initializing custom elements if they exist. But this breaks
-    // how <noscript> is being handled. So we use the same document.
-    // See the discussion in https://github.com/facebook/react/pull/11157.
-    var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
-    testElement.innerHTML = html;
-    return testElement.innerHTML;
-  };
-}
-
-function ensureListeningTo(rootContainerElement, registrationName) {
-  var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;
-  var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;
-  listenTo(registrationName, doc);
-}
-
-function getOwnerDocumentFromRootContainer(rootContainerElement) {
-  return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
-}
-
-function noop() {}
-
-function trapClickOnNonInteractiveElement(node) {
-  // Mobile Safari does not fire properly bubble click events on
-  // non-interactive elements, which means delegated click listeners do not
-  // fire. The workaround for this bug involves attaching an empty click
-  // listener on the target node.
-  // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
-  // Just set it using the onclick property so that we don't have to manage any
-  // bookkeeping for it. Not sure if we need to clear it when the listener is
-  // removed.
-  // TODO: Only do this for the relevant Safaris maybe?
-  node.onclick = noop;
-}
-
-function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
-  for (var propKey in nextProps) {
-    if (!nextProps.hasOwnProperty(propKey)) {
-      continue;
-    }
-
-    var nextProp = nextProps[propKey];
-
-    if (propKey === STYLE$1) {
-      {
-        if (nextProp) {
-          // Freeze the next style object so that we can assume it won't be
-          // mutated. We have already warned for this in the past.
-          Object.freeze(nextProp);
-        }
-      } // Relies on `updateStylesByID` not mutating `styleUpdates`.
-
 
-      setValueForStyles(domElement, nextProp);
-    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
-      var nextHtml = nextProp ? nextProp[HTML] : undefined;
+    var startMarker = getNodeForCharacterOffset(node, start);
+    var endMarker = getNodeForCharacterOffset(node, end);
 
-      if (nextHtml != null) {
-        setInnerHTML(domElement, nextHtml);
+    if (startMarker && endMarker) {
+      if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {
+        return;
       }
-    } else if (propKey === CHILDREN) {
-      if (typeof nextProp === 'string') {
-        // Avoid setting initial textContent when the text is empty. In IE11 setting
-        // textContent on a <textarea> will cause the placeholder to not
-        // show within the <textarea> until it has been focused and blurred again.
-        // https://github.com/facebook/react/issues/6731#issuecomment-254874553
-        var canSetTextContent = tag !== 'textarea' || nextProp !== '';
 
-        if (canSetTextContent) {
-          setTextContent(domElement, nextProp);
-        }
-      } else if (typeof nextProp === 'number') {
-        setTextContent(domElement, '' + nextProp);
-      }
-    } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {// Noop
-    } else if (propKey === AUTOFOCUS) {// We polyfill it separately on the client during commit.
-      // We could have excluded it in the property list instead of
-      // adding a special case here, but then it wouldn't be emitted
-      // on server rendering (but we *do* want to emit it in SSR).
-    } else if (registrationNameModules.hasOwnProperty(propKey)) {
-      if (nextProp != null) {
-        if (true && typeof nextProp !== 'function') {
-          warnForInvalidEventListener(propKey, nextProp);
-        }
+      var range = doc.createRange();
+      range.setStart(startMarker.node, startMarker.offset);
+      selection.removeAllRanges();
 
-        ensureListeningTo(rootContainerElement, propKey);
+      if (start > end) {
+        selection.addRange(range);
+        selection.extend(endMarker.node, endMarker.offset);
+      } else {
+        range.setEnd(endMarker.node, endMarker.offset);
+        selection.addRange(range);
       }
-    } else if (nextProp != null) {
-      setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);
     }
   }
-}
 
-function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
-  // TODO: Handle wasCustomComponentTag
-  for (var i = 0; i < updatePayload.length; i += 2) {
-    var propKey = updatePayload[i];
-    var propValue = updatePayload[i + 1];
+  function isTextNode(node) {
+    return node && node.nodeType === TEXT_NODE;
+  }
 
-    if (propKey === STYLE$1) {
-      setValueForStyles(domElement, propValue);
-    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
-      setInnerHTML(domElement, propValue);
-    } else if (propKey === CHILDREN) {
-      setTextContent(domElement, propValue);
+  function containsNode(outerNode, innerNode) {
+    if (!outerNode || !innerNode) {
+      return false;
+    } else if (outerNode === innerNode) {
+      return true;
+    } else if (isTextNode(outerNode)) {
+      return false;
+    } else if (isTextNode(innerNode)) {
+      return containsNode(outerNode, innerNode.parentNode);
+    } else if ('contains' in outerNode) {
+      return outerNode.contains(innerNode);
+    } else if (outerNode.compareDocumentPosition) {
+      return !!(outerNode.compareDocumentPosition(innerNode) & 16);
     } else {
-      setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);
+      return false;
     }
   }
-}
-
-function createElement(type, props, rootContainerElement, parentNamespace) {
-  var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML
-  // tags get no namespace.
-
-  var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);
-  var domElement;
-  var namespaceURI = parentNamespace;
 
-  if (namespaceURI === HTML_NAMESPACE) {
-    namespaceURI = getIntrinsicNamespace(type);
+  function isInDocument(node) {
+    return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);
   }
 
-  if (namespaceURI === HTML_NAMESPACE) {
-    {
-      isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to
-      // allow <SVG> or <mATH>.
-
-      !(isCustomComponentTag || type === type.toLowerCase()) ? warning$1(false, '<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type) : void 0;
+  function isSameOriginFrame(iframe) {
+    try {
+      // Accessing the contentDocument of a HTMLIframeElement can cause the browser
+      // to throw, e.g. if it has a cross-origin src attribute.
+      // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g:
+      // iframe.contentDocument.defaultView;
+      // A safety way is to access one of the cross origin properties: Window or Location
+      // Which might result in "SecurityError" DOM Exception and it is compatible to Safari.
+      // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl
+      return typeof iframe.contentWindow.location.href === 'string';
+    } catch (err) {
+      return false;
     }
+  }
 
-    if (type === 'script') {
-      // Create the script via .innerHTML so its "parser-inserted" flag is
-      // set to true and it does not execute
-      var div = ownerDocument.createElement('div');
+  function getActiveElementDeep() {
+    var win = window;
+    var element = getActiveElement();
 
-      {
-        if (enableTrustedTypesIntegration && !didWarnScriptTags) {
-          warning$1(false, 'Encountered a script tag while rendering React component. ' + 'Scripts inside React components are never executed when rendering ' + 'on the client. Consider using template tag instead ' + '(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template).');
-          didWarnScriptTags = true;
-        }
+    while (element instanceof win.HTMLIFrameElement) {
+      if (isSameOriginFrame(element)) {
+        win = element.contentWindow;
+      } else {
+        return element;
       }
 
-      div.innerHTML = '<script><' + '/script>'; // eslint-disable-line
-      // This is guaranteed to yield a script element.
-
-      var firstChild = div.firstChild;
-      domElement = div.removeChild(firstChild);
-    } else if (typeof props.is === 'string') {
-      // $FlowIssue `createElement` should be updated for Web Components
-      domElement = ownerDocument.createElement(type, {
-        is: props.is
-      });
-    } else {
-      // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.
-      // See discussion in https://github.com/facebook/react/pull/6896
-      // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
-      domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`
-      // attributes on `select`s needs to be added before `option`s are inserted.
-      // This prevents:
-      // - a bug where the `select` does not scroll to the correct option because singular
-      //  `select` elements automatically pick the first item #13222
-      // - a bug where the `select` set the first item as selected despite the `size` attribute #14239
-      // See https://github.com/facebook/react/issues/13222
-      // and https://github.com/facebook/react/issues/14239
-
-      if (type === 'select') {
-        var node = domElement;
-
-        if (props.multiple) {
-          node.multiple = true;
-        } else if (props.size) {
-          // Setting a size greater than 1 causes a select to behave like `multiple=true`, where
-          // it is possible that no option is selected.
-          //
-          // This is only necessary when a select in "single selection mode".
-          node.size = props.size;
-        }
-      }
+      element = getActiveElement(win.document);
     }
-  } else {
-    domElement = ownerDocument.createElementNS(namespaceURI, type);
-  }
 
-  {
-    if (namespaceURI === HTML_NAMESPACE) {
-      if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {
-        warnedUnknownTags[type] = true;
-        warning$1(false, 'The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);
-      }
-    }
+    return element;
   }
+  /**
+   * @ReactInputSelection: React input selection module. Based on Selection.js,
+   * but modified to be suitable for react and has a couple of bug fixes (doesn't
+   * assume buttons have range selections allowed).
+   * Input selection module for React.
+   */
 
-  return domElement;
-}
-function createTextNode(text, rootContainerElement) {
-  return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
-}
-function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
-  var isCustomComponentTag = isCustomComponent(tag, rawProps);
-
-  {
-    validatePropertiesInDevelopment(tag, rawProps);
-
-    if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
-      warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
-      didWarnShadyDOM = true;
-    }
-  } // TODO: Make sure that we check isMounted before firing any of these events.
-
-
-  var props;
-
-  switch (tag) {
-    case 'iframe':
-    case 'object':
-    case 'embed':
-      trapBubbledEvent(TOP_LOAD, domElement);
-      props = rawProps;
-      break;
-
-    case 'video':
-    case 'audio':
-      // Create listener for each media event
-      for (var i = 0; i < mediaEventTypes.length; i++) {
-        trapBubbledEvent(mediaEventTypes[i], domElement);
-      }
-
-      props = rawProps;
-      break;
+  /**
+   * @hasSelectionCapabilities: we get the element types that support selection
+   * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`
+   * and `selectionEnd` rows.
+   */
 
-    case 'source':
-      trapBubbledEvent(TOP_ERROR, domElement);
-      props = rawProps;
-      break;
 
-    case 'img':
-    case 'image':
-    case 'link':
-      trapBubbledEvent(TOP_ERROR, domElement);
-      trapBubbledEvent(TOP_LOAD, domElement);
-      props = rawProps;
-      break;
+  function hasSelectionCapabilities(elem) {
+    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
+    return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');
+  }
+  function getSelectionInformation() {
+    var focusedElem = getActiveElementDeep();
+    return {
+      // Used by Flare
+      activeElementDetached: null,
+      focusedElem: focusedElem,
+      selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null
+    };
+  }
+  /**
+   * @restoreSelection: If any selection information was potentially lost,
+   * restore it. This is useful when performing operations that could remove dom
+   * nodes and place them back in, resulting in focus being lost.
+   */
 
-    case 'form':
-      trapBubbledEvent(TOP_RESET, domElement);
-      trapBubbledEvent(TOP_SUBMIT, domElement);
-      props = rawProps;
-      break;
+  function restoreSelection(priorSelectionInformation) {
+    var curFocusedElem = getActiveElementDeep();
+    var priorFocusedElem = priorSelectionInformation.focusedElem;
+    var priorSelectionRange = priorSelectionInformation.selectionRange;
 
-    case 'details':
-      trapBubbledEvent(TOP_TOGGLE, domElement);
-      props = rawProps;
-      break;
+    if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
+      if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {
+        setSelection(priorFocusedElem, priorSelectionRange);
+      } // Focusing a node can change the scroll position, which is undesirable
 
-    case 'input':
-      initWrapperState(domElement, rawProps);
-      props = getHostProps(domElement, rawProps);
-      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
-      // to onChange. Even if there is no listener.
 
-      ensureListeningTo(rootContainerElement, 'onChange');
-      break;
+      var ancestors = [];
+      var ancestor = priorFocusedElem;
 
-    case 'option':
-      validateProps(domElement, rawProps);
-      props = getHostProps$1(domElement, rawProps);
-      break;
+      while (ancestor = ancestor.parentNode) {
+        if (ancestor.nodeType === ELEMENT_NODE) {
+          ancestors.push({
+            element: ancestor,
+            left: ancestor.scrollLeft,
+            top: ancestor.scrollTop
+          });
+        }
+      }
 
-    case 'select':
-      initWrapperState$1(domElement, rawProps);
-      props = getHostProps$2(domElement, rawProps);
-      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
-      // to onChange. Even if there is no listener.
+      if (typeof priorFocusedElem.focus === 'function') {
+        priorFocusedElem.focus();
+      }
 
-      ensureListeningTo(rootContainerElement, 'onChange');
-      break;
+      for (var i = 0; i < ancestors.length; i++) {
+        var info = ancestors[i];
+        info.element.scrollLeft = info.left;
+        info.element.scrollTop = info.top;
+      }
+    }
+  }
+  /**
+   * @getSelection: Gets the selection bounds of a focused textarea, input or
+   * contentEditable node.
+   * -@input: Look up selection bounds of this input
+   * -@return {start: selectionStart, end: selectionEnd}
+   */
 
-    case 'textarea':
-      initWrapperState$2(domElement, rawProps);
-      props = getHostProps$3(domElement, rawProps);
-      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
-      // to onChange. Even if there is no listener.
+  function getSelection(input) {
+    var selection;
 
-      ensureListeningTo(rootContainerElement, 'onChange');
-      break;
+    if ('selectionStart' in input) {
+      // Modern browser with input or textarea.
+      selection = {
+        start: input.selectionStart,
+        end: input.selectionEnd
+      };
+    } else {
+      // Content editable or old IE textarea.
+      selection = getOffsets(input);
+    }
 
-    default:
-      props = rawProps;
+    return selection || {
+      start: 0,
+      end: 0
+    };
   }
+  /**
+   * @setSelection: Sets the selection bounds of a textarea or input and focuses
+   * the input.
+   * -@input     Set selection bounds of this input or textarea
+   * -@offsets   Object of same form that is returned from get*
+   */
 
-  assertValidProps(tag, props);
-  setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
-
-  switch (tag) {
-    case 'input':
-      // TODO: Make sure we check if this is still unmounted or do any clean
-      // up necessary since we never stop tracking anymore.
-      track(domElement);
-      postMountWrapper(domElement, rawProps, false);
-      break;
+  function setSelection(input, offsets) {
+    var start = offsets.start,
+        end = offsets.end;
 
-    case 'textarea':
-      // TODO: Make sure we check if this is still unmounted or do any clean
-      // up necessary since we never stop tracking anymore.
-      track(domElement);
-      postMountWrapper$3(domElement, rawProps);
-      break;
-
-    case 'option':
-      postMountWrapper$1(domElement, rawProps);
-      break;
-
-    case 'select':
-      postMountWrapper$2(domElement, rawProps);
-      break;
-
-    default:
-      if (typeof props.onClick === 'function') {
-        // TODO: This cast may not be sound for SVG, MathML or custom elements.
-        trapClickOnNonInteractiveElement(domElement);
-      }
-
-      break;
-  }
-} // Calculate the diff between the two objects.
+    if (end === undefined) {
+      end = start;
+    }
 
-function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
-  {
-    validatePropertiesInDevelopment(tag, nextRawProps);
+    if ('selectionStart' in input) {
+      input.selectionStart = start;
+      input.selectionEnd = Math.min(end, input.value.length);
+    } else {
+      setOffsets(input, offsets);
+    }
   }
 
-  var updatePayload = null;
-  var lastProps;
-  var nextProps;
+  var validateDOMNesting = function () {};
 
-  switch (tag) {
-    case 'input':
-      lastProps = getHostProps(domElement, lastRawProps);
-      nextProps = getHostProps(domElement, nextRawProps);
-      updatePayload = [];
-      break;
+  var updatedAncestorInfo = function () {};
 
-    case 'option':
-      lastProps = getHostProps$1(domElement, lastRawProps);
-      nextProps = getHostProps$1(domElement, nextRawProps);
-      updatePayload = [];
-      break;
-
-    case 'select':
-      lastProps = getHostProps$2(domElement, lastRawProps);
-      nextProps = getHostProps$2(domElement, nextRawProps);
-      updatePayload = [];
-      break;
+  {
+    // This validation code was written based on the HTML5 parsing spec:
+    // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
+    //
+    // Note: this does not catch all invalid nesting, nor does it try to (as it's
+    // not clear what practical benefit doing so provides); instead, we warn only
+    // for cases where the parser will give a parse tree differing from what React
+    // intended. For example, <b><div></div></b> is invalid but we don't warn
+    // because it still parses correctly; we do warn for other cases like nested
+    // <p> tags where the beginning of the second element implicitly closes the
+    // first, causing a confusing mess.
+    // https://html.spec.whatwg.org/multipage/syntax.html#special
+    var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
+
+    var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
+    // TODO: Distinguish by namespace here -- for <title>, including it here
+    // errs on the side of fewer warnings
+    'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
+
+    var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
+
+    var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
+    var emptyAncestorInfo = {
+      current: null,
+      formTag: null,
+      aTagInScope: null,
+      buttonTagInScope: null,
+      nobrTagInScope: null,
+      pTagInButtonScope: null,
+      listItemTagAutoclosing: null,
+      dlItemTagAutoclosing: null
+    };
 
-    case 'textarea':
-      lastProps = getHostProps$3(domElement, lastRawProps);
-      nextProps = getHostProps$3(domElement, nextRawProps);
-      updatePayload = [];
-      break;
+    updatedAncestorInfo = function (oldInfo, tag) {
+      var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);
 
-    default:
-      lastProps = lastRawProps;
-      nextProps = nextRawProps;
+      var info = {
+        tag: tag
+      };
 
-      if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
-        // TODO: This cast may not be sound for SVG, MathML or custom elements.
-        trapClickOnNonInteractiveElement(domElement);
+      if (inScopeTags.indexOf(tag) !== -1) {
+        ancestorInfo.aTagInScope = null;
+        ancestorInfo.buttonTagInScope = null;
+        ancestorInfo.nobrTagInScope = null;
       }
 
-      break;
-  }
+      if (buttonScopeTags.indexOf(tag) !== -1) {
+        ancestorInfo.pTagInButtonScope = null;
+      } // See rules for 'li', 'dd', 'dt' start tags in
+      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
 
-  assertValidProps(tag, nextProps);
-  var propKey;
-  var styleName;
-  var styleUpdates = null;
 
-  for (propKey in lastProps) {
-    if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
-      continue;
-    }
+      if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
+        ancestorInfo.listItemTagAutoclosing = null;
+        ancestorInfo.dlItemTagAutoclosing = null;
+      }
 
-    if (propKey === STYLE$1) {
-      var lastStyle = lastProps[propKey];
+      ancestorInfo.current = info;
 
-      for (styleName in lastStyle) {
-        if (lastStyle.hasOwnProperty(styleName)) {
-          if (!styleUpdates) {
-            styleUpdates = {};
-          }
+      if (tag === 'form') {
+        ancestorInfo.formTag = info;
+      }
 
-          styleUpdates[styleName] = '';
-        }
+      if (tag === 'a') {
+        ancestorInfo.aTagInScope = info;
       }
-    } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) {// Noop. This is handled by the clear text mechanism.
-    } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {// Noop
-    } else if (propKey === AUTOFOCUS) {// Noop. It doesn't work on updates anyway.
-    } else if (registrationNameModules.hasOwnProperty(propKey)) {
-      // This is a special case. If any listener updates we need to ensure
-      // that the "current" fiber pointer gets updated so we need a commit
-      // to update this element.
-      if (!updatePayload) {
-        updatePayload = [];
+
+      if (tag === 'button') {
+        ancestorInfo.buttonTagInScope = info;
       }
-    } else {
-      // For all other deleted properties we add it to the queue. We use
-      // the whitelist in the commit phase instead.
-      (updatePayload = updatePayload || []).push(propKey, null);
-    }
-  }
 
-  for (propKey in nextProps) {
-    var nextProp = nextProps[propKey];
-    var lastProp = lastProps != null ? lastProps[propKey] : undefined;
+      if (tag === 'nobr') {
+        ancestorInfo.nobrTagInScope = info;
+      }
 
-    if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
-      continue;
-    }
+      if (tag === 'p') {
+        ancestorInfo.pTagInButtonScope = info;
+      }
 
-    if (propKey === STYLE$1) {
-      {
-        if (nextProp) {
-          // Freeze the next style object so that we can assume it won't be
-          // mutated. We have already warned for this in the past.
-          Object.freeze(nextProp);
-        }
+      if (tag === 'li') {
+        ancestorInfo.listItemTagAutoclosing = info;
       }
 
-      if (lastProp) {
-        // Unset styles on `lastProp` but not on `nextProp`.
-        for (styleName in lastProp) {
-          if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
-            if (!styleUpdates) {
-              styleUpdates = {};
-            }
+      if (tag === 'dd' || tag === 'dt') {
+        ancestorInfo.dlItemTagAutoclosing = info;
+      }
 
-            styleUpdates[styleName] = '';
-          }
-        } // Update styles that changed since `lastProp`.
+      return ancestorInfo;
+    };
+    /**
+     * Returns whether
+     */
+
+
+    var isTagValidWithParent = function (tag, parentTag) {
+      // First, let's check if we're in an unusual parsing mode...
+      switch (parentTag) {
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
+        case 'select':
+          return tag === 'option' || tag === 'optgroup' || tag === '#text';
+
+        case 'optgroup':
+          return tag === 'option' || tag === '#text';
+        // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
+        // but
+
+        case 'option':
+          return tag === '#text';
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
+        // No special behavior since these rules fall back to "in body" mode for
+        // all except special table nodes which cause bad parsing behavior anyway.
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
+
+        case 'tr':
+          return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
+
+        case 'tbody':
+        case 'thead':
+        case 'tfoot':
+          return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
+
+        case 'colgroup':
+          return tag === 'col' || tag === 'template';
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
+
+        case 'table':
+          return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
+        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
+
+        case 'head':
+          return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
+        // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
+
+        case 'html':
+          return tag === 'head' || tag === 'body' || tag === 'frameset';
+
+        case 'frameset':
+          return tag === 'frame';
+
+        case '#document':
+          return tag === 'html';
+      } // Probably in the "in body" parsing mode, so we outlaw only tag combos
+      // where the parsing rules cause implicit opens or closes to be added.
+      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
+
+
+      switch (tag) {
+        case 'h1':
+        case 'h2':
+        case 'h3':
+        case 'h4':
+        case 'h5':
+        case 'h6':
+          return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
+
+        case 'rp':
+        case 'rt':
+          return impliedEndTags.indexOf(parentTag) === -1;
+
+        case 'body':
+        case 'caption':
+        case 'col':
+        case 'colgroup':
+        case 'frameset':
+        case 'frame':
+        case 'head':
+        case 'html':
+        case 'tbody':
+        case 'td':
+        case 'tfoot':
+        case 'th':
+        case 'thead':
+        case 'tr':
+          // These tags are only valid with a few parents that have special child
+          // parsing rules -- if we're down here, then none of those matched and
+          // so we allow it only if we don't know what the parent is, as all other
+          // cases are invalid.
+          return parentTag == null;
+      }
+
+      return true;
+    };
+    /**
+     * Returns whether
+     */
+
+
+    var findInvalidAncestorForTag = function (tag, ancestorInfo) {
+      switch (tag) {
+        case 'address':
+        case 'article':
+        case 'aside':
+        case 'blockquote':
+        case 'center':
+        case 'details':
+        case 'dialog':
+        case 'dir':
+        case 'div':
+        case 'dl':
+        case 'fieldset':
+        case 'figcaption':
+        case 'figure':
+        case 'footer':
+        case 'header':
+        case 'hgroup':
+        case 'main':
+        case 'menu':
+        case 'nav':
+        case 'ol':
+        case 'p':
+        case 'section':
+        case 'summary':
+        case 'ul':
+        case 'pre':
+        case 'listing':
+        case 'table':
+        case 'hr':
+        case 'xmp':
+        case 'h1':
+        case 'h2':
+        case 'h3':
+        case 'h4':
+        case 'h5':
+        case 'h6':
+          return ancestorInfo.pTagInButtonScope;
+
+        case 'form':
+          return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
+
+        case 'li':
+          return ancestorInfo.listItemTagAutoclosing;
+
+        case 'dd':
+        case 'dt':
+          return ancestorInfo.dlItemTagAutoclosing;
+
+        case 'button':
+          return ancestorInfo.buttonTagInScope;
+
+        case 'a':
+          // Spec says something about storing a list of markers, but it sounds
+          // equivalent to this check.
+          return ancestorInfo.aTagInScope;
+
+        case 'nobr':
+          return ancestorInfo.nobrTagInScope;
+      }
 
+      return null;
+    };
 
-        for (styleName in nextProp) {
-          if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
-            if (!styleUpdates) {
-              styleUpdates = {};
-            }
+    var didWarn$1 = {};
 
-            styleUpdates[styleName] = nextProp[styleName];
-          }
-        }
-      } else {
-        // Relies on `updateStylesByID` not mutating `styleUpdates`.
-        if (!styleUpdates) {
-          if (!updatePayload) {
-            updatePayload = [];
-          }
+    validateDOMNesting = function (childTag, childText, ancestorInfo) {
+      ancestorInfo = ancestorInfo || emptyAncestorInfo;
+      var parentInfo = ancestorInfo.current;
+      var parentTag = parentInfo && parentInfo.tag;
 
-          updatePayload.push(propKey, styleUpdates);
+      if (childText != null) {
+        if (childTag != null) {
+          error('validateDOMNesting: when childText is passed, childTag should be null');
         }
 
-        styleUpdates = nextProp;
+        childTag = '#text';
       }
-    } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
-      var nextHtml = nextProp ? nextProp[HTML] : undefined;
-      var lastHtml = lastProp ? lastProp[HTML] : undefined;
 
-      if (nextHtml != null) {
-        if (lastHtml !== nextHtml) {
-          (updatePayload = updatePayload || []).push(propKey, toStringOrTrustedType(nextHtml));
-        }
-      } else {// TODO: It might be too late to clear this if we have children
-        // inserted already.
-      }
-    } else if (propKey === CHILDREN) {
-      if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {
-        (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
-      }
-    } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {// Noop
-    } else if (registrationNameModules.hasOwnProperty(propKey)) {
-      if (nextProp != null) {
-        // We eagerly listen to this even though we haven't committed yet.
-        if (true && typeof nextProp !== 'function') {
-          warnForInvalidEventListener(propKey, nextProp);
-        }
+      var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
+      var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
+      var invalidParentOrAncestor = invalidParent || invalidAncestor;
 
-        ensureListeningTo(rootContainerElement, propKey);
+      if (!invalidParentOrAncestor) {
+        return;
       }
 
-      if (!updatePayload && lastProp !== nextProp) {
-        // This is a special case. If any listener updates we need to ensure
-        // that the "current" props pointer gets updated so we need a commit
-        // to update this element.
-        updatePayload = [];
+      var ancestorTag = invalidParentOrAncestor.tag;
+      var addendum = getCurrentFiberStackInDev();
+      var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;
+
+      if (didWarn$1[warnKey]) {
+        return;
       }
-    } else {
-      // For any other property we always add it to the queue and then we
-      // filter it out using the whitelist during the commit.
-      (updatePayload = updatePayload || []).push(propKey, nextProp);
-    }
-  }
 
-  if (styleUpdates) {
-    {
-      validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE$1]);
-    }
+      didWarn$1[warnKey] = true;
+      var tagDisplayName = childTag;
+      var whitespaceInfo = '';
 
-    (updatePayload = updatePayload || []).push(STYLE$1, styleUpdates);
-  }
+      if (childTag === '#text') {
+        if (/\S/.test(childText)) {
+          tagDisplayName = 'Text nodes';
+        } else {
+          tagDisplayName = 'Whitespace text nodes';
+          whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
+        }
+      } else {
+        tagDisplayName = '<' + childTag + '>';
+      }
+
+      if (invalidParent) {
+        var info = '';
 
-  return updatePayload;
-} // Apply the diff.
+        if (ancestorTag === 'table' && childTag === 'tr') {
+          info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';
+        }
 
-function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
-  // Update checked *before* name.
-  // In the middle of an update, it is possible to have multiple checked.
-  // When a checked radio tries to change name, browser makes another radio's checked false.
-  if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
-    updateChecked(domElement, nextRawProps);
+        error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);
+      } else {
+        error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);
+      }
+    };
   }
 
-  var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
-  var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.
+  var SUPPRESS_HYDRATION_WARNING$1;
 
-  updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props
-  // changed.
+  {
+    SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';
+  }
 
-  switch (tag) {
-    case 'input':
-      // Update the wrapper around inputs *after* updating props. This has to
-      // happen after `updateDOMProperties`. Otherwise HTML5 input validations
-      // raise warnings and prevent the new value from being assigned.
-      updateWrapper(domElement, nextRawProps);
-      break;
+  var SUSPENSE_START_DATA = '$';
+  var SUSPENSE_END_DATA = '/$';
+  var SUSPENSE_PENDING_START_DATA = '$?';
+  var SUSPENSE_FALLBACK_START_DATA = '$!';
+  var STYLE$1 = 'style';
+  var eventsEnabled = null;
+  var selectionInformation = null;
 
-    case 'textarea':
-      updateWrapper$1(domElement, nextRawProps);
-      break;
+  function shouldAutoFocusHostComponent(type, props) {
+    switch (type) {
+      case 'button':
+      case 'input':
+      case 'select':
+      case 'textarea':
+        return !!props.autoFocus;
+    }
 
-    case 'select':
-      // <select> value update needs to occur after <option> children
-      // reconciliation
-      postUpdateWrapper(domElement, nextRawProps);
-      break;
+    return false;
   }
-}
+  function getRootHostContext(rootContainerInstance) {
+    var type;
+    var namespace;
+    var nodeType = rootContainerInstance.nodeType;
 
-function getPossibleStandardName(propName) {
-  {
-    var lowerCasedName = propName.toLowerCase();
+    switch (nodeType) {
+      case DOCUMENT_NODE:
+      case DOCUMENT_FRAGMENT_NODE:
+        {
+          type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
+          var root = rootContainerInstance.documentElement;
+          namespace = root ? root.namespaceURI : getChildNamespace(null, '');
+          break;
+        }
 
-    if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
-      return null;
+      default:
+        {
+          var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
+          var ownNamespace = container.namespaceURI || null;
+          type = container.tagName;
+          namespace = getChildNamespace(ownNamespace, type);
+          break;
+        }
     }
 
-    return possibleStandardNames[lowerCasedName] || null;
+    {
+      var validatedTag = type.toLowerCase();
+      var ancestorInfo = updatedAncestorInfo(null, validatedTag);
+      return {
+        namespace: namespace,
+        ancestorInfo: ancestorInfo
+      };
+    }
+  }
+  function getChildHostContext(parentHostContext, type, rootContainerInstance) {
+    {
+      var parentHostContextDev = parentHostContext;
+      var namespace = getChildNamespace(parentHostContextDev.namespace, type);
+      var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
+      return {
+        namespace: namespace,
+        ancestorInfo: ancestorInfo
+      };
+    }
+  }
+  function getPublicInstance(instance) {
+    return instance;
   }
+  function prepareForCommit(containerInfo) {
+    eventsEnabled = isEnabled();
+    selectionInformation = getSelectionInformation();
+    setEnabled(false);
+  }
+  function resetAfterCommit(containerInfo) {
+    restoreSelection(selectionInformation);
+    setEnabled(eventsEnabled);
+    eventsEnabled = null;
 
-  return null;
-}
+    selectionInformation = null;
+  }
+  function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
+    var parentNamespace;
 
-function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {
-  var isCustomComponentTag;
-  var extraAttributeNames;
+    {
+      // TODO: take namespace into account when validating.
+      var hostContextDev = hostContext;
+      validateDOMNesting(type, null, hostContextDev.ancestorInfo);
 
-  {
-    suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING$1] === true;
-    isCustomComponentTag = isCustomComponent(tag, rawProps);
-    validatePropertiesInDevelopment(tag, rawProps);
+      if (typeof props.children === 'string' || typeof props.children === 'number') {
+        var string = '' + props.children;
+        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
+        validateDOMNesting(null, string, ownAncestorInfo);
+      }
 
-    if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {
-      warning$1(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
-      didWarnShadyDOM = true;
+      parentNamespace = hostContextDev.namespace;
     }
-  } // TODO: Make sure that we check isMounted before firing any of these events.
-
 
-  switch (tag) {
-    case 'iframe':
-    case 'object':
-    case 'embed':
-      trapBubbledEvent(TOP_LOAD, domElement);
-      break;
+    var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
+    precacheFiberNode(internalInstanceHandle, domElement);
+    updateFiberProps(domElement, props);
+    return domElement;
+  }
+  function appendInitialChild(parentInstance, child) {
+    parentInstance.appendChild(child);
+  }
+  function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
+    setInitialProperties(domElement, type, props, rootContainerInstance);
+    return shouldAutoFocusHostComponent(type, props);
+  }
+  function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
+    {
+      var hostContextDev = hostContext;
 
-    case 'video':
-    case 'audio':
-      // Create listener for each media event
-      for (var i = 0; i < mediaEventTypes.length; i++) {
-        trapBubbledEvent(mediaEventTypes[i], domElement);
+      if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
+        var string = '' + newProps.children;
+        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
+        validateDOMNesting(null, string, ownAncestorInfo);
       }
+    }
 
-      break;
+    return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);
+  }
+  function shouldSetTextContent(type, props) {
+    return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
+  }
+  function shouldDeprioritizeSubtree(type, props) {
+    return !!props.hidden;
+  }
+  function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
+    {
+      var hostContextDev = hostContext;
+      validateDOMNesting(null, text, hostContextDev.ancestorInfo);
+    }
 
-    case 'source':
-      trapBubbledEvent(TOP_ERROR, domElement);
-      break;
+    var textNode = createTextNode(text, rootContainerInstance);
+    precacheFiberNode(internalInstanceHandle, textNode);
+    return textNode;
+  }
+  // if a component just imports ReactDOM (e.g. for findDOMNode).
+  // Some environments might not have setTimeout or clearTimeout.
 
-    case 'img':
-    case 'image':
-    case 'link':
-      trapBubbledEvent(TOP_ERROR, domElement);
-      trapBubbledEvent(TOP_LOAD, domElement);
-      break;
+  var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
+  var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
+  var noTimeout = -1; // -------------------
+  function commitMount(domElement, type, newProps, internalInstanceHandle) {
+    // Despite the naming that might imply otherwise, this method only
+    // fires if there is an `Update` effect scheduled during mounting.
+    // This happens if `finalizeInitialChildren` returns `true` (which it
+    // does to implement the `autoFocus` attribute on the client). But
+    // there are also other cases when this might happen (such as patching
+    // up text content during hydration mismatch). So we'll check this again.
+    if (shouldAutoFocusHostComponent(type, newProps)) {
+      domElement.focus();
+    }
+  }
+  function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
+    // Update the props handle so that we know which props are the ones with
+    // with current event handlers.
+    updateFiberProps(domElement, newProps); // Apply the diff to the DOM node.
 
-    case 'form':
-      trapBubbledEvent(TOP_RESET, domElement);
-      trapBubbledEvent(TOP_SUBMIT, domElement);
-      break;
+    updateProperties(domElement, updatePayload, type, oldProps, newProps);
+  }
+  function resetTextContent(domElement) {
+    setTextContent(domElement, '');
+  }
+  function commitTextUpdate(textInstance, oldText, newText) {
+    textInstance.nodeValue = newText;
+  }
+  function appendChild(parentInstance, child) {
+    parentInstance.appendChild(child);
+  }
+  function appendChildToContainer(container, child) {
+    var parentNode;
 
-    case 'details':
-      trapBubbledEvent(TOP_TOGGLE, domElement);
-      break;
+    if (container.nodeType === COMMENT_NODE) {
+      parentNode = container.parentNode;
+      parentNode.insertBefore(child, container);
+    } else {
+      parentNode = container;
+      parentNode.appendChild(child);
+    } // This container might be used for a portal.
+    // If something inside a portal is clicked, that click should bubble
+    // through the React tree. However, on Mobile Safari the click would
+    // never bubble through the *DOM* tree unless an ancestor with onclick
+    // event exists. So we wouldn't see it and dispatch it.
+    // This is why we ensure that non React root containers have inline onclick
+    // defined.
+    // https://github.com/facebook/react/issues/11918
 
-    case 'input':
-      initWrapperState(domElement, rawProps);
-      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
-      // to onChange. Even if there is no listener.
 
-      ensureListeningTo(rootContainerElement, 'onChange');
-      break;
+    var reactRootContainer = container._reactRootContainer;
 
-    case 'option':
-      validateProps(domElement, rawProps);
-      break;
+    if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
+      // TODO: This cast may not be sound for SVG, MathML or custom elements.
+      trapClickOnNonInteractiveElement(parentNode);
+    }
+  }
+  function insertBefore(parentInstance, child, beforeChild) {
+    parentInstance.insertBefore(child, beforeChild);
+  }
+  function insertInContainerBefore(container, child, beforeChild) {
+    if (container.nodeType === COMMENT_NODE) {
+      container.parentNode.insertBefore(child, beforeChild);
+    } else {
+      container.insertBefore(child, beforeChild);
+    }
+  }
+  function removeChild(parentInstance, child) {
+    parentInstance.removeChild(child);
+  }
+  function removeChildFromContainer(container, child) {
+    if (container.nodeType === COMMENT_NODE) {
+      container.parentNode.removeChild(child);
+    } else {
+      container.removeChild(child);
+    }
+  }
 
-    case 'select':
-      initWrapperState$1(domElement, rawProps);
-      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
-      // to onChange. Even if there is no listener.
+  function hideInstance(instance) {
+    // pass host context to this method?
 
-      ensureListeningTo(rootContainerElement, 'onChange');
-      break;
 
-    case 'textarea':
-      initWrapperState$2(domElement, rawProps);
-      trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening
-      // to onChange. Even if there is no listener.
+    instance = instance;
+    var style = instance.style;
 
-      ensureListeningTo(rootContainerElement, 'onChange');
-      break;
+    if (typeof style.setProperty === 'function') {
+      style.setProperty('display', 'none', 'important');
+    } else {
+      style.display = 'none';
+    }
   }
+  function hideTextInstance(textInstance) {
+    textInstance.nodeValue = '';
+  }
+  function unhideInstance(instance, props) {
+    instance = instance;
+    var styleProp = props[STYLE$1];
+    var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
+    instance.style.display = dangerousStyleValue('display', display);
+  }
+  function unhideTextInstance(textInstance, text) {
+    textInstance.nodeValue = text;
+  } // -------------------
+  function canHydrateInstance(instance, type, props) {
+    if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
+      return null;
+    } // This has now been refined to an element node.
 
-  assertValidProps(tag, rawProps);
-
-  {
-    extraAttributeNames = new Set();
-    var attributes = domElement.attributes;
-
-    for (var _i = 0; _i < attributes.length; _i++) {
-      var name = attributes[_i].name.toLowerCase();
 
-      switch (name) {
-        // Built-in SSR attribute is whitelisted
-        case 'data-reactroot':
-          break;
-        // Controlled attributes are not validated
-        // TODO: Only ignore them on controlled tags.
+    return instance;
+  }
+  function canHydrateTextInstance(instance, text) {
+    if (text === '' || instance.nodeType !== TEXT_NODE) {
+      // Empty strings are not parsed by HTML so there won't be a correct match here.
+      return null;
+    } // This has now been refined to a text node.
 
-        case 'value':
-          break;
 
-        case 'checked':
-          break;
+    return instance;
+  }
+  function isSuspenseInstancePending(instance) {
+    return instance.data === SUSPENSE_PENDING_START_DATA;
+  }
+  function isSuspenseInstanceFallback(instance) {
+    return instance.data === SUSPENSE_FALLBACK_START_DATA;
+  }
 
-        case 'selected':
-          break;
+  function getNextHydratable(node) {
+    // Skip non-hydratable nodes.
+    for (; node != null; node = node.nextSibling) {
+      var nodeType = node.nodeType;
 
-        default:
-          // Intentionally use the original name.
-          // See discussion in https://github.com/facebook/react/pull/10676.
-          extraAttributeNames.add(attributes[_i].name);
+      if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {
+        break;
       }
     }
+
+    return node;
+  }
+
+  function getNextHydratableSibling(instance) {
+    return getNextHydratable(instance.nextSibling);
+  }
+  function getFirstHydratableChild(parentInstance) {
+    return getNextHydratable(parentInstance.firstChild);
   }
+  function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
+    precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events
+    // get attached.
 
-  var updatePayload = null;
+    updateFiberProps(instance, props);
+    var parentNamespace;
 
-  for (var propKey in rawProps) {
-    if (!rawProps.hasOwnProperty(propKey)) {
-      continue;
+    {
+      var hostContextDev = hostContext;
+      parentNamespace = hostContextDev.namespace;
     }
 
-    var nextProp = rawProps[propKey];
+    return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);
+  }
+  function hydrateTextInstance(textInstance, text, internalInstanceHandle) {
+    precacheFiberNode(internalInstanceHandle, textInstance);
+    return diffHydratedText(textInstance, text);
+  }
+  function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
+    var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.
+    // There might be nested nodes so we need to keep track of how
+    // deep we are and only break out when we're back on top.
 
-    if (propKey === CHILDREN) {
-      // For text content children we compare against textContent. This
-      // might match additional HTML that is hidden when we read it using
-      // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
-      // satisfies our requirement. Our requirement is not to produce perfect
-      // HTML and attributes. Ideally we should preserve structure but it's
-      // ok not to if the visible content is still enough to indicate what
-      // even listeners these nodes might be wired up to.
-      // TODO: Warn if there is more than a single textNode as a child.
-      // TODO: Should we use domElement.firstChild.nodeValue to compare?
-      if (typeof nextProp === 'string') {
-        if (domElement.textContent !== nextProp) {
-          if (true && !suppressHydrationWarning) {
-            warnForTextDifference(domElement.textContent, nextProp);
-          }
+    var depth = 0;
 
-          updatePayload = [CHILDREN, nextProp];
-        }
-      } else if (typeof nextProp === 'number') {
-        if (domElement.textContent !== '' + nextProp) {
-          if (true && !suppressHydrationWarning) {
-            warnForTextDifference(domElement.textContent, nextProp);
-          }
+    while (node) {
+      if (node.nodeType === COMMENT_NODE) {
+        var data = node.data;
 
-          updatePayload = [CHILDREN, '' + nextProp];
-        }
-      }
-    } else if (registrationNameModules.hasOwnProperty(propKey)) {
-      if (nextProp != null) {
-        if (true && typeof nextProp !== 'function') {
-          warnForInvalidEventListener(propKey, nextProp);
+        if (data === SUSPENSE_END_DATA) {
+          if (depth === 0) {
+            return getNextHydratableSibling(node);
+          } else {
+            depth--;
+          }
+        } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
+          depth++;
         }
-
-        ensureListeningTo(rootContainerElement, propKey);
       }
-    } else if (true && // Convince Flow we've calculated it (it's DEV-only in this method.)
-    typeof isCustomComponentTag === 'boolean') {
-      // Validate that the properties correspond to their expected values.
-      var serverValue = void 0;
-      var propertyInfo = getPropertyInfo(propKey);
 
-      if (suppressHydrationWarning) {// Don't bother comparing. We're ignoring all these warnings.
-      } else if (enableFlareAPI && propKey === LISTENERS || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || // Controlled attributes are not validated
-      // TODO: Only ignore them on controlled tags.
-      propKey === 'value' || propKey === 'checked' || propKey === 'selected') {// Noop
-      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
-        var serverHTML = domElement.innerHTML;
-        var nextHtml = nextProp ? nextProp[HTML] : undefined;
-        var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');
-
-        if (expectedHTML !== serverHTML) {
-          warnForPropDifference(propKey, serverHTML, expectedHTML);
-        }
-      } else if (propKey === STYLE$1) {
-        // $FlowFixMe - Should be inferred as not undefined.
-        extraAttributeNames.delete(propKey);
+      node = node.nextSibling;
+    } // TODO: Warn, we didn't find the end comment boundary.
 
-        if (canDiffStyleForHydrationWarning) {
-          var expectedStyle = createDangerousStringForStyles(nextProp);
-          serverValue = domElement.getAttribute('style');
 
-          if (expectedStyle !== serverValue) {
-            warnForPropDifference(propKey, serverValue, expectedStyle);
-          }
-        }
-      } else if (isCustomComponentTag) {
-        // $FlowFixMe - Should be inferred as not undefined.
-        extraAttributeNames.delete(propKey.toLowerCase());
-        serverValue = getValueForAttribute(domElement, propKey, nextProp);
+    return null;
+  } // Returns the SuspenseInstance if this node is a direct child of a
+  // SuspenseInstance. I.e. if its previous sibling is a Comment with
+  // SUSPENSE_x_START_DATA. Otherwise, null.
 
-        if (nextProp !== serverValue) {
-          warnForPropDifference(propKey, serverValue, nextProp);
-        }
-      } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
-        var isMismatchDueToBadCasing = false;
+  function getParentSuspenseInstance(targetInstance) {
+    var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.
+    // There might be nested nodes so we need to keep track of how
+    // deep we are and only break out when we're back on top.
 
-        if (propertyInfo !== null) {
-          // $FlowFixMe - Should be inferred as not undefined.
-          extraAttributeNames.delete(propertyInfo.attributeName);
-          serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
-        } else {
-          var ownNamespace = parentNamespace;
+    var depth = 0;
 
-          if (ownNamespace === HTML_NAMESPACE) {
-            ownNamespace = getIntrinsicNamespace(tag);
-          }
+    while (node) {
+      if (node.nodeType === COMMENT_NODE) {
+        var data = node.data;
 
-          if (ownNamespace === HTML_NAMESPACE) {
-            // $FlowFixMe - Should be inferred as not undefined.
-            extraAttributeNames.delete(propKey.toLowerCase());
+        if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
+          if (depth === 0) {
+            return node;
           } else {
-            var standardName = getPossibleStandardName(propKey);
-
-            if (standardName !== null && standardName !== propKey) {
-              // If an SVG prop is supplied with bad casing, it will
-              // be successfully parsed from HTML, but will produce a mismatch
-              // (and would be incorrectly rendered on the client).
-              // However, we already warn about bad casing elsewhere.
-              // So we'll skip the misleading extra mismatch warning in this case.
-              isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.
-
-              extraAttributeNames.delete(standardName);
-            } // $FlowFixMe - Should be inferred as not undefined.
-
-
-            extraAttributeNames.delete(propKey);
+            depth--;
           }
-
-          serverValue = getValueForAttribute(domElement, propKey, nextProp);
-        }
-
-        if (nextProp !== serverValue && !isMismatchDueToBadCasing) {
-          warnForPropDifference(propKey, serverValue, nextProp);
+        } else if (data === SUSPENSE_END_DATA) {
+          depth++;
         }
       }
+
+      node = node.previousSibling;
     }
-  }
 
-  {
-    // $FlowFixMe - Should be inferred as not undefined.
-    if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {
-      // $FlowFixMe - Should be inferred as not undefined.
-      warnForExtraAttributes(extraAttributeNames);
-    }
-  }
-
-  switch (tag) {
-    case 'input':
-      // TODO: Make sure we check if this is still unmounted or do any clean
-      // up necessary since we never stop tracking anymore.
-      track(domElement);
-      postMountWrapper(domElement, rawProps, true);
-      break;
-
-    case 'textarea':
-      // TODO: Make sure we check if this is still unmounted or do any clean
-      // up necessary since we never stop tracking anymore.
-      track(domElement);
-      postMountWrapper$3(domElement, rawProps);
-      break;
-
-    case 'select':
-    case 'option':
-      // For input and textarea we current always set the value property at
-      // post mount to force it to diverge from attributes. However, for
-      // option and select we don't quite do the same thing and select
-      // is not resilient to the DOM state changing so we don't do that here.
-      // TODO: Consider not doing this for input and textarea.
-      break;
-
-    default:
-      if (typeof rawProps.onClick === 'function') {
-        // TODO: This cast may not be sound for SVG, MathML or custom elements.
-        trapClickOnNonInteractiveElement(domElement);
-      }
-
-      break;
-  }
-
-  return updatePayload;
-}
-function diffHydratedText(textNode, text) {
-  var isDifferent = textNode.nodeValue !== text;
-  return isDifferent;
-}
-function warnForUnmatchedText(textNode, text) {
-  {
-    warnForTextDifference(textNode.nodeValue, text);
+    return null;
   }
-}
-function warnForDeletedHydratableElement(parentNode, child) {
-  {
-    if (didWarnInvalidHydration) {
-      return;
+  function commitHydratedContainer(container) {
+    // Retry if any event replaying was blocked on this.
+    retryIfBlockedOn(container);
+  }
+  function commitHydratedSuspenseInstance(suspenseInstance) {
+    // Retry if any event replaying was blocked on this.
+    retryIfBlockedOn(suspenseInstance);
+  }
+  function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {
+    {
+      warnForUnmatchedText(textInstance, text);
     }
-
-    didWarnInvalidHydration = true;
-    warningWithoutStack$1(false, 'Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
   }
-}
-function warnForDeletedHydratableText(parentNode, child) {
-  {
-    if (didWarnInvalidHydration) {
-      return;
+  function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {
+    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
+      warnForUnmatchedText(textInstance, text);
     }
-
-    didWarnInvalidHydration = true;
-    warningWithoutStack$1(false, 'Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
   }
-}
-function warnForInsertedHydratedElement(parentNode, tag, props) {
-  {
-    if (didWarnInvalidHydration) {
-      return;
+  function didNotHydrateContainerInstance(parentContainer, instance) {
+    {
+      if (instance.nodeType === ELEMENT_NODE) {
+        warnForDeletedHydratableElement(parentContainer, instance);
+      } else if (instance.nodeType === COMMENT_NODE) ; else {
+        warnForDeletedHydratableText(parentContainer, instance);
+      }
     }
-
-    didWarnInvalidHydration = true;
-    warningWithoutStack$1(false, 'Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
   }
-}
-function warnForInsertedHydratedText(parentNode, text) {
-  {
-    if (text === '') {
-      // We expect to insert empty text nodes since they're not represented in
-      // the HTML.
-      // TODO: Remove this special case if we can just avoid inserting empty
-      // text nodes.
-      return;
+  function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {
+    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
+      if (instance.nodeType === ELEMENT_NODE) {
+        warnForDeletedHydratableElement(parentInstance, instance);
+      } else if (instance.nodeType === COMMENT_NODE) ; else {
+        warnForDeletedHydratableText(parentInstance, instance);
+      }
     }
-
-    if (didWarnInvalidHydration) {
-      return;
+  }
+  function didNotFindHydratableContainerInstance(parentContainer, type, props) {
+    {
+      warnForInsertedHydratedElement(parentContainer, type);
     }
-
-    didWarnInvalidHydration = true;
-    warningWithoutStack$1(false, 'Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
   }
-}
-function restoreControlledState$$1(domElement, tag, props) {
-  switch (tag) {
-    case 'input':
-      restoreControlledState$1(domElement, props);
-      return;
-
-    case 'textarea':
-      restoreControlledState$3(domElement, props);
-      return;
+  function didNotFindHydratableContainerTextInstance(parentContainer, text) {
+    {
+      warnForInsertedHydratedText(parentContainer, text);
+    }
+  }
+  function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {
+    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
+      warnForInsertedHydratedElement(parentInstance, type);
+    }
+  }
+  function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {
+    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
+      warnForInsertedHydratedText(parentInstance, text);
+    }
+  }
+  function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {
+    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ;
+  }
 
-    case 'select':
-      restoreControlledState$2(domElement, props);
-      return;
+  var randomKey = Math.random().toString(36).slice(2);
+  var internalInstanceKey = '__reactInternalInstance$' + randomKey;
+  var internalEventHandlersKey = '__reactEventHandlers$' + randomKey;
+  var internalContainerInstanceKey = '__reactContainere$' + randomKey;
+  function precacheFiberNode(hostInst, node) {
+    node[internalInstanceKey] = hostInst;
+  }
+  function markContainerAsRoot(hostRoot, node) {
+    node[internalContainerInstanceKey] = hostRoot;
+  }
+  function unmarkContainerAsRoot(node) {
+    node[internalContainerInstanceKey] = null;
   }
-}
-function listenToEventResponderEventTypes(eventTypes, element) {
-  if (enableFlareAPI) {
-    // Get the listening Set for this element. We use this to track
-    // what events we're listening to.
-    var listeningSet = getListeningSetForElement(element); // Go through each target event type of the event responder
+  function isContainerMarkedAsRoot(node) {
+    return !!node[internalContainerInstanceKey];
+  } // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.
+  // If the target node is part of a hydrated or not yet rendered subtree, then
+  // this may also return a SuspenseComponent or HostRoot to indicate that.
+  // Conceptually the HostRoot fiber is a child of the Container node. So if you
+  // pass the Container node as the targetNode, you will not actually get the
+  // HostRoot back. To get to the HostRoot, you need to pass a child of it.
+  // The same thing applies to Suspense boundaries.
 
-    for (var i = 0, length = eventTypes.length; i < length; ++i) {
-      var eventType = eventTypes[i];
-      var isPassive = !endsWith(eventType, '_active');
-      var eventKey = isPassive ? eventType + '_passive' : eventType;
-      var targetEventType = isPassive ? eventType : eventType.substring(0, eventType.length - 7);
+  function getClosestInstanceFromNode(targetNode) {
+    var targetInst = targetNode[internalInstanceKey];
 
-      if (!listeningSet.has(eventKey)) {
-        trapEventForResponderEventSystem(element, targetEventType, isPassive);
-        listeningSet.add(eventKey);
-      }
-    }
-  }
-} // We can remove this once the event API is stable and out of a flag
+    if (targetInst) {
+      // Don't return HostRoot or SuspenseComponent here.
+      return targetInst;
+    } // If the direct event target isn't a React owned DOM node, we need to look
+    // to see if one of its parents is a React owned DOM node.
+
+
+    var parentNode = targetNode.parentNode;
+
+    while (parentNode) {
+      // We'll check if this is a container root that could include
+      // React nodes in the future. We need to check this first because
+      // if we're a child of a dehydrated container, we need to first
+      // find that inner container before moving on to finding the parent
+      // instance. Note that we don't check this field on  the targetNode
+      // itself because the fibers are conceptually between the container
+      // node and the first child. It isn't surrounding the container node.
+      // If it's not a container, we check if it's an instance.
+      targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];
+
+      if (targetInst) {
+        // Since this wasn't the direct target of the event, we might have
+        // stepped past dehydrated DOM nodes to get here. However they could
+        // also have been non-React nodes. We need to answer which one.
+        // If we the instance doesn't have any children, then there can't be
+        // a nested suspense boundary within it. So we can use this as a fast
+        // bailout. Most of the time, when people add non-React children to
+        // the tree, it is using a ref to a child-less DOM node.
+        // Normally we'd only need to check one of the fibers because if it
+        // has ever gone from having children to deleting them or vice versa
+        // it would have deleted the dehydrated boundary nested inside already.
+        // However, since the HostRoot starts out with an alternate it might
+        // have one on the alternate so we need to check in case this was a
+        // root.
+        var alternate = targetInst.alternate;
+
+        if (targetInst.child !== null || alternate !== null && alternate.child !== null) {
+          // Next we need to figure out if the node that skipped past is
+          // nested within a dehydrated boundary and if so, which one.
+          var suspenseInstance = getParentSuspenseInstance(targetNode);
+
+          while (suspenseInstance !== null) {
+            // We found a suspense instance. That means that we haven't
+            // hydrated it yet. Even though we leave the comments in the
+            // DOM after hydrating, and there are boundaries in the DOM
+            // that could already be hydrated, we wouldn't have found them
+            // through this pass since if the target is hydrated it would
+            // have had an internalInstanceKey on it.
+            // Let's get the fiber associated with the SuspenseComponent
+            // as the deepest instance.
+            var targetSuspenseInst = suspenseInstance[internalInstanceKey];
+
+            if (targetSuspenseInst) {
+              return targetSuspenseInst;
+            } // If we don't find a Fiber on the comment, it might be because
+            // we haven't gotten to hydrate it yet. There might still be a
+            // parent boundary that hasn't above this one so we need to find
+            // the outer most that is known.
+
+
+            suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent
+            // host component also hasn't hydrated yet. We can return it
+            // below since it will bail out on the isMounted check later.
+          }
+        }
 
-if (enableFlareAPI) {
-  setListenToResponderEventTypes(listenToEventResponderEventTypes);
-}
+        return targetInst;
+      }
 
-function getActiveElement(doc) {
-  doc = doc || (typeof document !== 'undefined' ? document : undefined);
+      targetNode = parentNode;
+      parentNode = targetNode.parentNode;
+    }
 
-  if (typeof doc === 'undefined') {
     return null;
   }
+  /**
+   * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
+   * instance, or null if the node was not rendered by this React.
+   */
 
-  try {
-    return doc.activeElement || doc.body;
-  } catch (e) {
-    return doc.body;
-  }
-}
+  function getInstanceFromNode$1(node) {
+    var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];
 
-/**
- * Given any node return the first leaf node without children.
- *
- * @param {DOMElement|DOMTextNode} node
- * @return {DOMElement|DOMTextNode}
- */
+    if (inst) {
+      if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {
+        return inst;
+      } else {
+        return null;
+      }
+    }
 
-function getLeafNode(node) {
-  while (node && node.firstChild) {
-    node = node.firstChild;
+    return null;
   }
+  /**
+   * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
+   * DOM node.
+   */
 
-  return node;
-}
-/**
- * Get the next sibling within a container. This will walk up the
- * DOM if a node's siblings have been exhausted.
- *
- * @param {DOMElement|DOMTextNode} node
- * @return {?DOMElement|DOMTextNode}
- */
+  function getNodeFromInstance$1(inst) {
+    if (inst.tag === HostComponent || inst.tag === HostText) {
+      // In Fiber this, is just the state node right now. We assume it will be
+      // a host component or host text.
+      return inst.stateNode;
+    } // Without this first invariant, passing a non-DOM-component triggers the next
+    // invariant for a missing parent, which is super confusing.
 
 
-function getSiblingNode(node) {
-  while (node) {
-    if (node.nextSibling) {
-      return node.nextSibling;
+    {
+      {
+        throw Error( "getNodeFromInstance: Invalid argument." );
+      }
     }
-
-    node = node.parentNode;
   }
-}
-/**
- * Get object describing the nodes which contain characters at offset.
- *
- * @param {DOMElement|DOMTextNode} root
- * @param {number} offset
- * @return {?object}
- */
+  function getFiberCurrentPropsFromNode$1(node) {
+    return node[internalEventHandlersKey] || null;
+  }
+  function updateFiberProps(node, props) {
+    node[internalEventHandlersKey] = props;
+  }
 
+  function getParent(inst) {
+    do {
+      inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.
+      // That is depending on if we want nested subtrees (layers) to bubble
+      // events to their parent. We could also go through parentNode on the
+      // host node but that wouldn't work for React Native and doesn't let us
+      // do the portal feature.
+    } while (inst && inst.tag !== HostComponent);
+
+    if (inst) {
+      return inst;
+    }
 
-function getNodeForCharacterOffset(root, offset) {
-  var node = getLeafNode(root);
-  var nodeStart = 0;
-  var nodeEnd = 0;
+    return null;
+  }
+  /**
+   * Return the lowest common ancestor of A and B, or null if they are in
+   * different trees.
+   */
 
-  while (node) {
-    if (node.nodeType === TEXT_NODE) {
-      nodeEnd = nodeStart + node.textContent.length;
 
-      if (nodeStart <= offset && nodeEnd >= offset) {
-        return {
-          node: node,
-          offset: offset - nodeStart
-        };
-      }
+  function getLowestCommonAncestor(instA, instB) {
+    var depthA = 0;
 
-      nodeStart = nodeEnd;
+    for (var tempA = instA; tempA; tempA = getParent(tempA)) {
+      depthA++;
     }
 
-    node = getLeafNode(getSiblingNode(node));
-  }
-}
+    var depthB = 0;
 
-/**
- * @param {DOMElement} outerNode
- * @return {?object}
- */
+    for (var tempB = instB; tempB; tempB = getParent(tempB)) {
+      depthB++;
+    } // If A is deeper, crawl up.
 
-function getOffsets(outerNode) {
-  var ownerDocument = outerNode.ownerDocument;
-  var win = ownerDocument && ownerDocument.defaultView || window;
-  var selection = win.getSelection && win.getSelection();
 
-  if (!selection || selection.rangeCount === 0) {
-    return null;
-  }
+    while (depthA - depthB > 0) {
+      instA = getParent(instA);
+      depthA--;
+    } // If B is deeper, crawl up.
+
+
+    while (depthB - depthA > 0) {
+      instB = getParent(instB);
+      depthB--;
+    } // Walk in lockstep until we find a match.
+
+
+    var depth = depthA;
+
+    while (depth--) {
+      if (instA === instB || instA === instB.alternate) {
+        return instA;
+      }
+
+      instA = getParent(instA);
+      instB = getParent(instB);
+    }
 
-  var anchorNode = selection.anchorNode,
-      anchorOffset = selection.anchorOffset,
-      focusNode = selection.focusNode,
-      focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the
-  // up/down buttons on an <input type="number">. Anonymous divs do not seem to
-  // expose properties, triggering a "Permission denied error" if any of its
-  // properties are accessed. The only seemingly possible way to avoid erroring
-  // is to access a property that typically works for non-anonymous divs and
-  // catch any error that may otherwise arise. See
-  // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
-
-  try {
-    /* eslint-disable no-unused-expressions */
-    anchorNode.nodeType;
-    focusNode.nodeType;
-    /* eslint-enable no-unused-expressions */
-  } catch (e) {
     return null;
   }
+  /**
+   * Simulates the traversal of a two-phase, capture/bubble event dispatch.
+   */
 
-  return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);
-}
-/**
- * Returns {start, end} where `start` is the character/codepoint index of
- * (anchorNode, anchorOffset) within the textContent of `outerNode`, and
- * `end` is the index of (focusNode, focusOffset).
- *
- * Returns null if you pass in garbage input but we should probably just crash.
- *
- * Exported only for testing.
- */
+  function traverseTwoPhase(inst, fn, arg) {
+    var path = [];
+
+    while (inst) {
+      path.push(inst);
+      inst = getParent(inst);
+    }
+
+    var i;
 
-function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {
-  var length = 0;
-  var start = -1;
-  var end = -1;
-  var indexWithinAnchor = 0;
-  var indexWithinFocus = 0;
-  var node = outerNode;
-  var parentNode = null;
+    for (i = path.length; i-- > 0;) {
+      fn(path[i], 'captured', arg);
+    }
+
+    for (i = 0; i < path.length; i++) {
+      fn(path[i], 'bubbled', arg);
+    }
+  }
+  /**
+   * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
+   * should would receive a `mouseEnter` or `mouseLeave` event.
+   *
+   * Does not invoke the callback on the nearest common ancestor because nothing
+   * "entered" or "left" that element.
+   */
 
-  outer: while (true) {
-    var next = null;
+  function traverseEnterLeave(from, to, fn, argFrom, argTo) {
+    var common = from && to ? getLowestCommonAncestor(from, to) : null;
+    var pathFrom = [];
 
     while (true) {
-      if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {
-        start = length + anchorOffset;
+      if (!from) {
+        break;
       }
 
-      if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {
-        end = length + focusOffset;
+      if (from === common) {
+        break;
       }
 
-      if (node.nodeType === TEXT_NODE) {
-        length += node.nodeValue.length;
-      }
+      var alternate = from.alternate;
 
-      if ((next = node.firstChild) === null) {
+      if (alternate !== null && alternate === common) {
         break;
-      } // Moving from `node` to its first child `next`.
-
+      }
 
-      parentNode = node;
-      node = next;
+      pathFrom.push(from);
+      from = getParent(from);
     }
 
+    var pathTo = [];
+
     while (true) {
-      if (node === outerNode) {
-        // If `outerNode` has children, this is always the second time visiting
-        // it. If it has no children, this is still the first loop, and the only
-        // valid selection is anchorNode and focusNode both equal to this node
-        // and both offsets 0, in which case we will have handled above.
-        break outer;
+      if (!to) {
+        break;
       }
 
-      if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {
-        start = length;
+      if (to === common) {
+        break;
       }
 
-      if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {
-        end = length;
-      }
+      var _alternate = to.alternate;
 
-      if ((next = node.nextSibling) !== null) {
+      if (_alternate !== null && _alternate === common) {
         break;
       }
 
-      node = parentNode;
-      parentNode = node.parentNode;
-    } // Moving from `node` to its next sibling `next`.
+      pathTo.push(to);
+      to = getParent(to);
+    }
 
+    for (var i = 0; i < pathFrom.length; i++) {
+      fn(pathFrom[i], 'bubbled', argFrom);
+    }
 
-    node = next;
+    for (var _i = pathTo.length; _i-- > 0;) {
+      fn(pathTo[_i], 'captured', argTo);
+    }
   }
 
-  if (start === -1 || end === -1) {
-    // This should never happen. (Would happen if the anchor/focus nodes aren't
-    // actually inside the passed-in node.)
-    return null;
+  function isInteractive(tag) {
+    return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
   }
 
-  return {
-    start: start,
-    end: end
-  };
-}
-/**
- * In modern non-IE browsers, we can support both forward and backward
- * selections.
- *
- * Note: IE10+ supports the Selection object, but it does not support
- * the `extend` method, which means that even in modern IE, it's not possible
- * to programmatically create a backward selection. Thus, for all IE
- * versions, we use the old IE API to create our selections.
- *
- * @param {DOMElement|DOMTextNode} node
- * @param {object} offsets
- */
-
-function setOffsets(node, offsets) {
-  var doc = node.ownerDocument || document;
-  var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios.
-  // (For instance: TinyMCE editor used in a list component that supports pasting to add more,
-  // fails when pasting 100+ items)
+  function shouldPreventMouseEvent(name, type, props) {
+    switch (name) {
+      case 'onClick':
+      case 'onClickCapture':
+      case 'onDoubleClick':
+      case 'onDoubleClickCapture':
+      case 'onMouseDown':
+      case 'onMouseDownCapture':
+      case 'onMouseMove':
+      case 'onMouseMoveCapture':
+      case 'onMouseUp':
+      case 'onMouseUpCapture':
+      case 'onMouseEnter':
+        return !!(props.disabled && isInteractive(type));
 
-  if (!win.getSelection) {
-    return;
+      default:
+        return false;
+    }
   }
+  /**
+   * @param {object} inst The instance, which is the source of events.
+   * @param {string} registrationName Name of listener (e.g. `onClick`).
+   * @return {?function} The stored callback.
+   */
 
-  var selection = win.getSelection();
-  var length = node.textContent.length;
-  var start = Math.min(offsets.start, length);
-  var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.
-  // Flip backward selections, so we can set with a single range.
 
-  if (!selection.extend && start > end) {
-    var temp = end;
-    end = start;
-    start = temp;
-  }
+  function getListener(inst, registrationName) {
+    var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
+    // live here; needs to be moved to a better place soon
 
-  var startMarker = getNodeForCharacterOffset(node, start);
-  var endMarker = getNodeForCharacterOffset(node, end);
+    var stateNode = inst.stateNode;
 
-  if (startMarker && endMarker) {
-    if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {
-      return;
+    if (!stateNode) {
+      // Work in progress (ex: onload events in incremental mode).
+      return null;
     }
 
-    var range = doc.createRange();
-    range.setStart(startMarker.node, startMarker.offset);
-    selection.removeAllRanges();
+    var props = getFiberCurrentPropsFromNode(stateNode);
 
-    if (start > end) {
-      selection.addRange(range);
-      selection.extend(endMarker.node, endMarker.offset);
-    } else {
-      range.setEnd(endMarker.node, endMarker.offset);
-      selection.addRange(range);
+    if (!props) {
+      // Work in progress.
+      return null;
     }
-  }
-}
 
-function isTextNode(node) {
-  return node && node.nodeType === TEXT_NODE;
-}
-
-function containsNode(outerNode, innerNode) {
-  if (!outerNode || !innerNode) {
-    return false;
-  } else if (outerNode === innerNode) {
-    return true;
-  } else if (isTextNode(outerNode)) {
-    return false;
-  } else if (isTextNode(innerNode)) {
-    return containsNode(outerNode, innerNode.parentNode);
-  } else if ('contains' in outerNode) {
-    return outerNode.contains(innerNode);
-  } else if (outerNode.compareDocumentPosition) {
-    return !!(outerNode.compareDocumentPosition(innerNode) & 16);
-  } else {
-    return false;
-  }
-}
-
-function isInDocument(node) {
-  return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);
-}
-
-function isSameOriginFrame(iframe) {
-  try {
-    // Accessing the contentDocument of a HTMLIframeElement can cause the browser
-    // to throw, e.g. if it has a cross-origin src attribute.
-    // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g:
-    // iframe.contentDocument.defaultView;
-    // A safety way is to access one of the cross origin properties: Window or Location
-    // Which might result in "SecurityError" DOM Exception and it is compatible to Safari.
-    // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl
-    return typeof iframe.contentWindow.location.href === 'string';
-  } catch (err) {
-    return false;
-  }
-}
+    listener = props[registrationName];
 
-function getActiveElementDeep() {
-  var win = window;
-  var element = getActiveElement();
+    if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
+      return null;
+    }
 
-  while (element instanceof win.HTMLIFrameElement) {
-    if (isSameOriginFrame(element)) {
-      win = element.contentWindow;
-    } else {
-      return element;
+    if (!(!listener || typeof listener === 'function')) {
+      {
+        throw Error( "Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type." );
+      }
     }
 
-    element = getActiveElement(win.document);
+    return listener;
   }
 
-  return element;
-}
-/**
- * @ReactInputSelection: React input selection module. Based on Selection.js,
- * but modified to be suitable for react and has a couple of bug fixes (doesn't
- * assume buttons have range selections allowed).
- * Input selection module for React.
- */
+  /**
+   * Some event types have a notion of different registration names for different
+   * "phases" of propagation. This finds listeners by a given phase.
+   */
+  function listenerAtPhase(inst, event, propagationPhase) {
+    var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
+    return getListener(inst, registrationName);
+  }
+  /**
+   * A small set of propagation patterns, each of which will accept a small amount
+   * of information, and generate a set of "dispatch ready event objects" - which
+   * are sets of events that have already been annotated with a set of dispatched
+   * listener functions/ids. The API is designed this way to discourage these
+   * propagation strategies from actually executing the dispatches, since we
+   * always want to collect the entire set of dispatches before executing even a
+   * single one.
+   */
 
-/**
- * @hasSelectionCapabilities: we get the element types that support selection
- * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`
- * and `selectionEnd` rows.
- */
+  /**
+   * Tags a `SyntheticEvent` with dispatched listeners. Creating this function
+   * here, allows us to not have to bind or create functions for each event.
+   * Mutating the event's members allows us to not have to create a wrapping
+   * "dispatch" object that pairs the event with the listener.
+   */
 
 
-function hasSelectionCapabilities(elem) {
-  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
-  return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');
-}
-function getSelectionInformation() {
-  var focusedElem = getActiveElementDeep();
-  return {
-    focusedElem: focusedElem,
-    selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null
-  };
-}
-/**
- * @restoreSelection: If any selection information was potentially lost,
- * restore it. This is useful when performing operations that could remove dom
- * nodes and place them back in, resulting in focus being lost.
- */
+  function accumulateDirectionalDispatches(inst, phase, event) {
+    {
+      if (!inst) {
+        error('Dispatching inst must not be null');
+      }
+    }
+
+    var listener = listenerAtPhase(inst, event, phase);
+
+    if (listener) {
+      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
+      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
+    }
+  }
+  /**
+   * Collect dispatches (must be entirely collected before dispatching - see unit
+   * tests). Lazily allocate the array to conserve memory.  We must loop through
+   * each event and perform the traversal for each one. We cannot perform a
+   * single traversal for the entire collection of events because each event may
+   * have a different target.
+   */
 
-function restoreSelection(priorSelectionInformation) {
-  var curFocusedElem = getActiveElementDeep();
-  var priorFocusedElem = priorSelectionInformation.focusedElem;
-  var priorSelectionRange = priorSelectionInformation.selectionRange;
 
-  if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
-    if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {
-      setSelection(priorFocusedElem, priorSelectionRange);
-    } // Focusing a node can change the scroll position, which is undesirable
+  function accumulateTwoPhaseDispatchesSingle(event) {
+    if (event && event.dispatchConfig.phasedRegistrationNames) {
+      traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
+    }
+  }
+  /**
+   * Accumulates without regard to direction, does not look for phased
+   * registration names. Same as `accumulateDirectDispatchesSingle` but without
+   * requiring that the `dispatchMarker` be the same as the dispatched ID.
+   */
 
 
-    var ancestors = [];
-    var ancestor = priorFocusedElem;
+  function accumulateDispatches(inst, ignoredDirection, event) {
+    if (inst && event && event.dispatchConfig.registrationName) {
+      var registrationName = event.dispatchConfig.registrationName;
+      var listener = getListener(inst, registrationName);
 
-    while (ancestor = ancestor.parentNode) {
-      if (ancestor.nodeType === ELEMENT_NODE) {
-        ancestors.push({
-          element: ancestor,
-          left: ancestor.scrollLeft,
-          top: ancestor.scrollTop
-        });
+      if (listener) {
+        event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
+        event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);
       }
     }
+  }
+  /**
+   * Accumulates dispatches on an `SyntheticEvent`, but only for the
+   * `dispatchMarker`.
+   * @param {SyntheticEvent} event
+   */
 
-    if (typeof priorFocusedElem.focus === 'function') {
-      priorFocusedElem.focus();
-    }
 
-    for (var i = 0; i < ancestors.length; i++) {
-      var info = ancestors[i];
-      info.element.scrollLeft = info.left;
-      info.element.scrollTop = info.top;
+  function accumulateDirectDispatchesSingle(event) {
+    if (event && event.dispatchConfig.registrationName) {
+      accumulateDispatches(event._targetInst, null, event);
     }
   }
-}
-/**
- * @getSelection: Gets the selection bounds of a focused textarea, input or
- * contentEditable node.
- * -@input: Look up selection bounds of this input
- * -@return {start: selectionStart, end: selectionEnd}
- */
 
-function getSelection(input) {
-  var selection;
+  function accumulateTwoPhaseDispatches(events) {
+    forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
+  }
+  function accumulateEnterLeaveDispatches(leave, enter, from, to) {
+    traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
+  }
+  function accumulateDirectDispatches(events) {
+    forEachAccumulated(events, accumulateDirectDispatchesSingle);
+  }
 
-  if ('selectionStart' in input) {
-    // Modern browser with input or textarea.
-    selection = {
-      start: input.selectionStart,
-      end: input.selectionEnd
-    };
-  } else {
-    // Content editable or old IE textarea.
-    selection = getOffsets(input);
+  /**
+   * These variables store information about text content of a target node,
+   * allowing comparison of content before and after a given event.
+   *
+   * Identify the node where selection currently begins, then observe
+   * both its text content and its current position in the DOM. Since the
+   * browser may natively replace the target node during composition, we can
+   * use its position to find its replacement.
+   *
+   *
+   */
+  var root = null;
+  var startText = null;
+  var fallbackText = null;
+  function initialize(nativeEventTarget) {
+    root = nativeEventTarget;
+    startText = getText();
+    return true;
   }
+  function reset() {
+    root = null;
+    startText = null;
+    fallbackText = null;
+  }
+  function getData() {
+    if (fallbackText) {
+      return fallbackText;
+    }
 
-  return selection || {
-    start: 0,
-    end: 0
-  };
-}
-/**
- * @setSelection: Sets the selection bounds of a textarea or input and focuses
- * the input.
- * -@input     Set selection bounds of this input or textarea
- * -@offsets   Object of same form that is returned from get*
- */
+    var start;
+    var startValue = startText;
+    var startLength = startValue.length;
+    var end;
+    var endValue = getText();
+    var endLength = endValue.length;
 
-function setSelection(input, offsets) {
-  var start = offsets.start,
-      end = offsets.end;
+    for (start = 0; start < startLength; start++) {
+      if (startValue[start] !== endValue[start]) {
+        break;
+      }
+    }
 
-  if (end === undefined) {
-    end = start;
-  }
+    var minEnd = startLength - start;
 
-  if ('selectionStart' in input) {
-    input.selectionStart = start;
-    input.selectionEnd = Math.min(end, input.value.length);
-  } else {
-    setOffsets(input, offsets);
+    for (end = 1; end <= minEnd; end++) {
+      if (startValue[startLength - end] !== endValue[endLength - end]) {
+        break;
+      }
+    }
+
+    var sliceTail = end > 1 ? 1 - end : undefined;
+    fallbackText = endValue.slice(start, sliceTail);
+    return fallbackText;
   }
-}
+  function getText() {
+    if ('value' in root) {
+      return root.value;
+    }
 
-var validateDOMNesting = function () {};
+    return root.textContent;
+  }
 
-var updatedAncestorInfo = function () {};
+  var EVENT_POOL_SIZE = 10;
+  /**
+   * @interface Event
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/
+   */
 
-{
-  // This validation code was written based on the HTML5 parsing spec:
-  // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
-  //
-  // Note: this does not catch all invalid nesting, nor does it try to (as it's
-  // not clear what practical benefit doing so provides); instead, we warn only
-  // for cases where the parser will give a parse tree differing from what React
-  // intended. For example, <b><div></div></b> is invalid but we don't warn
-  // because it still parses correctly; we do warn for other cases like nested
-  // <p> tags where the beginning of the second element implicitly closes the
-  // first, causing a confusing mess.
-  // https://html.spec.whatwg.org/multipage/syntax.html#special
-  var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
-
-  var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
-  // TODO: Distinguish by namespace here -- for <title>, including it here
-  // errs on the side of fewer warnings
-  'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
-
-  var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
-
-  var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
-  var emptyAncestorInfo = {
-    current: null,
-    formTag: null,
-    aTagInScope: null,
-    buttonTagInScope: null,
-    nobrTagInScope: null,
-    pTagInButtonScope: null,
-    listItemTagAutoclosing: null,
-    dlItemTagAutoclosing: null
+  var EventInterface = {
+    type: null,
+    target: null,
+    // currentTarget is set when dispatching; no use in copying it here
+    currentTarget: function () {
+      return null;
+    },
+    eventPhase: null,
+    bubbles: null,
+    cancelable: null,
+    timeStamp: function (event) {
+      return event.timeStamp || Date.now();
+    },
+    defaultPrevented: null,
+    isTrusted: null
   };
 
-  updatedAncestorInfo = function (oldInfo, tag) {
-    var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);
-
-    var info = {
-      tag: tag
-    };
-
-    if (inScopeTags.indexOf(tag) !== -1) {
-      ancestorInfo.aTagInScope = null;
-      ancestorInfo.buttonTagInScope = null;
-      ancestorInfo.nobrTagInScope = null;
-    }
+  function functionThatReturnsTrue() {
+    return true;
+  }
 
-    if (buttonScopeTags.indexOf(tag) !== -1) {
-      ancestorInfo.pTagInButtonScope = null;
-    } // See rules for 'li', 'dd', 'dt' start tags in
-    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
+  function functionThatReturnsFalse() {
+    return false;
+  }
+  /**
+   * Synthetic events are dispatched by event plugins, typically in response to a
+   * top-level event delegation handler.
+   *
+   * These systems should generally use pooling to reduce the frequency of garbage
+   * collection. The system should check `isPersistent` to determine whether the
+   * event should be released into the pool after being dispatched. Users that
+   * need a persisted event should invoke `persist`.
+   *
+   * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
+   * normalizing browser quirks. Subclasses do not necessarily have to implement a
+   * DOM interface; custom application-specific events can also subclass this.
+   *
+   * @param {object} dispatchConfig Configuration used to dispatch this event.
+   * @param {*} targetInst Marker identifying the event target.
+   * @param {object} nativeEvent Native browser event.
+   * @param {DOMEventTarget} nativeEventTarget Target node.
+   */
 
 
-    if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
-      ancestorInfo.listItemTagAutoclosing = null;
-      ancestorInfo.dlItemTagAutoclosing = null;
+  function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {
+    {
+      // these have a getter/setter for warnings
+      delete this.nativeEvent;
+      delete this.preventDefault;
+      delete this.stopPropagation;
+      delete this.isDefaultPrevented;
+      delete this.isPropagationStopped;
     }
 
-    ancestorInfo.current = info;
-
-    if (tag === 'form') {
-      ancestorInfo.formTag = info;
-    }
+    this.dispatchConfig = dispatchConfig;
+    this._targetInst = targetInst;
+    this.nativeEvent = nativeEvent;
+    var Interface = this.constructor.Interface;
 
-    if (tag === 'a') {
-      ancestorInfo.aTagInScope = info;
-    }
+    for (var propName in Interface) {
+      if (!Interface.hasOwnProperty(propName)) {
+        continue;
+      }
 
-    if (tag === 'button') {
-      ancestorInfo.buttonTagInScope = info;
-    }
+      {
+        delete this[propName]; // this has a getter/setter for warnings
+      }
 
-    if (tag === 'nobr') {
-      ancestorInfo.nobrTagInScope = info;
-    }
+      var normalize = Interface[propName];
 
-    if (tag === 'p') {
-      ancestorInfo.pTagInButtonScope = info;
+      if (normalize) {
+        this[propName] = normalize(nativeEvent);
+      } else {
+        if (propName === 'target') {
+          this.target = nativeEventTarget;
+        } else {
+          this[propName] = nativeEvent[propName];
+        }
+      }
     }
 
-    if (tag === 'li') {
-      ancestorInfo.listItemTagAutoclosing = info;
-    }
+    var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
 
-    if (tag === 'dd' || tag === 'dt') {
-      ancestorInfo.dlItemTagAutoclosing = info;
+    if (defaultPrevented) {
+      this.isDefaultPrevented = functionThatReturnsTrue;
+    } else {
+      this.isDefaultPrevented = functionThatReturnsFalse;
     }
 
-    return ancestorInfo;
-  };
-  /**
-   * Returns whether
-   */
-
+    this.isPropagationStopped = functionThatReturnsFalse;
+    return this;
+  }
 
-  var isTagValidWithParent = function (tag, parentTag) {
-    // First, let's check if we're in an unusual parsing mode...
-    switch (parentTag) {
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
-      case 'select':
-        return tag === 'option' || tag === 'optgroup' || tag === '#text';
+  _assign(SyntheticEvent.prototype, {
+    preventDefault: function () {
+      this.defaultPrevented = true;
+      var event = this.nativeEvent;
 
-      case 'optgroup':
-        return tag === 'option' || tag === '#text';
-      // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
-      // but
+      if (!event) {
+        return;
+      }
 
-      case 'option':
-        return tag === '#text';
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
-      // No special behavior since these rules fall back to "in body" mode for
-      // all except special table nodes which cause bad parsing behavior anyway.
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
+      if (event.preventDefault) {
+        event.preventDefault();
+      } else if (typeof event.returnValue !== 'unknown') {
+        event.returnValue = false;
+      }
 
-      case 'tr':
-        return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
+      this.isDefaultPrevented = functionThatReturnsTrue;
+    },
+    stopPropagation: function () {
+      var event = this.nativeEvent;
 
-      case 'tbody':
-      case 'thead':
-      case 'tfoot':
-        return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
+      if (!event) {
+        return;
+      }
 
-      case 'colgroup':
-        return tag === 'col' || tag === 'template';
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
+      if (event.stopPropagation) {
+        event.stopPropagation();
+      } else if (typeof event.cancelBubble !== 'unknown') {
+        // The ChangeEventPlugin registers a "propertychange" event for
+        // IE. This event does not support bubbling or cancelling, and
+        // any references to cancelBubble throw "Member not found".  A
+        // typeof check of "unknown" circumvents this issue (and is also
+        // IE specific).
+        event.cancelBubble = true;
+      }
 
-      case 'table':
-        return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
-      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
+      this.isPropagationStopped = functionThatReturnsTrue;
+    },
 
-      case 'head':
-        return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
-      // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
+    /**
+     * We release all dispatched `SyntheticEvent`s after each event loop, adding
+     * them back into the pool. This allows a way to hold onto a reference that
+     * won't be added back into the pool.
+     */
+    persist: function () {
+      this.isPersistent = functionThatReturnsTrue;
+    },
 
-      case 'html':
-        return tag === 'head' || tag === 'body' || tag === 'frameset';
+    /**
+     * Checks if this event should be released back into the pool.
+     *
+     * @return {boolean} True if this should not be released, false otherwise.
+     */
+    isPersistent: functionThatReturnsFalse,
 
-      case 'frameset':
-        return tag === 'frame';
+    /**
+     * `PooledClass` looks for `destructor` on each instance it releases.
+     */
+    destructor: function () {
+      var Interface = this.constructor.Interface;
 
-      case '#document':
-        return tag === 'html';
-    } // Probably in the "in body" parsing mode, so we outlaw only tag combos
-    // where the parsing rules cause implicit opens or closes to be added.
-    // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
+      for (var propName in Interface) {
+        {
+          Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));
+        }
+      }
 
+      this.dispatchConfig = null;
+      this._targetInst = null;
+      this.nativeEvent = null;
+      this.isDefaultPrevented = functionThatReturnsFalse;
+      this.isPropagationStopped = functionThatReturnsFalse;
+      this._dispatchListeners = null;
+      this._dispatchInstances = null;
 
-    switch (tag) {
-      case 'h1':
-      case 'h2':
-      case 'h3':
-      case 'h4':
-      case 'h5':
-      case 'h6':
-        return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
-
-      case 'rp':
-      case 'rt':
-        return impliedEndTags.indexOf(parentTag) === -1;
-
-      case 'body':
-      case 'caption':
-      case 'col':
-      case 'colgroup':
-      case 'frameset':
-      case 'frame':
-      case 'head':
-      case 'html':
-      case 'tbody':
-      case 'td':
-      case 'tfoot':
-      case 'th':
-      case 'thead':
-      case 'tr':
-        // These tags are only valid with a few parents that have special child
-        // parsing rules -- if we're down here, then none of those matched and
-        // so we allow it only if we don't know what the parent is, as all other
-        // cases are invalid.
-        return parentTag == null;
+      {
+        Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));
+        Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));
+        Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));
+        Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));
+        Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));
+      }
     }
+  });
 
-    return true;
-  };
+  SyntheticEvent.Interface = EventInterface;
   /**
-   * Returns whether
+   * Helper to reduce boilerplate when creating subclasses.
    */
 
+  SyntheticEvent.extend = function (Interface) {
+    var Super = this;
 
-  var findInvalidAncestorForTag = function (tag, ancestorInfo) {
-    switch (tag) {
-      case 'address':
-      case 'article':
-      case 'aside':
-      case 'blockquote':
-      case 'center':
-      case 'details':
-      case 'dialog':
-      case 'dir':
-      case 'div':
-      case 'dl':
-      case 'fieldset':
-      case 'figcaption':
-      case 'figure':
-      case 'footer':
-      case 'header':
-      case 'hgroup':
-      case 'main':
-      case 'menu':
-      case 'nav':
-      case 'ol':
-      case 'p':
-      case 'section':
-      case 'summary':
-      case 'ul':
-      case 'pre':
-      case 'listing':
-      case 'table':
-      case 'hr':
-      case 'xmp':
-      case 'h1':
-      case 'h2':
-      case 'h3':
-      case 'h4':
-      case 'h5':
-      case 'h6':
-        return ancestorInfo.pTagInButtonScope;
-
-      case 'form':
-        return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
-
-      case 'li':
-        return ancestorInfo.listItemTagAutoclosing;
-
-      case 'dd':
-      case 'dt':
-        return ancestorInfo.dlItemTagAutoclosing;
+    var E = function () {};
 
-      case 'button':
-        return ancestorInfo.buttonTagInScope;
-
-      case 'a':
-        // Spec says something about storing a list of markers, but it sounds
-        // equivalent to this check.
-        return ancestorInfo.aTagInScope;
+    E.prototype = Super.prototype;
+    var prototype = new E();
 
-      case 'nobr':
-        return ancestorInfo.nobrTagInScope;
+    function Class() {
+      return Super.apply(this, arguments);
     }
 
-    return null;
+    _assign(prototype, Class.prototype);
+
+    Class.prototype = prototype;
+    Class.prototype.constructor = Class;
+    Class.Interface = _assign({}, Super.Interface, Interface);
+    Class.extend = Super.extend;
+    addEventPoolingTo(Class);
+    return Class;
   };
 
-  var didWarn$1 = {};
+  addEventPoolingTo(SyntheticEvent);
+  /**
+   * Helper to nullify syntheticEvent instance properties when destructing
+   *
+   * @param {String} propName
+   * @param {?object} getVal
+   * @return {object} defineProperty object
+   */
 
-  validateDOMNesting = function (childTag, childText, ancestorInfo) {
-    ancestorInfo = ancestorInfo || emptyAncestorInfo;
-    var parentInfo = ancestorInfo.current;
-    var parentTag = parentInfo && parentInfo.tag;
+  function getPooledWarningPropertyDefinition(propName, getVal) {
+    var isFunction = typeof getVal === 'function';
+    return {
+      configurable: true,
+      set: set,
+      get: get
+    };
 
-    if (childText != null) {
-      !(childTag == null) ? warningWithoutStack$1(false, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0;
-      childTag = '#text';
+    function set(val) {
+      var action = isFunction ? 'setting the method' : 'setting the property';
+      warn(action, 'This is effectively a no-op');
+      return val;
     }
 
-    var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
-    var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
-    var invalidParentOrAncestor = invalidParent || invalidAncestor;
-
-    if (!invalidParentOrAncestor) {
-      return;
+    function get() {
+      var action = isFunction ? 'accessing the method' : 'accessing the property';
+      var result = isFunction ? 'This is a no-op function' : 'This is set to null';
+      warn(action, result);
+      return getVal;
     }
 
-    var ancestorTag = invalidParentOrAncestor.tag;
-    var addendum = getCurrentFiberStackInDev();
-    var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;
-
-    if (didWarn$1[warnKey]) {
-      return;
+    function warn(action, result) {
+      {
+        error("This synthetic event is reused for performance reasons. If you're seeing this, " + "you're %s `%s` on a released/nullified synthetic event. %s. " + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result);
+      }
     }
+  }
 
-    didWarn$1[warnKey] = true;
-    var tagDisplayName = childTag;
-    var whitespaceInfo = '';
+  function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {
+    var EventConstructor = this;
 
-    if (childTag === '#text') {
-      if (/\S/.test(childText)) {
-        tagDisplayName = 'Text nodes';
-      } else {
-        tagDisplayName = 'Whitespace text nodes';
-        whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
-      }
-    } else {
-      tagDisplayName = '<' + childTag + '>';
+    if (EventConstructor.eventPool.length) {
+      var instance = EventConstructor.eventPool.pop();
+      EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);
+      return instance;
     }
 
-    if (invalidParent) {
-      var info = '';
+    return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);
+  }
+
+  function releasePooledEvent(event) {
+    var EventConstructor = this;
 
-      if (ancestorTag === 'table' && childTag === 'tr') {
-        info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';
+    if (!(event instanceof EventConstructor)) {
+      {
+        throw Error( "Trying to release an event instance into a pool of a different type." );
       }
-
-      warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info, addendum);
-    } else {
-      warningWithoutStack$1(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.%s', tagDisplayName, ancestorTag, addendum);
     }
-  };
-}
 
-// can re-export everything from this module.
+    event.destructor();
 
-function shim() {
-  {
-    {
-      throw Error("The current renderer does not support persistence. This error is likely caused by a bug in React. Please file an issue.");
+    if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {
+      EventConstructor.eventPool.push(event);
     }
   }
-} // Persistence (when unsupported)
 
+  function addEventPoolingTo(EventConstructor) {
+    EventConstructor.eventPool = [];
+    EventConstructor.getPooled = getPooledEvent;
+    EventConstructor.release = releasePooledEvent;
+  }
 
-var supportsPersistence = false;
-var cloneInstance = shim;
-var cloneFundamentalInstance = shim;
-var createContainerChildSet = shim;
-var appendChildToContainerChildSet = shim;
-var finalizeContainerChildren = shim;
-var replaceContainerChildren = shim;
-var cloneHiddenInstance = shim;
-var cloneHiddenTextInstance = shim;
-
-var SUPPRESS_HYDRATION_WARNING;
+  /**
+   * @interface Event
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
+   */
 
-{
-  SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
-}
+  var SyntheticCompositionEvent = SyntheticEvent.extend({
+    data: null
+  });
 
-var SUSPENSE_START_DATA = '$';
-var SUSPENSE_END_DATA = '/$';
-var SUSPENSE_PENDING_START_DATA = '$?';
-var SUSPENSE_FALLBACK_START_DATA = '$!';
-var STYLE = 'style';
-var eventsEnabled = null;
-var selectionInformation = null;
+  /**
+   * @interface Event
+   * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
+   *      /#events-inputevents
+   */
 
-function shouldAutoFocusHostComponent(type, props) {
-  switch (type) {
-    case 'button':
-    case 'input':
-    case 'select':
-    case 'textarea':
-      return !!props.autoFocus;
-  }
+  var SyntheticInputEvent = SyntheticEvent.extend({
+    data: null
+  });
 
-  return false;
-}
+  var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
 
-function getRootHostContext(rootContainerInstance) {
-  var type;
-  var namespace;
-  var nodeType = rootContainerInstance.nodeType;
+  var START_KEYCODE = 229;
+  var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;
+  var documentMode = null;
 
-  switch (nodeType) {
-    case DOCUMENT_NODE:
-    case DOCUMENT_FRAGMENT_NODE:
-      {
-        type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
-        var root = rootContainerInstance.documentElement;
-        namespace = root ? root.namespaceURI : getChildNamespace(null, '');
-        break;
-      }
+  if (canUseDOM && 'documentMode' in document) {
+    documentMode = document.documentMode;
+  } // Webkit offers a very useful `textInput` event that can be used to
+  // directly represent `beforeInput`. The IE `textinput` event is not as
+  // useful, so we don't use it.
 
-    default:
-      {
-        var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
-        var ownNamespace = container.namespaceURI || null;
-        type = container.tagName;
-        namespace = getChildNamespace(ownNamespace, type);
-        break;
-      }
-  }
 
-  {
-    var validatedTag = type.toLowerCase();
-    var ancestorInfo = updatedAncestorInfo(null, validatedTag);
-    return {
-      namespace: namespace,
-      ancestorInfo: ancestorInfo
-    };
-  }
+  var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied
+  // by the native compositionend event may be incorrect. Japanese ideographic
+  // spaces, for instance (\u3000) are not recorded correctly.
 
-  return namespace;
-}
-function getChildHostContext(parentHostContext, type, rootContainerInstance) {
-  {
-    var parentHostContextDev = parentHostContext;
-    var namespace = getChildNamespace(parentHostContextDev.namespace, type);
-    var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
-    return {
-      namespace: namespace,
-      ancestorInfo: ancestorInfo
-    };
-  }
+  var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
+  var SPACEBAR_CODE = 32;
+  var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names.
 
-  var parentNamespace = parentHostContext;
-  return getChildNamespace(parentNamespace, type);
-}
-function getPublicInstance(instance) {
-  return instance;
-}
-function prepareForCommit(containerInfo) {
-  eventsEnabled = isEnabled();
-  selectionInformation = getSelectionInformation();
-  setEnabled(false);
-}
-function resetAfterCommit(containerInfo) {
-  restoreSelection(selectionInformation);
-  selectionInformation = null;
-  setEnabled(eventsEnabled);
-  eventsEnabled = null;
-}
-function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
-  var parentNamespace;
+  var eventTypes = {
+    beforeInput: {
+      phasedRegistrationNames: {
+        bubbled: 'onBeforeInput',
+        captured: 'onBeforeInputCapture'
+      },
+      dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]
+    },
+    compositionEnd: {
+      phasedRegistrationNames: {
+        bubbled: 'onCompositionEnd',
+        captured: 'onCompositionEndCapture'
+      },
+      dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
+    },
+    compositionStart: {
+      phasedRegistrationNames: {
+        bubbled: 'onCompositionStart',
+        captured: 'onCompositionStartCapture'
+      },
+      dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
+    },
+    compositionUpdate: {
+      phasedRegistrationNames: {
+        bubbled: 'onCompositionUpdate',
+        captured: 'onCompositionUpdateCapture'
+      },
+      dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
+    }
+  }; // Track whether we've ever handled a keypress on the space key.
 
-  {
-    // TODO: take namespace into account when validating.
-    var hostContextDev = hostContext;
-    validateDOMNesting(type, null, hostContextDev.ancestorInfo);
-
-    if (typeof props.children === 'string' || typeof props.children === 'number') {
-      var string = '' + props.children;
-      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
-      validateDOMNesting(null, string, ownAncestorInfo);
-    }
-
-    parentNamespace = hostContextDev.namespace;
-  }
-
-  var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
-  precacheFiberNode(internalInstanceHandle, domElement);
-  updateFiberProps(domElement, props);
-  return domElement;
-}
-function appendInitialChild(parentInstance, child) {
-  parentInstance.appendChild(child);
-}
-function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
-  setInitialProperties(domElement, type, props, rootContainerInstance);
-  return shouldAutoFocusHostComponent(type, props);
-}
-function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
-  {
-    var hostContextDev = hostContext;
+  var hasSpaceKeypress = false;
+  /**
+   * Return whether a native keypress event is assumed to be a command.
+   * This is required because Firefox fires `keypress` events for key commands
+   * (cut, copy, select-all, etc.) even though no character is inserted.
+   */
 
-    if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
-      var string = '' + newProps.children;
-      var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
-      validateDOMNesting(null, string, ownAncestorInfo);
-    }
+  function isKeypressCommand(nativeEvent) {
+    return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.
+    !(nativeEvent.ctrlKey && nativeEvent.altKey);
   }
+  /**
+   * Translate native top level events into event types.
+   *
+   * @param {string} topLevelType
+   * @return {object}
+   */
 
-  return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);
-}
-function shouldSetTextContent(type, props) {
-  return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
-}
-function shouldDeprioritizeSubtree(type, props) {
-  return !!props.hidden;
-}
-function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
-  {
-    var hostContextDev = hostContext;
-    validateDOMNesting(null, text, hostContextDev.ancestorInfo);
-  }
-
-  var textNode = createTextNode(text, rootContainerInstance);
-  precacheFiberNode(internalInstanceHandle, textNode);
-  return textNode;
-}
-var isPrimaryRenderer = true;
-var warnsIfNotActing = true; // This initialization code may run even on server environments
-// if a component just imports ReactDOM (e.g. for findDOMNode).
-// Some environments might not have setTimeout or clearTimeout.
-
-var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
-var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
-var noTimeout = -1; // -------------------
-//     Mutation
-// -------------------
-
-var supportsMutation = true;
-function commitMount(domElement, type, newProps, internalInstanceHandle) {
-  // Despite the naming that might imply otherwise, this method only
-  // fires if there is an `Update` effect scheduled during mounting.
-  // This happens if `finalizeInitialChildren` returns `true` (which it
-  // does to implement the `autoFocus` attribute on the client). But
-  // there are also other cases when this might happen (such as patching
-  // up text content during hydration mismatch). So we'll check this again.
-  if (shouldAutoFocusHostComponent(type, newProps)) {
-    domElement.focus();
-  }
-}
-function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
-  // Update the props handle so that we know which props are the ones with
-  // with current event handlers.
-  updateFiberProps(domElement, newProps); // Apply the diff to the DOM node.
-
-  updateProperties(domElement, updatePayload, type, oldProps, newProps);
-}
-function resetTextContent(domElement) {
-  setTextContent(domElement, '');
-}
-function commitTextUpdate(textInstance, oldText, newText) {
-  textInstance.nodeValue = newText;
-}
-function appendChild(parentInstance, child) {
-  parentInstance.appendChild(child);
-}
-function appendChildToContainer(container, child) {
-  var parentNode;
-
-  if (container.nodeType === COMMENT_NODE) {
-    parentNode = container.parentNode;
-    parentNode.insertBefore(child, container);
-  } else {
-    parentNode = container;
-    parentNode.appendChild(child);
-  } // This container might be used for a portal.
-  // If something inside a portal is clicked, that click should bubble
-  // through the React tree. However, on Mobile Safari the click would
-  // never bubble through the *DOM* tree unless an ancestor with onclick
-  // event exists. So we wouldn't see it and dispatch it.
-  // This is why we ensure that non React root containers have inline onclick
-  // defined.
-  // https://github.com/facebook/react/issues/11918
-
-
-  var reactRootContainer = container._reactRootContainer;
-
-  if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
-    // TODO: This cast may not be sound for SVG, MathML or custom elements.
-    trapClickOnNonInteractiveElement(parentNode);
-  }
-}
-function insertBefore(parentInstance, child, beforeChild) {
-  parentInstance.insertBefore(child, beforeChild);
-}
-function insertInContainerBefore(container, child, beforeChild) {
-  if (container.nodeType === COMMENT_NODE) {
-    container.parentNode.insertBefore(child, beforeChild);
-  } else {
-    container.insertBefore(child, beforeChild);
-  }
-} // This is a specific event for the React Flare
-// event system, so event responders can act
-// accordingly to a DOM node being unmounted that
-// previously had active document focus.
-
-function dispatchDetachedVisibleNodeEvent(child) {
-  if (enableFlareAPI && selectionInformation && child === selectionInformation.focusedElem) {
-    var targetFiber = getClosestInstanceFromNode(child); // Simlulate a blur event to the React Flare responder system.
-
-    dispatchEventForResponderEventSystem('detachedvisiblenode', targetFiber, {
-      target: child,
-      timeStamp: Date.now()
-    }, child, RESPONDER_EVENT_SYSTEM | IS_PASSIVE);
-  }
-}
-
-function removeChild(parentInstance, child) {
-  dispatchDetachedVisibleNodeEvent(child);
-  parentInstance.removeChild(child);
-}
-function removeChildFromContainer(container, child) {
-  if (container.nodeType === COMMENT_NODE) {
-    container.parentNode.removeChild(child);
-  } else {
-    dispatchDetachedVisibleNodeEvent(child);
-    container.removeChild(child);
-  }
-}
-function clearSuspenseBoundary(parentInstance, suspenseInstance) {
-  var node = suspenseInstance; // Delete all nodes within this suspense boundary.
-  // There might be nested nodes so we need to keep track of how
-  // deep we are and only break out when we're back on top.
-
-  var depth = 0;
-
-  do {
-    var nextNode = node.nextSibling;
-    parentInstance.removeChild(node);
-
-    if (nextNode && nextNode.nodeType === COMMENT_NODE) {
-      var data = nextNode.data;
-
-      if (data === SUSPENSE_END_DATA) {
-        if (depth === 0) {
-          parentInstance.removeChild(nextNode); // Retry if any event replaying was blocked on this.
-
-          retryIfBlockedOn(suspenseInstance);
-          return;
-        } else {
-          depth--;
-        }
-      } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_FALLBACK_START_DATA) {
-        depth++;
-      }
-    }
-
-    node = nextNode;
-  } while (node); // TODO: Warn, we didn't find the end comment boundary.
-  // Retry if any event replaying was blocked on this.
-
-
-  retryIfBlockedOn(suspenseInstance);
-}
-function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
-  if (container.nodeType === COMMENT_NODE) {
-    clearSuspenseBoundary(container.parentNode, suspenseInstance);
-  } else if (container.nodeType === ELEMENT_NODE) {
-    clearSuspenseBoundary(container, suspenseInstance);
-  } else {} // Document nodes should never contain suspense boundaries.
-  // Retry if any event replaying was blocked on this.
-
-
-  retryIfBlockedOn(container);
-}
-function hideInstance(instance) {
-  // TODO: Does this work for all element types? What about MathML? Should we
-  // pass host context to this method?
-  instance = instance;
-  var style = instance.style;
-
-  if (typeof style.setProperty === 'function') {
-    style.setProperty('display', 'none', 'important');
-  } else {
-    style.display = 'none';
-  }
-}
-function hideTextInstance(textInstance) {
-  textInstance.nodeValue = '';
-}
-function unhideInstance(instance, props) {
-  instance = instance;
-  var styleProp = props[STYLE];
-  var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
-  instance.style.display = dangerousStyleValue('display', display);
-}
-function unhideTextInstance(textInstance, text) {
-  textInstance.nodeValue = text;
-} // -------------------
-//     Hydration
-// -------------------
-
-var supportsHydration = true;
-function canHydrateInstance(instance, type, props) {
-  if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
-    return null;
-  } // This has now been refined to an element node.
 
+  function getCompositionEventType(topLevelType) {
+    switch (topLevelType) {
+      case TOP_COMPOSITION_START:
+        return eventTypes.compositionStart;
 
-  return instance;
-}
-function canHydrateTextInstance(instance, text) {
-  if (text === '' || instance.nodeType !== TEXT_NODE) {
-    // Empty strings are not parsed by HTML so there won't be a correct match here.
-    return null;
-  } // This has now been refined to a text node.
+      case TOP_COMPOSITION_END:
+        return eventTypes.compositionEnd;
 
+      case TOP_COMPOSITION_UPDATE:
+        return eventTypes.compositionUpdate;
+    }
+  }
+  /**
+   * Does our fallback best-guess model think this event signifies that
+   * composition has begun?
+   *
+   * @param {string} topLevelType
+   * @param {object} nativeEvent
+   * @return {boolean}
+   */
 
-  return instance;
-}
-function canHydrateSuspenseInstance(instance) {
-  if (instance.nodeType !== COMMENT_NODE) {
-    // Empty strings are not parsed by HTML so there won't be a correct match here.
-    return null;
-  } // This has now been refined to a suspense node.
 
+  function isFallbackCompositionStart(topLevelType, nativeEvent) {
+    return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;
+  }
+  /**
+   * Does our fallback mode think that this event is the end of composition?
+   *
+   * @param {string} topLevelType
+   * @param {object} nativeEvent
+   * @return {boolean}
+   */
 
-  return instance;
-}
-function isSuspenseInstancePending(instance) {
-  return instance.data === SUSPENSE_PENDING_START_DATA;
-}
-function isSuspenseInstanceFallback(instance) {
-  return instance.data === SUSPENSE_FALLBACK_START_DATA;
-}
-function registerSuspenseInstanceRetry(instance, callback) {
-  instance._reactRetry = callback;
-}
 
-function getNextHydratable(node) {
-  // Skip non-hydratable nodes.
-  for (; node != null; node = node.nextSibling) {
-    var nodeType = node.nodeType;
+  function isFallbackCompositionEnd(topLevelType, nativeEvent) {
+    switch (topLevelType) {
+      case TOP_KEY_UP:
+        // Command keys insert or clear IME input.
+        return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
 
-    if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {
-      break;
-    }
+      case TOP_KEY_DOWN:
+        // Expect IME keyCode on each keydown. If we get any other
+        // code we must have exited earlier.
+        return nativeEvent.keyCode !== START_KEYCODE;
 
-    if (enableSuspenseServerRenderer) {
-      if (nodeType === COMMENT_NODE) {
-        var nodeData = node.data;
+      case TOP_KEY_PRESS:
+      case TOP_MOUSE_DOWN:
+      case TOP_BLUR:
+        // Events are not possible without cancelling IME.
+        return true;
 
-        if (nodeData === SUSPENSE_START_DATA || nodeData === SUSPENSE_FALLBACK_START_DATA || nodeData === SUSPENSE_PENDING_START_DATA) {
-          break;
-        }
-      }
+      default:
+        return false;
     }
   }
+  /**
+   * Google Input Tools provides composition data via a CustomEvent,
+   * with the `data` property populated in the `detail` object. If this
+   * is available on the event object, use it. If not, this is a plain
+   * composition event and we have nothing special to extract.
+   *
+   * @param {object} nativeEvent
+   * @return {?string}
+   */
 
-  return node;
-}
-
-function getNextHydratableSibling(instance) {
-  return getNextHydratable(instance.nextSibling);
-}
-function getFirstHydratableChild(parentInstance) {
-  return getNextHydratable(parentInstance.firstChild);
-}
-function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
-  precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events
-  // get attached.
 
-  updateFiberProps(instance, props);
-  var parentNamespace;
+  function getDataFromCustomEvent(nativeEvent) {
+    var detail = nativeEvent.detail;
 
-  {
-    var hostContextDev = hostContext;
-    parentNamespace = hostContextDev.namespace;
-  }
-
-  return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);
-}
-function hydrateTextInstance(textInstance, text, internalInstanceHandle) {
-  precacheFiberNode(internalInstanceHandle, textInstance);
-  return diffHydratedText(textInstance, text);
-}
-function hydrateSuspenseInstance(suspenseInstance, internalInstanceHandle) {
-  precacheFiberNode(internalInstanceHandle, suspenseInstance);
-}
-function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
-  var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.
-  // There might be nested nodes so we need to keep track of how
-  // deep we are and only break out when we're back on top.
-
-  var depth = 0;
-
-  while (node) {
-    if (node.nodeType === COMMENT_NODE) {
-      var data = node.data;
-
-      if (data === SUSPENSE_END_DATA) {
-        if (depth === 0) {
-          return getNextHydratableSibling(node);
-        } else {
-          depth--;
-        }
-      } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
-        depth++;
-      }
+    if (typeof detail === 'object' && 'data' in detail) {
+      return detail.data;
     }
 
-    node = node.nextSibling;
-  } // TODO: Warn, we didn't find the end comment boundary.
+    return null;
+  }
+  /**
+   * Check if a composition event was triggered by Korean IME.
+   * Our fallback mode does not work well with IE's Korean IME,
+   * so just use native composition events when Korean IME is used.
+   * Although CompositionEvent.locale property is deprecated,
+   * it is available in IE, where our fallback mode is enabled.
+   *
+   * @param {object} nativeEvent
+   * @return {boolean}
+   */
 
 
-  return null;
-} // Returns the SuspenseInstance if this node is a direct child of a
-// SuspenseInstance. I.e. if its previous sibling is a Comment with
-// SUSPENSE_x_START_DATA. Otherwise, null.
+  function isUsingKoreanIME(nativeEvent) {
+    return nativeEvent.locale === 'ko';
+  } // Track the current IME composition status, if any.
 
-function getParentSuspenseInstance(targetInstance) {
-  var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.
-  // There might be nested nodes so we need to keep track of how
-  // deep we are and only break out when we're back on top.
 
-  var depth = 0;
+  var isComposing = false;
+  /**
+   * @return {?object} A SyntheticCompositionEvent.
+   */
 
-  while (node) {
-    if (node.nodeType === COMMENT_NODE) {
-      var data = node.data;
+  function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+    var eventType;
+    var fallbackData;
 
-      if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
-        if (depth === 0) {
-          return node;
-        } else {
-          depth--;
-        }
-      } else if (data === SUSPENSE_END_DATA) {
-        depth++;
+    if (canUseCompositionEvent) {
+      eventType = getCompositionEventType(topLevelType);
+    } else if (!isComposing) {
+      if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
+        eventType = eventTypes.compositionStart;
       }
+    } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+      eventType = eventTypes.compositionEnd;
     }
 
-    node = node.previousSibling;
-  }
+    if (!eventType) {
+      return null;
+    }
 
-  return null;
-}
-function commitHydratedContainer(container) {
-  // Retry if any event replaying was blocked on this.
-  retryIfBlockedOn(container);
-}
-function commitHydratedSuspenseInstance(suspenseInstance) {
-  // Retry if any event replaying was blocked on this.
-  retryIfBlockedOn(suspenseInstance);
-}
-function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {
-  {
-    warnForUnmatchedText(textInstance, text);
-  }
-}
-function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {
-  if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
-    warnForUnmatchedText(textInstance, text);
-  }
-}
-function didNotHydrateContainerInstance(parentContainer, instance) {
-  {
-    if (instance.nodeType === ELEMENT_NODE) {
-      warnForDeletedHydratableElement(parentContainer, instance);
-    } else if (instance.nodeType === COMMENT_NODE) {// TODO: warnForDeletedHydratableSuspenseBoundary
-    } else {
-      warnForDeletedHydratableText(parentContainer, instance);
+    if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
+      // The current composition is stored statically and must not be
+      // overwritten while composition continues.
+      if (!isComposing && eventType === eventTypes.compositionStart) {
+        isComposing = initialize(nativeEventTarget);
+      } else if (eventType === eventTypes.compositionEnd) {
+        if (isComposing) {
+          fallbackData = getData();
+        }
+      }
     }
-  }
-}
-function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {
-  if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
-    if (instance.nodeType === ELEMENT_NODE) {
-      warnForDeletedHydratableElement(parentInstance, instance);
-    } else if (instance.nodeType === COMMENT_NODE) {// TODO: warnForDeletedHydratableSuspenseBoundary
+
+    var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);
+
+    if (fallbackData) {
+      // Inject data generated from fallback path into the synthetic event.
+      // This matches the property of native CompositionEventInterface.
+      event.data = fallbackData;
     } else {
-      warnForDeletedHydratableText(parentInstance, instance);
+      var customData = getDataFromCustomEvent(nativeEvent);
+
+      if (customData !== null) {
+        event.data = customData;
+      }
     }
+
+    accumulateTwoPhaseDispatches(event);
+    return event;
   }
-}
-function didNotFindHydratableContainerInstance(parentContainer, type, props) {
-  {
-    warnForInsertedHydratedElement(parentContainer, type, props);
-  }
-}
-function didNotFindHydratableContainerTextInstance(parentContainer, text) {
-  {
-    warnForInsertedHydratedText(parentContainer, text);
-  }
-}
-
-function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {
-  if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
-    warnForInsertedHydratedElement(parentInstance, type, props);
-  }
-}
-function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {
-  if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {
-    warnForInsertedHydratedText(parentInstance, text);
-  }
-}
-function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {
-  if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {// TODO: warnForInsertedHydratedSuspense(parentInstance);
-  }
-}
-function mountResponderInstance(responder, responderInstance, responderProps, responderState, instance) {
-  // Listen to events
-  var doc = instance.ownerDocument;
-  var _ref = responder,
-      rootEventTypes = _ref.rootEventTypes,
-      targetEventTypes = _ref.targetEventTypes;
-
-  if (targetEventTypes !== null) {
-    listenToEventResponderEventTypes(targetEventTypes, doc);
-  }
-
-  if (rootEventTypes !== null) {
-    addRootEventTypesForResponderInstance(responderInstance, rootEventTypes);
-    listenToEventResponderEventTypes(rootEventTypes, doc);
-  }
-
-  mountEventResponder(responder, responderInstance, responderProps, responderState);
-  return responderInstance;
-}
-function unmountResponderInstance(responderInstance) {
-  if (enableFlareAPI) {
-    // TODO stop listening to targetEventTypes
-    unmountEventResponder(responderInstance);
-  }
-}
-function getFundamentalComponentInstance(fundamentalInstance) {
-  if (enableFundamentalAPI) {
-    var currentFiber = fundamentalInstance.currentFiber,
-        impl = fundamentalInstance.impl,
-        props = fundamentalInstance.props,
-        state = fundamentalInstance.state;
-    var instance = impl.getInstance(null, props, state);
-    precacheFiberNode(currentFiber, instance);
-    return instance;
-  } // Because of the flag above, this gets around the Flow error;
-
-
-  return null;
-}
-function mountFundamentalComponent(fundamentalInstance) {
-  if (enableFundamentalAPI) {
-    var impl = fundamentalInstance.impl,
-        instance = fundamentalInstance.instance,
-        props = fundamentalInstance.props,
-        state = fundamentalInstance.state;
-    var onMount = impl.onMount;
-
-    if (onMount !== undefined) {
-      onMount(null, instance, props, state);
-    }
-  }
-}
-function shouldUpdateFundamentalComponent(fundamentalInstance) {
-  if (enableFundamentalAPI) {
-    var impl = fundamentalInstance.impl,
-        prevProps = fundamentalInstance.prevProps,
-        props = fundamentalInstance.props,
-        state = fundamentalInstance.state;
-    var shouldUpdate = impl.shouldUpdate;
-
-    if (shouldUpdate !== undefined) {
-      return shouldUpdate(null, prevProps, props, state);
-    }
-  }
-
-  return true;
-}
-function updateFundamentalComponent(fundamentalInstance) {
-  if (enableFundamentalAPI) {
-    var impl = fundamentalInstance.impl,
-        instance = fundamentalInstance.instance,
-        prevProps = fundamentalInstance.prevProps,
-        props = fundamentalInstance.props,
-        state = fundamentalInstance.state;
-    var onUpdate = impl.onUpdate;
-
-    if (onUpdate !== undefined) {
-      onUpdate(null, instance, prevProps, props, state);
-    }
-  }
-}
-function unmountFundamentalComponent(fundamentalInstance) {
-  if (enableFundamentalAPI) {
-    var impl = fundamentalInstance.impl,
-        instance = fundamentalInstance.instance,
-        props = fundamentalInstance.props,
-        state = fundamentalInstance.state;
-    var onUnmount = impl.onUnmount;
-
-    if (onUnmount !== undefined) {
-      onUnmount(null, instance, props, state);
-    }
-  }
-}
-function getInstanceFromNode$2(node) {
-  return getClosestInstanceFromNode(node) || null;
-}
-
-var randomKey = Math.random().toString(36).slice(2);
-var internalInstanceKey = '__reactInternalInstance$' + randomKey;
-var internalEventHandlersKey = '__reactEventHandlers$' + randomKey;
-var internalContainerInstanceKey = '__reactContainere$' + randomKey;
-function precacheFiberNode(hostInst, node) {
-  node[internalInstanceKey] = hostInst;
-}
-function markContainerAsRoot(hostRoot, node) {
-  node[internalContainerInstanceKey] = hostRoot;
-}
-function unmarkContainerAsRoot(node) {
-  node[internalContainerInstanceKey] = null;
-}
-function isContainerMarkedAsRoot(node) {
-  return !!node[internalContainerInstanceKey];
-} // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.
-// If the target node is part of a hydrated or not yet rendered subtree, then
-// this may also return a SuspenseComponent or HostRoot to indicate that.
-// Conceptually the HostRoot fiber is a child of the Container node. So if you
-// pass the Container node as the targetNode, you will not actually get the
-// HostRoot back. To get to the HostRoot, you need to pass a child of it.
-// The same thing applies to Suspense boundaries.
-
-function getClosestInstanceFromNode(targetNode) {
-  var targetInst = targetNode[internalInstanceKey];
-
-  if (targetInst) {
-    // Don't return HostRoot or SuspenseComponent here.
-    return targetInst;
-  } // If the direct event target isn't a React owned DOM node, we need to look
-  // to see if one of its parents is a React owned DOM node.
-
-
-  var parentNode = targetNode.parentNode;
-
-  while (parentNode) {
-    // We'll check if this is a container root that could include
-    // React nodes in the future. We need to check this first because
-    // if we're a child of a dehydrated container, we need to first
-    // find that inner container before moving on to finding the parent
-    // instance. Note that we don't check this field on  the targetNode
-    // itself because the fibers are conceptually between the container
-    // node and the first child. It isn't surrounding the container node.
-    // If it's not a container, we check if it's an instance.
-    targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];
+  /**
+   * @param {TopLevelType} topLevelType Number from `TopLevelType`.
+   * @param {object} nativeEvent Native browser event.
+   * @return {?string} The string corresponding to this `beforeInput` event.
+   */
 
-    if (targetInst) {
-      // Since this wasn't the direct target of the event, we might have
-      // stepped past dehydrated DOM nodes to get here. However they could
-      // also have been non-React nodes. We need to answer which one.
-      // If we the instance doesn't have any children, then there can't be
-      // a nested suspense boundary within it. So we can use this as a fast
-      // bailout. Most of the time, when people add non-React children to
-      // the tree, it is using a ref to a child-less DOM node.
-      // Normally we'd only need to check one of the fibers because if it
-      // has ever gone from having children to deleting them or vice versa
-      // it would have deleted the dehydrated boundary nested inside already.
-      // However, since the HostRoot starts out with an alternate it might
-      // have one on the alternate so we need to check in case this was a
-      // root.
-      var alternate = targetInst.alternate;
 
-      if (targetInst.child !== null || alternate !== null && alternate.child !== null) {
-        // Next we need to figure out if the node that skipped past is
-        // nested within a dehydrated boundary and if so, which one.
-        var suspenseInstance = getParentSuspenseInstance(targetNode);
+  function getNativeBeforeInputChars(topLevelType, nativeEvent) {
+    switch (topLevelType) {
+      case TOP_COMPOSITION_END:
+        return getDataFromCustomEvent(nativeEvent);
 
-        while (suspenseInstance !== null) {
-          // We found a suspense instance. That means that we haven't
-          // hydrated it yet. Even though we leave the comments in the
-          // DOM after hydrating, and there are boundaries in the DOM
-          // that could already be hydrated, we wouldn't have found them
-          // through this pass since if the target is hydrated it would
-          // have had an internalInstanceKey on it.
-          // Let's get the fiber associated with the SuspenseComponent
-          // as the deepest instance.
-          var targetSuspenseInst = suspenseInstance[internalInstanceKey];
+      case TOP_KEY_PRESS:
+        /**
+         * If native `textInput` events are available, our goal is to make
+         * use of them. However, there is a special case: the spacebar key.
+         * In Webkit, preventing default on a spacebar `textInput` event
+         * cancels character insertion, but it *also* causes the browser
+         * to fall back to its default spacebar behavior of scrolling the
+         * page.
+         *
+         * Tracking at:
+         * https://code.google.com/p/chromium/issues/detail?id=355103
+         *
+         * To avoid this issue, use the keypress event as if no `textInput`
+         * event is available.
+         */
+        var which = nativeEvent.which;
+
+        if (which !== SPACEBAR_CODE) {
+          return null;
+        }
 
-          if (targetSuspenseInst) {
-            return targetSuspenseInst;
-          } // If we don't find a Fiber on the comment, it might be because
-          // we haven't gotten to hydrate it yet. There might still be a
-          // parent boundary that hasn't above this one so we need to find
-          // the outer most that is known.
+        hasSpaceKeypress = true;
+        return SPACEBAR_CHAR;
 
+      case TOP_TEXT_INPUT:
+        // Record the characters to be added to the DOM.
+        var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled
+        // it at the keypress level and bail immediately. Android Chrome
+        // doesn't give us keycodes, so we need to ignore it.
 
-          suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent
-          // host component also hasn't hydrated yet. We can return it
-          // below since it will bail out on the isMounted check later.
+        if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
+          return null;
         }
-      }
 
-      return targetInst;
-    }
+        return chars;
 
-    targetNode = parentNode;
-    parentNode = targetNode.parentNode;
+      default:
+        // For other native event types, do nothing.
+        return null;
+    }
   }
+  /**
+   * For browsers that do not provide the `textInput` event, extract the
+   * appropriate string to use for SyntheticInputEvent.
+   *
+   * @param {number} topLevelType Number from `TopLevelEventTypes`.
+   * @param {object} nativeEvent Native browser event.
+   * @return {?string} The fallback string for this `beforeInput` event.
+   */
 
-  return null;
-}
-/**
- * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
- * instance, or null if the node was not rendered by this React.
- */
 
-function getInstanceFromNode$1(node) {
-  var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];
+  function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
+    // If we are currently composing (IME) and using a fallback to do so,
+    // try to extract the composed characters from the fallback object.
+    // If composition event is available, we extract a string only at
+    // compositionevent, otherwise extract it at fallback events.
+    if (isComposing) {
+      if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+        var chars = getData();
+        reset();
+        isComposing = false;
+        return chars;
+      }
 
-  if (inst) {
-    if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {
-      return inst;
-    } else {
       return null;
     }
-  }
 
-  return null;
-}
-/**
- * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
- * DOM node.
- */
+    switch (topLevelType) {
+      case TOP_PASTE:
+        // If a paste event occurs after a keypress, throw out the input
+        // chars. Paste events should not lead to BeforeInput events.
+        return null;
 
-function getNodeFromInstance$1(inst) {
-  if (inst.tag === HostComponent || inst.tag === HostText) {
-    // In Fiber this, is just the state node right now. We assume it will be
-    // a host component or host text.
-    return inst.stateNode;
-  } // Without this first invariant, passing a non-DOM-component triggers the next
-  // invariant for a missing parent, which is super confusing.
+      case TOP_KEY_PRESS:
+        /**
+         * As of v27, Firefox may fire keypress events even when no character
+         * will be inserted. A few possibilities:
+         *
+         * - `which` is `0`. Arrow keys, Esc key, etc.
+         *
+         * - `which` is the pressed key code, but no char is available.
+         *   Ex: 'AltGr + d` in Polish. There is no modified character for
+         *   this key combination and no character is inserted into the
+         *   document, but FF fires the keypress for char code `100` anyway.
+         *   No `input` event will occur.
+         *
+         * - `which` is the pressed key code, but a command combination is
+         *   being used. Ex: `Cmd+C`. No character is inserted, and no
+         *   `input` event will occur.
+         */
+        if (!isKeypressCommand(nativeEvent)) {
+          // IE fires the `keypress` event when a user types an emoji via
+          // Touch keyboard of Windows.  In such a case, the `char` property
+          // holds an emoji character like `\uD83D\uDE0A`.  Because its length
+          // is 2, the property `which` does not represent an emoji correctly.
+          // In such a case, we directly return the `char` property instead of
+          // using `which`.
+          if (nativeEvent.char && nativeEvent.char.length > 1) {
+            return nativeEvent.char;
+          } else if (nativeEvent.which) {
+            return String.fromCharCode(nativeEvent.which);
+          }
+        }
 
+        return null;
 
-  {
-    {
-      throw Error("getNodeFromInstance: Invalid argument.");
+      case TOP_COMPOSITION_END:
+        return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
+
+      default:
+        return null;
     }
   }
-}
-function getFiberCurrentPropsFromNode$1(node) {
-  return node[internalEventHandlersKey] || null;
-}
-function updateFiberProps(node, props) {
-  node[internalEventHandlersKey] = props;
-}
+  /**
+   * Extract a SyntheticInputEvent for `beforeInput`, based on either native
+   * `textInput` or fallback behavior.
+   *
+   * @return {?object} A SyntheticInputEvent.
+   */
 
-/**
- * These variables store information about text content of a target node,
- * allowing comparison of content before and after a given event.
- *
- * Identify the node where selection currently begins, then observe
- * both its text content and its current position in the DOM. Since the
- * browser may natively replace the target node during composition, we can
- * use its position to find its replacement.
- *
- *
- */
-var root = null;
-var startText = null;
-var fallbackText = null;
-function initialize(nativeEventTarget) {
-  root = nativeEventTarget;
-  startText = getText();
-  return true;
-}
-function reset() {
-  root = null;
-  startText = null;
-  fallbackText = null;
-}
-function getData() {
-  if (fallbackText) {
-    return fallbackText;
-  }
 
-  var start;
-  var startValue = startText;
-  var startLength = startValue.length;
-  var end;
-  var endValue = getText();
-  var endLength = endValue.length;
+  function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
+    var chars;
 
-  for (start = 0; start < startLength; start++) {
-    if (startValue[start] !== endValue[start]) {
-      break;
-    }
-  }
+    if (canUseTextInputEvent) {
+      chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
+    } else {
+      chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
+    } // If no characters are being inserted, no BeforeInput event should
+    // be fired.
 
-  var minEnd = startLength - start;
 
-  for (end = 1; end <= minEnd; end++) {
-    if (startValue[startLength - end] !== endValue[endLength - end]) {
-      break;
+    if (!chars) {
+      return null;
     }
-  }
 
-  var sliceTail = end > 1 ? 1 - end : undefined;
-  fallbackText = endValue.slice(start, sliceTail);
-  return fallbackText;
-}
-function getText() {
-  if ('value' in root) {
-    return root.value;
+    var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);
+    event.data = chars;
+    accumulateTwoPhaseDispatches(event);
+    return event;
   }
+  /**
+   * Create an `onBeforeInput` event to match
+   * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
+   *
+   * This event plugin is based on the native `textInput` event
+   * available in Chrome, Safari, Opera, and IE. This event fires after
+   * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
+   *
+   * `beforeInput` is spec'd but not implemented in any browsers, and
+   * the `input` event does not provide any useful information about what has
+   * actually been added, contrary to the spec. Thus, `textInput` is the best
+   * available event to identify the characters that have actually been inserted
+   * into the target node.
+   *
+   * This plugin is also responsible for emitting `composition` events, thus
+   * allowing us to share composition fallback code for both `beforeInput` and
+   * `composition` event types.
+   */
 
-  return root.textContent;
-}
 
-/**
- * @interface Event
- * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
- */
+  var BeforeInputEventPlugin = {
+    eventTypes: eventTypes,
+    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
+      var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
+      var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
 
-var SyntheticCompositionEvent = SyntheticEvent.extend({
-  data: null
-});
+      if (composition === null) {
+        return beforeInput;
+      }
 
-/**
- * @interface Event
- * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
- *      /#events-inputevents
- */
+      if (beforeInput === null) {
+        return composition;
+      }
+
+      return [composition, beforeInput];
+    }
+  };
 
-var SyntheticInputEvent = SyntheticEvent.extend({
-  data: null
-});
+  /**
+   * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
+   */
+  var supportedInputTypes = {
+    color: true,
+    date: true,
+    datetime: true,
+    'datetime-local': true,
+    email: true,
+    month: true,
+    number: true,
+    password: true,
+    range: true,
+    search: true,
+    tel: true,
+    text: true,
+    time: true,
+    url: true,
+    week: true
+  };
 
-var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
+  function isTextInputElement(elem) {
+    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
 
-var START_KEYCODE = 229;
-var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;
-var documentMode = null;
+    if (nodeName === 'input') {
+      return !!supportedInputTypes[elem.type];
+    }
 
-if (canUseDOM && 'documentMode' in document) {
-  documentMode = document.documentMode;
-} // Webkit offers a very useful `textInput` event that can be used to
-// directly represent `beforeInput`. The IE `textinput` event is not as
-// useful, so we don't use it.
+    if (nodeName === 'textarea') {
+      return true;
+    }
 
+    return false;
+  }
 
-var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied
-// by the native compositionend event may be incorrect. Japanese ideographic
-// spaces, for instance (\u3000) are not recorded correctly.
+  var eventTypes$1 = {
+    change: {
+      phasedRegistrationNames: {
+        bubbled: 'onChange',
+        captured: 'onChangeCapture'
+      },
+      dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE]
+    }
+  };
 
-var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
-var SPACEBAR_CODE = 32;
-var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names.
+  function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
+    var event = SyntheticEvent.getPooled(eventTypes$1.change, inst, nativeEvent, target);
+    event.type = 'change'; // Flag this event loop as needing state restore.
 
-var eventTypes$1 = {
-  beforeInput: {
-    phasedRegistrationNames: {
-      bubbled: 'onBeforeInput',
-      captured: 'onBeforeInputCapture'
-    },
-    dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]
-  },
-  compositionEnd: {
-    phasedRegistrationNames: {
-      bubbled: 'onCompositionEnd',
-      captured: 'onCompositionEndCapture'
-    },
-    dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
-  },
-  compositionStart: {
-    phasedRegistrationNames: {
-      bubbled: 'onCompositionStart',
-      captured: 'onCompositionStartCapture'
-    },
-    dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
-  },
-  compositionUpdate: {
-    phasedRegistrationNames: {
-      bubbled: 'onCompositionUpdate',
-      captured: 'onCompositionUpdateCapture'
-    },
-    dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]
+    enqueueStateRestore(target);
+    accumulateTwoPhaseDispatches(event);
+    return event;
   }
-}; // Track whether we've ever handled a keypress on the space key.
+  /**
+   * For IE shims
+   */
 
-var hasSpaceKeypress = false;
-/**
- * Return whether a native keypress event is assumed to be a command.
- * This is required because Firefox fires `keypress` events for key commands
- * (cut, copy, select-all, etc.) even though no character is inserted.
- */
 
-function isKeypressCommand(nativeEvent) {
-  return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.
-  !(nativeEvent.ctrlKey && nativeEvent.altKey);
-}
-/**
- * Translate native top level events into event types.
- *
- * @param {string} topLevelType
- * @return {object}
- */
+  var activeElement = null;
+  var activeElementInst = null;
+  /**
+   * SECTION: handle `change` event
+   */
 
+  function shouldUseChangeEvent(elem) {
+    var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
+    return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
+  }
 
-function getCompositionEventType(topLevelType) {
-  switch (topLevelType) {
-    case TOP_COMPOSITION_START:
-      return eventTypes$1.compositionStart;
+  function manualDispatchChangeEvent(nativeEvent) {
+    var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the
+    // other events and have it go through ReactBrowserEventEmitter. Since it
+    // doesn't, we manually listen for the events and so we have to enqueue and
+    // process the abstract event manually.
+    //
+    // Batching is necessary here in order to ensure that all event handlers run
+    // before the next rerender (including event handlers attached to ancestor
+    // elements instead of directly on the input). Without this, controlled
+    // components don't work properly in conjunction with event bubbling because
+    // the component is rerendered and the value reverted before all the event
+    // handlers can run. See https://github.com/facebook/react/issues/708.
 
-    case TOP_COMPOSITION_END:
-      return eventTypes$1.compositionEnd;
+    batchedUpdates(runEventInBatch, event);
+  }
 
-    case TOP_COMPOSITION_UPDATE:
-      return eventTypes$1.compositionUpdate;
+  function runEventInBatch(event) {
+    runEventsInBatch(event);
   }
-}
-/**
- * Does our fallback best-guess model think this event signifies that
- * composition has begun?
- *
- * @param {string} topLevelType
- * @param {object} nativeEvent
- * @return {boolean}
- */
 
+  function getInstIfValueChanged(targetInst) {
+    var targetNode = getNodeFromInstance$1(targetInst);
 
-function isFallbackCompositionStart(topLevelType, nativeEvent) {
-  return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;
-}
-/**
- * Does our fallback mode think that this event is the end of composition?
- *
- * @param {string} topLevelType
- * @param {object} nativeEvent
- * @return {boolean}
- */
+    if (updateValueIfChanged(targetNode)) {
+      return targetInst;
+    }
+  }
 
+  function getTargetInstForChangeEvent(topLevelType, targetInst) {
+    if (topLevelType === TOP_CHANGE) {
+      return targetInst;
+    }
+  }
+  /**
+   * SECTION: handle `input` event
+   */
 
-function isFallbackCompositionEnd(topLevelType, nativeEvent) {
-  switch (topLevelType) {
-    case TOP_KEY_UP:
-      // Command keys insert or clear IME input.
-      return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
 
-    case TOP_KEY_DOWN:
-      // Expect IME keyCode on each keydown. If we get any other
-      // code we must have exited earlier.
-      return nativeEvent.keyCode !== START_KEYCODE;
+  var isInputEventSupported = false;
 
-    case TOP_KEY_PRESS:
-    case TOP_MOUSE_DOWN:
-    case TOP_BLUR:
-      // Events are not possible without cancelling IME.
-      return true;
+  if (canUseDOM) {
+    // IE9 claims to support the input event but fails to trigger it when
+    // deleting text, so we ignore its input events.
+    isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);
+  }
+  /**
+   * (For IE <=9) Starts tracking propertychange events on the passed-in element
+   * and override the value property so that we can distinguish user events from
+   * value changes in JS.
+   */
 
-    default:
-      return false;
+
+  function startWatchingForValueChange(target, targetInst) {
+    activeElement = target;
+    activeElementInst = targetInst;
+    activeElement.attachEvent('onpropertychange', handlePropertyChange);
   }
-}
-/**
- * Google Input Tools provides composition data via a CustomEvent,
- * with the `data` property populated in the `detail` object. If this
- * is available on the event object, use it. If not, this is a plain
- * composition event and we have nothing special to extract.
- *
- * @param {object} nativeEvent
- * @return {?string}
- */
+  /**
+   * (For IE <=9) Removes the event listeners from the currently-tracked element,
+   * if any exists.
+   */
 
 
-function getDataFromCustomEvent(nativeEvent) {
-  var detail = nativeEvent.detail;
+  function stopWatchingForValueChange() {
+    if (!activeElement) {
+      return;
+    }
 
-  if (typeof detail === 'object' && 'data' in detail) {
-    return detail.data;
+    activeElement.detachEvent('onpropertychange', handlePropertyChange);
+    activeElement = null;
+    activeElementInst = null;
   }
-
-  return null;
-}
-/**
- * Check if a composition event was triggered by Korean IME.
- * Our fallback mode does not work well with IE's Korean IME,
- * so just use native composition events when Korean IME is used.
- * Although CompositionEvent.locale property is deprecated,
- * it is available in IE, where our fallback mode is enabled.
- *
- * @param {object} nativeEvent
- * @return {boolean}
- */
+  /**
+   * (For IE <=9) Handles a propertychange event, sending a `change` event if
+   * the value of the active element has changed.
+   */
 
 
-function isUsingKoreanIME(nativeEvent) {
-  return nativeEvent.locale === 'ko';
-} // Track the current IME composition status, if any.
+  function handlePropertyChange(nativeEvent) {
+    if (nativeEvent.propertyName !== 'value') {
+      return;
+    }
 
+    if (getInstIfValueChanged(activeElementInst)) {
+      manualDispatchChangeEvent(nativeEvent);
+    }
+  }
 
-var isComposing = false;
-/**
- * @return {?object} A SyntheticCompositionEvent.
- */
+  function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {
+    if (topLevelType === TOP_FOCUS) {
+      // In IE9, propertychange fires for most input events but is buggy and
+      // doesn't fire when text is deleted, but conveniently, selectionchange
+      // appears to fire in all of the remaining cases so we catch those and
+      // forward the event if the value has changed
+      // In either case, we don't want to call the event handler if the value
+      // is changed from JS so we redefine a setter for `.value` that updates
+      // our activeElementValue variable, allowing us to ignore those changes
+      //
+      // stopWatching() should be a noop here but we call it just in case we
+      // missed a blur event somehow.
+      stopWatchingForValueChange();
+      startWatchingForValueChange(target, targetInst);
+    } else if (topLevelType === TOP_BLUR) {
+      stopWatchingForValueChange();
+    }
+  } // For IE8 and IE9.
 
-function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
-  var eventType;
-  var fallbackData;
 
-  if (canUseCompositionEvent) {
-    eventType = getCompositionEventType(topLevelType);
-  } else if (!isComposing) {
-    if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
-      eventType = eventTypes$1.compositionStart;
+  function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {
+    if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) {
+      // On the selectionchange event, the target is just document which isn't
+      // helpful for us so just check activeElement instead.
+      //
+      // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
+      // propertychange on the first input event after setting `value` from a
+      // script and fires only keydown, keypress, keyup. Catching keyup usually
+      // gets it and catching keydown lets us fire an event for the first
+      // keystroke if user does a key repeat (it'll be a little delayed: right
+      // before the second keystroke). Other input methods (e.g., paste) seem to
+      // fire selectionchange normally.
+      return getInstIfValueChanged(activeElementInst);
     }
-  } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
-    eventType = eventTypes$1.compositionEnd;
   }
+  /**
+   * SECTION: handle `click` event
+   */
 
-  if (!eventType) {
-    return null;
+
+  function shouldUseClickEvent(elem) {
+    // Use the `click` event to detect changes to checkbox and radio inputs.
+    // This approach works across all browsers, whereas `change` does not fire
+    // until `blur` in IE8.
+    var nodeName = elem.nodeName;
+    return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
   }
 
-  if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
-    // The current composition is stored statically and must not be
-    // overwritten while composition continues.
-    if (!isComposing && eventType === eventTypes$1.compositionStart) {
-      isComposing = initialize(nativeEventTarget);
-    } else if (eventType === eventTypes$1.compositionEnd) {
-      if (isComposing) {
-        fallbackData = getData();
-      }
+  function getTargetInstForClickEvent(topLevelType, targetInst) {
+    if (topLevelType === TOP_CLICK) {
+      return getInstIfValueChanged(targetInst);
+    }
+  }
+
+  function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {
+    if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) {
+      return getInstIfValueChanged(targetInst);
     }
   }
 
-  var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);
+  function handleControlledInputBlur(node) {
+    var state = node._wrapperState;
 
-  if (fallbackData) {
-    // Inject data generated from fallback path into the synthetic event.
-    // This matches the property of native CompositionEventInterface.
-    event.data = fallbackData;
-  } else {
-    var customData = getDataFromCustomEvent(nativeEvent);
+    if (!state || !state.controlled || node.type !== 'number') {
+      return;
+    }
 
-    if (customData !== null) {
-      event.data = customData;
+    {
+      // If controlled, assign the value attribute to the current value on blur
+      setDefaultValue(node, 'number', node.value);
     }
   }
+  /**
+   * This plugin creates an `onChange` event that normalizes change events
+   * across form elements. This event fires at a time when it's possible to
+   * change the element's value without seeing a flicker.
+   *
+   * Supported elements are:
+   * - input (see `isTextInputElement`)
+   * - textarea
+   * - select
+   */
 
-  accumulateTwoPhaseDispatches(event);
-  return event;
-}
-/**
- * @param {TopLevelType} topLevelType Number from `TopLevelType`.
- * @param {object} nativeEvent Native browser event.
- * @return {?string} The string corresponding to this `beforeInput` event.
- */
 
+  var ChangeEventPlugin = {
+    eventTypes: eventTypes$1,
+    _isInputEventSupported: isInputEventSupported,
+    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
+      var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
+      var getTargetInstFunc, handleEventFunc;
 
-function getNativeBeforeInputChars(topLevelType, nativeEvent) {
-  switch (topLevelType) {
-    case TOP_COMPOSITION_END:
-      return getDataFromCustomEvent(nativeEvent);
-
-    case TOP_KEY_PRESS:
-      /**
-       * If native `textInput` events are available, our goal is to make
-       * use of them. However, there is a special case: the spacebar key.
-       * In Webkit, preventing default on a spacebar `textInput` event
-       * cancels character insertion, but it *also* causes the browser
-       * to fall back to its default spacebar behavior of scrolling the
-       * page.
-       *
-       * Tracking at:
-       * https://code.google.com/p/chromium/issues/detail?id=355103
-       *
-       * To avoid this issue, use the keypress event as if no `textInput`
-       * event is available.
-       */
-      var which = nativeEvent.which;
-
-      if (which !== SPACEBAR_CODE) {
-        return null;
+      if (shouldUseChangeEvent(targetNode)) {
+        getTargetInstFunc = getTargetInstForChangeEvent;
+      } else if (isTextInputElement(targetNode)) {
+        if (isInputEventSupported) {
+          getTargetInstFunc = getTargetInstForInputOrChangeEvent;
+        } else {
+          getTargetInstFunc = getTargetInstForInputEventPolyfill;
+          handleEventFunc = handleEventsForInputEventPolyfill;
+        }
+      } else if (shouldUseClickEvent(targetNode)) {
+        getTargetInstFunc = getTargetInstForClickEvent;
       }
 
-      hasSpaceKeypress = true;
-      return SPACEBAR_CHAR;
+      if (getTargetInstFunc) {
+        var inst = getTargetInstFunc(topLevelType, targetInst);
 
-    case TOP_TEXT_INPUT:
-      // Record the characters to be added to the DOM.
-      var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled
-      // it at the keypress level and bail immediately. Android Chrome
-      // doesn't give us keycodes, so we need to ignore it.
-
-      if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
-        return null;
+        if (inst) {
+          var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);
+          return event;
+        }
       }
 
-      return chars;
-
-    default:
-      // For other native event types, do nothing.
-      return null;
-  }
-}
-/**
- * For browsers that do not provide the `textInput` event, extract the
- * appropriate string to use for SyntheticInputEvent.
- *
- * @param {number} topLevelType Number from `TopLevelEventTypes`.
- * @param {object} nativeEvent Native browser event.
- * @return {?string} The fallback string for this `beforeInput` event.
- */
+      if (handleEventFunc) {
+        handleEventFunc(topLevelType, targetNode, targetInst);
+      } // When blurring, set the value attribute for number inputs
 
 
-function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
-  // If we are currently composing (IME) and using a fallback to do so,
-  // try to extract the composed characters from the fallback object.
-  // If composition event is available, we extract a string only at
-  // compositionevent, otherwise extract it at fallback events.
-  if (isComposing) {
-    if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
-      var chars = getData();
-      reset();
-      isComposing = false;
-      return chars;
+      if (topLevelType === TOP_BLUR) {
+        handleControlledInputBlur(targetNode);
+      }
     }
+  };
 
-    return null;
-  }
+  var SyntheticUIEvent = SyntheticEvent.extend({
+    view: null,
+    detail: null
+  });
 
-  switch (topLevelType) {
-    case TOP_PASTE:
-      // If a paste event occurs after a keypress, throw out the input
-      // chars. Paste events should not lead to BeforeInput events.
-      return null;
+  /**
+   * Translation from modifier key to the associated property in the event.
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
+   */
+  var modifierKeyToProp = {
+    Alt: 'altKey',
+    Control: 'ctrlKey',
+    Meta: 'metaKey',
+    Shift: 'shiftKey'
+  }; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support
+  // getModifierState. If getModifierState is not supported, we map it to a set of
+  // modifier keys exposed by the event. In this case, Lock-keys are not supported.
 
-    case TOP_KEY_PRESS:
-      /**
-       * As of v27, Firefox may fire keypress events even when no character
-       * will be inserted. A few possibilities:
-       *
-       * - `which` is `0`. Arrow keys, Esc key, etc.
-       *
-       * - `which` is the pressed key code, but no char is available.
-       *   Ex: 'AltGr + d` in Polish. There is no modified character for
-       *   this key combination and no character is inserted into the
-       *   document, but FF fires the keypress for char code `100` anyway.
-       *   No `input` event will occur.
-       *
-       * - `which` is the pressed key code, but a command combination is
-       *   being used. Ex: `Cmd+C`. No character is inserted, and no
-       *   `input` event will occur.
-       */
-      if (!isKeypressCommand(nativeEvent)) {
-        // IE fires the `keypress` event when a user types an emoji via
-        // Touch keyboard of Windows.  In such a case, the `char` property
-        // holds an emoji character like `\uD83D\uDE0A`.  Because its length
-        // is 2, the property `which` does not represent an emoji correctly.
-        // In such a case, we directly return the `char` property instead of
-        // using `which`.
-        if (nativeEvent.char && nativeEvent.char.length > 1) {
-          return nativeEvent.char;
-        } else if (nativeEvent.which) {
-          return String.fromCharCode(nativeEvent.which);
-        }
-      }
+  function modifierStateGetter(keyArg) {
+    var syntheticEvent = this;
+    var nativeEvent = syntheticEvent.nativeEvent;
 
-      return null;
+    if (nativeEvent.getModifierState) {
+      return nativeEvent.getModifierState(keyArg);
+    }
 
-    case TOP_COMPOSITION_END:
-      return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
+    var keyProp = modifierKeyToProp[keyArg];
+    return keyProp ? !!nativeEvent[keyProp] : false;
+  }
 
-    default:
-      return null;
+  function getEventModifierState(nativeEvent) {
+    return modifierStateGetter;
   }
-}
-/**
- * Extract a SyntheticInputEvent for `beforeInput`, based on either native
- * `textInput` or fallback behavior.
- *
- * @return {?object} A SyntheticInputEvent.
- */
 
+  var previousScreenX = 0;
+  var previousScreenY = 0; // Use flags to signal movementX/Y has already been set
 
-function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
-  var chars;
+  var isMovementXSet = false;
+  var isMovementYSet = false;
+  /**
+   * @interface MouseEvent
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/
+   */
 
-  if (canUseTextInputEvent) {
-    chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
-  } else {
-    chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
-  } // If no characters are being inserted, no BeforeInput event should
-  // be fired.
+  var SyntheticMouseEvent = SyntheticUIEvent.extend({
+    screenX: null,
+    screenY: null,
+    clientX: null,
+    clientY: null,
+    pageX: null,
+    pageY: null,
+    ctrlKey: null,
+    shiftKey: null,
+    altKey: null,
+    metaKey: null,
+    getModifierState: getEventModifierState,
+    button: null,
+    buttons: null,
+    relatedTarget: function (event) {
+      return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);
+    },
+    movementX: function (event) {
+      if ('movementX' in event) {
+        return event.movementX;
+      }
 
+      var screenX = previousScreenX;
+      previousScreenX = event.screenX;
 
-  if (!chars) {
-    return null;
-  }
+      if (!isMovementXSet) {
+        isMovementXSet = true;
+        return 0;
+      }
 
-  var event = SyntheticInputEvent.getPooled(eventTypes$1.beforeInput, targetInst, nativeEvent, nativeEventTarget);
-  event.data = chars;
-  accumulateTwoPhaseDispatches(event);
-  return event;
-}
-/**
- * Create an `onBeforeInput` event to match
- * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
- *
- * This event plugin is based on the native `textInput` event
- * available in Chrome, Safari, Opera, and IE. This event fires after
- * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
- *
- * `beforeInput` is spec'd but not implemented in any browsers, and
- * the `input` event does not provide any useful information about what has
- * actually been added, contrary to the spec. Thus, `textInput` is the best
- * available event to identify the characters that have actually been inserted
- * into the target node.
- *
- * This plugin is also responsible for emitting `composition` events, thus
- * allowing us to share composition fallback code for both `beforeInput` and
- * `composition` event types.
- */
+      return event.type === 'mousemove' ? event.screenX - screenX : 0;
+    },
+    movementY: function (event) {
+      if ('movementY' in event) {
+        return event.movementY;
+      }
 
+      var screenY = previousScreenY;
+      previousScreenY = event.screenY;
 
-var BeforeInputEventPlugin = {
-  eventTypes: eventTypes$1,
-  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
-    var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
-    var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);
+      if (!isMovementYSet) {
+        isMovementYSet = true;
+        return 0;
+      }
 
-    if (composition === null) {
-      return beforeInput;
+      return event.type === 'mousemove' ? event.screenY - screenY : 0;
     }
+  });
+
+  /**
+   * @interface PointerEvent
+   * @see http://www.w3.org/TR/pointerevents/
+   */
 
-    if (beforeInput === null) {
-      return composition;
+  var SyntheticPointerEvent = SyntheticMouseEvent.extend({
+    pointerId: null,
+    width: null,
+    height: null,
+    pressure: null,
+    tangentialPressure: null,
+    tiltX: null,
+    tiltY: null,
+    twist: null,
+    pointerType: null,
+    isPrimary: null
+  });
+
+  var eventTypes$2 = {
+    mouseEnter: {
+      registrationName: 'onMouseEnter',
+      dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]
+    },
+    mouseLeave: {
+      registrationName: 'onMouseLeave',
+      dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]
+    },
+    pointerEnter: {
+      registrationName: 'onPointerEnter',
+      dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]
+    },
+    pointerLeave: {
+      registrationName: 'onPointerLeave',
+      dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]
     }
+  };
+  var EnterLeaveEventPlugin = {
+    eventTypes: eventTypes$2,
+
+    /**
+     * For almost every interaction we care about, there will be both a top-level
+     * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
+     * we do not extract duplicate events. However, moving the mouse into the
+     * browser from outside will not fire a `mouseout` event. In this case, we use
+     * the `mouseover` top-level event.
+     */
+    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
+      var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;
+      var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;
+
+      if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
+        // If this is an over event with a target, then we've already dispatched
+        // the event in the out event of the other target. If this is replayed,
+        // then it's because we couldn't dispatch against this target previously
+        // so we have to do it now instead.
+        return null;
+      }
 
-    return [composition, beforeInput];
-  }
-};
+      if (!isOutEvent && !isOverEvent) {
+        // Must not be a mouse or pointer in or out - ignoring.
+        return null;
+      }
 
-/**
- * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
- */
-var supportedInputTypes = {
-  color: true,
-  date: true,
-  datetime: true,
-  'datetime-local': true,
-  email: true,
-  month: true,
-  number: true,
-  password: true,
-  range: true,
-  search: true,
-  tel: true,
-  text: true,
-  time: true,
-  url: true,
-  week: true
-};
-
-function isTextInputElement(elem) {
-  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
-
-  if (nodeName === 'input') {
-    return !!supportedInputTypes[elem.type];
-  }
-
-  if (nodeName === 'textarea') {
-    return true;
-  }
+      var win;
 
-  return false;
-}
+      if (nativeEventTarget.window === nativeEventTarget) {
+        // `nativeEventTarget` is probably a window object.
+        win = nativeEventTarget;
+      } else {
+        // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
+        var doc = nativeEventTarget.ownerDocument;
 
-var eventTypes$2 = {
-  change: {
-    phasedRegistrationNames: {
-      bubbled: 'onChange',
-      captured: 'onChangeCapture'
-    },
-    dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE]
-  }
-};
+        if (doc) {
+          win = doc.defaultView || doc.parentWindow;
+        } else {
+          win = window;
+        }
+      }
 
-function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
-  var event = SyntheticEvent.getPooled(eventTypes$2.change, inst, nativeEvent, target);
-  event.type = 'change'; // Flag this event loop as needing state restore.
+      var from;
+      var to;
 
-  enqueueStateRestore(target);
-  accumulateTwoPhaseDispatches(event);
-  return event;
-}
-/**
- * For IE shims
- */
+      if (isOutEvent) {
+        from = targetInst;
+        var related = nativeEvent.relatedTarget || nativeEvent.toElement;
+        to = related ? getClosestInstanceFromNode(related) : null;
 
+        if (to !== null) {
+          var nearestMounted = getNearestMountedFiber(to);
 
-var activeElement = null;
-var activeElementInst = null;
-/**
- * SECTION: handle `change` event
- */
+          if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {
+            to = null;
+          }
+        }
+      } else {
+        // Moving to a node from outside the window.
+        from = null;
+        to = targetInst;
+      }
 
-function shouldUseChangeEvent(elem) {
-  var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
-  return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
-}
+      if (from === to) {
+        // Nothing pertains to our managed components.
+        return null;
+      }
 
-function manualDispatchChangeEvent(nativeEvent) {
-  var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the
-  // other events and have it go through ReactBrowserEventEmitter. Since it
-  // doesn't, we manually listen for the events and so we have to enqueue and
-  // process the abstract event manually.
-  //
-  // Batching is necessary here in order to ensure that all event handlers run
-  // before the next rerender (including event handlers attached to ancestor
-  // elements instead of directly on the input). Without this, controlled
-  // components don't work properly in conjunction with event bubbling because
-  // the component is rerendered and the value reverted before all the event
-  // handlers can run. See https://github.com/facebook/react/issues/708.
+      var eventInterface, leaveEventType, enterEventType, eventTypePrefix;
 
-  batchedUpdates(runEventInBatch, event);
-}
+      if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {
+        eventInterface = SyntheticMouseEvent;
+        leaveEventType = eventTypes$2.mouseLeave;
+        enterEventType = eventTypes$2.mouseEnter;
+        eventTypePrefix = 'mouse';
+      } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) {
+        eventInterface = SyntheticPointerEvent;
+        leaveEventType = eventTypes$2.pointerLeave;
+        enterEventType = eventTypes$2.pointerEnter;
+        eventTypePrefix = 'pointer';
+      }
 
-function runEventInBatch(event) {
-  runEventsInBatch(event);
-}
+      var fromNode = from == null ? win : getNodeFromInstance$1(from);
+      var toNode = to == null ? win : getNodeFromInstance$1(to);
+      var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);
+      leave.type = eventTypePrefix + 'leave';
+      leave.target = fromNode;
+      leave.relatedTarget = toNode;
+      var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);
+      enter.type = eventTypePrefix + 'enter';
+      enter.target = toNode;
+      enter.relatedTarget = fromNode;
+      accumulateEnterLeaveDispatches(leave, enter, from, to); // If we are not processing the first ancestor, then we
+      // should not process the same nativeEvent again, as we
+      // will have already processed it in the first ancestor.
 
-function getInstIfValueChanged(targetInst) {
-  var targetNode = getNodeFromInstance$1(targetInst);
+      if ((eventSystemFlags & IS_FIRST_ANCESTOR) === 0) {
+        return [leave];
+      }
 
-  if (updateValueIfChanged(targetNode)) {
-    return targetInst;
-  }
-}
+      return [leave, enter];
+    }
+  };
 
-function getTargetInstForChangeEvent(topLevelType, targetInst) {
-  if (topLevelType === TOP_CHANGE) {
-    return targetInst;
+  /**
+   * inlined Object.is polyfill to avoid requiring consumers ship their own
+   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
+   */
+  function is(x, y) {
+    return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
+    ;
   }
-}
-/**
- * SECTION: handle `input` event
- */
-
 
-var isInputEventSupported = false;
+  var objectIs = typeof Object.is === 'function' ? Object.is : is;
 
-if (canUseDOM) {
-  // IE9 claims to support the input event but fails to trigger it when
-  // deleting text, so we ignore its input events.
-  isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);
-}
-/**
- * (For IE <=9) Starts tracking propertychange events on the passed-in element
- * and override the value property so that we can distinguish user events from
- * value changes in JS.
- */
+  var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
+  /**
+   * Performs equality by iterating through keys on an object and returning false
+   * when any key has values which are not strictly equal between the arguments.
+   * Returns true when the values of all keys are strictly equal.
+   */
 
+  function shallowEqual(objA, objB) {
+    if (objectIs(objA, objB)) {
+      return true;
+    }
 
-function startWatchingForValueChange(target, targetInst) {
-  activeElement = target;
-  activeElementInst = targetInst;
-  activeElement.attachEvent('onpropertychange', handlePropertyChange);
-}
-/**
- * (For IE <=9) Removes the event listeners from the currently-tracked element,
- * if any exists.
- */
+    if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
+      return false;
+    }
 
+    var keysA = Object.keys(objA);
+    var keysB = Object.keys(objB);
 
-function stopWatchingForValueChange() {
-  if (!activeElement) {
-    return;
-  }
+    if (keysA.length !== keysB.length) {
+      return false;
+    } // Test for A's keys different from B.
 
-  activeElement.detachEvent('onpropertychange', handlePropertyChange);
-  activeElement = null;
-  activeElementInst = null;
-}
-/**
- * (For IE <=9) Handles a propertychange event, sending a `change` event if
- * the value of the active element has changed.
- */
 
+    for (var i = 0; i < keysA.length; i++) {
+      if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) {
+        return false;
+      }
+    }
 
-function handlePropertyChange(nativeEvent) {
-  if (nativeEvent.propertyName !== 'value') {
-    return;
+    return true;
   }
 
-  if (getInstIfValueChanged(activeElementInst)) {
-    manualDispatchChangeEvent(nativeEvent);
-  }
-}
+  var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;
+  var eventTypes$3 = {
+    select: {
+      phasedRegistrationNames: {
+        bubbled: 'onSelect',
+        captured: 'onSelectCapture'
+      },
+      dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE]
+    }
+  };
+  var activeElement$1 = null;
+  var activeElementInst$1 = null;
+  var lastSelection = null;
+  var mouseDown = false;
+  /**
+   * Get an object which is a unique representation of the current selection.
+   *
+   * The return value will not be consistent across nodes or browsers, but
+   * two identical selections on the same node will return identical objects.
+   *
+   * @param {DOMElement} node
+   * @return {object}
+   */
 
-function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {
-  if (topLevelType === TOP_FOCUS) {
-    // In IE9, propertychange fires for most input events but is buggy and
-    // doesn't fire when text is deleted, but conveniently, selectionchange
-    // appears to fire in all of the remaining cases so we catch those and
-    // forward the event if the value has changed
-    // In either case, we don't want to call the event handler if the value
-    // is changed from JS so we redefine a setter for `.value` that updates
-    // our activeElementValue variable, allowing us to ignore those changes
-    //
-    // stopWatching() should be a noop here but we call it just in case we
-    // missed a blur event somehow.
-    stopWatchingForValueChange();
-    startWatchingForValueChange(target, targetInst);
-  } else if (topLevelType === TOP_BLUR) {
-    stopWatchingForValueChange();
+  function getSelection$1(node) {
+    if ('selectionStart' in node && hasSelectionCapabilities(node)) {
+      return {
+        start: node.selectionStart,
+        end: node.selectionEnd
+      };
+    } else {
+      var win = node.ownerDocument && node.ownerDocument.defaultView || window;
+      var selection = win.getSelection();
+      return {
+        anchorNode: selection.anchorNode,
+        anchorOffset: selection.anchorOffset,
+        focusNode: selection.focusNode,
+        focusOffset: selection.focusOffset
+      };
+    }
   }
-} // For IE8 and IE9.
+  /**
+   * Get document associated with the event target.
+   *
+   * @param {object} nativeEventTarget
+   * @return {Document}
+   */
 
 
-function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {
-  if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) {
-    // On the selectionchange event, the target is just document which isn't
-    // helpful for us so just check activeElement instead.
-    //
-    // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
-    // propertychange on the first input event after setting `value` from a
-    // script and fires only keydown, keypress, keyup. Catching keyup usually
-    // gets it and catching keydown lets us fire an event for the first
-    // keystroke if user does a key repeat (it'll be a little delayed: right
-    // before the second keystroke). Other input methods (e.g., paste) seem to
-    // fire selectionchange normally.
-    return getInstIfValueChanged(activeElementInst);
-  }
-}
-/**
- * SECTION: handle `click` event
- */
+  function getEventTargetDocument(eventTarget) {
+    return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;
+  }
+  /**
+   * Poll selection to see whether it's changed.
+   *
+   * @param {object} nativeEvent
+   * @param {object} nativeEventTarget
+   * @return {?SyntheticEvent}
+   */
 
 
-function shouldUseClickEvent(elem) {
-  // Use the `click` event to detect changes to checkbox and radio inputs.
-  // This approach works across all browsers, whereas `change` does not fire
-  // until `blur` in IE8.
-  var nodeName = elem.nodeName;
-  return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
-}
+  function constructSelectEvent(nativeEvent, nativeEventTarget) {
+    // Ensure we have the right element, and that the user is not dragging a
+    // selection (this matches native `select` event behavior). In HTML5, select
+    // fires only on input and textarea thus if there's no focused element we
+    // won't dispatch.
+    var doc = getEventTargetDocument(nativeEventTarget);
 
-function getTargetInstForClickEvent(topLevelType, targetInst) {
-  if (topLevelType === TOP_CLICK) {
-    return getInstIfValueChanged(targetInst);
-  }
-}
+    if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {
+      return null;
+    } // Only fire when selection has actually changed.
 
-function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {
-  if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) {
-    return getInstIfValueChanged(targetInst);
-  }
-}
 
-function handleControlledInputBlur(node) {
-  var state = node._wrapperState;
+    var currentSelection = getSelection$1(activeElement$1);
 
-  if (!state || !state.controlled || node.type !== 'number') {
-    return;
-  }
+    if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
+      lastSelection = currentSelection;
+      var syntheticEvent = SyntheticEvent.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);
+      syntheticEvent.type = 'select';
+      syntheticEvent.target = activeElement$1;
+      accumulateTwoPhaseDispatches(syntheticEvent);
+      return syntheticEvent;
+    }
 
-  if (!disableInputAttributeSyncing) {
-    // If controlled, assign the value attribute to the current value on blur
-    setDefaultValue(node, 'number', node.value);
+    return null;
   }
-}
-/**
- * This plugin creates an `onChange` event that normalizes change events
- * across form elements. This event fires at a time when it's possible to
- * change the element's value without seeing a flicker.
- *
- * Supported elements are:
- * - input (see `isTextInputElement`)
- * - textarea
- * - select
- */
+  /**
+   * This plugin creates an `onSelect` event that normalizes select events
+   * across form elements.
+   *
+   * Supported elements are:
+   * - input (see `isTextInputElement`)
+   * - textarea
+   * - contentEditable
+   *
+   * This differs from native browser implementations in the following ways:
+   * - Fires on contentEditable fields as well as inputs.
+   * - Fires for collapsed selection.
+   * - Fires after user input.
+   */
 
 
-var ChangeEventPlugin = {
-  eventTypes: eventTypes$2,
-  _isInputEventSupported: isInputEventSupported,
-  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
-    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
-    var getTargetInstFunc, handleEventFunc;
+  var SelectEventPlugin = {
+    eventTypes: eventTypes$3,
+    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, container) {
+      var containerOrDoc = container || getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do
+      // not extract events. See #3639.
 
-    if (shouldUseChangeEvent(targetNode)) {
-      getTargetInstFunc = getTargetInstForChangeEvent;
-    } else if (isTextInputElement(targetNode)) {
-      if (isInputEventSupported) {
-        getTargetInstFunc = getTargetInstForInputOrChangeEvent;
-      } else {
-        getTargetInstFunc = getTargetInstForInputEventPolyfill;
-        handleEventFunc = handleEventsForInputEventPolyfill;
+      if (!containerOrDoc || !isListeningToAllDependencies('onSelect', containerOrDoc)) {
+        return null;
       }
-    } else if (shouldUseClickEvent(targetNode)) {
-      getTargetInstFunc = getTargetInstForClickEvent;
-    }
 
-    if (getTargetInstFunc) {
-      var inst = getTargetInstFunc(topLevelType, targetInst);
+      var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
 
-      if (inst) {
-        var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);
-        return event;
-      }
-    }
+      switch (topLevelType) {
+        // Track the input node that has focus.
+        case TOP_FOCUS:
+          if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {
+            activeElement$1 = targetNode;
+            activeElementInst$1 = targetInst;
+            lastSelection = null;
+          }
 
-    if (handleEventFunc) {
-      handleEventFunc(topLevelType, targetNode, targetInst);
-    } // When blurring, set the value attribute for number inputs
+          break;
 
+        case TOP_BLUR:
+          activeElement$1 = null;
+          activeElementInst$1 = null;
+          lastSelection = null;
+          break;
+        // Don't fire the event while the user is dragging. This matches the
+        // semantics of the native select event.
 
-    if (topLevelType === TOP_BLUR) {
-      handleControlledInputBlur(targetNode);
-    }
-  }
-};
+        case TOP_MOUSE_DOWN:
+          mouseDown = true;
+          break;
 
-/**
- * Module that is injectable into `EventPluginHub`, that specifies a
- * deterministic ordering of `EventPlugin`s. A convenient way to reason about
- * plugins, without having to package every one of them. This is better than
- * having plugins be ordered in the same order that they are injected because
- * that ordering would be influenced by the packaging order.
- * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
- * preventing default on events is convenient in `SimpleEventPlugin` handlers.
- */
-var DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];
-
-var eventTypes$3 = {
-  mouseEnter: {
-    registrationName: 'onMouseEnter',
-    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]
-  },
-  mouseLeave: {
-    registrationName: 'onMouseLeave',
-    dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]
-  },
-  pointerEnter: {
-    registrationName: 'onPointerEnter',
-    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]
-  },
-  pointerLeave: {
-    registrationName: 'onPointerLeave',
-    dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]
-  }
-}; // We track the lastNativeEvent to ensure that when we encounter
-// cases where we process the same nativeEvent multiple times,
-// which can happen when have multiple ancestors, that we don't
-// duplicate enter
-
-var lastNativeEvent;
-var EnterLeaveEventPlugin = {
-  eventTypes: eventTypes$3,
+        case TOP_CONTEXT_MENU:
+        case TOP_MOUSE_UP:
+        case TOP_DRAG_END:
+          mouseDown = false;
+          return constructSelectEvent(nativeEvent, nativeEventTarget);
+        // Chrome and IE fire non-standard event when selection is changed (and
+        // sometimes when it hasn't). IE's event fires out of order with respect
+        // to key and input events on deletion, so we discard it.
+        //
+        // Firefox doesn't support selectionchange, so check selection status
+        // after each key entry. The selection changes after keydown and before
+        // keyup, but we check on keydown as well in the case of holding down a
+        // key, when multiple keydown events are fired but only one keyup is.
+        // This is also our approach for IE handling, for the reason above.
+
+        case TOP_SELECTION_CHANGE:
+          if (skipSelectionChangeEvent) {
+            break;
+          }
 
-  /**
-   * For almost every interaction we care about, there will be both a top-level
-   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
-   * we do not extract duplicate events. However, moving the mouse into the
-   * browser from outside will not fire a `mouseout` event. In this case, we use
-   * the `mouseover` top-level event.
-   */
-  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
-    var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;
-    var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;
-
-    if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
-      // If this is an over event with a target, then we've already dispatched
-      // the event in the out event of the other target. If this is replayed,
-      // then it's because we couldn't dispatch against this target previously
-      // so we have to do it now instead.
-      return null;
-    }
+        // falls through
+
+        case TOP_KEY_DOWN:
+        case TOP_KEY_UP:
+          return constructSelectEvent(nativeEvent, nativeEventTarget);
+      }
 
-    if (!isOutEvent && !isOverEvent) {
-      // Must not be a mouse or pointer in or out - ignoring.
       return null;
     }
+  };
 
-    var win;
+  /**
+   * @interface Event
+   * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
+   * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
+   */
 
-    if (nativeEventTarget.window === nativeEventTarget) {
-      // `nativeEventTarget` is probably a window object.
-      win = nativeEventTarget;
-    } else {
-      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
-      var doc = nativeEventTarget.ownerDocument;
+  var SyntheticAnimationEvent = SyntheticEvent.extend({
+    animationName: null,
+    elapsedTime: null,
+    pseudoElement: null
+  });
 
-      if (doc) {
-        win = doc.defaultView || doc.parentWindow;
-      } else {
-        win = window;
-      }
+  /**
+   * @interface Event
+   * @see http://www.w3.org/TR/clipboard-apis/
+   */
+
+  var SyntheticClipboardEvent = SyntheticEvent.extend({
+    clipboardData: function (event) {
+      return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
     }
+  });
+
+  /**
+   * @interface FocusEvent
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/
+   */
 
-    var from;
-    var to;
+  var SyntheticFocusEvent = SyntheticUIEvent.extend({
+    relatedTarget: null
+  });
 
-    if (isOutEvent) {
-      from = targetInst;
-      var related = nativeEvent.relatedTarget || nativeEvent.toElement;
-      to = related ? getClosestInstanceFromNode(related) : null;
+  /**
+   * `charCode` represents the actual "character code" and is safe to use with
+   * `String.fromCharCode`. As such, only keys that correspond to printable
+   * characters produce a valid `charCode`, the only exception to this is Enter.
+   * The Tab-key is considered non-printable and does not have a `charCode`,
+   * presumably because it does not produce a tab-character in browsers.
+   *
+   * @param {object} nativeEvent Native browser event.
+   * @return {number} Normalized `charCode` property.
+   */
+  function getEventCharCode(nativeEvent) {
+    var charCode;
+    var keyCode = nativeEvent.keyCode;
 
-      if (to !== null) {
-        var nearestMounted = getNearestMountedFiber(to);
+    if ('charCode' in nativeEvent) {
+      charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.
 
-        if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {
-          to = null;
-        }
+      if (charCode === 0 && keyCode === 13) {
+        charCode = 13;
       }
     } else {
-      // Moving to a node from outside the window.
-      from = null;
-      to = targetInst;
-    }
+      // IE8 does not implement `charCode`, but `keyCode` has the correct value.
+      charCode = keyCode;
+    } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)
+    // report Enter as charCode 10 when ctrl is pressed.
 
-    if (from === to) {
-      // Nothing pertains to our managed components.
-      return null;
-    }
 
-    var eventInterface, leaveEventType, enterEventType, eventTypePrefix;
-
-    if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {
-      eventInterface = SyntheticMouseEvent;
-      leaveEventType = eventTypes$3.mouseLeave;
-      enterEventType = eventTypes$3.mouseEnter;
-      eventTypePrefix = 'mouse';
-    } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) {
-      eventInterface = SyntheticPointerEvent;
-      leaveEventType = eventTypes$3.pointerLeave;
-      enterEventType = eventTypes$3.pointerEnter;
-      eventTypePrefix = 'pointer';
-    }
+    if (charCode === 10) {
+      charCode = 13;
+    } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
+    // Must not discard the (non-)printable Enter-key.
 
-    var fromNode = from == null ? win : getNodeFromInstance$1(from);
-    var toNode = to == null ? win : getNodeFromInstance$1(to);
-    var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);
-    leave.type = eventTypePrefix + 'leave';
-    leave.target = fromNode;
-    leave.relatedTarget = toNode;
-    var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);
-    enter.type = eventTypePrefix + 'enter';
-    enter.target = toNode;
-    enter.relatedTarget = fromNode;
-    accumulateEnterLeaveDispatches(leave, enter, from, to);
 
-    if (nativeEvent === lastNativeEvent) {
-      lastNativeEvent = null;
-      return [leave];
+    if (charCode >= 32 || charCode === 13) {
+      return charCode;
     }
 
-    lastNativeEvent = nativeEvent;
-    return [leave, enter];
+    return 0;
   }
-};
 
-/**
- * inlined Object.is polyfill to avoid requiring consumers ship their own
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
- */
-function is(x, y) {
-  return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
-  ;
-}
-
-var is$1 = typeof Object.is === 'function' ? Object.is : is;
-
-var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
-/**
- * Performs equality by iterating through keys on an object and returning false
- * when any key has values which are not strictly equal between the arguments.
- * Returns true when the values of all keys are strictly equal.
- */
+  /**
+   * Normalization of deprecated HTML5 `key` values
+   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
+   */
 
-function shallowEqual(objA, objB) {
-  if (is$1(objA, objB)) {
-    return true;
-  }
+  var normalizeKey = {
+    Esc: 'Escape',
+    Spacebar: ' ',
+    Left: 'ArrowLeft',
+    Up: 'ArrowUp',
+    Right: 'ArrowRight',
+    Down: 'ArrowDown',
+    Del: 'Delete',
+    Win: 'OS',
+    Menu: 'ContextMenu',
+    Apps: 'ContextMenu',
+    Scroll: 'ScrollLock',
+    MozPrintableKey: 'Unidentified'
+  };
+  /**
+   * Translation from legacy `keyCode` to HTML5 `key`
+   * Only special keys supported, all others depend on keyboard layout or browser
+   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
+   */
 
-  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
-    return false;
-  }
+  var translateToKey = {
+    '8': 'Backspace',
+    '9': 'Tab',
+    '12': 'Clear',
+    '13': 'Enter',
+    '16': 'Shift',
+    '17': 'Control',
+    '18': 'Alt',
+    '19': 'Pause',
+    '20': 'CapsLock',
+    '27': 'Escape',
+    '32': ' ',
+    '33': 'PageUp',
+    '34': 'PageDown',
+    '35': 'End',
+    '36': 'Home',
+    '37': 'ArrowLeft',
+    '38': 'ArrowUp',
+    '39': 'ArrowRight',
+    '40': 'ArrowDown',
+    '45': 'Insert',
+    '46': 'Delete',
+    '112': 'F1',
+    '113': 'F2',
+    '114': 'F3',
+    '115': 'F4',
+    '116': 'F5',
+    '117': 'F6',
+    '118': 'F7',
+    '119': 'F8',
+    '120': 'F9',
+    '121': 'F10',
+    '122': 'F11',
+    '123': 'F12',
+    '144': 'NumLock',
+    '145': 'ScrollLock',
+    '224': 'Meta'
+  };
+  /**
+   * @param {object} nativeEvent Native browser event.
+   * @return {string} Normalized `key` property.
+   */
 
-  var keysA = Object.keys(objA);
-  var keysB = Object.keys(objB);
+  function getEventKey(nativeEvent) {
+    if (nativeEvent.key) {
+      // Normalize inconsistent values reported by browsers due to
+      // implementations of a working draft specification.
+      // FireFox implements `key` but returns `MozPrintableKey` for all
+      // printable characters (normalized to `Unidentified`), ignore it.
+      var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
 
-  if (keysA.length !== keysB.length) {
-    return false;
-  } // Test for A's keys different from B.
+      if (key !== 'Unidentified') {
+        return key;
+      }
+    } // Browser does not implement `key`, polyfill as much of it as we can.
 
 
-  for (var i = 0; i < keysA.length; i++) {
-    if (!hasOwnProperty$2.call(objB, keysA[i]) || !is$1(objA[keysA[i]], objB[keysA[i]])) {
-      return false;
+    if (nativeEvent.type === 'keypress') {
+      var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can
+      // thus be captured by `keypress`, no other non-printable key should.
+
+      return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
     }
+
+    if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
+      // While user keyboard layout determines the actual meaning of each
+      // `keyCode` value, almost all function keys have a universal value.
+      return translateToKey[nativeEvent.keyCode] || 'Unidentified';
+    }
+
+    return '';
   }
 
-  return true;
-}
+  /**
+   * @interface KeyboardEvent
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/
+   */
 
-var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;
-var eventTypes$4 = {
-  select: {
-    phasedRegistrationNames: {
-      bubbled: 'onSelect',
-      captured: 'onSelectCapture'
-    },
-    dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE]
-  }
-};
-var activeElement$1 = null;
-var activeElementInst$1 = null;
-var lastSelection = null;
-var mouseDown = false;
-/**
- * Get an object which is a unique representation of the current selection.
- *
- * The return value will not be consistent across nodes or browsers, but
- * two identical selections on the same node will return identical objects.
- *
- * @param {DOMElement} node
- * @return {object}
- */
+  var SyntheticKeyboardEvent = SyntheticUIEvent.extend({
+    key: getEventKey,
+    location: null,
+    ctrlKey: null,
+    shiftKey: null,
+    altKey: null,
+    metaKey: null,
+    repeat: null,
+    locale: null,
+    getModifierState: getEventModifierState,
+    // Legacy Interface
+    charCode: function (event) {
+      // `charCode` is the result of a KeyPress event and represents the value of
+      // the actual printable character.
+      // KeyPress is deprecated, but its replacement is not yet final and not
+      // implemented in any major browser. Only KeyPress has charCode.
+      if (event.type === 'keypress') {
+        return getEventCharCode(event);
+      }
 
-function getSelection$1(node) {
-  if ('selectionStart' in node && hasSelectionCapabilities(node)) {
-    return {
-      start: node.selectionStart,
-      end: node.selectionEnd
-    };
-  } else {
-    var win = node.ownerDocument && node.ownerDocument.defaultView || window;
-    var selection = win.getSelection();
-    return {
-      anchorNode: selection.anchorNode,
-      anchorOffset: selection.anchorOffset,
-      focusNode: selection.focusNode,
-      focusOffset: selection.focusOffset
-    };
-  }
-}
-/**
- * Get document associated with the event target.
- *
- * @param {object} nativeEventTarget
- * @return {Document}
- */
+      return 0;
+    },
+    keyCode: function (event) {
+      // `keyCode` is the result of a KeyDown/Up event and represents the value of
+      // physical keyboard key.
+      // The actual meaning of the value depends on the users' keyboard layout
+      // which cannot be detected. Assuming that it is a US keyboard layout
+      // provides a surprisingly accurate mapping for US and European users.
+      // Due to this, it is left to the user to implement at this time.
+      if (event.type === 'keydown' || event.type === 'keyup') {
+        return event.keyCode;
+      }
 
+      return 0;
+    },
+    which: function (event) {
+      // `which` is an alias for either `keyCode` or `charCode` depending on the
+      // type of the event.
+      if (event.type === 'keypress') {
+        return getEventCharCode(event);
+      }
 
-function getEventTargetDocument(eventTarget) {
-  return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;
-}
-/**
- * Poll selection to see whether it's changed.
- *
- * @param {object} nativeEvent
- * @param {object} nativeEventTarget
- * @return {?SyntheticEvent}
- */
+      if (event.type === 'keydown' || event.type === 'keyup') {
+        return event.keyCode;
+      }
 
+      return 0;
+    }
+  });
 
-function constructSelectEvent(nativeEvent, nativeEventTarget) {
-  // Ensure we have the right element, and that the user is not dragging a
-  // selection (this matches native `select` event behavior). In HTML5, select
-  // fires only on input and textarea thus if there's no focused element we
-  // won't dispatch.
-  var doc = getEventTargetDocument(nativeEventTarget);
+  /**
+   * @interface DragEvent
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/
+   */
 
-  if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {
-    return null;
-  } // Only fire when selection has actually changed.
+  var SyntheticDragEvent = SyntheticMouseEvent.extend({
+    dataTransfer: null
+  });
 
+  /**
+   * @interface TouchEvent
+   * @see http://www.w3.org/TR/touch-events/
+   */
 
-  var currentSelection = getSelection$1(activeElement$1);
+  var SyntheticTouchEvent = SyntheticUIEvent.extend({
+    touches: null,
+    targetTouches: null,
+    changedTouches: null,
+    altKey: null,
+    metaKey: null,
+    ctrlKey: null,
+    shiftKey: null,
+    getModifierState: getEventModifierState
+  });
 
-  if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
-    lastSelection = currentSelection;
-    var syntheticEvent = SyntheticEvent.getPooled(eventTypes$4.select, activeElementInst$1, nativeEvent, nativeEventTarget);
-    syntheticEvent.type = 'select';
-    syntheticEvent.target = activeElement$1;
-    accumulateTwoPhaseDispatches(syntheticEvent);
-    return syntheticEvent;
-  }
+  /**
+   * @interface Event
+   * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
+   * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
+   */
 
-  return null;
-}
-/**
- * This plugin creates an `onSelect` event that normalizes select events
- * across form elements.
- *
- * Supported elements are:
- * - input (see `isTextInputElement`)
- * - textarea
- * - contentEditable
- *
- * This differs from native browser implementations in the following ways:
- * - Fires on contentEditable fields as well as inputs.
- * - Fires for collapsed selection.
- * - Fires after user input.
- */
+  var SyntheticTransitionEvent = SyntheticEvent.extend({
+    propertyName: null,
+    elapsedTime: null,
+    pseudoElement: null
+  });
 
+  /**
+   * @interface WheelEvent
+   * @see http://www.w3.org/TR/DOM-Level-3-Events/
+   */
 
-var SelectEventPlugin = {
-  eventTypes: eventTypes$4,
-  extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
-    var doc = getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do
-    // not extract events. See #3639.
+  var SyntheticWheelEvent = SyntheticMouseEvent.extend({
+    deltaX: function (event) {
+      return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
+      'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
+    },
+    deltaY: function (event) {
+      return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
+      'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
+      'wheelDelta' in event ? -event.wheelDelta : 0;
+    },
+    deltaZ: null,
+    // Browsers without "deltaMode" is reporting in raw wheel delta where one
+    // notch on the scroll is always +/- 120, roughly equivalent to pixels.
+    // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
+    // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
+    deltaMode: null
+  });
 
-    if (!doc || !isListeningToAllDependencies('onSelect', doc)) {
-      return null;
-    }
+  var knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING];
+  var SimpleEventPlugin = {
+    // simpleEventPluginEventTypes gets populated from
+    // the DOMEventProperties module.
+    eventTypes: simpleEventPluginEventTypes,
+    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {
+      var dispatchConfig = topLevelEventsToDispatchConfig.get(topLevelType);
 
-    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;
+      if (!dispatchConfig) {
+        return null;
+      }
 
-    switch (topLevelType) {
-      // Track the input node that has focus.
-      case TOP_FOCUS:
-        if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {
-          activeElement$1 = targetNode;
-          activeElementInst$1 = targetInst;
-          lastSelection = null;
-        }
+      var EventConstructor;
 
-        break;
+      switch (topLevelType) {
+        case TOP_KEY_PRESS:
+          // Firefox creates a keypress event for function keys too. This removes
+          // the unwanted keypress events. Enter is however both printable and
+          // non-printable. One would expect Tab to be as well (but it isn't).
+          if (getEventCharCode(nativeEvent) === 0) {
+            return null;
+          }
 
-      case TOP_BLUR:
-        activeElement$1 = null;
-        activeElementInst$1 = null;
-        lastSelection = null;
-        break;
-      // Don't fire the event while the user is dragging. This matches the
-      // semantics of the native select event.
+        /* falls through */
 
-      case TOP_MOUSE_DOWN:
-        mouseDown = true;
-        break;
+        case TOP_KEY_DOWN:
+        case TOP_KEY_UP:
+          EventConstructor = SyntheticKeyboardEvent;
+          break;
 
-      case TOP_CONTEXT_MENU:
-      case TOP_MOUSE_UP:
-      case TOP_DRAG_END:
-        mouseDown = false;
-        return constructSelectEvent(nativeEvent, nativeEventTarget);
-      // Chrome and IE fire non-standard event when selection is changed (and
-      // sometimes when it hasn't). IE's event fires out of order with respect
-      // to key and input events on deletion, so we discard it.
-      //
-      // Firefox doesn't support selectionchange, so check selection status
-      // after each key entry. The selection changes after keydown and before
-      // keyup, but we check on keydown as well in the case of holding down a
-      // key, when multiple keydown events are fired but only one keyup is.
-      // This is also our approach for IE handling, for the reason above.
-
-      case TOP_SELECTION_CHANGE:
-        if (skipSelectionChangeEvent) {
+        case TOP_BLUR:
+        case TOP_FOCUS:
+          EventConstructor = SyntheticFocusEvent;
           break;
-        }
 
-      // falls through
+        case TOP_CLICK:
+          // Firefox creates a click event on right mouse clicks. This removes the
+          // unwanted click events.
+          if (nativeEvent.button === 2) {
+            return null;
+          }
 
-      case TOP_KEY_DOWN:
-      case TOP_KEY_UP:
-        return constructSelectEvent(nativeEvent, nativeEventTarget);
-    }
+        /* falls through */
 
-    return null;
-  }
-};
+        case TOP_AUX_CLICK:
+        case TOP_DOUBLE_CLICK:
+        case TOP_MOUSE_DOWN:
+        case TOP_MOUSE_MOVE:
+        case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events
 
-/**
- * Inject modules for resolving DOM hierarchy and plugin ordering.
- */
+        /* falls through */
 
-injection.injectEventPluginOrder(DOMEventPluginOrder);
-setComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1);
-/**
- * Some important event plugins included by default (without having to require
- * them).
- */
+        case TOP_MOUSE_OUT:
+        case TOP_MOUSE_OVER:
+        case TOP_CONTEXT_MENU:
+          EventConstructor = SyntheticMouseEvent;
+          break;
 
-injection.injectEventPluginsByName({
-  SimpleEventPlugin: SimpleEventPlugin,
-  EnterLeaveEventPlugin: EnterLeaveEventPlugin,
-  ChangeEventPlugin: ChangeEventPlugin,
-  SelectEventPlugin: SelectEventPlugin,
-  BeforeInputEventPlugin: BeforeInputEventPlugin
-});
-
-// Prefix measurements so that it's possible to filter them.
-// Longer prefixes are hard to read in DevTools.
-var reactEmoji = "\u269B";
-var warningEmoji = "\u26D4";
-var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause.
-// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?
-
-var currentFiber = null; // If we're in the middle of user code, which fiber and method is it?
-// Reusing `currentFiber` would be confusing for this because user code fiber
-// can change during commit phase too, but we don't need to unwind it (since
-// lifecycles in the commit phase don't resemble a tree).
-
-var currentPhase = null;
-var currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem,
-// so we will keep track of it, and include it in the report.
-// Track commits caused by cascading updates.
-
-var isCommitting = false;
-var hasScheduledUpdateInCurrentCommit = false;
-var hasScheduledUpdateInCurrentPhase = false;
-var commitCountInCurrentWorkLoop = 0;
-var effectCountInCurrentCommit = 0;
-// to avoid stretch the commit phase with measurement overhead.
-
-var labelsInCurrentCommit = new Set();
-
-var formatMarkName = function (markName) {
-  return reactEmoji + " " + markName;
-};
-
-var formatLabel = function (label, warning) {
-  var prefix = warning ? warningEmoji + " " : reactEmoji + " ";
-  var suffix = warning ? " Warning: " + warning : '';
-  return "" + prefix + label + suffix;
-};
-
-var beginMark = function (markName) {
-  performance.mark(formatMarkName(markName));
-};
-
-var clearMark = function (markName) {
-  performance.clearMarks(formatMarkName(markName));
-};
-
-var endMark = function (label, markName, warning) {
-  var formattedMarkName = formatMarkName(markName);
-  var formattedLabel = formatLabel(label, warning);
-
-  try {
-    performance.measure(formattedLabel, formattedMarkName);
-  } catch (err) {} // If previous mark was missing for some reason, this will throw.
-  // This could only happen if React crashed in an unexpected place earlier.
-  // Don't pile on with more errors.
-  // Clear marks immediately to avoid growing buffer.
-
-
-  performance.clearMarks(formattedMarkName);
-  performance.clearMeasures(formattedLabel);
-};
-
-var getFiberMarkName = function (label, debugID) {
-  return label + " (#" + debugID + ")";
-};
-
-var getFiberLabel = function (componentName, isMounted, phase) {
-  if (phase === null) {
-    // These are composite component total time measurements.
-    return componentName + " [" + (isMounted ? 'update' : 'mount') + "]";
-  } else {
-    // Composite component methods.
-    return componentName + "." + phase;
-  }
-};
-
-var beginFiberMark = function (fiber, phase) {
-  var componentName = getComponentName(fiber.type) || 'Unknown';
-  var debugID = fiber._debugID;
-  var isMounted = fiber.alternate !== null;
-  var label = getFiberLabel(componentName, isMounted, phase);
-
-  if (isCommitting && labelsInCurrentCommit.has(label)) {
-    // During the commit phase, we don't show duplicate labels because
-    // there is a fixed overhead for every measurement, and we don't
-    // want to stretch the commit phase beyond necessary.
-    return false;
-  }
+        case TOP_DRAG:
+        case TOP_DRAG_END:
+        case TOP_DRAG_ENTER:
+        case TOP_DRAG_EXIT:
+        case TOP_DRAG_LEAVE:
+        case TOP_DRAG_OVER:
+        case TOP_DRAG_START:
+        case TOP_DROP:
+          EventConstructor = SyntheticDragEvent;
+          break;
 
-  labelsInCurrentCommit.add(label);
-  var markName = getFiberMarkName(label, debugID);
-  beginMark(markName);
-  return true;
-};
-
-var clearFiberMark = function (fiber, phase) {
-  var componentName = getComponentName(fiber.type) || 'Unknown';
-  var debugID = fiber._debugID;
-  var isMounted = fiber.alternate !== null;
-  var label = getFiberLabel(componentName, isMounted, phase);
-  var markName = getFiberMarkName(label, debugID);
-  clearMark(markName);
-};
-
-var endFiberMark = function (fiber, phase, warning) {
-  var componentName = getComponentName(fiber.type) || 'Unknown';
-  var debugID = fiber._debugID;
-  var isMounted = fiber.alternate !== null;
-  var label = getFiberLabel(componentName, isMounted, phase);
-  var markName = getFiberMarkName(label, debugID);
-  endMark(label, markName, warning);
-};
-
-var shouldIgnoreFiber = function (fiber) {
-  // Host components should be skipped in the timeline.
-  // We could check typeof fiber.type, but does this work with RN?
-  switch (fiber.tag) {
-    case HostRoot:
-    case HostComponent:
-    case HostText:
-    case HostPortal:
-    case Fragment:
-    case ContextProvider:
-    case ContextConsumer:
-    case Mode:
-      return true;
+        case TOP_TOUCH_CANCEL:
+        case TOP_TOUCH_END:
+        case TOP_TOUCH_MOVE:
+        case TOP_TOUCH_START:
+          EventConstructor = SyntheticTouchEvent;
+          break;
 
-    default:
-      return false;
-  }
-};
+        case TOP_ANIMATION_END:
+        case TOP_ANIMATION_ITERATION:
+        case TOP_ANIMATION_START:
+          EventConstructor = SyntheticAnimationEvent;
+          break;
 
-var clearPendingPhaseMeasurement = function () {
-  if (currentPhase !== null && currentPhaseFiber !== null) {
-    clearFiberMark(currentPhaseFiber, currentPhase);
-  }
+        case TOP_TRANSITION_END:
+          EventConstructor = SyntheticTransitionEvent;
+          break;
 
-  currentPhaseFiber = null;
-  currentPhase = null;
-  hasScheduledUpdateInCurrentPhase = false;
-};
+        case TOP_SCROLL:
+          EventConstructor = SyntheticUIEvent;
+          break;
 
-var pauseTimers = function () {
-  // Stops all currently active measurements so that they can be resumed
-  // if we continue in a later deferred loop from the same unit of work.
-  var fiber = currentFiber;
+        case TOP_WHEEL:
+          EventConstructor = SyntheticWheelEvent;
+          break;
 
-  while (fiber) {
-    if (fiber._debugIsCurrentlyTiming) {
-      endFiberMark(fiber, null, null);
-    }
+        case TOP_COPY:
+        case TOP_CUT:
+        case TOP_PASTE:
+          EventConstructor = SyntheticClipboardEvent;
+          break;
 
-    fiber = fiber.return;
-  }
-};
+        case TOP_GOT_POINTER_CAPTURE:
+        case TOP_LOST_POINTER_CAPTURE:
+        case TOP_POINTER_CANCEL:
+        case TOP_POINTER_DOWN:
+        case TOP_POINTER_MOVE:
+        case TOP_POINTER_OUT:
+        case TOP_POINTER_OVER:
+        case TOP_POINTER_UP:
+          EventConstructor = SyntheticPointerEvent;
+          break;
 
-var resumeTimersRecursively = function (fiber) {
-  if (fiber.return !== null) {
-    resumeTimersRecursively(fiber.return);
-  }
+        default:
+          {
+            if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {
+              error('SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);
+            }
+          } // HTML Events
+          // @see http://www.w3.org/TR/html5/index.html#events-0
 
-  if (fiber._debugIsCurrentlyTiming) {
-    beginFiberMark(fiber, null);
-  }
-};
 
-var resumeTimers = function () {
-  // Resumes all measurements that were active during the last deferred loop.
-  if (currentFiber !== null) {
-    resumeTimersRecursively(currentFiber);
-  }
-};
+          EventConstructor = SyntheticEvent;
+          break;
+      }
 
-function recordEffect() {
-  if (enableUserTimingAPI) {
-    effectCountInCurrentCommit++;
-  }
-}
-function recordScheduleUpdate() {
-  if (enableUserTimingAPI) {
-    if (isCommitting) {
-      hasScheduledUpdateInCurrentCommit = true;
+      var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);
+      accumulateTwoPhaseDispatches(event);
+      return event;
     }
+  };
 
-    if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {
-      hasScheduledUpdateInCurrentPhase = true;
-    }
-  }
-}
+  /**
+   * Specifies a deterministic ordering of `EventPlugin`s. A convenient way to
+   * reason about plugins, without having to package every one of them. This
+   * is better than having plugins be ordered in the same order that they
+   * are injected because that ordering would be influenced by the packaging order.
+   * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
+   * preventing default on events is convenient in `SimpleEventPlugin` handlers.
+   */
 
+  var DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];
+  /**
+   * Inject modules for resolving DOM hierarchy and plugin ordering.
+   */
 
-function startWorkTimer(fiber) {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
-      return;
-    } // If we pause, this is the fiber to unwind from.
+  injectEventPluginOrder(DOMEventPluginOrder);
+  setComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1);
+  /**
+   * Some important event plugins included by default (without having to require
+   * them).
+   */
 
+  injectEventPluginsByName({
+    SimpleEventPlugin: SimpleEventPlugin,
+    EnterLeaveEventPlugin: EnterLeaveEventPlugin,
+    ChangeEventPlugin: ChangeEventPlugin,
+    SelectEventPlugin: SelectEventPlugin,
+    BeforeInputEventPlugin: BeforeInputEventPlugin
+  });
 
-    currentFiber = fiber;
+  // Prefix measurements so that it's possible to filter them.
+  // Longer prefixes are hard to read in DevTools.
+  var reactEmoji = "\u269B";
+  var warningEmoji = "\u26D4";
+  var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause.
+  // TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?
+
+  var currentFiber = null; // If we're in the middle of user code, which fiber and method is it?
+  // Reusing `currentFiber` would be confusing for this because user code fiber
+  // can change during commit phase too, but we don't need to unwind it (since
+  // lifecycles in the commit phase don't resemble a tree).
+
+  var currentPhase = null;
+  var currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem,
+  // so we will keep track of it, and include it in the report.
+  // Track commits caused by cascading updates.
+
+  var isCommitting = false;
+  var hasScheduledUpdateInCurrentCommit = false;
+  var hasScheduledUpdateInCurrentPhase = false;
+  var commitCountInCurrentWorkLoop = 0;
+  var effectCountInCurrentCommit = 0;
+  // to avoid stretch the commit phase with measurement overhead.
+
+  var labelsInCurrentCommit = new Set();
+
+  var formatMarkName = function (markName) {
+    return reactEmoji + " " + markName;
+  };
 
-    if (!beginFiberMark(fiber, null)) {
-      return;
-    }
+  var formatLabel = function (label, warning) {
+    var prefix = warning ? warningEmoji + " " : reactEmoji + " ";
+    var suffix = warning ? " Warning: " + warning : '';
+    return "" + prefix + label + suffix;
+  };
 
-    fiber._debugIsCurrentlyTiming = true;
-  }
-}
-function cancelWorkTimer(fiber) {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
-      return;
-    } // Remember we shouldn't complete measurement for this fiber.
-    // Otherwise flamechart will be deep even for small updates.
+  var beginMark = function (markName) {
+    performance.mark(formatMarkName(markName));
+  };
 
+  var clearMark = function (markName) {
+    performance.clearMarks(formatMarkName(markName));
+  };
 
-    fiber._debugIsCurrentlyTiming = false;
-    clearFiberMark(fiber, null);
-  }
-}
-function stopWorkTimer(fiber) {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
-      return;
-    } // If we pause, its parent is the fiber to unwind from.
+  var endMark = function (label, markName, warning) {
+    var formattedMarkName = formatMarkName(markName);
+    var formattedLabel = formatLabel(label, warning);
 
+    try {
+      performance.measure(formattedLabel, formattedMarkName);
+    } catch (err) {} // If previous mark was missing for some reason, this will throw.
+    // This could only happen if React crashed in an unexpected place earlier.
+    // Don't pile on with more errors.
+    // Clear marks immediately to avoid growing buffer.
 
-    currentFiber = fiber.return;
 
-    if (!fiber._debugIsCurrentlyTiming) {
-      return;
-    }
+    performance.clearMarks(formattedMarkName);
+    performance.clearMeasures(formattedLabel);
+  };
 
-    fiber._debugIsCurrentlyTiming = false;
-    endFiberMark(fiber, null, null);
-  }
-}
-function stopFailedWorkTimer(fiber) {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
-      return;
-    } // If we pause, its parent is the fiber to unwind from.
+  var getFiberMarkName = function (label, debugID) {
+    return label + " (#" + debugID + ")";
+  };
 
+  var getFiberLabel = function (componentName, isMounted, phase) {
+    if (phase === null) {
+      // These are composite component total time measurements.
+      return componentName + " [" + (isMounted ? 'update' : 'mount') + "]";
+    } else {
+      // Composite component methods.
+      return componentName + "." + phase;
+    }
+  };
 
-    currentFiber = fiber.return;
+  var beginFiberMark = function (fiber, phase) {
+    var componentName = getComponentName(fiber.type) || 'Unknown';
+    var debugID = fiber._debugID;
+    var isMounted = fiber.alternate !== null;
+    var label = getFiberLabel(componentName, isMounted, phase);
 
-    if (!fiber._debugIsCurrentlyTiming) {
-      return;
+    if (isCommitting && labelsInCurrentCommit.has(label)) {
+      // During the commit phase, we don't show duplicate labels because
+      // there is a fixed overhead for every measurement, and we don't
+      // want to stretch the commit phase beyond necessary.
+      return false;
     }
 
-    fiber._debugIsCurrentlyTiming = false;
-    var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';
-    endFiberMark(fiber, null, warning);
-  }
-}
-function startPhaseTimer(fiber, phase) {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
-    }
+    labelsInCurrentCommit.add(label);
+    var markName = getFiberMarkName(label, debugID);
+    beginMark(markName);
+    return true;
+  };
 
-    clearPendingPhaseMeasurement();
+  var clearFiberMark = function (fiber, phase) {
+    var componentName = getComponentName(fiber.type) || 'Unknown';
+    var debugID = fiber._debugID;
+    var isMounted = fiber.alternate !== null;
+    var label = getFiberLabel(componentName, isMounted, phase);
+    var markName = getFiberMarkName(label, debugID);
+    clearMark(markName);
+  };
 
-    if (!beginFiberMark(fiber, phase)) {
-      return;
-    }
+  var endFiberMark = function (fiber, phase, warning) {
+    var componentName = getComponentName(fiber.type) || 'Unknown';
+    var debugID = fiber._debugID;
+    var isMounted = fiber.alternate !== null;
+    var label = getFiberLabel(componentName, isMounted, phase);
+    var markName = getFiberMarkName(label, debugID);
+    endMark(label, markName, warning);
+  };
 
-    currentPhaseFiber = fiber;
-    currentPhase = phase;
-  }
-}
-function stopPhaseTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
+  var shouldIgnoreFiber = function (fiber) {
+    // Host components should be skipped in the timeline.
+    // We could check typeof fiber.type, but does this work with RN?
+    switch (fiber.tag) {
+      case HostRoot:
+      case HostComponent:
+      case HostText:
+      case HostPortal:
+      case Fragment:
+      case ContextProvider:
+      case ContextConsumer:
+      case Mode:
+        return true;
+
+      default:
+        return false;
     }
+  };
 
+  var clearPendingPhaseMeasurement = function () {
     if (currentPhase !== null && currentPhaseFiber !== null) {
-      var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;
-      endFiberMark(currentPhaseFiber, currentPhase, warning);
+      clearFiberMark(currentPhaseFiber, currentPhase);
     }
 
-    currentPhase = null;
     currentPhaseFiber = null;
-  }
-}
-function startWorkLoopTimer(nextUnitOfWork) {
-  if (enableUserTimingAPI) {
-    currentFiber = nextUnitOfWork;
-
-    if (!supportsUserTiming) {
-      return;
-    }
+    currentPhase = null;
+    hasScheduledUpdateInCurrentPhase = false;
+  };
 
-    commitCountInCurrentWorkLoop = 0; // This is top level call.
-    // Any other measurements are performed within.
+  var pauseTimers = function () {
+    // Stops all currently active measurements so that they can be resumed
+    // if we continue in a later deferred loop from the same unit of work.
+    var fiber = currentFiber;
 
-    beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop.
+    while (fiber) {
+      if (fiber._debugIsCurrentlyTiming) {
+        endFiberMark(fiber, null, null);
+      }
 
-    resumeTimers();
-  }
-}
-function stopWorkLoopTimer(interruptedBy, didCompleteRoot) {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
+      fiber = fiber.return;
     }
+  };
 
-    var warning = null;
-
-    if (interruptedBy !== null) {
-      if (interruptedBy.tag === HostRoot) {
-        warning = 'A top-level update interrupted the previous render';
-      } else {
-        var componentName = getComponentName(interruptedBy.type) || 'Unknown';
-        warning = "An update to " + componentName + " interrupted the previous render";
-      }
-    } else if (commitCountInCurrentWorkLoop > 1) {
-      warning = 'There were cascading updates';
+  var resumeTimersRecursively = function (fiber) {
+    if (fiber.return !== null) {
+      resumeTimersRecursively(fiber.return);
     }
 
-    commitCountInCurrentWorkLoop = 0;
-    var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop.
-
-    pauseTimers();
-    endMark(label, '(React Tree Reconciliation)', warning);
-  }
-}
-function startCommitTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
+    if (fiber._debugIsCurrentlyTiming) {
+      beginFiberMark(fiber, null);
     }
+  };
 
-    isCommitting = true;
-    hasScheduledUpdateInCurrentCommit = false;
-    labelsInCurrentCommit.clear();
-    beginMark('(Committing Changes)');
-  }
-}
-function stopCommitTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
+  var resumeTimers = function () {
+    // Resumes all measurements that were active during the last deferred loop.
+    if (currentFiber !== null) {
+      resumeTimersRecursively(currentFiber);
     }
+  };
 
-    var warning = null;
-
-    if (hasScheduledUpdateInCurrentCommit) {
-      warning = 'Lifecycle hook scheduled a cascading update';
-    } else if (commitCountInCurrentWorkLoop > 0) {
-      warning = 'Caused by a cascading update in earlier commit';
+  function recordEffect() {
+    {
+      effectCountInCurrentCommit++;
     }
-
-    hasScheduledUpdateInCurrentCommit = false;
-    commitCountInCurrentWorkLoop++;
-    isCommitting = false;
-    labelsInCurrentCommit.clear();
-    endMark('(Committing Changes)', '(Committing Changes)', warning);
   }
-}
-function startCommitSnapshotEffectsTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
-    }
+  function recordScheduleUpdate() {
+    {
+      if (isCommitting) {
+        hasScheduledUpdateInCurrentCommit = true;
+      }
 
-    effectCountInCurrentCommit = 0;
-    beginMark('(Committing Snapshot Effects)');
-  }
-}
-function stopCommitSnapshotEffectsTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
+      if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {
+        hasScheduledUpdateInCurrentPhase = true;
+      }
     }
-
-    var count = effectCountInCurrentCommit;
-    effectCountInCurrentCommit = 0;
-    endMark("(Committing Snapshot Effects: " + count + " Total)", '(Committing Snapshot Effects)', null);
   }
-}
-function startCommitHostEffectsTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
-    }
+  function startWorkTimer(fiber) {
+    {
+      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+        return;
+      } // If we pause, this is the fiber to unwind from.
 
-    effectCountInCurrentCommit = 0;
-    beginMark('(Committing Host Effects)');
-  }
-}
-function stopCommitHostEffectsTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
-    }
 
-    var count = effectCountInCurrentCommit;
-    effectCountInCurrentCommit = 0;
-    endMark("(Committing Host Effects: " + count + " Total)", '(Committing Host Effects)', null);
-  }
-}
-function startCommitLifeCyclesTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
-    }
+      currentFiber = fiber;
 
-    effectCountInCurrentCommit = 0;
-    beginMark('(Calling Lifecycle Methods)');
-  }
-}
-function stopCommitLifeCyclesTimer() {
-  if (enableUserTimingAPI) {
-    if (!supportsUserTiming) {
-      return;
-    }
+      if (!beginFiberMark(fiber, null)) {
+        return;
+      }
 
-    var count = effectCountInCurrentCommit;
-    effectCountInCurrentCommit = 0;
-    endMark("(Calling Lifecycle Methods: " + count + " Total)", '(Calling Lifecycle Methods)', null);
+      fiber._debugIsCurrentlyTiming = true;
+    }
   }
-}
-
-var valueStack = [];
-var fiberStack;
+  function cancelWorkTimer(fiber) {
+    {
+      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+        return;
+      } // Remember we shouldn't complete measurement for this fiber.
+      // Otherwise flamechart will be deep even for small updates.
 
-{
-  fiberStack = [];
-}
 
-var index = -1;
+      fiber._debugIsCurrentlyTiming = false;
+      clearFiberMark(fiber, null);
+    }
+  }
+  function stopWorkTimer(fiber) {
+    {
+      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+        return;
+      } // If we pause, its parent is the fiber to unwind from.
 
-function createCursor(defaultValue) {
-  return {
-    current: defaultValue
-  };
-}
 
-function pop(cursor, fiber) {
-  if (index < 0) {
-    {
-      warningWithoutStack$1(false, 'Unexpected pop.');
-    }
+      currentFiber = fiber.return;
 
-    return;
-  }
+      if (!fiber._debugIsCurrentlyTiming) {
+        return;
+      }
 
-  {
-    if (fiber !== fiberStack[index]) {
-      warningWithoutStack$1(false, 'Unexpected Fiber popped.');
+      fiber._debugIsCurrentlyTiming = false;
+      endFiberMark(fiber, null, null);
     }
   }
+  function stopFailedWorkTimer(fiber) {
+    {
+      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+        return;
+      } // If we pause, its parent is the fiber to unwind from.
 
-  cursor.current = valueStack[index];
-  valueStack[index] = null;
 
-  {
-    fiberStack[index] = null;
+      currentFiber = fiber.return;
+
+      if (!fiber._debugIsCurrentlyTiming) {
+        return;
+      }
+
+      fiber._debugIsCurrentlyTiming = false;
+      var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';
+      endFiberMark(fiber, null, warning);
+    }
   }
+  function startPhaseTimer(fiber, phase) {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-  index--;
-}
+      clearPendingPhaseMeasurement();
 
-function push(cursor, value, fiber) {
-  index++;
-  valueStack[index] = cursor.current;
+      if (!beginFiberMark(fiber, phase)) {
+        return;
+      }
 
-  {
-    fiberStack[index] = fiber;
+      currentPhaseFiber = fiber;
+      currentPhase = phase;
+    }
   }
+  function stopPhaseTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-  cursor.current = value;
-}
+      if (currentPhase !== null && currentPhaseFiber !== null) {
+        var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;
+        endFiberMark(currentPhaseFiber, currentPhase, warning);
+      }
 
-var warnedAboutMissingGetChildContext;
+      currentPhase = null;
+      currentPhaseFiber = null;
+    }
+  }
+  function startWorkLoopTimer(nextUnitOfWork) {
+    {
+      currentFiber = nextUnitOfWork;
 
-{
-  warnedAboutMissingGetChildContext = {};
-}
+      if (!supportsUserTiming) {
+        return;
+      }
 
-var emptyContextObject = {};
+      commitCountInCurrentWorkLoop = 0; // This is top level call.
+      // Any other measurements are performed within.
 
-{
-  Object.freeze(emptyContextObject);
-} // A cursor to the current merged context object on the stack.
+      beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop.
 
+      resumeTimers();
+    }
+  }
+  function stopWorkLoopTimer(interruptedBy, didCompleteRoot) {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.
+      var warning = null;
 
-var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.
-// We use this to get access to the parent context after we have already
-// pushed the next context provider, and now need to merge their contexts.
+      if (interruptedBy !== null) {
+        if (interruptedBy.tag === HostRoot) {
+          warning = 'A top-level update interrupted the previous render';
+        } else {
+          var componentName = getComponentName(interruptedBy.type) || 'Unknown';
+          warning = "An update to " + componentName + " interrupted the previous render";
+        }
+      } else if (commitCountInCurrentWorkLoop > 1) {
+        warning = 'There were cascading updates';
+      }
 
-var previousContext = emptyContextObject;
+      commitCountInCurrentWorkLoop = 0;
+      var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop.
 
-function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
-  if (disableLegacyContext) {
-    return emptyContextObject;
-  } else {
-    if (didPushOwnContextIfProvider && isContextProvider(Component)) {
-      // If the fiber is a context provider itself, when we read its context
-      // we may have already pushed its own child context on the stack. A context
-      // provider should not "see" its own child context. Therefore we read the
-      // previous (parent) context instead for a context provider.
-      return previousContext;
+      pauseTimers();
+      endMark(label, '(React Tree Reconciliation)', warning);
     }
-
-    return contextStackCursor.current;
   }
-}
+  function startCommitTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-function cacheContext(workInProgress, unmaskedContext, maskedContext) {
-  if (disableLegacyContext) {
-    return;
-  } else {
-    var instance = workInProgress.stateNode;
-    instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
-    instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
+      isCommitting = true;
+      hasScheduledUpdateInCurrentCommit = false;
+      labelsInCurrentCommit.clear();
+      beginMark('(Committing Changes)');
+    }
   }
-}
-
-function getMaskedContext(workInProgress, unmaskedContext) {
-  if (disableLegacyContext) {
-    return emptyContextObject;
-  } else {
-    var type = workInProgress.type;
-    var contextTypes = type.contextTypes;
-
-    if (!contextTypes) {
-      return emptyContextObject;
-    } // Avoid recreating masked context unless unmasked context has changed.
-    // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
-    // This may trigger infinite loops if componentWillReceiveProps calls setState.
+  function stopCommitTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
+      var warning = null;
 
-    var instance = workInProgress.stateNode;
+      if (hasScheduledUpdateInCurrentCommit) {
+        warning = 'Lifecycle hook scheduled a cascading update';
+      } else if (commitCountInCurrentWorkLoop > 0) {
+        warning = 'Caused by a cascading update in earlier commit';
+      }
 
-    if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
-      return instance.__reactInternalMemoizedMaskedChildContext;
+      hasScheduledUpdateInCurrentCommit = false;
+      commitCountInCurrentWorkLoop++;
+      isCommitting = false;
+      labelsInCurrentCommit.clear();
+      endMark('(Committing Changes)', '(Committing Changes)', warning);
     }
+  }
+  function startCommitSnapshotEffectsTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-    var context = {};
-
-    for (var key in contextTypes) {
-      context[key] = unmaskedContext[key];
+      effectCountInCurrentCommit = 0;
+      beginMark('(Committing Snapshot Effects)');
     }
-
+  }
+  function stopCommitSnapshotEffectsTimer() {
     {
-      var name = getComponentName(type) || 'Unknown';
-      checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev);
-    } // Cache unmasked context so we can avoid recreating masked context unless necessary.
-    // Context is created before the class component is instantiated so check for instance.
-
+      if (!supportsUserTiming) {
+        return;
+      }
 
-    if (instance) {
-      cacheContext(workInProgress, unmaskedContext, context);
+      var count = effectCountInCurrentCommit;
+      effectCountInCurrentCommit = 0;
+      endMark("(Committing Snapshot Effects: " + count + " Total)", '(Committing Snapshot Effects)', null);
     }
+  }
+  function startCommitHostEffectsTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-    return context;
+      effectCountInCurrentCommit = 0;
+      beginMark('(Committing Host Effects)');
+    }
   }
-}
+  function stopCommitHostEffectsTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-function hasContextChanged() {
-  if (disableLegacyContext) {
-    return false;
-  } else {
-    return didPerformWorkStackCursor.current;
+      var count = effectCountInCurrentCommit;
+      effectCountInCurrentCommit = 0;
+      endMark("(Committing Host Effects: " + count + " Total)", '(Committing Host Effects)', null);
+    }
   }
-}
+  function startCommitLifeCyclesTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
+      }
 
-function isContextProvider(type) {
-  if (disableLegacyContext) {
-    return false;
-  } else {
-    var childContextTypes = type.childContextTypes;
-    return childContextTypes !== null && childContextTypes !== undefined;
-  }
-}
-
-function popContext(fiber) {
-  if (disableLegacyContext) {
-    return;
-  } else {
-    pop(didPerformWorkStackCursor, fiber);
-    pop(contextStackCursor, fiber);
-  }
-}
-
-function popTopLevelContextObject(fiber) {
-  if (disableLegacyContext) {
-    return;
-  } else {
-    pop(didPerformWorkStackCursor, fiber);
-    pop(contextStackCursor, fiber);
-  }
-}
-
-function pushTopLevelContextObject(fiber, context, didChange) {
-  if (disableLegacyContext) {
-    return;
-  } else {
-    if (!(contextStackCursor.current === emptyContextObject)) {
-      {
-        throw Error("Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.");
+      effectCountInCurrentCommit = 0;
+      beginMark('(Calling Lifecycle Methods)');
+    }
+  }
+  function stopCommitLifeCyclesTimer() {
+    {
+      if (!supportsUserTiming) {
+        return;
       }
+
+      var count = effectCountInCurrentCommit;
+      effectCountInCurrentCommit = 0;
+      endMark("(Calling Lifecycle Methods: " + count + " Total)", '(Calling Lifecycle Methods)', null);
     }
+  }
+
+  var valueStack = [];
+  var fiberStack;
 
-    push(contextStackCursor, context, fiber);
-    push(didPerformWorkStackCursor, didChange, fiber);
+  {
+    fiberStack = [];
   }
-}
 
-function processChildContext(fiber, type, parentContext) {
-  if (disableLegacyContext) {
-    return parentContext;
-  } else {
-    var instance = fiber.stateNode;
-    var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.
-    // It has only been added in Fiber to match the (unintentional) behavior in Stack.
+  var index = -1;
 
-    if (typeof instance.getChildContext !== 'function') {
-      {
-        var componentName = getComponentName(type) || 'Unknown';
+  function createCursor(defaultValue) {
+    return {
+      current: defaultValue
+    };
+  }
 
-        if (!warnedAboutMissingGetChildContext[componentName]) {
-          warnedAboutMissingGetChildContext[componentName] = true;
-          warningWithoutStack$1(false, '%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);
-        }
+  function pop(cursor, fiber) {
+    if (index < 0) {
+      {
+        error('Unexpected pop.');
       }
 
-      return parentContext;
+      return;
     }
 
-    var childContext;
-
     {
-      setCurrentPhase('getChildContext');
+      if (fiber !== fiberStack[index]) {
+        error('Unexpected Fiber popped.');
+      }
     }
 
-    startPhaseTimer(fiber, 'getChildContext');
-    childContext = instance.getChildContext();
-    stopPhaseTimer();
+    cursor.current = valueStack[index];
+    valueStack[index] = null;
 
     {
-      setCurrentPhase(null);
+      fiberStack[index] = null;
     }
 
-    for (var contextKey in childContext) {
-      if (!(contextKey in childContextTypes)) {
-        {
-          throw Error((getComponentName(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes.");
-        }
-      }
-    }
+    index--;
+  }
+
+  function push(cursor, value, fiber) {
+    index++;
+    valueStack[index] = cursor.current;
 
     {
-      var name = getComponentName(type) || 'Unknown';
-      checkPropTypes_1(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when
-      // somebody calls unstable_renderSubtreeIntoContainer() and we process
-      // context from the parent component instance. The stack will be missing
-      // because it's outside of the reconciliation, and so the pointer has not
-      // been set. This is rare and doesn't matter. We'll also remove that API.
-      getCurrentFiberStackInDev);
+      fiberStack[index] = fiber;
     }
 
-    return _assign({}, parentContext, {}, childContext);
+    cursor.current = value;
   }
-}
 
-function pushContextProvider(workInProgress) {
-  if (disableLegacyContext) {
-    return false;
-  } else {
-    var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.
-    // If the instance does not exist yet, we will push null at first,
-    // and replace it on the stack later when invalidating the context.
+  var warnedAboutMissingGetChildContext;
 
-    var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.
-    // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
-
-    previousContext = contextStackCursor.current;
-    push(contextStackCursor, memoizedMergedChildContext, workInProgress);
-    push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
-    return true;
+  {
+    warnedAboutMissingGetChildContext = {};
   }
-}
 
-function invalidateContextProvider(workInProgress, type, didChange) {
-  if (disableLegacyContext) {
-    return;
-  } else {
-    var instance = workInProgress.stateNode;
+  var emptyContextObject = {};
 
-    if (!instance) {
-      {
-        throw Error("Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.");
-      }
-    }
+  {
+    Object.freeze(emptyContextObject);
+  } // A cursor to the current merged context object on the stack.
 
-    if (didChange) {
-      // Merge parent and own context.
-      // Skip this if we're not updating due to sCU.
-      // This avoids unnecessarily recomputing memoized values.
-      var mergedContext = processChildContext(workInProgress, type, previousContext);
-      instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.
-      // It is important to unwind the context in the reverse order.
 
-      pop(didPerformWorkStackCursor, workInProgress);
-      pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.
+  var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.
 
-      push(contextStackCursor, mergedContext, workInProgress);
-      push(didPerformWorkStackCursor, didChange, workInProgress);
-    } else {
-      pop(didPerformWorkStackCursor, workInProgress);
-      push(didPerformWorkStackCursor, didChange, workInProgress);
+  var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.
+  // We use this to get access to the parent context after we have already
+  // pushed the next context provider, and now need to merge their contexts.
+
+  var previousContext = emptyContextObject;
+
+  function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
+    {
+      if (didPushOwnContextIfProvider && isContextProvider(Component)) {
+        // If the fiber is a context provider itself, when we read its context
+        // we may have already pushed its own child context on the stack. A context
+        // provider should not "see" its own child context. Therefore we read the
+        // previous (parent) context instead for a context provider.
+        return previousContext;
+      }
+
+      return contextStackCursor.current;
     }
   }
-}
 
-function findCurrentUnmaskedContext(fiber) {
-  if (disableLegacyContext) {
-    return emptyContextObject;
-  } else {
-    // Currently this is only used with renderSubtreeIntoContainer; not sure if it
-    // makes sense elsewhere
-    if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) {
-      {
-        throw Error("Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.");
-      }
+  function cacheContext(workInProgress, unmaskedContext, maskedContext) {
+    {
+      var instance = workInProgress.stateNode;
+      instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
+      instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
     }
+  }
 
-    var node = fiber;
+  function getMaskedContext(workInProgress, unmaskedContext) {
+    {
+      var type = workInProgress.type;
+      var contextTypes = type.contextTypes;
 
-    do {
-      switch (node.tag) {
-        case HostRoot:
-          return node.stateNode.context;
+      if (!contextTypes) {
+        return emptyContextObject;
+      } // Avoid recreating masked context unless unmasked context has changed.
+      // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
+      // This may trigger infinite loops if componentWillReceiveProps calls setState.
 
-        case ClassComponent:
-          {
-            var Component = node.type;
 
-            if (isContextProvider(Component)) {
-              return node.stateNode.__reactInternalMemoizedMergedChildContext;
-            }
+      var instance = workInProgress.stateNode;
 
-            break;
-          }
+      if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
+        return instance.__reactInternalMemoizedMaskedChildContext;
       }
 
-      node = node.return;
-    } while (node !== null);
+      var context = {};
+
+      for (var key in contextTypes) {
+        context[key] = unmaskedContext[key];
+      }
 
-    {
       {
-        throw Error("Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.");
-      }
-    }
-  }
-}
-
-var LegacyRoot = 0;
-var BlockingRoot = 1;
-var ConcurrentRoot = 2;
-
-var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
-var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing;
-var __interactionsRef = _ReactInternals$Sched$1.__interactionsRef;
-var __subscriberRef = _ReactInternals$Sched$1.__subscriberRef;
-var unstable_clear = _ReactInternals$Sched$1.unstable_clear;
-var unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent;
-var unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID;
-var unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe;
-var unstable_trace = _ReactInternals$Sched$1.unstable_trace;
-var unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe;
-var unstable_wrap = _ReactInternals$Sched$1.unstable_wrap;
-
-// Intentionally not named imports because Rollup would use dynamic dispatch for
-// CommonJS interop named imports.
-var Scheduler_runWithPriority = unstable_runWithPriority;
-var Scheduler_scheduleCallback = unstable_scheduleCallback;
-var Scheduler_cancelCallback = unstable_cancelCallback;
-var Scheduler_shouldYield = unstable_shouldYield;
-var Scheduler_requestPaint = unstable_requestPaint;
-var Scheduler_now = unstable_now;
-var Scheduler_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
-var Scheduler_ImmediatePriority = unstable_ImmediatePriority;
-var Scheduler_UserBlockingPriority = unstable_UserBlockingPriority;
-var Scheduler_NormalPriority = unstable_NormalPriority;
-var Scheduler_LowPriority = unstable_LowPriority;
-var Scheduler_IdlePriority = unstable_IdlePriority;
-
-if (enableSchedulerTracing) {
-  // Provide explicit error message when production+profiling bundle of e.g.
-  // react-dom is used with production (non-profiling) bundle of
-  // scheduler/tracing
-  if (!(__interactionsRef != null && __interactionsRef.current != null)) {
-    {
-      throw Error("It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling");
-    }
-  }
-}
-
-var fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use
-// ascending numbers so we can compare them like numbers. They start at 90 to
-// avoid clashing with Scheduler's priorities.
-
-var ImmediatePriority = 99;
-var UserBlockingPriority$2 = 98;
-var NormalPriority = 97;
-var LowPriority = 96;
-var IdlePriority = 95; // NoPriority is the absence of priority. Also React-only.
-
-var NoPriority = 90;
-var shouldYield = Scheduler_shouldYield;
-var requestPaint = // Fall back gracefully if we're running an older version of Scheduler.
-Scheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {};
-var syncQueue = null;
-var immediateQueueCallbackNode = null;
-var isFlushingSyncQueue = false;
-var initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly.
-// This will be the case for modern browsers that support `performance.now`. In
-// older browsers, Scheduler falls back to `Date.now`, which returns a Unix
-// timestamp. In that case, subtract the module initialization time to simulate
-// the behavior of performance.now and keep our times small enough to fit
-// within 32 bits.
-// TODO: Consider lifting this into Scheduler.
-
-var now = initialTimeMs < 10000 ? Scheduler_now : function () {
-  return Scheduler_now() - initialTimeMs;
-};
-function getCurrentPriorityLevel() {
-  switch (Scheduler_getCurrentPriorityLevel()) {
-    case Scheduler_ImmediatePriority:
-      return ImmediatePriority;
+        var name = getComponentName(type) || 'Unknown';
+        checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev);
+      } // Cache unmasked context so we can avoid recreating masked context unless necessary.
+      // Context is created before the class component is instantiated so check for instance.
 
-    case Scheduler_UserBlockingPriority:
-      return UserBlockingPriority$2;
 
-    case Scheduler_NormalPriority:
-      return NormalPriority;
+      if (instance) {
+        cacheContext(workInProgress, unmaskedContext, context);
+      }
 
-    case Scheduler_LowPriority:
-      return LowPriority;
+      return context;
+    }
+  }
 
-    case Scheduler_IdlePriority:
-      return IdlePriority;
+  function hasContextChanged() {
+    {
+      return didPerformWorkStackCursor.current;
+    }
+  }
 
-    default:
-      {
+  function isContextProvider(type) {
+    {
+      var childContextTypes = type.childContextTypes;
+      return childContextTypes !== null && childContextTypes !== undefined;
+    }
+  }
+
+  function popContext(fiber) {
+    {
+      pop(didPerformWorkStackCursor, fiber);
+      pop(contextStackCursor, fiber);
+    }
+  }
+
+  function popTopLevelContextObject(fiber) {
+    {
+      pop(didPerformWorkStackCursor, fiber);
+      pop(contextStackCursor, fiber);
+    }
+  }
+
+  function pushTopLevelContextObject(fiber, context, didChange) {
+    {
+      if (!(contextStackCursor.current === emptyContextObject)) {
         {
-          throw Error("Unknown priority level.");
+          throw Error( "Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue." );
         }
       }
 
+      push(contextStackCursor, context, fiber);
+      push(didPerformWorkStackCursor, didChange, fiber);
+    }
   }
-}
 
-function reactPriorityToSchedulerPriority(reactPriorityLevel) {
-  switch (reactPriorityLevel) {
-    case ImmediatePriority:
-      return Scheduler_ImmediatePriority;
+  function processChildContext(fiber, type, parentContext) {
+    {
+      var instance = fiber.stateNode;
+      var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.
+      // It has only been added in Fiber to match the (unintentional) behavior in Stack.
 
-    case UserBlockingPriority$2:
-      return Scheduler_UserBlockingPriority;
+      if (typeof instance.getChildContext !== 'function') {
+        {
+          var componentName = getComponentName(type) || 'Unknown';
 
-    case NormalPriority:
-      return Scheduler_NormalPriority;
+          if (!warnedAboutMissingGetChildContext[componentName]) {
+            warnedAboutMissingGetChildContext[componentName] = true;
 
-    case LowPriority:
-      return Scheduler_LowPriority;
+            error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);
+          }
+        }
 
-    case IdlePriority:
-      return Scheduler_IdlePriority;
+        return parentContext;
+      }
 
-    default:
-      {
-        {
-          throw Error("Unknown priority level.");
+      var childContext;
+      startPhaseTimer(fiber, 'getChildContext');
+      childContext = instance.getChildContext();
+      stopPhaseTimer();
+
+      for (var contextKey in childContext) {
+        if (!(contextKey in childContextTypes)) {
+          {
+            throw Error( (getComponentName(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes." );
+          }
         }
       }
 
-  }
-}
-
-function runWithPriority$2(reactPriorityLevel, fn) {
-  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);
-  return Scheduler_runWithPriority(priorityLevel, fn);
-}
-function scheduleCallback(reactPriorityLevel, callback, options) {
-  var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);
-  return Scheduler_scheduleCallback(priorityLevel, callback, options);
-}
-function scheduleSyncCallback(callback) {
-  // Push this callback into an internal queue. We'll flush these either in
-  // the next tick, or earlier if something calls `flushSyncCallbackQueue`.
-  if (syncQueue === null) {
-    syncQueue = [callback]; // Flush the queue in the next tick, at the earliest.
+      {
+        var name = getComponentName(type) || 'Unknown';
+        checkPropTypes_1(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when
+        // somebody calls unstable_renderSubtreeIntoContainer() and we process
+        // context from the parent component instance. The stack will be missing
+        // because it's outside of the reconciliation, and so the pointer has not
+        // been set. This is rare and doesn't matter. We'll also remove that API.
+        getCurrentFiberStackInDev);
+      }
 
-    immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl);
-  } else {
-    // Push onto existing queue. Don't need to schedule a callback because
-    // we already scheduled one when we created the queue.
-    syncQueue.push(callback);
+      return _assign({}, parentContext, {}, childContext);
+    }
   }
 
-  return fakeCallbackNode;
-}
-function cancelCallback(callbackNode) {
-  if (callbackNode !== fakeCallbackNode) {
-    Scheduler_cancelCallback(callbackNode);
-  }
-}
-function flushSyncCallbackQueue() {
-  if (immediateQueueCallbackNode !== null) {
-    var node = immediateQueueCallbackNode;
-    immediateQueueCallbackNode = null;
-    Scheduler_cancelCallback(node);
-  }
+  function pushContextProvider(workInProgress) {
+    {
+      var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.
+      // If the instance does not exist yet, we will push null at first,
+      // and replace it on the stack later when invalidating the context.
 
-  flushSyncCallbackQueueImpl();
-}
+      var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.
+      // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
 
-function flushSyncCallbackQueueImpl() {
-  if (!isFlushingSyncQueue && syncQueue !== null) {
-    // Prevent re-entrancy.
-    isFlushingSyncQueue = true;
-    var i = 0;
+      previousContext = contextStackCursor.current;
+      push(contextStackCursor, memoizedMergedChildContext, workInProgress);
+      push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
+      return true;
+    }
+  }
 
-    try {
-      var _isSync = true;
-      var queue = syncQueue;
-      runWithPriority$2(ImmediatePriority, function () {
-        for (; i < queue.length; i++) {
-          var callback = queue[i];
+  function invalidateContextProvider(workInProgress, type, didChange) {
+    {
+      var instance = workInProgress.stateNode;
 
-          do {
-            callback = callback(_isSync);
-          } while (callback !== null);
+      if (!instance) {
+        {
+          throw Error( "Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue." );
         }
-      });
-      syncQueue = null;
-    } catch (error) {
-      // If something throws, leave the remaining callbacks on the queue.
-      if (syncQueue !== null) {
-        syncQueue = syncQueue.slice(i + 1);
-      } // Resume flushing in the next tick
-
+      }
 
-      Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue);
-      throw error;
-    } finally {
-      isFlushingSyncQueue = false;
-    }
-  }
-}
-
-var NoMode = 0;
-var StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root
-// tag instead
-
-var BlockingMode = 2;
-var ConcurrentMode = 4;
-var ProfileMode = 8;
-
-// Max 31 bit integer. The max integer size in V8 for 32-bit systems.
-// Math.pow(2, 30) - 1
-// 0b111111111111111111111111111111
-var MAX_SIGNED_31_BIT_INT = 1073741823;
-
-var NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that
-// Never work can be committed in an inconsistent state without tearing the UI.
-// The main example is offscreen content, like a hidden subtree. So one possible
-// name is Offscreen. However, it also includes dehydrated Suspense boundaries,
-// which are inconsistent in the sense that they haven't finished yet, but
-// aren't visibly inconsistent because the server rendered HTML matches what the
-// hydrated tree would look like.
-
-var Never = 1; // Idle is slightly higher priority than Never. It must completely finish in
-// order to be consistent.
-
-var Idle = 2; // Continuous Hydration is a moving priority. It is slightly higher than Idle
-// and is used to increase priority of hover targets. It is increasing with
-// each usage so that last always wins.
-
-var ContinuousHydration = 3;
-var Sync = MAX_SIGNED_31_BIT_INT;
-var Batched = Sync - 1;
-var UNIT_SIZE = 10;
-var MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms.
-
-function msToExpirationTime(ms) {
-  // Always add an offset so that we don't clash with the magic number for NoWork.
-  return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);
-}
-function expirationTimeToMs(expirationTime) {
-  return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;
-}
-
-function ceiling(num, precision) {
-  return ((num / precision | 0) + 1) * precision;
-}
-
-function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {
-  return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);
-} // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update
-// the names to reflect.
-
-
-var LOW_PRIORITY_EXPIRATION = 5000;
-var LOW_PRIORITY_BATCH_SIZE = 250;
-function computeAsyncExpiration(currentTime) {
-  return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);
-}
-function computeSuspenseExpiration(currentTime, timeoutMs) {
-  // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time?
-  return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE);
-} // We intentionally set a higher expiration time for interactive updates in
-// dev than in production.
-//
-// If the main thread is being blocked so long that you hit the expiration,
-// it's a problem that could be solved with better scheduling.
-//
-// People will be more likely to notice this and fix it with the long
-// expiration time in development.
-//
-// In production we opt for better UX at the risk of masking scheduling
-// problems, by expiring fast.
-
-var HIGH_PRIORITY_EXPIRATION = 500;
-var HIGH_PRIORITY_BATCH_SIZE = 100;
-function computeInteractiveExpiration(currentTime) {
-  return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);
-}
-function computeContinuousHydrationExpiration(currentTime) {
-  // Each time we ask for a new one of these we increase the priority.
-  // This ensures that the last one always wins since we can't deprioritize
-  // once we've scheduled work already.
-  return ContinuousHydration++;
-}
-function inferPriorityFromExpirationTime(currentTime, expirationTime) {
-  if (expirationTime === Sync) {
-    return ImmediatePriority;
-  }
-
-  if (expirationTime === Never || expirationTime === Idle) {
-    return IdlePriority;
-  }
+      if (didChange) {
+        // Merge parent and own context.
+        // Skip this if we're not updating due to sCU.
+        // This avoids unnecessarily recomputing memoized values.
+        var mergedContext = processChildContext(workInProgress, type, previousContext);
+        instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.
+        // It is important to unwind the context in the reverse order.
 
-  var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime);
+        pop(didPerformWorkStackCursor, workInProgress);
+        pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.
 
-  if (msUntil <= 0) {
-    return ImmediatePriority;
+        push(contextStackCursor, mergedContext, workInProgress);
+        push(didPerformWorkStackCursor, didChange, workInProgress);
+      } else {
+        pop(didPerformWorkStackCursor, workInProgress);
+        push(didPerformWorkStackCursor, didChange, workInProgress);
+      }
+    }
   }
 
-  if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) {
-    return UserBlockingPriority$2;
-  }
+  function findCurrentUnmaskedContext(fiber) {
+    {
+      // Currently this is only used with renderSubtreeIntoContainer; not sure if it
+      // makes sense elsewhere
+      if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) {
+        {
+          throw Error( "Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue." );
+        }
+      }
 
-  if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) {
-    return NormalPriority;
-  } // TODO: Handle LowPriority
-  // Assume anything lower has idle priority
+      var node = fiber;
 
+      do {
+        switch (node.tag) {
+          case HostRoot:
+            return node.stateNode.context;
 
-  return IdlePriority;
-}
+          case ClassComponent:
+            {
+              var Component = node.type;
 
-/**
- * Forked from fbjs/warning:
- * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
- *
- * Only change is we use console.warn instead of console.error,
- * and do nothing when 'console' is not supported.
- * This really simplifies the code.
- * ---
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
-var lowPriorityWarningWithoutStack = function () {};
+              if (isContextProvider(Component)) {
+                return node.stateNode.__reactInternalMemoizedMergedChildContext;
+              }
 
-{
-  var printWarning$1 = function (format) {
-    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
-      args[_key - 1] = arguments[_key];
-    }
+              break;
+            }
+        }
 
-    var argIndex = 0;
-    var message = 'Warning: ' + format.replace(/%s/g, function () {
-      return args[argIndex++];
-    });
+        node = node.return;
+      } while (node !== null);
 
-    if (typeof console !== 'undefined') {
-      console.warn(message);
+      {
+        {
+          throw Error( "Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue." );
+        }
+      }
     }
+  }
 
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
+  var LegacyRoot = 0;
+  var BlockingRoot = 1;
+  var ConcurrentRoot = 2;
 
-  lowPriorityWarningWithoutStack = function (condition, format) {
-    if (format === undefined) {
-      throw new Error('`lowPriorityWarningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument');
-    }
+  var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
+  var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing,
+      __interactionsRef = _ReactInternals$Sched$1.__interactionsRef,
+      __subscriberRef = _ReactInternals$Sched$1.__subscriberRef,
+      unstable_clear = _ReactInternals$Sched$1.unstable_clear,
+      unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent,
+      unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID,
+      unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe,
+      unstable_trace = _ReactInternals$Sched$1.unstable_trace,
+      unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe,
+      unstable_wrap = _ReactInternals$Sched$1.unstable_wrap;
 
-    if (!condition) {
-      for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
-        args[_key2 - 2] = arguments[_key2];
-      }
+  var Scheduler_runWithPriority = unstable_runWithPriority,
+      Scheduler_scheduleCallback = unstable_scheduleCallback,
+      Scheduler_cancelCallback = unstable_cancelCallback,
+      Scheduler_shouldYield = unstable_shouldYield,
+      Scheduler_requestPaint = unstable_requestPaint,
+      Scheduler_now = unstable_now,
+      Scheduler_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel,
+      Scheduler_ImmediatePriority = unstable_ImmediatePriority,
+      Scheduler_UserBlockingPriority = unstable_UserBlockingPriority,
+      Scheduler_NormalPriority = unstable_NormalPriority,
+      Scheduler_LowPriority = unstable_LowPriority,
+      Scheduler_IdlePriority = unstable_IdlePriority;
 
-      printWarning$1.apply(void 0, [format].concat(args));
-    }
+  {
+    // Provide explicit error message when production+profiling bundle of e.g.
+    // react-dom is used with production (non-profiling) bundle of
+    // scheduler/tracing
+    if (!(__interactionsRef != null && __interactionsRef.current != null)) {
+      {
+        throw Error( "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling" );
+      }
+    }
+  }
+
+  var fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use
+  // ascending numbers so we can compare them like numbers. They start at 90 to
+  // avoid clashing with Scheduler's priorities.
+
+  var ImmediatePriority = 99;
+  var UserBlockingPriority$1 = 98;
+  var NormalPriority = 97;
+  var LowPriority = 96;
+  var IdlePriority = 95; // NoPriority is the absence of priority. Also React-only.
+
+  var NoPriority = 90;
+  var shouldYield = Scheduler_shouldYield;
+  var requestPaint = // Fall back gracefully if we're running an older version of Scheduler.
+  Scheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {};
+  var syncQueue = null;
+  var immediateQueueCallbackNode = null;
+  var isFlushingSyncQueue = false;
+  var initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly.
+  // This will be the case for modern browsers that support `performance.now`. In
+  // older browsers, Scheduler falls back to `Date.now`, which returns a Unix
+  // timestamp. In that case, subtract the module initialization time to simulate
+  // the behavior of performance.now and keep our times small enough to fit
+  // within 32 bits.
+  // TODO: Consider lifting this into Scheduler.
+
+  var now = initialTimeMs < 10000 ? Scheduler_now : function () {
+    return Scheduler_now() - initialTimeMs;
   };
-}
+  function getCurrentPriorityLevel() {
+    switch (Scheduler_getCurrentPriorityLevel()) {
+      case Scheduler_ImmediatePriority:
+        return ImmediatePriority;
 
-var lowPriorityWarningWithoutStack$1 = lowPriorityWarningWithoutStack;
+      case Scheduler_UserBlockingPriority:
+        return UserBlockingPriority$1;
 
-var ReactStrictModeWarnings = {
-  recordUnsafeLifecycleWarnings: function (fiber, instance) {},
-  flushPendingUnsafeLifecycleWarnings: function () {},
-  recordLegacyContextWarning: function (fiber, instance) {},
-  flushLegacyContextWarning: function () {},
-  discardPendingWarnings: function () {}
-};
+      case Scheduler_NormalPriority:
+        return NormalPriority;
 
-{
-  var findStrictRoot = function (fiber) {
-    var maybeStrictRoot = null;
-    var node = fiber;
+      case Scheduler_LowPriority:
+        return LowPriority;
 
-    while (node !== null) {
-      if (node.mode & StrictMode) {
-        maybeStrictRoot = node;
-      }
+      case Scheduler_IdlePriority:
+        return IdlePriority;
+
+      default:
+        {
+          {
+            throw Error( "Unknown priority level." );
+          }
+        }
 
-      node = node.return;
     }
+  }
 
-    return maybeStrictRoot;
-  };
+  function reactPriorityToSchedulerPriority(reactPriorityLevel) {
+    switch (reactPriorityLevel) {
+      case ImmediatePriority:
+        return Scheduler_ImmediatePriority;
 
-  var setToSortedString = function (set) {
-    var array = [];
-    set.forEach(function (value) {
-      array.push(value);
-    });
-    return array.sort().join(', ');
-  };
+      case UserBlockingPriority$1:
+        return Scheduler_UserBlockingPriority;
 
-  var pendingComponentWillMountWarnings = [];
-  var pendingUNSAFE_ComponentWillMountWarnings = [];
-  var pendingComponentWillReceivePropsWarnings = [];
-  var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
-  var pendingComponentWillUpdateWarnings = [];
-  var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.
+      case NormalPriority:
+        return Scheduler_NormalPriority;
 
-  var didWarnAboutUnsafeLifecycles = new Set();
+      case LowPriority:
+        return Scheduler_LowPriority;
 
-  ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
-    // Dedup strategy: Warn once per component.
-    if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
-      return;
-    }
+      case IdlePriority:
+        return Scheduler_IdlePriority;
 
-    if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.
-    instance.componentWillMount.__suppressDeprecationWarning !== true) {
-      pendingComponentWillMountWarnings.push(fiber);
-    }
+      default:
+        {
+          {
+            throw Error( "Unknown priority level." );
+          }
+        }
 
-    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') {
-      pendingUNSAFE_ComponentWillMountWarnings.push(fiber);
     }
+  }
 
-    if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
-      pendingComponentWillReceivePropsWarnings.push(fiber);
-    }
+  function runWithPriority$1(reactPriorityLevel, fn) {
+    var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);
+    return Scheduler_runWithPriority(priorityLevel, fn);
+  }
+  function scheduleCallback(reactPriorityLevel, callback, options) {
+    var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);
+    return Scheduler_scheduleCallback(priorityLevel, callback, options);
+  }
+  function scheduleSyncCallback(callback) {
+    // Push this callback into an internal queue. We'll flush these either in
+    // the next tick, or earlier if something calls `flushSyncCallbackQueue`.
+    if (syncQueue === null) {
+      syncQueue = [callback]; // Flush the queue in the next tick, at the earliest.
 
-    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
-      pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);
+      immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl);
+    } else {
+      // Push onto existing queue. Don't need to schedule a callback because
+      // we already scheduled one when we created the queue.
+      syncQueue.push(callback);
     }
 
-    if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
-      pendingComponentWillUpdateWarnings.push(fiber);
+    return fakeCallbackNode;
+  }
+  function cancelCallback(callbackNode) {
+    if (callbackNode !== fakeCallbackNode) {
+      Scheduler_cancelCallback(callbackNode);
     }
-
-    if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {
-      pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);
+  }
+  function flushSyncCallbackQueue() {
+    if (immediateQueueCallbackNode !== null) {
+      var node = immediateQueueCallbackNode;
+      immediateQueueCallbackNode = null;
+      Scheduler_cancelCallback(node);
     }
-  };
-
-  ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
-    // We do an initial pass to gather component names
-    var componentWillMountUniqueNames = new Set();
 
-    if (pendingComponentWillMountWarnings.length > 0) {
-      pendingComponentWillMountWarnings.forEach(function (fiber) {
-        componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');
-        didWarnAboutUnsafeLifecycles.add(fiber.type);
-      });
-      pendingComponentWillMountWarnings = [];
-    }
+    flushSyncCallbackQueueImpl();
+  }
 
-    var UNSAFE_componentWillMountUniqueNames = new Set();
+  function flushSyncCallbackQueueImpl() {
+    if (!isFlushingSyncQueue && syncQueue !== null) {
+      // Prevent re-entrancy.
+      isFlushingSyncQueue = true;
+      var i = 0;
 
-    if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {
-      pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {
-        UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');
-        didWarnAboutUnsafeLifecycles.add(fiber.type);
-      });
-      pendingUNSAFE_ComponentWillMountWarnings = [];
-    }
+      try {
+        var _isSync = true;
+        var queue = syncQueue;
+        runWithPriority$1(ImmediatePriority, function () {
+          for (; i < queue.length; i++) {
+            var callback = queue[i];
+
+            do {
+              callback = callback(_isSync);
+            } while (callback !== null);
+          }
+        });
+        syncQueue = null;
+      } catch (error) {
+        // If something throws, leave the remaining callbacks on the queue.
+        if (syncQueue !== null) {
+          syncQueue = syncQueue.slice(i + 1);
+        } // Resume flushing in the next tick
 
-    var componentWillReceivePropsUniqueNames = new Set();
 
-    if (pendingComponentWillReceivePropsWarnings.length > 0) {
-      pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {
-        componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');
-        didWarnAboutUnsafeLifecycles.add(fiber.type);
-      });
-      pendingComponentWillReceivePropsWarnings = [];
+        Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue);
+        throw error;
+      } finally {
+        isFlushingSyncQueue = false;
+      }
     }
+  }
 
-    var UNSAFE_componentWillReceivePropsUniqueNames = new Set();
-
-    if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {
-      pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {
-        UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');
-        didWarnAboutUnsafeLifecycles.add(fiber.type);
-      });
-      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
-    }
+  var NoMode = 0;
+  var StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root
+  // tag instead
 
-    var componentWillUpdateUniqueNames = new Set();
+  var BlockingMode = 2;
+  var ConcurrentMode = 4;
+  var ProfileMode = 8;
 
-    if (pendingComponentWillUpdateWarnings.length > 0) {
-      pendingComponentWillUpdateWarnings.forEach(function (fiber) {
-        componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');
-        didWarnAboutUnsafeLifecycles.add(fiber.type);
-      });
-      pendingComponentWillUpdateWarnings = [];
-    }
+  // Max 31 bit integer. The max integer size in V8 for 32-bit systems.
+  // Math.pow(2, 30) - 1
+  // 0b111111111111111111111111111111
+  var MAX_SIGNED_31_BIT_INT = 1073741823;
 
-    var UNSAFE_componentWillUpdateUniqueNames = new Set();
+  var NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that
+  // Never work can be committed in an inconsistent state without tearing the UI.
+  // The main example is offscreen content, like a hidden subtree. So one possible
+  // name is Offscreen. However, it also includes dehydrated Suspense boundaries,
+  // which are inconsistent in the sense that they haven't finished yet, but
+  // aren't visibly inconsistent because the server rendered HTML matches what the
+  // hydrated tree would look like.
 
-    if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {
-      pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {
-        UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');
-        didWarnAboutUnsafeLifecycles.add(fiber.type);
-      });
-      pendingUNSAFE_ComponentWillUpdateWarnings = [];
-    } // Finally, we flush all the warnings
-    // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'
+  var Never = 1; // Idle is slightly higher priority than Never. It must completely finish in
+  // order to be consistent.
 
+  var Idle = 2; // Continuous Hydration is slightly higher than Idle and is used to increase
+  // priority of hover targets.
 
-    if (UNSAFE_componentWillMountUniqueNames.size > 0) {
-      var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);
-      warningWithoutStack$1(false, 'Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames);
-    }
+  var ContinuousHydration = 3;
+  var Sync = MAX_SIGNED_31_BIT_INT;
+  var Batched = Sync - 1;
+  var UNIT_SIZE = 10;
+  var MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms.
 
-    if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {
-      var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);
+  function msToExpirationTime(ms) {
+    // Always subtract from the offset so that we don't clash with the magic number for NoWork.
+    return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);
+  }
+  function expirationTimeToMs(expirationTime) {
+    return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;
+  }
 
-      warningWithoutStack$1(false, 'Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '\nPlease update the following components: %s', _sortedNames);
-    }
+  function ceiling(num, precision) {
+    return ((num / precision | 0) + 1) * precision;
+  }
 
-    if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {
-      var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);
+  function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {
+    return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);
+  } // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update
+  // the names to reflect.
 
-      warningWithoutStack$1(false, 'Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2);
-    }
 
-    if (componentWillMountUniqueNames.size > 0) {
-      var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);
+  var LOW_PRIORITY_EXPIRATION = 5000;
+  var LOW_PRIORITY_BATCH_SIZE = 250;
+  function computeAsyncExpiration(currentTime) {
+    return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);
+  }
+  function computeSuspenseExpiration(currentTime, timeoutMs) {
+    // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time?
+    return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE);
+  } // We intentionally set a higher expiration time for interactive updates in
+  // dev than in production.
+  //
+  // If the main thread is being blocked so long that you hit the expiration,
+  // it's a problem that could be solved with better scheduling.
+  //
+  // People will be more likely to notice this and fix it with the long
+  // expiration time in development.
+  //
+  // In production we opt for better UX at the risk of masking scheduling
+  // problems, by expiring fast.
 
-      lowPriorityWarningWithoutStack$1(false, 'componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3);
+  var HIGH_PRIORITY_EXPIRATION =  500 ;
+  var HIGH_PRIORITY_BATCH_SIZE = 100;
+  function computeInteractiveExpiration(currentTime) {
+    return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);
+  }
+  function inferPriorityFromExpirationTime(currentTime, expirationTime) {
+    if (expirationTime === Sync) {
+      return ImmediatePriority;
     }
 
-    if (componentWillReceivePropsUniqueNames.size > 0) {
-      var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);
-
-      lowPriorityWarningWithoutStack$1(false, 'componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4);
+    if (expirationTime === Never || expirationTime === Idle) {
+      return IdlePriority;
     }
 
-    if (componentWillUpdateUniqueNames.size > 0) {
-      var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);
+    var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime);
 
-      lowPriorityWarningWithoutStack$1(false, 'componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5);
+    if (msUntil <= 0) {
+      return ImmediatePriority;
     }
-  };
 
-  var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.
+    if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) {
+      return UserBlockingPriority$1;
+    }
 
-  var didWarnAboutLegacyContext = new Set();
+    if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) {
+      return NormalPriority;
+    } // TODO: Handle LowPriority
+    // Assume anything lower has idle priority
 
-  ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
-    var strictRoot = findStrictRoot(fiber);
 
-    if (strictRoot === null) {
-      warningWithoutStack$1(false, 'Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');
-      return;
-    } // Dedup strategy: Warn once per component.
+    return IdlePriority;
+  }
 
+  var ReactStrictModeWarnings = {
+    recordUnsafeLifecycleWarnings: function (fiber, instance) {},
+    flushPendingUnsafeLifecycleWarnings: function () {},
+    recordLegacyContextWarning: function (fiber, instance) {},
+    flushLegacyContextWarning: function () {},
+    discardPendingWarnings: function () {}
+  };
 
-    if (didWarnAboutLegacyContext.has(fiber.type)) {
-      return;
-    }
+  {
+    var findStrictRoot = function (fiber) {
+      var maybeStrictRoot = null;
+      var node = fiber;
 
-    var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
+      while (node !== null) {
+        if (node.mode & StrictMode) {
+          maybeStrictRoot = node;
+        }
 
-    if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
-      if (warningsForRoot === undefined) {
-        warningsForRoot = [];
-        pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
+        node = node.return;
       }
 
-      warningsForRoot.push(fiber);
-    }
-  };
+      return maybeStrictRoot;
+    };
 
-  ReactStrictModeWarnings.flushLegacyContextWarning = function () {
-    pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
-      var uniqueNames = new Set();
-      fiberArray.forEach(function (fiber) {
-        uniqueNames.add(getComponentName(fiber.type) || 'Component');
-        didWarnAboutLegacyContext.add(fiber.type);
+    var setToSortedString = function (set) {
+      var array = [];
+      set.forEach(function (value) {
+        array.push(value);
       });
-      var sortedNames = setToSortedString(uniqueNames);
-      var strictRootComponentStack = getStackByFiberInDevAndProd(strictRoot);
-      warningWithoutStack$1(false, 'Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, strictRootComponentStack);
-    });
-  };
+      return array.sort().join(', ');
+    };
 
-  ReactStrictModeWarnings.discardPendingWarnings = function () {
-    pendingComponentWillMountWarnings = [];
-    pendingUNSAFE_ComponentWillMountWarnings = [];
-    pendingComponentWillReceivePropsWarnings = [];
-    pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
-    pendingComponentWillUpdateWarnings = [];
-    pendingUNSAFE_ComponentWillUpdateWarnings = [];
-    pendingLegacyContextWarning = new Map();
-  };
-}
+    var pendingComponentWillMountWarnings = [];
+    var pendingUNSAFE_ComponentWillMountWarnings = [];
+    var pendingComponentWillReceivePropsWarnings = [];
+    var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
+    var pendingComponentWillUpdateWarnings = [];
+    var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.
 
-var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.
+    var didWarnAboutUnsafeLifecycles = new Set();
 
-var failedBoundaries = null;
-var setRefreshHandler = function (handler) {
-  {
-    resolveFamily = handler;
-  }
-};
-function resolveFunctionForHotReloading(type) {
-  {
-    if (resolveFamily === null) {
-      // Hot reloading is disabled.
-      return type;
-    }
+    ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
+      // Dedup strategy: Warn once per component.
+      if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
+        return;
+      }
 
-    var family = resolveFamily(type);
+      if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.
+      instance.componentWillMount.__suppressDeprecationWarning !== true) {
+        pendingComponentWillMountWarnings.push(fiber);
+      }
 
-    if (family === undefined) {
-      return type;
-    } // Use the latest known implementation.
+      if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') {
+        pendingUNSAFE_ComponentWillMountWarnings.push(fiber);
+      }
 
+      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
+        pendingComponentWillReceivePropsWarnings.push(fiber);
+      }
 
-    return family.current;
-  }
-}
-function resolveClassForHotReloading(type) {
-  // No implementation differences.
-  return resolveFunctionForHotReloading(type);
-}
-function resolveForwardRefForHotReloading(type) {
-  {
-    if (resolveFamily === null) {
-      // Hot reloading is disabled.
-      return type;
-    }
+      if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
+        pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);
+      }
 
-    var family = resolveFamily(type);
+      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
+        pendingComponentWillUpdateWarnings.push(fiber);
+      }
 
-    if (family === undefined) {
-      // Check if we're dealing with a real forwardRef. Don't want to crash early.
-      if (type !== null && type !== undefined && typeof type.render === 'function') {
-        // ForwardRef is special because its resolved .type is an object,
-        // but it's possible that we only have its inner render function in the map.
-        // If that inner render function is different, we'll build a new forwardRef type.
-        var currentRender = resolveFunctionForHotReloading(type.render);
+      if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {
+        pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);
+      }
+    };
 
-        if (type.render !== currentRender) {
-          var syntheticType = {
-            $$typeof: REACT_FORWARD_REF_TYPE,
-            render: currentRender
-          };
+    ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
+      // We do an initial pass to gather component names
+      var componentWillMountUniqueNames = new Set();
 
-          if (type.displayName !== undefined) {
-            syntheticType.displayName = type.displayName;
-          }
+      if (pendingComponentWillMountWarnings.length > 0) {
+        pendingComponentWillMountWarnings.forEach(function (fiber) {
+          componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');
+          didWarnAboutUnsafeLifecycles.add(fiber.type);
+        });
+        pendingComponentWillMountWarnings = [];
+      }
 
-          return syntheticType;
-        }
+      var UNSAFE_componentWillMountUniqueNames = new Set();
+
+      if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {
+        pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {
+          UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');
+          didWarnAboutUnsafeLifecycles.add(fiber.type);
+        });
+        pendingUNSAFE_ComponentWillMountWarnings = [];
       }
 
-      return type;
-    } // Use the latest known implementation.
+      var componentWillReceivePropsUniqueNames = new Set();
 
+      if (pendingComponentWillReceivePropsWarnings.length > 0) {
+        pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {
+          componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');
+          didWarnAboutUnsafeLifecycles.add(fiber.type);
+        });
+        pendingComponentWillReceivePropsWarnings = [];
+      }
 
-    return family.current;
-  }
-}
-function isCompatibleFamilyForHotReloading(fiber, element) {
-  {
-    if (resolveFamily === null) {
-      // Hot reloading is disabled.
-      return false;
-    }
+      var UNSAFE_componentWillReceivePropsUniqueNames = new Set();
 
-    var prevType = fiber.elementType;
-    var nextType = element.type; // If we got here, we know types aren't === equal.
+      if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {
+        pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {
+          UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');
+          didWarnAboutUnsafeLifecycles.add(fiber.type);
+        });
+        pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
+      }
 
-    var needsCompareFamilies = false;
-    var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;
+      var componentWillUpdateUniqueNames = new Set();
 
-    switch (fiber.tag) {
-      case ClassComponent:
-        {
-          if (typeof nextType === 'function') {
-            needsCompareFamilies = true;
-          }
+      if (pendingComponentWillUpdateWarnings.length > 0) {
+        pendingComponentWillUpdateWarnings.forEach(function (fiber) {
+          componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');
+          didWarnAboutUnsafeLifecycles.add(fiber.type);
+        });
+        pendingComponentWillUpdateWarnings = [];
+      }
 
-          break;
-        }
+      var UNSAFE_componentWillUpdateUniqueNames = new Set();
 
-      case FunctionComponent:
-        {
-          if (typeof nextType === 'function') {
-            needsCompareFamilies = true;
-          } else if ($$typeofNextType === REACT_LAZY_TYPE) {
-            // We don't know the inner type yet.
-            // We're going to assume that the lazy inner type is stable,
-            // and so it is sufficient to avoid reconciling it away.
-            // We're not going to unwrap or actually use the new lazy type.
-            needsCompareFamilies = true;
-          }
+      if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {
+        pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {
+          UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');
+          didWarnAboutUnsafeLifecycles.add(fiber.type);
+        });
+        pendingUNSAFE_ComponentWillUpdateWarnings = [];
+      } // Finally, we flush all the warnings
+      // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'
 
-          break;
-        }
 
-      case ForwardRef:
-        {
-          if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {
-            needsCompareFamilies = true;
-          } else if ($$typeofNextType === REACT_LAZY_TYPE) {
-            needsCompareFamilies = true;
-          }
+      if (UNSAFE_componentWillMountUniqueNames.size > 0) {
+        var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);
 
-          break;
-        }
+        error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames);
+      }
 
-      case MemoComponent:
-      case SimpleMemoComponent:
-        {
-          if ($$typeofNextType === REACT_MEMO_TYPE) {
-            // TODO: if it was but can no longer be simple,
-            // we shouldn't set this.
-            needsCompareFamilies = true;
-          } else if ($$typeofNextType === REACT_LAZY_TYPE) {
-            needsCompareFamilies = true;
-          }
+      if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {
+        var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);
 
-          break;
-        }
+        error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '\nPlease update the following components: %s', _sortedNames);
+      }
 
-      default:
-        return false;
-    } // Check if both types have a family and it's the same one.
+      if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {
+        var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);
 
+        error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2);
+      }
 
-    if (needsCompareFamilies) {
-      // Note: memo() and forwardRef() we'll compare outer rather than inner type.
-      // This means both of them need to be registered to preserve state.
-      // If we unwrapped and compared the inner types for wrappers instead,
-      // then we would risk falsely saying two separate memo(Foo)
-      // calls are equivalent because they wrap the same Foo function.
-      var prevFamily = resolveFamily(prevType);
+      if (componentWillMountUniqueNames.size > 0) {
+        var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);
 
-      if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {
-        return true;
+        warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3);
       }
-    }
-
-    return false;
-  }
-}
-function markFailedErrorBoundaryForHotReloading(fiber) {
-  {
-    if (resolveFamily === null) {
-      // Hot reloading is disabled.
-      return;
-    }
 
-    if (typeof WeakSet !== 'function') {
-      return;
-    }
+      if (componentWillReceivePropsUniqueNames.size > 0) {
+        var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);
 
-    if (failedBoundaries === null) {
-      failedBoundaries = new WeakSet();
-    }
+        warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4);
+      }
 
-    failedBoundaries.add(fiber);
-  }
-}
-var scheduleRefresh = function (root, update) {
-  {
-    if (resolveFamily === null) {
-      // Hot reloading is disabled.
-      return;
-    }
+      if (componentWillUpdateUniqueNames.size > 0) {
+        var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);
 
-    var staleFamilies = update.staleFamilies,
-        updatedFamilies = update.updatedFamilies;
-    flushPassiveEffects();
-    flushSync(function () {
-      scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);
-    });
-  }
-};
-var scheduleRoot = function (root, element) {
-  {
-    if (root.context !== emptyContextObject) {
-      // Super edge case: root has a legacy _renderSubtree context
-      // but we don't know the parentComponent so we can't pass it.
-      // Just ignore. We'll delete this with _renderSubtree code path later.
-      return;
-    }
+        warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5);
+      }
+    };
 
-    flushPassiveEffects();
-    syncUpdates(function () {
-      updateContainer(element, root, null, null);
-    });
-  }
-};
+    var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.
 
-function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {
-  {
-    var alternate = fiber.alternate,
-        child = fiber.child,
-        sibling = fiber.sibling,
-        tag = fiber.tag,
-        type = fiber.type;
-    var candidateType = null;
+    var didWarnAboutLegacyContext = new Set();
 
-    switch (tag) {
-      case FunctionComponent:
-      case SimpleMemoComponent:
-      case ClassComponent:
-        candidateType = type;
-        break;
+    ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
+      var strictRoot = findStrictRoot(fiber);
 
-      case ForwardRef:
-        candidateType = type.render;
-        break;
+      if (strictRoot === null) {
+        error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');
 
-      default:
-        break;
-    }
+        return;
+      } // Dedup strategy: Warn once per component.
 
-    if (resolveFamily === null) {
-      throw new Error('Expected resolveFamily to be set during hot reload.');
-    }
 
-    var needsRender = false;
-    var needsRemount = false;
+      if (didWarnAboutLegacyContext.has(fiber.type)) {
+        return;
+      }
 
-    if (candidateType !== null) {
-      var family = resolveFamily(candidateType);
+      var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
 
-      if (family !== undefined) {
-        if (staleFamilies.has(family)) {
-          needsRemount = true;
-        } else if (updatedFamilies.has(family)) {
-          if (tag === ClassComponent) {
-            needsRemount = true;
-          } else {
-            needsRender = true;
-          }
+      if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
+        if (warningsForRoot === undefined) {
+          warningsForRoot = [];
+          pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
         }
-      }
-    }
 
-    if (failedBoundaries !== null) {
-      if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {
-        needsRemount = true;
+        warningsForRoot.push(fiber);
       }
-    }
+    };
 
-    if (needsRemount) {
-      fiber._debugNeedsRemount = true;
-    }
+    ReactStrictModeWarnings.flushLegacyContextWarning = function () {
+      pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
+        if (fiberArray.length === 0) {
+          return;
+        }
 
-    if (needsRemount || needsRender) {
-      scheduleWork(fiber, Sync);
-    }
+        var firstFiber = fiberArray[0];
+        var uniqueNames = new Set();
+        fiberArray.forEach(function (fiber) {
+          uniqueNames.add(getComponentName(fiber.type) || 'Component');
+          didWarnAboutLegacyContext.add(fiber.type);
+        });
+        var sortedNames = setToSortedString(uniqueNames);
+        var firstComponentStack = getStackByFiberInDevAndProd(firstFiber);
 
-    if (child !== null && !needsRemount) {
-      scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);
-    }
+        error('Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, firstComponentStack);
+      });
+    };
 
-    if (sibling !== null) {
-      scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);
-    }
+    ReactStrictModeWarnings.discardPendingWarnings = function () {
+      pendingComponentWillMountWarnings = [];
+      pendingUNSAFE_ComponentWillMountWarnings = [];
+      pendingComponentWillReceivePropsWarnings = [];
+      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
+      pendingComponentWillUpdateWarnings = [];
+      pendingUNSAFE_ComponentWillUpdateWarnings = [];
+      pendingLegacyContextWarning = new Map();
+    };
   }
-}
 
-var findHostInstancesForRefresh = function (root, families) {
-  {
-    var hostInstances = new Set();
-    var types = new Set(families.map(function (family) {
+  var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.
+
+  var failedBoundaries = null;
+  var setRefreshHandler = function (handler) {
+    {
+      resolveFamily = handler;
+    }
+  };
+  function resolveFunctionForHotReloading(type) {
+    {
+      if (resolveFamily === null) {
+        // Hot reloading is disabled.
+        return type;
+      }
+
+      var family = resolveFamily(type);
+
+      if (family === undefined) {
+        return type;
+      } // Use the latest known implementation.
+
+
       return family.current;
-    }));
-    findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);
-    return hostInstances;
+    }
+  }
+  function resolveClassForHotReloading(type) {
+    // No implementation differences.
+    return resolveFunctionForHotReloading(type);
   }
-};
+  function resolveForwardRefForHotReloading(type) {
+    {
+      if (resolveFamily === null) {
+        // Hot reloading is disabled.
+        return type;
+      }
 
-function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {
-  {
-    var child = fiber.child,
-        sibling = fiber.sibling,
-        tag = fiber.tag,
-        type = fiber.type;
-    var candidateType = null;
+      var family = resolveFamily(type);
 
-    switch (tag) {
-      case FunctionComponent:
-      case SimpleMemoComponent:
-      case ClassComponent:
-        candidateType = type;
-        break;
+      if (family === undefined) {
+        // Check if we're dealing with a real forwardRef. Don't want to crash early.
+        if (type !== null && type !== undefined && typeof type.render === 'function') {
+          // ForwardRef is special because its resolved .type is an object,
+          // but it's possible that we only have its inner render function in the map.
+          // If that inner render function is different, we'll build a new forwardRef type.
+          var currentRender = resolveFunctionForHotReloading(type.render);
 
-      case ForwardRef:
-        candidateType = type.render;
-        break;
+          if (type.render !== currentRender) {
+            var syntheticType = {
+              $$typeof: REACT_FORWARD_REF_TYPE,
+              render: currentRender
+            };
 
-      default:
-        break;
-    }
+            if (type.displayName !== undefined) {
+              syntheticType.displayName = type.displayName;
+            }
 
-    var didMatch = false;
+            return syntheticType;
+          }
+        }
 
-    if (candidateType !== null) {
-      if (types.has(candidateType)) {
-        didMatch = true;
-      }
-    }
+        return type;
+      } // Use the latest known implementation.
 
-    if (didMatch) {
-      // We have a match. This only drills down to the closest host components.
-      // There's no need to search deeper because for the purpose of giving
-      // visual feedback, "flashing" outermost parent rectangles is sufficient.
-      findHostInstancesForFiberShallowly(fiber, hostInstances);
-    } else {
-      // If there's no match, maybe there will be one further down in the child tree.
-      if (child !== null) {
-        findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);
-      }
-    }
 
-    if (sibling !== null) {
-      findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);
+      return family.current;
     }
   }
-}
+  function isCompatibleFamilyForHotReloading(fiber, element) {
+    {
+      if (resolveFamily === null) {
+        // Hot reloading is disabled.
+        return false;
+      }
 
-function findHostInstancesForFiberShallowly(fiber, hostInstances) {
-  {
-    var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);
+      var prevType = fiber.elementType;
+      var nextType = element.type; // If we got here, we know types aren't === equal.
 
-    if (foundHostInstances) {
-      return;
-    } // If we didn't find any host children, fallback to closest host parent.
+      var needsCompareFamilies = false;
+      var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;
 
+      switch (fiber.tag) {
+        case ClassComponent:
+          {
+            if (typeof nextType === 'function') {
+              needsCompareFamilies = true;
+            }
 
-    var node = fiber;
+            break;
+          }
 
-    while (true) {
-      switch (node.tag) {
-        case HostComponent:
-          hostInstances.add(node.stateNode);
-          return;
+        case FunctionComponent:
+          {
+            if (typeof nextType === 'function') {
+              needsCompareFamilies = true;
+            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
+              // We don't know the inner type yet.
+              // We're going to assume that the lazy inner type is stable,
+              // and so it is sufficient to avoid reconciling it away.
+              // We're not going to unwrap or actually use the new lazy type.
+              needsCompareFamilies = true;
+            }
 
-        case HostPortal:
-          hostInstances.add(node.stateNode.containerInfo);
-          return;
+            break;
+          }
 
-        case HostRoot:
-          hostInstances.add(node.stateNode.containerInfo);
-          return;
-      }
+        case ForwardRef:
+          {
+            if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {
+              needsCompareFamilies = true;
+            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
+              needsCompareFamilies = true;
+            }
 
-      if (node.return === null) {
-        throw new Error('Expected to reach root first.');
-      }
+            break;
+          }
 
-      node = node.return;
-    }
-  }
-}
+        case MemoComponent:
+        case SimpleMemoComponent:
+          {
+            if ($$typeofNextType === REACT_MEMO_TYPE) {
+              // TODO: if it was but can no longer be simple,
+              // we shouldn't set this.
+              needsCompareFamilies = true;
+            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
+              needsCompareFamilies = true;
+            }
 
-function findChildHostInstancesForFiberShallowly(fiber, hostInstances) {
-  {
-    var node = fiber;
-    var foundHostInstances = false;
+            break;
+          }
 
-    while (true) {
-      if (node.tag === HostComponent) {
-        // We got a match.
-        foundHostInstances = true;
-        hostInstances.add(node.stateNode); // There may still be more, so keep searching.
-      } else if (node.child !== null) {
-        node.child.return = node;
-        node = node.child;
-        continue;
-      }
+        default:
+          return false;
+      } // Check if both types have a family and it's the same one.
 
-      if (node === fiber) {
-        return foundHostInstances;
-      }
 
-      while (node.sibling === null) {
-        if (node.return === null || node.return === fiber) {
-          return foundHostInstances;
-        }
+      if (needsCompareFamilies) {
+        // Note: memo() and forwardRef() we'll compare outer rather than inner type.
+        // This means both of them need to be registered to preserve state.
+        // If we unwrapped and compared the inner types for wrappers instead,
+        // then we would risk falsely saying two separate memo(Foo)
+        // calls are equivalent because they wrap the same Foo function.
+        var prevFamily = resolveFamily(prevType);
 
-        node = node.return;
+        if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {
+          return true;
+        }
       }
 
-      node.sibling.return = node.return;
-      node = node.sibling;
+      return false;
     }
   }
+  function markFailedErrorBoundaryForHotReloading(fiber) {
+    {
+      if (resolveFamily === null) {
+        // Hot reloading is disabled.
+        return;
+      }
 
-  return false;
-}
+      if (typeof WeakSet !== 'function') {
+        return;
+      }
 
-function resolveDefaultProps(Component, baseProps) {
-  if (Component && Component.defaultProps) {
-    // Resolve default props. Taken from ReactElement
-    var props = _assign({}, baseProps);
+      if (failedBoundaries === null) {
+        failedBoundaries = new WeakSet();
+      }
 
-    var defaultProps = Component.defaultProps;
+      failedBoundaries.add(fiber);
+    }
+  }
+  var scheduleRefresh = function (root, update) {
+    {
+      if (resolveFamily === null) {
+        // Hot reloading is disabled.
+        return;
+      }
 
-    for (var propName in defaultProps) {
-      if (props[propName] === undefined) {
-        props[propName] = defaultProps[propName];
+      var staleFamilies = update.staleFamilies,
+          updatedFamilies = update.updatedFamilies;
+      flushPassiveEffects();
+      flushSync(function () {
+        scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);
+      });
+    }
+  };
+  var scheduleRoot = function (root, element) {
+    {
+      if (root.context !== emptyContextObject) {
+        // Super edge case: root has a legacy _renderSubtree context
+        // but we don't know the parentComponent so we can't pass it.
+        // Just ignore. We'll delete this with _renderSubtree code path later.
+        return;
       }
+
+      flushPassiveEffects();
+      syncUpdates(function () {
+        updateContainer(element, root, null, null);
+      });
     }
+  };
 
-    return props;
-  }
+  function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {
+    {
+      var alternate = fiber.alternate,
+          child = fiber.child,
+          sibling = fiber.sibling,
+          tag = fiber.tag,
+          type = fiber.type;
+      var candidateType = null;
+
+      switch (tag) {
+        case FunctionComponent:
+        case SimpleMemoComponent:
+        case ClassComponent:
+          candidateType = type;
+          break;
 
-  return baseProps;
-}
-function readLazyComponentType(lazyComponent) {
-  initializeLazyComponentType(lazyComponent);
+        case ForwardRef:
+          candidateType = type.render;
+          break;
+      }
 
-  if (lazyComponent._status !== Resolved) {
-    throw lazyComponent._result;
-  }
+      if (resolveFamily === null) {
+        throw new Error('Expected resolveFamily to be set during hot reload.');
+      }
 
-  return lazyComponent._result;
-}
+      var needsRender = false;
+      var needsRemount = false;
 
-var valueCursor = createCursor(null);
-var rendererSigil;
+      if (candidateType !== null) {
+        var family = resolveFamily(candidateType);
 
-{
-  // Use this to detect multiple renderers using the same context
-  rendererSigil = {};
-}
+        if (family !== undefined) {
+          if (staleFamilies.has(family)) {
+            needsRemount = true;
+          } else if (updatedFamilies.has(family)) {
+            if (tag === ClassComponent) {
+              needsRemount = true;
+            } else {
+              needsRender = true;
+            }
+          }
+        }
+      }
 
-var currentlyRenderingFiber = null;
-var lastContextDependency = null;
-var lastContextWithAllBitsObserved = null;
-var isDisallowedContextReadInDEV = false;
-function resetContextDependencies() {
-  // This is called right before React yields execution, to ensure `readContext`
-  // cannot be called outside the render phase.
-  currentlyRenderingFiber = null;
-  lastContextDependency = null;
-  lastContextWithAllBitsObserved = null;
+      if (failedBoundaries !== null) {
+        if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {
+          needsRemount = true;
+        }
+      }
 
-  {
-    isDisallowedContextReadInDEV = false;
-  }
-}
-function enterDisallowedContextReadInDEV() {
-  {
-    isDisallowedContextReadInDEV = true;
-  }
-}
-function exitDisallowedContextReadInDEV() {
-  {
-    isDisallowedContextReadInDEV = false;
-  }
-}
-function pushProvider(providerFiber, nextValue) {
-  var context = providerFiber.type._context;
+      if (needsRemount) {
+        fiber._debugNeedsRemount = true;
+      }
 
-  if (isPrimaryRenderer) {
-    push(valueCursor, context._currentValue, providerFiber);
-    context._currentValue = nextValue;
+      if (needsRemount || needsRender) {
+        scheduleWork(fiber, Sync);
+      }
 
-    {
-      !(context._currentRenderer === undefined || context._currentRenderer === null || context._currentRenderer === rendererSigil) ? warningWithoutStack$1(false, 'Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.') : void 0;
-      context._currentRenderer = rendererSigil;
-    }
-  } else {
-    push(valueCursor, context._currentValue2, providerFiber);
-    context._currentValue2 = nextValue;
+      if (child !== null && !needsRemount) {
+        scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);
+      }
 
-    {
-      !(context._currentRenderer2 === undefined || context._currentRenderer2 === null || context._currentRenderer2 === rendererSigil) ? warningWithoutStack$1(false, 'Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.') : void 0;
-      context._currentRenderer2 = rendererSigil;
+      if (sibling !== null) {
+        scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);
+      }
     }
   }
-}
-function popProvider(providerFiber) {
-  var currentValue = valueCursor.current;
-  pop(valueCursor, providerFiber);
-  var context = providerFiber.type._context;
-
-  if (isPrimaryRenderer) {
-    context._currentValue = currentValue;
-  } else {
-    context._currentValue2 = currentValue;
-  }
-}
-function calculateChangedBits(context, newValue, oldValue) {
-  if (is$1(oldValue, newValue)) {
-    // No change
-    return 0;
-  } else {
-    var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;
 
+  var findHostInstancesForRefresh = function (root, families) {
     {
-      !((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits) ? warning$1(false, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits) : void 0;
+      var hostInstances = new Set();
+      var types = new Set(families.map(function (family) {
+        return family.current;
+      }));
+      findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);
+      return hostInstances;
     }
+  };
 
-    return changedBits | 0;
-  }
-}
-function scheduleWorkOnParentPath(parent, renderExpirationTime) {
-  // Update the child expiration time of all the ancestors, including
-  // the alternates.
-  var node = parent;
-
-  while (node !== null) {
-    var alternate = node.alternate;
+  function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {
+    {
+      var child = fiber.child,
+          sibling = fiber.sibling,
+          tag = fiber.tag,
+          type = fiber.type;
+      var candidateType = null;
 
-    if (node.childExpirationTime < renderExpirationTime) {
-      node.childExpirationTime = renderExpirationTime;
+      switch (tag) {
+        case FunctionComponent:
+        case SimpleMemoComponent:
+        case ClassComponent:
+          candidateType = type;
+          break;
 
-      if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
-        alternate.childExpirationTime = renderExpirationTime;
+        case ForwardRef:
+          candidateType = type.render;
+          break;
       }
-    } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
-      alternate.childExpirationTime = renderExpirationTime;
-    } else {
-      // Neither alternate was updated, which means the rest of the
-      // ancestor path already has sufficient priority.
-      break;
-    }
 
-    node = node.return;
-  }
-}
-function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {
-  var fiber = workInProgress.child;
+      var didMatch = false;
 
-  if (fiber !== null) {
-    // Set the return pointer of the child to the work-in-progress fiber.
-    fiber.return = workInProgress;
-  }
-
-  while (fiber !== null) {
-    var nextFiber = void 0; // Visit this fiber.
-
-    var list = fiber.dependencies;
+      if (candidateType !== null) {
+        if (types.has(candidateType)) {
+          didMatch = true;
+        }
+      }
 
-    if (list !== null) {
-      nextFiber = fiber.child;
-      var dependency = list.firstContext;
+      if (didMatch) {
+        // We have a match. This only drills down to the closest host components.
+        // There's no need to search deeper because for the purpose of giving
+        // visual feedback, "flashing" outermost parent rectangles is sufficient.
+        findHostInstancesForFiberShallowly(fiber, hostInstances);
+      } else {
+        // If there's no match, maybe there will be one further down in the child tree.
+        if (child !== null) {
+          findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);
+        }
+      }
 
-      while (dependency !== null) {
-        // Check if the context matches.
-        if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {
-          // Match! Schedule an update on this fiber.
-          if (fiber.tag === ClassComponent) {
-            // Schedule a force update on the work-in-progress.
-            var update = createUpdate(renderExpirationTime, null);
-            update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the
-            // update to the current fiber, too, which means it will persist even if
-            // this render is thrown away. Since it's a race condition, not sure it's
-            // worth fixing.
+      if (sibling !== null) {
+        findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);
+      }
+    }
+  }
 
-            enqueueUpdate(fiber, update);
-          }
+  function findHostInstancesForFiberShallowly(fiber, hostInstances) {
+    {
+      var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);
 
-          if (fiber.expirationTime < renderExpirationTime) {
-            fiber.expirationTime = renderExpirationTime;
-          }
+      if (foundHostInstances) {
+        return;
+      } // If we didn't find any host children, fallback to closest host parent.
 
-          var alternate = fiber.alternate;
 
-          if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
-            alternate.expirationTime = renderExpirationTime;
-          }
+      var node = fiber;
 
-          scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too.
+      while (true) {
+        switch (node.tag) {
+          case HostComponent:
+            hostInstances.add(node.stateNode);
+            return;
 
-          if (list.expirationTime < renderExpirationTime) {
-            list.expirationTime = renderExpirationTime;
-          } // Since we already found a match, we can stop traversing the
-          // dependency list.
+          case HostPortal:
+            hostInstances.add(node.stateNode.containerInfo);
+            return;
 
+          case HostRoot:
+            hostInstances.add(node.stateNode.containerInfo);
+            return;
+        }
 
-          break;
+        if (node.return === null) {
+          throw new Error('Expected to reach root first.');
         }
 
-        dependency = dependency.next;
+        node = node.return;
       }
-    } else if (fiber.tag === ContextProvider) {
-      // Don't scan deeper if this is a matching provider
-      nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
-    } else if (enableSuspenseServerRenderer && fiber.tag === DehydratedFragment) {
-      // If a dehydrated suspense bounudary is in this subtree, we don't know
-      // if it will have any context consumers in it. The best we can do is
-      // mark it as having updates.
-      var parentSuspense = fiber.return;
+    }
+  }
 
-      if (!(parentSuspense !== null)) {
-        {
-          throw Error("We just came from a parent so we must have had a parent. This is a bug in React.");
+  function findChildHostInstancesForFiberShallowly(fiber, hostInstances) {
+    {
+      var node = fiber;
+      var foundHostInstances = false;
+
+      while (true) {
+        if (node.tag === HostComponent) {
+          // We got a match.
+          foundHostInstances = true;
+          hostInstances.add(node.stateNode); // There may still be more, so keep searching.
+        } else if (node.child !== null) {
+          node.child.return = node;
+          node = node.child;
+          continue;
         }
-      }
 
-      if (parentSuspense.expirationTime < renderExpirationTime) {
-        parentSuspense.expirationTime = renderExpirationTime;
-      }
-
-      var _alternate = parentSuspense.alternate;
+        if (node === fiber) {
+          return foundHostInstances;
+        }
 
-      if (_alternate !== null && _alternate.expirationTime < renderExpirationTime) {
-        _alternate.expirationTime = renderExpirationTime;
-      } // This is intentionally passing this fiber as the parent
-      // because we want to schedule this fiber as having work
-      // on its children. We'll use the childExpirationTime on
-      // this fiber to indicate that a context has changed.
+        while (node.sibling === null) {
+          if (node.return === null || node.return === fiber) {
+            return foundHostInstances;
+          }
 
+          node = node.return;
+        }
 
-      scheduleWorkOnParentPath(parentSuspense, renderExpirationTime);
-      nextFiber = fiber.sibling;
-    } else {
-      // Traverse down.
-      nextFiber = fiber.child;
+        node.sibling.return = node.return;
+        node = node.sibling;
+      }
     }
 
-    if (nextFiber !== null) {
-      // Set the return pointer of the child to the work-in-progress fiber.
-      nextFiber.return = fiber;
-    } else {
-      // No child. Traverse to next sibling.
-      nextFiber = fiber;
-
-      while (nextFiber !== null) {
-        if (nextFiber === workInProgress) {
-          // We're back to the root of this subtree. Exit.
-          nextFiber = null;
-          break;
-        }
-
-        var sibling = nextFiber.sibling;
+    return false;
+  }
 
-        if (sibling !== null) {
-          // Set the return pointer of the sibling to the work-in-progress fiber.
-          sibling.return = nextFiber.return;
-          nextFiber = sibling;
-          break;
-        } // No more siblings. Traverse up.
+  function resolveDefaultProps(Component, baseProps) {
+    if (Component && Component.defaultProps) {
+      // Resolve default props. Taken from ReactElement
+      var props = _assign({}, baseProps);
 
+      var defaultProps = Component.defaultProps;
 
-        nextFiber = nextFiber.return;
+      for (var propName in defaultProps) {
+        if (props[propName] === undefined) {
+          props[propName] = defaultProps[propName];
+        }
       }
+
+      return props;
     }
 
-    fiber = nextFiber;
+    return baseProps;
   }
-}
-function prepareToReadContext(workInProgress, renderExpirationTime) {
-  currentlyRenderingFiber = workInProgress;
-  lastContextDependency = null;
-  lastContextWithAllBitsObserved = null;
-  var dependencies = workInProgress.dependencies;
+  function readLazyComponentType(lazyComponent) {
+    initializeLazyComponentType(lazyComponent);
 
-  if (dependencies !== null) {
-    var firstContext = dependencies.firstContext;
+    if (lazyComponent._status !== Resolved) {
+      throw lazyComponent._result;
+    }
 
-    if (firstContext !== null) {
-      if (dependencies.expirationTime >= renderExpirationTime) {
-        // Context list has a pending update. Mark that this fiber performed work.
-        markWorkInProgressReceivedUpdate();
-      } // Reset the work-in-progress list
+    return lazyComponent._result;
+  }
 
+  var valueCursor = createCursor(null);
+  var rendererSigil;
 
-      dependencies.firstContext = null;
-    }
-  }
-}
-function readContext(context, observedBits) {
   {
-    // This warning would fire if you read context inside a Hook like useMemo.
-    // Unlike the class check below, it's not enforced in production for perf.
-    !!isDisallowedContextReadInDEV ? warning$1(false, 'Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().') : void 0;
+    // Use this to detect multiple renderers using the same context
+    rendererSigil = {};
   }
 
-  if (lastContextWithAllBitsObserved === context) {// Nothing to do. We already observe everything in this context.
-  } else if (observedBits === false || observedBits === 0) {// Do not observe any updates.
-  } else {
-    var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types.
+  var currentlyRenderingFiber = null;
+  var lastContextDependency = null;
+  var lastContextWithAllBitsObserved = null;
+  var isDisallowedContextReadInDEV = false;
+  function resetContextDependencies() {
+    // This is called right before React yields execution, to ensure `readContext`
+    // cannot be called outside the render phase.
+    currentlyRenderingFiber = null;
+    lastContextDependency = null;
+    lastContextWithAllBitsObserved = null;
 
-    if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) {
-      // Observe all updates.
-      lastContextWithAllBitsObserved = context;
-      resolvedObservedBits = MAX_SIGNED_31_BIT_INT;
-    } else {
-      resolvedObservedBits = observedBits;
+    {
+      isDisallowedContextReadInDEV = false;
+    }
+  }
+  function enterDisallowedContextReadInDEV() {
+    {
+      isDisallowedContextReadInDEV = true;
+    }
+  }
+  function exitDisallowedContextReadInDEV() {
+    {
+      isDisallowedContextReadInDEV = false;
     }
+  }
+  function pushProvider(providerFiber, nextValue) {
+    var context = providerFiber.type._context;
 
-    var contextItem = {
-      context: context,
-      observedBits: resolvedObservedBits,
-      next: null
-    };
+    {
+      push(valueCursor, context._currentValue, providerFiber);
+      context._currentValue = nextValue;
 
-    if (lastContextDependency === null) {
-      if (!(currentlyRenderingFiber !== null)) {
-        {
-          throw Error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");
+      {
+        if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {
+          error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
         }
-      } // This is the first dependency for this component. Create a new list.
-
-
-      lastContextDependency = contextItem;
-      currentlyRenderingFiber.dependencies = {
-        expirationTime: NoWork,
-        firstContext: contextItem,
-        responders: null
-      };
-    } else {
-      // Append a new context item.
-      lastContextDependency = lastContextDependency.next = contextItem;
-    }
-  }
-
-  return isPrimaryRenderer ? context._currentValue : context._currentValue2;
-}
-
-// UpdateQueue is a linked list of prioritized updates.
-//
-// Like fibers, update queues come in pairs: a current queue, which represents
-// the visible state of the screen, and a work-in-progress queue, which can be
-// mutated and processed asynchronously before it is committed — a form of
-// double buffering. If a work-in-progress render is discarded before finishing,
-// we create a new work-in-progress by cloning the current queue.
-//
-// Both queues share a persistent, singly-linked list structure. To schedule an
-// update, we append it to the end of both queues. Each queue maintains a
-// pointer to first update in the persistent list that hasn't been processed.
-// The work-in-progress pointer always has a position equal to or greater than
-// the current queue, since we always work on that one. The current queue's
-// pointer is only updated during the commit phase, when we swap in the
-// work-in-progress.
-//
-// For example:
-//
-//   Current pointer:           A - B - C - D - E - F
-//   Work-in-progress pointer:              D - E - F
-//                                          ^
-//                                          The work-in-progress queue has
-//                                          processed more updates than current.
-//
-// The reason we append to both queues is because otherwise we might drop
-// updates without ever processing them. For example, if we only add updates to
-// the work-in-progress queue, some updates could be lost whenever a work-in
-// -progress render restarts by cloning from current. Similarly, if we only add
-// updates to the current queue, the updates will be lost whenever an already
-// in-progress queue commits and swaps with the current queue. However, by
-// adding to both queues, we guarantee that the update will be part of the next
-// work-in-progress. (And because the work-in-progress queue becomes the
-// current queue once it commits, there's no danger of applying the same
-// update twice.)
-//
-// Prioritization
-// --------------
-//
-// Updates are not sorted by priority, but by insertion; new updates are always
-// appended to the end of the list.
-//
-// The priority is still important, though. When processing the update queue
-// during the render phase, only the updates with sufficient priority are
-// included in the result. If we skip an update because it has insufficient
-// priority, it remains in the queue to be processed later, during a lower
-// priority render. Crucially, all updates subsequent to a skipped update also
-// remain in the queue *regardless of their priority*. That means high priority
-// updates are sometimes processed twice, at two separate priorities. We also
-// keep track of a base state, that represents the state before the first
-// update in the queue is applied.
-//
-// For example:
-//
-//   Given a base state of '', and the following queue of updates
-//
-//     A1 - B2 - C1 - D2
-//
-//   where the number indicates the priority, and the update is applied to the
-//   previous state by appending a letter, React will process these updates as
-//   two separate renders, one per distinct priority level:
-//
-//   First render, at priority 1:
-//     Base state: ''
-//     Updates: [A1, C1]
-//     Result state: 'AC'
-//
-//   Second render, at priority 2:
-//     Base state: 'A'            <-  The base state does not include C1,
-//                                    because B2 was skipped.
-//     Updates: [B2, C1, D2]      <-  C1 was rebased on top of B2
-//     Result state: 'ABCD'
-//
-// Because we process updates in insertion order, and rebase high priority
-// updates when preceding updates are skipped, the final result is deterministic
-// regardless of priority. Intermediate state may vary according to system
-// resources, but the final state is always the same.
-var UpdateState = 0;
-var ReplaceState = 1;
-var ForceUpdate = 2;
-var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.
-// It should only be read right after calling `processUpdateQueue`, via
-// `checkHasForceUpdateAfterProcessing`.
-
-var hasForceUpdate = false;
-var didWarnUpdateInsideUpdate;
-var currentlyProcessingQueue;
-
-
-{
-  didWarnUpdateInsideUpdate = false;
-  currentlyProcessingQueue = null;
-
-  
-}
-
-function createUpdateQueue(baseState) {
-  var queue = {
-    baseState: baseState,
-    firstUpdate: null,
-    lastUpdate: null,
-    firstCapturedUpdate: null,
-    lastCapturedUpdate: null,
-    firstEffect: null,
-    lastEffect: null,
-    firstCapturedEffect: null,
-    lastCapturedEffect: null
-  };
-  return queue;
-}
-
-function cloneUpdateQueue(currentQueue) {
-  var queue = {
-    baseState: currentQueue.baseState,
-    firstUpdate: currentQueue.firstUpdate,
-    lastUpdate: currentQueue.lastUpdate,
-    // TODO: With resuming, if we bail out and resuse the child tree, we should
-    // keep these effects.
-    firstCapturedUpdate: null,
-    lastCapturedUpdate: null,
-    firstEffect: null,
-    lastEffect: null,
-    firstCapturedEffect: null,
-    lastCapturedEffect: null
-  };
-  return queue;
-}
-
-function createUpdate(expirationTime, suspenseConfig) {
-  var update = {
-    expirationTime: expirationTime,
-    suspenseConfig: suspenseConfig,
-    tag: UpdateState,
-    payload: null,
-    callback: null,
-    next: null,
-    nextEffect: null
-  };
 
-  {
-    update.priority = getCurrentPriorityLevel();
-  }
-
-  return update;
-}
-
-function appendUpdateToQueue(queue, update) {
-  // Append the update to the end of the list.
-  if (queue.lastUpdate === null) {
-    // Queue is empty
-    queue.firstUpdate = queue.lastUpdate = update;
-  } else {
-    queue.lastUpdate.next = update;
-    queue.lastUpdate = update;
-  }
-}
-
-function enqueueUpdate(fiber, update) {
-  // Update queues are created lazily.
-  var alternate = fiber.alternate;
-  var queue1;
-  var queue2;
-
-  if (alternate === null) {
-    // There's only one fiber.
-    queue1 = fiber.updateQueue;
-    queue2 = null;
-
-    if (queue1 === null) {
-      queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
-    }
-  } else {
-    // There are two owners.
-    queue1 = fiber.updateQueue;
-    queue2 = alternate.updateQueue;
-
-    if (queue1 === null) {
-      if (queue2 === null) {
-        // Neither fiber has an update queue. Create new ones.
-        queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState);
-        queue2 = alternate.updateQueue = createUpdateQueue(alternate.memoizedState);
-      } else {
-        // Only one fiber has an update queue. Clone to create a new one.
-        queue1 = fiber.updateQueue = cloneUpdateQueue(queue2);
-      }
-    } else {
-      if (queue2 === null) {
-        // Only one fiber has an update queue. Clone to create a new one.
-        queue2 = alternate.updateQueue = cloneUpdateQueue(queue1);
-      } else {// Both owners have an update queue.
+        context._currentRenderer = rendererSigil;
       }
     }
   }
+  function popProvider(providerFiber) {
+    var currentValue = valueCursor.current;
+    pop(valueCursor, providerFiber);
+    var context = providerFiber.type._context;
 
-  if (queue2 === null || queue1 === queue2) {
-    // There's only a single queue.
-    appendUpdateToQueue(queue1, update);
-  } else {
-    // There are two queues. We need to append the update to both queues,
-    // while accounting for the persistent structure of the list — we don't
-    // want the same update to be added multiple times.
-    if (queue1.lastUpdate === null || queue2.lastUpdate === null) {
-      // One of the queues is not empty. We must add the update to both queues.
-      appendUpdateToQueue(queue1, update);
-      appendUpdateToQueue(queue2, update);
-    } else {
-      // Both queues are non-empty. The last update is the same in both lists,
-      // because of structural sharing. So, only append to one of the lists.
-      appendUpdateToQueue(queue1, update); // But we still need to update the `lastUpdate` pointer of queue2.
-
-      queue2.lastUpdate = update;
+    {
+      context._currentValue = currentValue;
     }
   }
+  function calculateChangedBits(context, newValue, oldValue) {
+    if (objectIs(oldValue, newValue)) {
+      // No change
+      return 0;
+    } else {
+      var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;
 
-  {
-    if (fiber.tag === ClassComponent && (currentlyProcessingQueue === queue1 || queue2 !== null && currentlyProcessingQueue === queue2) && !didWarnUpdateInsideUpdate) {
-      warningWithoutStack$1(false, 'An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');
-      didWarnUpdateInsideUpdate = true;
+      {
+        if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) {
+          error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits);
+        }
+      }
+
+      return changedBits | 0;
     }
   }
-}
-function enqueueCapturedUpdate(workInProgress, update) {
-  // Captured updates go into a separate list, and only on the work-in-
-  // progress queue.
-  var workInProgressQueue = workInProgress.updateQueue;
-
-  if (workInProgressQueue === null) {
-    workInProgressQueue = workInProgress.updateQueue = createUpdateQueue(workInProgress.memoizedState);
-  } else {
-    // TODO: I put this here rather than createWorkInProgress so that we don't
-    // clone the queue unnecessarily. There's probably a better way to
-    // structure this.
-    workInProgressQueue = ensureWorkInProgressQueueIsAClone(workInProgress, workInProgressQueue);
-  } // Append the update to the end of the list.
+  function scheduleWorkOnParentPath(parent, renderExpirationTime) {
+    // Update the child expiration time of all the ancestors, including
+    // the alternates.
+    var node = parent;
 
+    while (node !== null) {
+      var alternate = node.alternate;
 
-  if (workInProgressQueue.lastCapturedUpdate === null) {
-    // This is the first render phase update
-    workInProgressQueue.firstCapturedUpdate = workInProgressQueue.lastCapturedUpdate = update;
-  } else {
-    workInProgressQueue.lastCapturedUpdate.next = update;
-    workInProgressQueue.lastCapturedUpdate = update;
-  }
-}
+      if (node.childExpirationTime < renderExpirationTime) {
+        node.childExpirationTime = renderExpirationTime;
 
-function ensureWorkInProgressQueueIsAClone(workInProgress, queue) {
-  var current = workInProgress.alternate;
+        if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
+          alternate.childExpirationTime = renderExpirationTime;
+        }
+      } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {
+        alternate.childExpirationTime = renderExpirationTime;
+      } else {
+        // Neither alternate was updated, which means the rest of the
+        // ancestor path already has sufficient priority.
+        break;
+      }
 
-  if (current !== null) {
-    // If the work-in-progress queue is equal to the current queue,
-    // we need to clone it first.
-    if (queue === current.updateQueue) {
-      queue = workInProgress.updateQueue = cloneUpdateQueue(queue);
+      node = node.return;
     }
   }
+  function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {
+    var fiber = workInProgress.child;
 
-  return queue;
-}
-
-function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
-  switch (update.tag) {
-    case ReplaceState:
-      {
-        var payload = update.payload;
+    if (fiber !== null) {
+      // Set the return pointer of the child to the work-in-progress fiber.
+      fiber.return = workInProgress;
+    }
 
-        if (typeof payload === 'function') {
-          // Updater function
-          {
-            enterDisallowedContextReadInDEV();
+    while (fiber !== null) {
+      var nextFiber = void 0; // Visit this fiber.
+
+      var list = fiber.dependencies;
+
+      if (list !== null) {
+        nextFiber = fiber.child;
+        var dependency = list.firstContext;
+
+        while (dependency !== null) {
+          // Check if the context matches.
+          if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {
+            // Match! Schedule an update on this fiber.
+            if (fiber.tag === ClassComponent) {
+              // Schedule a force update on the work-in-progress.
+              var update = createUpdate(renderExpirationTime, null);
+              update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the
+              // update to the current fiber, too, which means it will persist even if
+              // this render is thrown away. Since it's a race condition, not sure it's
+              // worth fixing.
+
+              enqueueUpdate(fiber, update);
+            }
 
-            if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-              payload.call(instance, prevState, nextProps);
+            if (fiber.expirationTime < renderExpirationTime) {
+              fiber.expirationTime = renderExpirationTime;
             }
-          }
 
-          var nextState = payload.call(instance, prevState, nextProps);
+            var alternate = fiber.alternate;
 
-          {
-            exitDisallowedContextReadInDEV();
-          }
+            if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
+              alternate.expirationTime = renderExpirationTime;
+            }
 
-          return nextState;
-        } // State object
+            scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too.
 
+            if (list.expirationTime < renderExpirationTime) {
+              list.expirationTime = renderExpirationTime;
+            } // Since we already found a match, we can stop traversing the
+            // dependency list.
 
-        return payload;
-      }
 
-    case CaptureUpdate:
-      {
-        workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;
-      }
-    // Intentional fallthrough
+            break;
+          }
 
-    case UpdateState:
-      {
-        var _payload = update.payload;
-        var partialState;
+          dependency = dependency.next;
+        }
+      } else if (fiber.tag === ContextProvider) {
+        // Don't scan deeper if this is a matching provider
+        nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
+      } else {
+        // Traverse down.
+        nextFiber = fiber.child;
+      }
 
-        if (typeof _payload === 'function') {
-          // Updater function
-          {
-            enterDisallowedContextReadInDEV();
+      if (nextFiber !== null) {
+        // Set the return pointer of the child to the work-in-progress fiber.
+        nextFiber.return = fiber;
+      } else {
+        // No child. Traverse to next sibling.
+        nextFiber = fiber;
 
-            if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-              _payload.call(instance, prevState, nextProps);
-            }
+        while (nextFiber !== null) {
+          if (nextFiber === workInProgress) {
+            // We're back to the root of this subtree. Exit.
+            nextFiber = null;
+            break;
           }
 
-          partialState = _payload.call(instance, prevState, nextProps);
-
-          {
-            exitDisallowedContextReadInDEV();
-          }
-        } else {
-          // Partial state object
-          partialState = _payload;
-        }
+          var sibling = nextFiber.sibling;
 
-        if (partialState === null || partialState === undefined) {
-          // Null and undefined are treated as no-ops.
-          return prevState;
-        } // Merge the partial state and the previous state.
+          if (sibling !== null) {
+            // Set the return pointer of the sibling to the work-in-progress fiber.
+            sibling.return = nextFiber.return;
+            nextFiber = sibling;
+            break;
+          } // No more siblings. Traverse up.
 
 
-        return _assign({}, prevState, partialState);
+          nextFiber = nextFiber.return;
+        }
       }
 
-    case ForceUpdate:
-      {
-        hasForceUpdate = true;
-        return prevState;
-      }
+      fiber = nextFiber;
+    }
   }
+  function prepareToReadContext(workInProgress, renderExpirationTime) {
+    currentlyRenderingFiber = workInProgress;
+    lastContextDependency = null;
+    lastContextWithAllBitsObserved = null;
+    var dependencies = workInProgress.dependencies;
 
-  return prevState;
-}
-
-function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) {
-  hasForceUpdate = false;
-  queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue);
-
-  {
-    currentlyProcessingQueue = queue;
-  } // These values may change as we process the queue.
-
-
-  var newBaseState = queue.baseState;
-  var newFirstUpdate = null;
-  var newExpirationTime = NoWork; // Iterate through the list of updates to compute the result.
-
-  var update = queue.firstUpdate;
-  var resultState = newBaseState;
+    if (dependencies !== null) {
+      var firstContext = dependencies.firstContext;
 
-  while (update !== null) {
-    var updateExpirationTime = update.expirationTime;
+      if (firstContext !== null) {
+        if (dependencies.expirationTime >= renderExpirationTime) {
+          // Context list has a pending update. Mark that this fiber performed work.
+          markWorkInProgressReceivedUpdate();
+        } // Reset the work-in-progress list
 
-    if (updateExpirationTime < renderExpirationTime) {
-      // This update does not have sufficient priority. Skip it.
-      if (newFirstUpdate === null) {
-        // This is the first skipped update. It will be the first update in
-        // the new list.
-        newFirstUpdate = update; // Since this is the first update that was skipped, the current result
-        // is the new base state.
 
-        newBaseState = resultState;
-      } // Since this update will remain in the list, update the remaining
-      // expiration time.
+        dependencies.firstContext = null;
+      }
+    }
+  }
+  function readContext(context, observedBits) {
+    {
+      // This warning would fire if you read context inside a Hook like useMemo.
+      // Unlike the class check below, it's not enforced in production for perf.
+      if (isDisallowedContextReadInDEV) {
+        error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
+      }
+    }
 
+    if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else {
+      var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types.
 
-      if (newExpirationTime < updateExpirationTime) {
-        newExpirationTime = updateExpirationTime;
+      if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) {
+        // Observe all updates.
+        lastContextWithAllBitsObserved = context;
+        resolvedObservedBits = MAX_SIGNED_31_BIT_INT;
+      } else {
+        resolvedObservedBits = observedBits;
       }
-    } else {
-      // This update does have sufficient priority.
-      // Mark the event time of this update as relevant to this render pass.
-      // TODO: This should ideally use the true event time of this update rather than
-      // its priority which is a derived and not reverseable value.
-      // TODO: We should skip this update if it was already committed but currently
-      // we have no way of detecting the difference between a committed and suspended
-      // update here.
-      markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process it and compute a new result.
 
-      resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
-      var callback = update.callback;
+      var contextItem = {
+        context: context,
+        observedBits: resolvedObservedBits,
+        next: null
+      };
 
-      if (callback !== null) {
-        workInProgress.effectTag |= Callback; // Set this to null, in case it was mutated during an aborted render.
+      if (lastContextDependency === null) {
+        if (!(currentlyRenderingFiber !== null)) {
+          {
+            throw Error( "Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()." );
+          }
+        } // This is the first dependency for this component. Create a new list.
 
-        update.nextEffect = null;
 
-        if (queue.lastEffect === null) {
-          queue.firstEffect = queue.lastEffect = update;
-        } else {
-          queue.lastEffect.nextEffect = update;
-          queue.lastEffect = update;
-        }
+        lastContextDependency = contextItem;
+        currentlyRenderingFiber.dependencies = {
+          expirationTime: NoWork,
+          firstContext: contextItem,
+          responders: null
+        };
+      } else {
+        // Append a new context item.
+        lastContextDependency = lastContextDependency.next = contextItem;
       }
-    } // Continue to the next update.
+    }
 
+    return  context._currentValue ;
+  }
+
+  var UpdateState = 0;
+  var ReplaceState = 1;
+  var ForceUpdate = 2;
+  var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.
+  // It should only be read right after calling `processUpdateQueue`, via
+  // `checkHasForceUpdateAfterProcessing`.
 
-    update = update.next;
-  } // Separately, iterate though the list of captured updates.
+  var hasForceUpdate = false;
+  var didWarnUpdateInsideUpdate;
+  var currentlyProcessingQueue;
 
+  {
+    didWarnUpdateInsideUpdate = false;
+    currentlyProcessingQueue = null;
+  }
 
-  var newFirstCapturedUpdate = null;
-  update = queue.firstCapturedUpdate;
+  function initializeUpdateQueue(fiber) {
+    var queue = {
+      baseState: fiber.memoizedState,
+      baseQueue: null,
+      shared: {
+        pending: null
+      },
+      effects: null
+    };
+    fiber.updateQueue = queue;
+  }
+  function cloneUpdateQueue(current, workInProgress) {
+    // Clone the update queue from current. Unless it's already a clone.
+    var queue = workInProgress.updateQueue;
+    var currentQueue = current.updateQueue;
+
+    if (queue === currentQueue) {
+      var clone = {
+        baseState: currentQueue.baseState,
+        baseQueue: currentQueue.baseQueue,
+        shared: currentQueue.shared,
+        effects: currentQueue.effects
+      };
+      workInProgress.updateQueue = clone;
+    }
+  }
+  function createUpdate(expirationTime, suspenseConfig) {
+    var update = {
+      expirationTime: expirationTime,
+      suspenseConfig: suspenseConfig,
+      tag: UpdateState,
+      payload: null,
+      callback: null,
+      next: null
+    };
+    update.next = update;
 
-  while (update !== null) {
-    var _updateExpirationTime = update.expirationTime;
+    {
+      update.priority = getCurrentPriorityLevel();
+    }
 
-    if (_updateExpirationTime < renderExpirationTime) {
-      // This update does not have sufficient priority. Skip it.
-      if (newFirstCapturedUpdate === null) {
-        // This is the first skipped captured update. It will be the first
-        // update in the new list.
-        newFirstCapturedUpdate = update; // If this is the first update that was skipped, the current result is
-        // the new base state.
+    return update;
+  }
+  function enqueueUpdate(fiber, update) {
+    var updateQueue = fiber.updateQueue;
 
-        if (newFirstUpdate === null) {
-          newBaseState = resultState;
-        }
-      } // Since this update will remain in the list, update the remaining
-      // expiration time.
+    if (updateQueue === null) {
+      // Only occurs if the fiber has been unmounted.
+      return;
+    }
 
+    var sharedQueue = updateQueue.shared;
+    var pending = sharedQueue.pending;
 
-      if (newExpirationTime < _updateExpirationTime) {
-        newExpirationTime = _updateExpirationTime;
-      }
+    if (pending === null) {
+      // This is the first update. Create a circular list.
+      update.next = update;
     } else {
-      // This update does have sufficient priority. Process it and compute
-      // a new result.
-      resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);
-      var _callback = update.callback;
+      update.next = pending.next;
+      pending.next = update;
+    }
 
-      if (_callback !== null) {
-        workInProgress.effectTag |= Callback; // Set this to null, in case it was mutated during an aborted render.
+    sharedQueue.pending = update;
 
-        update.nextEffect = null;
+    {
+      if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {
+        error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');
 
-        if (queue.lastCapturedEffect === null) {
-          queue.firstCapturedEffect = queue.lastCapturedEffect = update;
-        } else {
-          queue.lastCapturedEffect.nextEffect = update;
-          queue.lastCapturedEffect = update;
-        }
+        didWarnUpdateInsideUpdate = true;
       }
     }
-
-    update = update.next;
   }
+  function enqueueCapturedUpdate(workInProgress, update) {
+    var current = workInProgress.alternate;
 
-  if (newFirstUpdate === null) {
-    queue.lastUpdate = null;
-  }
+    if (current !== null) {
+      // Ensure the work-in-progress queue is a clone
+      cloneUpdateQueue(current, workInProgress);
+    } // Captured updates go only on the work-in-progress queue.
 
-  if (newFirstCapturedUpdate === null) {
-    queue.lastCapturedUpdate = null;
-  } else {
-    workInProgress.effectTag |= Callback;
-  }
 
-  if (newFirstUpdate === null && newFirstCapturedUpdate === null) {
-    // We processed every update, without skipping. That means the new base
-    // state is the same as the result state.
-    newBaseState = resultState;
+    var queue = workInProgress.updateQueue; // Append the update to the end of the list.
+
+    var last = queue.baseQueue;
+
+    if (last === null) {
+      queue.baseQueue = update.next = update;
+      update.next = update;
+    } else {
+      update.next = last.next;
+      last.next = update;
+    }
   }
 
-  queue.baseState = newBaseState;
-  queue.firstUpdate = newFirstUpdate;
-  queue.firstCapturedUpdate = newFirstCapturedUpdate; // Set the remaining expiration time to be whatever is remaining in the queue.
-  // This should be fine because the only two other things that contribute to
-  // expiration time are props and context. We're already in the middle of the
-  // begin phase by the time we start processing the queue, so we've already
-  // dealt with the props. Context in components that specify
-  // shouldComponentUpdate is tricky; but we'll have to account for
-  // that regardless.
+  function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
+    switch (update.tag) {
+      case ReplaceState:
+        {
+          var payload = update.payload;
 
-  markUnprocessedUpdateTime(newExpirationTime);
-  workInProgress.expirationTime = newExpirationTime;
-  workInProgress.memoizedState = resultState;
+          if (typeof payload === 'function') {
+            // Updater function
+            {
+              enterDisallowedContextReadInDEV();
 
-  {
-    currentlyProcessingQueue = null;
-  }
-}
+              if ( workInProgress.mode & StrictMode) {
+                payload.call(instance, prevState, nextProps);
+              }
+            }
 
-function callCallback(callback, context) {
-  if (!(typeof callback === 'function')) {
-    {
-      throw Error("Invalid argument passed as callback. Expected a function. Instead received: " + callback);
-    }
-  }
+            var nextState = payload.call(instance, prevState, nextProps);
 
-  callback.call(context);
-}
+            {
+              exitDisallowedContextReadInDEV();
+            }
 
-function resetHasForceUpdateBeforeProcessing() {
-  hasForceUpdate = false;
-}
-function checkHasForceUpdateAfterProcessing() {
-  return hasForceUpdate;
-}
-function commitUpdateQueue(finishedWork, finishedQueue, instance, renderExpirationTime) {
-  // If the finished render included captured updates, and there are still
-  // lower priority updates left over, we need to keep the captured updates
-  // in the queue so that they are rebased and not dropped once we process the
-  // queue again at the lower priority.
-  if (finishedQueue.firstCapturedUpdate !== null) {
-    // Join the captured update list to the end of the normal list.
-    if (finishedQueue.lastUpdate !== null) {
-      finishedQueue.lastUpdate.next = finishedQueue.firstCapturedUpdate;
-      finishedQueue.lastUpdate = finishedQueue.lastCapturedUpdate;
-    } // Clear the list of captured updates.
+            return nextState;
+          } // State object
 
 
-    finishedQueue.firstCapturedUpdate = finishedQueue.lastCapturedUpdate = null;
-  } // Commit the effects
+          return payload;
+        }
 
+      case CaptureUpdate:
+        {
+          workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;
+        }
+      // Intentional fallthrough
 
-  commitUpdateEffects(finishedQueue.firstEffect, instance);
-  finishedQueue.firstEffect = finishedQueue.lastEffect = null;
-  commitUpdateEffects(finishedQueue.firstCapturedEffect, instance);
-  finishedQueue.firstCapturedEffect = finishedQueue.lastCapturedEffect = null;
-}
+      case UpdateState:
+        {
+          var _payload = update.payload;
+          var partialState;
 
-function commitUpdateEffects(effect, instance) {
-  while (effect !== null) {
-    var callback = effect.callback;
+          if (typeof _payload === 'function') {
+            // Updater function
+            {
+              enterDisallowedContextReadInDEV();
 
-    if (callback !== null) {
-      effect.callback = null;
-      callCallback(callback, instance);
-    }
-
-    effect = effect.nextEffect;
-  }
-}
-
-var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig;
-function requestCurrentSuspenseConfig() {
-  return ReactCurrentBatchConfig.suspense;
-}
-
-var fakeInternalInstance = {};
-var isArray$1 = Array.isArray; // React.Component uses a shared frozen object by default.
-// We'll use it to determine whether we need to initialize legacy refs.
-
-var emptyRefsObject = new React.Component().refs;
-var didWarnAboutStateAssignmentForComponent;
-var didWarnAboutUninitializedState;
-var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
-var didWarnAboutLegacyLifecyclesAndDerivedState;
-var didWarnAboutUndefinedDerivedState;
-var warnOnUndefinedDerivedState;
-var warnOnInvalidCallback$1;
-var didWarnAboutDirectlyAssigningPropsToState;
-var didWarnAboutContextTypeAndContextTypes;
-var didWarnAboutInvalidateContextType;
-
-{
-  didWarnAboutStateAssignmentForComponent = new Set();
-  didWarnAboutUninitializedState = new Set();
-  didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
-  didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
-  didWarnAboutDirectlyAssigningPropsToState = new Set();
-  didWarnAboutUndefinedDerivedState = new Set();
-  didWarnAboutContextTypeAndContextTypes = new Set();
-  didWarnAboutInvalidateContextType = new Set();
-  var didWarnOnInvalidCallback = new Set();
-
-  warnOnInvalidCallback$1 = function (callback, callerName) {
-    if (callback === null || typeof callback === 'function') {
-      return;
-    }
+              if ( workInProgress.mode & StrictMode) {
+                _payload.call(instance, prevState, nextProps);
+              }
+            }
 
-    var key = callerName + "_" + callback;
+            partialState = _payload.call(instance, prevState, nextProps);
 
-    if (!didWarnOnInvalidCallback.has(key)) {
-      didWarnOnInvalidCallback.add(key);
-      warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
-    }
-  };
+            {
+              exitDisallowedContextReadInDEV();
+            }
+          } else {
+            // Partial state object
+            partialState = _payload;
+          }
 
-  warnOnUndefinedDerivedState = function (type, partialState) {
-    if (partialState === undefined) {
-      var componentName = getComponentName(type) || 'Component';
+          if (partialState === null || partialState === undefined) {
+            // Null and undefined are treated as no-ops.
+            return prevState;
+          } // Merge the partial state and the previous state.
 
-      if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
-        didWarnAboutUndefinedDerivedState.add(componentName);
-        warningWithoutStack$1(false, '%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
-      }
-    }
-  }; // This is so gross but it's at least non-critical and can be removed if
-  // it causes problems. This is meant to give a nicer error message for
-  // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
-  // ...)) which otherwise throws a "_processChildContext is not a function"
-  // exception.
 
+          return _assign({}, prevState, partialState);
+        }
 
-  Object.defineProperty(fakeInternalInstance, '_processChildContext', {
-    enumerable: false,
-    value: function () {
-      {
+      case ForceUpdate:
         {
-          throw Error("_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).");
+          hasForceUpdate = true;
+          return prevState;
         }
-      }
     }
-  });
-  Object.freeze(fakeInternalInstance);
-}
 
-function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
-  var prevState = workInProgress.memoizedState;
-
-  {
-    if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-      // Invoke the function an extra time to help detect side-effects.
-      getDerivedStateFromProps(nextProps, prevState);
-    }
+    return prevState;
   }
 
-  var partialState = getDerivedStateFromProps(nextProps, prevState);
-
-  {
-    warnOnUndefinedDerivedState(ctor, partialState);
-  } // Merge the partial state and the previous state.
+  function processUpdateQueue(workInProgress, props, instance, renderExpirationTime) {
+    // This is always non-null on a ClassComponent or HostRoot
+    var queue = workInProgress.updateQueue;
+    hasForceUpdate = false;
 
+    {
+      currentlyProcessingQueue = queue.shared;
+    } // The last rebase update that is NOT part of the base state.
 
-  var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);
-  workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the
-  // base state.
 
-  var updateQueue = workInProgress.updateQueue;
+    var baseQueue = queue.baseQueue; // The last pending update that hasn't been processed yet.
 
-  if (updateQueue !== null && workInProgress.expirationTime === NoWork) {
-    updateQueue.baseState = memoizedState;
-  }
-}
-var classComponentUpdater = {
-  isMounted: isMounted,
-  enqueueSetState: function (inst, payload, callback) {
-    var fiber = get(inst);
-    var currentTime = requestCurrentTimeForUpdate();
-    var suspenseConfig = requestCurrentSuspenseConfig();
-    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
-    var update = createUpdate(expirationTime, suspenseConfig);
-    update.payload = payload;
+    var pendingQueue = queue.shared.pending;
 
-    if (callback !== undefined && callback !== null) {
-      {
-        warnOnInvalidCallback$1(callback, 'setState');
+    if (pendingQueue !== null) {
+      // We have new updates that haven't been processed yet.
+      // We'll add them to the base queue.
+      if (baseQueue !== null) {
+        // Merge the pending queue and the base queue.
+        var baseFirst = baseQueue.next;
+        var pendingFirst = pendingQueue.next;
+        baseQueue.next = pendingFirst;
+        pendingQueue.next = baseFirst;
       }
 
-      update.callback = callback;
-    }
+      baseQueue = pendingQueue;
+      queue.shared.pending = null; // TODO: Pass `current` as argument
 
-    enqueueUpdate(fiber, update);
-    scheduleWork(fiber, expirationTime);
-  },
-  enqueueReplaceState: function (inst, payload, callback) {
-    var fiber = get(inst);
-    var currentTime = requestCurrentTimeForUpdate();
-    var suspenseConfig = requestCurrentSuspenseConfig();
-    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
-    var update = createUpdate(expirationTime, suspenseConfig);
-    update.tag = ReplaceState;
-    update.payload = payload;
+      var current = workInProgress.alternate;
 
-    if (callback !== undefined && callback !== null) {
-      {
-        warnOnInvalidCallback$1(callback, 'replaceState');
+      if (current !== null) {
+        var currentQueue = current.updateQueue;
+
+        if (currentQueue !== null) {
+          currentQueue.baseQueue = pendingQueue;
+        }
       }
+    } // These values may change as we process the queue.
 
-      update.callback = callback;
-    }
 
-    enqueueUpdate(fiber, update);
-    scheduleWork(fiber, expirationTime);
-  },
-  enqueueForceUpdate: function (inst, callback) {
-    var fiber = get(inst);
-    var currentTime = requestCurrentTimeForUpdate();
-    var suspenseConfig = requestCurrentSuspenseConfig();
-    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
-    var update = createUpdate(expirationTime, suspenseConfig);
-    update.tag = ForceUpdate;
+    if (baseQueue !== null) {
+      var first = baseQueue.next; // Iterate through the list of updates to compute the result.
 
-    if (callback !== undefined && callback !== null) {
-      {
-        warnOnInvalidCallback$1(callback, 'forceUpdate');
-      }
-
-      update.callback = callback;
-    }
-
-    enqueueUpdate(fiber, update);
-    scheduleWork(fiber, expirationTime);
-  }
-};
-
-function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
-  var instance = workInProgress.stateNode;
-
-  if (typeof instance.shouldComponentUpdate === 'function') {
-    startPhaseTimer(workInProgress, 'shouldComponentUpdate');
-    var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
-    stopPhaseTimer();
-
-    {
-      !(shouldUpdate !== undefined) ? warningWithoutStack$1(false, '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component') : void 0;
-    }
+      var newState = queue.baseState;
+      var newExpirationTime = NoWork;
+      var newBaseState = null;
+      var newBaseQueueFirst = null;
+      var newBaseQueueLast = null;
 
-    return shouldUpdate;
-  }
-
-  if (ctor.prototype && ctor.prototype.isPureReactComponent) {
-    return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
-  }
+      if (first !== null) {
+        var update = first;
 
-  return true;
-}
+        do {
+          var updateExpirationTime = update.expirationTime;
+
+          if (updateExpirationTime < renderExpirationTime) {
+            // Priority is insufficient. Skip this update. If this is the first
+            // skipped update, the previous update/state is the new base
+            // update/state.
+            var clone = {
+              expirationTime: update.expirationTime,
+              suspenseConfig: update.suspenseConfig,
+              tag: update.tag,
+              payload: update.payload,
+              callback: update.callback,
+              next: null
+            };
 
-function checkClassInstance(workInProgress, ctor, newProps) {
-  var instance = workInProgress.stateNode;
+            if (newBaseQueueLast === null) {
+              newBaseQueueFirst = newBaseQueueLast = clone;
+              newBaseState = newState;
+            } else {
+              newBaseQueueLast = newBaseQueueLast.next = clone;
+            } // Update the remaining priority in the queue.
 
-  {
-    var name = getComponentName(ctor) || 'Component';
-    var renderPresent = instance.render;
 
-    if (!renderPresent) {
-      if (ctor.prototype && typeof ctor.prototype.render === 'function') {
-        warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
-      } else {
-        warningWithoutStack$1(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
-      }
-    }
+            if (updateExpirationTime > newExpirationTime) {
+              newExpirationTime = updateExpirationTime;
+            }
+          } else {
+            // This update does have sufficient priority.
+            if (newBaseQueueLast !== null) {
+              var _clone = {
+                expirationTime: Sync,
+                // This update is going to be committed so we never want uncommit it.
+                suspenseConfig: update.suspenseConfig,
+                tag: update.tag,
+                payload: update.payload,
+                callback: update.callback,
+                next: null
+              };
+              newBaseQueueLast = newBaseQueueLast.next = _clone;
+            } // Mark the event time of this update as relevant to this render pass.
+            // TODO: This should ideally use the true event time of this update rather than
+            // its priority which is a derived and not reverseable value.
+            // TODO: We should skip this update if it was already committed but currently
+            // we have no way of detecting the difference between a committed and suspended
+            // update here.
+
+
+            markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.
+
+            newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);
+            var callback = update.callback;
+
+            if (callback !== null) {
+              workInProgress.effectTag |= Callback;
+              var effects = queue.effects;
+
+              if (effects === null) {
+                queue.effects = [update];
+              } else {
+                effects.push(update);
+              }
+            }
+          }
 
-    var noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state;
-    !noGetInitialStateOnES6 ? warningWithoutStack$1(false, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name) : void 0;
-    var noGetDefaultPropsOnES6 = !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved;
-    !noGetDefaultPropsOnES6 ? warningWithoutStack$1(false, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name) : void 0;
-    var noInstancePropTypes = !instance.propTypes;
-    !noInstancePropTypes ? warningWithoutStack$1(false, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name) : void 0;
-    var noInstanceContextType = !instance.contextType;
-    !noInstanceContextType ? warningWithoutStack$1(false, 'contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name) : void 0;
+          update = update.next;
 
-    if (disableLegacyContext) {
-      if (ctor.childContextTypes) {
-        warningWithoutStack$1(false, '%s uses the legacy childContextTypes API which is no longer supported. ' + 'Use React.createContext() instead.', name);
-      }
+          if (update === null || update === first) {
+            pendingQueue = queue.shared.pending;
 
-      if (ctor.contextTypes) {
-        warningWithoutStack$1(false, '%s uses the legacy contextTypes API which is no longer supported. ' + 'Use React.createContext() with static contextType instead.', name);
+            if (pendingQueue === null) {
+              break;
+            } else {
+              // An update was scheduled from inside a reducer. Add the new
+              // pending updates to the end of the list and keep processing.
+              update = baseQueue.next = pendingQueue.next;
+              pendingQueue.next = first;
+              queue.baseQueue = baseQueue = pendingQueue;
+              queue.shared.pending = null;
+            }
+          }
+        } while (true);
       }
-    } else {
-      var noInstanceContextTypes = !instance.contextTypes;
-      !noInstanceContextTypes ? warningWithoutStack$1(false, 'contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name) : void 0;
 
-      if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
-        didWarnAboutContextTypeAndContextTypes.add(ctor);
-        warningWithoutStack$1(false, '%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
+      if (newBaseQueueLast === null) {
+        newBaseState = newState;
+      } else {
+        newBaseQueueLast.next = newBaseQueueFirst;
       }
-    }
 
-    var noComponentShouldUpdate = typeof instance.componentShouldUpdate !== 'function';
-    !noComponentShouldUpdate ? warningWithoutStack$1(false, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name) : void 0;
+      queue.baseState = newBaseState;
+      queue.baseQueue = newBaseQueueLast; // Set the remaining expiration time to be whatever is remaining in the queue.
+      // This should be fine because the only two other things that contribute to
+      // expiration time are props and context. We're already in the middle of the
+      // begin phase by the time we start processing the queue, so we've already
+      // dealt with the props. Context in components that specify
+      // shouldComponentUpdate is tricky; but we'll have to account for
+      // that regardless.
 
-    if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
-      warningWithoutStack$1(false, '%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component');
+      markUnprocessedUpdateTime(newExpirationTime);
+      workInProgress.expirationTime = newExpirationTime;
+      workInProgress.memoizedState = newState;
     }
 
-    var noComponentDidUnmount = typeof instance.componentDidUnmount !== 'function';
-    !noComponentDidUnmount ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name) : void 0;
-    var noComponentDidReceiveProps = typeof instance.componentDidReceiveProps !== 'function';
-    !noComponentDidReceiveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name) : void 0;
-    var noComponentWillRecieveProps = typeof instance.componentWillRecieveProps !== 'function';
-    !noComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name) : void 0;
-    var noUnsafeComponentWillRecieveProps = typeof instance.UNSAFE_componentWillRecieveProps !== 'function';
-    !noUnsafeComponentWillRecieveProps ? warningWithoutStack$1(false, '%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name) : void 0;
-    var hasMutatedProps = instance.props !== newProps;
-    !(instance.props === undefined || !hasMutatedProps) ? warningWithoutStack$1(false, '%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name) : void 0;
-    var noInstanceDefaultProps = !instance.defaultProps;
-    !noInstanceDefaultProps ? warningWithoutStack$1(false, 'Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name) : void 0;
-
-    if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
-      didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
-      warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));
+    {
+      currentlyProcessingQueue = null;
     }
+  }
 
-    var noInstanceGetDerivedStateFromProps = typeof instance.getDerivedStateFromProps !== 'function';
-    !noInstanceGetDerivedStateFromProps ? warningWithoutStack$1(false, '%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name) : void 0;
-    var noInstanceGetDerivedStateFromCatch = typeof instance.getDerivedStateFromError !== 'function';
-    !noInstanceGetDerivedStateFromCatch ? warningWithoutStack$1(false, '%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name) : void 0;
-    var noStaticGetSnapshotBeforeUpdate = typeof ctor.getSnapshotBeforeUpdate !== 'function';
-    !noStaticGetSnapshotBeforeUpdate ? warningWithoutStack$1(false, '%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name) : void 0;
-    var _state = instance.state;
-
-    if (_state && (typeof _state !== 'object' || isArray$1(_state))) {
-      warningWithoutStack$1(false, '%s.state: must be set to an object or null', name);
+  function callCallback(callback, context) {
+    if (!(typeof callback === 'function')) {
+      {
+        throw Error( "Invalid argument passed as callback. Expected a function. Instead received: " + callback );
+      }
     }
 
-    if (typeof instance.getChildContext === 'function') {
-      !(typeof ctor.childContextTypes === 'object') ? warningWithoutStack$1(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name) : void 0;
-    }
+    callback.call(context);
   }
-}
-
-function adoptClassInstance(workInProgress, instance) {
-  instance.updater = classComponentUpdater;
-  workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates
-
-  set(instance, workInProgress);
 
-  {
-    instance._reactInternalInstance = fakeInternalInstance;
+  function resetHasForceUpdateBeforeProcessing() {
+    hasForceUpdate = false;
+  }
+  function checkHasForceUpdateAfterProcessing() {
+    return hasForceUpdate;
   }
-}
+  function commitUpdateQueue(finishedWork, finishedQueue, instance) {
+    // Commit the effects
+    var effects = finishedQueue.effects;
+    finishedQueue.effects = null;
 
-function constructClassInstance(workInProgress, ctor, props, renderExpirationTime) {
-  var isLegacyContextConsumer = false;
-  var unmaskedContext = emptyContextObject;
-  var context = emptyContextObject;
-  var contextType = ctor.contextType;
+    if (effects !== null) {
+      for (var i = 0; i < effects.length; i++) {
+        var effect = effects[i];
+        var callback = effect.callback;
 
-  {
-    if ('contextType' in ctor) {
-      var isValid = // Allow null for conditional declaration
-      contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
-
-      if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
-        didWarnAboutInvalidateContextType.add(ctor);
-        var addendum = '';
-
-        if (contextType === undefined) {
-          addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';
-        } else if (typeof contextType !== 'object') {
-          addendum = ' However, it is set to a ' + typeof contextType + '.';
-        } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
-          addendum = ' Did you accidentally pass the Context.Provider instead?';
-        } else if (contextType._context !== undefined) {
-          // <Context.Consumer>
-          addendum = ' Did you accidentally pass the Context.Consumer instead?';
-        } else {
-          addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
+        if (callback !== null) {
+          effect.callback = null;
+          callCallback(callback, instance);
         }
-
-        warningWithoutStack$1(false, '%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum);
       }
     }
   }
 
-  if (typeof contextType === 'object' && contextType !== null) {
-    context = readContext(contextType);
-  } else if (!disableLegacyContext) {
-    unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
-    var contextTypes = ctor.contextTypes;
-    isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
-    context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
-  } // Instantiate twice to help detect side-effects.
-
-
-  {
-    if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-      new ctor(props, context); // eslint-disable-line no-new
-    }
+  var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig;
+  function requestCurrentSuspenseConfig() {
+    return ReactCurrentBatchConfig.suspense;
   }
 
-  var instance = new ctor(props, context);
-  var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
-  adoptClassInstance(workInProgress, instance);
+  var fakeInternalInstance = {};
+  var isArray = Array.isArray; // React.Component uses a shared frozen object by default.
+  // We'll use it to determine whether we need to initialize legacy refs.
 
-  {
-    if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
-      var componentName = getComponentName(ctor) || 'Component';
+  var emptyRefsObject = new React.Component().refs;
+  var didWarnAboutStateAssignmentForComponent;
+  var didWarnAboutUninitializedState;
+  var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
+  var didWarnAboutLegacyLifecyclesAndDerivedState;
+  var didWarnAboutUndefinedDerivedState;
+  var warnOnUndefinedDerivedState;
+  var warnOnInvalidCallback;
+  var didWarnAboutDirectlyAssigningPropsToState;
+  var didWarnAboutContextTypeAndContextTypes;
+  var didWarnAboutInvalidateContextType;
 
-      if (!didWarnAboutUninitializedState.has(componentName)) {
-        didWarnAboutUninitializedState.add(componentName);
-        warningWithoutStack$1(false, '`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);
+  {
+    didWarnAboutStateAssignmentForComponent = new Set();
+    didWarnAboutUninitializedState = new Set();
+    didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
+    didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
+    didWarnAboutDirectlyAssigningPropsToState = new Set();
+    didWarnAboutUndefinedDerivedState = new Set();
+    didWarnAboutContextTypeAndContextTypes = new Set();
+    didWarnAboutInvalidateContextType = new Set();
+    var didWarnOnInvalidCallback = new Set();
+
+    warnOnInvalidCallback = function (callback, callerName) {
+      if (callback === null || typeof callback === 'function') {
+        return;
       }
-    } // If new component APIs are defined, "unsafe" lifecycles won't be called.
-    // Warn about these lifecycles if they are present.
-    // Don't warn about react-lifecycles-compat polyfilled methods though.
 
+      var key = callerName + "_" + callback;
 
-    if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
-      var foundWillMountName = null;
-      var foundWillReceivePropsName = null;
-      var foundWillUpdateName = null;
-
-      if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
-        foundWillMountName = 'componentWillMount';
-      } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
-        foundWillMountName = 'UNSAFE_componentWillMount';
-      }
-
-      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
-        foundWillReceivePropsName = 'componentWillReceiveProps';
-      } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
-        foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
-      }
+      if (!didWarnOnInvalidCallback.has(key)) {
+        didWarnOnInvalidCallback.add(key);
 
-      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
-        foundWillUpdateName = 'componentWillUpdate';
-      } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
-        foundWillUpdateName = 'UNSAFE_componentWillUpdate';
+        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
       }
+    };
 
-      if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
-        var _componentName = getComponentName(ctor) || 'Component';
+    warnOnUndefinedDerivedState = function (type, partialState) {
+      if (partialState === undefined) {
+        var componentName = getComponentName(type) || 'Component';
 
-        var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
+        if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
+          didWarnAboutUndefinedDerivedState.add(componentName);
 
-        if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
-          didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
-          warningWithoutStack$1(false, 'Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n  " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n  " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n  " + foundWillUpdateName : '');
+          error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
         }
       }
-    }
-  } // Cache unmasked context so we can avoid recreating masked context unless necessary.
-  // ReactFiberContext usually updates this cache but can't for newly-created instances.
+    }; // This is so gross but it's at least non-critical and can be removed if
+    // it causes problems. This is meant to give a nicer error message for
+    // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
+    // ...)) which otherwise throws a "_processChildContext is not a function"
+    // exception.
 
 
-  if (isLegacyContextConsumer) {
-    cacheContext(workInProgress, unmaskedContext, context);
+    Object.defineProperty(fakeInternalInstance, '_processChildContext', {
+      enumerable: false,
+      value: function () {
+        {
+          {
+            throw Error( "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal)." );
+          }
+        }
+      }
+    });
+    Object.freeze(fakeInternalInstance);
   }
 
-  return instance;
-}
-
-function callComponentWillMount(workInProgress, instance) {
-  startPhaseTimer(workInProgress, 'componentWillMount');
-  var oldState = instance.state;
-
-  if (typeof instance.componentWillMount === 'function') {
-    instance.componentWillMount();
-  }
+  function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
+    var prevState = workInProgress.memoizedState;
 
-  if (typeof instance.UNSAFE_componentWillMount === 'function') {
-    instance.UNSAFE_componentWillMount();
-  }
+    {
+      if ( workInProgress.mode & StrictMode) {
+        // Invoke the function an extra time to help detect side-effects.
+        getDerivedStateFromProps(nextProps, prevState);
+      }
+    }
 
-  stopPhaseTimer();
+    var partialState = getDerivedStateFromProps(nextProps, prevState);
 
-  if (oldState !== instance.state) {
     {
-      warningWithoutStack$1(false, '%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component');
-    }
+      warnOnUndefinedDerivedState(ctor, partialState);
+    } // Merge the partial state and the previous state.
 
-    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
-  }
-}
 
-function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
-  var oldState = instance.state;
-  startPhaseTimer(workInProgress, 'componentWillReceiveProps');
+    var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);
+    workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the
+    // base state.
 
-  if (typeof instance.componentWillReceiveProps === 'function') {
-    instance.componentWillReceiveProps(newProps, nextContext);
+    if (workInProgress.expirationTime === NoWork) {
+      // Queue is always non-null for classes
+      var updateQueue = workInProgress.updateQueue;
+      updateQueue.baseState = memoizedState;
+    }
   }
+  var classComponentUpdater = {
+    isMounted: isMounted,
+    enqueueSetState: function (inst, payload, callback) {
+      var fiber = get(inst);
+      var currentTime = requestCurrentTimeForUpdate();
+      var suspenseConfig = requestCurrentSuspenseConfig();
+      var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
+      var update = createUpdate(expirationTime, suspenseConfig);
+      update.payload = payload;
 
-  if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
-    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
-  }
+      if (callback !== undefined && callback !== null) {
+        {
+          warnOnInvalidCallback(callback, 'setState');
+        }
 
-  stopPhaseTimer();
+        update.callback = callback;
+      }
 
-  if (instance.state !== oldState) {
-    {
-      var componentName = getComponentName(workInProgress.type) || 'Component';
+      enqueueUpdate(fiber, update);
+      scheduleWork(fiber, expirationTime);
+    },
+    enqueueReplaceState: function (inst, payload, callback) {
+      var fiber = get(inst);
+      var currentTime = requestCurrentTimeForUpdate();
+      var suspenseConfig = requestCurrentSuspenseConfig();
+      var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
+      var update = createUpdate(expirationTime, suspenseConfig);
+      update.tag = ReplaceState;
+      update.payload = payload;
+
+      if (callback !== undefined && callback !== null) {
+        {
+          warnOnInvalidCallback(callback, 'replaceState');
+        }
 
-      if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
-        didWarnAboutStateAssignmentForComponent.add(componentName);
-        warningWithoutStack$1(false, '%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
+        update.callback = callback;
       }
-    }
 
-    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
-  }
-} // Invokes the mount life-cycles on a previously never rendered instance.
+      enqueueUpdate(fiber, update);
+      scheduleWork(fiber, expirationTime);
+    },
+    enqueueForceUpdate: function (inst, callback) {
+      var fiber = get(inst);
+      var currentTime = requestCurrentTimeForUpdate();
+      var suspenseConfig = requestCurrentSuspenseConfig();
+      var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
+      var update = createUpdate(expirationTime, suspenseConfig);
+      update.tag = ForceUpdate;
+
+      if (callback !== undefined && callback !== null) {
+        {
+          warnOnInvalidCallback(callback, 'forceUpdate');
+        }
 
+        update.callback = callback;
+      }
 
-function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
-  {
-    checkClassInstance(workInProgress, ctor, newProps);
-  }
+      enqueueUpdate(fiber, update);
+      scheduleWork(fiber, expirationTime);
+    }
+  };
 
-  var instance = workInProgress.stateNode;
-  instance.props = newProps;
-  instance.state = workInProgress.memoizedState;
-  instance.refs = emptyRefsObject;
-  var contextType = ctor.contextType;
+  function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
+    var instance = workInProgress.stateNode;
 
-  if (typeof contextType === 'object' && contextType !== null) {
-    instance.context = readContext(contextType);
-  } else if (disableLegacyContext) {
-    instance.context = emptyContextObject;
-  } else {
-    var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
-    instance.context = getMaskedContext(workInProgress, unmaskedContext);
-  }
+    if (typeof instance.shouldComponentUpdate === 'function') {
+      {
+        if ( workInProgress.mode & StrictMode) {
+          // Invoke the function an extra time to help detect side-effects.
+          instance.shouldComponentUpdate(newProps, newState, nextContext);
+        }
+      }
 
-  {
-    if (instance.state === newProps) {
-      var componentName = getComponentName(ctor) || 'Component';
+      startPhaseTimer(workInProgress, 'shouldComponentUpdate');
+      var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
+      stopPhaseTimer();
 
-      if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
-        didWarnAboutDirectlyAssigningPropsToState.add(componentName);
-        warningWithoutStack$1(false, '%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName);
+      {
+        if (shouldUpdate === undefined) {
+          error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component');
+        }
       }
-    }
 
-    if (workInProgress.mode & StrictMode) {
-      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
+      return shouldUpdate;
     }
 
-    if (warnAboutDeprecatedLifecycles) {
-      ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
+    if (ctor.prototype && ctor.prototype.isPureReactComponent) {
+      return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
     }
-  }
-
-  var updateQueue = workInProgress.updateQueue;
 
-  if (updateQueue !== null) {
-    processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
-    instance.state = workInProgress.memoizedState;
+    return true;
   }
 
-  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
-
-  if (typeof getDerivedStateFromProps === 'function') {
-    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
-    instance.state = workInProgress.memoizedState;
-  } // In order to support react-lifecycles-compat polyfilled components,
-  // Unsafe lifecycles should not be invoked for components using the new APIs.
+  function checkClassInstance(workInProgress, ctor, newProps) {
+    var instance = workInProgress.stateNode;
 
+    {
+      var name = getComponentName(ctor) || 'Component';
+      var renderPresent = instance.render;
 
-  if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
-    callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's
-    // process them now.
+      if (!renderPresent) {
+        if (ctor.prototype && typeof ctor.prototype.render === 'function') {
+          error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
+        } else {
+          error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
+        }
+      }
 
-    updateQueue = workInProgress.updateQueue;
+      if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {
+        error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);
+      }
 
-    if (updateQueue !== null) {
-      processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
-      instance.state = workInProgress.memoizedState;
-    }
-  }
+      if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {
+        error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);
+      }
 
-  if (typeof instance.componentDidMount === 'function') {
-    workInProgress.effectTag |= Update;
-  }
-}
+      if (instance.propTypes) {
+        error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);
+      }
 
-function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
-  var instance = workInProgress.stateNode;
-  var oldProps = workInProgress.memoizedProps;
-  instance.props = oldProps;
-  var oldContext = instance.context;
-  var contextType = ctor.contextType;
-  var nextContext = emptyContextObject;
+      if (instance.contextType) {
+        error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);
+      }
 
-  if (typeof contextType === 'object' && contextType !== null) {
-    nextContext = readContext(contextType);
-  } else if (!disableLegacyContext) {
-    var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
-    nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
-  }
+      {
+        if (instance.contextTypes) {
+          error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);
+        }
 
-  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
-  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
-  // ever the previously attempted to render - not the "current". However,
-  // during componentDidUpdate we pass the "current" props.
-  // In order to support react-lifecycles-compat polyfilled components,
-  // Unsafe lifecycles should not be invoked for components using the new APIs.
+        if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
+          didWarnAboutContextTypeAndContextTypes.add(ctor);
 
-  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
-    if (oldProps !== newProps || oldContext !== nextContext) {
-      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
-    }
-  }
+          error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
+        }
+      }
 
-  resetHasForceUpdateBeforeProcessing();
-  var oldState = workInProgress.memoizedState;
-  var newState = instance.state = oldState;
-  var updateQueue = workInProgress.updateQueue;
+      if (typeof instance.componentShouldUpdate === 'function') {
+        error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);
+      }
 
-  if (updateQueue !== null) {
-    processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
-    newState = workInProgress.memoizedState;
-  }
+      if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
+        error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component');
+      }
 
-  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
-    // If an update was already in progress, we should schedule an Update
-    // effect even though we're bailing out, so that cWU/cDU are called.
-    if (typeof instance.componentDidMount === 'function') {
-      workInProgress.effectTag |= Update;
-    }
+      if (typeof instance.componentDidUnmount === 'function') {
+        error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);
+      }
 
-    return false;
-  }
+      if (typeof instance.componentDidReceiveProps === 'function') {
+        error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);
+      }
 
-  if (typeof getDerivedStateFromProps === 'function') {
-    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
-    newState = workInProgress.memoizedState;
-  }
+      if (typeof instance.componentWillRecieveProps === 'function') {
+        error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);
+      }
 
-  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
+      if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {
+        error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);
+      }
 
-  if (shouldUpdate) {
-    // In order to support react-lifecycles-compat polyfilled components,
-    // Unsafe lifecycles should not be invoked for components using the new APIs.
-    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
-      startPhaseTimer(workInProgress, 'componentWillMount');
+      var hasMutatedProps = instance.props !== newProps;
 
-      if (typeof instance.componentWillMount === 'function') {
-        instance.componentWillMount();
+      if (instance.props !== undefined && hasMutatedProps) {
+        error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name);
       }
 
-      if (typeof instance.UNSAFE_componentWillMount === 'function') {
-        instance.UNSAFE_componentWillMount();
+      if (instance.defaultProps) {
+        error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);
       }
 
-      stopPhaseTimer();
-    }
-
-    if (typeof instance.componentDidMount === 'function') {
-      workInProgress.effectTag |= Update;
-    }
-  } else {
-    // If an update was already in progress, we should schedule an Update
-    // effect even though we're bailing out, so that cWU/cDU are called.
-    if (typeof instance.componentDidMount === 'function') {
-      workInProgress.effectTag |= Update;
-    } // If shouldComponentUpdate returned false, we should still update the
-    // memoized state to indicate that this work can be reused.
+      if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
+        didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
 
+        error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));
+      }
 
-    workInProgress.memoizedProps = newProps;
-    workInProgress.memoizedState = newState;
-  } // Update the existing instance's state, props, and context pointers even
-  // if shouldComponentUpdate returns false.
+      if (typeof instance.getDerivedStateFromProps === 'function') {
+        error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
+      }
 
+      if (typeof instance.getDerivedStateFromError === 'function') {
+        error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
+      }
 
-  instance.props = newProps;
-  instance.state = newState;
-  instance.context = nextContext;
-  return shouldUpdate;
-} // Invokes the update life-cycles and returns false if it shouldn't rerender.
+      if (typeof ctor.getSnapshotBeforeUpdate === 'function') {
+        error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);
+      }
 
+      var _state = instance.state;
 
-function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {
-  var instance = workInProgress.stateNode;
-  var oldProps = workInProgress.memoizedProps;
-  instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);
-  var oldContext = instance.context;
-  var contextType = ctor.contextType;
-  var nextContext = emptyContextObject;
+      if (_state && (typeof _state !== 'object' || isArray(_state))) {
+        error('%s.state: must be set to an object or null', name);
+      }
 
-  if (typeof contextType === 'object' && contextType !== null) {
-    nextContext = readContext(contextType);
-  } else if (!disableLegacyContext) {
-    var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
-    nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
+      if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {
+        error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);
+      }
+    }
   }
 
-  var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
-  var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
-  // ever the previously attempted to render - not the "current". However,
-  // during componentDidUpdate we pass the "current" props.
-  // In order to support react-lifecycles-compat polyfilled components,
-  // Unsafe lifecycles should not be invoked for components using the new APIs.
+  function adoptClassInstance(workInProgress, instance) {
+    instance.updater = classComponentUpdater;
+    workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates
+
+    set(instance, workInProgress);
 
-  if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
-    if (oldProps !== newProps || oldContext !== nextContext) {
-      callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
+    {
+      instance._reactInternalInstance = fakeInternalInstance;
     }
   }
 
-  resetHasForceUpdateBeforeProcessing();
-  var oldState = workInProgress.memoizedState;
-  var newState = instance.state = oldState;
-  var updateQueue = workInProgress.updateQueue;
+  function constructClassInstance(workInProgress, ctor, props) {
+    var isLegacyContextConsumer = false;
+    var unmaskedContext = emptyContextObject;
+    var context = emptyContextObject;
+    var contextType = ctor.contextType;
 
-  if (updateQueue !== null) {
-    processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime);
-    newState = workInProgress.memoizedState;
-  }
+    {
+      if ('contextType' in ctor) {
+        var isValid = // Allow null for conditional declaration
+        contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
+
+        if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
+          didWarnAboutInvalidateContextType.add(ctor);
+          var addendum = '';
+
+          if (contextType === undefined) {
+            addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';
+          } else if (typeof contextType !== 'object') {
+            addendum = ' However, it is set to a ' + typeof contextType + '.';
+          } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
+            addendum = ' Did you accidentally pass the Context.Provider instead?';
+          } else if (contextType._context !== undefined) {
+            // <Context.Consumer>
+            addendum = ' Did you accidentally pass the Context.Consumer instead?';
+          } else {
+            addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
+          }
 
-  if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
-    // If an update was already in progress, we should schedule an Update
-    // effect even though we're bailing out, so that cWU/cDU are called.
-    if (typeof instance.componentDidUpdate === 'function') {
-      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
-        workInProgress.effectTag |= Update;
+          error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum);
+        }
       }
     }
 
-    if (typeof instance.getSnapshotBeforeUpdate === 'function') {
-      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
-        workInProgress.effectTag |= Snapshot;
+    if (typeof contextType === 'object' && contextType !== null) {
+      context = readContext(contextType);
+    } else {
+      unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
+      var contextTypes = ctor.contextTypes;
+      isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
+      context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
+    } // Instantiate twice to help detect side-effects.
+
+
+    {
+      if ( workInProgress.mode & StrictMode) {
+        new ctor(props, context); // eslint-disable-line no-new
       }
     }
 
-    return false;
-  }
-
-  if (typeof getDerivedStateFromProps === 'function') {
-    applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
-    newState = workInProgress.memoizedState;
-  }
+    var instance = new ctor(props, context);
+    var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
+    adoptClassInstance(workInProgress, instance);
 
-  var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
+    {
+      if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
+        var componentName = getComponentName(ctor) || 'Component';
 
-  if (shouldUpdate) {
-    // In order to support react-lifecycles-compat polyfilled components,
-    // Unsafe lifecycles should not be invoked for components using the new APIs.
-    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
-      startPhaseTimer(workInProgress, 'componentWillUpdate');
+        if (!didWarnAboutUninitializedState.has(componentName)) {
+          didWarnAboutUninitializedState.add(componentName);
 
-      if (typeof instance.componentWillUpdate === 'function') {
-        instance.componentWillUpdate(newProps, newState, nextContext);
-      }
+          error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);
+        }
+      } // If new component APIs are defined, "unsafe" lifecycles won't be called.
+      // Warn about these lifecycles if they are present.
+      // Don't warn about react-lifecycles-compat polyfilled methods though.
 
-      if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
-        instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
-      }
 
-      stopPhaseTimer();
-    }
+      if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
+        var foundWillMountName = null;
+        var foundWillReceivePropsName = null;
+        var foundWillUpdateName = null;
 
-    if (typeof instance.componentDidUpdate === 'function') {
-      workInProgress.effectTag |= Update;
-    }
+        if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
+          foundWillMountName = 'componentWillMount';
+        } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
+          foundWillMountName = 'UNSAFE_componentWillMount';
+        }
 
-    if (typeof instance.getSnapshotBeforeUpdate === 'function') {
-      workInProgress.effectTag |= Snapshot;
-    }
-  } else {
-    // If an update was already in progress, we should schedule an Update
-    // effect even though we're bailing out, so that cWU/cDU are called.
-    if (typeof instance.componentDidUpdate === 'function') {
-      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
-        workInProgress.effectTag |= Update;
-      }
-    }
+        if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
+          foundWillReceivePropsName = 'componentWillReceiveProps';
+        } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
+          foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
+        }
 
-    if (typeof instance.getSnapshotBeforeUpdate === 'function') {
-      if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
-        workInProgress.effectTag |= Snapshot;
-      }
-    } // If shouldComponentUpdate returned false, we should still update the
-    // memoized props/state to indicate that this work can be reused.
+        if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
+          foundWillUpdateName = 'componentWillUpdate';
+        } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
+          foundWillUpdateName = 'UNSAFE_componentWillUpdate';
+        }
 
+        if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
+          var _componentName = getComponentName(ctor) || 'Component';
 
-    workInProgress.memoizedProps = newProps;
-    workInProgress.memoizedState = newState;
-  } // Update the existing instance's state, props, and context pointers even
-  // if shouldComponentUpdate returns false.
+          var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
 
+          if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
+            didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
 
-  instance.props = newProps;
-  instance.state = newState;
-  instance.context = nextContext;
-  return shouldUpdate;
-}
+            error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n  " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n  " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n  " + foundWillUpdateName : '');
+          }
+        }
+      }
+    } // Cache unmasked context so we can avoid recreating masked context unless necessary.
+    // ReactFiberContext usually updates this cache but can't for newly-created instances.
 
-var didWarnAboutMaps;
-var didWarnAboutGenerators;
-var didWarnAboutStringRefs;
-var ownerHasKeyUseWarning;
-var ownerHasFunctionTypeWarning;
 
-var warnForMissingKey = function (child) {};
+    if (isLegacyContextConsumer) {
+      cacheContext(workInProgress, unmaskedContext, context);
+    }
 
-{
-  didWarnAboutMaps = false;
-  didWarnAboutGenerators = false;
-  didWarnAboutStringRefs = {};
-  /**
-   * Warn if there's no key explicitly set on dynamic arrays of children or
-   * object keys are not valid. This allows us to keep track of children between
-   * updates.
-   */
+    return instance;
+  }
 
-  ownerHasKeyUseWarning = {};
-  ownerHasFunctionTypeWarning = {};
+  function callComponentWillMount(workInProgress, instance) {
+    startPhaseTimer(workInProgress, 'componentWillMount');
+    var oldState = instance.state;
 
-  warnForMissingKey = function (child) {
-    if (child === null || typeof child !== 'object') {
-      return;
+    if (typeof instance.componentWillMount === 'function') {
+      instance.componentWillMount();
     }
 
-    if (!child._store || child._store.validated || child.key != null) {
-      return;
+    if (typeof instance.UNSAFE_componentWillMount === 'function') {
+      instance.UNSAFE_componentWillMount();
     }
 
-    if (!(typeof child._store === 'object')) {
+    stopPhaseTimer();
+
+    if (oldState !== instance.state) {
       {
-        throw Error("React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.");
+        error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component');
       }
+
+      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
     }
+  }
 
-    child._store.validated = true;
-    var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();
+  function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
+    var oldState = instance.state;
+    startPhaseTimer(workInProgress, 'componentWillReceiveProps');
 
-    if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
-      return;
+    if (typeof instance.componentWillReceiveProps === 'function') {
+      instance.componentWillReceiveProps(newProps, nextContext);
     }
 
-    ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
-    warning$1(false, 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.');
-  };
-}
+    if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
+      instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
+    }
 
-var isArray = Array.isArray;
+    stopPhaseTimer();
 
-function coerceRef(returnFiber, current$$1, element) {
-  var mixedRef = element.ref;
+    if (instance.state !== oldState) {
+      {
+        var componentName = getComponentName(workInProgress.type) || 'Component';
 
-  if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
-    {
-      // TODO: Clean this up once we turn on the string ref warning for
-      // everyone, because the strict mode case will no longer be relevant
-      if (returnFiber.mode & StrictMode || warnAboutStringRefs) {
-        var componentName = getComponentName(returnFiber.type) || 'Component';
-
-        if (!didWarnAboutStringRefs[componentName]) {
-          if (warnAboutStringRefs) {
-            warningWithoutStack$1(false, 'Component "%s" contains the string ref "%s". Support for string refs ' + 'will be removed in a future major release. We recommend using ' + 'useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', componentName, mixedRef, getStackByFiberInDevAndProd(returnFiber));
-          } else {
-            warningWithoutStack$1(false, 'A string ref, "%s", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber));
-          }
+        if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
+          didWarnAboutStateAssignmentForComponent.add(componentName);
 
-          didWarnAboutStringRefs[componentName] = true;
+          error('%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
         }
       }
+
+      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
     }
+  } // Invokes the mount life-cycles on a previously never rendered instance.
 
-    if (element._owner) {
-      var owner = element._owner;
-      var inst;
 
-      if (owner) {
-        var ownerFiber = owner;
+  function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
+    {
+      checkClassInstance(workInProgress, ctor, newProps);
+    }
 
-        if (!(ownerFiber.tag === ClassComponent)) {
-          {
-            throw Error("Function components cannot have refs. Did you mean to use React.forwardRef()?");
-          }
-        }
+    var instance = workInProgress.stateNode;
+    instance.props = newProps;
+    instance.state = workInProgress.memoizedState;
+    instance.refs = emptyRefsObject;
+    initializeUpdateQueue(workInProgress);
+    var contextType = ctor.contextType;
 
-        inst = ownerFiber.stateNode;
-      }
+    if (typeof contextType === 'object' && contextType !== null) {
+      instance.context = readContext(contextType);
+    } else {
+      var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
+      instance.context = getMaskedContext(workInProgress, unmaskedContext);
+    }
 
-      if (!inst) {
-        {
-          throw Error("Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue.");
+    {
+      if (instance.state === newProps) {
+        var componentName = getComponentName(ctor) || 'Component';
+
+        if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
+          didWarnAboutDirectlyAssigningPropsToState.add(componentName);
+
+          error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName);
         }
       }
 
-      var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref
-
-      if (current$$1 !== null && current$$1.ref !== null && typeof current$$1.ref === 'function' && current$$1.ref._stringRef === stringRef) {
-        return current$$1.ref;
+      if (workInProgress.mode & StrictMode) {
+        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
       }
 
-      var ref = function (value) {
-        var refs = inst.refs;
+      {
+        ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
+      }
+    }
 
-        if (refs === emptyRefsObject) {
-          // This is a lazy pooled frozen object, so we need to initialize.
-          refs = inst.refs = {};
-        }
+    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);
+    instance.state = workInProgress.memoizedState;
+    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
 
-        if (value === null) {
-          delete refs[stringRef];
-        } else {
-          refs[stringRef] = value;
-        }
-      };
-
-      ref._stringRef = stringRef;
-      return ref;
-    } else {
-      if (!(typeof mixedRef === 'string')) {
-        {
-          throw Error("Expected ref to be a function, a string, an object returned by React.createRef(), or null.");
-        }
-      }
-
-      if (!element._owner) {
-        {
-          throw Error("Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://fb.me/react-refs-must-have-owner for more information.");
-        }
-      }
-    }
-  }
+    if (typeof getDerivedStateFromProps === 'function') {
+      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
+      instance.state = workInProgress.memoizedState;
+    } // In order to support react-lifecycles-compat polyfilled components,
+    // Unsafe lifecycles should not be invoked for components using the new APIs.
 
-  return mixedRef;
-}
 
-function throwOnInvalidObjectType(returnFiber, newChild) {
-  if (returnFiber.type !== 'textarea') {
-    var addendum = '';
+    if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
+      callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's
+      // process them now.
 
-    {
-      addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();
+      processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);
+      instance.state = workInProgress.memoizedState;
     }
 
-    {
-      {
-        throw Error("Objects are not valid as a React child (found: " + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + ")." + addendum);
-      }
+    if (typeof instance.componentDidMount === 'function') {
+      workInProgress.effectTag |= Update;
     }
   }
-}
-
-function warnOnFunctionType() {
-  var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev();
-
-  if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {
-    return;
-  }
 
-  ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;
-  warning$1(false, 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');
-} // This wrapper function exists because I expect to clone the code in each path
-// to be able to optimize each path individually by branching early. This needs
-// a compiler or we can do it manually. Helpers that don't need this branching
-// live outside of this function.
+  function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {
+    var instance = workInProgress.stateNode;
+    var oldProps = workInProgress.memoizedProps;
+    instance.props = oldProps;
+    var oldContext = instance.context;
+    var contextType = ctor.contextType;
+    var nextContext = emptyContextObject;
+
+    if (typeof contextType === 'object' && contextType !== null) {
+      nextContext = readContext(contextType);
+    } else {
+      var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
+      nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
+    }
 
+    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
+    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
+    // ever the previously attempted to render - not the "current". However,
+    // during componentDidUpdate we pass the "current" props.
+    // In order to support react-lifecycles-compat polyfilled components,
+    // Unsafe lifecycles should not be invoked for components using the new APIs.
 
-function ChildReconciler(shouldTrackSideEffects) {
-  function deleteChild(returnFiber, childToDelete) {
-    if (!shouldTrackSideEffects) {
-      // Noop.
-      return;
-    } // Deletions are added in reversed order so we add it to the front.
-    // At this point, the return fiber's effect list is empty except for
-    // deletions, so we can just append the deletion to the list. The remaining
-    // effects aren't added until the complete phase. Once we implement
-    // resuming, this may not be true.
+    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
+      if (oldProps !== newProps || oldContext !== nextContext) {
+        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
+      }
+    }
 
+    resetHasForceUpdateBeforeProcessing();
+    var oldState = workInProgress.memoizedState;
+    var newState = instance.state = oldState;
+    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);
+    newState = workInProgress.memoizedState;
 
-    var last = returnFiber.lastEffect;
+    if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
+      // If an update was already in progress, we should schedule an Update
+      // effect even though we're bailing out, so that cWU/cDU are called.
+      if (typeof instance.componentDidMount === 'function') {
+        workInProgress.effectTag |= Update;
+      }
 
-    if (last !== null) {
-      last.nextEffect = childToDelete;
-      returnFiber.lastEffect = childToDelete;
-    } else {
-      returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
+      return false;
     }
 
-    childToDelete.nextEffect = null;
-    childToDelete.effectTag = Deletion;
-  }
-
-  function deleteRemainingChildren(returnFiber, currentFirstChild) {
-    if (!shouldTrackSideEffects) {
-      // Noop.
-      return null;
-    } // TODO: For the shouldClone case, this could be micro-optimized a bit by
-    // assuming that after the first child we've already added everything.
-
+    if (typeof getDerivedStateFromProps === 'function') {
+      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
+      newState = workInProgress.memoizedState;
+    }
 
-    var childToDelete = currentFirstChild;
+    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
 
-    while (childToDelete !== null) {
-      deleteChild(returnFiber, childToDelete);
-      childToDelete = childToDelete.sibling;
-    }
+    if (shouldUpdate) {
+      // In order to support react-lifecycles-compat polyfilled components,
+      // Unsafe lifecycles should not be invoked for components using the new APIs.
+      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
+        startPhaseTimer(workInProgress, 'componentWillMount');
 
-    return null;
-  }
+        if (typeof instance.componentWillMount === 'function') {
+          instance.componentWillMount();
+        }
 
-  function mapRemainingChildren(returnFiber, currentFirstChild) {
-    // Add the remaining children to a temporary map so that we can find them by
-    // keys quickly. Implicit (null) keys get added to this set with their index
-    // instead.
-    var existingChildren = new Map();
-    var existingChild = currentFirstChild;
+        if (typeof instance.UNSAFE_componentWillMount === 'function') {
+          instance.UNSAFE_componentWillMount();
+        }
 
-    while (existingChild !== null) {
-      if (existingChild.key !== null) {
-        existingChildren.set(existingChild.key, existingChild);
-      } else {
-        existingChildren.set(existingChild.index, existingChild);
+        stopPhaseTimer();
       }
 
-      existingChild = existingChild.sibling;
-    }
-
-    return existingChildren;
-  }
+      if (typeof instance.componentDidMount === 'function') {
+        workInProgress.effectTag |= Update;
+      }
+    } else {
+      // If an update was already in progress, we should schedule an Update
+      // effect even though we're bailing out, so that cWU/cDU are called.
+      if (typeof instance.componentDidMount === 'function') {
+        workInProgress.effectTag |= Update;
+      } // If shouldComponentUpdate returned false, we should still update the
+      // memoized state to indicate that this work can be reused.
 
-  function useFiber(fiber, pendingProps, expirationTime) {
-    // We currently set sibling to null and index to 0 here because it is easy
-    // to forget to do before returning it. E.g. for the single child case.
-    var clone = createWorkInProgress(fiber, pendingProps, expirationTime);
-    clone.index = 0;
-    clone.sibling = null;
-    return clone;
-  }
 
-  function placeChild(newFiber, lastPlacedIndex, newIndex) {
-    newFiber.index = newIndex;
+      workInProgress.memoizedProps = newProps;
+      workInProgress.memoizedState = newState;
+    } // Update the existing instance's state, props, and context pointers even
+    // if shouldComponentUpdate returns false.
 
-    if (!shouldTrackSideEffects) {
-      // Noop.
-      return lastPlacedIndex;
-    }
 
-    var current$$1 = newFiber.alternate;
+    instance.props = newProps;
+    instance.state = newState;
+    instance.context = nextContext;
+    return shouldUpdate;
+  } // Invokes the update life-cycles and returns false if it shouldn't rerender.
 
-    if (current$$1 !== null) {
-      var oldIndex = current$$1.index;
 
-      if (oldIndex < lastPlacedIndex) {
-        // This is a move.
-        newFiber.effectTag = Placement;
-        return lastPlacedIndex;
-      } else {
-        // This item can stay in place.
-        return oldIndex;
-      }
+  function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {
+    var instance = workInProgress.stateNode;
+    cloneUpdateQueue(current, workInProgress);
+    var oldProps = workInProgress.memoizedProps;
+    instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);
+    var oldContext = instance.context;
+    var contextType = ctor.contextType;
+    var nextContext = emptyContextObject;
+
+    if (typeof contextType === 'object' && contextType !== null) {
+      nextContext = readContext(contextType);
     } else {
-      // This is an insertion.
-      newFiber.effectTag = Placement;
-      return lastPlacedIndex;
-    }
-  }
-
-  function placeSingleChild(newFiber) {
-    // This is simpler for the single child case. We only need to do a
-    // placement for inserting new children.
-    if (shouldTrackSideEffects && newFiber.alternate === null) {
-      newFiber.effectTag = Placement;
+      var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
+      nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
     }
 
-    return newFiber;
-  }
+    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
+    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
+    // ever the previously attempted to render - not the "current". However,
+    // during componentDidUpdate we pass the "current" props.
+    // In order to support react-lifecycles-compat polyfilled components,
+    // Unsafe lifecycles should not be invoked for components using the new APIs.
 
-  function updateTextNode(returnFiber, current$$1, textContent, expirationTime) {
-    if (current$$1 === null || current$$1.tag !== HostText) {
-      // Insert
-      var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
-      created.return = returnFiber;
-      return created;
-    } else {
-      // Update
-      var existing = useFiber(current$$1, textContent, expirationTime);
-      existing.return = returnFiber;
-      return existing;
+    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
+      if (oldProps !== newProps || oldContext !== nextContext) {
+        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
+      }
     }
-  }
 
-  function updateElement(returnFiber, current$$1, element, expirationTime) {
-    if (current$$1 !== null && (current$$1.elementType === element.type || ( // Keep this check inline so it only runs on the false path:
-    isCompatibleFamilyForHotReloading(current$$1, element)))) {
-      // Move based on index
-      var existing = useFiber(current$$1, element.props, expirationTime);
-      existing.ref = coerceRef(returnFiber, current$$1, element);
-      existing.return = returnFiber;
+    resetHasForceUpdateBeforeProcessing();
+    var oldState = workInProgress.memoizedState;
+    var newState = instance.state = oldState;
+    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);
+    newState = workInProgress.memoizedState;
 
-      {
-        existing._debugSource = element._source;
-        existing._debugOwner = element._owner;
+    if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
+      // If an update was already in progress, we should schedule an Update
+      // effect even though we're bailing out, so that cWU/cDU are called.
+      if (typeof instance.componentDidUpdate === 'function') {
+        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
+          workInProgress.effectTag |= Update;
+        }
       }
 
-      return existing;
-    } else {
-      // Insert
-      var created = createFiberFromElement(element, returnFiber.mode, expirationTime);
-      created.ref = coerceRef(returnFiber, current$$1, element);
-      created.return = returnFiber;
-      return created;
-    }
-  }
+      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
+        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
+          workInProgress.effectTag |= Snapshot;
+        }
+      }
 
-  function updatePortal(returnFiber, current$$1, portal, expirationTime) {
-    if (current$$1 === null || current$$1.tag !== HostPortal || current$$1.stateNode.containerInfo !== portal.containerInfo || current$$1.stateNode.implementation !== portal.implementation) {
-      // Insert
-      var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
-      created.return = returnFiber;
-      return created;
-    } else {
-      // Update
-      var existing = useFiber(current$$1, portal.children || [], expirationTime);
-      existing.return = returnFiber;
-      return existing;
+      return false;
     }
-  }
 
-  function updateFragment(returnFiber, current$$1, fragment, expirationTime, key) {
-    if (current$$1 === null || current$$1.tag !== Fragment) {
-      // Insert
-      var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);
-      created.return = returnFiber;
-      return created;
-    } else {
-      // Update
-      var existing = useFiber(current$$1, fragment, expirationTime);
-      existing.return = returnFiber;
-      return existing;
+    if (typeof getDerivedStateFromProps === 'function') {
+      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
+      newState = workInProgress.memoizedState;
     }
-  }
 
-  function createChild(returnFiber, newChild, expirationTime) {
-    if (typeof newChild === 'string' || typeof newChild === 'number') {
-      // Text nodes don't have keys. If the previous node is implicitly keyed
-      // we can continue to replace it without aborting even if it is not a text
-      // node.
-      var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);
-      created.return = returnFiber;
-      return created;
-    }
+    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
 
-    if (typeof newChild === 'object' && newChild !== null) {
-      switch (newChild.$$typeof) {
-        case REACT_ELEMENT_TYPE:
-          {
-            var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);
+    if (shouldUpdate) {
+      // In order to support react-lifecycles-compat polyfilled components,
+      // Unsafe lifecycles should not be invoked for components using the new APIs.
+      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
+        startPhaseTimer(workInProgress, 'componentWillUpdate');
 
-            _created.ref = coerceRef(returnFiber, null, newChild);
-            _created.return = returnFiber;
-            return _created;
-          }
+        if (typeof instance.componentWillUpdate === 'function') {
+          instance.componentWillUpdate(newProps, newState, nextContext);
+        }
 
-        case REACT_PORTAL_TYPE:
-          {
-            var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);
+        if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
+          instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
+        }
 
-            _created2.return = returnFiber;
-            return _created2;
-          }
+        stopPhaseTimer();
       }
 
-      if (isArray(newChild) || getIteratorFn(newChild)) {
-        var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);
+      if (typeof instance.componentDidUpdate === 'function') {
+        workInProgress.effectTag |= Update;
+      }
 
-        _created3.return = returnFiber;
-        return _created3;
+      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
+        workInProgress.effectTag |= Snapshot;
+      }
+    } else {
+      // If an update was already in progress, we should schedule an Update
+      // effect even though we're bailing out, so that cWU/cDU are called.
+      if (typeof instance.componentDidUpdate === 'function') {
+        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
+          workInProgress.effectTag |= Update;
+        }
       }
 
-      throwOnInvalidObjectType(returnFiber, newChild);
-    }
+      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
+        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {
+          workInProgress.effectTag |= Snapshot;
+        }
+      } // If shouldComponentUpdate returned false, we should still update the
+      // memoized props/state to indicate that this work can be reused.
 
-    {
-      if (typeof newChild === 'function') {
-        warnOnFunctionType();
-      }
-    }
 
-    return null;
-  }
+      workInProgress.memoizedProps = newProps;
+      workInProgress.memoizedState = newState;
+    } // Update the existing instance's state, props, and context pointers even
+    // if shouldComponentUpdate returns false.
 
-  function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {
-    // Update the fiber if the keys match, otherwise return null.
-    var key = oldFiber !== null ? oldFiber.key : null;
 
-    if (typeof newChild === 'string' || typeof newChild === 'number') {
-      // Text nodes don't have keys. If the previous node is implicitly keyed
-      // we can continue to replace it without aborting even if it is not a text
-      // node.
-      if (key !== null) {
-        return null;
-      }
+    instance.props = newProps;
+    instance.state = newState;
+    instance.context = nextContext;
+    return shouldUpdate;
+  }
 
-      return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);
-    }
+  var didWarnAboutMaps;
+  var didWarnAboutGenerators;
+  var didWarnAboutStringRefs;
+  var ownerHasKeyUseWarning;
+  var ownerHasFunctionTypeWarning;
 
-    if (typeof newChild === 'object' && newChild !== null) {
-      switch (newChild.$$typeof) {
-        case REACT_ELEMENT_TYPE:
-          {
-            if (newChild.key === key) {
-              if (newChild.type === REACT_FRAGMENT_TYPE) {
-                return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);
-              }
+  var warnForMissingKey = function (child) {};
 
-              return updateElement(returnFiber, oldFiber, newChild, expirationTime);
-            } else {
-              return null;
-            }
-          }
+  {
+    didWarnAboutMaps = false;
+    didWarnAboutGenerators = false;
+    didWarnAboutStringRefs = {};
+    /**
+     * Warn if there's no key explicitly set on dynamic arrays of children or
+     * object keys are not valid. This allows us to keep track of children between
+     * updates.
+     */
+
+    ownerHasKeyUseWarning = {};
+    ownerHasFunctionTypeWarning = {};
+
+    warnForMissingKey = function (child) {
+      if (child === null || typeof child !== 'object') {
+        return;
+      }
 
-        case REACT_PORTAL_TYPE:
-          {
-            if (newChild.key === key) {
-              return updatePortal(returnFiber, oldFiber, newChild, expirationTime);
-            } else {
-              return null;
-            }
-          }
+      if (!child._store || child._store.validated || child.key != null) {
+        return;
       }
 
-      if (isArray(newChild) || getIteratorFn(newChild)) {
-        if (key !== null) {
-          return null;
+      if (!(typeof child._store === 'object')) {
+        {
+          throw Error( "React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue." );
         }
-
-        return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);
       }
 
-      throwOnInvalidObjectType(returnFiber, newChild);
-    }
+      child._store.validated = true;
+      var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();
 
-    {
-      if (typeof newChild === 'function') {
-        warnOnFunctionType();
+      if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
+        return;
       }
-    }
 
-    return null;
+      ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
+
+      error('Each child in a list should have a unique ' + '"key" prop. See https://fb.me/react-warning-keys for ' + 'more information.');
+    };
   }
 
-  function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {
-    if (typeof newChild === 'string' || typeof newChild === 'number') {
-      // Text nodes don't have keys, so we neither have to check the old nor
-      // new node for the key. If both are text nodes, they match.
-      var matchedFiber = existingChildren.get(newIdx) || null;
-      return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);
-    }
+  var isArray$1 = Array.isArray;
 
-    if (typeof newChild === 'object' && newChild !== null) {
-      switch (newChild.$$typeof) {
-        case REACT_ELEMENT_TYPE:
-          {
-            var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
+  function coerceRef(returnFiber, current, element) {
+    var mixedRef = element.ref;
 
-            if (newChild.type === REACT_FRAGMENT_TYPE) {
-              return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);
+    if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
+      {
+        // TODO: Clean this up once we turn on the string ref warning for
+        // everyone, because the strict mode case will no longer be relevant
+        if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs
+        // because these cannot be automatically converted to an arrow function
+        // using a codemod. Therefore, we don't have to warn about string refs again.
+        !(element._owner && element._self && element._owner.stateNode !== element._self)) {
+          var componentName = getComponentName(returnFiber.type) || 'Component';
+
+          if (!didWarnAboutStringRefs[componentName]) {
+            {
+              error('A string ref, "%s", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber));
             }
 
-            return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);
-          }
-
-        case REACT_PORTAL_TYPE:
-          {
-            var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
-
-            return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);
+            didWarnAboutStringRefs[componentName] = true;
           }
+        }
       }
 
-      if (isArray(newChild) || getIteratorFn(newChild)) {
-        var _matchedFiber3 = existingChildren.get(newIdx) || null;
+      if (element._owner) {
+        var owner = element._owner;
+        var inst;
 
-        return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);
-      }
+        if (owner) {
+          var ownerFiber = owner;
 
-      throwOnInvalidObjectType(returnFiber, newChild);
-    }
+          if (!(ownerFiber.tag === ClassComponent)) {
+            {
+              throw Error( "Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref" );
+            }
+          }
 
-    {
-      if (typeof newChild === 'function') {
-        warnOnFunctionType();
-      }
-    }
+          inst = ownerFiber.stateNode;
+        }
 
-    return null;
-  }
-  /**
-   * Warns if there is a duplicate or missing key
-   */
+        if (!inst) {
+          {
+            throw Error( "Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue." );
+          }
+        }
 
+        var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref
 
-  function warnOnInvalidKey(child, knownKeys) {
-    {
-      if (typeof child !== 'object' || child === null) {
-        return knownKeys;
-      }
+        if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {
+          return current.ref;
+        }
 
-      switch (child.$$typeof) {
-        case REACT_ELEMENT_TYPE:
-        case REACT_PORTAL_TYPE:
-          warnForMissingKey(child);
-          var key = child.key;
+        var ref = function (value) {
+          var refs = inst.refs;
 
-          if (typeof key !== 'string') {
-            break;
+          if (refs === emptyRefsObject) {
+            // This is a lazy pooled frozen object, so we need to initialize.
+            refs = inst.refs = {};
           }
 
-          if (knownKeys === null) {
-            knownKeys = new Set();
-            knownKeys.add(key);
-            break;
+          if (value === null) {
+            delete refs[stringRef];
+          } else {
+            refs[stringRef] = value;
           }
+        };
 
-          if (!knownKeys.has(key)) {
-            knownKeys.add(key);
-            break;
+        ref._stringRef = stringRef;
+        return ref;
+      } else {
+        if (!(typeof mixedRef === 'string')) {
+          {
+            throw Error( "Expected ref to be a function, a string, an object returned by React.createRef(), or null." );
           }
+        }
 
-          warning$1(false, 'Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);
-          break;
-
-        default:
-          break;
+        if (!element._owner) {
+          {
+            throw Error( "Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://fb.me/react-refs-must-have-owner for more information." );
+          }
+        }
       }
     }
 
-    return knownKeys;
+    return mixedRef;
   }
 
-  function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {
-    // This algorithm can't optimize by searching from both ends since we
-    // don't have backpointers on fibers. I'm trying to see how far we can get
-    // with that model. If it ends up not being worth the tradeoffs, we can
-    // add it later.
-    // Even with a two ended optimization, we'd want to optimize for the case
-    // where there are few changes and brute force the comparison instead of
-    // going for the Map. It'd like to explore hitting that path first in
-    // forward-only mode and only go for the Map once we notice that we need
-    // lots of look ahead. This doesn't handle reversal as well as two ended
-    // search but that's unusual. Besides, for the two ended optimization to
-    // work on Iterables, we'd need to copy the whole set.
-    // In this first iteration, we'll just live with hitting the bad case
-    // (adding everything to a Map) in for every insert/move.
-    // If you change this code, also update reconcileChildrenIterator() which
-    // uses the same algorithm.
-    {
-      // First, validate keys.
-      var knownKeys = null;
+  function throwOnInvalidObjectType(returnFiber, newChild) {
+    if (returnFiber.type !== 'textarea') {
+      var addendum = '';
+
+      {
+        addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();
+      }
 
-      for (var i = 0; i < newChildren.length; i++) {
-        var child = newChildren[i];
-        knownKeys = warnOnInvalidKey(child, knownKeys);
+      {
+        {
+          throw Error( "Objects are not valid as a React child (found: " + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + ")." + addendum );
+        }
       }
     }
+  }
 
-    var resultingFirstChild = null;
-    var previousNewFiber = null;
-    var oldFiber = currentFirstChild;
-    var lastPlacedIndex = 0;
-    var newIdx = 0;
-    var nextOldFiber = null;
+  function warnOnFunctionType() {
+    {
+      var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev();
 
-    for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
-      if (oldFiber.index > newIdx) {
-        nextOldFiber = oldFiber;
-        oldFiber = null;
-      } else {
-        nextOldFiber = oldFiber.sibling;
+      if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {
+        return;
       }
 
-      var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);
+      ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;
 
-      if (newFiber === null) {
-        // TODO: This breaks on empty slots like null children. That's
-        // unfortunate because it triggers the slow path all the time. We need
-        // a better way to communicate whether this was a miss or null,
-        // boolean, undefined, etc.
-        if (oldFiber === null) {
-          oldFiber = nextOldFiber;
-        }
+      error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');
+    }
+  } // This wrapper function exists because I expect to clone the code in each path
+  // to be able to optimize each path individually by branching early. This needs
+  // a compiler or we can do it manually. Helpers that don't need this branching
+  // live outside of this function.
 
-        break;
-      }
 
-      if (shouldTrackSideEffects) {
-        if (oldFiber && newFiber.alternate === null) {
-          // We matched the slot, but we didn't reuse the existing fiber, so we
-          // need to delete the existing child.
-          deleteChild(returnFiber, oldFiber);
-        }
-      }
+  function ChildReconciler(shouldTrackSideEffects) {
+    function deleteChild(returnFiber, childToDelete) {
+      if (!shouldTrackSideEffects) {
+        // Noop.
+        return;
+      } // Deletions are added in reversed order so we add it to the front.
+      // At this point, the return fiber's effect list is empty except for
+      // deletions, so we can just append the deletion to the list. The remaining
+      // effects aren't added until the complete phase. Once we implement
+      // resuming, this may not be true.
+
 
-      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
+      var last = returnFiber.lastEffect;
 
-      if (previousNewFiber === null) {
-        // TODO: Move out of the loop. This only happens for the first run.
-        resultingFirstChild = newFiber;
+      if (last !== null) {
+        last.nextEffect = childToDelete;
+        returnFiber.lastEffect = childToDelete;
       } else {
-        // TODO: Defer siblings if we're not at the right index for this slot.
-        // I.e. if we had null values before, then we want to defer this
-        // for each null value. However, we also don't want to call updateSlot
-        // with the previous one.
-        previousNewFiber.sibling = newFiber;
+        returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
       }
 
-      previousNewFiber = newFiber;
-      oldFiber = nextOldFiber;
+      childToDelete.nextEffect = null;
+      childToDelete.effectTag = Deletion;
     }
 
-    if (newIdx === newChildren.length) {
-      // We've reached the end of the new children. We can delete the rest.
-      deleteRemainingChildren(returnFiber, oldFiber);
-      return resultingFirstChild;
-    }
+    function deleteRemainingChildren(returnFiber, currentFirstChild) {
+      if (!shouldTrackSideEffects) {
+        // Noop.
+        return null;
+      } // TODO: For the shouldClone case, this could be micro-optimized a bit by
+      // assuming that after the first child we've already added everything.
 
-    if (oldFiber === null) {
-      // If we don't have any more existing children we can choose a fast path
-      // since the rest will all be insertions.
-      for (; newIdx < newChildren.length; newIdx++) {
-        var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);
 
-        if (_newFiber === null) {
-          continue;
-        }
+      var childToDelete = currentFirstChild;
 
-        lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
+      while (childToDelete !== null) {
+        deleteChild(returnFiber, childToDelete);
+        childToDelete = childToDelete.sibling;
+      }
 
-        if (previousNewFiber === null) {
-          // TODO: Move out of the loop. This only happens for the first run.
-          resultingFirstChild = _newFiber;
+      return null;
+    }
+
+    function mapRemainingChildren(returnFiber, currentFirstChild) {
+      // Add the remaining children to a temporary map so that we can find them by
+      // keys quickly. Implicit (null) keys get added to this set with their index
+      // instead.
+      var existingChildren = new Map();
+      var existingChild = currentFirstChild;
+
+      while (existingChild !== null) {
+        if (existingChild.key !== null) {
+          existingChildren.set(existingChild.key, existingChild);
         } else {
-          previousNewFiber.sibling = _newFiber;
+          existingChildren.set(existingChild.index, existingChild);
         }
 
-        previousNewFiber = _newFiber;
+        existingChild = existingChild.sibling;
       }
 
-      return resultingFirstChild;
-    } // Add all children to a key map for quick lookups.
+      return existingChildren;
+    }
 
+    function useFiber(fiber, pendingProps) {
+      // We currently set sibling to null and index to 0 here because it is easy
+      // to forget to do before returning it. E.g. for the single child case.
+      var clone = createWorkInProgress(fiber, pendingProps);
+      clone.index = 0;
+      clone.sibling = null;
+      return clone;
+    }
 
-    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
+    function placeChild(newFiber, lastPlacedIndex, newIndex) {
+      newFiber.index = newIndex;
 
-    for (; newIdx < newChildren.length; newIdx++) {
-      var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);
+      if (!shouldTrackSideEffects) {
+        // Noop.
+        return lastPlacedIndex;
+      }
 
-      if (_newFiber2 !== null) {
-        if (shouldTrackSideEffects) {
-          if (_newFiber2.alternate !== null) {
-            // The new fiber is a work in progress, but if there exists a
-            // current, that means that we reused the fiber. We need to delete
-            // it from the child list so that we don't add it to the deletion
-            // list.
-            existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
-          }
-        }
+      var current = newFiber.alternate;
 
-        lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
+      if (current !== null) {
+        var oldIndex = current.index;
 
-        if (previousNewFiber === null) {
-          resultingFirstChild = _newFiber2;
+        if (oldIndex < lastPlacedIndex) {
+          // This is a move.
+          newFiber.effectTag = Placement;
+          return lastPlacedIndex;
         } else {
-          previousNewFiber.sibling = _newFiber2;
+          // This item can stay in place.
+          return oldIndex;
         }
+      } else {
+        // This is an insertion.
+        newFiber.effectTag = Placement;
+        return lastPlacedIndex;
+      }
+    }
 
-        previousNewFiber = _newFiber2;
+    function placeSingleChild(newFiber) {
+      // This is simpler for the single child case. We only need to do a
+      // placement for inserting new children.
+      if (shouldTrackSideEffects && newFiber.alternate === null) {
+        newFiber.effectTag = Placement;
       }
+
+      return newFiber;
     }
 
-    if (shouldTrackSideEffects) {
-      // Any existing children that weren't consumed above were deleted. We need
-      // to add them to the deletion list.
-      existingChildren.forEach(function (child) {
-        return deleteChild(returnFiber, child);
-      });
-    }
-
-    return resultingFirstChild;
-  }
-
-  function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {
-    // This is the same implementation as reconcileChildrenArray(),
-    // but using the iterator instead.
-    var iteratorFn = getIteratorFn(newChildrenIterable);
-
-    if (!(typeof iteratorFn === 'function')) {
-      {
-        throw Error("An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.");
+    function updateTextNode(returnFiber, current, textContent, expirationTime) {
+      if (current === null || current.tag !== HostText) {
+        // Insert
+        var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
+        created.return = returnFiber;
+        return created;
+      } else {
+        // Update
+        var existing = useFiber(current, textContent);
+        existing.return = returnFiber;
+        return existing;
       }
     }
 
-    {
-      // We don't support rendering Generators because it's a mutation.
-      // See https://github.com/facebook/react/issues/12995
-      if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag
-      newChildrenIterable[Symbol.toStringTag] === 'Generator') {
-        !didWarnAboutGenerators ? warning$1(false, 'Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.') : void 0;
-        didWarnAboutGenerators = true;
-      } // Warn about using Maps as children
-
-
-      if (newChildrenIterable.entries === iteratorFn) {
-        !didWarnAboutMaps ? warning$1(false, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.') : void 0;
-        didWarnAboutMaps = true;
-      } // First, validate keys.
-      // We'll get a different iterator later for the main pass.
+    function updateElement(returnFiber, current, element, expirationTime) {
+      if (current !== null) {
+        if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path:
+         isCompatibleFamilyForHotReloading(current, element) )) {
+          // Move based on index
+          var existing = useFiber(current, element.props);
+          existing.ref = coerceRef(returnFiber, current, element);
+          existing.return = returnFiber;
 
+          {
+            existing._debugSource = element._source;
+            existing._debugOwner = element._owner;
+          }
 
-      var _newChildren = iteratorFn.call(newChildrenIterable);
+          return existing;
+        }
+      } // Insert
 
-      if (_newChildren) {
-        var knownKeys = null;
 
-        var _step = _newChildren.next();
+      var created = createFiberFromElement(element, returnFiber.mode, expirationTime);
+      created.ref = coerceRef(returnFiber, current, element);
+      created.return = returnFiber;
+      return created;
+    }
 
-        for (; !_step.done; _step = _newChildren.next()) {
-          var child = _step.value;
-          knownKeys = warnOnInvalidKey(child, knownKeys);
-        }
+    function updatePortal(returnFiber, current, portal, expirationTime) {
+      if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {
+        // Insert
+        var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
+        created.return = returnFiber;
+        return created;
+      } else {
+        // Update
+        var existing = useFiber(current, portal.children || []);
+        existing.return = returnFiber;
+        return existing;
       }
     }
 
-    var newChildren = iteratorFn.call(newChildrenIterable);
-
-    if (!(newChildren != null)) {
-      {
-        throw Error("An iterable object provided no iterator.");
+    function updateFragment(returnFiber, current, fragment, expirationTime, key) {
+      if (current === null || current.tag !== Fragment) {
+        // Insert
+        var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);
+        created.return = returnFiber;
+        return created;
+      } else {
+        // Update
+        var existing = useFiber(current, fragment);
+        existing.return = returnFiber;
+        return existing;
       }
     }
 
-    var resultingFirstChild = null;
-    var previousNewFiber = null;
-    var oldFiber = currentFirstChild;
-    var lastPlacedIndex = 0;
-    var newIdx = 0;
-    var nextOldFiber = null;
-    var step = newChildren.next();
-
-    for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
-      if (oldFiber.index > newIdx) {
-        nextOldFiber = oldFiber;
-        oldFiber = null;
-      } else {
-        nextOldFiber = oldFiber.sibling;
+    function createChild(returnFiber, newChild, expirationTime) {
+      if (typeof newChild === 'string' || typeof newChild === 'number') {
+        // Text nodes don't have keys. If the previous node is implicitly keyed
+        // we can continue to replace it without aborting even if it is not a text
+        // node.
+        var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);
+        created.return = returnFiber;
+        return created;
       }
 
-      var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);
+      if (typeof newChild === 'object' && newChild !== null) {
+        switch (newChild.$$typeof) {
+          case REACT_ELEMENT_TYPE:
+            {
+              var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);
+
+              _created.ref = coerceRef(returnFiber, null, newChild);
+              _created.return = returnFiber;
+              return _created;
+            }
+
+          case REACT_PORTAL_TYPE:
+            {
+              var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);
 
-      if (newFiber === null) {
-        // TODO: This breaks on empty slots like null children. That's
-        // unfortunate because it triggers the slow path all the time. We need
-        // a better way to communicate whether this was a miss or null,
-        // boolean, undefined, etc.
-        if (oldFiber === null) {
-          oldFiber = nextOldFiber;
+              _created2.return = returnFiber;
+              return _created2;
+            }
         }
 
-        break;
+        if (isArray$1(newChild) || getIteratorFn(newChild)) {
+          var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);
+
+          _created3.return = returnFiber;
+          return _created3;
+        }
+
+        throwOnInvalidObjectType(returnFiber, newChild);
       }
 
-      if (shouldTrackSideEffects) {
-        if (oldFiber && newFiber.alternate === null) {
-          // We matched the slot, but we didn't reuse the existing fiber, so we
-          // need to delete the existing child.
-          deleteChild(returnFiber, oldFiber);
+      {
+        if (typeof newChild === 'function') {
+          warnOnFunctionType();
         }
       }
 
-      lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
+      return null;
+    }
 
-      if (previousNewFiber === null) {
-        // TODO: Move out of the loop. This only happens for the first run.
-        resultingFirstChild = newFiber;
-      } else {
-        // TODO: Defer siblings if we're not at the right index for this slot.
-        // I.e. if we had null values before, then we want to defer this
-        // for each null value. However, we also don't want to call updateSlot
-        // with the previous one.
-        previousNewFiber.sibling = newFiber;
+    function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {
+      // Update the fiber if the keys match, otherwise return null.
+      var key = oldFiber !== null ? oldFiber.key : null;
+
+      if (typeof newChild === 'string' || typeof newChild === 'number') {
+        // Text nodes don't have keys. If the previous node is implicitly keyed
+        // we can continue to replace it without aborting even if it is not a text
+        // node.
+        if (key !== null) {
+          return null;
+        }
+
+        return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);
       }
 
-      previousNewFiber = newFiber;
-      oldFiber = nextOldFiber;
-    }
+      if (typeof newChild === 'object' && newChild !== null) {
+        switch (newChild.$$typeof) {
+          case REACT_ELEMENT_TYPE:
+            {
+              if (newChild.key === key) {
+                if (newChild.type === REACT_FRAGMENT_TYPE) {
+                  return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);
+                }
 
-    if (step.done) {
-      // We've reached the end of the new children. We can delete the rest.
-      deleteRemainingChildren(returnFiber, oldFiber);
-      return resultingFirstChild;
-    }
+                return updateElement(returnFiber, oldFiber, newChild, expirationTime);
+              } else {
+                return null;
+              }
+            }
 
-    if (oldFiber === null) {
-      // If we don't have any more existing children we can choose a fast path
-      // since the rest will all be insertions.
-      for (; !step.done; newIdx++, step = newChildren.next()) {
-        var _newFiber3 = createChild(returnFiber, step.value, expirationTime);
+          case REACT_PORTAL_TYPE:
+            {
+              if (newChild.key === key) {
+                return updatePortal(returnFiber, oldFiber, newChild, expirationTime);
+              } else {
+                return null;
+              }
+            }
+        }
 
-        if (_newFiber3 === null) {
-          continue;
+        if (isArray$1(newChild) || getIteratorFn(newChild)) {
+          if (key !== null) {
+            return null;
+          }
+
+          return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);
         }
 
-        lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
+        throwOnInvalidObjectType(returnFiber, newChild);
+      }
 
-        if (previousNewFiber === null) {
-          // TODO: Move out of the loop. This only happens for the first run.
-          resultingFirstChild = _newFiber3;
-        } else {
-          previousNewFiber.sibling = _newFiber3;
+      {
+        if (typeof newChild === 'function') {
+          warnOnFunctionType();
         }
+      }
+
+      return null;
+    }
 
-        previousNewFiber = _newFiber3;
+    function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {
+      if (typeof newChild === 'string' || typeof newChild === 'number') {
+        // Text nodes don't have keys, so we neither have to check the old nor
+        // new node for the key. If both are text nodes, they match.
+        var matchedFiber = existingChildren.get(newIdx) || null;
+        return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);
       }
 
-      return resultingFirstChild;
-    } // Add all children to a key map for quick lookups.
+      if (typeof newChild === 'object' && newChild !== null) {
+        switch (newChild.$$typeof) {
+          case REACT_ELEMENT_TYPE:
+            {
+              var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
 
+              if (newChild.type === REACT_FRAGMENT_TYPE) {
+                return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);
+              }
 
-    var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
+              return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);
+            }
 
-    for (; !step.done; newIdx++, step = newChildren.next()) {
-      var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);
+          case REACT_PORTAL_TYPE:
+            {
+              var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
 
-      if (_newFiber4 !== null) {
-        if (shouldTrackSideEffects) {
-          if (_newFiber4.alternate !== null) {
-            // The new fiber is a work in progress, but if there exists a
-            // current, that means that we reused the fiber. We need to delete
-            // it from the child list so that we don't add it to the deletion
-            // list.
-            existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
-          }
+              return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);
+            }
         }
 
-        lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
+        if (isArray$1(newChild) || getIteratorFn(newChild)) {
+          var _matchedFiber3 = existingChildren.get(newIdx) || null;
 
-        if (previousNewFiber === null) {
-          resultingFirstChild = _newFiber4;
-        } else {
-          previousNewFiber.sibling = _newFiber4;
+          return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);
         }
 
-        previousNewFiber = _newFiber4;
+        throwOnInvalidObjectType(returnFiber, newChild);
       }
-    }
 
-    if (shouldTrackSideEffects) {
-      // Any existing children that weren't consumed above were deleted. We need
-      // to add them to the deletion list.
-      existingChildren.forEach(function (child) {
-        return deleteChild(returnFiber, child);
-      });
+      {
+        if (typeof newChild === 'function') {
+          warnOnFunctionType();
+        }
+      }
+
+      return null;
     }
+    /**
+     * Warns if there is a duplicate or missing key
+     */
 
-    return resultingFirstChild;
-  }
 
-  function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {
-    // There's no need to check for keys on text nodes since we don't have a
-    // way to define them.
-    if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
-      // We already have an existing node so let's just update it and delete
-      // the rest.
-      deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
-      var existing = useFiber(currentFirstChild, textContent, expirationTime);
-      existing.return = returnFiber;
-      return existing;
-    } // The existing first child is not a text node so we need to create one
-    // and delete the existing ones.
+    function warnOnInvalidKey(child, knownKeys) {
+      {
+        if (typeof child !== 'object' || child === null) {
+          return knownKeys;
+        }
 
+        switch (child.$$typeof) {
+          case REACT_ELEMENT_TYPE:
+          case REACT_PORTAL_TYPE:
+            warnForMissingKey(child);
+            var key = child.key;
 
-    deleteRemainingChildren(returnFiber, currentFirstChild);
-    var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
-    created.return = returnFiber;
-    return created;
-  }
+            if (typeof key !== 'string') {
+              break;
+            }
 
-  function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {
-    var key = element.key;
-    var child = currentFirstChild;
+            if (knownKeys === null) {
+              knownKeys = new Set();
+              knownKeys.add(key);
+              break;
+            }
 
-    while (child !== null) {
-      // TODO: If key === null and child.key === null, then this only applies to
-      // the first item in the list.
-      if (child.key === key) {
-        if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.elementType === element.type || ( // Keep this check inline so it only runs on the false path:
-        isCompatibleFamilyForHotReloading(child, element))) {
-          deleteRemainingChildren(returnFiber, child.sibling);
-          var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);
-          existing.ref = coerceRef(returnFiber, child, element);
-          existing.return = returnFiber;
+            if (!knownKeys.has(key)) {
+              knownKeys.add(key);
+              break;
+            }
 
-          {
-            existing._debugSource = element._source;
-            existing._debugOwner = element._owner;
-          }
+            error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);
 
-          return existing;
-        } else {
-          deleteRemainingChildren(returnFiber, child);
-          break;
+            break;
         }
-      } else {
-        deleteChild(returnFiber, child);
       }
 
-      child = child.sibling;
+      return knownKeys;
     }
 
-    if (element.type === REACT_FRAGMENT_TYPE) {
-      var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);
-      created.return = returnFiber;
-      return created;
-    } else {
-      var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);
+    function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {
+      // This algorithm can't optimize by searching from both ends since we
+      // don't have backpointers on fibers. I'm trying to see how far we can get
+      // with that model. If it ends up not being worth the tradeoffs, we can
+      // add it later.
+      // Even with a two ended optimization, we'd want to optimize for the case
+      // where there are few changes and brute force the comparison instead of
+      // going for the Map. It'd like to explore hitting that path first in
+      // forward-only mode and only go for the Map once we notice that we need
+      // lots of look ahead. This doesn't handle reversal as well as two ended
+      // search but that's unusual. Besides, for the two ended optimization to
+      // work on Iterables, we'd need to copy the whole set.
+      // In this first iteration, we'll just live with hitting the bad case
+      // (adding everything to a Map) in for every insert/move.
+      // If you change this code, also update reconcileChildrenIterator() which
+      // uses the same algorithm.
+      {
+        // First, validate keys.
+        var knownKeys = null;
 
-      _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
-      _created4.return = returnFiber;
-      return _created4;
-    }
-  }
+        for (var i = 0; i < newChildren.length; i++) {
+          var child = newChildren[i];
+          knownKeys = warnOnInvalidKey(child, knownKeys);
+        }
+      }
 
-  function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {
-    var key = portal.key;
-    var child = currentFirstChild;
+      var resultingFirstChild = null;
+      var previousNewFiber = null;
+      var oldFiber = currentFirstChild;
+      var lastPlacedIndex = 0;
+      var newIdx = 0;
+      var nextOldFiber = null;
 
-    while (child !== null) {
-      // TODO: If key === null and child.key === null, then this only applies to
-      // the first item in the list.
-      if (child.key === key) {
-        if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
-          deleteRemainingChildren(returnFiber, child.sibling);
-          var existing = useFiber(child, portal.children || [], expirationTime);
-          existing.return = returnFiber;
-          return existing;
+      for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
+        if (oldFiber.index > newIdx) {
+          nextOldFiber = oldFiber;
+          oldFiber = null;
         } else {
-          deleteRemainingChildren(returnFiber, child);
-          break;
+          nextOldFiber = oldFiber.sibling;
         }
-      } else {
-        deleteChild(returnFiber, child);
-      }
 
-      child = child.sibling;
-    }
-
-    var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
-    created.return = returnFiber;
-    return created;
-  } // This API will tag the children with the side-effect of the reconciliation
-  // itself. They will be added to the side-effect list as we pass through the
-  // children and the parent.
+        var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);
 
+        if (newFiber === null) {
+          // TODO: This breaks on empty slots like null children. That's
+          // unfortunate because it triggers the slow path all the time. We need
+          // a better way to communicate whether this was a miss or null,
+          // boolean, undefined, etc.
+          if (oldFiber === null) {
+            oldFiber = nextOldFiber;
+          }
 
-  function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {
-    // This function is not recursive.
-    // If the top level item is an array, we treat it as a set of children,
-    // not as a fragment. Nested arrays on the other hand will be treated as
-    // fragment nodes. Recursion happens at the normal flow.
-    // Handle top level unkeyed fragments as if they were arrays.
-    // This leads to an ambiguity between <>{[...]}</> and <>...</>.
-    // We treat the ambiguous cases above the same.
-    var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
+          break;
+        }
 
-    if (isUnkeyedTopLevelFragment) {
-      newChild = newChild.props.children;
-    } // Handle object types
+        if (shouldTrackSideEffects) {
+          if (oldFiber && newFiber.alternate === null) {
+            // We matched the slot, but we didn't reuse the existing fiber, so we
+            // need to delete the existing child.
+            deleteChild(returnFiber, oldFiber);
+          }
+        }
 
+        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
 
-    var isObject = typeof newChild === 'object' && newChild !== null;
+        if (previousNewFiber === null) {
+          // TODO: Move out of the loop. This only happens for the first run.
+          resultingFirstChild = newFiber;
+        } else {
+          // TODO: Defer siblings if we're not at the right index for this slot.
+          // I.e. if we had null values before, then we want to defer this
+          // for each null value. However, we also don't want to call updateSlot
+          // with the previous one.
+          previousNewFiber.sibling = newFiber;
+        }
 
-    if (isObject) {
-      switch (newChild.$$typeof) {
-        case REACT_ELEMENT_TYPE:
-          return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));
+        previousNewFiber = newFiber;
+        oldFiber = nextOldFiber;
+      }
 
-        case REACT_PORTAL_TYPE:
-          return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));
+      if (newIdx === newChildren.length) {
+        // We've reached the end of the new children. We can delete the rest.
+        deleteRemainingChildren(returnFiber, oldFiber);
+        return resultingFirstChild;
       }
-    }
 
-    if (typeof newChild === 'string' || typeof newChild === 'number') {
-      return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));
-    }
+      if (oldFiber === null) {
+        // If we don't have any more existing children we can choose a fast path
+        // since the rest will all be insertions.
+        for (; newIdx < newChildren.length; newIdx++) {
+          var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);
 
-    if (isArray(newChild)) {
-      return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);
-    }
+          if (_newFiber === null) {
+            continue;
+          }
 
-    if (getIteratorFn(newChild)) {
-      return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);
-    }
+          lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
 
-    if (isObject) {
-      throwOnInvalidObjectType(returnFiber, newChild);
-    }
+          if (previousNewFiber === null) {
+            // TODO: Move out of the loop. This only happens for the first run.
+            resultingFirstChild = _newFiber;
+          } else {
+            previousNewFiber.sibling = _newFiber;
+          }
 
-    {
-      if (typeof newChild === 'function') {
-        warnOnFunctionType();
-      }
-    }
+          previousNewFiber = _newFiber;
+        }
 
-    if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {
-      // If the new child is undefined, and the return fiber is a composite
-      // component, throw an error. If Fiber return types are disabled,
-      // we already threw above.
-      switch (returnFiber.tag) {
-        case ClassComponent:
-          {
-            {
-              var instance = returnFiber.stateNode;
+        return resultingFirstChild;
+      } // Add all children to a key map for quick lookups.
 
-              if (instance.render._isMockFunction) {
-                // We allow auto-mocks to proceed as if they're returning null.
-                break;
-              }
+
+      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
+
+      for (; newIdx < newChildren.length; newIdx++) {
+        var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);
+
+        if (_newFiber2 !== null) {
+          if (shouldTrackSideEffects) {
+            if (_newFiber2.alternate !== null) {
+              // The new fiber is a work in progress, but if there exists a
+              // current, that means that we reused the fiber. We need to delete
+              // it from the child list so that we don't add it to the deletion
+              // list.
+              existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
             }
           }
-        // Intentionally fall through to the next case, which handles both
-        // functions and classes
-        // eslint-disable-next-lined no-fallthrough
 
-        case FunctionComponent:
-          {
-            var Component = returnFiber.type;
+          lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
 
-            {
-              {
-                throw Error((Component.displayName || Component.name || 'Component') + "(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.");
-              }
-            }
+          if (previousNewFiber === null) {
+            resultingFirstChild = _newFiber2;
+          } else {
+            previousNewFiber.sibling = _newFiber2;
           }
+
+          previousNewFiber = _newFiber2;
+        }
       }
-    } // Remaining cases are all treated as empty.
 
+      if (shouldTrackSideEffects) {
+        // Any existing children that weren't consumed above were deleted. We need
+        // to add them to the deletion list.
+        existingChildren.forEach(function (child) {
+          return deleteChild(returnFiber, child);
+        });
+      }
 
-    return deleteRemainingChildren(returnFiber, currentFirstChild);
-  }
+      return resultingFirstChild;
+    }
 
-  return reconcileChildFibers;
-}
+    function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {
+      // This is the same implementation as reconcileChildrenArray(),
+      // but using the iterator instead.
+      var iteratorFn = getIteratorFn(newChildrenIterable);
 
-var reconcileChildFibers = ChildReconciler(true);
-var mountChildFibers = ChildReconciler(false);
-function cloneChildFibers(current$$1, workInProgress) {
-  if (!(current$$1 === null || workInProgress.child === current$$1.child)) {
-    {
-      throw Error("Resuming work not yet implemented.");
-    }
-  }
+      if (!(typeof iteratorFn === 'function')) {
+        {
+          throw Error( "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue." );
+        }
+      }
 
-  if (workInProgress.child === null) {
-    return;
-  }
+      {
+        // We don't support rendering Generators because it's a mutation.
+        // See https://github.com/facebook/react/issues/12995
+        if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag
+        newChildrenIterable[Symbol.toStringTag] === 'Generator') {
+          if (!didWarnAboutGenerators) {
+            error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');
+          }
 
-  var currentChild = workInProgress.child;
-  var newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
-  workInProgress.child = newChild;
-  newChild.return = workInProgress;
+          didWarnAboutGenerators = true;
+        } // Warn about using Maps as children
 
-  while (currentChild.sibling !== null) {
-    currentChild = currentChild.sibling;
-    newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);
-    newChild.return = workInProgress;
-  }
 
-  newChild.sibling = null;
-} // Reset a workInProgress child set to prepare it for a second pass.
+        if (newChildrenIterable.entries === iteratorFn) {
+          if (!didWarnAboutMaps) {
+            error('Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.');
+          }
 
-function resetChildFibers(workInProgress, renderExpirationTime) {
-  var child = workInProgress.child;
+          didWarnAboutMaps = true;
+        } // First, validate keys.
+        // We'll get a different iterator later for the main pass.
 
-  while (child !== null) {
-    resetWorkInProgress(child, renderExpirationTime);
-    child = child.sibling;
-  }
-}
 
-var NO_CONTEXT = {};
-var contextStackCursor$1 = createCursor(NO_CONTEXT);
-var contextFiberStackCursor = createCursor(NO_CONTEXT);
-var rootInstanceStackCursor = createCursor(NO_CONTEXT);
+        var _newChildren = iteratorFn.call(newChildrenIterable);
 
-function requiredContext(c) {
-  if (!(c !== NO_CONTEXT)) {
-    {
-      throw Error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.");
-    }
-  }
-
-  return c;
-}
-
-function getRootHostContainer() {
-  var rootInstance = requiredContext(rootInstanceStackCursor.current);
-  return rootInstance;
-}
-
-function pushHostContainer(fiber, nextRootInstance) {
-  // Push current root instance onto the stack;
-  // This allows us to reset root when portals are popped.
-  push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.
-  // This enables us to pop only Fibers that provide unique contexts.
-
-  push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.
-  // However, we can't just call getRootHostContext() and push it because
-  // we'd have a different number of entries on the stack depending on
-  // whether getRootHostContext() throws somewhere in renderer code or not.
-  // So we push an empty value first. This lets us safely unwind on errors.
-
-  push(contextStackCursor$1, NO_CONTEXT, fiber);
-  var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.
-
-  pop(contextStackCursor$1, fiber);
-  push(contextStackCursor$1, nextRootContext, fiber);
-}
-
-function popHostContainer(fiber) {
-  pop(contextStackCursor$1, fiber);
-  pop(contextFiberStackCursor, fiber);
-  pop(rootInstanceStackCursor, fiber);
-}
-
-function getHostContext() {
-  var context = requiredContext(contextStackCursor$1.current);
-  return context;
-}
-
-function pushHostContext(fiber) {
-  var rootInstance = requiredContext(rootInstanceStackCursor.current);
-  var context = requiredContext(contextStackCursor$1.current);
-  var nextContext = getChildHostContext(context, fiber.type, rootInstance); // Don't push this Fiber's context unless it's unique.
-
-  if (context === nextContext) {
-    return;
-  } // Track the context and the Fiber that provided it.
-  // This enables us to pop only Fibers that provide unique contexts.
-
-
-  push(contextFiberStackCursor, fiber, fiber);
-  push(contextStackCursor$1, nextContext, fiber);
-}
-
-function popHostContext(fiber) {
-  // Do not pop unless this Fiber provided the current context.
-  // pushHostContext() only pushes Fibers that provide unique contexts.
-  if (contextFiberStackCursor.current !== fiber) {
-    return;
-  }
-
-  pop(contextStackCursor$1, fiber);
-  pop(contextFiberStackCursor, fiber);
-}
-
-var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is
-// inherited deeply down the subtree. The upper bits only affect
-// this immediate suspense boundary and gets reset each new
-// boundary or suspense list.
-
-var SubtreeSuspenseContextMask = 1; // Subtree Flags:
-// InvisibleParentSuspenseContext indicates that one of our parent Suspense
-// boundaries is not currently showing visible main content.
-// Either because it is already showing a fallback or is not mounted at all.
-// We can use this to determine if it is desirable to trigger a fallback at
-// the parent. If not, then we might need to trigger undesirable boundaries
-// and/or suspend the commit to avoid hiding the parent content.
-
-var InvisibleParentSuspenseContext = 1; // Shallow Flags:
-// ForceSuspenseFallback can be used by SuspenseList to force newly added
-// items into their fallback state during one of the render passes.
-
-var ForceSuspenseFallback = 2;
-var suspenseStackCursor = createCursor(DefaultSuspenseContext);
-function hasSuspenseContext(parentContext, flag) {
-  return (parentContext & flag) !== 0;
-}
-function setDefaultShallowSuspenseContext(parentContext) {
-  return parentContext & SubtreeSuspenseContextMask;
-}
-function setShallowSuspenseContext(parentContext, shallowContext) {
-  return parentContext & SubtreeSuspenseContextMask | shallowContext;
-}
-function addSubtreeSuspenseContext(parentContext, subtreeContext) {
-  return parentContext | subtreeContext;
-}
-function pushSuspenseContext(fiber, newContext) {
-  push(suspenseStackCursor, newContext, fiber);
-}
-function popSuspenseContext(fiber) {
-  pop(suspenseStackCursor, fiber);
-}
-
-function shouldCaptureSuspense(workInProgress, hasInvisibleParent) {
-  // If it was the primary children that just suspended, capture and render the
-  // fallback. Otherwise, don't capture and bubble to the next boundary.
-  var nextState = workInProgress.memoizedState;
-
-  if (nextState !== null) {
-    if (nextState.dehydrated !== null) {
-      // A dehydrated boundary always captures.
-      return true;
-    }
+        if (_newChildren) {
+          var knownKeys = null;
 
-    return false;
-  }
+          var _step = _newChildren.next();
 
-  var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop.
+          for (; !_step.done; _step = _newChildren.next()) {
+            var child = _step.value;
+            knownKeys = warnOnInvalidKey(child, knownKeys);
+          }
+        }
+      }
 
-  if (props.fallback === undefined) {
-    return false;
-  } // Regular boundaries always capture.
+      var newChildren = iteratorFn.call(newChildrenIterable);
 
+      if (!(newChildren != null)) {
+        {
+          throw Error( "An iterable object provided no iterator." );
+        }
+      }
 
-  if (props.unstable_avoidThisFallback !== true) {
-    return true;
-  } // If it's a boundary we should avoid, then we prefer to bubble up to the
-  // parent boundary if it is currently invisible.
+      var resultingFirstChild = null;
+      var previousNewFiber = null;
+      var oldFiber = currentFirstChild;
+      var lastPlacedIndex = 0;
+      var newIdx = 0;
+      var nextOldFiber = null;
+      var step = newChildren.next();
 
+      for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
+        if (oldFiber.index > newIdx) {
+          nextOldFiber = oldFiber;
+          oldFiber = null;
+        } else {
+          nextOldFiber = oldFiber.sibling;
+        }
 
-  if (hasInvisibleParent) {
-    return false;
-  } // If the parent is not able to handle it, we must handle it.
+        var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);
 
+        if (newFiber === null) {
+          // TODO: This breaks on empty slots like null children. That's
+          // unfortunate because it triggers the slow path all the time. We need
+          // a better way to communicate whether this was a miss or null,
+          // boolean, undefined, etc.
+          if (oldFiber === null) {
+            oldFiber = nextOldFiber;
+          }
 
-  return true;
-}
-function findFirstSuspended(row) {
-  var node = row;
+          break;
+        }
 
-  while (node !== null) {
-    if (node.tag === SuspenseComponent) {
-      var state = node.memoizedState;
+        if (shouldTrackSideEffects) {
+          if (oldFiber && newFiber.alternate === null) {
+            // We matched the slot, but we didn't reuse the existing fiber, so we
+            // need to delete the existing child.
+            deleteChild(returnFiber, oldFiber);
+          }
+        }
 
-      if (state !== null) {
-        var dehydrated = state.dehydrated;
+        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
 
-        if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {
-          return node;
+        if (previousNewFiber === null) {
+          // TODO: Move out of the loop. This only happens for the first run.
+          resultingFirstChild = newFiber;
+        } else {
+          // TODO: Defer siblings if we're not at the right index for this slot.
+          // I.e. if we had null values before, then we want to defer this
+          // for each null value. However, we also don't want to call updateSlot
+          // with the previous one.
+          previousNewFiber.sibling = newFiber;
         }
+
+        previousNewFiber = newFiber;
+        oldFiber = nextOldFiber;
       }
-    } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't
-    // keep track of whether it suspended or not.
-    node.memoizedProps.revealOrder !== undefined) {
-      var didSuspend = (node.effectTag & DidCapture) !== NoEffect;
 
-      if (didSuspend) {
-        return node;
+      if (step.done) {
+        // We've reached the end of the new children. We can delete the rest.
+        deleteRemainingChildren(returnFiber, oldFiber);
+        return resultingFirstChild;
       }
-    } else if (node.child !== null) {
-      node.child.return = node;
-      node = node.child;
-      continue;
-    }
 
-    if (node === row) {
-      return null;
-    }
+      if (oldFiber === null) {
+        // If we don't have any more existing children we can choose a fast path
+        // since the rest will all be insertions.
+        for (; !step.done; newIdx++, step = newChildren.next()) {
+          var _newFiber3 = createChild(returnFiber, step.value, expirationTime);
 
-    while (node.sibling === null) {
-      if (node.return === null || node.return === row) {
-        return null;
-      }
+          if (_newFiber3 === null) {
+            continue;
+          }
 
-      node = node.return;
-    }
+          lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
 
-    node.sibling.return = node.return;
-    node = node.sibling;
-  }
+          if (previousNewFiber === null) {
+            // TODO: Move out of the loop. This only happens for the first run.
+            resultingFirstChild = _newFiber3;
+          } else {
+            previousNewFiber.sibling = _newFiber3;
+          }
 
-  return null;
-}
+          previousNewFiber = _newFiber3;
+        }
 
-var emptyObject = {};
-var isArray$2 = Array.isArray;
-function createResponderInstance(responder, responderProps, responderState, fiber) {
-  return {
-    fiber: fiber,
-    props: responderProps,
-    responder: responder,
-    rootEventTypes: null,
-    state: responderState
-  };
-}
+        return resultingFirstChild;
+      } // Add all children to a key map for quick lookups.
 
-function mountEventResponder$1(responder, responderProps, fiber, respondersMap, rootContainerInstance) {
-  var responderState = emptyObject;
-  var getInitialState = responder.getInitialState;
 
-  if (getInitialState !== null) {
-    responderState = getInitialState(responderProps);
-  }
+      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
 
-  var responderInstance = createResponderInstance(responder, responderProps, responderState, fiber);
+      for (; !step.done; newIdx++, step = newChildren.next()) {
+        var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);
+
+        if (_newFiber4 !== null) {
+          if (shouldTrackSideEffects) {
+            if (_newFiber4.alternate !== null) {
+              // The new fiber is a work in progress, but if there exists a
+              // current, that means that we reused the fiber. We need to delete
+              // it from the child list so that we don't add it to the deletion
+              // list.
+              existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
+            }
+          }
 
-  if (!rootContainerInstance) {
-    var node = fiber;
+          lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
 
-    while (node !== null) {
-      var tag = node.tag;
+          if (previousNewFiber === null) {
+            resultingFirstChild = _newFiber4;
+          } else {
+            previousNewFiber.sibling = _newFiber4;
+          }
 
-      if (tag === HostComponent) {
-        rootContainerInstance = node.stateNode;
-        break;
-      } else if (tag === HostRoot) {
-        rootContainerInstance = node.stateNode.containerInfo;
-        break;
+          previousNewFiber = _newFiber4;
+        }
       }
 
-      node = node.return;
-    }
-  }
-
-  mountResponderInstance(responder, responderInstance, responderProps, responderState, rootContainerInstance);
-  respondersMap.set(responder, responderInstance);
-}
-
-function updateEventListener(listener, fiber, visistedResponders, respondersMap, rootContainerInstance) {
-  var responder;
-  var props;
-
-  if (listener) {
-    responder = listener.responder;
-    props = listener.props;
-  }
+      if (shouldTrackSideEffects) {
+        // Any existing children that weren't consumed above were deleted. We need
+        // to add them to the deletion list.
+        existingChildren.forEach(function (child) {
+          return deleteChild(returnFiber, child);
+        });
+      }
 
-  if (!(responder && responder.$$typeof === REACT_RESPONDER_TYPE)) {
-    {
-      throw Error("An invalid value was used as an event listener. Expect one or many event listeners created via React.unstable_useResponder().");
+      return resultingFirstChild;
     }
-  }
 
-  var listenerProps = props;
+    function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {
+      // There's no need to check for keys on text nodes since we don't have a
+      // way to define them.
+      if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
+        // We already have an existing node so let's just update it and delete
+        // the rest.
+        deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
+        var existing = useFiber(currentFirstChild, textContent);
+        existing.return = returnFiber;
+        return existing;
+      } // The existing first child is not a text node so we need to create one
+      // and delete the existing ones.
 
-  if (visistedResponders.has(responder)) {
-    // show warning
-    {
-      warning$1(false, 'Duplicate event responder "%s" found in event listeners. ' + 'Event listeners passed to elements cannot use the same event responder more than once.', responder.displayName);
+
+      deleteRemainingChildren(returnFiber, currentFirstChild);
+      var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);
+      created.return = returnFiber;
+      return created;
     }
 
-    return;
-  }
+    function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {
+      var key = element.key;
+      var child = currentFirstChild;
 
-  visistedResponders.add(responder);
-  var responderInstance = respondersMap.get(responder);
+      while (child !== null) {
+        // TODO: If key === null and child.key === null, then this only applies to
+        // the first item in the list.
+        if (child.key === key) {
+          switch (child.tag) {
+            case Fragment:
+              {
+                if (element.type === REACT_FRAGMENT_TYPE) {
+                  deleteRemainingChildren(returnFiber, child.sibling);
+                  var existing = useFiber(child, element.props.children);
+                  existing.return = returnFiber;
+
+                  {
+                    existing._debugSource = element._source;
+                    existing._debugOwner = element._owner;
+                  }
 
-  if (responderInstance === undefined) {
-    // Mount (happens in either complete or commit phase)
-    mountEventResponder$1(responder, listenerProps, fiber, respondersMap, rootContainerInstance);
-  } else {
-    // Update (happens during commit phase only)
-    responderInstance.props = listenerProps;
-    responderInstance.fiber = fiber;
-  }
-}
+                  return existing;
+                }
 
-function updateEventListeners(listeners, fiber, rootContainerInstance) {
-  var visistedResponders = new Set();
-  var dependencies = fiber.dependencies;
+                break;
+              }
 
-  if (listeners != null) {
-    if (dependencies === null) {
-      dependencies = fiber.dependencies = {
-        expirationTime: NoWork,
-        firstContext: null,
-        responders: new Map()
-      };
-    }
+            case Block:
 
-    var respondersMap = dependencies.responders;
+            // We intentionally fallthrough here if enableBlocksAPI is not on.
+            // eslint-disable-next-lined no-fallthrough
 
-    if (respondersMap === null) {
-      respondersMap = new Map();
-    }
+            default:
+              {
+                if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path:
+                 isCompatibleFamilyForHotReloading(child, element) )) {
+                  deleteRemainingChildren(returnFiber, child.sibling);
 
-    if (isArray$2(listeners)) {
-      for (var i = 0, length = listeners.length; i < length; i++) {
-        var listener = listeners[i];
-        updateEventListener(listener, fiber, visistedResponders, respondersMap, rootContainerInstance);
-      }
-    } else {
-      updateEventListener(listeners, fiber, visistedResponders, respondersMap, rootContainerInstance);
-    }
-  }
+                  var _existing3 = useFiber(child, element.props);
 
-  if (dependencies !== null) {
-    var _respondersMap = dependencies.responders;
+                  _existing3.ref = coerceRef(returnFiber, child, element);
+                  _existing3.return = returnFiber;
 
-    if (_respondersMap !== null) {
-      // Unmount
-      var mountedResponders = Array.from(_respondersMap.keys());
+                  {
+                    _existing3._debugSource = element._source;
+                    _existing3._debugOwner = element._owner;
+                  }
 
-      for (var _i = 0, _length = mountedResponders.length; _i < _length; _i++) {
-        var mountedResponder = mountedResponders[_i];
+                  return _existing3;
+                }
 
-        if (!visistedResponders.has(mountedResponder)) {
-          var responderInstance = _respondersMap.get(mountedResponder);
+                break;
+              }
+          } // Didn't match.
 
-          unmountResponderInstance(responderInstance);
 
-          _respondersMap.delete(mountedResponder);
+          deleteRemainingChildren(returnFiber, child);
+          break;
+        } else {
+          deleteChild(returnFiber, child);
         }
+
+        child = child.sibling;
       }
-    }
-  }
-}
-function createResponderListener(responder, props) {
-  var eventResponderListener = {
-    responder: responder,
-    props: props
-  };
 
-  {
-    Object.freeze(eventResponderListener);
-  }
-
-  return eventResponderListener;
-}
-
-var NoEffect$1 =
-/*             */
-0;
-var UnmountSnapshot =
-/*      */
-2;
-var UnmountMutation =
-/*      */
-4;
-var MountMutation =
-/*        */
-8;
-var UnmountLayout =
-/*        */
-16;
-var MountLayout =
-/*          */
-32;
-var MountPassive =
-/*         */
-64;
-var UnmountPassive =
-/*       */
-128;
-
-var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
-var ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;
-var didWarnAboutMismatchedHooksForComponent;
-
-{
-  didWarnAboutMismatchedHooksForComponent = new Set();
-}
-
-// These are set right before calling the component.
-var renderExpirationTime$1 = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from
-// the work-in-progress hook.
-
-var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The
-// current hook list is the list that belongs to the current fiber. The
-// work-in-progress hook list is a new list that will be added to the
-// work-in-progress fiber.
-
-var currentHook = null;
-var nextCurrentHook = null;
-var firstWorkInProgressHook = null;
-var workInProgressHook = null;
-var nextWorkInProgressHook = null;
-var remainingExpirationTime = NoWork;
-var componentUpdateQueue = null;
-var sideEffectTag = 0; // Updates scheduled during render will trigger an immediate re-render at the
-// end of the current pass. We can't store these updates on the normal queue,
-// because if the work is aborted, they should be discarded. Because this is
-// a relatively rare case, we also don't want to add an additional field to
-// either the hook or queue object types. So we store them in a lazily create
-// map of queue -> render-phase updates, which are discarded once the component
-// completes without re-rendering.
-// Whether an update was scheduled during the currently executing render pass.
-
-var didScheduleRenderPhaseUpdate = false; // Lazily created map of render-phase updates
-
-var renderPhaseUpdates = null; // Counter to prevent infinite loops.
-
-var numberOfReRenders = 0;
-var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook
-
-var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.
-// The list stores the order of hooks used during the initial render (mount).
-// Subsequent renders (updates) reference this list.
-
-var hookTypesDev = null;
-var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore
-// the dependencies for Hooks that need them (e.g. useEffect or useMemo).
-// When true, such Hooks will always be "remounted". Only used during hot reload.
-
-var ignorePreviousDependencies = false;
-
-function mountHookTypesDev() {
-  {
-    var hookName = currentHookNameInDev;
+      if (element.type === REACT_FRAGMENT_TYPE) {
+        var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);
+        created.return = returnFiber;
+        return created;
+      } else {
+        var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);
 
-    if (hookTypesDev === null) {
-      hookTypesDev = [hookName];
-    } else {
-      hookTypesDev.push(hookName);
+        _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
+        _created4.return = returnFiber;
+        return _created4;
+      }
     }
-  }
-}
 
-function updateHookTypesDev() {
-  {
-    var hookName = currentHookNameInDev;
+    function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {
+      var key = portal.key;
+      var child = currentFirstChild;
 
-    if (hookTypesDev !== null) {
-      hookTypesUpdateIndexDev++;
+      while (child !== null) {
+        // TODO: If key === null and child.key === null, then this only applies to
+        // the first item in the list.
+        if (child.key === key) {
+          if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
+            deleteRemainingChildren(returnFiber, child.sibling);
+            var existing = useFiber(child, portal.children || []);
+            existing.return = returnFiber;
+            return existing;
+          } else {
+            deleteRemainingChildren(returnFiber, child);
+            break;
+          }
+        } else {
+          deleteChild(returnFiber, child);
+        }
 
-      if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {
-        warnOnHookMismatchInDev(hookName);
+        child = child.sibling;
       }
-    }
-  }
-}
 
-function checkDepsAreArrayDev(deps) {
-  {
-    if (deps !== undefined && deps !== null && !Array.isArray(deps)) {
-      // Verify deps, but only on mount to avoid extra checks.
-      // It's unlikely their type would change as usually you define them inline.
-      warning$1(false, '%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);
-    }
-  }
-}
+      var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);
+      created.return = returnFiber;
+      return created;
+    } // This API will tag the children with the side-effect of the reconciliation
+    // itself. They will be added to the side-effect list as we pass through the
+    // children and the parent.
 
-function warnOnHookMismatchInDev(currentHookName) {
-  {
-    var componentName = getComponentName(currentlyRenderingFiber$1.type);
 
-    if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
-      didWarnAboutMismatchedHooksForComponent.add(componentName);
+    function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {
+      // This function is not recursive.
+      // If the top level item is an array, we treat it as a set of children,
+      // not as a fragment. Nested arrays on the other hand will be treated as
+      // fragment nodes. Recursion happens at the normal flow.
+      // Handle top level unkeyed fragments as if they were arrays.
+      // This leads to an ambiguity between <>{[...]}</> and <>...</>.
+      // We treat the ambiguous cases above the same.
+      var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
 
-      if (hookTypesDev !== null) {
-        var table = '';
-        var secondColumnStart = 30;
+      if (isUnkeyedTopLevelFragment) {
+        newChild = newChild.props.children;
+      } // Handle object types
 
-        for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {
-          var oldHookName = hookTypesDev[i];
-          var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;
-          var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up
-          // lol @ IE not supporting String#repeat
 
-          while (row.length < secondColumnStart) {
-            row += ' ';
-          }
+      var isObject = typeof newChild === 'object' && newChild !== null;
 
-          row += newHookName + '\n';
-          table += row;
-        }
+      if (isObject) {
+        switch (newChild.$$typeof) {
+          case REACT_ELEMENT_TYPE:
+            return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));
 
-        warning$1(false, 'React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\n\n' + '   Previous render            Next render\n' + '   ------------------------------------------------------\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table);
+          case REACT_PORTAL_TYPE:
+            return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));
+        }
       }
-    }
-  }
-}
-
-function throwInvalidHookError() {
-  {
-    {
-      throw Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.");
-    }
-  }
-}
 
-function areHookInputsEqual(nextDeps, prevDeps) {
-  {
-    if (ignorePreviousDependencies) {
-      // Only true when this component is being hot reloaded.
-      return false;
-    }
-  }
+      if (typeof newChild === 'string' || typeof newChild === 'number') {
+        return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));
+      }
 
-  if (prevDeps === null) {
-    {
-      warning$1(false, '%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);
-    }
+      if (isArray$1(newChild)) {
+        return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);
+      }
 
-    return false;
-  }
+      if (getIteratorFn(newChild)) {
+        return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);
+      }
 
-  {
-    // Don't bother comparing lengths in prod because these arrays should be
-    // passed inline.
-    if (nextDeps.length !== prevDeps.length) {
-      warning$1(false, 'The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]");
-    }
-  }
+      if (isObject) {
+        throwOnInvalidObjectType(returnFiber, newChild);
+      }
 
-  for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
-    if (is$1(nextDeps[i], prevDeps[i])) {
-      continue;
-    }
+      {
+        if (typeof newChild === 'function') {
+          warnOnFunctionType();
+        }
+      }
 
-    return false;
-  }
+      if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {
+        // If the new child is undefined, and the return fiber is a composite
+        // component, throw an error. If Fiber return types are disabled,
+        // we already threw above.
+        switch (returnFiber.tag) {
+          case ClassComponent:
+            {
+              {
+                var instance = returnFiber.stateNode;
 
-  return true;
-}
+                if (instance.render._isMockFunction) {
+                  // We allow auto-mocks to proceed as if they're returning null.
+                  break;
+                }
+              }
+            }
+          // Intentionally fall through to the next case, which handles both
+          // functions and classes
+          // eslint-disable-next-lined no-fallthrough
 
-function renderWithHooks(current, workInProgress, Component, props, refOrContext, nextRenderExpirationTime) {
-  renderExpirationTime$1 = nextRenderExpirationTime;
-  currentlyRenderingFiber$1 = workInProgress;
-  nextCurrentHook = current !== null ? current.memoizedState : null;
+          case FunctionComponent:
+            {
+              var Component = returnFiber.type;
 
-  {
-    hookTypesDev = current !== null ? current._debugHookTypes : null;
-    hookTypesUpdateIndexDev = -1; // Used for hot reloading:
-
-    ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;
-  } // The following should have already been reset
-  // currentHook = null;
-  // workInProgressHook = null;
-  // remainingExpirationTime = NoWork;
-  // componentUpdateQueue = null;
-  // didScheduleRenderPhaseUpdate = false;
-  // renderPhaseUpdates = null;
-  // numberOfReRenders = 0;
-  // sideEffectTag = 0;
-  // TODO Warn if no hooks are used at all during mount, then some are used during update.
-  // Currently we will identify the update render as a mount because nextCurrentHook === null.
-  // This is tricky because it's valid for certain types of components (e.g. React.lazy)
-  // Using nextCurrentHook to differentiate between mount/update only works if at least one stateful hook is used.
-  // Non-stateful hooks (e.g. context) don't get added to memoizedState,
-  // so nextCurrentHook would be null during updates and mounts.
+              {
+                {
+                  throw Error( (Component.displayName || Component.name || 'Component') + "(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null." );
+                }
+              }
+            }
+        }
+      } // Remaining cases are all treated as empty.
 
 
-  {
-    if (nextCurrentHook !== null) {
-      ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
-    } else if (hookTypesDev !== null) {
-      // This dispatcher handles an edge case where a component is updating,
-      // but no stateful hooks have been used.
-      // We want to match the production code behavior (which will use HooksDispatcherOnMount),
-      // but with the extra DEV validation to ensure hooks ordering hasn't changed.
-      // This dispatcher does that.
-      ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV;
-    } else {
-      ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV;
+      return deleteRemainingChildren(returnFiber, currentFirstChild);
     }
-  }
-
-  var children = Component(props, refOrContext);
-
-  if (didScheduleRenderPhaseUpdate) {
-    do {
-      didScheduleRenderPhaseUpdate = false;
-      numberOfReRenders += 1;
 
-      {
-        // Even when hot reloading, allow dependencies to stabilize
-        // after first render to prevent infinite render phase updates.
-        ignorePreviousDependencies = false;
-      } // Start over from the beginning of the list
-
-
-      nextCurrentHook = current !== null ? current.memoizedState : null;
-      nextWorkInProgressHook = firstWorkInProgressHook;
-      currentHook = null;
-      workInProgressHook = null;
-      componentUpdateQueue = null;
+    return reconcileChildFibers;
+  }
 
+  var reconcileChildFibers = ChildReconciler(true);
+  var mountChildFibers = ChildReconciler(false);
+  function cloneChildFibers(current, workInProgress) {
+    if (!(current === null || workInProgress.child === current.child)) {
       {
-        // Also validate hook order for cascading updates.
-        hookTypesUpdateIndexDev = -1;
+        throw Error( "Resuming work not yet implemented." );
       }
+    }
 
-      ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
-      children = Component(props, refOrContext);
-    } while (didScheduleRenderPhaseUpdate);
-
-    renderPhaseUpdates = null;
-    numberOfReRenders = 0;
-  } // We can assume the previous dispatcher is always this one, since we set it
-  // at the beginning of the render phase and there's no re-entrancy.
-
-
-  ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
-  var renderedWork = currentlyRenderingFiber$1;
-  renderedWork.memoizedState = firstWorkInProgressHook;
-  renderedWork.expirationTime = remainingExpirationTime;
-  renderedWork.updateQueue = componentUpdateQueue;
-  renderedWork.effectTag |= sideEffectTag;
-
-  {
-    renderedWork._debugHookTypes = hookTypesDev;
-  } // This check uses currentHook so that it works the same in DEV and prod bundles.
-  // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.
+    if (workInProgress.child === null) {
+      return;
+    }
 
+    var currentChild = workInProgress.child;
+    var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);
+    workInProgress.child = newChild;
+    newChild.return = workInProgress;
 
-  var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
-  renderExpirationTime$1 = NoWork;
-  currentlyRenderingFiber$1 = null;
-  currentHook = null;
-  nextCurrentHook = null;
-  firstWorkInProgressHook = null;
-  workInProgressHook = null;
-  nextWorkInProgressHook = null;
+    while (currentChild.sibling !== null) {
+      currentChild = currentChild.sibling;
+      newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);
+      newChild.return = workInProgress;
+    }
 
-  {
-    currentHookNameInDev = null;
-    hookTypesDev = null;
-    hookTypesUpdateIndexDev = -1;
-  }
+    newChild.sibling = null;
+  } // Reset a workInProgress child set to prepare it for a second pass.
 
-  remainingExpirationTime = NoWork;
-  componentUpdateQueue = null;
-  sideEffectTag = 0; // These were reset above
-  // didScheduleRenderPhaseUpdate = false;
-  // renderPhaseUpdates = null;
-  // numberOfReRenders = 0;
+  function resetChildFibers(workInProgress, renderExpirationTime) {
+    var child = workInProgress.child;
 
-  if (!!didRenderTooFewHooks) {
-    {
-      throw Error("Rendered fewer hooks than expected. This may be caused by an accidental early return statement.");
+    while (child !== null) {
+      resetWorkInProgress(child, renderExpirationTime);
+      child = child.sibling;
     }
   }
 
-  return children;
-}
-function bailoutHooks(current, workInProgress, expirationTime) {
-  workInProgress.updateQueue = current.updateQueue;
-  workInProgress.effectTag &= ~(Passive | Update);
-
-  if (current.expirationTime <= expirationTime) {
-    current.expirationTime = NoWork;
-  }
-}
-function resetHooks() {
-  // We can assume the previous dispatcher is always this one, since we set it
-  // at the beginning of the render phase and there's no re-entrancy.
-  ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; // This is used to reset the state of this module when a component throws.
-  // It's also called inside mountIndeterminateComponent if we determine the
-  // component is a module-style component.
-
-  renderExpirationTime$1 = NoWork;
-  currentlyRenderingFiber$1 = null;
-  currentHook = null;
-  nextCurrentHook = null;
-  firstWorkInProgressHook = null;
-  workInProgressHook = null;
-  nextWorkInProgressHook = null;
-
-  {
-    hookTypesDev = null;
-    hookTypesUpdateIndexDev = -1;
-    currentHookNameInDev = null;
-  }
-
-  remainingExpirationTime = NoWork;
-  componentUpdateQueue = null;
-  sideEffectTag = 0;
-  didScheduleRenderPhaseUpdate = false;
-  renderPhaseUpdates = null;
-  numberOfReRenders = 0;
-}
-
-function mountWorkInProgressHook() {
-  var hook = {
-    memoizedState: null,
-    baseState: null,
-    queue: null,
-    baseUpdate: null,
-    next: null
-  };
+  var NO_CONTEXT = {};
+  var contextStackCursor$1 = createCursor(NO_CONTEXT);
+  var contextFiberStackCursor = createCursor(NO_CONTEXT);
+  var rootInstanceStackCursor = createCursor(NO_CONTEXT);
 
-  if (workInProgressHook === null) {
-    // This is the first hook in the list
-    firstWorkInProgressHook = workInProgressHook = hook;
-  } else {
-    // Append to the end of the list
-    workInProgressHook = workInProgressHook.next = hook;
-  }
-
-  return workInProgressHook;
-}
-
-function updateWorkInProgressHook() {
-  // This function is used both for updates and for re-renders triggered by a
-  // render phase update. It assumes there is either a current hook we can
-  // clone, or a work-in-progress hook from a previous render pass that we can
-  // use as a base. When we reach the end of the base list, we must switch to
-  // the dispatcher used for mounts.
-  if (nextWorkInProgressHook !== null) {
-    // There's already a work-in-progress. Reuse it.
-    workInProgressHook = nextWorkInProgressHook;
-    nextWorkInProgressHook = workInProgressHook.next;
-    currentHook = nextCurrentHook;
-    nextCurrentHook = currentHook !== null ? currentHook.next : null;
-  } else {
-    // Clone from the current hook.
-    if (!(nextCurrentHook !== null)) {
+  function requiredContext(c) {
+    if (!(c !== NO_CONTEXT)) {
       {
-        throw Error("Rendered more hooks than during the previous render.");
+        throw Error( "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue." );
       }
     }
 
-    currentHook = nextCurrentHook;
-    var newHook = {
-      memoizedState: currentHook.memoizedState,
-      baseState: currentHook.baseState,
-      queue: currentHook.queue,
-      baseUpdate: currentHook.baseUpdate,
-      next: null
-    };
-
-    if (workInProgressHook === null) {
-      // This is the first hook in the list.
-      workInProgressHook = firstWorkInProgressHook = newHook;
-    } else {
-      // Append to the end of the list.
-      workInProgressHook = workInProgressHook.next = newHook;
-    }
+    return c;
+  }
 
-    nextCurrentHook = currentHook.next;
+  function getRootHostContainer() {
+    var rootInstance = requiredContext(rootInstanceStackCursor.current);
+    return rootInstance;
   }
 
-  return workInProgressHook;
-}
+  function pushHostContainer(fiber, nextRootInstance) {
+    // Push current root instance onto the stack;
+    // This allows us to reset root when portals are popped.
+    push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.
+    // This enables us to pop only Fibers that provide unique contexts.
 
-function createFunctionComponentUpdateQueue() {
-  return {
-    lastEffect: null
-  };
-}
+    push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.
+    // However, we can't just call getRootHostContext() and push it because
+    // we'd have a different number of entries on the stack depending on
+    // whether getRootHostContext() throws somewhere in renderer code or not.
+    // So we push an empty value first. This lets us safely unwind on errors.
 
-function basicStateReducer(state, action) {
-  return typeof action === 'function' ? action(state) : action;
-}
+    push(contextStackCursor$1, NO_CONTEXT, fiber);
+    var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.
 
-function mountReducer(reducer, initialArg, init) {
-  var hook = mountWorkInProgressHook();
-  var initialState;
+    pop(contextStackCursor$1, fiber);
+    push(contextStackCursor$1, nextRootContext, fiber);
+  }
 
-  if (init !== undefined) {
-    initialState = init(initialArg);
-  } else {
-    initialState = initialArg;
+  function popHostContainer(fiber) {
+    pop(contextStackCursor$1, fiber);
+    pop(contextFiberStackCursor, fiber);
+    pop(rootInstanceStackCursor, fiber);
   }
 
-  hook.memoizedState = hook.baseState = initialState;
-  var queue = hook.queue = {
-    last: null,
-    dispatch: null,
-    lastRenderedReducer: reducer,
-    lastRenderedState: initialState
-  };
-  var dispatch = queue.dispatch = dispatchAction.bind(null, // Flow doesn't know this is non-null, but we do.
-  currentlyRenderingFiber$1, queue);
-  return [hook.memoizedState, dispatch];
-}
+  function getHostContext() {
+    var context = requiredContext(contextStackCursor$1.current);
+    return context;
+  }
 
-function updateReducer(reducer, initialArg, init) {
-  var hook = updateWorkInProgressHook();
-  var queue = hook.queue;
+  function pushHostContext(fiber) {
+    var rootInstance = requiredContext(rootInstanceStackCursor.current);
+    var context = requiredContext(contextStackCursor$1.current);
+    var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.
 
-  if (!(queue !== null)) {
-    {
-      throw Error("Should have a queue. This is likely a bug in React. Please file an issue.");
-    }
-  }
+    if (context === nextContext) {
+      return;
+    } // Track the context and the Fiber that provided it.
+    // This enables us to pop only Fibers that provide unique contexts.
 
-  queue.lastRenderedReducer = reducer;
 
-  if (numberOfReRenders > 0) {
-    // This is a re-render. Apply the new render phase updates to the previous
-    // work-in-progress hook.
-    var _dispatch = queue.dispatch;
+    push(contextFiberStackCursor, fiber, fiber);
+    push(contextStackCursor$1, nextContext, fiber);
+  }
 
-    if (renderPhaseUpdates !== null) {
-      // Render phase updates are stored in a map of queue -> linked list
-      var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
+  function popHostContext(fiber) {
+    // Do not pop unless this Fiber provided the current context.
+    // pushHostContext() only pushes Fibers that provide unique contexts.
+    if (contextFiberStackCursor.current !== fiber) {
+      return;
+    }
 
-      if (firstRenderPhaseUpdate !== undefined) {
-        renderPhaseUpdates.delete(queue);
-        var newState = hook.memoizedState;
-        var update = firstRenderPhaseUpdate;
+    pop(contextStackCursor$1, fiber);
+    pop(contextFiberStackCursor, fiber);
+  }
 
-        do {
-          // Process this render phase update. We don't have to check the
-          // priority because it will always be the same as the current
-          // render's.
-          var action = update.action;
-          newState = reducer(newState, action);
-          update = update.next;
-        } while (update !== null); // Mark that the fiber performed work, but only if the new state is
-        // different from the current state.
+  var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is
+  // inherited deeply down the subtree. The upper bits only affect
+  // this immediate suspense boundary and gets reset each new
+  // boundary or suspense list.
 
+  var SubtreeSuspenseContextMask = 1; // Subtree Flags:
+  // InvisibleParentSuspenseContext indicates that one of our parent Suspense
+  // boundaries is not currently showing visible main content.
+  // Either because it is already showing a fallback or is not mounted at all.
+  // We can use this to determine if it is desirable to trigger a fallback at
+  // the parent. If not, then we might need to trigger undesirable boundaries
+  // and/or suspend the commit to avoid hiding the parent content.
 
-        if (!is$1(newState, hook.memoizedState)) {
-          markWorkInProgressReceivedUpdate();
-        }
+  var InvisibleParentSuspenseContext = 1; // Shallow Flags:
+  // ForceSuspenseFallback can be used by SuspenseList to force newly added
+  // items into their fallback state during one of the render passes.
 
-        hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to
-        // the base state unless the queue is empty.
-        // TODO: Not sure if this is the desired semantics, but it's what we
-        // do for gDSFP. I can't remember why.
+  var ForceSuspenseFallback = 2;
+  var suspenseStackCursor = createCursor(DefaultSuspenseContext);
+  function hasSuspenseContext(parentContext, flag) {
+    return (parentContext & flag) !== 0;
+  }
+  function setDefaultShallowSuspenseContext(parentContext) {
+    return parentContext & SubtreeSuspenseContextMask;
+  }
+  function setShallowSuspenseContext(parentContext, shallowContext) {
+    return parentContext & SubtreeSuspenseContextMask | shallowContext;
+  }
+  function addSubtreeSuspenseContext(parentContext, subtreeContext) {
+    return parentContext | subtreeContext;
+  }
+  function pushSuspenseContext(fiber, newContext) {
+    push(suspenseStackCursor, newContext, fiber);
+  }
+  function popSuspenseContext(fiber) {
+    pop(suspenseStackCursor, fiber);
+  }
 
-        if (hook.baseUpdate === queue.last) {
-          hook.baseState = newState;
-        }
+  function shouldCaptureSuspense(workInProgress, hasInvisibleParent) {
+    // If it was the primary children that just suspended, capture and render the
+    // fallback. Otherwise, don't capture and bubble to the next boundary.
+    var nextState = workInProgress.memoizedState;
 
-        queue.lastRenderedState = newState;
-        return [newState, _dispatch];
+    if (nextState !== null) {
+      if (nextState.dehydrated !== null) {
+        // A dehydrated boundary always captures.
+        return true;
       }
-    }
 
-    return [hook.memoizedState, _dispatch];
-  } // The last update in the entire queue
+      return false;
+    }
 
+    var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop.
 
-  var last = queue.last; // The last update that is part of the base state.
+    if (props.fallback === undefined) {
+      return false;
+    } // Regular boundaries always capture.
 
-  var baseUpdate = hook.baseUpdate;
-  var baseState = hook.baseState; // Find the first unprocessed update.
 
-  var first;
+    if (props.unstable_avoidThisFallback !== true) {
+      return true;
+    } // If it's a boundary we should avoid, then we prefer to bubble up to the
+    // parent boundary if it is currently invisible.
 
-  if (baseUpdate !== null) {
-    if (last !== null) {
-      // For the first update, the queue is a circular linked list where
-      // `queue.last.next = queue.first`. Once the first update commits, and
-      // the `baseUpdate` is no longer empty, we can unravel the list.
-      last.next = null;
-    }
 
-    first = baseUpdate.next;
-  } else {
-    first = last !== null ? last.next : null;
-  }
+    if (hasInvisibleParent) {
+      return false;
+    } // If the parent is not able to handle it, we must handle it.
 
-  if (first !== null) {
-    var _newState = baseState;
-    var newBaseState = null;
-    var newBaseUpdate = null;
-    var prevUpdate = baseUpdate;
-    var _update = first;
-    var didSkip = false;
 
-    do {
-      var updateExpirationTime = _update.expirationTime;
+    return true;
+  }
+  function findFirstSuspended(row) {
+    var node = row;
 
-      if (updateExpirationTime < renderExpirationTime$1) {
-        // Priority is insufficient. Skip this update. If this is the first
-        // skipped update, the previous update/state is the new base
-        // update/state.
-        if (!didSkip) {
-          didSkip = true;
-          newBaseUpdate = prevUpdate;
-          newBaseState = _newState;
-        } // Update the remaining priority in the queue.
+    while (node !== null) {
+      if (node.tag === SuspenseComponent) {
+        var state = node.memoizedState;
 
+        if (state !== null) {
+          var dehydrated = state.dehydrated;
 
-        if (updateExpirationTime > remainingExpirationTime) {
-          remainingExpirationTime = updateExpirationTime;
-          markUnprocessedUpdateTime(remainingExpirationTime);
+          if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {
+            return node;
+          }
         }
-      } else {
-        // This update does have sufficient priority.
-        // Mark the event time of this update as relevant to this render pass.
-        // TODO: This should ideally use the true event time of this update rather than
-        // its priority which is a derived and not reverseable value.
-        // TODO: We should skip this update if it was already committed but currently
-        // we have no way of detecting the difference between a committed and suspended
-        // update here.
-        markRenderEventTimeAndConfig(updateExpirationTime, _update.suspenseConfig); // Process this update.
-
-        if (_update.eagerReducer === reducer) {
-          // If this update was processed eagerly, and its reducer matches the
-          // current reducer, we can use the eagerly computed state.
-          _newState = _update.eagerState;
-        } else {
-          var _action = _update.action;
-          _newState = reducer(_newState, _action);
+      } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't
+      // keep track of whether it suspended or not.
+      node.memoizedProps.revealOrder !== undefined) {
+        var didSuspend = (node.effectTag & DidCapture) !== NoEffect;
+
+        if (didSuspend) {
+          return node;
         }
+      } else if (node.child !== null) {
+        node.child.return = node;
+        node = node.child;
+        continue;
       }
 
-      prevUpdate = _update;
-      _update = _update.next;
-    } while (_update !== null && _update !== first);
+      if (node === row) {
+        return null;
+      }
 
-    if (!didSkip) {
-      newBaseUpdate = prevUpdate;
-      newBaseState = _newState;
-    } // Mark that the fiber performed work, but only if the new state is
-    // different from the current state.
+      while (node.sibling === null) {
+        if (node.return === null || node.return === row) {
+          return null;
+        }
 
+        node = node.return;
+      }
 
-    if (!is$1(_newState, hook.memoizedState)) {
-      markWorkInProgressReceivedUpdate();
+      node.sibling.return = node.return;
+      node = node.sibling;
     }
 
-    hook.memoizedState = _newState;
-    hook.baseUpdate = newBaseUpdate;
-    hook.baseState = newBaseState;
-    queue.lastRenderedState = _newState;
+    return null;
   }
 
-  var dispatch = queue.dispatch;
-  return [hook.memoizedState, dispatch];
-}
+  function createDeprecatedResponderListener(responder, props) {
+    var eventResponderListener = {
+      responder: responder,
+      props: props
+    };
 
-function mountState(initialState) {
-  var hook = mountWorkInProgressHook();
+    {
+      Object.freeze(eventResponderListener);
+    }
 
-  if (typeof initialState === 'function') {
-    initialState = initialState();
+    return eventResponderListener;
   }
 
-  hook.memoizedState = hook.baseState = initialState;
-  var queue = hook.queue = {
-    last: null,
-    dispatch: null,
-    lastRenderedReducer: basicStateReducer,
-    lastRenderedState: initialState
-  };
-  var dispatch = queue.dispatch = dispatchAction.bind(null, // Flow doesn't know this is non-null, but we do.
-  currentlyRenderingFiber$1, queue);
-  return [hook.memoizedState, dispatch];
-}
-
-function updateState(initialState) {
-  return updateReducer(basicStateReducer, initialState);
-}
-
-function pushEffect(tag, create, destroy, deps) {
-  var effect = {
-    tag: tag,
-    create: create,
-    destroy: destroy,
-    deps: deps,
-    // Circular
-    next: null
-  };
-
-  if (componentUpdateQueue === null) {
-    componentUpdateQueue = createFunctionComponentUpdateQueue();
-    componentUpdateQueue.lastEffect = effect.next = effect;
-  } else {
-    var lastEffect = componentUpdateQueue.lastEffect;
-
-    if (lastEffect === null) {
-      componentUpdateQueue.lastEffect = effect.next = effect;
-    } else {
-      var firstEffect = lastEffect.next;
-      lastEffect.next = effect;
-      effect.next = firstEffect;
-      componentUpdateQueue.lastEffect = effect;
-    }
-  }
+  var HasEffect =
+  /* */
+  1; // Represents the phase in which the effect (not the clean-up) fires.
 
-  return effect;
-}
+  var Layout =
+  /*    */
+  2;
+  var Passive$1 =
+  /*   */
+  4;
 
-function mountRef(initialValue) {
-  var hook = mountWorkInProgressHook();
-  var ref = {
-    current: initialValue
-  };
+  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher,
+      ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;
+  var didWarnAboutMismatchedHooksForComponent;
 
   {
-    Object.seal(ref);
+    didWarnAboutMismatchedHooksForComponent = new Set();
   }
 
-  hook.memoizedState = ref;
-  return ref;
-}
+  // These are set right before calling the component.
+  var renderExpirationTime = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from
+  // the work-in-progress hook.
 
-function updateRef(initialValue) {
-  var hook = updateWorkInProgressHook();
-  return hook.memoizedState;
-}
+  var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The
+  // current hook list is the list that belongs to the current fiber. The
+  // work-in-progress hook list is a new list that will be added to the
+  // work-in-progress fiber.
 
-function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
-  var hook = mountWorkInProgressHook();
-  var nextDeps = deps === undefined ? null : deps;
-  sideEffectTag |= fiberEffectTag;
-  hook.memoizedState = pushEffect(hookEffectTag, create, undefined, nextDeps);
-}
+  var currentHook = null;
+  var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This
+  // does not get reset if we do another render pass; only when we're completely
+  // finished evaluating this component. This is an optimization so we know
+  // whether we need to clear render phase updates after a throw.
 
-function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
-  var hook = updateWorkInProgressHook();
-  var nextDeps = deps === undefined ? null : deps;
-  var destroy = undefined;
+  var didScheduleRenderPhaseUpdate = false;
+  var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook
 
-  if (currentHook !== null) {
-    var prevEffect = currentHook.memoizedState;
-    destroy = prevEffect.destroy;
+  var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.
+  // The list stores the order of hooks used during the initial render (mount).
+  // Subsequent renders (updates) reference this list.
 
-    if (nextDeps !== null) {
-      var prevDeps = prevEffect.deps;
+  var hookTypesDev = null;
+  var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore
+  // the dependencies for Hooks that need them (e.g. useEffect or useMemo).
+  // When true, such Hooks will always be "remounted". Only used during hot reload.
 
-      if (areHookInputsEqual(nextDeps, prevDeps)) {
-        pushEffect(NoEffect$1, create, destroy, nextDeps);
-        return;
+  var ignorePreviousDependencies = false;
+
+  function mountHookTypesDev() {
+    {
+      var hookName = currentHookNameInDev;
+
+      if (hookTypesDev === null) {
+        hookTypesDev = [hookName];
+      } else {
+        hookTypesDev.push(hookName);
       }
     }
   }
 
-  sideEffectTag |= fiberEffectTag;
-  hook.memoizedState = pushEffect(hookEffectTag, create, destroy, nextDeps);
-}
+  function updateHookTypesDev() {
+    {
+      var hookName = currentHookNameInDev;
+
+      if (hookTypesDev !== null) {
+        hookTypesUpdateIndexDev++;
 
-function mountEffect(create, deps) {
-  {
-    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
-    if ('undefined' !== typeof jest) {
-      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);
+        if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {
+          warnOnHookMismatchInDev(hookName);
+        }
+      }
     }
   }
 
-  return mountEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
-}
-
-function updateEffect(create, deps) {
-  {
-    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
-    if ('undefined' !== typeof jest) {
-      warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);
+  function checkDepsAreArrayDev(deps) {
+    {
+      if (deps !== undefined && deps !== null && !Array.isArray(deps)) {
+        // Verify deps, but only on mount to avoid extra checks.
+        // It's unlikely their type would change as usually you define them inline.
+        error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);
+      }
     }
   }
 
-  return updateEffectImpl(Update | Passive, UnmountPassive | MountPassive, create, deps);
-}
+  function warnOnHookMismatchInDev(currentHookName) {
+    {
+      var componentName = getComponentName(currentlyRenderingFiber$1.type);
 
-function mountLayoutEffect(create, deps) {
-  return mountEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
-}
+      if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
+        didWarnAboutMismatchedHooksForComponent.add(componentName);
 
-function updateLayoutEffect(create, deps) {
-  return updateEffectImpl(Update, UnmountMutation | MountLayout, create, deps);
-}
+        if (hookTypesDev !== null) {
+          var table = '';
+          var secondColumnStart = 30;
 
-function imperativeHandleEffect(create, ref) {
-  if (typeof ref === 'function') {
-    var refCallback = ref;
+          for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {
+            var oldHookName = hookTypesDev[i];
+            var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;
+            var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up
+            // lol @ IE not supporting String#repeat
 
-    var _inst = create();
+            while (row.length < secondColumnStart) {
+              row += ' ';
+            }
 
-    refCallback(_inst);
-    return function () {
-      refCallback(null);
-    };
-  } else if (ref !== null && ref !== undefined) {
-    var refObject = ref;
+            row += newHookName + '\n';
+            table += row;
+          }
 
-    {
-      !refObject.hasOwnProperty('current') ? warning$1(false, 'Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}') : void 0;
+          error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\n\n' + '   Previous render            Next render\n' + '   ------------------------------------------------------\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table);
+        }
+      }
     }
+  }
 
-    var _inst2 = create();
-
-    refObject.current = _inst2;
-    return function () {
-      refObject.current = null;
-    };
+  function throwInvalidHookError() {
+    {
+      {
+        throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem." );
+      }
+    }
   }
-}
 
-function mountImperativeHandle(ref, create, deps) {
-  {
-    !(typeof create === 'function') ? warning$1(false, 'Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null') : void 0;
-  } // TODO: If deps are provided, should we skip comparing the ref itself?
+  function areHookInputsEqual(nextDeps, prevDeps) {
+    {
+      if (ignorePreviousDependencies) {
+        // Only true when this component is being hot reloaded.
+        return false;
+      }
+    }
 
-
-  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
-  return mountEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
-}
-
-function updateImperativeHandle(ref, create, deps) {
-  {
-    !(typeof create === 'function') ? warning$1(false, 'Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null') : void 0;
-  } // TODO: If deps are provided, should we skip comparing the ref itself?
-
-
-  var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
-  return updateEffectImpl(Update, UnmountMutation | MountLayout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
-}
-
-function mountDebugValue(value, formatterFn) {// This hook is normally a no-op.
-  // The react-debug-hooks package injects its own implementation
-  // so that e.g. DevTools can display custom hook values.
-}
-
-var updateDebugValue = mountDebugValue;
-
-function mountCallback(callback, deps) {
-  var hook = mountWorkInProgressHook();
-  var nextDeps = deps === undefined ? null : deps;
-  hook.memoizedState = [callback, nextDeps];
-  return callback;
-}
-
-function updateCallback(callback, deps) {
-  var hook = updateWorkInProgressHook();
-  var nextDeps = deps === undefined ? null : deps;
-  var prevState = hook.memoizedState;
-
-  if (prevState !== null) {
-    if (nextDeps !== null) {
-      var prevDeps = prevState[1];
-
-      if (areHookInputsEqual(nextDeps, prevDeps)) {
-        return prevState[0];
+    if (prevDeps === null) {
+      {
+        error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);
       }
-    }
-  }
-
-  hook.memoizedState = [callback, nextDeps];
-  return callback;
-}
 
-function mountMemo(nextCreate, deps) {
-  var hook = mountWorkInProgressHook();
-  var nextDeps = deps === undefined ? null : deps;
-  var nextValue = nextCreate();
-  hook.memoizedState = [nextValue, nextDeps];
-  return nextValue;
-}
-
-function updateMemo(nextCreate, deps) {
-  var hook = updateWorkInProgressHook();
-  var nextDeps = deps === undefined ? null : deps;
-  var prevState = hook.memoizedState;
-
-  if (prevState !== null) {
-    // Assume these are defined. If they're not, areHookInputsEqual will warn.
-    if (nextDeps !== null) {
-      var prevDeps = prevState[1];
-
-      if (areHookInputsEqual(nextDeps, prevDeps)) {
-        return prevState[0];
-      }
+      return false;
     }
-  }
-
-  var nextValue = nextCreate();
-  hook.memoizedState = [nextValue, nextDeps];
-  return nextValue;
-}
-
-function mountDeferredValue(value, config) {
-  var _mountState = mountState(value),
-      prevValue = _mountState[0],
-      setValue = _mountState[1];
-
-  mountEffect(function () {
-    unstable_next(function () {
-      var previousConfig = ReactCurrentBatchConfig$1.suspense;
-      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
-
-      try {
-        setValue(value);
-      } finally {
-        ReactCurrentBatchConfig$1.suspense = previousConfig;
-      }
-    });
-  }, [value, config]);
-  return prevValue;
-}
-
-function updateDeferredValue(value, config) {
-  var _updateState = updateState(value),
-      prevValue = _updateState[0],
-      setValue = _updateState[1];
-
-  updateEffect(function () {
-    unstable_next(function () {
-      var previousConfig = ReactCurrentBatchConfig$1.suspense;
-      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
 
-      try {
-        setValue(value);
-      } finally {
-        ReactCurrentBatchConfig$1.suspense = previousConfig;
-      }
-    });
-  }, [value, config]);
-  return prevValue;
-}
-
-function mountTransition(config) {
-  var _mountState2 = mountState(false),
-      isPending = _mountState2[0],
-      setPending = _mountState2[1];
-
-  var startTransition = mountCallback(function (callback) {
-    setPending(true);
-    unstable_next(function () {
-      var previousConfig = ReactCurrentBatchConfig$1.suspense;
-      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
-
-      try {
-        setPending(false);
-        callback();
-      } finally {
-        ReactCurrentBatchConfig$1.suspense = previousConfig;
+    {
+      // Don't bother comparing lengths in prod because these arrays should be
+      // passed inline.
+      if (nextDeps.length !== prevDeps.length) {
+        error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]");
       }
-    });
-  }, [config, isPending]);
-  return [startTransition, isPending];
-}
-
-function updateTransition(config) {
-  var _updateState2 = updateState(false),
-      isPending = _updateState2[0],
-      setPending = _updateState2[1];
-
-  var startTransition = updateCallback(function (callback) {
-    setPending(true);
-    unstable_next(function () {
-      var previousConfig = ReactCurrentBatchConfig$1.suspense;
-      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
+    }
 
-      try {
-        setPending(false);
-        callback();
-      } finally {
-        ReactCurrentBatchConfig$1.suspense = previousConfig;
+    for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
+      if (objectIs(nextDeps[i], prevDeps[i])) {
+        continue;
       }
-    });
-  }, [config, isPending]);
-  return [startTransition, isPending];
-}
 
-function dispatchAction(fiber, queue, action) {
-  if (!(numberOfReRenders < RE_RENDER_LIMIT)) {
-    {
-      throw Error("Too many re-renders. React limits the number of renders to prevent an infinite loop.");
+      return false;
     }
-  }
 
-  {
-    !(typeof arguments[3] !== 'function') ? warning$1(false, "State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().') : void 0;
+    return true;
   }
 
-  var alternate = fiber.alternate;
-
-  if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {
-    // This is a render phase update. Stash it in a lazily-created map of
-    // queue -> linked list of updates. After this render pass, we'll restart
-    // and apply the stashed updates on top of the work-in-progress hook.
-    didScheduleRenderPhaseUpdate = true;
-    var update = {
-      expirationTime: renderExpirationTime$1,
-      suspenseConfig: null,
-      action: action,
-      eagerReducer: null,
-      eagerState: null,
-      next: null
-    };
+  function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderExpirationTime) {
+    renderExpirationTime = nextRenderExpirationTime;
+    currentlyRenderingFiber$1 = workInProgress;
 
     {
-      update.priority = getCurrentPriorityLevel();
-    }
+      hookTypesDev = current !== null ? current._debugHookTypes : null;
+      hookTypesUpdateIndexDev = -1; // Used for hot reloading:
 
-    if (renderPhaseUpdates === null) {
-      renderPhaseUpdates = new Map();
+      ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;
     }
 
-    var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
-
-    if (firstRenderPhaseUpdate === undefined) {
-      renderPhaseUpdates.set(queue, update);
-    } else {
-      // Append the update to the end of the list.
-      var lastRenderPhaseUpdate = firstRenderPhaseUpdate;
-
-      while (lastRenderPhaseUpdate.next !== null) {
-        lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
-      }
-
-      lastRenderPhaseUpdate.next = update;
-    }
-  } else {
-    var currentTime = requestCurrentTimeForUpdate();
-    var suspenseConfig = requestCurrentSuspenseConfig();
-    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
-    var _update2 = {
-      expirationTime: expirationTime,
-      suspenseConfig: suspenseConfig,
-      action: action,
-      eagerReducer: null,
-      eagerState: null,
-      next: null
-    };
+    workInProgress.memoizedState = null;
+    workInProgress.updateQueue = null;
+    workInProgress.expirationTime = NoWork; // The following should have already been reset
+    // currentHook = null;
+    // workInProgressHook = null;
+    // didScheduleRenderPhaseUpdate = false;
+    // TODO Warn if no hooks are used at all during mount, then some are used during update.
+    // Currently we will identify the update render as a mount because memoizedState === null.
+    // This is tricky because it's valid for certain types of components (e.g. React.lazy)
+    // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.
+    // Non-stateful hooks (e.g. context) don't get added to memoizedState,
+    // so memoizedState would be null during updates and mounts.
 
     {
-      _update2.priority = getCurrentPriorityLevel();
-    } // Append the update to the end of the list.
-
-
-    var last = queue.last;
-
-    if (last === null) {
-      // This is the first update. Create a circular list.
-      _update2.next = _update2;
-    } else {
-      var first = last.next;
-
-      if (first !== null) {
-        // Still circular.
-        _update2.next = first;
+      if (current !== null && current.memoizedState !== null) {
+        ReactCurrentDispatcher.current = HooksDispatcherOnUpdateInDEV;
+      } else if (hookTypesDev !== null) {
+        // This dispatcher handles an edge case where a component is updating,
+        // but no stateful hooks have been used.
+        // We want to match the production code behavior (which will use HooksDispatcherOnMount),
+        // but with the extra DEV validation to ensure hooks ordering hasn't changed.
+        // This dispatcher does that.
+        ReactCurrentDispatcher.current = HooksDispatcherOnMountWithHookTypesInDEV;
+      } else {
+        ReactCurrentDispatcher.current = HooksDispatcherOnMountInDEV;
       }
-
-      last.next = _update2;
     }
 
-    queue.last = _update2;
-
-    if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {
-      // The queue is currently empty, which means we can eagerly compute the
-      // next state before entering the render phase. If the new state is the
-      // same as the current state, we may be able to bail out entirely.
-      var lastRenderedReducer = queue.lastRenderedReducer;
+    var children = Component(props, secondArg); // Check if there was a render phase update
 
-      if (lastRenderedReducer !== null) {
-        var prevDispatcher;
+    if (workInProgress.expirationTime === renderExpirationTime) {
+      // Keep rendering in a loop for as long as render phase updates continue to
+      // be scheduled. Use a counter to prevent infinite loops.
+      var numberOfReRenders = 0;
 
-        {
-          prevDispatcher = ReactCurrentDispatcher$1.current;
-          ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
-        }
+      do {
+        workInProgress.expirationTime = NoWork;
 
-        try {
-          var currentState = queue.lastRenderedState;
-          var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute
-          // it, on the update object. If the reducer hasn't changed by the
-          // time we enter the render phase, then the eager state can be used
-          // without calling the reducer again.
-
-          _update2.eagerReducer = lastRenderedReducer;
-          _update2.eagerState = eagerState;
-
-          if (is$1(eagerState, currentState)) {
-            // Fast path. We can bail out without scheduling React to re-render.
-            // It's still possible that we'll need to rebase this update later,
-            // if the component re-renders for a different reason and by that
-            // time the reducer has changed.
-            return;
-          }
-        } catch (error) {// Suppress the error. It will throw again in the render phase.
-        } finally {
+        if (!(numberOfReRenders < RE_RENDER_LIMIT)) {
           {
-            ReactCurrentDispatcher$1.current = prevDispatcher;
+            throw Error( "Too many re-renders. React limits the number of renders to prevent an infinite loop." );
           }
         }
-      }
-    }
-
-    {
-      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
-      if ('undefined' !== typeof jest) {
-        warnIfNotScopedWithMatchingAct(fiber);
-        warnIfNotCurrentlyActingUpdatesInDev(fiber);
-      }
-    }
-
-    scheduleWork(fiber, expirationTime);
-  }
-}
-
-var ContextOnlyDispatcher = {
-  readContext: readContext,
-  useCallback: throwInvalidHookError,
-  useContext: throwInvalidHookError,
-  useEffect: throwInvalidHookError,
-  useImperativeHandle: throwInvalidHookError,
-  useLayoutEffect: throwInvalidHookError,
-  useMemo: throwInvalidHookError,
-  useReducer: throwInvalidHookError,
-  useRef: throwInvalidHookError,
-  useState: throwInvalidHookError,
-  useDebugValue: throwInvalidHookError,
-  useResponder: throwInvalidHookError,
-  useDeferredValue: throwInvalidHookError,
-  useTransition: throwInvalidHookError
-};
-var HooksDispatcherOnMountInDEV = null;
-var HooksDispatcherOnMountWithHookTypesInDEV = null;
-var HooksDispatcherOnUpdateInDEV = null;
-var InvalidNestedHooksDispatcherOnMountInDEV = null;
-var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
-
-{
-  var warnInvalidContextAccess = function () {
-    warning$1(false, 'Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
-  };
 
-  var warnInvalidHookAccess = function () {
-    warning$1(false, 'Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks');
-  };
+        numberOfReRenders += 1;
 
-  HooksDispatcherOnMountInDEV = {
-    readContext: function (context, observedBits) {
-      return readContext(context, observedBits);
-    },
-    useCallback: function (callback, deps) {
-      currentHookNameInDev = 'useCallback';
-      mountHookTypesDev();
-      checkDepsAreArrayDev(deps);
-      return mountCallback(callback, deps);
-    },
-    useContext: function (context, observedBits) {
-      currentHookNameInDev = 'useContext';
-      mountHookTypesDev();
-      return readContext(context, observedBits);
-    },
-    useEffect: function (create, deps) {
-      currentHookNameInDev = 'useEffect';
-      mountHookTypesDev();
-      checkDepsAreArrayDev(deps);
-      return mountEffect(create, deps);
-    },
-    useImperativeHandle: function (ref, create, deps) {
-      currentHookNameInDev = 'useImperativeHandle';
-      mountHookTypesDev();
-      checkDepsAreArrayDev(deps);
-      return mountImperativeHandle(ref, create, deps);
-    },
-    useLayoutEffect: function (create, deps) {
-      currentHookNameInDev = 'useLayoutEffect';
-      mountHookTypesDev();
-      checkDepsAreArrayDev(deps);
-      return mountLayoutEffect(create, deps);
-    },
-    useMemo: function (create, deps) {
-      currentHookNameInDev = 'useMemo';
-      mountHookTypesDev();
-      checkDepsAreArrayDev(deps);
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
+        {
+          // Even when hot reloading, allow dependencies to stabilize
+          // after first render to prevent infinite render phase updates.
+          ignorePreviousDependencies = false;
+        } // Start over from the beginning of the list
 
-      try {
-        return mountMemo(create, deps);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useReducer: function (reducer, initialArg, init) {
-      currentHookNameInDev = 'useReducer';
-      mountHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-      try {
-        return mountReducer(reducer, initialArg, init);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useRef: function (initialValue) {
-      currentHookNameInDev = 'useRef';
-      mountHookTypesDev();
-      return mountRef(initialValue);
-    },
-    useState: function (initialState) {
-      currentHookNameInDev = 'useState';
-      mountHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
+        currentHook = null;
+        workInProgressHook = null;
+        workInProgress.updateQueue = null;
 
-      try {
-        return mountState(initialState);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useDebugValue: function (value, formatterFn) {
-      currentHookNameInDev = 'useDebugValue';
-      mountHookTypesDev();
-      return mountDebugValue(value, formatterFn);
-    },
-    useResponder: function (responder, props) {
-      currentHookNameInDev = 'useResponder';
-      mountHookTypesDev();
-      return createResponderListener(responder, props);
-    },
-    useDeferredValue: function (value, config) {
-      currentHookNameInDev = 'useDeferredValue';
-      mountHookTypesDev();
-      return mountDeferredValue(value, config);
-    },
-    useTransition: function (config) {
-      currentHookNameInDev = 'useTransition';
-      mountHookTypesDev();
-      return mountTransition(config);
-    }
-  };
-  HooksDispatcherOnMountWithHookTypesInDEV = {
-    readContext: function (context, observedBits) {
-      return readContext(context, observedBits);
-    },
-    useCallback: function (callback, deps) {
-      currentHookNameInDev = 'useCallback';
-      updateHookTypesDev();
-      return mountCallback(callback, deps);
-    },
-    useContext: function (context, observedBits) {
-      currentHookNameInDev = 'useContext';
-      updateHookTypesDev();
-      return readContext(context, observedBits);
-    },
-    useEffect: function (create, deps) {
-      currentHookNameInDev = 'useEffect';
-      updateHookTypesDev();
-      return mountEffect(create, deps);
-    },
-    useImperativeHandle: function (ref, create, deps) {
-      currentHookNameInDev = 'useImperativeHandle';
-      updateHookTypesDev();
-      return mountImperativeHandle(ref, create, deps);
-    },
-    useLayoutEffect: function (create, deps) {
-      currentHookNameInDev = 'useLayoutEffect';
-      updateHookTypesDev();
-      return mountLayoutEffect(create, deps);
-    },
-    useMemo: function (create, deps) {
-      currentHookNameInDev = 'useMemo';
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
-
-      try {
-        return mountMemo(create, deps);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useReducer: function (reducer, initialArg, init) {
-      currentHookNameInDev = 'useReducer';
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
+        {
+          // Also validate hook order for cascading updates.
+          hookTypesUpdateIndexDev = -1;
+        }
 
-      try {
-        return mountReducer(reducer, initialArg, init);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useRef: function (initialValue) {
-      currentHookNameInDev = 'useRef';
-      updateHookTypesDev();
-      return mountRef(initialValue);
-    },
-    useState: function (initialState) {
-      currentHookNameInDev = 'useState';
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
+        ReactCurrentDispatcher.current =  HooksDispatcherOnRerenderInDEV ;
+        children = Component(props, secondArg);
+      } while (workInProgress.expirationTime === renderExpirationTime);
+    } // We can assume the previous dispatcher is always this one, since we set it
+    // at the beginning of the render phase and there's no re-entrancy.
 
-      try {
-        return mountState(initialState);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useDebugValue: function (value, formatterFn) {
-      currentHookNameInDev = 'useDebugValue';
-      updateHookTypesDev();
-      return mountDebugValue(value, formatterFn);
-    },
-    useResponder: function (responder, props) {
-      currentHookNameInDev = 'useResponder';
-      updateHookTypesDev();
-      return createResponderListener(responder, props);
-    },
-    useDeferredValue: function (value, config) {
-      currentHookNameInDev = 'useDeferredValue';
-      updateHookTypesDev();
-      return mountDeferredValue(value, config);
-    },
-    useTransition: function (config) {
-      currentHookNameInDev = 'useTransition';
-      updateHookTypesDev();
-      return mountTransition(config);
-    }
-  };
-  HooksDispatcherOnUpdateInDEV = {
-    readContext: function (context, observedBits) {
-      return readContext(context, observedBits);
-    },
-    useCallback: function (callback, deps) {
-      currentHookNameInDev = 'useCallback';
-      updateHookTypesDev();
-      return updateCallback(callback, deps);
-    },
-    useContext: function (context, observedBits) {
-      currentHookNameInDev = 'useContext';
-      updateHookTypesDev();
-      return readContext(context, observedBits);
-    },
-    useEffect: function (create, deps) {
-      currentHookNameInDev = 'useEffect';
-      updateHookTypesDev();
-      return updateEffect(create, deps);
-    },
-    useImperativeHandle: function (ref, create, deps) {
-      currentHookNameInDev = 'useImperativeHandle';
-      updateHookTypesDev();
-      return updateImperativeHandle(ref, create, deps);
-    },
-    useLayoutEffect: function (create, deps) {
-      currentHookNameInDev = 'useLayoutEffect';
-      updateHookTypesDev();
-      return updateLayoutEffect(create, deps);
-    },
-    useMemo: function (create, deps) {
-      currentHookNameInDev = 'useMemo';
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-      try {
-        return updateMemo(create, deps);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useReducer: function (reducer, initialArg, init) {
-      currentHookNameInDev = 'useReducer';
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
+    ReactCurrentDispatcher.current = ContextOnlyDispatcher;
 
-      try {
-        return updateReducer(reducer, initialArg, init);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useRef: function (initialValue) {
-      currentHookNameInDev = 'useRef';
-      updateHookTypesDev();
-      return updateRef(initialValue);
-    },
-    useState: function (initialState) {
-      currentHookNameInDev = 'useState';
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
-
-      try {
-        return updateState(initialState);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useDebugValue: function (value, formatterFn) {
-      currentHookNameInDev = 'useDebugValue';
-      updateHookTypesDev();
-      return updateDebugValue(value, formatterFn);
-    },
-    useResponder: function (responder, props) {
-      currentHookNameInDev = 'useResponder';
-      updateHookTypesDev();
-      return createResponderListener(responder, props);
-    },
-    useDeferredValue: function (value, config) {
-      currentHookNameInDev = 'useDeferredValue';
-      updateHookTypesDev();
-      return updateDeferredValue(value, config);
-    },
-    useTransition: function (config) {
-      currentHookNameInDev = 'useTransition';
-      updateHookTypesDev();
-      return updateTransition(config);
-    }
-  };
-  InvalidNestedHooksDispatcherOnMountInDEV = {
-    readContext: function (context, observedBits) {
-      warnInvalidContextAccess();
-      return readContext(context, observedBits);
-    },
-    useCallback: function (callback, deps) {
-      currentHookNameInDev = 'useCallback';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountCallback(callback, deps);
-    },
-    useContext: function (context, observedBits) {
-      currentHookNameInDev = 'useContext';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return readContext(context, observedBits);
-    },
-    useEffect: function (create, deps) {
-      currentHookNameInDev = 'useEffect';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountEffect(create, deps);
-    },
-    useImperativeHandle: function (ref, create, deps) {
-      currentHookNameInDev = 'useImperativeHandle';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountImperativeHandle(ref, create, deps);
-    },
-    useLayoutEffect: function (create, deps) {
-      currentHookNameInDev = 'useLayoutEffect';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountLayoutEffect(create, deps);
-    },
-    useMemo: function (create, deps) {
-      currentHookNameInDev = 'useMemo';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
+    {
+      workInProgress._debugHookTypes = hookTypesDev;
+    } // This check uses currentHook so that it works the same in DEV and prod bundles.
+    // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.
 
-      try {
-        return mountMemo(create, deps);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useReducer: function (reducer, initialArg, init) {
-      currentHookNameInDev = 'useReducer';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-      try {
-        return mountReducer(reducer, initialArg, init);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useRef: function (initialValue) {
-      currentHookNameInDev = 'useRef';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountRef(initialValue);
-    },
-    useState: function (initialState) {
-      currentHookNameInDev = 'useState';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
+    var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
+    renderExpirationTime = NoWork;
+    currentlyRenderingFiber$1 = null;
+    currentHook = null;
+    workInProgressHook = null;
 
-      try {
-        return mountState(initialState);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useDebugValue: function (value, formatterFn) {
-      currentHookNameInDev = 'useDebugValue';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountDebugValue(value, formatterFn);
-    },
-    useResponder: function (responder, props) {
-      currentHookNameInDev = 'useResponder';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return createResponderListener(responder, props);
-    },
-    useDeferredValue: function (value, config) {
-      currentHookNameInDev = 'useDeferredValue';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountDeferredValue(value, config);
-    },
-    useTransition: function (config) {
-      currentHookNameInDev = 'useTransition';
-      warnInvalidHookAccess();
-      mountHookTypesDev();
-      return mountTransition(config);
+    {
+      currentHookNameInDev = null;
+      hookTypesDev = null;
+      hookTypesUpdateIndexDev = -1;
     }
-  };
-  InvalidNestedHooksDispatcherOnUpdateInDEV = {
-    readContext: function (context, observedBits) {
-      warnInvalidContextAccess();
-      return readContext(context, observedBits);
-    },
-    useCallback: function (callback, deps) {
-      currentHookNameInDev = 'useCallback';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateCallback(callback, deps);
-    },
-    useContext: function (context, observedBits) {
-      currentHookNameInDev = 'useContext';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return readContext(context, observedBits);
-    },
-    useEffect: function (create, deps) {
-      currentHookNameInDev = 'useEffect';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateEffect(create, deps);
-    },
-    useImperativeHandle: function (ref, create, deps) {
-      currentHookNameInDev = 'useImperativeHandle';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateImperativeHandle(ref, create, deps);
-    },
-    useLayoutEffect: function (create, deps) {
-      currentHookNameInDev = 'useLayoutEffect';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateLayoutEffect(create, deps);
-    },
-    useMemo: function (create, deps) {
-      currentHookNameInDev = 'useMemo';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
-
-      try {
-        return updateMemo(create, deps);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useReducer: function (reducer, initialArg, init) {
-      currentHookNameInDev = 'useReducer';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-      try {
-        return updateReducer(reducer, initialArg, init);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
-      }
-    },
-    useRef: function (initialValue) {
-      currentHookNameInDev = 'useRef';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateRef(initialValue);
-    },
-    useState: function (initialState) {
-      currentHookNameInDev = 'useState';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      var prevDispatcher = ReactCurrentDispatcher$1.current;
-      ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
+    didScheduleRenderPhaseUpdate = false;
 
-      try {
-        return updateState(initialState);
-      } finally {
-        ReactCurrentDispatcher$1.current = prevDispatcher;
+    if (!!didRenderTooFewHooks) {
+      {
+        throw Error( "Rendered fewer hooks than expected. This may be caused by an accidental early return statement." );
       }
-    },
-    useDebugValue: function (value, formatterFn) {
-      currentHookNameInDev = 'useDebugValue';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateDebugValue(value, formatterFn);
-    },
-    useResponder: function (responder, props) {
-      currentHookNameInDev = 'useResponder';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return createResponderListener(responder, props);
-    },
-    useDeferredValue: function (value, config) {
-      currentHookNameInDev = 'useDeferredValue';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateDeferredValue(value, config);
-    },
-    useTransition: function (config) {
-      currentHookNameInDev = 'useTransition';
-      warnInvalidHookAccess();
-      updateHookTypesDev();
-      return updateTransition(config);
     }
-  };
-}
-
-// CommonJS interop named imports.
-
-var now$1 = unstable_now;
-var commitTime = 0;
-var profilerStartTime = -1;
-
-function getCommitTime() {
-  return commitTime;
-}
-
-function recordCommitTime() {
-  if (!enableProfilerTimer) {
-    return;
-  }
-
-  commitTime = now$1();
-}
 
-function startProfilerTimer(fiber) {
-  if (!enableProfilerTimer) {
-    return;
+    return children;
   }
+  function bailoutHooks(current, workInProgress, expirationTime) {
+    workInProgress.updateQueue = current.updateQueue;
+    workInProgress.effectTag &= ~(Passive | Update);
 
-  profilerStartTime = now$1();
-
-  if (fiber.actualStartTime < 0) {
-    fiber.actualStartTime = now$1();
-  }
-}
-
-function stopProfilerTimerIfRunning(fiber) {
-  if (!enableProfilerTimer) {
-    return;
+    if (current.expirationTime <= expirationTime) {
+      current.expirationTime = NoWork;
+    }
   }
+  function resetHooksAfterThrow() {
+    // We can assume the previous dispatcher is always this one, since we set it
+    // at the beginning of the render phase and there's no re-entrancy.
+    ReactCurrentDispatcher.current = ContextOnlyDispatcher;
 
-  profilerStartTime = -1;
-}
+    if (didScheduleRenderPhaseUpdate) {
+      // There were render phase updates. These are only valid for this render
+      // phase, which we are now aborting. Remove the updates from the queues so
+      // they do not persist to the next render. Do not remove updates from hooks
+      // that weren't processed.
+      //
+      // Only reset the updates from the queue if it has a clone. If it does
+      // not have a clone, that means it wasn't processed, and the updates were
+      // scheduled before we entered the render phase.
+      var hook = currentlyRenderingFiber$1.memoizedState;
 
-function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
-  if (!enableProfilerTimer) {
-    return;
-  }
+      while (hook !== null) {
+        var queue = hook.queue;
 
-  if (profilerStartTime >= 0) {
-    var elapsedTime = now$1() - profilerStartTime;
-    fiber.actualDuration += elapsedTime;
+        if (queue !== null) {
+          queue.pending = null;
+        }
 
-    if (overrideBaseTime) {
-      fiber.selfBaseDuration = elapsedTime;
+        hook = hook.next;
+      }
     }
 
-    profilerStartTime = -1;
-  }
-}
-
-// This may have been an insertion or a hydration.
+    renderExpirationTime = NoWork;
+    currentlyRenderingFiber$1 = null;
+    currentHook = null;
+    workInProgressHook = null;
 
-var hydrationParentFiber = null;
-var nextHydratableInstance = null;
-var isHydrating = false;
+    {
+      hookTypesDev = null;
+      hookTypesUpdateIndexDev = -1;
+      currentHookNameInDev = null;
+    }
 
-function warnIfHydrating() {
-  {
-    !!isHydrating ? warning$1(false, 'We should not be hydrating here. This is a bug in React. Please file a bug.') : void 0;
+    didScheduleRenderPhaseUpdate = false;
   }
-}
 
-function enterHydrationState(fiber) {
-  if (!supportsHydration) {
-    return false;
-  }
+  function mountWorkInProgressHook() {
+    var hook = {
+      memoizedState: null,
+      baseState: null,
+      baseQueue: null,
+      queue: null,
+      next: null
+    };
 
-  var parentInstance = fiber.stateNode.containerInfo;
-  nextHydratableInstance = getFirstHydratableChild(parentInstance);
-  hydrationParentFiber = fiber;
-  isHydrating = true;
-  return true;
-}
+    if (workInProgressHook === null) {
+      // This is the first hook in the list
+      currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;
+    } else {
+      // Append to the end of the list
+      workInProgressHook = workInProgressHook.next = hook;
+    }
 
-function reenterHydrationStateFromDehydratedSuspenseInstance(fiber, suspenseInstance) {
-  if (!supportsHydration) {
-    return false;
+    return workInProgressHook;
   }
 
-  nextHydratableInstance = getNextHydratableSibling(suspenseInstance);
-  popToNextHostParent(fiber);
-  isHydrating = true;
-  return true;
-}
+  function updateWorkInProgressHook() {
+    // This function is used both for updates and for re-renders triggered by a
+    // render phase update. It assumes there is either a current hook we can
+    // clone, or a work-in-progress hook from a previous render pass that we can
+    // use as a base. When we reach the end of the base list, we must switch to
+    // the dispatcher used for mounts.
+    var nextCurrentHook;
 
-function deleteHydratableInstance(returnFiber, instance) {
-  {
-    switch (returnFiber.tag) {
-      case HostRoot:
-        didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);
-        break;
+    if (currentHook === null) {
+      var current = currentlyRenderingFiber$1.alternate;
 
-      case HostComponent:
-        didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);
-        break;
+      if (current !== null) {
+        nextCurrentHook = current.memoizedState;
+      } else {
+        nextCurrentHook = null;
+      }
+    } else {
+      nextCurrentHook = currentHook.next;
     }
-  }
-
-  var childToDelete = createFiberFromHostInstanceForDeletion();
-  childToDelete.stateNode = instance;
-  childToDelete.return = returnFiber;
-  childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However,
-  // these children are not part of the reconciliation list of children.
-  // Even if we abort and rereconcile the children, that will try to hydrate
-  // again and the nodes are still in the host tree so these will be
-  // recreated.
 
-  if (returnFiber.lastEffect !== null) {
-    returnFiber.lastEffect.nextEffect = childToDelete;
-    returnFiber.lastEffect = childToDelete;
-  } else {
-    returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
-  }
-}
+    var nextWorkInProgressHook;
 
-function insertNonHydratedInstance(returnFiber, fiber) {
-  fiber.effectTag = fiber.effectTag & ~Hydrating | Placement;
+    if (workInProgressHook === null) {
+      nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;
+    } else {
+      nextWorkInProgressHook = workInProgressHook.next;
+    }
 
-  {
-    switch (returnFiber.tag) {
-      case HostRoot:
+    if (nextWorkInProgressHook !== null) {
+      // There's already a work-in-progress. Reuse it.
+      workInProgressHook = nextWorkInProgressHook;
+      nextWorkInProgressHook = workInProgressHook.next;
+      currentHook = nextCurrentHook;
+    } else {
+      // Clone from the current hook.
+      if (!(nextCurrentHook !== null)) {
         {
-          var parentContainer = returnFiber.stateNode.containerInfo;
-
-          switch (fiber.tag) {
-            case HostComponent:
-              var type = fiber.type;
-              var props = fiber.pendingProps;
-              didNotFindHydratableContainerInstance(parentContainer, type, props);
-              break;
-
-            case HostText:
-              var text = fiber.pendingProps;
-              didNotFindHydratableContainerTextInstance(parentContainer, text);
-              break;
-
-            case SuspenseComponent:
-              
-              break;
-          }
-
-          break;
+          throw Error( "Rendered more hooks than during the previous render." );
         }
+      }
 
-      case HostComponent:
-        {
-          var parentType = returnFiber.type;
-          var parentProps = returnFiber.memoizedProps;
-          var parentInstance = returnFiber.stateNode;
+      currentHook = nextCurrentHook;
+      var newHook = {
+        memoizedState: currentHook.memoizedState,
+        baseState: currentHook.baseState,
+        baseQueue: currentHook.baseQueue,
+        queue: currentHook.queue,
+        next: null
+      };
+
+      if (workInProgressHook === null) {
+        // This is the first hook in the list.
+        currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;
+      } else {
+        // Append to the end of the list.
+        workInProgressHook = workInProgressHook.next = newHook;
+      }
+    }
 
-          switch (fiber.tag) {
-            case HostComponent:
-              var _type = fiber.type;
-              var _props = fiber.pendingProps;
-              didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props);
-              break;
+    return workInProgressHook;
+  }
 
-            case HostText:
-              var _text = fiber.pendingProps;
-              didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);
-              break;
+  function createFunctionComponentUpdateQueue() {
+    return {
+      lastEffect: null
+    };
+  }
 
-            case SuspenseComponent:
-              didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance);
-              break;
-          }
+  function basicStateReducer(state, action) {
+    // $FlowFixMe: Flow doesn't like mixed types
+    return typeof action === 'function' ? action(state) : action;
+  }
 
-          break;
-        }
+  function mountReducer(reducer, initialArg, init) {
+    var hook = mountWorkInProgressHook();
+    var initialState;
 
-      default:
-        return;
+    if (init !== undefined) {
+      initialState = init(initialArg);
+    } else {
+      initialState = initialArg;
     }
+
+    hook.memoizedState = hook.baseState = initialState;
+    var queue = hook.queue = {
+      pending: null,
+      dispatch: null,
+      lastRenderedReducer: reducer,
+      lastRenderedState: initialState
+    };
+    var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);
+    return [hook.memoizedState, dispatch];
   }
-}
 
-function tryHydrate(fiber, nextInstance) {
-  switch (fiber.tag) {
-    case HostComponent:
+  function updateReducer(reducer, initialArg, init) {
+    var hook = updateWorkInProgressHook();
+    var queue = hook.queue;
+
+    if (!(queue !== null)) {
       {
-        var type = fiber.type;
-        var props = fiber.pendingProps;
-        var instance = canHydrateInstance(nextInstance, type, props);
+        throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." );
+      }
+    }
 
-        if (instance !== null) {
-          fiber.stateNode = instance;
-          return true;
-        }
+    queue.lastRenderedReducer = reducer;
+    var current = currentHook; // The last rebase update that is NOT part of the base state.
 
-        return false;
+    var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.
+
+    var pendingQueue = queue.pending;
+
+    if (pendingQueue !== null) {
+      // We have new updates that haven't been processed yet.
+      // We'll add them to the base queue.
+      if (baseQueue !== null) {
+        // Merge the pending queue and the base queue.
+        var baseFirst = baseQueue.next;
+        var pendingFirst = pendingQueue.next;
+        baseQueue.next = pendingFirst;
+        pendingQueue.next = baseFirst;
       }
 
-    case HostText:
-      {
-        var text = fiber.pendingProps;
-        var textInstance = canHydrateTextInstance(nextInstance, text);
+      current.baseQueue = baseQueue = pendingQueue;
+      queue.pending = null;
+    }
 
-        if (textInstance !== null) {
-          fiber.stateNode = textInstance;
-          return true;
-        }
+    if (baseQueue !== null) {
+      // We have a queue to process.
+      var first = baseQueue.next;
+      var newState = current.baseState;
+      var newBaseState = null;
+      var newBaseQueueFirst = null;
+      var newBaseQueueLast = null;
+      var update = first;
 
-        return false;
-      }
+      do {
+        var updateExpirationTime = update.expirationTime;
+
+        if (updateExpirationTime < renderExpirationTime) {
+          // Priority is insufficient. Skip this update. If this is the first
+          // skipped update, the previous update/state is the new base
+          // update/state.
+          var clone = {
+            expirationTime: update.expirationTime,
+            suspenseConfig: update.suspenseConfig,
+            action: update.action,
+            eagerReducer: update.eagerReducer,
+            eagerState: update.eagerState,
+            next: null
+          };
 
-    case SuspenseComponent:
-      {
-        if (enableSuspenseServerRenderer) {
-          var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
+          if (newBaseQueueLast === null) {
+            newBaseQueueFirst = newBaseQueueLast = clone;
+            newBaseState = newState;
+          } else {
+            newBaseQueueLast = newBaseQueueLast.next = clone;
+          } // Update the remaining priority in the queue.
 
-          if (suspenseInstance !== null) {
-            var suspenseState = {
-              dehydrated: suspenseInstance,
-              retryTime: Never
-            };
-            fiber.memoizedState = suspenseState; // Store the dehydrated fragment as a child fiber.
-            // This simplifies the code for getHostSibling and deleting nodes,
-            // since it doesn't have to consider all Suspense boundaries and
-            // check if they're dehydrated ones or not.
-
-            var dehydratedFragment = createFiberFromDehydratedFragment(suspenseInstance);
-            dehydratedFragment.return = fiber;
-            fiber.child = dehydratedFragment;
-            return true;
-          }
-        }
 
-        return false;
-      }
+          if (updateExpirationTime > currentlyRenderingFiber$1.expirationTime) {
+            currentlyRenderingFiber$1.expirationTime = updateExpirationTime;
+            markUnprocessedUpdateTime(updateExpirationTime);
+          }
+        } else {
+          // This update does have sufficient priority.
+          if (newBaseQueueLast !== null) {
+            var _clone = {
+              expirationTime: Sync,
+              // This update is going to be committed so we never want uncommit it.
+              suspenseConfig: update.suspenseConfig,
+              action: update.action,
+              eagerReducer: update.eagerReducer,
+              eagerState: update.eagerState,
+              next: null
+            };
+            newBaseQueueLast = newBaseQueueLast.next = _clone;
+          } // Mark the event time of this update as relevant to this render pass.
+          // TODO: This should ideally use the true event time of this update rather than
+          // its priority which is a derived and not reverseable value.
+          // TODO: We should skip this update if it was already committed but currently
+          // we have no way of detecting the difference between a committed and suspended
+          // update here.
 
-    default:
-      return false;
-  }
-}
 
-function tryToClaimNextHydratableInstance(fiber) {
-  if (!isHydrating) {
-    return;
-  }
+          markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.
 
-  var nextInstance = nextHydratableInstance;
+          if (update.eagerReducer === reducer) {
+            // If this update was processed eagerly, and its reducer matches the
+            // current reducer, we can use the eagerly computed state.
+            newState = update.eagerState;
+          } else {
+            var action = update.action;
+            newState = reducer(newState, action);
+          }
+        }
 
-  if (!nextInstance) {
-    // Nothing to hydrate. Make it an insertion.
-    insertNonHydratedInstance(hydrationParentFiber, fiber);
-    isHydrating = false;
-    hydrationParentFiber = fiber;
-    return;
-  }
+        update = update.next;
+      } while (update !== null && update !== first);
 
-  var firstAttemptedInstance = nextInstance;
+      if (newBaseQueueLast === null) {
+        newBaseState = newState;
+      } else {
+        newBaseQueueLast.next = newBaseQueueFirst;
+      } // Mark that the fiber performed work, but only if the new state is
+      // different from the current state.
 
-  if (!tryHydrate(fiber, nextInstance)) {
-    // If we can't hydrate this instance let's try the next one.
-    // We use this as a heuristic. It's based on intuition and not data so it
-    // might be flawed or unnecessary.
-    nextInstance = getNextHydratableSibling(firstAttemptedInstance);
 
-    if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
-      // Nothing to hydrate. Make it an insertion.
-      insertNonHydratedInstance(hydrationParentFiber, fiber);
-      isHydrating = false;
-      hydrationParentFiber = fiber;
-      return;
-    } // We matched the next one, we'll now assume that the first one was
-    // superfluous and we'll delete it. Since we can't eagerly delete it
-    // we'll have to schedule a deletion. To do that, this node needs a dummy
-    // fiber associated with it.
+      if (!objectIs(newState, hook.memoizedState)) {
+        markWorkInProgressReceivedUpdate();
+      }
 
+      hook.memoizedState = newState;
+      hook.baseState = newBaseState;
+      hook.baseQueue = newBaseQueueLast;
+      queue.lastRenderedState = newState;
+    }
 
-    deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);
+    var dispatch = queue.dispatch;
+    return [hook.memoizedState, dispatch];
   }
 
-  hydrationParentFiber = fiber;
-  nextHydratableInstance = getFirstHydratableChild(nextInstance);
-}
+  function rerenderReducer(reducer, initialArg, init) {
+    var hook = updateWorkInProgressHook();
+    var queue = hook.queue;
 
-function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
-  if (!supportsHydration) {
-    {
+    if (!(queue !== null)) {
       {
-        throw Error("Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");
+        throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." );
       }
     }
-  }
 
-  var instance = fiber.stateNode;
-  var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component.
-
-  fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
-  // is a new ref we mark this as an update.
+    queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous
+    // work-in-progress hook.
 
-  if (updatePayload !== null) {
-    return true;
-  }
+    var dispatch = queue.dispatch;
+    var lastRenderPhaseUpdate = queue.pending;
+    var newState = hook.memoizedState;
 
-  return false;
-}
+    if (lastRenderPhaseUpdate !== null) {
+      // The queue doesn't persist past this render pass.
+      queue.pending = null;
+      var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;
+      var update = firstRenderPhaseUpdate;
 
-function prepareToHydrateHostTextInstance(fiber) {
-  if (!supportsHydration) {
-    {
-      {
-        throw Error("Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");
-      }
-    }
-  }
+      do {
+        // Process this render phase update. We don't have to check the
+        // priority because it will always be the same as the current
+        // render's.
+        var action = update.action;
+        newState = reducer(newState, action);
+        update = update.next;
+      } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is
+      // different from the current state.
 
-  var textInstance = fiber.stateNode;
-  var textContent = fiber.memoizedProps;
-  var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
 
-  {
-    if (shouldUpdate) {
-      // We assume that prepareToHydrateHostTextInstance is called in a context where the
-      // hydration parent is the parent host component of this host text.
-      var returnFiber = hydrationParentFiber;
+      if (!objectIs(newState, hook.memoizedState)) {
+        markWorkInProgressReceivedUpdate();
+      }
 
-      if (returnFiber !== null) {
-        switch (returnFiber.tag) {
-          case HostRoot:
-            {
-              var parentContainer = returnFiber.stateNode.containerInfo;
-              didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);
-              break;
-            }
+      hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to
+      // the base state unless the queue is empty.
+      // TODO: Not sure if this is the desired semantics, but it's what we
+      // do for gDSFP. I can't remember why.
 
-          case HostComponent:
-            {
-              var parentType = returnFiber.type;
-              var parentProps = returnFiber.memoizedProps;
-              var parentInstance = returnFiber.stateNode;
-              didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);
-              break;
-            }
-        }
+      if (hook.baseQueue === null) {
+        hook.baseState = newState;
       }
+
+      queue.lastRenderedState = newState;
     }
+
+    return [newState, dispatch];
   }
 
-  return shouldUpdate;
-}
+  function mountState(initialState) {
+    var hook = mountWorkInProgressHook();
 
-function prepareToHydrateHostSuspenseInstance(fiber) {
-  if (!supportsHydration) {
-    {
-      {
-        throw Error("Expected prepareToHydrateHostSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");
-      }
+    if (typeof initialState === 'function') {
+      // $FlowFixMe: Flow doesn't like mixed types
+      initialState = initialState();
     }
+
+    hook.memoizedState = hook.baseState = initialState;
+    var queue = hook.queue = {
+      pending: null,
+      dispatch: null,
+      lastRenderedReducer: basicStateReducer,
+      lastRenderedState: initialState
+    };
+    var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);
+    return [hook.memoizedState, dispatch];
   }
 
-  var suspenseState = fiber.memoizedState;
-  var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
+  function updateState(initialState) {
+    return updateReducer(basicStateReducer);
+  }
 
-  if (!suspenseInstance) {
-    {
-      throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");
-    }
+  function rerenderState(initialState) {
+    return rerenderReducer(basicStateReducer);
   }
 
-  hydrateSuspenseInstance(suspenseInstance, fiber);
-}
+  function pushEffect(tag, create, destroy, deps) {
+    var effect = {
+      tag: tag,
+      create: create,
+      destroy: destroy,
+      deps: deps,
+      // Circular
+      next: null
+    };
+    var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
 
-function skipPastDehydratedSuspenseInstance(fiber) {
-  if (!supportsHydration) {
-    {
-      {
-        throw Error("Expected skipPastDehydratedSuspenseInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.");
+    if (componentUpdateQueue === null) {
+      componentUpdateQueue = createFunctionComponentUpdateQueue();
+      currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
+      componentUpdateQueue.lastEffect = effect.next = effect;
+    } else {
+      var lastEffect = componentUpdateQueue.lastEffect;
+
+      if (lastEffect === null) {
+        componentUpdateQueue.lastEffect = effect.next = effect;
+      } else {
+        var firstEffect = lastEffect.next;
+        lastEffect.next = effect;
+        effect.next = firstEffect;
+        componentUpdateQueue.lastEffect = effect;
       }
     }
+
+    return effect;
   }
 
-  var suspenseState = fiber.memoizedState;
-  var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
+  function mountRef(initialValue) {
+    var hook = mountWorkInProgressHook();
+    var ref = {
+      current: initialValue
+    };
 
-  if (!suspenseInstance) {
     {
-      throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");
+      Object.seal(ref);
     }
-  }
-
-  return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
-}
 
-function popToNextHostParent(fiber) {
-  var parent = fiber.return;
-
-  while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {
-    parent = parent.return;
-  }
-
-  hydrationParentFiber = parent;
-}
-
-function popHydrationState(fiber) {
-  if (!supportsHydration) {
-    return false;
+    hook.memoizedState = ref;
+    return ref;
   }
 
-  if (fiber !== hydrationParentFiber) {
-    // We're deeper than the current hydration context, inside an inserted
-    // tree.
-    return false;
+  function updateRef(initialValue) {
+    var hook = updateWorkInProgressHook();
+    return hook.memoizedState;
   }
 
-  if (!isHydrating) {
-    // If we're not currently hydrating but we're in a hydration context, then
-    // we were an insertion and now need to pop up reenter hydration of our
-    // siblings.
-    popToNextHostParent(fiber);
-    isHydrating = true;
-    return false;
+  function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
+    var hook = mountWorkInProgressHook();
+    var nextDeps = deps === undefined ? null : deps;
+    currentlyRenderingFiber$1.effectTag |= fiberEffectTag;
+    hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, undefined, nextDeps);
   }
 
-  var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now.
-  // We only do this deeper than head and body since they tend to have random
-  // other nodes in them. We also ignore components with pure text content in
-  // side of them.
-  // TODO: Better heuristic.
+  function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {
+    var hook = updateWorkInProgressHook();
+    var nextDeps = deps === undefined ? null : deps;
+    var destroy = undefined;
 
-  if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {
-    var nextInstance = nextHydratableInstance;
+    if (currentHook !== null) {
+      var prevEffect = currentHook.memoizedState;
+      destroy = prevEffect.destroy;
 
-    while (nextInstance) {
-      deleteHydratableInstance(fiber, nextInstance);
-      nextInstance = getNextHydratableSibling(nextInstance);
-    }
-  }
-
-  popToNextHostParent(fiber);
-
-  if (fiber.tag === SuspenseComponent) {
-    nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);
-  } else {
-    nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
-  }
-
-  return true;
-}
-
-function resetHydrationState() {
-  if (!supportsHydration) {
-    return;
-  }
-
-  hydrationParentFiber = null;
-  nextHydratableInstance = null;
-  isHydrating = false;
-}
-
-var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
-var didReceiveUpdate = false;
-var didWarnAboutBadClass;
-var didWarnAboutModulePatternComponent;
-var didWarnAboutContextTypeOnFunctionComponent;
-var didWarnAboutGetDerivedStateOnFunctionComponent;
-var didWarnAboutFunctionRefs;
-var didWarnAboutReassigningProps;
-var didWarnAboutMaxDuration;
-var didWarnAboutRevealOrder;
-var didWarnAboutTailOptions;
-var didWarnAboutDefaultPropsOnFunctionComponent;
-
-{
-  didWarnAboutBadClass = {};
-  didWarnAboutModulePatternComponent = {};
-  didWarnAboutContextTypeOnFunctionComponent = {};
-  didWarnAboutGetDerivedStateOnFunctionComponent = {};
-  didWarnAboutFunctionRefs = {};
-  didWarnAboutReassigningProps = false;
-  didWarnAboutMaxDuration = false;
-  didWarnAboutRevealOrder = {};
-  didWarnAboutTailOptions = {};
-  didWarnAboutDefaultPropsOnFunctionComponent = {};
-}
-
-function reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime) {
-  if (current$$1 === null) {
-    // If this is a fresh new component that hasn't been rendered yet, we
-    // won't update its child set by applying minimal side-effects. Instead,
-    // we will add them all to the child before it gets rendered. That means
-    // we can optimize this reconciliation pass by not tracking side-effects.
-    workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
-  } else {
-    // If the current child is the same as the work in progress, it means that
-    // we haven't yet started any work on these children. Therefore, we use
-    // the clone algorithm to create a copy of all the current children.
-    // If we had any progressed work already, that is invalid at this point so
-    // let's throw it out.
-    workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, nextChildren, renderExpirationTime);
-  }
-}
-
-function forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime) {
-  // This function is fork of reconcileChildren. It's used in cases where we
-  // want to reconcile without matching against the existing set. This has the
-  // effect of all current children being unmounted; even if the type and key
-  // are the same, the old child is unmounted and a new child is created.
-  //
-  // To do this, we're going to go through the reconcile algorithm twice. In
-  // the first pass, we schedule a deletion for all the current children by
-  // passing null.
-  workInProgress.child = reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we
-  // pass null in place of where we usually pass the current child set. This has
-  // the effect of remounting all children regardless of whether their their
-  // identity matches.
-
-  workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
-}
-
-function updateForwardRef(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
-  // TODO: current can be non-null here even if the component
-  // hasn't yet mounted. This happens after the first render suspends.
-  // We'll need to figure out if this is fine or can cause issues.
-  {
-    if (workInProgress.type !== workInProgress.elementType) {
-      // Lazy component props can't be validated in createElement
-      // because they're only guaranteed to be resolved here.
-      var innerPropTypes = Component.propTypes;
+      if (nextDeps !== null) {
+        var prevDeps = prevEffect.deps;
 
-      if (innerPropTypes) {
-        checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
-        'prop', getComponentName(Component), getCurrentFiberStackInDev);
+        if (areHookInputsEqual(nextDeps, prevDeps)) {
+          pushEffect(hookEffectTag, create, destroy, nextDeps);
+          return;
+        }
       }
     }
-  }
 
-  var render = Component.render;
-  var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent
-
-  var nextChildren;
-  prepareToReadContext(workInProgress, renderExpirationTime);
-
-  {
-    ReactCurrentOwner$3.current = workInProgress;
-    setCurrentPhase('render');
-    nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
+    currentlyRenderingFiber$1.effectTag |= fiberEffectTag;
+    hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, destroy, nextDeps);
+  }
 
-    if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-      // Only double-render components with Hooks
-      if (workInProgress.memoizedState !== null) {
-        nextChildren = renderWithHooks(current$$1, workInProgress, render, nextProps, ref, renderExpirationTime);
+  function mountEffect(create, deps) {
+    {
+      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
+      if ('undefined' !== typeof jest) {
+        warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);
       }
     }
 
-    setCurrentPhase(null);
+    return mountEffectImpl(Update | Passive, Passive$1, create, deps);
   }
 
-  if (current$$1 !== null && !didReceiveUpdate) {
-    bailoutHooks(current$$1, workInProgress, renderExpirationTime);
-    return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
-  } // React DevTools reads this flag.
-
+  function updateEffect(create, deps) {
+    {
+      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
+      if ('undefined' !== typeof jest) {
+        warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);
+      }
+    }
 
-  workInProgress.effectTag |= PerformedWork;
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+    return updateEffectImpl(Update | Passive, Passive$1, create, deps);
+  }
 
-function updateMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
-  if (current$$1 === null) {
-    var type = Component.type;
+  function mountLayoutEffect(create, deps) {
+    return mountEffectImpl(Update, Layout, create, deps);
+  }
 
-    if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.
-    Component.defaultProps === undefined) {
-      var resolvedType = type;
+  function updateLayoutEffect(create, deps) {
+    return updateEffectImpl(Update, Layout, create, deps);
+  }
 
-      {
-        resolvedType = resolveFunctionForHotReloading(type);
-      } // If this is a plain function component without default props,
-      // and with only the default shallow comparison, we upgrade it
-      // to a SimpleMemoComponent to allow fast path updates.
+  function imperativeHandleEffect(create, ref) {
+    if (typeof ref === 'function') {
+      var refCallback = ref;
 
+      var _inst = create();
 
-      workInProgress.tag = SimpleMemoComponent;
-      workInProgress.type = resolvedType;
+      refCallback(_inst);
+      return function () {
+        refCallback(null);
+      };
+    } else if (ref !== null && ref !== undefined) {
+      var refObject = ref;
 
       {
-        validateFunctionComponentInDev(workInProgress, type);
+        if (!refObject.hasOwnProperty('current')) {
+          error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}');
+        }
       }
 
-      return updateSimpleMemoComponent(current$$1, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime);
+      var _inst2 = create();
+
+      refObject.current = _inst2;
+      return function () {
+        refObject.current = null;
+      };
     }
+  }
 
+  function mountImperativeHandle(ref, create, deps) {
     {
-      var innerPropTypes = type.propTypes;
-
-      if (innerPropTypes) {
-        // Inner memo component props aren't currently validated in createElement.
-        // We could move it there, but we'd still need this for lazy code path.
-        checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
-        'prop', getComponentName(type), getCurrentFiberStackInDev);
+      if (typeof create !== 'function') {
+        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
       }
-    }
+    } // TODO: If deps are provided, should we skip comparing the ref itself?
+
 
-    var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);
-    child.ref = workInProgress.ref;
-    child.return = workInProgress;
-    workInProgress.child = child;
-    return child;
+    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
+    return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
   }
 
-  {
-    var _type = Component.type;
-    var _innerPropTypes = _type.propTypes;
+  function updateImperativeHandle(ref, create, deps) {
+    {
+      if (typeof create !== 'function') {
+        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
+      }
+    } // TODO: If deps are provided, should we skip comparing the ref itself?
 
-    if (_innerPropTypes) {
-      // Inner memo component props aren't currently validated in createElement.
-      // We could move it there, but we'd still need this for lazy code path.
-      checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props
-      'prop', getComponentName(_type), getCurrentFiberStackInDev);
-    }
+
+    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
+    return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
   }
 
-  var currentChild = current$$1.child; // This is always exactly one child
+  function mountDebugValue(value, formatterFn) {// This hook is normally a no-op.
+    // The react-debug-hooks package injects its own implementation
+    // so that e.g. DevTools can display custom hook values.
+  }
 
-  if (updateExpirationTime < renderExpirationTime) {
-    // This will be the props with resolved defaultProps,
-    // unlike current.memoizedProps which will be the unresolved ones.
-    var prevProps = currentChild.memoizedProps; // Default to shallow comparison
+  var updateDebugValue = mountDebugValue;
 
-    var compare = Component.compare;
-    compare = compare !== null ? compare : shallowEqual;
+  function mountCallback(callback, deps) {
+    var hook = mountWorkInProgressHook();
+    var nextDeps = deps === undefined ? null : deps;
+    hook.memoizedState = [callback, nextDeps];
+    return callback;
+  }
 
-    if (compare(prevProps, nextProps) && current$$1.ref === workInProgress.ref) {
-      return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
-    }
-  } // React DevTools reads this flag.
+  function updateCallback(callback, deps) {
+    var hook = updateWorkInProgressHook();
+    var nextDeps = deps === undefined ? null : deps;
+    var prevState = hook.memoizedState;
 
+    if (prevState !== null) {
+      if (nextDeps !== null) {
+        var prevDeps = prevState[1];
 
-  workInProgress.effectTag |= PerformedWork;
-  var newChild = createWorkInProgress(currentChild, nextProps, renderExpirationTime);
-  newChild.ref = workInProgress.ref;
-  newChild.return = workInProgress;
-  workInProgress.child = newChild;
-  return newChild;
-}
+        if (areHookInputsEqual(nextDeps, prevDeps)) {
+          return prevState[0];
+        }
+      }
+    }
 
-function updateSimpleMemoComponent(current$$1, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
-  // TODO: current can be non-null here even if the component
-  // hasn't yet mounted. This happens when the inner render suspends.
-  // We'll need to figure out if this is fine or can cause issues.
-  {
-    if (workInProgress.type !== workInProgress.elementType) {
-      // Lazy component props can't be validated in createElement
-      // because they're only guaranteed to be resolved here.
-      var outerMemoType = workInProgress.elementType;
+    hook.memoizedState = [callback, nextDeps];
+    return callback;
+  }
 
-      if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
-        // We warn when you define propTypes on lazy()
-        // so let's just skip over it to find memo() outer wrapper.
-        // Inner props for memo are validated later.
-        outerMemoType = refineResolvedLazyComponent(outerMemoType);
-      }
+  function mountMemo(nextCreate, deps) {
+    var hook = mountWorkInProgressHook();
+    var nextDeps = deps === undefined ? null : deps;
+    var nextValue = nextCreate();
+    hook.memoizedState = [nextValue, nextDeps];
+    return nextValue;
+  }
 
-      var outerPropTypes = outerMemoType && outerMemoType.propTypes;
+  function updateMemo(nextCreate, deps) {
+    var hook = updateWorkInProgressHook();
+    var nextDeps = deps === undefined ? null : deps;
+    var prevState = hook.memoizedState;
 
-      if (outerPropTypes) {
-        checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
-        'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);
-      } // Inner propTypes will be validated in the function component path.
+    if (prevState !== null) {
+      // Assume these are defined. If they're not, areHookInputsEqual will warn.
+      if (nextDeps !== null) {
+        var prevDeps = prevState[1];
 
+        if (areHookInputsEqual(nextDeps, prevDeps)) {
+          return prevState[0];
+        }
+      }
     }
+
+    var nextValue = nextCreate();
+    hook.memoizedState = [nextValue, nextDeps];
+    return nextValue;
   }
 
-  if (current$$1 !== null) {
-    var prevProps = current$$1.memoizedProps;
+  function mountDeferredValue(value, config) {
+    var _mountState = mountState(value),
+        prevValue = _mountState[0],
+        setValue = _mountState[1];
 
-    if (shallowEqual(prevProps, nextProps) && current$$1.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload:
-    workInProgress.type === current$$1.type)) {
-      didReceiveUpdate = false;
+    mountEffect(function () {
+      var previousConfig = ReactCurrentBatchConfig$1.suspense;
+      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
 
-      if (updateExpirationTime < renderExpirationTime) {
-        return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
+      try {
+        setValue(value);
+      } finally {
+        ReactCurrentBatchConfig$1.suspense = previousConfig;
       }
-    }
+    }, [value, config]);
+    return prevValue;
   }
 
-  return updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
-}
+  function updateDeferredValue(value, config) {
+    var _updateState = updateState(),
+        prevValue = _updateState[0],
+        setValue = _updateState[1];
 
-function updateFragment(current$$1, workInProgress, renderExpirationTime) {
-  var nextChildren = workInProgress.pendingProps;
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
-
-function updateMode(current$$1, workInProgress, renderExpirationTime) {
-  var nextChildren = workInProgress.pendingProps.children;
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+    updateEffect(function () {
+      var previousConfig = ReactCurrentBatchConfig$1.suspense;
+      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
 
-function updateProfiler(current$$1, workInProgress, renderExpirationTime) {
-  if (enableProfilerTimer) {
-    workInProgress.effectTag |= Update;
+      try {
+        setValue(value);
+      } finally {
+        ReactCurrentBatchConfig$1.suspense = previousConfig;
+      }
+    }, [value, config]);
+    return prevValue;
   }
 
-  var nextProps = workInProgress.pendingProps;
-  var nextChildren = nextProps.children;
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+  function rerenderDeferredValue(value, config) {
+    var _rerenderState = rerenderState(),
+        prevValue = _rerenderState[0],
+        setValue = _rerenderState[1];
 
-function markRef(current$$1, workInProgress) {
-  var ref = workInProgress.ref;
+    updateEffect(function () {
+      var previousConfig = ReactCurrentBatchConfig$1.suspense;
+      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
 
-  if (current$$1 === null && ref !== null || current$$1 !== null && current$$1.ref !== ref) {
-    // Schedule a Ref effect
-    workInProgress.effectTag |= Ref;
+      try {
+        setValue(value);
+      } finally {
+        ReactCurrentBatchConfig$1.suspense = previousConfig;
+      }
+    }, [value, config]);
+    return prevValue;
   }
-}
 
-function updateFunctionComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
-  {
-    if (workInProgress.type !== workInProgress.elementType) {
-      // Lazy component props can't be validated in createElement
-      // because they're only guaranteed to be resolved here.
-      var innerPropTypes = Component.propTypes;
+  function startTransition(setPending, config, callback) {
+    var priorityLevel = getCurrentPriorityLevel();
+    runWithPriority$1(priorityLevel < UserBlockingPriority$1 ? UserBlockingPriority$1 : priorityLevel, function () {
+      setPending(true);
+    });
+    runWithPriority$1(priorityLevel > NormalPriority ? NormalPriority : priorityLevel, function () {
+      var previousConfig = ReactCurrentBatchConfig$1.suspense;
+      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;
 
-      if (innerPropTypes) {
-        checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
-        'prop', getComponentName(Component), getCurrentFiberStackInDev);
+      try {
+        setPending(false);
+        callback();
+      } finally {
+        ReactCurrentBatchConfig$1.suspense = previousConfig;
       }
-    }
+    });
   }
 
-  var context;
+  function mountTransition(config) {
+    var _mountState2 = mountState(false),
+        isPending = _mountState2[0],
+        setPending = _mountState2[1];
 
-  if (!disableLegacyContext) {
-    var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
-    context = getMaskedContext(workInProgress, unmaskedContext);
+    var start = mountCallback(startTransition.bind(null, setPending, config), [setPending, config]);
+    return [start, isPending];
   }
 
-  var nextChildren;
-  prepareToReadContext(workInProgress, renderExpirationTime);
+  function updateTransition(config) {
+    var _updateState2 = updateState(),
+        isPending = _updateState2[0],
+        setPending = _updateState2[1];
 
-  {
-    ReactCurrentOwner$3.current = workInProgress;
-    setCurrentPhase('render');
-    nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
+    var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);
+    return [start, isPending];
+  }
 
-    if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-      // Only double-render components with Hooks
-      if (workInProgress.memoizedState !== null) {
-        nextChildren = renderWithHooks(current$$1, workInProgress, Component, nextProps, context, renderExpirationTime);
-      }
-    }
+  function rerenderTransition(config) {
+    var _rerenderState2 = rerenderState(),
+        isPending = _rerenderState2[0],
+        setPending = _rerenderState2[1];
 
-    setCurrentPhase(null);
+    var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);
+    return [start, isPending];
   }
 
-  if (current$$1 !== null && !didReceiveUpdate) {
-    bailoutHooks(current$$1, workInProgress, renderExpirationTime);
-    return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
-  } // React DevTools reads this flag.
+  function dispatchAction(fiber, queue, action) {
+    {
+      if (typeof arguments[3] === 'function') {
+        error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');
+      }
+    }
+
+    var currentTime = requestCurrentTimeForUpdate();
+    var suspenseConfig = requestCurrentSuspenseConfig();
+    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);
+    var update = {
+      expirationTime: expirationTime,
+      suspenseConfig: suspenseConfig,
+      action: action,
+      eagerReducer: null,
+      eagerState: null,
+      next: null
+    };
 
+    {
+      update.priority = getCurrentPriorityLevel();
+    } // Append the update to the end of the list.
 
-  workInProgress.effectTag |= PerformedWork;
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
 
-function updateClassComponent(current$$1, workInProgress, Component, nextProps, renderExpirationTime) {
-  {
-    if (workInProgress.type !== workInProgress.elementType) {
-      // Lazy component props can't be validated in createElement
-      // because they're only guaranteed to be resolved here.
-      var innerPropTypes = Component.propTypes;
+    var pending = queue.pending;
 
-      if (innerPropTypes) {
-        checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
-        'prop', getComponentName(Component), getCurrentFiberStackInDev);
-      }
+    if (pending === null) {
+      // This is the first update. Create a circular list.
+      update.next = update;
+    } else {
+      update.next = pending.next;
+      pending.next = update;
     }
-  } // Push context providers early to prevent context stack mismatches.
-  // During mounting we don't know the child context yet as the instance doesn't exist.
-  // We will invalidate the child context in finishClassComponent() right after rendering.
 
+    queue.pending = update;
+    var alternate = fiber.alternate;
 
-  var hasContext;
-
-  if (isContextProvider(Component)) {
-    hasContext = true;
-    pushContextProvider(workInProgress);
-  } else {
-    hasContext = false;
-  }
+    if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {
+      // This is a render phase update. Stash it in a lazily-created map of
+      // queue -> linked list of updates. After this render pass, we'll restart
+      // and apply the stashed updates on top of the work-in-progress hook.
+      didScheduleRenderPhaseUpdate = true;
+      update.expirationTime = renderExpirationTime;
+      currentlyRenderingFiber$1.expirationTime = renderExpirationTime;
+    } else {
+      if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {
+        // The queue is currently empty, which means we can eagerly compute the
+        // next state before entering the render phase. If the new state is the
+        // same as the current state, we may be able to bail out entirely.
+        var lastRenderedReducer = queue.lastRenderedReducer;
 
-  prepareToReadContext(workInProgress, renderExpirationTime);
-  var instance = workInProgress.stateNode;
-  var shouldUpdate;
+        if (lastRenderedReducer !== null) {
+          var prevDispatcher;
 
-  if (instance === null) {
-    if (current$$1 !== null) {
-      // An class component without an instance only mounts if it suspended
-      // inside a non- concurrent tree, in an inconsistent state. We want to
-      // tree it like a new mount, even though an empty version of it already
-      // committed. Disconnect the alternate pointers.
-      current$$1.alternate = null;
-      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
+          {
+            prevDispatcher = ReactCurrentDispatcher.current;
+            ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
+          }
 
-      workInProgress.effectTag |= Placement;
-    } // In the initial pass we might need to construct the instance.
+          try {
+            var currentState = queue.lastRenderedState;
+            var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute
+            // it, on the update object. If the reducer hasn't changed by the
+            // time we enter the render phase, then the eager state can be used
+            // without calling the reducer again.
+
+            update.eagerReducer = lastRenderedReducer;
+            update.eagerState = eagerState;
+
+            if (objectIs(eagerState, currentState)) {
+              // Fast path. We can bail out without scheduling React to re-render.
+              // It's still possible that we'll need to rebase this update later,
+              // if the component re-renders for a different reason and by that
+              // time the reducer has changed.
+              return;
+            }
+          } catch (error) {// Suppress the error. It will throw again in the render phase.
+          } finally {
+            {
+              ReactCurrentDispatcher.current = prevDispatcher;
+            }
+          }
+        }
+      }
 
+      {
+        // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
+        if ('undefined' !== typeof jest) {
+          warnIfNotScopedWithMatchingAct(fiber);
+          warnIfNotCurrentlyActingUpdatesInDev(fiber);
+        }
+      }
 
-    constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
-    mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
-    shouldUpdate = true;
-  } else if (current$$1 === null) {
-    // In a resume, we'll already have an instance we can reuse.
-    shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
-  } else {
-    shouldUpdate = updateClassInstance(current$$1, workInProgress, Component, nextProps, renderExpirationTime);
+      scheduleWork(fiber, expirationTime);
+    }
   }
 
-  var nextUnitOfWork = finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);
+  var ContextOnlyDispatcher = {
+    readContext: readContext,
+    useCallback: throwInvalidHookError,
+    useContext: throwInvalidHookError,
+    useEffect: throwInvalidHookError,
+    useImperativeHandle: throwInvalidHookError,
+    useLayoutEffect: throwInvalidHookError,
+    useMemo: throwInvalidHookError,
+    useReducer: throwInvalidHookError,
+    useRef: throwInvalidHookError,
+    useState: throwInvalidHookError,
+    useDebugValue: throwInvalidHookError,
+    useResponder: throwInvalidHookError,
+    useDeferredValue: throwInvalidHookError,
+    useTransition: throwInvalidHookError
+  };
+  var HooksDispatcherOnMountInDEV = null;
+  var HooksDispatcherOnMountWithHookTypesInDEV = null;
+  var HooksDispatcherOnUpdateInDEV = null;
+  var HooksDispatcherOnRerenderInDEV = null;
+  var InvalidNestedHooksDispatcherOnMountInDEV = null;
+  var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
+  var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
 
   {
-    var inst = workInProgress.stateNode;
+    var warnInvalidContextAccess = function () {
+      error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');
+    };
 
-    if (inst.props !== nextProps) {
-      !didWarnAboutReassigningProps ? warning$1(false, 'It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component') : void 0;
-      didWarnAboutReassigningProps = true;
-    }
-  }
+    var warnInvalidHookAccess = function () {
+      error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks');
+    };
 
-  return nextUnitOfWork;
-}
+    HooksDispatcherOnMountInDEV = {
+      readContext: function (context, observedBits) {
+        return readContext(context, observedBits);
+      },
+      useCallback: function (callback, deps) {
+        currentHookNameInDev = 'useCallback';
+        mountHookTypesDev();
+        checkDepsAreArrayDev(deps);
+        return mountCallback(callback, deps);
+      },
+      useContext: function (context, observedBits) {
+        currentHookNameInDev = 'useContext';
+        mountHookTypesDev();
+        return readContext(context, observedBits);
+      },
+      useEffect: function (create, deps) {
+        currentHookNameInDev = 'useEffect';
+        mountHookTypesDev();
+        checkDepsAreArrayDev(deps);
+        return mountEffect(create, deps);
+      },
+      useImperativeHandle: function (ref, create, deps) {
+        currentHookNameInDev = 'useImperativeHandle';
+        mountHookTypesDev();
+        checkDepsAreArrayDev(deps);
+        return mountImperativeHandle(ref, create, deps);
+      },
+      useLayoutEffect: function (create, deps) {
+        currentHookNameInDev = 'useLayoutEffect';
+        mountHookTypesDev();
+        checkDepsAreArrayDev(deps);
+        return mountLayoutEffect(create, deps);
+      },
+      useMemo: function (create, deps) {
+        currentHookNameInDev = 'useMemo';
+        mountHookTypesDev();
+        checkDepsAreArrayDev(deps);
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-function finishClassComponent(current$$1, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {
-  // Refs should update even if shouldComponentUpdate returns false
-  markRef(current$$1, workInProgress);
-  var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;
+        try {
+          return mountMemo(create, deps);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useReducer: function (reducer, initialArg, init) {
+        currentHookNameInDev = 'useReducer';
+        mountHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-  if (!shouldUpdate && !didCaptureError) {
-    // Context providers should defer to sCU for rendering
-    if (hasContext) {
-      invalidateContextProvider(workInProgress, Component, false);
-    }
+        try {
+          return mountReducer(reducer, initialArg, init);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useRef: function (initialValue) {
+        currentHookNameInDev = 'useRef';
+        mountHookTypesDev();
+        return mountRef(initialValue);
+      },
+      useState: function (initialState) {
+        currentHookNameInDev = 'useState';
+        mountHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-    return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
-  }
+        try {
+          return mountState(initialState);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useDebugValue: function (value, formatterFn) {
+        currentHookNameInDev = 'useDebugValue';
+        mountHookTypesDev();
+        return mountDebugValue();
+      },
+      useResponder: function (responder, props) {
+        currentHookNameInDev = 'useResponder';
+        mountHookTypesDev();
+        return createDeprecatedResponderListener(responder, props);
+      },
+      useDeferredValue: function (value, config) {
+        currentHookNameInDev = 'useDeferredValue';
+        mountHookTypesDev();
+        return mountDeferredValue(value, config);
+      },
+      useTransition: function (config) {
+        currentHookNameInDev = 'useTransition';
+        mountHookTypesDev();
+        return mountTransition(config);
+      }
+    };
+    HooksDispatcherOnMountWithHookTypesInDEV = {
+      readContext: function (context, observedBits) {
+        return readContext(context, observedBits);
+      },
+      useCallback: function (callback, deps) {
+        currentHookNameInDev = 'useCallback';
+        updateHookTypesDev();
+        return mountCallback(callback, deps);
+      },
+      useContext: function (context, observedBits) {
+        currentHookNameInDev = 'useContext';
+        updateHookTypesDev();
+        return readContext(context, observedBits);
+      },
+      useEffect: function (create, deps) {
+        currentHookNameInDev = 'useEffect';
+        updateHookTypesDev();
+        return mountEffect(create, deps);
+      },
+      useImperativeHandle: function (ref, create, deps) {
+        currentHookNameInDev = 'useImperativeHandle';
+        updateHookTypesDev();
+        return mountImperativeHandle(ref, create, deps);
+      },
+      useLayoutEffect: function (create, deps) {
+        currentHookNameInDev = 'useLayoutEffect';
+        updateHookTypesDev();
+        return mountLayoutEffect(create, deps);
+      },
+      useMemo: function (create, deps) {
+        currentHookNameInDev = 'useMemo';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-  var instance = workInProgress.stateNode; // Rerender
+        try {
+          return mountMemo(create, deps);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useReducer: function (reducer, initialArg, init) {
+        currentHookNameInDev = 'useReducer';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-  ReactCurrentOwner$3.current = workInProgress;
-  var nextChildren;
+        try {
+          return mountReducer(reducer, initialArg, init);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useRef: function (initialValue) {
+        currentHookNameInDev = 'useRef';
+        updateHookTypesDev();
+        return mountRef(initialValue);
+      },
+      useState: function (initialState) {
+        currentHookNameInDev = 'useState';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-  if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
-    // If we captured an error, but getDerivedStateFrom catch is not defined,
-    // unmount all the children. componentDidCatch will schedule an update to
-    // re-render a fallback. This is temporary until we migrate everyone to
-    // the new API.
-    // TODO: Warn in a future release.
-    nextChildren = null;
+        try {
+          return mountState(initialState);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useDebugValue: function (value, formatterFn) {
+        currentHookNameInDev = 'useDebugValue';
+        updateHookTypesDev();
+        return mountDebugValue();
+      },
+      useResponder: function (responder, props) {
+        currentHookNameInDev = 'useResponder';
+        updateHookTypesDev();
+        return createDeprecatedResponderListener(responder, props);
+      },
+      useDeferredValue: function (value, config) {
+        currentHookNameInDev = 'useDeferredValue';
+        updateHookTypesDev();
+        return mountDeferredValue(value, config);
+      },
+      useTransition: function (config) {
+        currentHookNameInDev = 'useTransition';
+        updateHookTypesDev();
+        return mountTransition(config);
+      }
+    };
+    HooksDispatcherOnUpdateInDEV = {
+      readContext: function (context, observedBits) {
+        return readContext(context, observedBits);
+      },
+      useCallback: function (callback, deps) {
+        currentHookNameInDev = 'useCallback';
+        updateHookTypesDev();
+        return updateCallback(callback, deps);
+      },
+      useContext: function (context, observedBits) {
+        currentHookNameInDev = 'useContext';
+        updateHookTypesDev();
+        return readContext(context, observedBits);
+      },
+      useEffect: function (create, deps) {
+        currentHookNameInDev = 'useEffect';
+        updateHookTypesDev();
+        return updateEffect(create, deps);
+      },
+      useImperativeHandle: function (ref, create, deps) {
+        currentHookNameInDev = 'useImperativeHandle';
+        updateHookTypesDev();
+        return updateImperativeHandle(ref, create, deps);
+      },
+      useLayoutEffect: function (create, deps) {
+        currentHookNameInDev = 'useLayoutEffect';
+        updateHookTypesDev();
+        return updateLayoutEffect(create, deps);
+      },
+      useMemo: function (create, deps) {
+        currentHookNameInDev = 'useMemo';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-    if (enableProfilerTimer) {
-      stopProfilerTimerIfRunning(workInProgress);
-    }
-  } else {
-    {
-      setCurrentPhase('render');
-      nextChildren = instance.render();
+        try {
+          return updateMemo(create, deps);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useReducer: function (reducer, initialArg, init) {
+        currentHookNameInDev = 'useReducer';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-      if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-        instance.render();
-      }
+        try {
+          return updateReducer(reducer, initialArg, init);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useRef: function (initialValue) {
+        currentHookNameInDev = 'useRef';
+        updateHookTypesDev();
+        return updateRef();
+      },
+      useState: function (initialState) {
+        currentHookNameInDev = 'useState';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-      setCurrentPhase(null);
-    }
-  } // React DevTools reads this flag.
+        try {
+          return updateState(initialState);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useDebugValue: function (value, formatterFn) {
+        currentHookNameInDev = 'useDebugValue';
+        updateHookTypesDev();
+        return updateDebugValue();
+      },
+      useResponder: function (responder, props) {
+        currentHookNameInDev = 'useResponder';
+        updateHookTypesDev();
+        return createDeprecatedResponderListener(responder, props);
+      },
+      useDeferredValue: function (value, config) {
+        currentHookNameInDev = 'useDeferredValue';
+        updateHookTypesDev();
+        return updateDeferredValue(value, config);
+      },
+      useTransition: function (config) {
+        currentHookNameInDev = 'useTransition';
+        updateHookTypesDev();
+        return updateTransition(config);
+      }
+    };
+    HooksDispatcherOnRerenderInDEV = {
+      readContext: function (context, observedBits) {
+        return readContext(context, observedBits);
+      },
+      useCallback: function (callback, deps) {
+        currentHookNameInDev = 'useCallback';
+        updateHookTypesDev();
+        return updateCallback(callback, deps);
+      },
+      useContext: function (context, observedBits) {
+        currentHookNameInDev = 'useContext';
+        updateHookTypesDev();
+        return readContext(context, observedBits);
+      },
+      useEffect: function (create, deps) {
+        currentHookNameInDev = 'useEffect';
+        updateHookTypesDev();
+        return updateEffect(create, deps);
+      },
+      useImperativeHandle: function (ref, create, deps) {
+        currentHookNameInDev = 'useImperativeHandle';
+        updateHookTypesDev();
+        return updateImperativeHandle(ref, create, deps);
+      },
+      useLayoutEffect: function (create, deps) {
+        currentHookNameInDev = 'useLayoutEffect';
+        updateHookTypesDev();
+        return updateLayoutEffect(create, deps);
+      },
+      useMemo: function (create, deps) {
+        currentHookNameInDev = 'useMemo';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
 
+        try {
+          return updateMemo(create, deps);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useReducer: function (reducer, initialArg, init) {
+        currentHookNameInDev = 'useReducer';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
 
-  workInProgress.effectTag |= PerformedWork;
+        try {
+          return rerenderReducer(reducer, initialArg, init);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useRef: function (initialValue) {
+        currentHookNameInDev = 'useRef';
+        updateHookTypesDev();
+        return updateRef();
+      },
+      useState: function (initialState) {
+        currentHookNameInDev = 'useState';
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
 
-  if (current$$1 !== null && didCaptureError) {
-    // If we're recovering from an error, reconcile without reusing any of
-    // the existing children. Conceptually, the normal children and the children
-    // that are shown on error are two different sets, so we shouldn't reuse
-    // normal children even if their identities match.
-    forceUnmountCurrentAndReconcile(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  } else {
-    reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  } // Memoize state using the values we just used to render.
-  // TODO: Restructure so we never read values from the instance.
+        try {
+          return rerenderState(initialState);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useDebugValue: function (value, formatterFn) {
+        currentHookNameInDev = 'useDebugValue';
+        updateHookTypesDev();
+        return updateDebugValue();
+      },
+      useResponder: function (responder, props) {
+        currentHookNameInDev = 'useResponder';
+        updateHookTypesDev();
+        return createDeprecatedResponderListener(responder, props);
+      },
+      useDeferredValue: function (value, config) {
+        currentHookNameInDev = 'useDeferredValue';
+        updateHookTypesDev();
+        return rerenderDeferredValue(value, config);
+      },
+      useTransition: function (config) {
+        currentHookNameInDev = 'useTransition';
+        updateHookTypesDev();
+        return rerenderTransition(config);
+      }
+    };
+    InvalidNestedHooksDispatcherOnMountInDEV = {
+      readContext: function (context, observedBits) {
+        warnInvalidContextAccess();
+        return readContext(context, observedBits);
+      },
+      useCallback: function (callback, deps) {
+        currentHookNameInDev = 'useCallback';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountCallback(callback, deps);
+      },
+      useContext: function (context, observedBits) {
+        currentHookNameInDev = 'useContext';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return readContext(context, observedBits);
+      },
+      useEffect: function (create, deps) {
+        currentHookNameInDev = 'useEffect';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountEffect(create, deps);
+      },
+      useImperativeHandle: function (ref, create, deps) {
+        currentHookNameInDev = 'useImperativeHandle';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountImperativeHandle(ref, create, deps);
+      },
+      useLayoutEffect: function (create, deps) {
+        currentHookNameInDev = 'useLayoutEffect';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountLayoutEffect(create, deps);
+      },
+      useMemo: function (create, deps) {
+        currentHookNameInDev = 'useMemo';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
+        try {
+          return mountMemo(create, deps);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useReducer: function (reducer, initialArg, init) {
+        currentHookNameInDev = 'useReducer';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-  workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.
+        try {
+          return mountReducer(reducer, initialArg, init);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useRef: function (initialValue) {
+        currentHookNameInDev = 'useRef';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountRef(initialValue);
+      },
+      useState: function (initialState) {
+        currentHookNameInDev = 'useState';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;
 
-  if (hasContext) {
-    invalidateContextProvider(workInProgress, Component, true);
-  }
+        try {
+          return mountState(initialState);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useDebugValue: function (value, formatterFn) {
+        currentHookNameInDev = 'useDebugValue';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountDebugValue();
+      },
+      useResponder: function (responder, props) {
+        currentHookNameInDev = 'useResponder';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return createDeprecatedResponderListener(responder, props);
+      },
+      useDeferredValue: function (value, config) {
+        currentHookNameInDev = 'useDeferredValue';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountDeferredValue(value, config);
+      },
+      useTransition: function (config) {
+        currentHookNameInDev = 'useTransition';
+        warnInvalidHookAccess();
+        mountHookTypesDev();
+        return mountTransition(config);
+      }
+    };
+    InvalidNestedHooksDispatcherOnUpdateInDEV = {
+      readContext: function (context, observedBits) {
+        warnInvalidContextAccess();
+        return readContext(context, observedBits);
+      },
+      useCallback: function (callback, deps) {
+        currentHookNameInDev = 'useCallback';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateCallback(callback, deps);
+      },
+      useContext: function (context, observedBits) {
+        currentHookNameInDev = 'useContext';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return readContext(context, observedBits);
+      },
+      useEffect: function (create, deps) {
+        currentHookNameInDev = 'useEffect';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateEffect(create, deps);
+      },
+      useImperativeHandle: function (ref, create, deps) {
+        currentHookNameInDev = 'useImperativeHandle';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateImperativeHandle(ref, create, deps);
+      },
+      useLayoutEffect: function (create, deps) {
+        currentHookNameInDev = 'useLayoutEffect';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateLayoutEffect(create, deps);
+      },
+      useMemo: function (create, deps) {
+        currentHookNameInDev = 'useMemo';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-  return workInProgress.child;
-}
+        try {
+          return updateMemo(create, deps);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useReducer: function (reducer, initialArg, init) {
+        currentHookNameInDev = 'useReducer';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-function pushHostRootContext(workInProgress) {
-  var root = workInProgress.stateNode;
+        try {
+          return updateReducer(reducer, initialArg, init);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useRef: function (initialValue) {
+        currentHookNameInDev = 'useRef';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateRef();
+      },
+      useState: function (initialState) {
+        currentHookNameInDev = 'useState';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-  if (root.pendingContext) {
-    pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
-  } else if (root.context) {
-    // Should always be set
-    pushTopLevelContextObject(workInProgress, root.context, false);
-  }
+        try {
+          return updateState(initialState);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useDebugValue: function (value, formatterFn) {
+        currentHookNameInDev = 'useDebugValue';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateDebugValue();
+      },
+      useResponder: function (responder, props) {
+        currentHookNameInDev = 'useResponder';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return createDeprecatedResponderListener(responder, props);
+      },
+      useDeferredValue: function (value, config) {
+        currentHookNameInDev = 'useDeferredValue';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateDeferredValue(value, config);
+      },
+      useTransition: function (config) {
+        currentHookNameInDev = 'useTransition';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateTransition(config);
+      }
+    };
+    InvalidNestedHooksDispatcherOnRerenderInDEV = {
+      readContext: function (context, observedBits) {
+        warnInvalidContextAccess();
+        return readContext(context, observedBits);
+      },
+      useCallback: function (callback, deps) {
+        currentHookNameInDev = 'useCallback';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateCallback(callback, deps);
+      },
+      useContext: function (context, observedBits) {
+        currentHookNameInDev = 'useContext';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return readContext(context, observedBits);
+      },
+      useEffect: function (create, deps) {
+        currentHookNameInDev = 'useEffect';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateEffect(create, deps);
+      },
+      useImperativeHandle: function (ref, create, deps) {
+        currentHookNameInDev = 'useImperativeHandle';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateImperativeHandle(ref, create, deps);
+      },
+      useLayoutEffect: function (create, deps) {
+        currentHookNameInDev = 'useLayoutEffect';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateLayoutEffect(create, deps);
+      },
+      useMemo: function (create, deps) {
+        currentHookNameInDev = 'useMemo';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-  pushHostContainer(workInProgress, root.containerInfo);
-}
+        try {
+          return updateMemo(create, deps);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useReducer: function (reducer, initialArg, init) {
+        currentHookNameInDev = 'useReducer';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-function updateHostRoot(current$$1, workInProgress, renderExpirationTime) {
-  pushHostRootContext(workInProgress);
-  var updateQueue = workInProgress.updateQueue;
+        try {
+          return rerenderReducer(reducer, initialArg, init);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useRef: function (initialValue) {
+        currentHookNameInDev = 'useRef';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateRef();
+      },
+      useState: function (initialState) {
+        currentHookNameInDev = 'useState';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        var prevDispatcher = ReactCurrentDispatcher.current;
+        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
 
-  if (!(updateQueue !== null)) {
-    {
-      throw Error("If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue.");
-    }
+        try {
+          return rerenderState(initialState);
+        } finally {
+          ReactCurrentDispatcher.current = prevDispatcher;
+        }
+      },
+      useDebugValue: function (value, formatterFn) {
+        currentHookNameInDev = 'useDebugValue';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return updateDebugValue();
+      },
+      useResponder: function (responder, props) {
+        currentHookNameInDev = 'useResponder';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return createDeprecatedResponderListener(responder, props);
+      },
+      useDeferredValue: function (value, config) {
+        currentHookNameInDev = 'useDeferredValue';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return rerenderDeferredValue(value, config);
+      },
+      useTransition: function (config) {
+        currentHookNameInDev = 'useTransition';
+        warnInvalidHookAccess();
+        updateHookTypesDev();
+        return rerenderTransition(config);
+      }
+    };
   }
 
-  var nextProps = workInProgress.pendingProps;
-  var prevState = workInProgress.memoizedState;
-  var prevChildren = prevState !== null ? prevState.element : null;
-  processUpdateQueue(workInProgress, updateQueue, nextProps, null, renderExpirationTime);
-  var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property
-  // being called "element".
-
-  var nextChildren = nextState.element;
+  var now$1 = unstable_now;
+  var commitTime = 0;
+  var profilerStartTime = -1;
 
-  if (nextChildren === prevChildren) {
-    // If the state is the same as before, that's a bailout because we had
-    // no work that expires at this time.
-    resetHydrationState();
-    return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
+  function getCommitTime() {
+    return commitTime;
   }
 
-  var root = workInProgress.stateNode;
+  function recordCommitTime() {
 
-  if (root.hydrate && enterHydrationState(workInProgress)) {
-    // If we don't have any current children this might be the first pass.
-    // We always try to hydrate. If this isn't a hydration pass there won't
-    // be any children to hydrate which is effectively the same thing as
-    // not hydrating.
-    var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
-    workInProgress.child = child;
-    var node = child;
-
-    while (node) {
-      // Mark each child as hydrating. This is a fast path to know whether this
-      // tree is part of a hydrating tree. This is used to determine if a child
-      // node has fully mounted yet, and for scheduling event replaying.
-      // Conceptually this is similar to Placement in that a new subtree is
-      // inserted into the React tree here. It just happens to not need DOM
-      // mutations because it already exists.
-      node.effectTag = node.effectTag & ~Placement | Hydrating;
-      node = node.sibling;
-    }
-  } else {
-    // Otherwise reset hydration state in case we aborted and resumed another
-    // root.
-    reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-    resetHydrationState();
+    commitTime = now$1();
   }
 
-  return workInProgress.child;
-}
+  function startProfilerTimer(fiber) {
 
-function updateHostComponent(current$$1, workInProgress, renderExpirationTime) {
-  pushHostContext(workInProgress);
+    profilerStartTime = now$1();
 
-  if (current$$1 === null) {
-    tryToClaimNextHydratableInstance(workInProgress);
+    if (fiber.actualStartTime < 0) {
+      fiber.actualStartTime = now$1();
+    }
   }
 
-  var type = workInProgress.type;
-  var nextProps = workInProgress.pendingProps;
-  var prevProps = current$$1 !== null ? current$$1.memoizedProps : null;
-  var nextChildren = nextProps.children;
-  var isDirectTextChild = shouldSetTextContent(type, nextProps);
+  function stopProfilerTimerIfRunning(fiber) {
 
-  if (isDirectTextChild) {
-    // We special case a direct text child of a host node. This is a common
-    // case. We won't handle it as a reified child. We will instead handle
-    // this in the host environment that also have access to this prop. That
-    // avoids allocating another HostText fiber and traversing it.
-    nextChildren = null;
-  } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
-    // If we're switching from a direct text child to a normal child, or to
-    // empty, we need to schedule the text content to be reset.
-    workInProgress.effectTag |= ContentReset;
+    profilerStartTime = -1;
   }
 
-  markRef(current$$1, workInProgress); // Check the host config to see if the children are offscreen/hidden.
+  function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
 
-  if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) {
-    if (enableSchedulerTracing) {
-      markSpawnedWork(Never);
-    } // Schedule this fiber to re-render at offscreen priority. Then bailout.
+    if (profilerStartTime >= 0) {
+      var elapsedTime = now$1() - profilerStartTime;
+      fiber.actualDuration += elapsedTime;
 
+      if (overrideBaseTime) {
+        fiber.selfBaseDuration = elapsedTime;
+      }
 
-    workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
-    return null;
+      profilerStartTime = -1;
+    }
   }
 
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
-
-function updateHostText(current$$1, workInProgress) {
-  if (current$$1 === null) {
-    tryToClaimNextHydratableInstance(workInProgress);
-  } // Nothing to do here. This is terminal. We'll do the completion step
-  // immediately after.
+  // This may have been an insertion or a hydration.
 
+  var hydrationParentFiber = null;
+  var nextHydratableInstance = null;
+  var isHydrating = false;
 
-  return null;
-}
+  function enterHydrationState(fiber) {
 
-function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {
-  if (_current !== null) {
-    // An lazy component only mounts if it suspended inside a non-
-    // concurrent tree, in an inconsistent state. We want to treat it like
-    // a new mount, even though an empty version of it already committed.
-    // Disconnect the alternate pointers.
-    _current.alternate = null;
-    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
-
-    workInProgress.effectTag |= Placement;
+    var parentInstance = fiber.stateNode.containerInfo;
+    nextHydratableInstance = getFirstHydratableChild(parentInstance);
+    hydrationParentFiber = fiber;
+    isHydrating = true;
+    return true;
   }
 
-  var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet.
-  // Cancel and resume right after we know the tag.
-
-  cancelWorkTimer(workInProgress);
-  var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type.
-
-  workInProgress.type = Component;
-  var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
-  startWorkTimer(workInProgress);
-  var resolvedProps = resolveDefaultProps(Component, props);
-  var child;
-
-  switch (resolvedTag) {
-    case FunctionComponent:
-      {
-        {
-          validateFunctionComponentInDev(workInProgress, Component);
-          workInProgress.type = Component = resolveFunctionForHotReloading(Component);
-        }
+  function deleteHydratableInstance(returnFiber, instance) {
+    {
+      switch (returnFiber.tag) {
+        case HostRoot:
+          didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);
+          break;
 
-        child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
-        break;
+        case HostComponent:
+          didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);
+          break;
       }
+    }
 
-    case ClassComponent:
-      {
-        {
-          workInProgress.type = Component = resolveClassForHotReloading(Component);
-        }
+    var childToDelete = createFiberFromHostInstanceForDeletion();
+    childToDelete.stateNode = instance;
+    childToDelete.return = returnFiber;
+    childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However,
+    // these children are not part of the reconciliation list of children.
+    // Even if we abort and rereconcile the children, that will try to hydrate
+    // again and the nodes are still in the host tree so these will be
+    // recreated.
 
-        child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
-        break;
-      }
+    if (returnFiber.lastEffect !== null) {
+      returnFiber.lastEffect.nextEffect = childToDelete;
+      returnFiber.lastEffect = childToDelete;
+    } else {
+      returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
+    }
+  }
 
-    case ForwardRef:
-      {
-        {
-          workInProgress.type = Component = resolveForwardRefForHotReloading(Component);
-        }
+  function insertNonHydratedInstance(returnFiber, fiber) {
+    fiber.effectTag = fiber.effectTag & ~Hydrating | Placement;
 
-        child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);
-        break;
-      }
+    {
+      switch (returnFiber.tag) {
+        case HostRoot:
+          {
+            var parentContainer = returnFiber.stateNode.containerInfo;
 
-    case MemoComponent:
-      {
-        {
-          if (workInProgress.type !== workInProgress.elementType) {
-            var outerPropTypes = Component.propTypes;
+            switch (fiber.tag) {
+              case HostComponent:
+                var type = fiber.type;
+                var props = fiber.pendingProps;
+                didNotFindHydratableContainerInstance(parentContainer, type);
+                break;
 
-            if (outerPropTypes) {
-              checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only
-              'prop', getComponentName(Component), getCurrentFiberStackInDev);
+              case HostText:
+                var text = fiber.pendingProps;
+                didNotFindHydratableContainerTextInstance(parentContainer, text);
+                break;
             }
+
+            break;
           }
-        }
 
-        child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
-        updateExpirationTime, renderExpirationTime);
-        break;
-      }
+        case HostComponent:
+          {
+            var parentType = returnFiber.type;
+            var parentProps = returnFiber.memoizedProps;
+            var parentInstance = returnFiber.stateNode;
 
-    default:
-      {
-        var hint = '';
+            switch (fiber.tag) {
+              case HostComponent:
+                var _type = fiber.type;
+                var _props = fiber.pendingProps;
+                didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type);
+                break;
 
-        {
-          if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
-            hint = ' Did you wrap a component in React.lazy() more than once?';
-          }
-        } // This message intentionally doesn't mention ForwardRef or MemoComponent
-        // because the fact that it's a separate type of work is an
-        // implementation detail.
+              case HostText:
+                var _text = fiber.pendingProps;
+                didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);
+                break;
 
+              case SuspenseComponent:
+                didNotFindHydratableSuspenseInstance(parentType, parentProps);
+                break;
+            }
 
-        {
-          {
-            throw Error("Element type is invalid. Received a promise that resolves to: " + Component + ". Lazy element type must resolve to a class or function." + hint);
+            break;
           }
-        }
+
+        default:
+          return;
       }
+    }
   }
 
-  return child;
-}
-
-function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {
-  if (_current !== null) {
-    // An incomplete component only mounts if it suspended inside a non-
-    // concurrent tree, in an inconsistent state. We want to treat it like
-    // a new mount, even though an empty version of it already committed.
-    // Disconnect the alternate pointers.
-    _current.alternate = null;
-    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
-
-    workInProgress.effectTag |= Placement;
-  } // Promote the fiber to a class and try rendering again.
-
+  function tryHydrate(fiber, nextInstance) {
+    switch (fiber.tag) {
+      case HostComponent:
+        {
+          var type = fiber.type;
+          var props = fiber.pendingProps;
+          var instance = canHydrateInstance(nextInstance, type);
 
-  workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`
-  // Push context providers early to prevent context stack mismatches.
-  // During mounting we don't know the child context yet as the instance doesn't exist.
-  // We will invalidate the child context in finishClassComponent() right after rendering.
+          if (instance !== null) {
+            fiber.stateNode = instance;
+            return true;
+          }
 
-  var hasContext;
+          return false;
+        }
 
-  if (isContextProvider(Component)) {
-    hasContext = true;
-    pushContextProvider(workInProgress);
-  } else {
-    hasContext = false;
-  }
+      case HostText:
+        {
+          var text = fiber.pendingProps;
+          var textInstance = canHydrateTextInstance(nextInstance, text);
 
-  prepareToReadContext(workInProgress, renderExpirationTime);
-  constructClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
-  mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
-  return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
-}
+          if (textInstance !== null) {
+            fiber.stateNode = textInstance;
+            return true;
+          }
 
-function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {
-  if (_current !== null) {
-    // An indeterminate component only mounts if it suspended inside a non-
-    // concurrent tree, in an inconsistent state. We want to treat it like
-    // a new mount, even though an empty version of it already committed.
-    // Disconnect the alternate pointers.
-    _current.alternate = null;
-    workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
+          return false;
+        }
 
-    workInProgress.effectTag |= Placement;
-  }
+      case SuspenseComponent:
+        {
 
-  var props = workInProgress.pendingProps;
-  var context;
+          return false;
+        }
 
-  if (!disableLegacyContext) {
-    var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
-    context = getMaskedContext(workInProgress, unmaskedContext);
+      default:
+        return false;
+    }
   }
 
-  prepareToReadContext(workInProgress, renderExpirationTime);
-  var value;
-
-  {
-    if (Component.prototype && typeof Component.prototype.render === 'function') {
-      var componentName = getComponentName(Component) || 'Unknown';
-
-      if (!didWarnAboutBadClass[componentName]) {
-        warningWithoutStack$1(false, "The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);
-        didWarnAboutBadClass[componentName] = true;
-      }
+  function tryToClaimNextHydratableInstance(fiber) {
+    if (!isHydrating) {
+      return;
     }
 
-    if (workInProgress.mode & StrictMode) {
-      ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
+    var nextInstance = nextHydratableInstance;
+
+    if (!nextInstance) {
+      // Nothing to hydrate. Make it an insertion.
+      insertNonHydratedInstance(hydrationParentFiber, fiber);
+      isHydrating = false;
+      hydrationParentFiber = fiber;
+      return;
     }
 
-    ReactCurrentOwner$3.current = workInProgress;
-    value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
-  } // React DevTools reads this flag.
+    var firstAttemptedInstance = nextInstance;
 
+    if (!tryHydrate(fiber, nextInstance)) {
+      // If we can't hydrate this instance let's try the next one.
+      // We use this as a heuristic. It's based on intuition and not data so it
+      // might be flawed or unnecessary.
+      nextInstance = getNextHydratableSibling(firstAttemptedInstance);
 
-  workInProgress.effectTag |= PerformedWork;
+      if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
+        // Nothing to hydrate. Make it an insertion.
+        insertNonHydratedInstance(hydrationParentFiber, fiber);
+        isHydrating = false;
+        hydrationParentFiber = fiber;
+        return;
+      } // We matched the next one, we'll now assume that the first one was
+      // superfluous and we'll delete it. Since we can't eagerly delete it
+      // we'll have to schedule a deletion. To do that, this node needs a dummy
+      // fiber associated with it.
 
-  if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
-    {
-      var _componentName = getComponentName(Component) || 'Unknown';
 
-      if (!didWarnAboutModulePatternComponent[_componentName]) {
-        warningWithoutStack$1(false, 'The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);
-        didWarnAboutModulePatternComponent[_componentName] = true;
-      }
-    } // Proceed under the assumption that this is a class instance
+      deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);
+    }
 
+    hydrationParentFiber = fiber;
+    nextHydratableInstance = getFirstHydratableChild(nextInstance);
+  }
 
-    workInProgress.tag = ClassComponent; // Throw out any hooks that were used.
+  function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
 
-    resetHooks(); // Push context providers early to prevent context stack mismatches.
-    // During mounting we don't know the child context yet as the instance doesn't exist.
-    // We will invalidate the child context in finishClassComponent() right after rendering.
+    var instance = fiber.stateNode;
+    var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component.
 
-    var hasContext = false;
+    fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
+    // is a new ref we mark this as an update.
 
-    if (isContextProvider(Component)) {
-      hasContext = true;
-      pushContextProvider(workInProgress);
-    } else {
-      hasContext = false;
+    if (updatePayload !== null) {
+      return true;
     }
 
-    workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
-    var getDerivedStateFromProps = Component.getDerivedStateFromProps;
+    return false;
+  }
 
-    if (typeof getDerivedStateFromProps === 'function') {
-      applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);
-    }
+  function prepareToHydrateHostTextInstance(fiber) {
 
-    adoptClassInstance(workInProgress, value);
-    mountClassInstance(workInProgress, Component, props, renderExpirationTime);
-    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
-  } else {
-    // Proceed under the assumption that this is a function component
-    workInProgress.tag = FunctionComponent;
+    var textInstance = fiber.stateNode;
+    var textContent = fiber.memoizedProps;
+    var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
 
     {
-      if (disableLegacyContext && Component.contextTypes) {
-        warningWithoutStack$1(false, '%s uses the legacy contextTypes API which is no longer supported. ' + 'Use React.createContext() with React.useContext() instead.', getComponentName(Component) || 'Unknown');
-      }
+      if (shouldUpdate) {
+        // We assume that prepareToHydrateHostTextInstance is called in a context where the
+        // hydration parent is the parent host component of this host text.
+        var returnFiber = hydrationParentFiber;
+
+        if (returnFiber !== null) {
+          switch (returnFiber.tag) {
+            case HostRoot:
+              {
+                var parentContainer = returnFiber.stateNode.containerInfo;
+                didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);
+                break;
+              }
 
-      if (debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) {
-        // Only double-render components with Hooks
-        if (workInProgress.memoizedState !== null) {
-          value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
+            case HostComponent:
+              {
+                var parentType = returnFiber.type;
+                var parentProps = returnFiber.memoizedProps;
+                var parentInstance = returnFiber.stateNode;
+                didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);
+                break;
+              }
+          }
         }
       }
     }
 
-    reconcileChildren(null, workInProgress, value, renderExpirationTime);
-
-    {
-      validateFunctionComponentInDev(workInProgress, Component);
-    }
-
-    return workInProgress.child;
-  }
-}
-
-function validateFunctionComponentInDev(workInProgress, Component) {
-  if (Component) {
-    !!Component.childContextTypes ? warningWithoutStack$1(false, '%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component') : void 0;
+    return shouldUpdate;
   }
 
-  if (workInProgress.ref !== null) {
-    var info = '';
-    var ownerName = getCurrentFiberOwnerNameInDevOrNull();
-
-    if (ownerName) {
-      info += '\n\nCheck the render method of `' + ownerName + '`.';
-    }
+  function skipPastDehydratedSuspenseInstance(fiber) {
 
-    var warningKey = ownerName || workInProgress._debugID || '';
-    var debugSource = workInProgress._debugSource;
+    var suspenseState = fiber.memoizedState;
+    var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
 
-    if (debugSource) {
-      warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
+    if (!suspenseInstance) {
+      {
+        throw Error( "Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue." );
+      }
     }
 
-    if (!didWarnAboutFunctionRefs[warningKey]) {
-      didWarnAboutFunctionRefs[warningKey] = true;
-      warning$1(false, 'Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);
-    }
+    return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
   }
 
-  if (warnAboutDefaultPropsOnFunctionComponents && Component.defaultProps !== undefined) {
-    var componentName = getComponentName(Component) || 'Unknown';
+  function popToNextHostParent(fiber) {
+    var parent = fiber.return;
 
-    if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) {
-      warningWithoutStack$1(false, '%s: Support for defaultProps will be removed from function components ' + 'in a future major release. Use JavaScript default parameters instead.', componentName);
-      didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true;
+    while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {
+      parent = parent.return;
     }
+
+    hydrationParentFiber = parent;
   }
 
-  if (typeof Component.getDerivedStateFromProps === 'function') {
-    var _componentName2 = getComponentName(Component) || 'Unknown';
+  function popHydrationState(fiber) {
 
-    if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) {
-      warningWithoutStack$1(false, '%s: Function components do not support getDerivedStateFromProps.', _componentName2);
-      didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true;
+    if (fiber !== hydrationParentFiber) {
+      // We're deeper than the current hydration context, inside an inserted
+      // tree.
+      return false;
     }
-  }
-
-  if (typeof Component.contextType === 'object' && Component.contextType !== null) {
-    var _componentName3 = getComponentName(Component) || 'Unknown';
 
-    if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) {
-      warningWithoutStack$1(false, '%s: Function components do not support contextType.', _componentName3);
-      didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true;
+    if (!isHydrating) {
+      // If we're not currently hydrating but we're in a hydration context, then
+      // we were an insertion and now need to pop up reenter hydration of our
+      // siblings.
+      popToNextHostParent(fiber);
+      isHydrating = true;
+      return false;
     }
-  }
-}
 
-var SUSPENDED_MARKER = {
-  dehydrated: null,
-  retryTime: NoWork
-};
+    var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now.
+    // We only do this deeper than head and body since they tend to have random
+    // other nodes in them. We also ignore components with pure text content in
+    // side of them.
+    // TODO: Better heuristic.
+
+    if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {
+      var nextInstance = nextHydratableInstance;
 
-function shouldRemainOnFallback(suspenseContext, current$$1, workInProgress) {
-  // If the context is telling us that we should show a fallback, and we're not
-  // already showing content, then we should show the fallback instead.
-  return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current$$1 === null || current$$1.memoizedState !== null);
-}
+      while (nextInstance) {
+        deleteHydratableInstance(fiber, nextInstance);
+        nextInstance = getNextHydratableSibling(nextInstance);
+      }
+    }
 
-function updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime) {
-  var mode = workInProgress.mode;
-  var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.
+    popToNextHostParent(fiber);
 
-  {
-    if (shouldSuspend(workInProgress)) {
-      workInProgress.effectTag |= DidCapture;
+    if (fiber.tag === SuspenseComponent) {
+      nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);
+    } else {
+      nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
     }
+
+    return true;
   }
 
-  var suspenseContext = suspenseStackCursor.current;
-  var nextDidTimeout = false;
-  var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect;
+  function resetHydrationState() {
 
-  if (didSuspend || shouldRemainOnFallback(suspenseContext, current$$1, workInProgress)) {
-    // Something in this boundary's subtree already suspended. Switch to
-    // rendering the fallback children.
-    nextDidTimeout = true;
-    workInProgress.effectTag &= ~DidCapture;
-  } else {
-    // Attempting the main content
-    if (current$$1 === null || current$$1.memoizedState !== null) {
-      // This is a new mount or this boundary is already showing a fallback state.
-      // Mark this subtree context as having at least one invisible parent that could
-      // handle the fallback state.
-      // Boundaries without fallbacks or should be avoided are not considered since
-      // they cannot handle preferred fallback states.
-      if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) {
-        suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);
-      }
-    }
+    hydrationParentFiber = null;
+    nextHydratableInstance = null;
+    isHydrating = false;
   }
 
-  suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
-  pushSuspenseContext(workInProgress, suspenseContext);
+  var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;
+  var didReceiveUpdate = false;
+  var didWarnAboutBadClass;
+  var didWarnAboutModulePatternComponent;
+  var didWarnAboutContextTypeOnFunctionComponent;
+  var didWarnAboutGetDerivedStateOnFunctionComponent;
+  var didWarnAboutFunctionRefs;
+  var didWarnAboutReassigningProps;
+  var didWarnAboutRevealOrder;
+  var didWarnAboutTailOptions;
 
   {
-    if ('maxDuration' in nextProps) {
-      if (!didWarnAboutMaxDuration) {
-        didWarnAboutMaxDuration = true;
-        warning$1(false, 'maxDuration has been removed from React. ' + 'Remove the maxDuration prop.');
-      }
-    }
-  } // This next part is a bit confusing. If the children timeout, we switch to
-  // showing the fallback children in place of the "primary" children.
-  // However, we don't want to delete the primary children because then their
-  // state will be lost (both the React state and the host state, e.g.
-  // uncontrolled form inputs). Instead we keep them mounted and hide them.
-  // Both the fallback children AND the primary children are rendered at the
-  // same time. Once the primary children are un-suspended, we can delete
-  // the fallback children — don't need to preserve their state.
-  //
-  // The two sets of children are siblings in the host environment, but
-  // semantically, for purposes of reconciliation, they are two separate sets.
-  // So we store them using two fragment fibers.
-  //
-  // However, we want to avoid allocating extra fibers for every placeholder.
-  // They're only necessary when the children time out, because that's the
-  // only time when both sets are mounted.
-  //
-  // So, the extra fragment fibers are only used if the children time out.
-  // Otherwise, we render the primary children directly. This requires some
-  // custom reconciliation logic to preserve the state of the primary
-  // children. It's essentially a very basic form of re-parenting.
+    didWarnAboutBadClass = {};
+    didWarnAboutModulePatternComponent = {};
+    didWarnAboutContextTypeOnFunctionComponent = {};
+    didWarnAboutGetDerivedStateOnFunctionComponent = {};
+    didWarnAboutFunctionRefs = {};
+    didWarnAboutReassigningProps = false;
+    didWarnAboutRevealOrder = {};
+    didWarnAboutTailOptions = {};
+  }
 
+  function reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime) {
+    if (current === null) {
+      // If this is a fresh new component that hasn't been rendered yet, we
+      // won't update its child set by applying minimal side-effects. Instead,
+      // we will add them all to the child before it gets rendered. That means
+      // we can optimize this reconciliation pass by not tracking side-effects.
+      workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
+    } else {
+      // If the current child is the same as the work in progress, it means that
+      // we haven't yet started any work on these children. Therefore, we use
+      // the clone algorithm to create a copy of all the current children.
+      // If we had any progressed work already, that is invalid at this point so
+      // let's throw it out.
+      workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);
+    }
+  }
 
-  if (current$$1 === null) {
-    // If we're currently hydrating, try to hydrate this boundary.
-    // But only if this has a fallback.
-    if (nextProps.fallback !== undefined) {
-      tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.
+  function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime) {
+    // This function is fork of reconcileChildren. It's used in cases where we
+    // want to reconcile without matching against the existing set. This has the
+    // effect of all current children being unmounted; even if the type and key
+    // are the same, the old child is unmounted and a new child is created.
+    //
+    // To do this, we're going to go through the reconcile algorithm twice. In
+    // the first pass, we schedule a deletion for all the current children by
+    // passing null.
+    workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we
+    // pass null in place of where we usually pass the current child set. This has
+    // the effect of remounting all children regardless of whether their
+    // identities match.
 
-      if (enableSuspenseServerRenderer) {
-        var suspenseState = workInProgress.memoizedState;
+    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
+  }
 
-        if (suspenseState !== null) {
-          var dehydrated = suspenseState.dehydrated;
+  function updateForwardRef(current, workInProgress, Component, nextProps, renderExpirationTime) {
+    // TODO: current can be non-null here even if the component
+    // hasn't yet mounted. This happens after the first render suspends.
+    // We'll need to figure out if this is fine or can cause issues.
+    {
+      if (workInProgress.type !== workInProgress.elementType) {
+        // Lazy component props can't be validated in createElement
+        // because they're only guaranteed to be resolved here.
+        var innerPropTypes = Component.propTypes;
 
-          if (dehydrated !== null) {
-            return mountDehydratedSuspenseComponent(workInProgress, dehydrated, renderExpirationTime);
-          }
+        if (innerPropTypes) {
+          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
+          'prop', getComponentName(Component), getCurrentFiberStackInDev);
         }
       }
-    } // This is the initial mount. This branch is pretty simple because there's
-    // no previous state that needs to be preserved.
+    }
 
+    var render = Component.render;
+    var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent
 
-    if (nextDidTimeout) {
-      // Mount separate fragments for primary and fallback children.
-      var nextFallbackChildren = nextProps.fallback;
-      var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);
-      primaryChildFragment.return = workInProgress;
+    var nextChildren;
+    prepareToReadContext(workInProgress, renderExpirationTime);
 
-      if ((workInProgress.mode & BlockingMode) === NoMode) {
-        // Outside of blocking mode, we commit the effects from the
-        // partially completed, timed-out tree, too.
-        var progressedState = workInProgress.memoizedState;
-        var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;
-        primaryChildFragment.child = progressedPrimaryChild;
-        var progressedChild = progressedPrimaryChild;
+    {
+      ReactCurrentOwner$1.current = workInProgress;
+      setIsRendering(true);
+      nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);
 
-        while (progressedChild !== null) {
-          progressedChild.return = primaryChildFragment;
-          progressedChild = progressedChild.sibling;
+      if ( workInProgress.mode & StrictMode) {
+        // Only double-render components with Hooks
+        if (workInProgress.memoizedState !== null) {
+          nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);
         }
       }
 
-      var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);
-      fallbackChildFragment.return = workInProgress;
-      primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the
-      // fallback children.
-
-      workInProgress.memoizedState = SUSPENDED_MARKER;
-      workInProgress.child = primaryChildFragment;
-      return fallbackChildFragment;
-    } else {
-      // Mount the primary children without an intermediate fragment fiber.
-      var nextPrimaryChildren = nextProps.children;
-      workInProgress.memoizedState = null;
-      return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);
+      setIsRendering(false);
     }
-  } else {
-    // This is an update. This branch is more complicated because we need to
-    // ensure the state of the primary children is preserved.
-    var prevState = current$$1.memoizedState;
 
-    if (prevState !== null) {
-      if (enableSuspenseServerRenderer) {
-        var _dehydrated = prevState.dehydrated;
-
-        if (_dehydrated !== null) {
-          if (!didSuspend) {
-            return updateDehydratedSuspenseComponent(current$$1, workInProgress, _dehydrated, prevState, renderExpirationTime);
-          } else if (workInProgress.memoizedState !== null) {
-            // Something suspended and we should still be in dehydrated mode.
-            // Leave the existing child in place.
-            workInProgress.child = current$$1.child; // The dehydrated completion pass expects this flag to be there
-            // but the normal suspense pass doesn't.
-
-            workInProgress.effectTag |= DidCapture;
-            return null;
-          } else {
-            // Suspended but we should no longer be in dehydrated mode.
-            // Therefore we now have to render the fallback. Wrap the children
-            // in a fragment fiber to keep them separate from the fallback
-            // children.
-            var _nextFallbackChildren = nextProps.fallback;
+    if (current !== null && !didReceiveUpdate) {
+      bailoutHooks(current, workInProgress, renderExpirationTime);
+      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
+    } // React DevTools reads this flag.
 
-            var _primaryChildFragment = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't
-            // going to render this fragment.
-            null, mode, NoWork, null);
 
-            _primaryChildFragment.return = workInProgress; // This is always null since we never want the previous child
-            // that we're not going to hydrate.
+    workInProgress.effectTag |= PerformedWork;
+    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+    return workInProgress.child;
+  }
 
-            _primaryChildFragment.child = null;
+  function updateMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
+    if (current === null) {
+      var type = Component.type;
 
-            if ((workInProgress.mode & BlockingMode) === NoMode) {
-              // Outside of blocking mode, we commit the effects from the
-              // partially completed, timed-out tree, too.
-              var _progressedChild = _primaryChildFragment.child = workInProgress.child;
+      if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.
+      Component.defaultProps === undefined) {
+        var resolvedType = type;
 
-              while (_progressedChild !== null) {
-                _progressedChild.return = _primaryChildFragment;
-                _progressedChild = _progressedChild.sibling;
-              }
-            } else {
-              // We will have dropped the effect list which contains the deletion.
-              // We need to reconcile to delete the current child.
-              reconcileChildFibers(workInProgress, current$$1.child, null, renderExpirationTime);
-            } // Because primaryChildFragment is a new fiber that we're inserting as the
-            // parent of a new tree, we need to set its treeBaseDuration.
+        {
+          resolvedType = resolveFunctionForHotReloading(type);
+        } // If this is a plain function component without default props,
+        // and with only the default shallow comparison, we upgrade it
+        // to a SimpleMemoComponent to allow fast path updates.
 
 
-            if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
-              // treeBaseDuration is the sum of all the child tree base durations.
-              var treeBaseDuration = 0;
-              var hiddenChild = _primaryChildFragment.child;
+        workInProgress.tag = SimpleMemoComponent;
+        workInProgress.type = resolvedType;
 
-              while (hiddenChild !== null) {
-                treeBaseDuration += hiddenChild.treeBaseDuration;
-                hiddenChild = hiddenChild.sibling;
-              }
+        {
+          validateFunctionComponentInDev(workInProgress, type);
+        }
 
-              _primaryChildFragment.treeBaseDuration = treeBaseDuration;
-            } // Create a fragment from the fallback children, too.
+        return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime);
+      }
 
+      {
+        var innerPropTypes = type.propTypes;
 
-            var _fallbackChildFragment = createFiberFromFragment(_nextFallbackChildren, mode, renderExpirationTime, null);
+        if (innerPropTypes) {
+          // Inner memo component props aren't currently validated in createElement.
+          // We could move it there, but we'd still need this for lazy code path.
+          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
+          'prop', getComponentName(type), getCurrentFiberStackInDev);
+        }
+      }
 
-            _fallbackChildFragment.return = workInProgress;
-            _primaryChildFragment.sibling = _fallbackChildFragment;
-            _fallbackChildFragment.effectTag |= Placement;
-            _primaryChildFragment.childExpirationTime = NoWork;
-            workInProgress.memoizedState = SUSPENDED_MARKER;
-            workInProgress.child = _primaryChildFragment; // Skip the primary children, and continue working on the
-            // fallback children.
+      var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);
+      child.ref = workInProgress.ref;
+      child.return = workInProgress;
+      workInProgress.child = child;
+      return child;
+    }
 
-            return _fallbackChildFragment;
-          }
-        }
-      } // The current tree already timed out. That means each child set is
-      // wrapped in a fragment fiber.
+    {
+      var _type = Component.type;
+      var _innerPropTypes = _type.propTypes;
 
+      if (_innerPropTypes) {
+        // Inner memo component props aren't currently validated in createElement.
+        // We could move it there, but we'd still need this for lazy code path.
+        checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props
+        'prop', getComponentName(_type), getCurrentFiberStackInDev);
+      }
+    }
 
-      var currentPrimaryChildFragment = current$$1.child;
-      var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
+    var currentChild = current.child; // This is always exactly one child
 
-      if (nextDidTimeout) {
-        // Still timed out. Reuse the current primary children by cloning
-        // its fragment. We're going to skip over these entirely.
-        var _nextFallbackChildren2 = nextProps.fallback;
+    if (updateExpirationTime < renderExpirationTime) {
+      // This will be the props with resolved defaultProps,
+      // unlike current.memoizedProps which will be the unresolved ones.
+      var prevProps = currentChild.memoizedProps; // Default to shallow comparison
 
-        var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps, NoWork);
+      var compare = Component.compare;
+      compare = compare !== null ? compare : shallowEqual;
 
-        _primaryChildFragment2.return = workInProgress;
+      if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {
+        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
+      }
+    } // React DevTools reads this flag.
 
-        if ((workInProgress.mode & BlockingMode) === NoMode) {
-          // Outside of blocking mode, we commit the effects from the
-          // partially completed, timed-out tree, too.
-          var _progressedState = workInProgress.memoizedState;
 
-          var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;
+    workInProgress.effectTag |= PerformedWork;
+    var newChild = createWorkInProgress(currentChild, nextProps);
+    newChild.ref = workInProgress.ref;
+    newChild.return = workInProgress;
+    workInProgress.child = newChild;
+    return newChild;
+  }
 
-          if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {
-            _primaryChildFragment2.child = _progressedPrimaryChild;
-            var _progressedChild2 = _progressedPrimaryChild;
+  function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {
+    // TODO: current can be non-null here even if the component
+    // hasn't yet mounted. This happens when the inner render suspends.
+    // We'll need to figure out if this is fine or can cause issues.
+    {
+      if (workInProgress.type !== workInProgress.elementType) {
+        // Lazy component props can't be validated in createElement
+        // because they're only guaranteed to be resolved here.
+        var outerMemoType = workInProgress.elementType;
 
-            while (_progressedChild2 !== null) {
-              _progressedChild2.return = _primaryChildFragment2;
-              _progressedChild2 = _progressedChild2.sibling;
-            }
-          }
-        } // Because primaryChildFragment is a new fiber that we're inserting as the
-        // parent of a new tree, we need to set its treeBaseDuration.
+        if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
+          // We warn when you define propTypes on lazy()
+          // so let's just skip over it to find memo() outer wrapper.
+          // Inner props for memo are validated later.
+          outerMemoType = refineResolvedLazyComponent(outerMemoType);
+        }
 
+        var outerPropTypes = outerMemoType && outerMemoType.propTypes;
 
-        if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
-          // treeBaseDuration is the sum of all the child tree base durations.
-          var _treeBaseDuration = 0;
-          var _hiddenChild = _primaryChildFragment2.child;
+        if (outerPropTypes) {
+          checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
+          'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);
+        } // Inner propTypes will be validated in the function component path.
 
-          while (_hiddenChild !== null) {
-            _treeBaseDuration += _hiddenChild.treeBaseDuration;
-            _hiddenChild = _hiddenChild.sibling;
-          }
+      }
+    }
 
-          _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;
-        } // Clone the fallback child fragment, too. These we'll continue
-        // working on.
+    if (current !== null) {
+      var prevProps = current.memoizedProps;
 
+      if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.
+       workInProgress.type === current.type )) {
+        didReceiveUpdate = false;
 
-        var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2, currentFallbackChildFragment.expirationTime);
+        if (updateExpirationTime < renderExpirationTime) {
+          // The pending update priority was cleared at the beginning of
+          // beginWork. We're about to bail out, but there might be additional
+          // updates at a lower priority. Usually, the priority level of the
+          // remaining updates is accumlated during the evaluation of the
+          // component (i.e. when processing the update queue). But since since
+          // we're bailing out early *without* evaluating the component, we need
+          // to account for it here, too. Reset to the value of the current fiber.
+          // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,
+          // because a MemoComponent fiber does not have hooks or an update queue;
+          // rather, it wraps around an inner component, which may or may not
+          // contains hooks.
+          // TODO: Move the reset at in beginWork out of the common path so that
+          // this is no longer necessary.
+          workInProgress.expirationTime = current.expirationTime;
+          return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
+        }
+      }
+    }
 
-        _fallbackChildFragment2.return = workInProgress;
-        _primaryChildFragment2.sibling = _fallbackChildFragment2;
-        _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the
-        // fallback children.
+    return updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime);
+  }
 
-        workInProgress.memoizedState = SUSPENDED_MARKER;
-        workInProgress.child = _primaryChildFragment2;
-        return _fallbackChildFragment2;
-      } else {
-        // No longer suspended. Switch back to showing the primary children,
-        // and remove the intermediate fragment fiber.
-        var _nextPrimaryChildren = nextProps.children;
-        var currentPrimaryChild = currentPrimaryChildFragment.child;
-        var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback
-        // children. Wait until the complete phase, after we've confirmed the
-        // fallback is no longer needed.
-        // TODO: Would it be better to store the fallback fragment on
-        // the stateNode?
-        // Continue rendering the children, like we normally do.
+  function updateFragment(current, workInProgress, renderExpirationTime) {
+    var nextChildren = workInProgress.pendingProps;
+    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+    return workInProgress.child;
+  }
 
-        workInProgress.memoizedState = null;
-        return workInProgress.child = primaryChild;
-      }
-    } else {
-      // The current tree has not already timed out. That means the primary
-      // children are not wrapped in a fragment fiber.
-      var _currentPrimaryChild = current$$1.child;
+  function updateMode(current, workInProgress, renderExpirationTime) {
+    var nextChildren = workInProgress.pendingProps.children;
+    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+    return workInProgress.child;
+  }
 
-      if (nextDidTimeout) {
-        // Timed out. Wrap the children in a fragment fiber to keep them
-        // separate from the fallback children.
-        var _nextFallbackChildren3 = nextProps.fallback;
+  function updateProfiler(current, workInProgress, renderExpirationTime) {
+    {
+      workInProgress.effectTag |= Update;
+    }
 
-        var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't
-        // going to render this fragment.
-        null, mode, NoWork, null);
+    var nextProps = workInProgress.pendingProps;
+    var nextChildren = nextProps.children;
+    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+    return workInProgress.child;
+  }
 
-        _primaryChildFragment3.return = workInProgress;
-        _primaryChildFragment3.child = _currentPrimaryChild;
+  function markRef(current, workInProgress) {
+    var ref = workInProgress.ref;
 
-        if (_currentPrimaryChild !== null) {
-          _currentPrimaryChild.return = _primaryChildFragment3;
-        } // Even though we're creating a new fiber, there are no new children,
-        // because we're reusing an already mounted tree. So we don't need to
-        // schedule a placement.
-        // primaryChildFragment.effectTag |= Placement;
+    if (current === null && ref !== null || current !== null && current.ref !== ref) {
+      // Schedule a Ref effect
+      workInProgress.effectTag |= Ref;
+    }
+  }
 
+  function updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {
+    {
+      if (workInProgress.type !== workInProgress.elementType) {
+        // Lazy component props can't be validated in createElement
+        // because they're only guaranteed to be resolved here.
+        var innerPropTypes = Component.propTypes;
 
-        if ((workInProgress.mode & BlockingMode) === NoMode) {
-          // Outside of blocking mode, we commit the effects from the
-          // partially completed, timed-out tree, too.
-          var _progressedState2 = workInProgress.memoizedState;
+        if (innerPropTypes) {
+          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
+          'prop', getComponentName(Component), getCurrentFiberStackInDev);
+        }
+      }
+    }
 
-          var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;
+    var context;
 
-          _primaryChildFragment3.child = _progressedPrimaryChild2;
-          var _progressedChild3 = _progressedPrimaryChild2;
+    {
+      var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
+      context = getMaskedContext(workInProgress, unmaskedContext);
+    }
 
-          while (_progressedChild3 !== null) {
-            _progressedChild3.return = _primaryChildFragment3;
-            _progressedChild3 = _progressedChild3.sibling;
-          }
-        } // Because primaryChildFragment is a new fiber that we're inserting as the
-        // parent of a new tree, we need to set its treeBaseDuration.
+    var nextChildren;
+    prepareToReadContext(workInProgress, renderExpirationTime);
 
+    {
+      ReactCurrentOwner$1.current = workInProgress;
+      setIsRendering(true);
+      nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);
 
-        if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
-          // treeBaseDuration is the sum of all the child tree base durations.
-          var _treeBaseDuration2 = 0;
-          var _hiddenChild2 = _primaryChildFragment3.child;
+      if ( workInProgress.mode & StrictMode) {
+        // Only double-render components with Hooks
+        if (workInProgress.memoizedState !== null) {
+          nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);
+        }
+      }
 
-          while (_hiddenChild2 !== null) {
-            _treeBaseDuration2 += _hiddenChild2.treeBaseDuration;
-            _hiddenChild2 = _hiddenChild2.sibling;
-          }
+      setIsRendering(false);
+    }
 
-          _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2;
-        } // Create a fragment from the fallback children, too.
+    if (current !== null && !didReceiveUpdate) {
+      bailoutHooks(current, workInProgress, renderExpirationTime);
+      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
+    } // React DevTools reads this flag.
 
 
-        var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null);
+    workInProgress.effectTag |= PerformedWork;
+    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+    return workInProgress.child;
+  }
 
-        _fallbackChildFragment3.return = workInProgress;
-        _primaryChildFragment3.sibling = _fallbackChildFragment3;
-        _fallbackChildFragment3.effectTag |= Placement;
-        _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the
-        // fallback children.
+  function updateClassComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {
+    {
+      if (workInProgress.type !== workInProgress.elementType) {
+        // Lazy component props can't be validated in createElement
+        // because they're only guaranteed to be resolved here.
+        var innerPropTypes = Component.propTypes;
 
-        workInProgress.memoizedState = SUSPENDED_MARKER;
-        workInProgress.child = _primaryChildFragment3;
-        return _fallbackChildFragment3;
-      } else {
-        // Still haven't timed out.  Continue rendering the children, like we
-        // normally do.
-        workInProgress.memoizedState = null;
-        var _nextPrimaryChildren2 = nextProps.children;
-        return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);
+        if (innerPropTypes) {
+          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props
+          'prop', getComponentName(Component), getCurrentFiberStackInDev);
+        }
       }
+    } // Push context providers early to prevent context stack mismatches.
+    // During mounting we don't know the child context yet as the instance doesn't exist.
+    // We will invalidate the child context in finishClassComponent() right after rendering.
+
+
+    var hasContext;
+
+    if (isContextProvider(Component)) {
+      hasContext = true;
+      pushContextProvider(workInProgress);
+    } else {
+      hasContext = false;
     }
-  }
-}
 
-function retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime) {
-  // We're now not suspended nor dehydrated.
-  workInProgress.memoizedState = null; // Retry with the full children.
+    prepareToReadContext(workInProgress, renderExpirationTime);
+    var instance = workInProgress.stateNode;
+    var shouldUpdate;
 
-  var nextProps = workInProgress.pendingProps;
-  var nextChildren = nextProps.children; // This will ensure that the children get Placement effects and
-  // that the old child gets a Deletion effect.
-  // We could also call forceUnmountCurrentAndReconcile.
+    if (instance === null) {
+      if (current !== null) {
+        // A class component without an instance only mounts if it suspended
+        // inside a non-concurrent tree, in an inconsistent state. We want to
+        // treat it like a new mount, even though an empty version of it already
+        // committed. Disconnect the alternate pointers.
+        current.alternate = null;
+        workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
+
+        workInProgress.effectTag |= Placement;
+      } // In the initial pass we might need to construct the instance.
+
+
+      constructClassInstance(workInProgress, Component, nextProps);
+      mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
+      shouldUpdate = true;
+    } else if (current === null) {
+      // In a resume, we'll already have an instance we can reuse.
+      shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
+    } else {
+      shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderExpirationTime);
+    }
 
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+    var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);
 
-function mountDehydratedSuspenseComponent(workInProgress, suspenseInstance, renderExpirationTime) {
-  // During the first pass, we'll bail out and not drill into the children.
-  // Instead, we'll leave the content in place and try to hydrate it later.
-  if ((workInProgress.mode & BlockingMode) === NoMode) {
     {
-      warning$1(false, 'Cannot hydrate Suspense in legacy mode. Switch from ' + 'ReactDOM.hydrate(element, container) to ' + 'ReactDOM.createBlockingRoot(container, { hydrate: true })' + '.render(element) or remove the Suspense components from ' + 'the server rendered components.');
-    }
-
-    workInProgress.expirationTime = Sync;
-  } else if (isSuspenseInstanceFallback(suspenseInstance)) {
-    // This is a client-only boundary. Since we won't get any content from the server
-    // for this, we need to schedule that at a higher priority based on when it would
-    // have timed out. In theory we could render it in this pass but it would have the
-    // wrong priority associated with it and will prevent hydration of parent path.
-    // Instead, we'll leave work left on it to render it in a separate commit.
-    // TODO This time should be the time at which the server rendered response that is
-    // a parent to this boundary was displayed. However, since we currently don't have
-    // a protocol to transfer that time, we'll just estimate it by using the current
-    // time. This will mean that Suspense timeouts are slightly shifted to later than
-    // they should be.
-    var serverDisplayTime = requestCurrentTimeForUpdate(); // Schedule a normal pri update to render this content.
-
-    var newExpirationTime = computeAsyncExpiration(serverDisplayTime);
-
-    if (enableSchedulerTracing) {
-      markSpawnedWork(newExpirationTime);
-    }
-
-    workInProgress.expirationTime = newExpirationTime;
-  } else {
-    // We'll continue hydrating the rest at offscreen priority since we'll already
-    // be showing the right content coming from the server, it is no rush.
-    workInProgress.expirationTime = Never;
-
-    if (enableSchedulerTracing) {
-      markSpawnedWork(Never);
-    }
-  }
-
-  return null;
-}
-
-function updateDehydratedSuspenseComponent(current$$1, workInProgress, suspenseInstance, suspenseState, renderExpirationTime) {
-  // We should never be hydrating at this point because it is the first pass,
-  // but after we've already committed once.
-  warnIfHydrating();
-
-  if ((workInProgress.mode & BlockingMode) === NoMode) {
-    return retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime);
-  }
-
-  if (isSuspenseInstanceFallback(suspenseInstance)) {
-    // This boundary is in a permanent fallback state. In this case, we'll never
-    // get an update and we'll never be able to hydrate the final content. Let's just try the
-    // client side render instead.
-    return retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime);
-  } // We use childExpirationTime to indicate that a child might depend on context, so if
-  // any context has changed, we need to treat is as if the input might have changed.
-
-
-  var hasContextChanged$$1 = current$$1.childExpirationTime >= renderExpirationTime;
-
-  if (didReceiveUpdate || hasContextChanged$$1) {
-    // This boundary has changed since the first render. This means that we are now unable to
-    // hydrate it. We might still be able to hydrate it using an earlier expiration time, if
-    // we are rendering at lower expiration than sync.
-    if (renderExpirationTime < Sync) {
-      if (suspenseState.retryTime <= renderExpirationTime) {
-        // This render is even higher pri than we've seen before, let's try again
-        // at even higher pri.
-        var attemptHydrationAtExpirationTime = renderExpirationTime + 1;
-        suspenseState.retryTime = attemptHydrationAtExpirationTime;
-        scheduleWork(current$$1, attemptHydrationAtExpirationTime); // TODO: Early abort this render.
-      } else {// We have already tried to ping at a higher priority than we're rendering with
-          // so if we got here, we must have failed to hydrate at those levels. We must
-          // now give up. Instead, we're going to delete the whole subtree and instead inject
-          // a new real Suspense boundary to take its place, which may render content
-          // or fallback. This might suspend for a while and if it does we might still have
-          // an opportunity to hydrate before this pass commits.
-        }
-    } // If we have scheduled higher pri work above, this will probably just abort the render
-    // since we now have higher priority work, but in case it doesn't, we need to prepare to
-    // render something, if we time out. Even if that requires us to delete everything and
-    // skip hydration.
-    // Delay having to do this as long as the suspense timeout allows us.
-
-
-    renderDidSuspendDelayIfPossible();
-    return retrySuspenseComponentWithoutHydrating(current$$1, workInProgress, renderExpirationTime);
-  } else if (isSuspenseInstancePending(suspenseInstance)) {
-    // This component is still pending more data from the server, so we can't hydrate its
-    // content. We treat it as if this component suspended itself. It might seem as if
-    // we could just try to render it client-side instead. However, this will perform a
-    // lot of unnecessary work and is unlikely to complete since it often will suspend
-    // on missing data anyway. Additionally, the server might be able to render more
-    // than we can on the client yet. In that case we'd end up with more fallback states
-    // on the client than if we just leave it alone. If the server times out or errors
-    // these should update this boundary to the permanent Fallback state instead.
-    // Mark it as having captured (i.e. suspended).
-    workInProgress.effectTag |= DidCapture; // Leave the child in place. I.e. the dehydrated fragment.
-
-    workInProgress.child = current$$1.child; // Register a callback to retry this boundary once the server has sent the result.
-
-    registerSuspenseInstanceRetry(suspenseInstance, retryDehydratedSuspenseBoundary.bind(null, current$$1));
-    return null;
-  } else {
-    // This is the first attempt.
-    reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress, suspenseInstance);
-    var nextProps = workInProgress.pendingProps;
-    var nextChildren = nextProps.children;
-    var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
-    var node = child;
+      var inst = workInProgress.stateNode;
 
-    while (node) {
-      // Mark each child as hydrating. This is a fast path to know whether this
-      // tree is part of a hydrating tree. This is used to determine if a child
-      // node has fully mounted yet, and for scheduling event replaying.
-      // Conceptually this is similar to Placement in that a new subtree is
-      // inserted into the React tree here. It just happens to not need DOM
-      // mutations because it already exists.
-      node.effectTag |= Hydrating;
-      node = node.sibling;
+      if (inst.props !== nextProps) {
+        if (!didWarnAboutReassigningProps) {
+          error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component');
+        }
+
+        didWarnAboutReassigningProps = true;
+      }
     }
 
-    workInProgress.child = child;
-    return workInProgress.child;
+    return nextUnitOfWork;
   }
-}
 
-function scheduleWorkOnFiber(fiber, renderExpirationTime) {
-  if (fiber.expirationTime < renderExpirationTime) {
-    fiber.expirationTime = renderExpirationTime;
-  }
+  function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {
+    // Refs should update even if shouldComponentUpdate returns false
+    markRef(current, workInProgress);
+    var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;
 
-  var alternate = fiber.alternate;
+    if (!shouldUpdate && !didCaptureError) {
+      // Context providers should defer to sCU for rendering
+      if (hasContext) {
+        invalidateContextProvider(workInProgress, Component, false);
+      }
 
-  if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
-    alternate.expirationTime = renderExpirationTime;
-  }
+      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
+    }
 
-  scheduleWorkOnParentPath(fiber.return, renderExpirationTime);
-}
+    var instance = workInProgress.stateNode; // Rerender
 
-function propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) {
-  // Mark any Suspense boundaries with fallbacks as having work to do.
-  // If they were previously forced into fallbacks, they may now be able
-  // to unblock.
-  var node = firstChild;
+    ReactCurrentOwner$1.current = workInProgress;
+    var nextChildren;
 
-  while (node !== null) {
-    if (node.tag === SuspenseComponent) {
-      var state = node.memoizedState;
+    if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
+      // If we captured an error, but getDerivedStateFromError is not defined,
+      // unmount all the children. componentDidCatch will schedule an update to
+      // re-render a fallback. This is temporary until we migrate everyone to
+      // the new API.
+      // TODO: Warn in a future release.
+      nextChildren = null;
 
-      if (state !== null) {
-        scheduleWorkOnFiber(node, renderExpirationTime);
+      {
+        stopProfilerTimerIfRunning();
       }
-    } else if (node.tag === SuspenseListComponent) {
-      // If the tail is hidden there might not be an Suspense boundaries
-      // to schedule work on. In this case we have to schedule it on the
-      // list itself.
-      // We don't have to traverse to the children of the list since
-      // the list will propagate the change when it rerenders.
-      scheduleWorkOnFiber(node, renderExpirationTime);
-    } else if (node.child !== null) {
-      node.child.return = node;
-      node = node.child;
-      continue;
-    }
+    } else {
+      {
+        setIsRendering(true);
+        nextChildren = instance.render();
 
-    if (node === workInProgress) {
-      return;
-    }
+        if ( workInProgress.mode & StrictMode) {
+          instance.render();
+        }
 
-    while (node.sibling === null) {
-      if (node.return === null || node.return === workInProgress) {
-        return;
+        setIsRendering(false);
       }
+    } // React DevTools reads this flag.
 
-      node = node.return;
-    }
 
-    node.sibling.return = node.return;
-    node = node.sibling;
-  }
-}
+    workInProgress.effectTag |= PerformedWork;
+
+    if (current !== null && didCaptureError) {
+      // If we're recovering from an error, reconcile without reusing any of
+      // the existing children. Conceptually, the normal children and the children
+      // that are shown on error are two different sets, so we shouldn't reuse
+      // normal children even if their identities match.
+      forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime);
+    } else {
+      reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+    } // Memoize state using the values we just used to render.
+    // TODO: Restructure so we never read values from the instance.
 
-function findLastContentRow(firstChild) {
-  // This is going to find the last row among these children that is already
-  // showing content on the screen, as opposed to being in fallback state or
-  // new. If a row has multiple Suspense boundaries, any of them being in the
-  // fallback state, counts as the whole row being in a fallback state.
-  // Note that the "rows" will be workInProgress, but any nested children
-  // will still be current since we haven't rendered them yet. The mounted
-  // order may not be the same as the new order. We use the new order.
-  var row = firstChild;
-  var lastContentRow = null;
 
-  while (row !== null) {
-    var currentRow = row.alternate; // New rows can't be content rows.
+    workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.
 
-    if (currentRow !== null && findFirstSuspended(currentRow) === null) {
-      lastContentRow = row;
+    if (hasContext) {
+      invalidateContextProvider(workInProgress, Component, true);
     }
 
-    row = row.sibling;
+    return workInProgress.child;
   }
 
-  return lastContentRow;
-}
+  function pushHostRootContext(workInProgress) {
+    var root = workInProgress.stateNode;
 
-function validateRevealOrder(revealOrder) {
-  {
-    if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {
-      didWarnAboutRevealOrder[revealOrder] = true;
-
-      if (typeof revealOrder === 'string') {
-        switch (revealOrder.toLowerCase()) {
-          case 'together':
-          case 'forwards':
-          case 'backwards':
-            {
-              warning$1(false, '"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase());
-              break;
-            }
+    if (root.pendingContext) {
+      pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
+    } else if (root.context) {
+      // Should always be set
+      pushTopLevelContextObject(workInProgress, root.context, false);
+    }
 
-          case 'forward':
-          case 'backward':
-            {
-              warning$1(false, '"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase());
-              break;
-            }
+    pushHostContainer(workInProgress, root.containerInfo);
+  }
 
-          default:
-            warning$1(false, '"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
-            break;
-        }
-      } else {
-        warning$1(false, '%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
+  function updateHostRoot(current, workInProgress, renderExpirationTime) {
+    pushHostRootContext(workInProgress);
+    var updateQueue = workInProgress.updateQueue;
+
+    if (!(current !== null && updateQueue !== null)) {
+      {
+        throw Error( "If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue." );
       }
     }
-  }
-}
 
-function validateTailOptions(tailMode, revealOrder) {
-  {
-    if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {
-      if (tailMode !== 'collapsed' && tailMode !== 'hidden') {
-        didWarnAboutTailOptions[tailMode] = true;
-        warning$1(false, '"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode);
-      } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {
-        didWarnAboutTailOptions[tailMode] = true;
-        warning$1(false, '<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode);
+    var nextProps = workInProgress.pendingProps;
+    var prevState = workInProgress.memoizedState;
+    var prevChildren = prevState !== null ? prevState.element : null;
+    cloneUpdateQueue(current, workInProgress);
+    processUpdateQueue(workInProgress, nextProps, null, renderExpirationTime);
+    var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property
+    // being called "element".
+
+    var nextChildren = nextState.element;
+
+    if (nextChildren === prevChildren) {
+      // If the state is the same as before, that's a bailout because we had
+      // no work that expires at this time.
+      resetHydrationState();
+      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
+    }
+
+    var root = workInProgress.stateNode;
+
+    if (root.hydrate && enterHydrationState(workInProgress)) {
+      // If we don't have any current children this might be the first pass.
+      // We always try to hydrate. If this isn't a hydration pass there won't
+      // be any children to hydrate which is effectively the same thing as
+      // not hydrating.
+      var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
+      workInProgress.child = child;
+      var node = child;
+
+      while (node) {
+        // Mark each child as hydrating. This is a fast path to know whether this
+        // tree is part of a hydrating tree. This is used to determine if a child
+        // node has fully mounted yet, and for scheduling event replaying.
+        // Conceptually this is similar to Placement in that a new subtree is
+        // inserted into the React tree here. It just happens to not need DOM
+        // mutations because it already exists.
+        node.effectTag = node.effectTag & ~Placement | Hydrating;
+        node = node.sibling;
       }
+    } else {
+      // Otherwise reset hydration state in case we aborted and resumed another
+      // root.
+      reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+      resetHydrationState();
     }
+
+    return workInProgress.child;
   }
-}
 
-function validateSuspenseListNestedChild(childSlot, index) {
-  {
-    var isArray = Array.isArray(childSlot);
-    var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function';
+  function updateHostComponent(current, workInProgress, renderExpirationTime) {
+    pushHostContext(workInProgress);
 
-    if (isArray || isIterable) {
-      var type = isArray ? 'array' : 'iterable';
-      warning$1(false, 'A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);
-      return false;
+    if (current === null) {
+      tryToClaimNextHydratableInstance(workInProgress);
     }
-  }
 
-  return true;
-}
+    var type = workInProgress.type;
+    var nextProps = workInProgress.pendingProps;
+    var prevProps = current !== null ? current.memoizedProps : null;
+    var nextChildren = nextProps.children;
+    var isDirectTextChild = shouldSetTextContent(type, nextProps);
 
-function validateSuspenseListChildren(children, revealOrder) {
-  {
-    if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {
-      if (Array.isArray(children)) {
-        for (var i = 0; i < children.length; i++) {
-          if (!validateSuspenseListNestedChild(children[i], i)) {
-            return;
-          }
-        }
-      } else {
-        var iteratorFn = getIteratorFn(children);
+    if (isDirectTextChild) {
+      // We special case a direct text child of a host node. This is a common
+      // case. We won't handle it as a reified child. We will instead handle
+      // this in the host environment that also has access to this prop. That
+      // avoids allocating another HostText fiber and traversing it.
+      nextChildren = null;
+    } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
+      // If we're switching from a direct text child to a normal child, or to
+      // empty, we need to schedule the text content to be reset.
+      workInProgress.effectTag |= ContentReset;
+    }
 
-        if (typeof iteratorFn === 'function') {
-          var childrenIterator = iteratorFn.call(children);
+    markRef(current, workInProgress); // Check the host config to see if the children are offscreen/hidden.
 
-          if (childrenIterator) {
-            var step = childrenIterator.next();
-            var _i = 0;
+    if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) {
+      {
+        markSpawnedWork(Never);
+      } // Schedule this fiber to re-render at offscreen priority. Then bailout.
 
-            for (; !step.done; step = childrenIterator.next()) {
-              if (!validateSuspenseListNestedChild(step.value, _i)) {
-                return;
-              }
 
-              _i++;
-            }
-          }
-        } else {
-          warning$1(false, 'A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);
-        }
-      }
+      workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
+      return null;
     }
+
+    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
+    return workInProgress.child;
   }
-}
 
-function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) {
-  var renderState = workInProgress.memoizedState;
+  function updateHostText(current, workInProgress) {
+    if (current === null) {
+      tryToClaimNextHydratableInstance(workInProgress);
+    } // Nothing to do here. This is terminal. We'll do the completion step
+    // immediately after.
 
-  if (renderState === null) {
-    workInProgress.memoizedState = {
-      isBackwards: isBackwards,
-      rendering: null,
-      last: lastContentRow,
-      tail: tail,
-      tailExpiration: 0,
-      tailMode: tailMode,
-      lastEffect: lastEffectBeforeRendering
-    };
-  } else {
-    // We can reuse the existing object from previous renders.
-    renderState.isBackwards = isBackwards;
-    renderState.rendering = null;
-    renderState.last = lastContentRow;
-    renderState.tail = tail;
-    renderState.tailExpiration = 0;
-    renderState.tailMode = tailMode;
-    renderState.lastEffect = lastEffectBeforeRendering;
-  }
-} // This can end up rendering this component multiple passes.
-// The first pass splits the children fibers into two sets. A head and tail.
-// We first render the head. If anything is in fallback state, we do another
-// pass through beginWork to rerender all children (including the tail) with
-// the force suspend context. If the first render didn't have anything in
-// in fallback state. Then we render each row in the tail one-by-one.
-// That happens in the completeWork phase without going back to beginWork.
-
-
-function updateSuspenseListComponent(current$$1, workInProgress, renderExpirationTime) {
-  var nextProps = workInProgress.pendingProps;
-  var revealOrder = nextProps.revealOrder;
-  var tailMode = nextProps.tail;
-  var newChildren = nextProps.children;
-  validateRevealOrder(revealOrder);
-  validateTailOptions(tailMode, revealOrder);
-  validateSuspenseListChildren(newChildren, revealOrder);
-  reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
-  var suspenseContext = suspenseStackCursor.current;
-  var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
-
-  if (shouldForceFallback) {
-    suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
-    workInProgress.effectTag |= DidCapture;
-  } else {
-    var didSuspendBefore = current$$1 !== null && (current$$1.effectTag & DidCapture) !== NoEffect;
-
-    if (didSuspendBefore) {
-      // If we previously forced a fallback, we need to schedule work
-      // on any nested boundaries to let them know to try to render
-      // again. This is the same as context updating.
-      propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime);
-    }
 
-    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
+    return null;
   }
 
-  pushSuspenseContext(workInProgress, suspenseContext);
+  function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {
+    if (_current !== null) {
+      // A lazy component only mounts if it suspended inside a non-
+      // concurrent tree, in an inconsistent state. We want to treat it like
+      // a new mount, even though an empty version of it already committed.
+      // Disconnect the alternate pointers.
+      _current.alternate = null;
+      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
+
+      workInProgress.effectTag |= Placement;
+    }
 
-  if ((workInProgress.mode & BlockingMode) === NoMode) {
-    // Outside of blocking mode, SuspenseList doesn't work so we just
-    // use make it a noop by treating it as the default revealOrder.
-    workInProgress.memoizedState = null;
-  } else {
-    switch (revealOrder) {
-      case 'forwards':
-        {
-          var lastContentRow = findLastContentRow(workInProgress.child);
-          var tail;
+    var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet.
+    // Cancel and resume right after we know the tag.
 
-          if (lastContentRow === null) {
-            // The whole list is part of the tail.
-            // TODO: We could fast path by just rendering the tail now.
-            tail = workInProgress.child;
-            workInProgress.child = null;
-          } else {
-            // Disconnect the tail rows after the content row.
-            // We're going to render them separately later.
-            tail = lastContentRow.sibling;
-            lastContentRow.sibling = null;
-          }
+    cancelWorkTimer(workInProgress);
+    var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type.
 
-          initSuspenseListRenderState(workInProgress, false, // isBackwards
-          tail, lastContentRow, tailMode, workInProgress.lastEffect);
-          break;
-        }
+    workInProgress.type = Component;
+    var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
+    startWorkTimer(workInProgress);
+    var resolvedProps = resolveDefaultProps(Component, props);
+    var child;
 
-      case 'backwards':
+    switch (resolvedTag) {
+      case FunctionComponent:
         {
-          // We're going to find the first row that has existing content.
-          // At the same time we're going to reverse the list of everything
-          // we pass in the meantime. That's going to be our tail in reverse
-          // order.
-          var _tail = null;
-          var row = workInProgress.child;
-          workInProgress.child = null;
-
-          while (row !== null) {
-            var currentRow = row.alternate; // New rows can't be content rows.
-
-            if (currentRow !== null && findFirstSuspended(currentRow) === null) {
-              // This is the beginning of the main content.
-              workInProgress.child = row;
-              break;
-            }
+          {
+            validateFunctionComponentInDev(workInProgress, Component);
+            workInProgress.type = Component = resolveFunctionForHotReloading(Component);
+          }
 
-            var nextRow = row.sibling;
-            row.sibling = _tail;
-            _tail = row;
-            row = nextRow;
-          } // TODO: If workInProgress.child is null, we can continue on the tail immediately.
+          child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
+          return child;
+        }
 
+      case ClassComponent:
+        {
+          {
+            workInProgress.type = Component = resolveClassForHotReloading(Component);
+          }
 
-          initSuspenseListRenderState(workInProgress, true, // isBackwards
-          _tail, null, // last
-          tailMode, workInProgress.lastEffect);
-          break;
+          child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);
+          return child;
         }
 
-      case 'together':
+      case ForwardRef:
         {
-          initSuspenseListRenderState(workInProgress, false, // isBackwards
-          null, // tail
-          null, // last
-          undefined, workInProgress.lastEffect);
-          break;
+          {
+            workInProgress.type = Component = resolveForwardRefForHotReloading(Component);
+          }
+
+          child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);
+          return child;
         }
 
-      default:
+      case MemoComponent:
         {
-          // The default reveal order is the same as not having
-          // a boundary.
-          workInProgress.memoizedState = null;
+          {
+            if (workInProgress.type !== workInProgress.elementType) {
+              var outerPropTypes = Component.propTypes;
+
+              if (outerPropTypes) {
+                checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only
+                'prop', getComponentName(Component), getCurrentFiberStackInDev);
+              }
+            }
+          }
+
+          child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
+          updateExpirationTime, renderExpirationTime);
+          return child;
         }
     }
-  }
 
-  return workInProgress.child;
-}
+    var hint = '';
 
-function updatePortalComponent(current$$1, workInProgress, renderExpirationTime) {
-  pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
-  var nextChildren = workInProgress.pendingProps;
+    {
+      if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
+        hint = ' Did you wrap a component in React.lazy() more than once?';
+      }
+    } // This message intentionally doesn't mention ForwardRef or MemoComponent
+    // because the fact that it's a separate type of work is an
+    // implementation detail.
 
-  if (current$$1 === null) {
-    // Portals are special because we don't append the children during mount
-    // but at commit. Therefore we need to track insertions which the normal
-    // flow doesn't do during mount. This doesn't happen at the root because
-    // the root always starts with a "current" with a null child.
-    // TODO: Consider unifying this with how the root works.
-    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
-  } else {
-    reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
+
+    {
+      {
+        throw Error( "Element type is invalid. Received a promise that resolves to: " + Component + ". Lazy element type must resolve to a class or function." + hint );
+      }
+    }
   }
 
-  return workInProgress.child;
-}
+  function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {
+    if (_current !== null) {
+      // An incomplete component only mounts if it suspended inside a non-
+      // concurrent tree, in an inconsistent state. We want to treat it like
+      // a new mount, even though an empty version of it already committed.
+      // Disconnect the alternate pointers.
+      _current.alternate = null;
+      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
+
+      workInProgress.effectTag |= Placement;
+    } // Promote the fiber to a class and try rendering again.
+
 
-function updateContextProvider(current$$1, workInProgress, renderExpirationTime) {
-  var providerType = workInProgress.type;
-  var context = providerType._context;
-  var newProps = workInProgress.pendingProps;
-  var oldProps = workInProgress.memoizedProps;
-  var newValue = newProps.value;
+    workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`
+    // Push context providers early to prevent context stack mismatches.
+    // During mounting we don't know the child context yet as the instance doesn't exist.
+    // We will invalidate the child context in finishClassComponent() right after rendering.
 
-  {
-    var providerPropTypes = workInProgress.type.propTypes;
+    var hasContext;
 
-    if (providerPropTypes) {
-      checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);
+    if (isContextProvider(Component)) {
+      hasContext = true;
+      pushContextProvider(workInProgress);
+    } else {
+      hasContext = false;
     }
+
+    prepareToReadContext(workInProgress, renderExpirationTime);
+    constructClassInstance(workInProgress, Component, nextProps);
+    mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);
+    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
   }
 
-  pushProvider(workInProgress, newValue);
+  function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {
+    if (_current !== null) {
+      // An indeterminate component only mounts if it suspended inside a non-
+      // concurrent tree, in an inconsistent state. We want to treat it like
+      // a new mount, even though an empty version of it already committed.
+      // Disconnect the alternate pointers.
+      _current.alternate = null;
+      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
 
-  if (oldProps !== null) {
-    var oldValue = oldProps.value;
-    var changedBits = calculateChangedBits(context, newValue, oldValue);
+      workInProgress.effectTag |= Placement;
+    }
 
-    if (changedBits === 0) {
-      // No change. Bailout early if children are the same.
-      if (oldProps.children === newProps.children && !hasContextChanged()) {
-        return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
-      }
-    } else {
-      // The context value changed. Search for matching consumers and schedule
-      // them to update.
-      propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);
+    var props = workInProgress.pendingProps;
+    var context;
+
+    {
+      var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
+      context = getMaskedContext(workInProgress, unmaskedContext);
     }
-  }
 
-  var newChildren = newProps.children;
-  reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+    prepareToReadContext(workInProgress, renderExpirationTime);
+    var value;
 
-var hasWarnedAboutUsingContextAsConsumer = false;
+    {
+      if (Component.prototype && typeof Component.prototype.render === 'function') {
+        var componentName = getComponentName(Component) || 'Unknown';
 
-function updateContextConsumer(current$$1, workInProgress, renderExpirationTime) {
-  var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In
-  // DEV mode, we create a separate object for Context.Consumer that acts
-  // like a proxy to Context. This proxy object adds unnecessary code in PROD
-  // so we use the old behaviour (Context.Consumer references Context) to
-  // reduce size and overhead. The separate object references context via
-  // a property called "_context", which also gives us the ability to check
-  // in DEV mode if this property exists or not and warn if it does not.
+        if (!didWarnAboutBadClass[componentName]) {
+          error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);
 
-  {
-    if (context._context === undefined) {
-      // This may be because it's a Context (rather than a Consumer).
-      // Or it may be because it's older React where they're the same thing.
-      // We only want to warn if we're sure it's a new React.
-      if (context !== context.Consumer) {
-        if (!hasWarnedAboutUsingContextAsConsumer) {
-          hasWarnedAboutUsingContextAsConsumer = true;
-          warning$1(false, 'Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
+          didWarnAboutBadClass[componentName] = true;
         }
       }
-    } else {
-      context = context._context;
-    }
-  }
 
-  var newProps = workInProgress.pendingProps;
-  var render = newProps.children;
+      if (workInProgress.mode & StrictMode) {
+        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
+      }
 
-  {
-    !(typeof render === 'function') ? warningWithoutStack$1(false, 'A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.') : void 0;
-  }
+      setIsRendering(true);
+      ReactCurrentOwner$1.current = workInProgress;
+      value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
+      setIsRendering(false);
+    } // React DevTools reads this flag.
 
-  prepareToReadContext(workInProgress, renderExpirationTime);
-  var newValue = readContext(context, newProps.unstable_observedBits);
-  var newChildren;
 
-  {
-    ReactCurrentOwner$3.current = workInProgress;
-    setCurrentPhase('render');
-    newChildren = render(newValue);
-    setCurrentPhase(null);
-  } // React DevTools reads this flag.
+    workInProgress.effectTag |= PerformedWork;
 
+    if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
+      {
+        var _componentName = getComponentName(Component) || 'Unknown';
 
-  workInProgress.effectTag |= PerformedWork;
-  reconcileChildren(current$$1, workInProgress, newChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+        if (!didWarnAboutModulePatternComponent[_componentName]) {
+          error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);
 
-function updateFundamentalComponent$1(current$$1, workInProgress, renderExpirationTime) {
-  var fundamentalImpl = workInProgress.type.impl;
+          didWarnAboutModulePatternComponent[_componentName] = true;
+        }
+      } // Proceed under the assumption that this is a class instance
 
-  if (fundamentalImpl.reconcileChildren === false) {
-    return null;
-  }
 
-  var nextProps = workInProgress.pendingProps;
-  var nextChildren = nextProps.children;
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+      workInProgress.tag = ClassComponent; // Throw out any hooks that were used.
 
-function updateScopeComponent(current$$1, workInProgress, renderExpirationTime) {
-  var nextProps = workInProgress.pendingProps;
-  var nextChildren = nextProps.children;
-  reconcileChildren(current$$1, workInProgress, nextChildren, renderExpirationTime);
-  return workInProgress.child;
-}
+      workInProgress.memoizedState = null;
+      workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.
+      // During mounting we don't know the child context yet as the instance doesn't exist.
+      // We will invalidate the child context in finishClassComponent() right after rendering.
 
-function markWorkInProgressReceivedUpdate() {
-  didReceiveUpdate = true;
-}
+      var hasContext = false;
 
-function bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime) {
-  cancelWorkTimer(workInProgress);
+      if (isContextProvider(Component)) {
+        hasContext = true;
+        pushContextProvider(workInProgress);
+      } else {
+        hasContext = false;
+      }
 
-  if (current$$1 !== null) {
-    // Reuse previous dependencies
-    workInProgress.dependencies = current$$1.dependencies;
-  }
+      workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
+      initializeUpdateQueue(workInProgress);
+      var getDerivedStateFromProps = Component.getDerivedStateFromProps;
 
-  if (enableProfilerTimer) {
-    // Don't update "base" render times for bailouts.
-    stopProfilerTimerIfRunning(workInProgress);
-  }
+      if (typeof getDerivedStateFromProps === 'function') {
+        applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);
+      }
+
+      adoptClassInstance(workInProgress, value);
+      mountClassInstance(workInProgress, Component, props, renderExpirationTime);
+      return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);
+    } else {
+      // Proceed under the assumption that this is a function component
+      workInProgress.tag = FunctionComponent;
 
-  var updateExpirationTime = workInProgress.expirationTime;
+      {
 
-  if (updateExpirationTime !== NoWork) {
-    markUnprocessedUpdateTime(updateExpirationTime);
-  } // Check if the children have any pending work.
+        if ( workInProgress.mode & StrictMode) {
+          // Only double-render components with Hooks
+          if (workInProgress.memoizedState !== null) {
+            value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);
+          }
+        }
+      }
 
+      reconcileChildren(null, workInProgress, value, renderExpirationTime);
 
-  var childExpirationTime = workInProgress.childExpirationTime;
+      {
+        validateFunctionComponentInDev(workInProgress, Component);
+      }
 
-  if (childExpirationTime < renderExpirationTime) {
-    // The children don't have any work either. We can skip them.
-    // TODO: Once we add back resuming, we should check if the children are
-    // a work-in-progress set. If so, we need to transfer their effects.
-    return null;
-  } else {
-    // This fiber doesn't have work, but its subtree does. Clone the child
-    // fibers and continue.
-    cloneChildFibers(current$$1, workInProgress);
-    return workInProgress.child;
+      return workInProgress.child;
+    }
   }
-}
 
-function remountFiber(current$$1, oldWorkInProgress, newWorkInProgress) {
-  {
-    var returnFiber = oldWorkInProgress.return;
+  function validateFunctionComponentInDev(workInProgress, Component) {
+    {
+      if (Component) {
+        if (Component.childContextTypes) {
+          error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');
+        }
+      }
 
-    if (returnFiber === null) {
-      throw new Error('Cannot swap the root fiber.');
-    } // Disconnect from the old current.
-    // It will get deleted.
+      if (workInProgress.ref !== null) {
+        var info = '';
+        var ownerName = getCurrentFiberOwnerNameInDevOrNull();
 
+        if (ownerName) {
+          info += '\n\nCheck the render method of `' + ownerName + '`.';
+        }
 
-    current$$1.alternate = null;
-    oldWorkInProgress.alternate = null; // Connect to the new tree.
+        var warningKey = ownerName || workInProgress._debugID || '';
+        var debugSource = workInProgress._debugSource;
 
-    newWorkInProgress.index = oldWorkInProgress.index;
-    newWorkInProgress.sibling = oldWorkInProgress.sibling;
-    newWorkInProgress.return = oldWorkInProgress.return;
-    newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.
+        if (debugSource) {
+          warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
+        }
 
-    if (oldWorkInProgress === returnFiber.child) {
-      returnFiber.child = newWorkInProgress;
-    } else {
-      var prevSibling = returnFiber.child;
+        if (!didWarnAboutFunctionRefs[warningKey]) {
+          didWarnAboutFunctionRefs[warningKey] = true;
 
-      if (prevSibling === null) {
-        throw new Error('Expected parent to have a child.');
+          error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);
+        }
       }
 
-      while (prevSibling.sibling !== oldWorkInProgress) {
-        prevSibling = prevSibling.sibling;
+      if (typeof Component.getDerivedStateFromProps === 'function') {
+        var _componentName2 = getComponentName(Component) || 'Unknown';
 
-        if (prevSibling === null) {
-          throw new Error('Expected to find the previous sibling.');
+        if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) {
+          error('%s: Function components do not support getDerivedStateFromProps.', _componentName2);
+
+          didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true;
         }
       }
 
-      prevSibling.sibling = newWorkInProgress;
-    } // Delete the old fiber and place the new one.
-    // Since the old fiber is disconnected, we have to schedule it manually.
-
+      if (typeof Component.contextType === 'object' && Component.contextType !== null) {
+        var _componentName3 = getComponentName(Component) || 'Unknown';
 
-    var last = returnFiber.lastEffect;
+        if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) {
+          error('%s: Function components do not support contextType.', _componentName3);
 
-    if (last !== null) {
-      last.nextEffect = current$$1;
-      returnFiber.lastEffect = current$$1;
-    } else {
-      returnFiber.firstEffect = returnFiber.lastEffect = current$$1;
+          didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true;
+        }
+      }
     }
-
-    current$$1.nextEffect = null;
-    current$$1.effectTag = Deletion;
-    newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber.
-
-    return newWorkInProgress;
   }
-}
 
-function beginWork$1(current$$1, workInProgress, renderExpirationTime) {
-  var updateExpirationTime = workInProgress.expirationTime;
+  var SUSPENDED_MARKER = {
+    dehydrated: null,
+    retryTime: NoWork
+  };
 
-  {
-    if (workInProgress._debugNeedsRemount && current$$1 !== null) {
-      // This will restart the begin phase with a new fiber.
-      return remountFiber(current$$1, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime));
-    }
+  function shouldRemainOnFallback(suspenseContext, current, workInProgress) {
+    // If the context is telling us that we should show a fallback, and we're not
+    // already showing content, then we should show the fallback instead.
+    return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current === null || current.memoizedState !== null);
   }
 
-  if (current$$1 !== null) {
-    var oldProps = current$$1.memoizedProps;
-    var newProps = workInProgress.pendingProps;
-
-    if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:
-    workInProgress.type !== current$$1.type)) {
-      // If props or context changed, mark the fiber as having performed work.
-      // This may be unset if the props are determined to be equal later (memo).
-      didReceiveUpdate = true;
-    } else if (updateExpirationTime < renderExpirationTime) {
-      didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering
-      // the begin phase. There's still some bookkeeping we that needs to be done
-      // in this optimized path, mostly pushing stuff onto the stack.
-
-      switch (workInProgress.tag) {
-        case HostRoot:
-          pushHostRootContext(workInProgress);
-          resetHydrationState();
-          break;
+  function updateSuspenseComponent(current, workInProgress, renderExpirationTime) {
+    var mode = workInProgress.mode;
+    var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.
 
-        case HostComponent:
-          pushHostContext(workInProgress);
+    {
+      if (shouldSuspend(workInProgress)) {
+        workInProgress.effectTag |= DidCapture;
+      }
+    }
 
-          if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) {
-            if (enableSchedulerTracing) {
-              markSpawnedWork(Never);
-            } // Schedule this fiber to re-render at offscreen priority. Then bailout.
+    var suspenseContext = suspenseStackCursor.current;
+    var nextDidTimeout = false;
+    var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect;
 
+    if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {
+      // Something in this boundary's subtree already suspended. Switch to
+      // rendering the fallback children.
+      nextDidTimeout = true;
+      workInProgress.effectTag &= ~DidCapture;
+    } else {
+      // Attempting the main content
+      if (current === null || current.memoizedState !== null) {
+        // This is a new mount or this boundary is already showing a fallback state.
+        // Mark this subtree context as having at least one invisible parent that could
+        // handle the fallback state.
+        // Boundaries without fallbacks or should be avoided are not considered since
+        // they cannot handle preferred fallback states.
+        if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) {
+          suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);
+        }
+      }
+    }
 
-            workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
-            return null;
-          }
+    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
+    pushSuspenseContext(workInProgress, suspenseContext); // This next part is a bit confusing. If the children timeout, we switch to
+    // showing the fallback children in place of the "primary" children.
+    // However, we don't want to delete the primary children because then their
+    // state will be lost (both the React state and the host state, e.g.
+    // uncontrolled form inputs). Instead we keep them mounted and hide them.
+    // Both the fallback children AND the primary children are rendered at the
+    // same time. Once the primary children are un-suspended, we can delete
+    // the fallback children — don't need to preserve their state.
+    //
+    // The two sets of children are siblings in the host environment, but
+    // semantically, for purposes of reconciliation, they are two separate sets.
+    // So we store them using two fragment fibers.
+    //
+    // However, we want to avoid allocating extra fibers for every placeholder.
+    // They're only necessary when the children time out, because that's the
+    // only time when both sets are mounted.
+    //
+    // So, the extra fragment fibers are only used if the children time out.
+    // Otherwise, we render the primary children directly. This requires some
+    // custom reconciliation logic to preserve the state of the primary
+    // children. It's essentially a very basic form of re-parenting.
 
-          break;
+    if (current === null) {
+      // If we're currently hydrating, try to hydrate this boundary.
+      // But only if this has a fallback.
+      if (nextProps.fallback !== undefined) {
+        tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.
+      } // This is the initial mount. This branch is pretty simple because there's
+      // no previous state that needs to be preserved.
 
-        case ClassComponent:
-          {
-            var Component = workInProgress.type;
 
-            if (isContextProvider(Component)) {
-              pushContextProvider(workInProgress);
-            }
+      if (nextDidTimeout) {
+        // Mount separate fragments for primary and fallback children.
+        var nextFallbackChildren = nextProps.fallback;
+        var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);
+        primaryChildFragment.return = workInProgress;
 
-            break;
+        if ((workInProgress.mode & BlockingMode) === NoMode) {
+          // Outside of blocking mode, we commit the effects from the
+          // partially completed, timed-out tree, too.
+          var progressedState = workInProgress.memoizedState;
+          var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;
+          primaryChildFragment.child = progressedPrimaryChild;
+          var progressedChild = progressedPrimaryChild;
+
+          while (progressedChild !== null) {
+            progressedChild.return = primaryChildFragment;
+            progressedChild = progressedChild.sibling;
           }
+        }
 
-        case HostPortal:
-          pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
-          break;
-
-        case ContextProvider:
-          {
-            var newValue = workInProgress.memoizedProps.value;
-            pushProvider(workInProgress, newValue);
-            break;
-          }
+        var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);
+        fallbackChildFragment.return = workInProgress;
+        primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the
+        // fallback children.
 
-        case Profiler:
-          if (enableProfilerTimer) {
-            // Profiler should only call onRender when one of its descendants actually rendered.
-            var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;
+        workInProgress.memoizedState = SUSPENDED_MARKER;
+        workInProgress.child = primaryChildFragment;
+        return fallbackChildFragment;
+      } else {
+        // Mount the primary children without an intermediate fragment fiber.
+        var nextPrimaryChildren = nextProps.children;
+        workInProgress.memoizedState = null;
+        return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);
+      }
+    } else {
+      // This is an update. This branch is more complicated because we need to
+      // ensure the state of the primary children is preserved.
+      var prevState = current.memoizedState;
 
-            if (hasChildWork) {
-              workInProgress.effectTag |= Update;
-            }
-          }
+      if (prevState !== null) {
+        // wrapped in a fragment fiber.
 
-          break;
 
-        case SuspenseComponent:
-          {
-            var state = workInProgress.memoizedState;
+        var currentPrimaryChildFragment = current.child;
+        var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
 
-            if (state !== null) {
-              if (enableSuspenseServerRenderer) {
-                if (state.dehydrated !== null) {
-                  pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // We know that this component will suspend again because if it has
-                  // been unsuspended it has committed as a resolved Suspense component.
-                  // If it needs to be retried, it should have work scheduled on it.
+        if (nextDidTimeout) {
+          // Still timed out. Reuse the current primary children by cloning
+          // its fragment. We're going to skip over these entirely.
+          var _nextFallbackChildren2 = nextProps.fallback;
 
-                  workInProgress.effectTag |= DidCapture;
-                  break;
-                }
-              } // If this boundary is currently timed out, we need to decide
-              // whether to retry the primary children, or to skip over it and
-              // go straight to the fallback. Check the priority of the primary
-              // child fragment.
+          var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps);
 
+          _primaryChildFragment2.return = workInProgress;
 
-              var primaryChildFragment = workInProgress.child;
-              var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;
+          if ((workInProgress.mode & BlockingMode) === NoMode) {
+            // Outside of blocking mode, we commit the effects from the
+            // partially completed, timed-out tree, too.
+            var _progressedState = workInProgress.memoizedState;
 
-              if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {
-                // The primary children have pending work. Use the normal path
-                // to attempt to render the primary children again.
-                return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
-              } else {
-                pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient
-                // priority. Bailout.
+            var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;
 
-                var child = bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
+            if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {
+              _primaryChildFragment2.child = _progressedPrimaryChild;
+              var _progressedChild2 = _progressedPrimaryChild;
 
-                if (child !== null) {
-                  // The fallback children have pending work. Skip over the
-                  // primary children and work on the fallback.
-                  return child.sibling;
-                } else {
-                  return null;
-                }
+              while (_progressedChild2 !== null) {
+                _progressedChild2.return = _primaryChildFragment2;
+                _progressedChild2 = _progressedChild2.sibling;
               }
-            } else {
-              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
             }
+          } // Because primaryChildFragment is a new fiber that we're inserting as the
+          // parent of a new tree, we need to set its treeBaseDuration.
 
-            break;
-          }
-
-        case SuspenseListComponent:
-          {
-            var didSuspendBefore = (current$$1.effectTag & DidCapture) !== NoEffect;
-
-            var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;
 
-            if (didSuspendBefore) {
-              if (_hasChildWork) {
-                // If something was in fallback state last time, and we have all the
-                // same children then we're still in progressive loading state.
-                // Something might get unblocked by state updates or retries in the
-                // tree which will affect the tail. So we need to use the normal
-                // path to compute the correct tail.
-                return updateSuspenseListComponent(current$$1, workInProgress, renderExpirationTime);
-              } // If none of the children had any work, that means that none of
-              // them got retried so they'll still be blocked in the same way
-              // as before. We can fast bail out.
+          if ( workInProgress.mode & ProfileMode) {
+            // treeBaseDuration is the sum of all the child tree base durations.
+            var _treeBaseDuration = 0;
+            var _hiddenChild = _primaryChildFragment2.child;
 
+            while (_hiddenChild !== null) {
+              _treeBaseDuration += _hiddenChild.treeBaseDuration;
+              _hiddenChild = _hiddenChild.sibling;
+            }
 
-              workInProgress.effectTag |= DidCapture;
-            } // If nothing suspended before and we're rendering the same children,
-            // then the tail doesn't matter. Anything new that suspends will work
-            // in the "together" mode, so we can continue from the state we had.
+            _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;
+          } // Clone the fallback child fragment, too. These we'll continue
+          // working on.
 
 
-            var renderState = workInProgress.memoizedState;
+          var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2);
 
-            if (renderState !== null) {
-              // Reset to the "together" mode in case we've started a different
-              // update in the past but didn't complete it.
-              renderState.rendering = null;
-              renderState.tail = null;
-            }
+          _fallbackChildFragment2.return = workInProgress;
+          _primaryChildFragment2.sibling = _fallbackChildFragment2;
+          _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the
+          // fallback children.
 
-            pushSuspenseContext(workInProgress, suspenseStackCursor.current);
+          workInProgress.memoizedState = SUSPENDED_MARKER;
+          workInProgress.child = _primaryChildFragment2;
+          return _fallbackChildFragment2;
+        } else {
+          // No longer suspended. Switch back to showing the primary children,
+          // and remove the intermediate fragment fiber.
+          var _nextPrimaryChildren = nextProps.children;
+          var currentPrimaryChild = currentPrimaryChildFragment.child;
+          var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback
+          // children. Wait until the complete phase, after we've confirmed the
+          // fallback is no longer needed.
+          // TODO: Would it be better to store the fallback fragment on
+          // the stateNode?
+          // Continue rendering the children, like we normally do.
 
-            if (_hasChildWork) {
-              break;
-            } else {
-              // If none of the children had any work, that means that none of
-              // them got retried so they'll still be blocked in the same way
-              // as before. We can fast bail out.
-              return null;
-            }
-          }
-      }
+          workInProgress.memoizedState = null;
+          return workInProgress.child = primaryChild;
+        }
+      } else {
+        // The current tree has not already timed out. That means the primary
+        // children are not wrapped in a fragment fiber.
+        var _currentPrimaryChild = current.child;
 
-      return bailoutOnAlreadyFinishedWork(current$$1, workInProgress, renderExpirationTime);
-    } else {
-      // An update was scheduled on this fiber, but there are no new props
-      // nor legacy context. Set this to false. If an update queue or context
-      // consumer produces a changed value, it will set this to true. Otherwise,
-      // the component will assume the children have not changed and bail out.
-      didReceiveUpdate = false;
-    }
-  } else {
-    didReceiveUpdate = false;
-  } // Before entering the begin phase, clear the expiration time.
+        if (nextDidTimeout) {
+          // Timed out. Wrap the children in a fragment fiber to keep them
+          // separate from the fallback children.
+          var _nextFallbackChildren3 = nextProps.fallback;
 
+          var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't
+          // going to render this fragment.
+          null, mode, NoWork, null);
 
-  workInProgress.expirationTime = NoWork;
+          _primaryChildFragment3.return = workInProgress;
+          _primaryChildFragment3.child = _currentPrimaryChild;
 
-  switch (workInProgress.tag) {
-    case IndeterminateComponent:
-      {
-        return mountIndeterminateComponent(current$$1, workInProgress, workInProgress.type, renderExpirationTime);
-      }
+          if (_currentPrimaryChild !== null) {
+            _currentPrimaryChild.return = _primaryChildFragment3;
+          } // Even though we're creating a new fiber, there are no new children,
+          // because we're reusing an already mounted tree. So we don't need to
+          // schedule a placement.
+          // primaryChildFragment.effectTag |= Placement;
 
-    case LazyComponent:
-      {
-        var elementType = workInProgress.elementType;
-        return mountLazyComponent(current$$1, workInProgress, elementType, updateExpirationTime, renderExpirationTime);
-      }
 
-    case FunctionComponent:
-      {
-        var _Component = workInProgress.type;
-        var unresolvedProps = workInProgress.pendingProps;
-        var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);
-        return updateFunctionComponent(current$$1, workInProgress, _Component, resolvedProps, renderExpirationTime);
-      }
+          if ((workInProgress.mode & BlockingMode) === NoMode) {
+            // Outside of blocking mode, we commit the effects from the
+            // partially completed, timed-out tree, too.
+            var _progressedState2 = workInProgress.memoizedState;
 
-    case ClassComponent:
-      {
-        var _Component2 = workInProgress.type;
-        var _unresolvedProps = workInProgress.pendingProps;
+            var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;
 
-        var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);
+            _primaryChildFragment3.child = _progressedPrimaryChild2;
+            var _progressedChild3 = _progressedPrimaryChild2;
 
-        return updateClassComponent(current$$1, workInProgress, _Component2, _resolvedProps, renderExpirationTime);
-      }
+            while (_progressedChild3 !== null) {
+              _progressedChild3.return = _primaryChildFragment3;
+              _progressedChild3 = _progressedChild3.sibling;
+            }
+          } // Because primaryChildFragment is a new fiber that we're inserting as the
+          // parent of a new tree, we need to set its treeBaseDuration.
 
-    case HostRoot:
-      return updateHostRoot(current$$1, workInProgress, renderExpirationTime);
 
-    case HostComponent:
-      return updateHostComponent(current$$1, workInProgress, renderExpirationTime);
+          if ( workInProgress.mode & ProfileMode) {
+            // treeBaseDuration is the sum of all the child tree base durations.
+            var _treeBaseDuration2 = 0;
+            var _hiddenChild2 = _primaryChildFragment3.child;
 
-    case HostText:
-      return updateHostText(current$$1, workInProgress);
+            while (_hiddenChild2 !== null) {
+              _treeBaseDuration2 += _hiddenChild2.treeBaseDuration;
+              _hiddenChild2 = _hiddenChild2.sibling;
+            }
 
-    case SuspenseComponent:
-      return updateSuspenseComponent(current$$1, workInProgress, renderExpirationTime);
+            _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2;
+          } // Create a fragment from the fallback children, too.
 
-    case HostPortal:
-      return updatePortalComponent(current$$1, workInProgress, renderExpirationTime);
 
-    case ForwardRef:
-      {
-        var type = workInProgress.type;
-        var _unresolvedProps2 = workInProgress.pendingProps;
+          var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null);
 
-        var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
+          _fallbackChildFragment3.return = workInProgress;
+          _primaryChildFragment3.sibling = _fallbackChildFragment3;
+          _fallbackChildFragment3.effectTag |= Placement;
+          _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the
+          // fallback children.
 
-        return updateForwardRef(current$$1, workInProgress, type, _resolvedProps2, renderExpirationTime);
+          workInProgress.memoizedState = SUSPENDED_MARKER;
+          workInProgress.child = _primaryChildFragment3;
+          return _fallbackChildFragment3;
+        } else {
+          // Still haven't timed out. Continue rendering the children, like we
+          // normally do.
+          workInProgress.memoizedState = null;
+          var _nextPrimaryChildren2 = nextProps.children;
+          return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);
+        }
       }
+    }
+  }
 
-    case Fragment:
-      return updateFragment(current$$1, workInProgress, renderExpirationTime);
-
-    case Mode:
-      return updateMode(current$$1, workInProgress, renderExpirationTime);
+  function scheduleWorkOnFiber(fiber, renderExpirationTime) {
+    if (fiber.expirationTime < renderExpirationTime) {
+      fiber.expirationTime = renderExpirationTime;
+    }
 
-    case Profiler:
-      return updateProfiler(current$$1, workInProgress, renderExpirationTime);
+    var alternate = fiber.alternate;
 
-    case ContextProvider:
-      return updateContextProvider(current$$1, workInProgress, renderExpirationTime);
+    if (alternate !== null && alternate.expirationTime < renderExpirationTime) {
+      alternate.expirationTime = renderExpirationTime;
+    }
 
-    case ContextConsumer:
-      return updateContextConsumer(current$$1, workInProgress, renderExpirationTime);
+    scheduleWorkOnParentPath(fiber.return, renderExpirationTime);
+  }
 
-    case MemoComponent:
-      {
-        var _type2 = workInProgress.type;
-        var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.
+  function propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) {
+    // Mark any Suspense boundaries with fallbacks as having work to do.
+    // If they were previously forced into fallbacks, they may now be able
+    // to unblock.
+    var node = firstChild;
 
-        var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
+    while (node !== null) {
+      if (node.tag === SuspenseComponent) {
+        var state = node.memoizedState;
+
+        if (state !== null) {
+          scheduleWorkOnFiber(node, renderExpirationTime);
+        }
+      } else if (node.tag === SuspenseListComponent) {
+        // If the tail is hidden there might not be an Suspense boundaries
+        // to schedule work on. In this case we have to schedule it on the
+        // list itself.
+        // We don't have to traverse to the children of the list since
+        // the list will propagate the change when it rerenders.
+        scheduleWorkOnFiber(node, renderExpirationTime);
+      } else if (node.child !== null) {
+        node.child.return = node;
+        node = node.child;
+        continue;
+      }
 
-        {
-          if (workInProgress.type !== workInProgress.elementType) {
-            var outerPropTypes = _type2.propTypes;
+      if (node === workInProgress) {
+        return;
+      }
 
-            if (outerPropTypes) {
-              checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only
-              'prop', getComponentName(_type2), getCurrentFiberStackInDev);
-            }
-          }
+      while (node.sibling === null) {
+        if (node.return === null || node.return === workInProgress) {
+          return;
         }
 
-        _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
-        return updateMemoComponent(current$$1, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);
+        node = node.return;
       }
 
-    case SimpleMemoComponent:
-      {
-        return updateSimpleMemoComponent(current$$1, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);
-      }
+      node.sibling.return = node.return;
+      node = node.sibling;
+    }
+  }
 
-    case IncompleteClassComponent:
-      {
-        var _Component3 = workInProgress.type;
-        var _unresolvedProps4 = workInProgress.pendingProps;
+  function findLastContentRow(firstChild) {
+    // This is going to find the last row among these children that is already
+    // showing content on the screen, as opposed to being in fallback state or
+    // new. If a row has multiple Suspense boundaries, any of them being in the
+    // fallback state, counts as the whole row being in a fallback state.
+    // Note that the "rows" will be workInProgress, but any nested children
+    // will still be current since we haven't rendered them yet. The mounted
+    // order may not be the same as the new order. We use the new order.
+    var row = firstChild;
+    var lastContentRow = null;
 
-        var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);
+    while (row !== null) {
+      var currentRow = row.alternate; // New rows can't be content rows.
 
-        return mountIncompleteClassComponent(current$$1, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);
+      if (currentRow !== null && findFirstSuspended(currentRow) === null) {
+        lastContentRow = row;
       }
 
-    case SuspenseListComponent:
-      {
-        return updateSuspenseListComponent(current$$1, workInProgress, renderExpirationTime);
-      }
+      row = row.sibling;
+    }
 
-    case FundamentalComponent:
-      {
-        if (enableFundamentalAPI) {
-          return updateFundamentalComponent$1(current$$1, workInProgress, renderExpirationTime);
-        }
+    return lastContentRow;
+  }
 
-        break;
-      }
+  function validateRevealOrder(revealOrder) {
+    {
+      if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {
+        didWarnAboutRevealOrder[revealOrder] = true;
+
+        if (typeof revealOrder === 'string') {
+          switch (revealOrder.toLowerCase()) {
+            case 'together':
+            case 'forwards':
+            case 'backwards':
+              {
+                error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase());
 
-    case ScopeComponent:
-      {
-        if (enableScopeAPI) {
-          return updateScopeComponent(current$$1, workInProgress, renderExpirationTime);
-        }
+                break;
+              }
 
-        break;
+            case 'forward':
+            case 'backward':
+              {
+                error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase());
+
+                break;
+              }
+
+            default:
+              error('"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
+
+              break;
+          }
+        } else {
+          error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
+        }
       }
+    }
   }
 
-  {
+  function validateTailOptions(tailMode, revealOrder) {
     {
-      throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue.");
+      if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {
+        if (tailMode !== 'collapsed' && tailMode !== 'hidden') {
+          didWarnAboutTailOptions[tailMode] = true;
+
+          error('"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode);
+        } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {
+          didWarnAboutTailOptions[tailMode] = true;
+
+          error('<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode);
+        }
+      }
     }
   }
-}
 
-function createFundamentalStateInstance(currentFiber, props, impl, state) {
-  return {
-    currentFiber: currentFiber,
-    impl: impl,
-    instance: null,
-    prevProps: null,
-    props: props,
-    state: state
-  };
-}
+  function validateSuspenseListNestedChild(childSlot, index) {
+    {
+      var isArray = Array.isArray(childSlot);
+      var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function';
 
-function isFiberSuspenseAndTimedOut(fiber) {
-  return fiber.tag === SuspenseComponent && fiber.memoizedState !== null;
-}
+      if (isArray || isIterable) {
+        var type = isArray ? 'array' : 'iterable';
 
-function getSuspenseFallbackChild(fiber) {
-  return fiber.child.sibling.child;
-}
+        error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);
 
-var emptyObject$1 = {};
+        return false;
+      }
+    }
 
-function collectScopedNodes(node, fn, scopedNodes) {
-  if (enableScopeAPI) {
-    if (node.tag === HostComponent) {
-      var _type = node.type,
-          memoizedProps = node.memoizedProps,
-          stateNode = node.stateNode;
+    return true;
+  }
 
-      var _instance = getPublicInstance(stateNode);
+  function validateSuspenseListChildren(children, revealOrder) {
+    {
+      if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {
+        if (Array.isArray(children)) {
+          for (var i = 0; i < children.length; i++) {
+            if (!validateSuspenseListNestedChild(children[i], i)) {
+              return;
+            }
+          }
+        } else {
+          var iteratorFn = getIteratorFn(children);
 
-      if (_instance !== null && fn(_type, memoizedProps || emptyObject$1, _instance) === true) {
-        scopedNodes.push(_instance);
-      }
-    }
+          if (typeof iteratorFn === 'function') {
+            var childrenIterator = iteratorFn.call(children);
 
-    var child = node.child;
+            if (childrenIterator) {
+              var step = childrenIterator.next();
+              var _i = 0;
 
-    if (isFiberSuspenseAndTimedOut(node)) {
-      child = getSuspenseFallbackChild(node);
-    }
+              for (; !step.done; step = childrenIterator.next()) {
+                if (!validateSuspenseListNestedChild(step.value, _i)) {
+                  return;
+                }
 
-    if (child !== null) {
-      collectScopedNodesFromChildren(child, fn, scopedNodes);
+                _i++;
+              }
+            }
+          } else {
+            error('A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);
+          }
+        }
+      }
     }
   }
-}
 
-function collectFirstScopedNode(node, fn) {
-  if (enableScopeAPI) {
-    if (node.tag === HostComponent) {
-      var _type2 = node.type,
-          memoizedProps = node.memoizedProps,
-          stateNode = node.stateNode;
+  function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) {
+    var renderState = workInProgress.memoizedState;
 
-      var _instance2 = getPublicInstance(stateNode);
+    if (renderState === null) {
+      workInProgress.memoizedState = {
+        isBackwards: isBackwards,
+        rendering: null,
+        renderingStartTime: 0,
+        last: lastContentRow,
+        tail: tail,
+        tailExpiration: 0,
+        tailMode: tailMode,
+        lastEffect: lastEffectBeforeRendering
+      };
+    } else {
+      // We can reuse the existing object from previous renders.
+      renderState.isBackwards = isBackwards;
+      renderState.rendering = null;
+      renderState.renderingStartTime = 0;
+      renderState.last = lastContentRow;
+      renderState.tail = tail;
+      renderState.tailExpiration = 0;
+      renderState.tailMode = tailMode;
+      renderState.lastEffect = lastEffectBeforeRendering;
+    }
+  } // This can end up rendering this component multiple passes.
+  // The first pass splits the children fibers into two sets. A head and tail.
+  // We first render the head. If anything is in fallback state, we do another
+  // pass through beginWork to rerender all children (including the tail) with
+  // the force suspend context. If the first render didn't have anything in
+  // in fallback state. Then we render each row in the tail one-by-one.
+  // That happens in the completeWork phase without going back to beginWork.
+
+
+  function updateSuspenseListComponent(current, workInProgress, renderExpirationTime) {
+    var nextProps = workInProgress.pendingProps;
+    var revealOrder = nextProps.revealOrder;
+    var tailMode = nextProps.tail;
+    var newChildren = nextProps.children;
+    validateRevealOrder(revealOrder);
+    validateTailOptions(tailMode, revealOrder);
+    validateSuspenseListChildren(newChildren, revealOrder);
+    reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);
+    var suspenseContext = suspenseStackCursor.current;
+    var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
+
+    if (shouldForceFallback) {
+      suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
+      workInProgress.effectTag |= DidCapture;
+    } else {
+      var didSuspendBefore = current !== null && (current.effectTag & DidCapture) !== NoEffect;
 
-      if (_instance2 !== null && fn(_type2, memoizedProps, _instance2) === true) {
-        return _instance2;
+      if (didSuspendBefore) {
+        // If we previously forced a fallback, we need to schedule work
+        // on any nested boundaries to let them know to try to render
+        // again. This is the same as context updating.
+        propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime);
       }
+
+      suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
     }
 
-    var child = node.child;
+    pushSuspenseContext(workInProgress, suspenseContext);
+
+    if ((workInProgress.mode & BlockingMode) === NoMode) {
+      // Outside of blocking mode, SuspenseList doesn't work so we just
+      // use make it a noop by treating it as the default revealOrder.
+      workInProgress.memoizedState = null;
+    } else {
+      switch (revealOrder) {
+        case 'forwards':
+          {
+            var lastContentRow = findLastContentRow(workInProgress.child);
+            var tail;
+
+            if (lastContentRow === null) {
+              // The whole list is part of the tail.
+              // TODO: We could fast path by just rendering the tail now.
+              tail = workInProgress.child;
+              workInProgress.child = null;
+            } else {
+              // Disconnect the tail rows after the content row.
+              // We're going to render them separately later.
+              tail = lastContentRow.sibling;
+              lastContentRow.sibling = null;
+            }
+
+            initSuspenseListRenderState(workInProgress, false, // isBackwards
+            tail, lastContentRow, tailMode, workInProgress.lastEffect);
+            break;
+          }
 
-    if (isFiberSuspenseAndTimedOut(node)) {
-      child = getSuspenseFallbackChild(node);
-    }
+        case 'backwards':
+          {
+            // We're going to find the first row that has existing content.
+            // At the same time we're going to reverse the list of everything
+            // we pass in the meantime. That's going to be our tail in reverse
+            // order.
+            var _tail = null;
+            var row = workInProgress.child;
+            workInProgress.child = null;
 
-    if (child !== null) {
-      return collectFirstScopedNodeFromChildren(child, fn);
-    }
-  }
+            while (row !== null) {
+              var currentRow = row.alternate; // New rows can't be content rows.
 
-  return null;
-}
+              if (currentRow !== null && findFirstSuspended(currentRow) === null) {
+                // This is the beginning of the main content.
+                workInProgress.child = row;
+                break;
+              }
 
-function collectScopedNodesFromChildren(startingChild, fn, scopedNodes) {
-  var child = startingChild;
+              var nextRow = row.sibling;
+              row.sibling = _tail;
+              _tail = row;
+              row = nextRow;
+            } // TODO: If workInProgress.child is null, we can continue on the tail immediately.
 
-  while (child !== null) {
-    collectScopedNodes(child, fn, scopedNodes);
-    child = child.sibling;
-  }
-}
 
-function collectFirstScopedNodeFromChildren(startingChild, fn) {
-  var child = startingChild;
+            initSuspenseListRenderState(workInProgress, true, // isBackwards
+            _tail, null, // last
+            tailMode, workInProgress.lastEffect);
+            break;
+          }
 
-  while (child !== null) {
-    var scopedNode = collectFirstScopedNode(child, fn);
+        case 'together':
+          {
+            initSuspenseListRenderState(workInProgress, false, // isBackwards
+            null, // tail
+            null, // last
+            undefined, workInProgress.lastEffect);
+            break;
+          }
 
-    if (scopedNode !== null) {
-      return scopedNode;
+        default:
+          {
+            // The default reveal order is the same as not having
+            // a boundary.
+            workInProgress.memoizedState = null;
+          }
+      }
     }
 
-    child = child.sibling;
+    return workInProgress.child;
   }
 
-  return null;
-}
-
-function collectNearestScopeMethods(node, scope, childrenScopes) {
-  if (isValidScopeNode(node, scope)) {
-    childrenScopes.push(node.stateNode.methods);
-  } else {
-    var child = node.child;
-
-    if (isFiberSuspenseAndTimedOut(node)) {
-      child = getSuspenseFallbackChild(node);
-    }
+  function updatePortalComponent(current, workInProgress, renderExpirationTime) {
+    pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
+    var nextChildren = workInProgress.pendingProps;
 
-    if (child !== null) {
-      collectNearestChildScopeMethods(child, scope, childrenScopes);
+    if (current === null) {
+      // Portals are special because we don't append the children during mount
+      // but at commit. Therefore we need to track insertions which the normal
+      // flow doesn't do during mount. This doesn't happen at the root because
+      // the root always starts with a "current" with a null child.
+      // TODO: Consider unifying this with how the root works.
+      workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);
+    } else {
+      reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);
     }
-  }
-}
-
-function collectNearestChildScopeMethods(startingChild, scope, childrenScopes) {
-  var child = startingChild;
 
-  while (child !== null) {
-    collectNearestScopeMethods(child, scope, childrenScopes);
-    child = child.sibling;
+    return workInProgress.child;
   }
-}
 
-function isValidScopeNode(node, scope) {
-  return node.tag === ScopeComponent && node.type === scope && node.stateNode !== null;
-}
+  function updateContextProvider(current, workInProgress, renderExpirationTime) {
+    var providerType = workInProgress.type;
+    var context = providerType._context;
+    var newProps = workInProgress.pendingProps;
+    var oldProps = workInProgress.memoizedProps;
+    var newValue = newProps.value;
 
-function createScopeMethods(scope, instance) {
-  return {
-    getChildren: function () {
-      var currentFiber = instance.fiber;
-      var child = currentFiber.child;
-      var childrenScopes = [];
+    {
+      var providerPropTypes = workInProgress.type.propTypes;
 
-      if (child !== null) {
-        collectNearestChildScopeMethods(child, scope, childrenScopes);
+      if (providerPropTypes) {
+        checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);
       }
+    }
 
-      return childrenScopes.length === 0 ? null : childrenScopes;
-    },
-    getChildrenFromRoot: function () {
-      var currentFiber = instance.fiber;
-      var node = currentFiber;
+    pushProvider(workInProgress, newValue);
 
-      while (node !== null) {
-        var parent = node.return;
+    if (oldProps !== null) {
+      var oldValue = oldProps.value;
+      var changedBits = calculateChangedBits(context, newValue, oldValue);
 
-        if (parent === null) {
-          break;
+      if (changedBits === 0) {
+        // No change. Bailout early if children are the same.
+        if (oldProps.children === newProps.children && !hasContextChanged()) {
+          return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
         }
+      } else {
+        // The context value changed. Search for matching consumers and schedule
+        // them to update.
+        propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);
+      }
+    }
 
-        node = parent;
+    var newChildren = newProps.children;
+    reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);
+    return workInProgress.child;
+  }
 
-        if (node.tag === ScopeComponent && node.type === scope) {
-          break;
-        }
-      }
+  var hasWarnedAboutUsingContextAsConsumer = false;
 
-      var childrenScopes = [];
-      collectNearestChildScopeMethods(node.child, scope, childrenScopes);
-      return childrenScopes.length === 0 ? null : childrenScopes;
-    },
-    getParent: function () {
-      var node = instance.fiber.return;
+  function updateContextConsumer(current, workInProgress, renderExpirationTime) {
+    var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In
+    // DEV mode, we create a separate object for Context.Consumer that acts
+    // like a proxy to Context. This proxy object adds unnecessary code in PROD
+    // so we use the old behaviour (Context.Consumer references Context) to
+    // reduce size and overhead. The separate object references context via
+    // a property called "_context", which also gives us the ability to check
+    // in DEV mode if this property exists or not and warn if it does not.
 
-      while (node !== null) {
-        if (node.tag === ScopeComponent && node.type === scope) {
-          return node.stateNode.methods;
+    {
+      if (context._context === undefined) {
+        // This may be because it's a Context (rather than a Consumer).
+        // Or it may be because it's older React where they're the same thing.
+        // We only want to warn if we're sure it's a new React.
+        if (context !== context.Consumer) {
+          if (!hasWarnedAboutUsingContextAsConsumer) {
+            hasWarnedAboutUsingContextAsConsumer = true;
+
+            error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
+          }
         }
-
-        node = node.return;
+      } else {
+        context = context._context;
       }
+    }
 
-      return null;
-    },
-    getProps: function () {
-      var currentFiber = instance.fiber;
-      return currentFiber.memoizedProps;
-    },
-    queryAllNodes: function (fn) {
-      var currentFiber = instance.fiber;
-      var child = currentFiber.child;
-      var scopedNodes = [];
+    var newProps = workInProgress.pendingProps;
+    var render = newProps.children;
 
-      if (child !== null) {
-        collectScopedNodesFromChildren(child, fn, scopedNodes);
+    {
+      if (typeof render !== 'function') {
+        error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');
       }
+    }
 
-      return scopedNodes.length === 0 ? null : scopedNodes;
-    },
-    queryFirstNode: function (fn) {
-      var currentFiber = instance.fiber;
-      var child = currentFiber.child;
-
-      if (child !== null) {
-        return collectFirstScopedNodeFromChildren(child, fn);
-      }
+    prepareToReadContext(workInProgress, renderExpirationTime);
+    var newValue = readContext(context, newProps.unstable_observedBits);
+    var newChildren;
 
-      return null;
-    },
-    containsNode: function (node) {
-      var fiber = getInstanceFromNode$2(node);
+    {
+      ReactCurrentOwner$1.current = workInProgress;
+      setIsRendering(true);
+      newChildren = render(newValue);
+      setIsRendering(false);
+    } // React DevTools reads this flag.
 
-      while (fiber !== null) {
-        if (fiber.tag === ScopeComponent && fiber.type === scope && fiber.stateNode === instance) {
-          return true;
-        }
 
-        fiber = fiber.return;
-      }
+    workInProgress.effectTag |= PerformedWork;
+    reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);
+    return workInProgress.child;
+  }
 
-      return false;
-    }
-  };
-}
-
-function markUpdate(workInProgress) {
-  // Tag the fiber with an update effect. This turns a Placement into
-  // a PlacementAndUpdate.
-  workInProgress.effectTag |= Update;
-}
-
-function markRef$1(workInProgress) {
-  workInProgress.effectTag |= Ref;
-}
-
-var appendAllChildren;
-var updateHostContainer;
-var updateHostComponent$1;
-var updateHostText$1;
-
-if (supportsMutation) {
-  // Mutation mode
-  appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
-    // We only have the top Fiber that was created but we need recurse down its
-    // children to find all the terminal nodes.
-    var node = workInProgress.child;
+  function markWorkInProgressReceivedUpdate() {
+    didReceiveUpdate = true;
+  }
 
-    while (node !== null) {
-      if (node.tag === HostComponent || node.tag === HostText) {
-        appendInitialChild(parent, node.stateNode);
-      } else if (enableFundamentalAPI && node.tag === FundamentalComponent) {
-        appendInitialChild(parent, node.stateNode.instance);
-      } else if (node.tag === HostPortal) {// If we have a portal child, then we don't want to traverse
-        // down its children. Instead, we'll get insertions from each child in
-        // the portal directly.
-      } else if (node.child !== null) {
-        node.child.return = node;
-        node = node.child;
-        continue;
-      }
+  function bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime) {
+    cancelWorkTimer(workInProgress);
 
-      if (node === workInProgress) {
-        return;
-      }
+    if (current !== null) {
+      // Reuse previous dependencies
+      workInProgress.dependencies = current.dependencies;
+    }
 
-      while (node.sibling === null) {
-        if (node.return === null || node.return === workInProgress) {
-          return;
-        }
+    {
+      // Don't update "base" render times for bailouts.
+      stopProfilerTimerIfRunning();
+    }
 
-        node = node.return;
-      }
+    var updateExpirationTime = workInProgress.expirationTime;
 
-      node.sibling.return = node.return;
-      node = node.sibling;
-    }
-  };
+    if (updateExpirationTime !== NoWork) {
+      markUnprocessedUpdateTime(updateExpirationTime);
+    } // Check if the children have any pending work.
 
-  updateHostContainer = function (workInProgress) {// Noop
-  };
 
-  updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
-    // If we have an alternate, that means this is an update and we need to
-    // schedule a side-effect to do the updates.
-    var oldProps = current.memoizedProps;
+    var childExpirationTime = workInProgress.childExpirationTime;
 
-    if (oldProps === newProps) {
-      // In mutation mode, this is sufficient for a bailout because
-      // we won't touch this node even if children changed.
-      return;
-    } // If we get updated because one of our children updated, we don't
-    // have newProps so we'll have to reuse them.
-    // TODO: Split the update API as separate for the props vs. children.
-    // Even better would be if children weren't special cased at all tho.
+    if (childExpirationTime < renderExpirationTime) {
+      // The children don't have any work either. We can skip them.
+      // TODO: Once we add back resuming, we should check if the children are
+      // a work-in-progress set. If so, we need to transfer their effects.
+      return null;
+    } else {
+      // This fiber doesn't have work, but its subtree does. Clone the child
+      // fibers and continue.
+      cloneChildFibers(current, workInProgress);
+      return workInProgress.child;
+    }
+  }
 
+  function remountFiber(current, oldWorkInProgress, newWorkInProgress) {
+    {
+      var returnFiber = oldWorkInProgress.return;
 
-    var instance = workInProgress.stateNode;
-    var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host
-    // component is hitting the resume path. Figure out why. Possibly
-    // related to `hidden`.
+      if (returnFiber === null) {
+        throw new Error('Cannot swap the root fiber.');
+      } // Disconnect from the old current.
+      // It will get deleted.
 
-    var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.
 
-    workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
-    // is a new ref we mark this as an update. All the work is done in commitWork.
+      current.alternate = null;
+      oldWorkInProgress.alternate = null; // Connect to the new tree.
 
-    if (updatePayload) {
-      markUpdate(workInProgress);
-    }
-  };
+      newWorkInProgress.index = oldWorkInProgress.index;
+      newWorkInProgress.sibling = oldWorkInProgress.sibling;
+      newWorkInProgress.return = oldWorkInProgress.return;
+      newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.
 
-  updateHostText$1 = function (current, workInProgress, oldText, newText) {
-    // If the text differs, mark it as an update. All the work in done in commitWork.
-    if (oldText !== newText) {
-      markUpdate(workInProgress);
-    }
-  };
-} else if (supportsPersistence) {
-  // Persistent host tree mode
-  appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
-    // We only have the top Fiber that was created but we need recurse down its
-    // children to find all the terminal nodes.
-    var node = workInProgress.child;
+      if (oldWorkInProgress === returnFiber.child) {
+        returnFiber.child = newWorkInProgress;
+      } else {
+        var prevSibling = returnFiber.child;
 
-    while (node !== null) {
-      // eslint-disable-next-line no-labels
-      branches: if (node.tag === HostComponent) {
-        var instance = node.stateNode;
-
-        if (needsVisibilityToggle && isHidden) {
-          // This child is inside a timed out tree. Hide it.
-          var props = node.memoizedProps;
-          var type = node.type;
-          instance = cloneHiddenInstance(instance, type, props, node);
-        }
-
-        appendInitialChild(parent, instance);
-      } else if (node.tag === HostText) {
-        var _instance = node.stateNode;
-
-        if (needsVisibilityToggle && isHidden) {
-          // This child is inside a timed out tree. Hide it.
-          var text = node.memoizedProps;
-          _instance = cloneHiddenTextInstance(_instance, text, node);
-        }
-
-        appendInitialChild(parent, _instance);
-      } else if (enableFundamentalAPI && node.tag === FundamentalComponent) {
-        var _instance2 = node.stateNode.instance;
-
-        if (needsVisibilityToggle && isHidden) {
-          // This child is inside a timed out tree. Hide it.
-          var _props = node.memoizedProps;
-          var _type = node.type;
-          _instance2 = cloneHiddenInstance(_instance2, _type, _props, node);
-        }
-
-        appendInitialChild(parent, _instance2);
-      } else if (node.tag === HostPortal) {// If we have a portal child, then we don't want to traverse
-        // down its children. Instead, we'll get insertions from each child in
-        // the portal directly.
-      } else if (node.tag === SuspenseComponent) {
-        if ((node.effectTag & Update) !== NoEffect) {
-          // Need to toggle the visibility of the primary children.
-          var newIsHidden = node.memoizedState !== null;
-
-          if (newIsHidden) {
-            var primaryChildParent = node.child;
-
-            if (primaryChildParent !== null) {
-              if (primaryChildParent.child !== null) {
-                primaryChildParent.child.return = primaryChildParent;
-                appendAllChildren(parent, primaryChildParent, true, newIsHidden);
-              }
+        if (prevSibling === null) {
+          throw new Error('Expected parent to have a child.');
+        }
 
-              var fallbackChildParent = primaryChildParent.sibling;
+        while (prevSibling.sibling !== oldWorkInProgress) {
+          prevSibling = prevSibling.sibling;
 
-              if (fallbackChildParent !== null) {
-                fallbackChildParent.return = node;
-                node = fallbackChildParent;
-                continue;
-              }
-            }
+          if (prevSibling === null) {
+            throw new Error('Expected to find the previous sibling.');
           }
         }
 
-        if (node.child !== null) {
-          // Continue traversing like normal
-          node.child.return = node;
-          node = node.child;
-          continue;
-        }
-      } else if (node.child !== null) {
-        node.child.return = node;
-        node = node.child;
-        continue;
-      } // $FlowFixMe This is correct but Flow is confused by the labeled break.
+        prevSibling.sibling = newWorkInProgress;
+      } // Delete the old fiber and place the new one.
+      // Since the old fiber is disconnected, we have to schedule it manually.
 
 
-      node = node;
+      var last = returnFiber.lastEffect;
 
-      if (node === workInProgress) {
-        return;
+      if (last !== null) {
+        last.nextEffect = current;
+        returnFiber.lastEffect = current;
+      } else {
+        returnFiber.firstEffect = returnFiber.lastEffect = current;
       }
 
-      while (node.sibling === null) {
-        if (node.return === null || node.return === workInProgress) {
-          return;
-        }
+      current.nextEffect = null;
+      current.effectTag = Deletion;
+      newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber.
 
-        node = node.return;
-      }
+      return newWorkInProgress;
+    }
+  }
 
-      node.sibling.return = node.return;
-      node = node.sibling;
+  function beginWork(current, workInProgress, renderExpirationTime) {
+    var updateExpirationTime = workInProgress.expirationTime;
+
+    {
+      if (workInProgress._debugNeedsRemount && current !== null) {
+        // This will restart the begin phase with a new fiber.
+        return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime));
+      }
     }
-  }; // An unfortunate fork of appendAllChildren because we have two different parent types.
 
+    if (current !== null) {
+      var oldProps = current.memoizedProps;
+      var newProps = workInProgress.pendingProps;
 
-  var appendAllChildrenToContainer = function (containerChildSet, workInProgress, needsVisibilityToggle, isHidden) {
-    // We only have the top Fiber that was created but we need recurse down its
-    // children to find all the terminal nodes.
-    var node = workInProgress.child;
+      if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:
+       workInProgress.type !== current.type )) {
+        // If props or context changed, mark the fiber as having performed work.
+        // This may be unset if the props are determined to be equal later (memo).
+        didReceiveUpdate = true;
+      } else if (updateExpirationTime < renderExpirationTime) {
+        didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering
+        // the begin phase. There's still some bookkeeping we that needs to be done
+        // in this optimized path, mostly pushing stuff onto the stack.
 
-    while (node !== null) {
-      // eslint-disable-next-line no-labels
-      branches: if (node.tag === HostComponent) {
-        var instance = node.stateNode;
-
-        if (needsVisibilityToggle && isHidden) {
-          // This child is inside a timed out tree. Hide it.
-          var props = node.memoizedProps;
-          var type = node.type;
-          instance = cloneHiddenInstance(instance, type, props, node);
-        }
-
-        appendChildToContainerChildSet(containerChildSet, instance);
-      } else if (node.tag === HostText) {
-        var _instance3 = node.stateNode;
-
-        if (needsVisibilityToggle && isHidden) {
-          // This child is inside a timed out tree. Hide it.
-          var text = node.memoizedProps;
-          _instance3 = cloneHiddenTextInstance(_instance3, text, node);
-        }
-
-        appendChildToContainerChildSet(containerChildSet, _instance3);
-      } else if (enableFundamentalAPI && node.tag === FundamentalComponent) {
-        var _instance4 = node.stateNode.instance;
-
-        if (needsVisibilityToggle && isHidden) {
-          // This child is inside a timed out tree. Hide it.
-          var _props2 = node.memoizedProps;
-          var _type2 = node.type;
-          _instance4 = cloneHiddenInstance(_instance4, _type2, _props2, node);
-        }
-
-        appendChildToContainerChildSet(containerChildSet, _instance4);
-      } else if (node.tag === HostPortal) {// If we have a portal child, then we don't want to traverse
-        // down its children. Instead, we'll get insertions from each child in
-        // the portal directly.
-      } else if (node.tag === SuspenseComponent) {
-        if ((node.effectTag & Update) !== NoEffect) {
-          // Need to toggle the visibility of the primary children.
-          var newIsHidden = node.memoizedState !== null;
-
-          if (newIsHidden) {
-            var primaryChildParent = node.child;
-
-            if (primaryChildParent !== null) {
-              if (primaryChildParent.child !== null) {
-                primaryChildParent.child.return = primaryChildParent;
-                appendAllChildrenToContainer(containerChildSet, primaryChildParent, true, newIsHidden);
-              }
+        switch (workInProgress.tag) {
+          case HostRoot:
+            pushHostRootContext(workInProgress);
+            resetHydrationState();
+            break;
 
-              var fallbackChildParent = primaryChildParent.sibling;
+          case HostComponent:
+            pushHostContext(workInProgress);
 
-              if (fallbackChildParent !== null) {
-                fallbackChildParent.return = node;
-                node = fallbackChildParent;
-                continue;
-              }
-            }
-          }
-        }
+            if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) {
+              {
+                markSpawnedWork(Never);
+              } // Schedule this fiber to re-render at offscreen priority. Then bailout.
 
-        if (node.child !== null) {
-          // Continue traversing like normal
-          node.child.return = node;
-          node = node.child;
-          continue;
-        }
-      } else if (node.child !== null) {
-        node.child.return = node;
-        node = node.child;
-        continue;
-      } // $FlowFixMe This is correct but Flow is confused by the labeled break.
 
+              workInProgress.expirationTime = workInProgress.childExpirationTime = Never;
+              return null;
+            }
 
-      node = node;
+            break;
 
-      if (node === workInProgress) {
-        return;
-      }
+          case ClassComponent:
+            {
+              var Component = workInProgress.type;
 
-      while (node.sibling === null) {
-        if (node.return === null || node.return === workInProgress) {
-          return;
-        }
+              if (isContextProvider(Component)) {
+                pushContextProvider(workInProgress);
+              }
 
-        node = node.return;
-      }
+              break;
+            }
 
-      node.sibling.return = node.return;
-      node = node.sibling;
-    }
-  };
+          case HostPortal:
+            pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
+            break;
 
-  updateHostContainer = function (workInProgress) {
-    var portalOrRoot = workInProgress.stateNode;
-    var childrenUnchanged = workInProgress.firstEffect === null;
+          case ContextProvider:
+            {
+              var newValue = workInProgress.memoizedProps.value;
+              pushProvider(workInProgress, newValue);
+              break;
+            }
 
-    if (childrenUnchanged) {// No changes, just reuse the existing instance.
-    } else {
-      var container = portalOrRoot.containerInfo;
-      var newChildSet = createContainerChildSet(container); // If children might have changed, we have to add them all to the set.
+          case Profiler:
+            {
+              // Profiler should only call onRender when one of its descendants actually rendered.
+              var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;
 
-      appendAllChildrenToContainer(newChildSet, workInProgress, false, false);
-      portalOrRoot.pendingChildren = newChildSet; // Schedule an update on the container to swap out the container.
+              if (hasChildWork) {
+                workInProgress.effectTag |= Update;
+              }
+            }
 
-      markUpdate(workInProgress);
-      finalizeContainerChildren(container, newChildSet);
-    }
-  };
+            break;
 
-  updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
-    var currentInstance = current.stateNode;
-    var oldProps = current.memoizedProps; // If there are no effects associated with this node, then none of our children had any updates.
-    // This guarantees that we can reuse all of them.
+          case SuspenseComponent:
+            {
+              var state = workInProgress.memoizedState;
 
-    var childrenUnchanged = workInProgress.firstEffect === null;
+              if (state !== null) {
+                // whether to retry the primary children, or to skip over it and
+                // go straight to the fallback. Check the priority of the primary
+                // child fragment.
 
-    if (childrenUnchanged && oldProps === newProps) {
-      // No changes, just reuse the existing instance.
-      // Note that this might release a previous clone.
-      workInProgress.stateNode = currentInstance;
-      return;
-    }
 
-    var recyclableInstance = workInProgress.stateNode;
-    var currentHostContext = getHostContext();
-    var updatePayload = null;
+                var primaryChildFragment = workInProgress.child;
+                var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;
 
-    if (oldProps !== newProps) {
-      updatePayload = prepareUpdate(recyclableInstance, type, oldProps, newProps, rootContainerInstance, currentHostContext);
-    }
+                if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {
+                  // The primary children have pending work. Use the normal path
+                  // to attempt to render the primary children again.
+                  return updateSuspenseComponent(current, workInProgress, renderExpirationTime);
+                } else {
+                  pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient
+                  // priority. Bailout.
 
-    if (childrenUnchanged && updatePayload === null) {
-      // No changes, just reuse the existing instance.
-      // Note that this might release a previous clone.
-      workInProgress.stateNode = currentInstance;
-      return;
-    }
+                  var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
 
-    var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);
+                  if (child !== null) {
+                    // The fallback children have pending work. Skip over the
+                    // primary children and work on the fallback.
+                    return child.sibling;
+                  } else {
+                    return null;
+                  }
+                }
+              } else {
+                pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
+              }
 
-    if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext)) {
-      markUpdate(workInProgress);
-    }
+              break;
+            }
 
-    workInProgress.stateNode = newInstance;
+          case SuspenseListComponent:
+            {
+              var didSuspendBefore = (current.effectTag & DidCapture) !== NoEffect;
 
-    if (childrenUnchanged) {
-      // If there are no other effects in this tree, we need to flag this node as having one.
-      // Even though we're not going to use it for anything.
-      // Otherwise parents won't know that there are new children to propagate upwards.
-      markUpdate(workInProgress);
-    } else {
-      // If children might have changed, we have to add them all to the set.
-      appendAllChildren(newInstance, workInProgress, false, false);
-    }
-  };
+              var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;
 
-  updateHostText$1 = function (current, workInProgress, oldText, newText) {
-    if (oldText !== newText) {
-      // If the text content differs, we'll create a new text instance for it.
-      var rootContainerInstance = getRootHostContainer();
-      var currentHostContext = getHostContext();
-      workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress); // We'll have to mark it as having an effect, even though we won't use the effect for anything.
-      // This lets the parents know that at least one of their children has changed.
+              if (didSuspendBefore) {
+                if (_hasChildWork) {
+                  // If something was in fallback state last time, and we have all the
+                  // same children then we're still in progressive loading state.
+                  // Something might get unblocked by state updates or retries in the
+                  // tree which will affect the tail. So we need to use the normal
+                  // path to compute the correct tail.
+                  return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);
+                } // If none of the children had any work, that means that none of
+                // them got retried so they'll still be blocked in the same way
+                // as before. We can fast bail out.
 
-      markUpdate(workInProgress);
-    }
-  };
-} else {
-  // No host operations
-  updateHostContainer = function (workInProgress) {// Noop
-  };
 
-  updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {// Noop
-  };
+                workInProgress.effectTag |= DidCapture;
+              } // If nothing suspended before and we're rendering the same children,
+              // then the tail doesn't matter. Anything new that suspends will work
+              // in the "together" mode, so we can continue from the state we had.
 
-  updateHostText$1 = function (current, workInProgress, oldText, newText) {// Noop
-  };
-}
 
-function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {
-  switch (renderState.tailMode) {
-    case 'hidden':
-      {
-        // Any insertions at the end of the tail list after this point
-        // should be invisible. If there are already mounted boundaries
-        // anything before them are not considered for collapsing.
-        // Therefore we need to go through the whole tail to find if
-        // there are any.
-        var tailNode = renderState.tail;
-        var lastTailNode = null;
-
-        while (tailNode !== null) {
-          if (tailNode.alternate !== null) {
-            lastTailNode = tailNode;
-          }
+              var renderState = workInProgress.memoizedState;
 
-          tailNode = tailNode.sibling;
-        } // Next we're simply going to delete all insertions after the
-        // last rendered item.
+              if (renderState !== null) {
+                // Reset to the "together" mode in case we've started a different
+                // update in the past but didn't complete it.
+                renderState.rendering = null;
+                renderState.tail = null;
+              }
 
+              pushSuspenseContext(workInProgress, suspenseStackCursor.current);
 
-        if (lastTailNode === null) {
-          // All remaining items in the tail are insertions.
-          renderState.tail = null;
-        } else {
-          // Detach the insertion after the last node that was already
-          // inserted.
-          lastTailNode.sibling = null;
+              if (_hasChildWork) {
+                break;
+              } else {
+                // If none of the children had any work, that means that none of
+                // them got retried so they'll still be blocked in the same way
+                // as before. We can fast bail out.
+                return null;
+              }
+            }
         }
 
-        break;
+        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);
+      } else {
+        // An update was scheduled on this fiber, but there are no new props
+        // nor legacy context. Set this to false. If an update queue or context
+        // consumer produces a changed value, it will set this to true. Otherwise,
+        // the component will assume the children have not changed and bail out.
+        didReceiveUpdate = false;
       }
+    } else {
+      didReceiveUpdate = false;
+    } // Before entering the begin phase, clear pending update priority.
+    // TODO: This assumes that we're about to evaluate the component and process
+    // the update queue. However, there's an exception: SimpleMemoComponent
+    // sometimes bails out later in the begin phase. This indicates that we should
+    // move this assignment out of the common path and into each branch.
 
-    case 'collapsed':
-      {
-        // Any insertions at the end of the tail list after this point
-        // should be invisible. If there are already mounted boundaries
-        // anything before them are not considered for collapsing.
-        // Therefore we need to go through the whole tail to find if
-        // there are any.
-        var _tailNode = renderState.tail;
-        var _lastTailNode = null;
-
-        while (_tailNode !== null) {
-          if (_tailNode.alternate !== null) {
-            _lastTailNode = _tailNode;
-          }
 
-          _tailNode = _tailNode.sibling;
-        } // Next we're simply going to delete all insertions after the
-        // last rendered item.
+    workInProgress.expirationTime = NoWork;
 
+    switch (workInProgress.tag) {
+      case IndeterminateComponent:
+        {
+          return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderExpirationTime);
+        }
 
-        if (_lastTailNode === null) {
-          // All remaining items in the tail are insertions.
-          if (!hasRenderedATailFallback && renderState.tail !== null) {
-            // We suspended during the head. We want to show at least one
-            // row at the tail. So we'll keep on and cut off the rest.
-            renderState.tail.sibling = null;
-          } else {
-            renderState.tail = null;
-          }
-        } else {
-          // Detach the insertion after the last node that was already
-          // inserted.
-          _lastTailNode.sibling = null;
+      case LazyComponent:
+        {
+          var elementType = workInProgress.elementType;
+          return mountLazyComponent(current, workInProgress, elementType, updateExpirationTime, renderExpirationTime);
+        }
+
+      case FunctionComponent:
+        {
+          var _Component = workInProgress.type;
+          var unresolvedProps = workInProgress.pendingProps;
+          var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);
+          return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderExpirationTime);
         }
 
-        break;
-      }
-  }
-}
+      case ClassComponent:
+        {
+          var _Component2 = workInProgress.type;
+          var _unresolvedProps = workInProgress.pendingProps;
+
+          var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);
 
-function completeWork(current, workInProgress, renderExpirationTime) {
-  var newProps = workInProgress.pendingProps;
+          return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderExpirationTime);
+        }
 
-  switch (workInProgress.tag) {
-    case IndeterminateComponent:
-      break;
+      case HostRoot:
+        return updateHostRoot(current, workInProgress, renderExpirationTime);
 
-    case LazyComponent:
-      break;
+      case HostComponent:
+        return updateHostComponent(current, workInProgress, renderExpirationTime);
 
-    case SimpleMemoComponent:
-    case FunctionComponent:
-      break;
+      case HostText:
+        return updateHostText(current, workInProgress);
 
-    case ClassComponent:
-      {
-        var Component = workInProgress.type;
+      case SuspenseComponent:
+        return updateSuspenseComponent(current, workInProgress, renderExpirationTime);
 
-        if (isContextProvider(Component)) {
-          popContext(workInProgress);
-        }
+      case HostPortal:
+        return updatePortalComponent(current, workInProgress, renderExpirationTime);
 
-        break;
-      }
+      case ForwardRef:
+        {
+          var type = workInProgress.type;
+          var _unresolvedProps2 = workInProgress.pendingProps;
 
-    case HostRoot:
-      {
-        popHostContainer(workInProgress);
-        popTopLevelContextObject(workInProgress);
-        var fiberRoot = workInProgress.stateNode;
+          var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
 
-        if (fiberRoot.pendingContext) {
-          fiberRoot.context = fiberRoot.pendingContext;
-          fiberRoot.pendingContext = null;
+          return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderExpirationTime);
         }
 
-        if (current === null || current.child === null) {
-          // If we hydrated, pop so that we can delete any remaining children
-          // that weren't hydrated.
-          var wasHydrated = popHydrationState(workInProgress);
+      case Fragment:
+        return updateFragment(current, workInProgress, renderExpirationTime);
 
-          if (wasHydrated) {
-            // If we hydrated, then we'll need to schedule an update for
-            // the commit side-effects on the root.
-            markUpdate(workInProgress);
-          }
-        }
+      case Mode:
+        return updateMode(current, workInProgress, renderExpirationTime);
 
-        updateHostContainer(workInProgress);
-        break;
-      }
+      case Profiler:
+        return updateProfiler(current, workInProgress, renderExpirationTime);
 
-    case HostComponent:
-      {
-        popHostContext(workInProgress);
-        var rootContainerInstance = getRootHostContainer();
-        var type = workInProgress.type;
+      case ContextProvider:
+        return updateContextProvider(current, workInProgress, renderExpirationTime);
+
+      case ContextConsumer:
+        return updateContextConsumer(current, workInProgress, renderExpirationTime);
+
+      case MemoComponent:
+        {
+          var _type2 = workInProgress.type;
+          var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.
 
-        if (current !== null && workInProgress.stateNode != null) {
-          updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
+          var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
 
-          if (enableFlareAPI) {
-            var prevListeners = current.memoizedProps.listeners;
-            var nextListeners = newProps.listeners;
+          {
+            if (workInProgress.type !== workInProgress.elementType) {
+              var outerPropTypes = _type2.propTypes;
 
-            if (prevListeners !== nextListeners) {
-              markUpdate(workInProgress);
+              if (outerPropTypes) {
+                checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only
+                'prop', getComponentName(_type2), getCurrentFiberStackInDev);
+              }
             }
           }
 
-          if (current.ref !== workInProgress.ref) {
-            markRef$1(workInProgress);
-          }
-        } else {
-          if (!newProps) {
-            if (!(workInProgress.stateNode !== null)) {
-              {
-                throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");
-              }
-            } // This can happen when we abort work.
+          _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
+          return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);
+        }
 
+      case SimpleMemoComponent:
+        {
+          return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);
+        }
 
-            break;
-          }
+      case IncompleteClassComponent:
+        {
+          var _Component3 = workInProgress.type;
+          var _unresolvedProps4 = workInProgress.pendingProps;
 
-          var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context
-          // "stack" as the parent. Then append children as we go in beginWork
-          // or completeWork depending on we want to add then top->down or
-          // bottom->up. Top->down is faster in IE11.
+          var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);
 
-          var _wasHydrated = popHydrationState(workInProgress);
+          return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);
+        }
 
-          if (_wasHydrated) {
-            // TODO: Move this and createInstance step into the beginPhase
-            // to consolidate.
-            if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
-              // If changes to the hydrated node needs to be applied at the
-              // commit-phase we mark this as such.
-              markUpdate(workInProgress);
-            }
+      case SuspenseListComponent:
+        {
+          return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);
+        }
+    }
+
+    {
+      {
+        throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." );
+      }
+    }
+  }
 
-            if (enableFlareAPI) {
-              var listeners = newProps.listeners;
+  function markUpdate(workInProgress) {
+    // Tag the fiber with an update effect. This turns a Placement into
+    // a PlacementAndUpdate.
+    workInProgress.effectTag |= Update;
+  }
 
-              if (listeners != null) {
-                updateEventListeners(listeners, workInProgress, rootContainerInstance);
-              }
-            }
-          } else {
-            var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
-            appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners
+  function markRef$1(workInProgress) {
+    workInProgress.effectTag |= Ref;
+  }
 
-            workInProgress.stateNode = instance;
+  var appendAllChildren;
+  var updateHostContainer;
+  var updateHostComponent$1;
+  var updateHostText$1;
 
-            if (enableFlareAPI) {
-              var _listeners = newProps.listeners;
+  {
+    // Mutation mode
+    appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
+      // We only have the top Fiber that was created but we need recurse down its
+      // children to find all the terminal nodes.
+      var node = workInProgress.child;
 
-              if (_listeners != null) {
-                updateEventListeners(_listeners, workInProgress, rootContainerInstance);
-              }
-            } // Certain renderers require commit-time effects for initial mount.
-            // (eg DOM renderer supports auto-focus for certain elements).
-            // Make sure such renderers get scheduled for later work.
+      while (node !== null) {
+        if (node.tag === HostComponent || node.tag === HostText) {
+          appendInitialChild(parent, node.stateNode);
+        } else if (node.tag === HostPortal) ; else if (node.child !== null) {
+          node.child.return = node;
+          node = node.child;
+          continue;
+        }
 
+        if (node === workInProgress) {
+          return;
+        }
 
-            if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance, currentHostContext)) {
-              markUpdate(workInProgress);
-            }
+        while (node.sibling === null) {
+          if (node.return === null || node.return === workInProgress) {
+            return;
           }
 
-          if (workInProgress.ref !== null) {
-            // If there is a ref on a host node we need to schedule a callback
-            markRef$1(workInProgress);
-          }
+          node = node.return;
         }
 
-        break;
+        node.sibling.return = node.return;
+        node = node.sibling;
       }
+    };
 
-    case HostText:
-      {
-        var newText = newProps;
+    updateHostContainer = function (workInProgress) {// Noop
+    };
 
-        if (current && workInProgress.stateNode != null) {
-          var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need
-          // to schedule a side-effect to do the updates.
+    updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
+      // If we have an alternate, that means this is an update and we need to
+      // schedule a side-effect to do the updates.
+      var oldProps = current.memoizedProps;
 
-          updateHostText$1(current, workInProgress, oldText, newText);
-        } else {
-          if (typeof newText !== 'string') {
-            if (!(workInProgress.stateNode !== null)) {
-              {
-                throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");
-              }
-            } // This can happen when we abort work.
+      if (oldProps === newProps) {
+        // In mutation mode, this is sufficient for a bailout because
+        // we won't touch this node even if children changed.
+        return;
+      } // If we get updated because one of our children updated, we don't
+      // have newProps so we'll have to reuse them.
+      // TODO: Split the update API as separate for the props vs. children.
+      // Even better would be if children weren't special cased at all tho.
 
-          }
 
-          var _rootContainerInstance = getRootHostContainer();
+      var instance = workInProgress.stateNode;
+      var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host
+      // component is hitting the resume path. Figure out why. Possibly
+      // related to `hidden`.
 
-          var _currentHostContext = getHostContext();
+      var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.
 
-          var _wasHydrated2 = popHydrationState(workInProgress);
+      workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
+      // is a new ref we mark this as an update. All the work is done in commitWork.
 
-          if (_wasHydrated2) {
-            if (prepareToHydrateHostTextInstance(workInProgress)) {
-              markUpdate(workInProgress);
-            }
-          } else {
-            workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
-          }
-        }
+      if (updatePayload) {
+        markUpdate(workInProgress);
+      }
+    };
 
-        break;
+    updateHostText$1 = function (current, workInProgress, oldText, newText) {
+      // If the text differs, mark it as an update. All the work in done in commitWork.
+      if (oldText !== newText) {
+        markUpdate(workInProgress);
       }
+    };
+  }
 
-    case ForwardRef:
-      break;
+  function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {
+    switch (renderState.tailMode) {
+      case 'hidden':
+        {
+          // Any insertions at the end of the tail list after this point
+          // should be invisible. If there are already mounted boundaries
+          // anything before them are not considered for collapsing.
+          // Therefore we need to go through the whole tail to find if
+          // there are any.
+          var tailNode = renderState.tail;
+          var lastTailNode = null;
+
+          while (tailNode !== null) {
+            if (tailNode.alternate !== null) {
+              lastTailNode = tailNode;
+            }
 
-    case SuspenseComponent:
-      {
-        popSuspenseContext(workInProgress);
-        var nextState = workInProgress.memoizedState;
+            tailNode = tailNode.sibling;
+          } // Next we're simply going to delete all insertions after the
+          // last rendered item.
 
-        if (enableSuspenseServerRenderer) {
-          if (nextState !== null && nextState.dehydrated !== null) {
-            if (current === null) {
-              var _wasHydrated3 = popHydrationState(workInProgress);
 
-              if (!_wasHydrated3) {
-                {
-                  throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");
-                }
-              }
+          if (lastTailNode === null) {
+            // All remaining items in the tail are insertions.
+            renderState.tail = null;
+          } else {
+            // Detach the insertion after the last node that was already
+            // inserted.
+            lastTailNode.sibling = null;
+          }
 
-              prepareToHydrateHostSuspenseInstance(workInProgress);
+          break;
+        }
 
-              if (enableSchedulerTracing) {
-                markSpawnedWork(Never);
-              }
+      case 'collapsed':
+        {
+          // Any insertions at the end of the tail list after this point
+          // should be invisible. If there are already mounted boundaries
+          // anything before them are not considered for collapsing.
+          // Therefore we need to go through the whole tail to find if
+          // there are any.
+          var _tailNode = renderState.tail;
+          var _lastTailNode = null;
+
+          while (_tailNode !== null) {
+            if (_tailNode.alternate !== null) {
+              _lastTailNode = _tailNode;
+            }
 
-              return null;
-            } else {
-              // We should never have been in a hydration state if we didn't have a current.
-              // However, in some of those paths, we might have reentered a hydration state
-              // and then we might be inside a hydration state. In that case, we'll need to
-              // exit out of it.
-              resetHydrationState();
-
-              if ((workInProgress.effectTag & DidCapture) === NoEffect) {
-                // This boundary did not suspend so it's now hydrated and unsuspended.
-                workInProgress.memoizedState = null;
-              } // If nothing suspended, we need to schedule an effect to mark this boundary
-              // as having hydrated so events know that they're free be invoked.
-              // It's also a signal to replay events and the suspense callback.
-              // If something suspended, schedule an effect to attach retry listeners.
-              // So we might as well always mark this.
+            _tailNode = _tailNode.sibling;
+          } // Next we're simply going to delete all insertions after the
+          // last rendered item.
 
 
-              workInProgress.effectTag |= Update;
-              return null;
+          if (_lastTailNode === null) {
+            // All remaining items in the tail are insertions.
+            if (!hasRenderedATailFallback && renderState.tail !== null) {
+              // We suspended during the head. We want to show at least one
+              // row at the tail. So we'll keep on and cut off the rest.
+              renderState.tail.sibling = null;
+            } else {
+              renderState.tail = null;
             }
+          } else {
+            // Detach the insertion after the last node that was already
+            // inserted.
+            _lastTailNode.sibling = null;
           }
+
+          break;
         }
+    }
+  }
 
-        if ((workInProgress.effectTag & DidCapture) !== NoEffect) {
-          // Something suspended. Re-render with the fallback children.
-          workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list.
+  function completeWork(current, workInProgress, renderExpirationTime) {
+    var newProps = workInProgress.pendingProps;
 
-          return workInProgress;
-        }
+    switch (workInProgress.tag) {
+      case IndeterminateComponent:
+      case LazyComponent:
+      case SimpleMemoComponent:
+      case FunctionComponent:
+      case ForwardRef:
+      case Fragment:
+      case Mode:
+      case Profiler:
+      case ContextConsumer:
+      case MemoComponent:
+        return null;
 
-        var nextDidTimeout = nextState !== null;
-        var prevDidTimeout = false;
+      case ClassComponent:
+        {
+          var Component = workInProgress.type;
 
-        if (current === null) {
-          if (workInProgress.memoizedProps.fallback !== undefined) {
-            popHydrationState(workInProgress);
+          if (isContextProvider(Component)) {
+            popContext(workInProgress);
           }
-        } else {
-          var prevState = current.memoizedState;
-          prevDidTimeout = prevState !== null;
-
-          if (!nextDidTimeout && prevState !== null) {
-            // We just switched from the fallback to the normal children.
-            // Delete the fallback.
-            // TODO: Would it be better to store the fallback fragment on
-            // the stateNode during the begin phase?
-            var currentFallbackChild = current.child.sibling;
-
-            if (currentFallbackChild !== null) {
-              // Deletions go at the beginning of the return fiber's effect list
-              var first = workInProgress.firstEffect;
-
-              if (first !== null) {
-                workInProgress.firstEffect = currentFallbackChild;
-                currentFallbackChild.nextEffect = first;
-              } else {
-                workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;
-                currentFallbackChild.nextEffect = null;
-              }
 
-              currentFallbackChild.effectTag = Deletion;
-            }
-          }
+          return null;
         }
 
-        if (nextDidTimeout && !prevDidTimeout) {
-          // If this subtreee is running in blocking mode we can suspend,
-          // otherwise we won't suspend.
-          // TODO: This will still suspend a synchronous tree if anything
-          // in the concurrent tree already suspended during this render.
-          // This is a known bug.
-          if ((workInProgress.mode & BlockingMode) !== NoMode) {
-            // TODO: Move this back to throwException because this is too late
-            // if this is a large tree which is common for initial loads. We
-            // don't know if we should restart a render or not until we get
-            // this marker, and this is too late.
-            // If this render already had a ping or lower pri updates,
-            // and this is the first time we know we're going to suspend we
-            // should be able to immediately restart from within throwException.
-            var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true;
-
-            if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {
-              // If this was in an invisible tree or a new render, then showing
-              // this boundary is ok.
-              renderDidSuspend();
-            } else {
-              // Otherwise, we're going to have to hide content so we should
-              // suspend for longer if possible.
-              renderDidSuspendDelayIfPossible();
-            }
-          }
-        }
+      case HostRoot:
+        {
+          popHostContainer(workInProgress);
+          popTopLevelContextObject(workInProgress);
+          var fiberRoot = workInProgress.stateNode;
 
-        if (supportsPersistence) {
-          // TODO: Only schedule updates if not prevDidTimeout.
-          if (nextDidTimeout) {
-            // If this boundary just timed out, schedule an effect to attach a
-            // retry listener to the proimse. This flag is also used to hide the
-            // primary children.
-            workInProgress.effectTag |= Update;
+          if (fiberRoot.pendingContext) {
+            fiberRoot.context = fiberRoot.pendingContext;
+            fiberRoot.pendingContext = null;
           }
-        }
 
-        if (supportsMutation) {
-          // TODO: Only schedule updates if these values are non equal, i.e. it changed.
-          if (nextDidTimeout || prevDidTimeout) {
-            // If this boundary just timed out, schedule an effect to attach a
-            // retry listener to the proimse. This flag is also used to hide the
-            // primary children. In mutation mode, we also need the flag to
-            // *unhide* children that were previously hidden, so check if the
-            // is currently timed out, too.
-            workInProgress.effectTag |= Update;
+          if (current === null || current.child === null) {
+            // If we hydrated, pop so that we can delete any remaining children
+            // that weren't hydrated.
+            var wasHydrated = popHydrationState(workInProgress);
+
+            if (wasHydrated) {
+              // If we hydrated, then we'll need to schedule an update for
+              // the commit side-effects on the root.
+              markUpdate(workInProgress);
+            }
           }
-        }
 
-        if (enableSuspenseCallback && workInProgress.updateQueue !== null && workInProgress.memoizedProps.suspenseCallback != null) {
-          // Always notify the callback
-          workInProgress.effectTag |= Update;
+          updateHostContainer(workInProgress);
+          return null;
         }
 
-        break;
-      }
+      case HostComponent:
+        {
+          popHostContext(workInProgress);
+          var rootContainerInstance = getRootHostContainer();
+          var type = workInProgress.type;
 
-    case Fragment:
-      break;
+          if (current !== null && workInProgress.stateNode != null) {
+            updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
 
-    case Mode:
-      break;
+            if (current.ref !== workInProgress.ref) {
+              markRef$1(workInProgress);
+            }
+          } else {
+            if (!newProps) {
+              if (!(workInProgress.stateNode !== null)) {
+                {
+                  throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." );
+                }
+              } // This can happen when we abort work.
 
-    case Profiler:
-      break;
 
-    case HostPortal:
-      popHostContainer(workInProgress);
-      updateHostContainer(workInProgress);
-      break;
+              return null;
+            }
 
-    case ContextProvider:
-      // Pop provider fiber
-      popProvider(workInProgress);
-      break;
+            var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context
+            // "stack" as the parent. Then append children as we go in beginWork
+            // or completeWork depending on whether we want to add them top->down or
+            // bottom->up. Top->down is faster in IE11.
 
-    case ContextConsumer:
-      break;
+            var _wasHydrated = popHydrationState(workInProgress);
 
-    case MemoComponent:
-      break;
+            if (_wasHydrated) {
+              // TODO: Move this and createInstance step into the beginPhase
+              // to consolidate.
+              if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
+                // If changes to the hydrated node need to be applied at the
+                // commit-phase we mark this as such.
+                markUpdate(workInProgress);
+              }
+            } else {
+              var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
+              appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners
 
-    case IncompleteClassComponent:
-      {
-        // Same as class component case. I put it down here so that the tags are
-        // sequential to ensure this switch is compiled to a jump table.
-        var _Component = workInProgress.type;
+              workInProgress.stateNode = instance;
+              // (eg DOM renderer supports auto-focus for certain elements).
+              // Make sure such renderers get scheduled for later work.
 
-        if (isContextProvider(_Component)) {
-          popContext(workInProgress);
-        }
 
-        break;
-      }
+              if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {
+                markUpdate(workInProgress);
+              }
+            }
 
-    case SuspenseListComponent:
-      {
-        popSuspenseContext(workInProgress);
-        var renderState = workInProgress.memoizedState;
+            if (workInProgress.ref !== null) {
+              // If there is a ref on a host node we need to schedule a callback
+              markRef$1(workInProgress);
+            }
+          }
 
-        if (renderState === null) {
-          // We're running in the default, "independent" mode. We don't do anything
-          // in this mode.
-          break;
+          return null;
         }
 
-        var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect;
-        var renderedTail = renderState.rendering;
-
-        if (renderedTail === null) {
-          // We just rendered the head.
-          if (!didSuspendAlready) {
-            // This is the first pass. We need to figure out if anything is still
-            // suspended in the rendered set.
-            // If new content unsuspended, but there's still some content that
-            // didn't. Then we need to do a second pass that forces everything
-            // to keep showing their fallbacks.
-            // We might be suspended if something in this render pass suspended, or
-            // something in the previous committed pass suspended. Otherwise,
-            // there's no chance so we can skip the expensive call to
-            // findFirstSuspended.
-            var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect);
-
-            if (!cannotBeSuspended) {
-              var row = workInProgress.child;
-
-              while (row !== null) {
-                var suspended = findFirstSuspended(row);
-
-                if (suspended !== null) {
-                  didSuspendAlready = true;
-                  workInProgress.effectTag |= DidCapture;
-                  cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as
-                  // part of the second pass. In that case nothing will subscribe to
-                  // its thennables. Instead, we'll transfer its thennables to the
-                  // SuspenseList so that it can retry if they resolve.
-                  // There might be multiple of these in the list but since we're
-                  // going to wait for all of them anyway, it doesn't really matter
-                  // which ones gets to ping. In theory we could get clever and keep
-                  // track of how many dependencies remain but it gets tricky because
-                  // in the meantime, we can add/remove/change items and dependencies.
-                  // We might bail out of the loop before finding any but that
-                  // doesn't matter since that means that the other boundaries that
-                  // we did find already has their listeners attached.
-
-                  var newThennables = suspended.updateQueue;
-
-                  if (newThennables !== null) {
-                    workInProgress.updateQueue = newThennables;
-                    workInProgress.effectTag |= Update;
-                  } // Rerender the whole list, but this time, we'll force fallbacks
-                  // to stay in place.
-                  // Reset the effect list before doing the second pass since that's now invalid.
-
-
-                  if (renderState.lastEffect === null) {
-                    workInProgress.firstEffect = null;
-                  }
-
-                  workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state.
+      case HostText:
+        {
+          var newText = newProps;
 
-                  resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately
-                  // rerender the children.
+          if (current && workInProgress.stateNode != null) {
+            var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need
+            // to schedule a side-effect to do the updates.
 
-                  pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback));
-                  return workInProgress.child;
+            updateHostText$1(current, workInProgress, oldText, newText);
+          } else {
+            if (typeof newText !== 'string') {
+              if (!(workInProgress.stateNode !== null)) {
+                {
+                  throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." );
                 }
+              } // This can happen when we abort work.
 
-                row = row.sibling;
-              }
             }
-          } else {
-            cutOffTailIfNeeded(renderState, false);
-          } // Next we're going to render the tail.
 
-        } else {
-          // Append the rendered row to the child list.
-          if (!didSuspendAlready) {
-            var _suspended = findFirstSuspended(renderedTail);
+            var _rootContainerInstance = getRootHostContainer();
 
-            if (_suspended !== null) {
-              workInProgress.effectTag |= DidCapture;
-              didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't
-              // get lost if this row ends up dropped during a second pass.
+            var _currentHostContext = getHostContext();
 
-              var _newThennables = _suspended.updateQueue;
+            var _wasHydrated2 = popHydrationState(workInProgress);
 
-              if (_newThennables !== null) {
-                workInProgress.updateQueue = _newThennables;
-                workInProgress.effectTag |= Update;
+            if (_wasHydrated2) {
+              if (prepareToHydrateHostTextInstance(workInProgress)) {
+                markUpdate(workInProgress);
               }
+            } else {
+              workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
+            }
+          }
 
-              cutOffTailIfNeeded(renderState, true); // This might have been modified.
+          return null;
+        }
 
-              if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) {
-                // We need to delete the row we just rendered.
-                // Reset the effect list to what it was before we rendered this
-                // child. The nested children have already appended themselves.
-                var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point.
+      case SuspenseComponent:
+        {
+          popSuspenseContext(workInProgress);
+          var nextState = workInProgress.memoizedState;
 
-                if (lastEffect !== null) {
-                  lastEffect.nextEffect = null;
-                } // We're done.
+          if ((workInProgress.effectTag & DidCapture) !== NoEffect) {
+            // Something suspended. Re-render with the fallback children.
+            workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list.
 
+            return workInProgress;
+          }
 
-                return null;
-              }
-            } else if (now() > renderState.tailExpiration && renderExpirationTime > Never) {
-              // We have now passed our CPU deadline and we'll just give up further
-              // attempts to render the main content and only render fallbacks.
-              // The assumption is that this is usually faster.
-              workInProgress.effectTag |= DidCapture;
-              didSuspendAlready = true;
-              cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
-              // to get it started back up to attempt the next item. If we can show
-              // them, then they really have the same priority as this render.
-              // So we'll pick it back up the very next render pass once we've had
-              // an opportunity to yield for paint.
-
-              var nextPriority = renderExpirationTime - 1;
-              workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority;
-
-              if (enableSchedulerTracing) {
-                markSpawnedWork(nextPriority);
+          var nextDidTimeout = nextState !== null;
+          var prevDidTimeout = false;
+
+          if (current === null) {
+            if (workInProgress.memoizedProps.fallback !== undefined) {
+              popHydrationState(workInProgress);
+            }
+          } else {
+            var prevState = current.memoizedState;
+            prevDidTimeout = prevState !== null;
+
+            if (!nextDidTimeout && prevState !== null) {
+              // We just switched from the fallback to the normal children.
+              // Delete the fallback.
+              // TODO: Would it be better to store the fallback fragment on
+              // the stateNode during the begin phase?
+              var currentFallbackChild = current.child.sibling;
+
+              if (currentFallbackChild !== null) {
+                // Deletions go at the beginning of the return fiber's effect list
+                var first = workInProgress.firstEffect;
+
+                if (first !== null) {
+                  workInProgress.firstEffect = currentFallbackChild;
+                  currentFallbackChild.nextEffect = first;
+                } else {
+                  workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;
+                  currentFallbackChild.nextEffect = null;
+                }
+
+                currentFallbackChild.effectTag = Deletion;
               }
             }
           }
 
-          if (renderState.isBackwards) {
-            // The effect list of the backwards tail will have been added
-            // to the end. This breaks the guarantee that life-cycles fire in
-            // sibling order but that isn't a strong guarantee promised by React.
-            // Especially since these might also just pop in during future commits.
-            // Append to the beginning of the list.
-            renderedTail.sibling = workInProgress.child;
-            workInProgress.child = renderedTail;
-          } else {
-            var previousSibling = renderState.last;
-
-            if (previousSibling !== null) {
-              previousSibling.sibling = renderedTail;
-            } else {
-              workInProgress.child = renderedTail;
+          if (nextDidTimeout && !prevDidTimeout) {
+            // If this subtreee is running in blocking mode we can suspend,
+            // otherwise we won't suspend.
+            // TODO: This will still suspend a synchronous tree if anything
+            // in the concurrent tree already suspended during this render.
+            // This is a known bug.
+            if ((workInProgress.mode & BlockingMode) !== NoMode) {
+              // TODO: Move this back to throwException because this is too late
+              // if this is a large tree which is common for initial loads. We
+              // don't know if we should restart a render or not until we get
+              // this marker, and this is too late.
+              // If this render already had a ping or lower pri updates,
+              // and this is the first time we know we're going to suspend we
+              // should be able to immediately restart from within throwException.
+              var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true;
+
+              if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {
+                // If this was in an invisible tree or a new render, then showing
+                // this boundary is ok.
+                renderDidSuspend();
+              } else {
+                // Otherwise, we're going to have to hide content so we should
+                // suspend for longer if possible.
+                renderDidSuspendDelayIfPossible();
+              }
             }
+          }
 
-            renderState.last = renderedTail;
+          {
+            // TODO: Only schedule updates if these values are non equal, i.e. it changed.
+            if (nextDidTimeout || prevDidTimeout) {
+              // If this boundary just timed out, schedule an effect to attach a
+              // retry listener to the promise. This flag is also used to hide the
+              // primary children. In mutation mode, we also need the flag to
+              // *unhide* children that were previously hidden, so check if this
+              // is currently timed out, too.
+              workInProgress.effectTag |= Update;
+            }
           }
-        }
 
-        if (renderState.tail !== null) {
-          // We still have tail rows to render.
-          if (renderState.tailExpiration === 0) {
-            // Heuristic for how long we're willing to spend rendering rows
-            // until we just give up and show what we have so far.
-            var TAIL_EXPIRATION_TIMEOUT_MS = 500;
-            renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS;
-          } // Pop a row.
+          return null;
+        }
 
+      case HostPortal:
+        popHostContainer(workInProgress);
+        updateHostContainer(workInProgress);
+        return null;
 
-          var next = renderState.tail;
-          renderState.rendering = next;
-          renderState.tail = next.sibling;
-          renderState.lastEffect = workInProgress.lastEffect;
-          next.sibling = null; // Restore the context.
-          // TODO: We can probably just avoid popping it instead and only
-          // setting it the first time we go from not suspended to suspended.
+      case ContextProvider:
+        // Pop provider fiber
+        popProvider(workInProgress);
+        return null;
 
-          var suspenseContext = suspenseStackCursor.current;
+      case IncompleteClassComponent:
+        {
+          // Same as class component case. I put it down here so that the tags are
+          // sequential to ensure this switch is compiled to a jump table.
+          var _Component = workInProgress.type;
 
-          if (didSuspendAlready) {
-            suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
-          } else {
-            suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
+          if (isContextProvider(_Component)) {
+            popContext(workInProgress);
           }
 
-          pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.
-
-          return next;
+          return null;
         }
 
-        break;
-      }
-
-    case FundamentalComponent:
-      {
-        if (enableFundamentalAPI) {
-          var fundamentalImpl = workInProgress.type.impl;
-          var fundamentalInstance = workInProgress.stateNode;
+      case SuspenseListComponent:
+        {
+          popSuspenseContext(workInProgress);
+          var renderState = workInProgress.memoizedState;
 
-          if (fundamentalInstance === null) {
-            var getInitialState = fundamentalImpl.getInitialState;
-            var fundamentalState;
+          if (renderState === null) {
+            // We're running in the default, "independent" mode.
+            // We don't do anything in this mode.
+            return null;
+          }
 
-            if (getInitialState !== undefined) {
-              fundamentalState = getInitialState(newProps);
-            }
+          var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect;
+          var renderedTail = renderState.rendering;
+
+          if (renderedTail === null) {
+            // We just rendered the head.
+            if (!didSuspendAlready) {
+              // This is the first pass. We need to figure out if anything is still
+              // suspended in the rendered set.
+              // If new content unsuspended, but there's still some content that
+              // didn't. Then we need to do a second pass that forces everything
+              // to keep showing their fallbacks.
+              // We might be suspended if something in this render pass suspended, or
+              // something in the previous committed pass suspended. Otherwise,
+              // there's no chance so we can skip the expensive call to
+              // findFirstSuspended.
+              var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect);
+
+              if (!cannotBeSuspended) {
+                var row = workInProgress.child;
+
+                while (row !== null) {
+                  var suspended = findFirstSuspended(row);
+
+                  if (suspended !== null) {
+                    didSuspendAlready = true;
+                    workInProgress.effectTag |= DidCapture;
+                    cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as
+                    // part of the second pass. In that case nothing will subscribe to
+                    // its thennables. Instead, we'll transfer its thennables to the
+                    // SuspenseList so that it can retry if they resolve.
+                    // There might be multiple of these in the list but since we're
+                    // going to wait for all of them anyway, it doesn't really matter
+                    // which ones gets to ping. In theory we could get clever and keep
+                    // track of how many dependencies remain but it gets tricky because
+                    // in the meantime, we can add/remove/change items and dependencies.
+                    // We might bail out of the loop before finding any but that
+                    // doesn't matter since that means that the other boundaries that
+                    // we did find already has their listeners attached.
+
+                    var newThennables = suspended.updateQueue;
+
+                    if (newThennables !== null) {
+                      workInProgress.updateQueue = newThennables;
+                      workInProgress.effectTag |= Update;
+                    } // Rerender the whole list, but this time, we'll force fallbacks
+                    // to stay in place.
+                    // Reset the effect list before doing the second pass since that's now invalid.
+
+
+                    if (renderState.lastEffect === null) {
+                      workInProgress.firstEffect = null;
+                    }
 
-            fundamentalInstance = workInProgress.stateNode = createFundamentalStateInstance(workInProgress, newProps, fundamentalImpl, fundamentalState || {});
+                    workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state.
 
-            var _instance5 = getFundamentalComponentInstance(fundamentalInstance);
+                    resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately
+                    // rerender the children.
 
-            fundamentalInstance.instance = _instance5;
+                    pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback));
+                    return workInProgress.child;
+                  }
 
-            if (fundamentalImpl.reconcileChildren === false) {
-              return null;
-            }
+                  row = row.sibling;
+                }
+              }
+            } else {
+              cutOffTailIfNeeded(renderState, false);
+            } // Next we're going to render the tail.
 
-            appendAllChildren(_instance5, workInProgress, false, false);
-            mountFundamentalComponent(fundamentalInstance);
           } else {
-            // We fire update in commit phase
-            var prevProps = fundamentalInstance.props;
-            fundamentalInstance.prevProps = prevProps;
-            fundamentalInstance.props = newProps;
-            fundamentalInstance.currentFiber = workInProgress;
+            // Append the rendered row to the child list.
+            if (!didSuspendAlready) {
+              var _suspended = findFirstSuspended(renderedTail);
 
-            if (supportsPersistence) {
-              var _instance6 = cloneFundamentalInstance(fundamentalInstance);
+              if (_suspended !== null) {
+                workInProgress.effectTag |= DidCapture;
+                didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't
+                // get lost if this row ends up dropped during a second pass.
 
-              fundamentalInstance.instance = _instance6;
-              appendAllChildren(_instance6, workInProgress, false, false);
-            }
+                var _newThennables = _suspended.updateQueue;
 
-            var shouldUpdate = shouldUpdateFundamentalComponent(fundamentalInstance);
+                if (_newThennables !== null) {
+                  workInProgress.updateQueue = _newThennables;
+                  workInProgress.effectTag |= Update;
+                }
 
-            if (shouldUpdate) {
-              markUpdate(workInProgress);
-            }
-          }
-        }
+                cutOffTailIfNeeded(renderState, true); // This might have been modified.
 
-        break;
-      }
+                if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) {
+                  // We need to delete the row we just rendered.
+                  // Reset the effect list to what it was before we rendered this
+                  // child. The nested children have already appended themselves.
+                  var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point.
 
-    case ScopeComponent:
-      {
-        if (enableScopeAPI) {
-          if (current === null) {
-            var _type3 = workInProgress.type;
-            var scopeInstance = {
-              fiber: workInProgress,
-              methods: null
-            };
-            workInProgress.stateNode = scopeInstance;
-            scopeInstance.methods = createScopeMethods(_type3, scopeInstance);
+                  if (lastEffect !== null) {
+                    lastEffect.nextEffect = null;
+                  } // We're done.
 
-            if (enableFlareAPI) {
-              var _listeners2 = newProps.listeners;
 
-              if (_listeners2 != null) {
-                var _rootContainerInstance2 = getRootHostContainer();
+                  return null;
+                }
+              } else if ( // The time it took to render last row is greater than time until
+              // the expiration.
+              now() * 2 - renderState.renderingStartTime > renderState.tailExpiration && renderExpirationTime > Never) {
+                // We have now passed our CPU deadline and we'll just give up further
+                // attempts to render the main content and only render fallbacks.
+                // The assumption is that this is usually faster.
+                workInProgress.effectTag |= DidCapture;
+                didSuspendAlready = true;
+                cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
+                // to get it started back up to attempt the next item. If we can show
+                // them, then they really have the same priority as this render.
+                // So we'll pick it back up the very next render pass once we've had
+                // an opportunity to yield for paint.
+
+                var nextPriority = renderExpirationTime - 1;
+                workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority;
 
-                updateEventListeners(_listeners2, workInProgress, _rootContainerInstance2);
+                {
+                  markSpawnedWork(nextPriority);
+                }
               }
             }
 
-            if (workInProgress.ref !== null) {
-              markRef$1(workInProgress);
-              markUpdate(workInProgress);
-            }
-          } else {
-            if (enableFlareAPI) {
-              var _prevListeners = current.memoizedProps.listeners;
-              var _nextListeners = newProps.listeners;
-
-              if (_prevListeners !== _nextListeners || workInProgress.ref !== null) {
-                markUpdate(workInProgress);
-              }
+            if (renderState.isBackwards) {
+              // The effect list of the backwards tail will have been added
+              // to the end. This breaks the guarantee that life-cycles fire in
+              // sibling order but that isn't a strong guarantee promised by React.
+              // Especially since these might also just pop in during future commits.
+              // Append to the beginning of the list.
+              renderedTail.sibling = workInProgress.child;
+              workInProgress.child = renderedTail;
             } else {
-              if (workInProgress.ref !== null) {
-                markUpdate(workInProgress);
+              var previousSibling = renderState.last;
+
+              if (previousSibling !== null) {
+                previousSibling.sibling = renderedTail;
+              } else {
+                workInProgress.child = renderedTail;
               }
+
+              renderState.last = renderedTail;
             }
+          }
 
-            if (current.ref !== workInProgress.ref) {
-              markRef$1(workInProgress);
+          if (renderState.tail !== null) {
+            // We still have tail rows to render.
+            if (renderState.tailExpiration === 0) {
+              // Heuristic for how long we're willing to spend rendering rows
+              // until we just give up and show what we have so far.
+              var TAIL_EXPIRATION_TIMEOUT_MS = 500;
+              renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS; // TODO: This is meant to mimic the train model or JND but this
+              // is a per component value. It should really be since the start
+              // of the total render or last commit. Consider using something like
+              // globalMostRecentFallbackTime. That doesn't account for being
+              // suspended for part of the time or when it's a new render.
+              // It should probably use a global start time value instead.
+            } // Pop a row.
+
+
+            var next = renderState.tail;
+            renderState.rendering = next;
+            renderState.tail = next.sibling;
+            renderState.lastEffect = workInProgress.lastEffect;
+            renderState.renderingStartTime = now();
+            next.sibling = null; // Restore the context.
+            // TODO: We can probably just avoid popping it instead and only
+            // setting it the first time we go from not suspended to suspended.
+
+            var suspenseContext = suspenseStackCursor.current;
+
+            if (didSuspendAlready) {
+              suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
+            } else {
+              suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
             }
+
+            pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.
+
+            return next;
           }
-        }
 
-        break;
-      }
+          return null;
+        }
+    }
 
-    default:
+    {
       {
-        {
-          throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue.");
-        }
+        throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." );
       }
-
+    }
   }
 
-  return null;
-}
+  function unwindWork(workInProgress, renderExpirationTime) {
+    switch (workInProgress.tag) {
+      case ClassComponent:
+        {
+          var Component = workInProgress.type;
 
-function unwindWork(workInProgress, renderExpirationTime) {
-  switch (workInProgress.tag) {
-    case ClassComponent:
-      {
-        var Component = workInProgress.type;
+          if (isContextProvider(Component)) {
+            popContext(workInProgress);
+          }
 
-        if (isContextProvider(Component)) {
-          popContext(workInProgress);
-        }
+          var effectTag = workInProgress.effectTag;
 
-        var effectTag = workInProgress.effectTag;
+          if (effectTag & ShouldCapture) {
+            workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;
+            return workInProgress;
+          }
 
-        if (effectTag & ShouldCapture) {
-          workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;
-          return workInProgress;
+          return null;
         }
 
-        return null;
-      }
-
-    case HostRoot:
-      {
-        popHostContainer(workInProgress);
-        popTopLevelContextObject(workInProgress);
-        var _effectTag = workInProgress.effectTag;
+      case HostRoot:
+        {
+          popHostContainer(workInProgress);
+          popTopLevelContextObject(workInProgress);
+          var _effectTag = workInProgress.effectTag;
 
-        if (!((_effectTag & DidCapture) === NoEffect)) {
-          {
-            throw Error("The root failed to unmount after an error. This is likely a bug in React. Please file an issue.");
+          if (!((_effectTag & DidCapture) === NoEffect)) {
+            {
+              throw Error( "The root failed to unmount after an error. This is likely a bug in React. Please file an issue." );
+            }
           }
-        }
 
-        workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;
-        return workInProgress;
-      }
+          workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;
+          return workInProgress;
+        }
 
-    case HostComponent:
-      {
-        // TODO: popHydrationState
-        popHostContext(workInProgress);
-        return null;
-      }
+      case HostComponent:
+        {
+          // TODO: popHydrationState
+          popHostContext(workInProgress);
+          return null;
+        }
 
-    case SuspenseComponent:
-      {
-        popSuspenseContext(workInProgress);
+      case SuspenseComponent:
+        {
+          popSuspenseContext(workInProgress);
 
-        if (enableSuspenseServerRenderer) {
-          var suspenseState = workInProgress.memoizedState;
+          var _effectTag2 = workInProgress.effectTag;
 
-          if (suspenseState !== null && suspenseState.dehydrated !== null) {
-            if (!(workInProgress.alternate !== null)) {
-              {
-                throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");
-              }
-            }
+          if (_effectTag2 & ShouldCapture) {
+            workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.
 
-            resetHydrationState();
+            return workInProgress;
           }
-        }
 
-        var _effectTag2 = workInProgress.effectTag;
+          return null;
+        }
 
-        if (_effectTag2 & ShouldCapture) {
-          workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.
+      case SuspenseListComponent:
+        {
+          popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been
+          // caught by a nested boundary. If not, it should bubble through.
 
-          return workInProgress;
+          return null;
         }
 
+      case HostPortal:
+        popHostContainer(workInProgress);
         return null;
-      }
-
-    case SuspenseListComponent:
-      {
-        popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been
-        // caught by a nested boundary. If not, it should bubble through.
 
+      case ContextProvider:
+        popProvider(workInProgress);
         return null;
-      }
 
-    case HostPortal:
-      popHostContainer(workInProgress);
-      return null;
+      default:
+        return null;
+    }
+  }
 
-    case ContextProvider:
-      popProvider(workInProgress);
-      return null;
+  function unwindInterruptedWork(interruptedWork) {
+    switch (interruptedWork.tag) {
+      case ClassComponent:
+        {
+          var childContextTypes = interruptedWork.type.childContextTypes;
 
-    default:
-      return null;
-  }
-}
+          if (childContextTypes !== null && childContextTypes !== undefined) {
+            popContext(interruptedWork);
+          }
 
-function unwindInterruptedWork(interruptedWork) {
-  switch (interruptedWork.tag) {
-    case ClassComponent:
-      {
-        var childContextTypes = interruptedWork.type.childContextTypes;
+          break;
+        }
 
-        if (childContextTypes !== null && childContextTypes !== undefined) {
-          popContext(interruptedWork);
+      case HostRoot:
+        {
+          popHostContainer(interruptedWork);
+          popTopLevelContextObject(interruptedWork);
+          break;
         }
 
-        break;
-      }
+      case HostComponent:
+        {
+          popHostContext(interruptedWork);
+          break;
+        }
 
-    case HostRoot:
-      {
+      case HostPortal:
         popHostContainer(interruptedWork);
-        popTopLevelContextObject(interruptedWork);
         break;
-      }
 
-    case HostComponent:
-      {
-        popHostContext(interruptedWork);
+      case SuspenseComponent:
+        popSuspenseContext(interruptedWork);
         break;
-      }
-
-    case HostPortal:
-      popHostContainer(interruptedWork);
-      break;
 
-    case SuspenseComponent:
-      popSuspenseContext(interruptedWork);
-      break;
-
-    case SuspenseListComponent:
-      popSuspenseContext(interruptedWork);
-      break;
-
-    case ContextProvider:
-      popProvider(interruptedWork);
-      break;
+      case SuspenseListComponent:
+        popSuspenseContext(interruptedWork);
+        break;
 
-    default:
-      break;
+      case ContextProvider:
+        popProvider(interruptedWork);
+        break;
+    }
   }
-}
-
-function createCapturedValue(value, source) {
-  // If the value is an error, call this function immediately after it is thrown
-  // so the stack is accurate.
-  return {
-    value: value,
-    source: source,
-    stack: getStackByFiberInDevAndProd(source)
-  };
-}
 
-// This module is forked in different environments.
-// By default, return `true` to log errors to the console.
-// Forks can return `false` if this isn't desirable.
-function showErrorDialog(capturedError) {
-  return true;
-}
-
-function logCapturedError(capturedError) {
-  var logError = showErrorDialog(capturedError); // Allow injected showErrorDialog() to prevent default console.error logging.
-  // This enables renderers like ReactNative to better manage redbox behavior.
-
-  if (logError === false) {
-    return;
+  function createCapturedValue(value, source) {
+    // If the value is an error, call this function immediately after it is thrown
+    // so the stack is accurate.
+    return {
+      value: value,
+      source: source,
+      stack: getStackByFiberInDevAndProd(source)
+    };
   }
 
-  var error = capturedError.error;
+  function logCapturedError(capturedError) {
 
-  {
-    var componentName = capturedError.componentName,
-        componentStack = capturedError.componentStack,
-        errorBoundaryName = capturedError.errorBoundaryName,
-        errorBoundaryFound = capturedError.errorBoundaryFound,
-        willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling
-    // `preventDefault()` in window `error` handler.
-    // We record this information as an expando on the error.
-
-    if (error != null && error._suppressLogging) {
-      if (errorBoundaryFound && willRetry) {
-        // The error is recoverable and was silenced.
-        // Ignore it and don't print the stack addendum.
-        // This is handy for testing error boundaries without noise.
-        return;
-      } // The error is fatal. Since the silencing might have
-      // been accidental, we'll surface it anyway.
-      // However, the browser would have silenced the original error
-      // so we'll print it first, and then print the stack addendum.
+    var error = capturedError.error;
+
+    {
+      var componentName = capturedError.componentName,
+          componentStack = capturedError.componentStack,
+          errorBoundaryName = capturedError.errorBoundaryName,
+          errorBoundaryFound = capturedError.errorBoundaryFound,
+          willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling
+      // `preventDefault()` in window `error` handler.
+      // We record this information as an expando on the error.
+
+      if (error != null && error._suppressLogging) {
+        if (errorBoundaryFound && willRetry) {
+          // The error is recoverable and was silenced.
+          // Ignore it and don't print the stack addendum.
+          // This is handy for testing error boundaries without noise.
+          return;
+        } // The error is fatal. Since the silencing might have
+        // been accidental, we'll surface it anyway.
+        // However, the browser would have silenced the original error
+        // so we'll print it first, and then print the stack addendum.
 
 
-      console.error(error); // For a more detailed description of this block, see:
-      // https://github.com/facebook/react/pull/13384
-    }
+        console['error'](error); // Don't transform to our wrapper
+        // For a more detailed description of this block, see:
+        // https://github.com/facebook/react/pull/13384
+      }
 
-    var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:';
-    var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.
+      var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:';
+      var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.
 
-    if (errorBoundaryFound && errorBoundaryName) {
-      if (willRetry) {
-        errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + ".");
+      if (errorBoundaryFound && errorBoundaryName) {
+        if (willRetry) {
+          errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + ".");
+        } else {
+          errorBoundaryMessage = "This error was initially handled by the error boundary " + errorBoundaryName + ".\n" + "Recreating the tree from scratch failed so React will unmount the tree.";
+        }
       } else {
-        errorBoundaryMessage = "This error was initially handled by the error boundary " + errorBoundaryName + ".\n" + "Recreating the tree from scratch failed so React will unmount the tree.";
+        errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';
       }
-    } else {
-      errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';
-    }
 
-    var combinedMessage = "" + componentNameMessage + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.
-    // We don't include the original error message and JS stack because the browser
-    // has already printed it. Even if the application swallows the error, it is still
-    // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
+      var combinedMessage = "" + componentNameMessage + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.
+      // We don't include the original error message and JS stack because the browser
+      // has already printed it. Even if the application swallows the error, it is still
+      // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
 
-    console.error(combinedMessage);
+      console['error'](combinedMessage); // Don't transform to our wrapper
+    }
   }
-}
 
-var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
+  var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
 
-{
-  didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
-}
+  {
+    didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
+  }
 
-var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
-function logError(boundary, errorInfo) {
-  var source = errorInfo.source;
-  var stack = errorInfo.stack;
+  var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
+  function logError(boundary, errorInfo) {
+    var source = errorInfo.source;
+    var stack = errorInfo.stack;
 
-  if (stack === null && source !== null) {
-    stack = getStackByFiberInDevAndProd(source);
-  }
+    if (stack === null && source !== null) {
+      stack = getStackByFiberInDevAndProd(source);
+    }
 
-  var capturedError = {
-    componentName: source !== null ? getComponentName(source.type) : null,
-    componentStack: stack !== null ? stack : '',
-    error: errorInfo.value,
-    errorBoundary: null,
-    errorBoundaryName: null,
-    errorBoundaryFound: false,
-    willRetry: false
-  };
+    var capturedError = {
+      componentName: source !== null ? getComponentName(source.type) : null,
+      componentStack: stack !== null ? stack : '',
+      error: errorInfo.value,
+      errorBoundary: null,
+      errorBoundaryName: null,
+      errorBoundaryFound: false,
+      willRetry: false
+    };
 
-  if (boundary !== null && boundary.tag === ClassComponent) {
-    capturedError.errorBoundary = boundary.stateNode;
-    capturedError.errorBoundaryName = getComponentName(boundary.type);
-    capturedError.errorBoundaryFound = true;
-    capturedError.willRetry = true;
-  }
-
-  try {
-    logCapturedError(capturedError);
-  } catch (e) {
-    // This method must not throw, or React internal state will get messed up.
-    // If console.error is overridden, or logCapturedError() shows a dialog that throws,
-    // we want to report this error outside of the normal stack as a last resort.
-    // https://github.com/facebook/react/issues/13188
-    setTimeout(function () {
-      throw e;
-    });
+    if (boundary !== null && boundary.tag === ClassComponent) {
+      capturedError.errorBoundary = boundary.stateNode;
+      capturedError.errorBoundaryName = getComponentName(boundary.type);
+      capturedError.errorBoundaryFound = true;
+      capturedError.willRetry = true;
+    }
+
+    try {
+      logCapturedError(capturedError);
+    } catch (e) {
+      // This method must not throw, or React internal state will get messed up.
+      // If console.error is overridden, or logCapturedError() shows a dialog that throws,
+      // we want to report this error outside of the normal stack as a last resort.
+      // https://github.com/facebook/react/issues/13188
+      setTimeout(function () {
+        throw e;
+      });
+    }
   }
-}
 
-var callComponentWillUnmountWithTimer = function (current$$1, instance) {
-  startPhaseTimer(current$$1, 'componentWillUnmount');
-  instance.props = current$$1.memoizedProps;
-  instance.state = current$$1.memoizedState;
-  instance.componentWillUnmount();
-  stopPhaseTimer();
-}; // Capture errors so they don't interrupt unmounting.
+  var callComponentWillUnmountWithTimer = function (current, instance) {
+    startPhaseTimer(current, 'componentWillUnmount');
+    instance.props = current.memoizedProps;
+    instance.state = current.memoizedState;
+    instance.componentWillUnmount();
+    stopPhaseTimer();
+  }; // Capture errors so they don't interrupt unmounting.
 
 
-function safelyCallComponentWillUnmount(current$$1, instance) {
-  {
-    invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current$$1, instance);
+  function safelyCallComponentWillUnmount(current, instance) {
+    {
+      invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance);
 
-    if (hasCaughtError()) {
-      var unmountError = clearCaughtError();
-      captureCommitPhaseError(current$$1, unmountError);
+      if (hasCaughtError()) {
+        var unmountError = clearCaughtError();
+        captureCommitPhaseError(current, unmountError);
+      }
     }
   }
-}
 
-function safelyDetachRef(current$$1) {
-  var ref = current$$1.ref;
+  function safelyDetachRef(current) {
+    var ref = current.ref;
 
-  if (ref !== null) {
-    if (typeof ref === 'function') {
-      {
-        invokeGuardedCallback(null, ref, null, null);
+    if (ref !== null) {
+      if (typeof ref === 'function') {
+        {
+          invokeGuardedCallback(null, ref, null, null);
 
-        if (hasCaughtError()) {
-          var refError = clearCaughtError();
-          captureCommitPhaseError(current$$1, refError);
+          if (hasCaughtError()) {
+            var refError = clearCaughtError();
+            captureCommitPhaseError(current, refError);
+          }
         }
+      } else {
+        ref.current = null;
       }
-    } else {
-      ref.current = null;
     }
   }
-}
 
-function safelyCallDestroy(current$$1, destroy) {
-  {
-    invokeGuardedCallback(null, destroy, null);
+  function safelyCallDestroy(current, destroy) {
+    {
+      invokeGuardedCallback(null, destroy, null);
 
-    if (hasCaughtError()) {
-      var error = clearCaughtError();
-      captureCommitPhaseError(current$$1, error);
+      if (hasCaughtError()) {
+        var error = clearCaughtError();
+        captureCommitPhaseError(current, error);
+      }
     }
   }
-}
 
-function commitBeforeMutationLifeCycles(current$$1, finishedWork) {
-  switch (finishedWork.tag) {
-    case FunctionComponent:
-    case ForwardRef:
-    case SimpleMemoComponent:
-      {
-        commitHookEffectList(UnmountSnapshot, NoEffect$1, finishedWork);
-        return;
-      }
+  function commitBeforeMutationLifeCycles(current, finishedWork) {
+    switch (finishedWork.tag) {
+      case FunctionComponent:
+      case ForwardRef:
+      case SimpleMemoComponent:
+      case Block:
+        {
+          return;
+        }
 
-    case ClassComponent:
-      {
-        if (finishedWork.effectTag & Snapshot) {
-          if (current$$1 !== null) {
-            var prevProps = current$$1.memoizedProps;
-            var prevState = current$$1.memoizedState;
-            startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');
-            var instance = finishedWork.stateNode; // We could update instance props and state here,
-            // but instead we rely on them being set during last render.
-            // TODO: revisit this when we implement resuming.
+      case ClassComponent:
+        {
+          if (finishedWork.effectTag & Snapshot) {
+            if (current !== null) {
+              var prevProps = current.memoizedProps;
+              var prevState = current.memoizedState;
+              startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');
+              var instance = finishedWork.stateNode; // We could update instance props and state here,
+              // but instead we rely on them being set during last render.
+              // TODO: revisit this when we implement resuming.
 
-            {
-              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
-                !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
-                !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
+              {
+                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
+                  if (instance.props !== finishedWork.memoizedProps) {
+                    error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                  }
+
+                  if (instance.state !== finishedWork.memoizedState) {
+                    error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                  }
+                }
               }
-            }
 
-            var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
+              var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
 
-            {
-              var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
+              {
+                var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
+
+                if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
+                  didWarnSet.add(finishedWork.type);
 
-              if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
-                didWarnSet.add(finishedWork.type);
-                warningWithoutStack$1(false, '%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));
+                  error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));
+                }
               }
-            }
 
-            instance.__reactInternalSnapshotBeforeUpdate = snapshot;
-            stopPhaseTimer();
+              instance.__reactInternalSnapshotBeforeUpdate = snapshot;
+              stopPhaseTimer();
+            }
           }
+
+          return;
         }
 
+      case HostRoot:
+      case HostComponent:
+      case HostText:
+      case HostPortal:
+      case IncompleteClassComponent:
+        // Nothing to do for these component types
         return;
-      }
-
-    case HostRoot:
-    case HostComponent:
-    case HostText:
-    case HostPortal:
-    case IncompleteClassComponent:
-      // Nothing to do for these component types
-      return;
+    }
 
-    default:
+    {
       {
-        {
-          {
-            throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
-          }
-        }
+        throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." );
       }
+    }
   }
-}
 
-function commitHookEffectList(unmountTag, mountTag, finishedWork) {
-  var updateQueue = finishedWork.updateQueue;
-  var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
+  function commitHookEffectListUnmount(tag, finishedWork) {
+    var updateQueue = finishedWork.updateQueue;
+    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
 
-  if (lastEffect !== null) {
-    var firstEffect = lastEffect.next;
-    var effect = firstEffect;
+    if (lastEffect !== null) {
+      var firstEffect = lastEffect.next;
+      var effect = firstEffect;
 
-    do {
-      if ((effect.tag & unmountTag) !== NoEffect$1) {
-        // Unmount
-        var destroy = effect.destroy;
-        effect.destroy = undefined;
+      do {
+        if ((effect.tag & tag) === tag) {
+          // Unmount
+          var destroy = effect.destroy;
+          effect.destroy = undefined;
 
-        if (destroy !== undefined) {
-          destroy();
+          if (destroy !== undefined) {
+            destroy();
+          }
         }
-      }
 
-      if ((effect.tag & mountTag) !== NoEffect$1) {
-        // Mount
-        var create = effect.create;
-        effect.destroy = create();
+        effect = effect.next;
+      } while (effect !== firstEffect);
+    }
+  }
+
+  function commitHookEffectListMount(tag, finishedWork) {
+    var updateQueue = finishedWork.updateQueue;
+    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
 
-        {
-          var _destroy = effect.destroy;
+    if (lastEffect !== null) {
+      var firstEffect = lastEffect.next;
+      var effect = firstEffect;
+
+      do {
+        if ((effect.tag & tag) === tag) {
+          // Mount
+          var create = effect.create;
+          effect.destroy = create();
 
-          if (_destroy !== undefined && typeof _destroy !== 'function') {
-            var addendum = void 0;
+          {
+            var destroy = effect.destroy;
 
-            if (_destroy === null) {
-              addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
-            } else if (typeof _destroy.then === 'function') {
-              addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + 'useEffect(() => {\n' + '  async function fetchData() {\n' + '    // You can await here\n' + '    const response = await MyAPI.getData(someId);\n' + '    // ...\n' + '  }\n' + '  fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching';
-            } else {
-              addendum = ' You returned: ' + _destroy;
-            }
+            if (destroy !== undefined && typeof destroy !== 'function') {
+              var addendum = void 0;
 
-            warningWithoutStack$1(false, 'An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));
+              if (destroy === null) {
+                addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
+              } else if (typeof destroy.then === 'function') {
+                addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + 'useEffect(() => {\n' + '  async function fetchData() {\n' + '    // You can await here\n' + '    const response = await MyAPI.getData(someId);\n' + '    // ...\n' + '  }\n' + '  fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching';
+              } else {
+                addendum = ' You returned: ' + destroy;
+              }
+
+              error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));
+            }
           }
         }
-      }
 
-      effect = effect.next;
-    } while (effect !== firstEffect);
+        effect = effect.next;
+      } while (effect !== firstEffect);
+    }
+  }
+
+  function commitPassiveHookEffects(finishedWork) {
+    if ((finishedWork.effectTag & Passive) !== NoEffect) {
+      switch (finishedWork.tag) {
+        case FunctionComponent:
+        case ForwardRef:
+        case SimpleMemoComponent:
+        case Block:
+          {
+            // TODO (#17945) We should call all passive destroy functions (for all fibers)
+            // before calling any create functions. The current approach only serializes
+            // these for a single fiber.
+            commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork);
+            commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
+            break;
+          }
+      }
+    }
   }
-}
 
-function commitPassiveHookEffects(finishedWork) {
-  if ((finishedWork.effectTag & Passive) !== NoEffect) {
+  function commitLifeCycles(finishedRoot, current, finishedWork, committedExpirationTime) {
     switch (finishedWork.tag) {
       case FunctionComponent:
       case ForwardRef:
       case SimpleMemoComponent:
+      case Block:
         {
-          commitHookEffectList(UnmountPassive, NoEffect$1, finishedWork);
-          commitHookEffectList(NoEffect$1, MountPassive, finishedWork);
-          break;
+          // At this point layout effects have already been destroyed (during mutation phase).
+          // This is done to prevent sibling component effects from interfering with each other,
+          // e.g. a destroy function in one component should never override a ref set
+          // by a create function in another component during the same commit.
+          commitHookEffectListMount(Layout | HasEffect, finishedWork);
+
+          return;
         }
 
-      default:
-        break;
-    }
-  }
-}
+      case ClassComponent:
+        {
+          var instance = finishedWork.stateNode;
 
-function commitLifeCycles(finishedRoot, current$$1, finishedWork, committedExpirationTime) {
-  switch (finishedWork.tag) {
-    case FunctionComponent:
-    case ForwardRef:
-    case SimpleMemoComponent:
-      {
-        commitHookEffectList(UnmountLayout, MountLayout, finishedWork);
-        break;
-      }
+          if (finishedWork.effectTag & Update) {
+            if (current === null) {
+              startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here,
+              // but instead we rely on them being set during last render.
+              // TODO: revisit this when we implement resuming.
+
+              {
+                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
+                  if (instance.props !== finishedWork.memoizedProps) {
+                    error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                  }
+
+                  if (instance.state !== finishedWork.memoizedState) {
+                    error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                  }
+                }
+              }
 
-    case ClassComponent:
-      {
-        var instance = finishedWork.stateNode;
+              instance.componentDidMount();
+              stopPhaseTimer();
+            } else {
+              var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);
+              var prevState = current.memoizedState;
+              startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here,
+              // but instead we rely on them being set during last render.
+              // TODO: revisit this when we implement resuming.
 
-        if (finishedWork.effectTag & Update) {
-          if (current$$1 === null) {
-            startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here,
-            // but instead we rely on them being set during last render.
-            // TODO: revisit this when we implement resuming.
+              {
+                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
+                  if (instance.props !== finishedWork.memoizedProps) {
+                    error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                  }
 
-            {
-              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
-                !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
-                !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
+                  if (instance.state !== finishedWork.memoizedState) {
+                    error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                  }
+                }
               }
+
+              instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
+              stopPhaseTimer();
             }
+          }
 
-            instance.componentDidMount();
-            stopPhaseTimer();
-          } else {
-            var prevProps = finishedWork.elementType === finishedWork.type ? current$$1.memoizedProps : resolveDefaultProps(finishedWork.type, current$$1.memoizedProps);
-            var prevState = current$$1.memoizedState;
-            startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here,
-            // but instead we rely on them being set during last render.
-            // TODO: revisit this when we implement resuming.
+          var updateQueue = finishedWork.updateQueue;
 
+          if (updateQueue !== null) {
             {
               if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
-                !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
-                !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
-              }
-            }
-
-            instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
-            stopPhaseTimer();
-          }
-        }
+                if (instance.props !== finishedWork.memoizedProps) {
+                  error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                }
 
-        var updateQueue = finishedWork.updateQueue;
+                if (instance.state !== finishedWork.memoizedState) {
+                  error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');
+                }
+              }
+            } // We could update instance props and state here,
+            // but instead we rely on them being set during last render.
+            // TODO: revisit this when we implement resuming.
 
-        if (updateQueue !== null) {
-          {
-            if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
-              !(instance.props === finishedWork.memoizedProps) ? warning$1(false, 'Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
-              !(instance.state === finishedWork.memoizedState) ? warning$1(false, 'Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance') : void 0;
-            }
-          } // We could update instance props and state here,
-          // but instead we rely on them being set during last render.
-          // TODO: revisit this when we implement resuming.
 
+            commitUpdateQueue(finishedWork, updateQueue, instance);
+          }
 
-          commitUpdateQueue(finishedWork, updateQueue, instance, committedExpirationTime);
+          return;
         }
 
-        return;
-      }
-
-    case HostRoot:
-      {
-        var _updateQueue = finishedWork.updateQueue;
+      case HostRoot:
+        {
+          var _updateQueue = finishedWork.updateQueue;
 
-        if (_updateQueue !== null) {
-          var _instance = null;
+          if (_updateQueue !== null) {
+            var _instance = null;
 
-          if (finishedWork.child !== null) {
-            switch (finishedWork.child.tag) {
-              case HostComponent:
-                _instance = getPublicInstance(finishedWork.child.stateNode);
-                break;
+            if (finishedWork.child !== null) {
+              switch (finishedWork.child.tag) {
+                case HostComponent:
+                  _instance = getPublicInstance(finishedWork.child.stateNode);
+                  break;
 
-              case ClassComponent:
-                _instance = finishedWork.child.stateNode;
-                break;
+                case ClassComponent:
+                  _instance = finishedWork.child.stateNode;
+                  break;
+              }
             }
+
+            commitUpdateQueue(finishedWork, _updateQueue, _instance);
           }
 
-          commitUpdateQueue(finishedWork, _updateQueue, _instance, committedExpirationTime);
+          return;
         }
 
-        return;
-      }
-
-    case HostComponent:
-      {
-        var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted
-        // (eg DOM renderer may schedule auto-focus for inputs and form controls).
-        // These effects should only be committed when components are first mounted,
-        // aka when there is no current/alternate.
+      case HostComponent:
+        {
+          var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted
+          // (eg DOM renderer may schedule auto-focus for inputs and form controls).
+          // These effects should only be committed when components are first mounted,
+          // aka when there is no current/alternate.
+
+          if (current === null && finishedWork.effectTag & Update) {
+            var type = finishedWork.type;
+            var props = finishedWork.memoizedProps;
+            commitMount(_instance2, type, props);
+          }
 
-        if (current$$1 === null && finishedWork.effectTag & Update) {
-          var type = finishedWork.type;
-          var props = finishedWork.memoizedProps;
-          commitMount(_instance2, type, props, finishedWork);
+          return;
         }
 
-        return;
-      }
-
-    case HostText:
-      {
-        // We have no life-cycles associated with text.
-        return;
-      }
+      case HostText:
+        {
+          // We have no life-cycles associated with text.
+          return;
+        }
 
-    case HostPortal:
-      {
-        // We have no life-cycles associated with portals.
-        return;
-      }
+      case HostPortal:
+        {
+          // We have no life-cycles associated with portals.
+          return;
+        }
 
-    case Profiler:
-      {
-        if (enableProfilerTimer) {
-          var onRender = finishedWork.memoizedProps.onRender;
+      case Profiler:
+        {
+          {
+            var onRender = finishedWork.memoizedProps.onRender;
 
-          if (typeof onRender === 'function') {
-            if (enableSchedulerTracing) {
-              onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);
-            } else {
-              onRender(finishedWork.memoizedProps.id, current$$1 === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime());
+            if (typeof onRender === 'function') {
+              {
+                onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);
+              }
             }
           }
+
+          return;
         }
 
-        return;
-      }
+      case SuspenseComponent:
+        {
+          commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
+          return;
+        }
 
-    case SuspenseComponent:
-      {
-        commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
+      case SuspenseListComponent:
+      case IncompleteClassComponent:
+      case FundamentalComponent:
+      case ScopeComponent:
         return;
-      }
-
-    case SuspenseListComponent:
-    case IncompleteClassComponent:
-    case FundamentalComponent:
-    case ScopeComponent:
-      return;
+    }
 
-    default:
+    {
       {
-        {
-          {
-            throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
-          }
-        }
+        throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." );
       }
+    }
   }
-}
 
-function hideOrUnhideAllChildren(finishedWork, isHidden) {
-  if (supportsMutation) {
-    // We only have the top Fiber that was inserted but we need to recurse down its
-    // children to find all the terminal nodes.
-    var node = finishedWork;
+  function hideOrUnhideAllChildren(finishedWork, isHidden) {
+    {
+      // We only have the top Fiber that was inserted but we need to recurse down its
+      // children to find all the terminal nodes.
+      var node = finishedWork;
 
-    while (true) {
-      if (node.tag === HostComponent) {
-        var instance = node.stateNode;
+      while (true) {
+        if (node.tag === HostComponent) {
+          var instance = node.stateNode;
 
-        if (isHidden) {
-          hideInstance(instance);
-        } else {
-          unhideInstance(node.stateNode, node.memoizedProps);
+          if (isHidden) {
+            hideInstance(instance);
+          } else {
+            unhideInstance(node.stateNode, node.memoizedProps);
+          }
+        } else if (node.tag === HostText) {
+          var _instance3 = node.stateNode;
+
+          if (isHidden) {
+            hideTextInstance(_instance3);
+          } else {
+            unhideTextInstance(_instance3, node.memoizedProps);
+          }
+        } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) {
+          // Found a nested Suspense component that timed out. Skip over the
+          // primary child fragment, which should remain hidden.
+          var fallbackChildFragment = node.child.sibling;
+          fallbackChildFragment.return = node;
+          node = fallbackChildFragment;
+          continue;
+        } else if (node.child !== null) {
+          node.child.return = node;
+          node = node.child;
+          continue;
         }
-      } else if (node.tag === HostText) {
-        var _instance3 = node.stateNode;
 
-        if (isHidden) {
-          hideTextInstance(_instance3);
-        } else {
-          unhideTextInstance(_instance3, node.memoizedProps);
-        }
-      } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) {
-        // Found a nested Suspense component that timed out. Skip over the
-        // primary child fragment, which should remain hidden.
-        var fallbackChildFragment = node.child.sibling;
-        fallbackChildFragment.return = node;
-        node = fallbackChildFragment;
-        continue;
-      } else if (node.child !== null) {
-        node.child.return = node;
-        node = node.child;
-        continue;
-      }
+        if (node === finishedWork) {
+          return;
+        }
 
-      if (node === finishedWork) {
-        return;
-      }
+        while (node.sibling === null) {
+          if (node.return === null || node.return === finishedWork) {
+            return;
+          }
 
-      while (node.sibling === null) {
-        if (node.return === null || node.return === finishedWork) {
-          return;
+          node = node.return;
         }
 
-        node = node.return;
+        node.sibling.return = node.return;
+        node = node.sibling;
       }
-
-      node.sibling.return = node.return;
-      node = node.sibling;
     }
   }
-}
-
-function commitAttachRef(finishedWork) {
-  var ref = finishedWork.ref;
 
-  if (ref !== null) {
-    var instance = finishedWork.stateNode;
-    var instanceToUse;
+  function commitAttachRef(finishedWork) {
+    var ref = finishedWork.ref;
 
-    switch (finishedWork.tag) {
-      case HostComponent:
-        instanceToUse = getPublicInstance(instance);
-        break;
-
-      default:
-        instanceToUse = instance;
-    } // Moved outside to ensure DCE works with this flag
+    if (ref !== null) {
+      var instance = finishedWork.stateNode;
+      var instanceToUse;
 
+      switch (finishedWork.tag) {
+        case HostComponent:
+          instanceToUse = getPublicInstance(instance);
+          break;
 
-    if (enableScopeAPI && finishedWork.tag === ScopeComponent) {
-      instanceToUse = instance.methods;
-    }
+        default:
+          instanceToUse = instance;
+      } // Moved outside to ensure DCE works with this flag
 
-    if (typeof ref === 'function') {
-      ref(instanceToUse);
-    } else {
-      {
-        if (!ref.hasOwnProperty('current')) {
-          warningWithoutStack$1(false, 'Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));
+      if (typeof ref === 'function') {
+        ref(instanceToUse);
+      } else {
+        {
+          if (!ref.hasOwnProperty('current')) {
+            error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));
+          }
         }
-      }
 
-      ref.current = instanceToUse;
+        ref.current = instanceToUse;
+      }
     }
   }
-}
 
-function commitDetachRef(current$$1) {
-  var currentRef = current$$1.ref;
+  function commitDetachRef(current) {
+    var currentRef = current.ref;
 
-  if (currentRef !== null) {
-    if (typeof currentRef === 'function') {
-      currentRef(null);
-    } else {
-      currentRef.current = null;
+    if (currentRef !== null) {
+      if (typeof currentRef === 'function') {
+        currentRef(null);
+      } else {
+        currentRef.current = null;
+      }
     }
-  }
-} // User-originating errors (lifecycles and refs) should not interrupt
-// deletion, so don't let them throw. Host-originating errors should
-// interrupt deletion, so it's okay
+  } // User-originating errors (lifecycles and refs) should not interrupt
+  // deletion, so don't let them throw. Host-originating errors should
+  // interrupt deletion, so it's okay
 
 
-function commitUnmount(finishedRoot, current$$1, renderPriorityLevel) {
-  onCommitUnmount(current$$1);
+  function commitUnmount(finishedRoot, current, renderPriorityLevel) {
+    onCommitUnmount(current);
 
-  switch (current$$1.tag) {
-    case FunctionComponent:
-    case ForwardRef:
-    case MemoComponent:
-    case SimpleMemoComponent:
-      {
-        var updateQueue = current$$1.updateQueue;
-
-        if (updateQueue !== null) {
-          var lastEffect = updateQueue.lastEffect;
-
-          if (lastEffect !== null) {
-            var firstEffect = lastEffect.next; // When the owner fiber is deleted, the destroy function of a passive
-            // effect hook is called during the synchronous commit phase. This is
-            // a concession to implementation complexity. Calling it in the
-            // passive effect phase (like they usually are, when dependencies
-            // change during an update) would require either traversing the
-            // children of the deleted fiber again, or including unmount effects
-            // as part of the fiber effect list.
-            //
-            // Because this is during the sync commit phase, we need to change
-            // the priority.
-            //
-            // TODO: Reconsider this implementation trade off.
+    switch (current.tag) {
+      case FunctionComponent:
+      case ForwardRef:
+      case MemoComponent:
+      case SimpleMemoComponent:
+      case Block:
+        {
+          var updateQueue = current.updateQueue;
 
-            var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel;
-            runWithPriority$2(priorityLevel, function () {
-              var effect = firstEffect;
+          if (updateQueue !== null) {
+            var lastEffect = updateQueue.lastEffect;
 
-              do {
-                var destroy = effect.destroy;
+            if (lastEffect !== null) {
+              var firstEffect = lastEffect.next;
 
-                if (destroy !== undefined) {
-                  safelyCallDestroy(current$$1, destroy);
-                }
+              {
+                // When the owner fiber is deleted, the destroy function of a passive
+                // effect hook is called during the synchronous commit phase. This is
+                // a concession to implementation complexity. Calling it in the
+                // passive effect phase (like they usually are, when dependencies
+                // change during an update) would require either traversing the
+                // children of the deleted fiber again, or including unmount effects
+                // as part of the fiber effect list.
+                //
+                // Because this is during the sync commit phase, we need to change
+                // the priority.
+                //
+                // TODO: Reconsider this implementation trade off.
+                var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel;
+                runWithPriority$1(priorityLevel, function () {
+                  var effect = firstEffect;
+
+                  do {
+                    var _destroy = effect.destroy;
+
+                    if (_destroy !== undefined) {
+                      safelyCallDestroy(current, _destroy);
+                    }
 
-                effect = effect.next;
-              } while (effect !== firstEffect);
-            });
+                    effect = effect.next;
+                  } while (effect !== firstEffect);
+                });
+              }
+            }
           }
-        }
-
-        break;
-      }
-
-    case ClassComponent:
-      {
-        safelyDetachRef(current$$1);
-        var instance = current$$1.stateNode;
 
-        if (typeof instance.componentWillUnmount === 'function') {
-          safelyCallComponentWillUnmount(current$$1, instance);
+          return;
         }
 
-        return;
-      }
-
-    case HostComponent:
-      {
-        if (enableFlareAPI) {
-          var dependencies = current$$1.dependencies;
-
-          if (dependencies !== null) {
-            var respondersMap = dependencies.responders;
-
-            if (respondersMap !== null) {
-              var responderInstances = Array.from(respondersMap.values());
-
-              for (var i = 0, length = responderInstances.length; i < length; i++) {
-                var responderInstance = responderInstances[i];
-                unmountResponderInstance(responderInstance);
-              }
+      case ClassComponent:
+        {
+          safelyDetachRef(current);
+          var instance = current.stateNode;
 
-              dependencies.responders = null;
-            }
+          if (typeof instance.componentWillUnmount === 'function') {
+            safelyCallComponentWillUnmount(current, instance);
           }
-        }
-
-        safelyDetachRef(current$$1);
-        return;
-      }
 
-    case HostPortal:
-      {
-        // TODO: this is recursive.
-        // We are also not using this parent because
-        // the portal will get pushed immediately.
-        if (supportsMutation) {
-          unmountHostComponents(finishedRoot, current$$1, renderPriorityLevel);
-        } else if (supportsPersistence) {
-          emptyPortalContainer(current$$1);
+          return;
         }
 
-        return;
-      }
+      case HostComponent:
+        {
 
-    case FundamentalComponent:
-      {
-        if (enableFundamentalAPI) {
-          var fundamentalInstance = current$$1.stateNode;
+          safelyDetachRef(current);
+          return;
+        }
 
-          if (fundamentalInstance !== null) {
-            unmountFundamentalComponent(fundamentalInstance);
-            current$$1.stateNode = null;
+      case HostPortal:
+        {
+          // TODO: this is recursive.
+          // We are also not using this parent because
+          // the portal will get pushed immediately.
+          {
+            unmountHostComponents(finishedRoot, current, renderPriorityLevel);
           }
+
+          return;
         }
 
-        return;
-      }
+      case FundamentalComponent:
+        {
 
-    case DehydratedFragment:
-      {
-        if (enableSuspenseCallback) {
-          var hydrationCallbacks = finishedRoot.hydrationCallbacks;
+          return;
+        }
 
-          if (hydrationCallbacks !== null) {
-            var onDeleted = hydrationCallbacks.onDeleted;
+      case DehydratedFragment:
+        {
 
-            if (onDeleted) {
-              onDeleted(current$$1.stateNode);
-            }
-          }
+          return;
         }
 
-        return;
-      }
+      case ScopeComponent:
+        {
 
-    case ScopeComponent:
-      {
-        if (enableScopeAPI) {
-          safelyDetachRef(current$$1);
+          return;
         }
-      }
+    }
   }
-}
-
-function commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) {
-  // While we're inside a removed host node we don't want to call
-  // removeChild on the inner nodes because they're removed by the top
-  // call anyway. We also want to call componentWillUnmount on all
-  // composites before this host node is removed from the tree. Therefore
-  // we do an inner loop while we're still inside the host node.
-  var node = root;
 
-  while (true) {
-    commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes.
-    // Skip portals because commitUnmount() currently visits them recursively.
+  function commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) {
+    // While we're inside a removed host node we don't want to call
+    // removeChild on the inner nodes because they're removed by the top
+    // call anyway. We also want to call componentWillUnmount on all
+    // composites before this host node is removed from the tree. Therefore
+    // we do an inner loop while we're still inside the host node.
+    var node = root;
 
-    if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above.
-    // If we don't use mutation we drill down into portals here instead.
-    !supportsMutation || node.tag !== HostPortal)) {
-      node.child.return = node;
-      node = node.child;
-      continue;
-    }
+    while (true) {
+      commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes.
+      // Skip portals because commitUnmount() currently visits them recursively.
 
-    if (node === root) {
-      return;
-    }
+      if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above.
+      // If we don't use mutation we drill down into portals here instead.
+       node.tag !== HostPortal)) {
+        node.child.return = node;
+        node = node.child;
+        continue;
+      }
 
-    while (node.sibling === null) {
-      if (node.return === null || node.return === root) {
+      if (node === root) {
         return;
       }
 
-      node = node.return;
-    }
-
-    node.sibling.return = node.return;
-    node = node.sibling;
-  }
-}
-
-function detachFiber(current$$1) {
-  var alternate = current$$1.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we
-  // should clear the child pointer of the parent alternate to let this
-  // get GC:ed but we don't know which for sure which parent is the current
-  // one so we'll settle for GC:ing the subtree of this child. This child
-  // itself will be GC:ed when the parent updates the next time.
+      while (node.sibling === null) {
+        if (node.return === null || node.return === root) {
+          return;
+        }
 
-  current$$1.return = null;
-  current$$1.child = null;
-  current$$1.memoizedState = null;
-  current$$1.updateQueue = null;
-  current$$1.dependencies = null;
-  current$$1.alternate = null;
-  current$$1.firstEffect = null;
-  current$$1.lastEffect = null;
-  current$$1.pendingProps = null;
-  current$$1.memoizedProps = null;
+        node = node.return;
+      }
 
-  if (alternate !== null) {
-    detachFiber(alternate);
+      node.sibling.return = node.return;
+      node = node.sibling;
+    }
   }
-}
 
-function emptyPortalContainer(current$$1) {
-  if (!supportsPersistence) {
-    return;
-  }
+  function detachFiber(current) {
+    var alternate = current.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we
+    // should clear the child pointer of the parent alternate to let this
+    // get GC:ed but we don't know which for sure which parent is the current
+    // one so we'll settle for GC:ing the subtree of this child. This child
+    // itself will be GC:ed when the parent updates the next time.
 
-  var portal = current$$1.stateNode;
-  var containerInfo = portal.containerInfo;
-  var emptyChildSet = createContainerChildSet(containerInfo);
-  replaceContainerChildren(containerInfo, emptyChildSet);
-}
+    current.return = null;
+    current.child = null;
+    current.memoizedState = null;
+    current.updateQueue = null;
+    current.dependencies = null;
+    current.alternate = null;
+    current.firstEffect = null;
+    current.lastEffect = null;
+    current.pendingProps = null;
+    current.memoizedProps = null;
+    current.stateNode = null;
 
-function commitContainer(finishedWork) {
-  if (!supportsPersistence) {
-    return;
+    if (alternate !== null) {
+      detachFiber(alternate);
+    }
   }
 
-  switch (finishedWork.tag) {
-    case ClassComponent:
-    case HostComponent:
-    case HostText:
-    case FundamentalComponent:
-      {
-        return;
-      }
-
-    case HostRoot:
-    case HostPortal:
-      {
-        var portalOrRoot = finishedWork.stateNode;
-        var containerInfo = portalOrRoot.containerInfo,
-            pendingChildren = portalOrRoot.pendingChildren;
-        replaceContainerChildren(containerInfo, pendingChildren);
-        return;
-      }
+  function getHostParentFiber(fiber) {
+    var parent = fiber.return;
 
-    default:
-      {
-        {
-          {
-            throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
-          }
-        }
+    while (parent !== null) {
+      if (isHostParent(parent)) {
+        return parent;
       }
-  }
-}
 
-function getHostParentFiber(fiber) {
-  var parent = fiber.return;
-
-  while (parent !== null) {
-    if (isHostParent(parent)) {
-      return parent;
-    }
-
-    parent = parent.return;
-  }
+      parent = parent.return;
+    }
 
-  {
     {
-      throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");
+      {
+        throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." );
+      }
     }
   }
-}
 
-function isHostParent(fiber) {
-  return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
-}
+  function isHostParent(fiber) {
+    return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
+  }
 
-function getHostSibling(fiber) {
-  // We're going to search forward into the tree until we find a sibling host
-  // node. Unfortunately, if multiple insertions are done in a row we have to
-  // search past them. This leads to exponential search for the next sibling.
-  // TODO: Find a more efficient way to do this.
-  var node = fiber;
+  function getHostSibling(fiber) {
+    // We're going to search forward into the tree until we find a sibling host
+    // node. Unfortunately, if multiple insertions are done in a row we have to
+    // search past them. This leads to exponential search for the next sibling.
+    // TODO: Find a more efficient way to do this.
+    var node = fiber;
 
-  siblings: while (true) {
-    // If we didn't find anything, let's try the next sibling.
-    while (node.sibling === null) {
-      if (node.return === null || isHostParent(node.return)) {
-        // If we pop out of the root or hit the parent the fiber we are the
-        // last sibling.
-        return null;
-      }
+    siblings: while (true) {
+      // If we didn't find anything, let's try the next sibling.
+      while (node.sibling === null) {
+        if (node.return === null || isHostParent(node.return)) {
+          // If we pop out of the root or hit the parent the fiber we are the
+          // last sibling.
+          return null;
+        }
 
-      node = node.return;
-    }
+        node = node.return;
+      }
 
-    node.sibling.return = node.return;
-    node = node.sibling;
+      node.sibling.return = node.return;
+      node = node.sibling;
 
-    while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {
-      // If it is not host node and, we might have a host node inside it.
-      // Try to search down until we find one.
-      if (node.effectTag & Placement) {
-        // If we don't have a child, try the siblings instead.
-        continue siblings;
-      } // If we don't have a child, try the siblings instead.
-      // We also skip portals because they are not part of this host tree.
+      while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {
+        // If it is not host node and, we might have a host node inside it.
+        // Try to search down until we find one.
+        if (node.effectTag & Placement) {
+          // If we don't have a child, try the siblings instead.
+          continue siblings;
+        } // If we don't have a child, try the siblings instead.
+        // We also skip portals because they are not part of this host tree.
 
 
-      if (node.child === null || node.tag === HostPortal) {
-        continue siblings;
-      } else {
-        node.child.return = node;
-        node = node.child;
-      }
-    } // Check if this host node is stable or about to be placed.
+        if (node.child === null || node.tag === HostPortal) {
+          continue siblings;
+        } else {
+          node.child.return = node;
+          node = node.child;
+        }
+      } // Check if this host node is stable or about to be placed.
 
 
-    if (!(node.effectTag & Placement)) {
-      // Found it!
-      return node.stateNode;
+      if (!(node.effectTag & Placement)) {
+        // Found it!
+        return node.stateNode;
+      }
     }
   }
-}
 
-function commitPlacement(finishedWork) {
-  if (!supportsMutation) {
-    return;
-  } // Recursively insert all host nodes into the parent.
+  function commitPlacement(finishedWork) {
 
 
-  var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.
+    var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.
 
-  var parent;
-  var isContainer;
-  var parentStateNode = parentFiber.stateNode;
+    var parent;
+    var isContainer;
+    var parentStateNode = parentFiber.stateNode;
 
-  switch (parentFiber.tag) {
-    case HostComponent:
-      parent = parentStateNode;
-      isContainer = false;
-      break;
+    switch (parentFiber.tag) {
+      case HostComponent:
+        parent = parentStateNode;
+        isContainer = false;
+        break;
 
-    case HostRoot:
-      parent = parentStateNode.containerInfo;
-      isContainer = true;
-      break;
+      case HostRoot:
+        parent = parentStateNode.containerInfo;
+        isContainer = true;
+        break;
 
-    case HostPortal:
-      parent = parentStateNode.containerInfo;
-      isContainer = true;
-      break;
+      case HostPortal:
+        parent = parentStateNode.containerInfo;
+        isContainer = true;
+        break;
 
-    case FundamentalComponent:
-      if (enableFundamentalAPI) {
-        parent = parentStateNode.instance;
-        isContainer = false;
-      }
+      case FundamentalComponent:
 
-    // eslint-disable-next-line-no-fallthrough
+      // eslint-disable-next-line-no-fallthrough
 
-    default:
-      {
+      default:
         {
-          throw Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.");
+          {
+            throw Error( "Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue." );
+          }
         }
-      }
 
-  }
+    }
 
-  if (parentFiber.effectTag & ContentReset) {
-    // Reset the text content of the parent before doing any insertions
-    resetTextContent(parent); // Clear ContentReset from the effect tag
+    if (parentFiber.effectTag & ContentReset) {
+      // Reset the text content of the parent before doing any insertions
+      resetTextContent(parent); // Clear ContentReset from the effect tag
 
-    parentFiber.effectTag &= ~ContentReset;
-  }
+      parentFiber.effectTag &= ~ContentReset;
+    }
 
-  var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its
-  // children to find all the terminal nodes.
+    var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its
+    // children to find all the terminal nodes.
 
-  var node = finishedWork;
+    if (isContainer) {
+      insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent);
+    } else {
+      insertOrAppendPlacementNode(finishedWork, before, parent);
+    }
+  }
 
-  while (true) {
-    var isHost = node.tag === HostComponent || node.tag === HostText;
+  function insertOrAppendPlacementNodeIntoContainer(node, before, parent) {
+    var tag = node.tag;
+    var isHost = tag === HostComponent || tag === HostText;
 
-    if (isHost || enableFundamentalAPI && node.tag === FundamentalComponent) {
+    if (isHost || enableFundamentalAPI ) {
       var stateNode = isHost ? node.stateNode : node.stateNode.instance;
 
       if (before) {
-        if (isContainer) {
-          insertInContainerBefore(parent, stateNode, before);
-        } else {
-          insertBefore(parent, stateNode, before);
-        }
+        insertInContainerBefore(parent, stateNode, before);
       } else {
-        if (isContainer) {
-          appendChildToContainer(parent, stateNode);
-        } else {
-          appendChild(parent, stateNode);
-        }
+        appendChildToContainer(parent, stateNode);
       }
-    } else if (node.tag === HostPortal) {// If the insertion itself is a portal, then we don't want to traverse
-      // down its children. Instead, we'll get insertions from each child in
-      // the portal directly.
-    } else if (node.child !== null) {
-      node.child.return = node;
-      node = node.child;
-      continue;
-    }
+    } else if (tag === HostPortal) ; else {
+      var child = node.child;
 
-    if (node === finishedWork) {
-      return;
-    }
+      if (child !== null) {
+        insertOrAppendPlacementNodeIntoContainer(child, before, parent);
+        var sibling = child.sibling;
 
-    while (node.sibling === null) {
-      if (node.return === null || node.return === finishedWork) {
-        return;
+        while (sibling !== null) {
+          insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);
+          sibling = sibling.sibling;
+        }
       }
-
-      node = node.return;
     }
-
-    node.sibling.return = node.return;
-    node = node.sibling;
   }
-}
 
-function unmountHostComponents(finishedRoot, current$$1, renderPriorityLevel) {
-  // We only have the top Fiber that was deleted but we need to recurse down its
-  // children to find all the terminal nodes.
-  var node = current$$1; // Each iteration, currentParent is populated with node's host parent if not
-  // currentParentIsValid.
+  function insertOrAppendPlacementNode(node, before, parent) {
+    var tag = node.tag;
+    var isHost = tag === HostComponent || tag === HostText;
 
-  var currentParentIsValid = false; // Note: these two variables *must* always be updated together.
+    if (isHost || enableFundamentalAPI ) {
+      var stateNode = isHost ? node.stateNode : node.stateNode.instance;
 
-  var currentParent;
-  var currentParentIsContainer;
+      if (before) {
+        insertBefore(parent, stateNode, before);
+      } else {
+        appendChild(parent, stateNode);
+      }
+    } else if (tag === HostPortal) ; else {
+      var child = node.child;
 
-  while (true) {
-    if (!currentParentIsValid) {
-      var parent = node.return;
+      if (child !== null) {
+        insertOrAppendPlacementNode(child, before, parent);
+        var sibling = child.sibling;
 
-      findParent: while (true) {
-        if (!(parent !== null)) {
-          {
-            throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");
-          }
+        while (sibling !== null) {
+          insertOrAppendPlacementNode(sibling, before, parent);
+          sibling = sibling.sibling;
         }
+      }
+    }
+  }
 
-        var parentStateNode = parent.stateNode;
+  function unmountHostComponents(finishedRoot, current, renderPriorityLevel) {
+    // We only have the top Fiber that was deleted but we need to recurse down its
+    // children to find all the terminal nodes.
+    var node = current; // Each iteration, currentParent is populated with node's host parent if not
+    // currentParentIsValid.
 
-        switch (parent.tag) {
-          case HostComponent:
-            currentParent = parentStateNode;
-            currentParentIsContainer = false;
-            break findParent;
+    var currentParentIsValid = false; // Note: these two variables *must* always be updated together.
 
-          case HostRoot:
-            currentParent = parentStateNode.containerInfo;
-            currentParentIsContainer = true;
-            break findParent;
+    var currentParent;
+    var currentParentIsContainer;
 
-          case HostPortal:
-            currentParent = parentStateNode.containerInfo;
-            currentParentIsContainer = true;
-            break findParent;
+    while (true) {
+      if (!currentParentIsValid) {
+        var parent = node.return;
 
-          case FundamentalComponent:
-            if (enableFundamentalAPI) {
-              currentParent = parentStateNode.instance;
-              currentParentIsContainer = false;
+        findParent: while (true) {
+          if (!(parent !== null)) {
+            {
+              throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." );
             }
+          }
 
-        }
+          var parentStateNode = parent.stateNode;
 
-        parent = parent.return;
-      }
+          switch (parent.tag) {
+            case HostComponent:
+              currentParent = parentStateNode;
+              currentParentIsContainer = false;
+              break findParent;
 
-      currentParentIsValid = true;
-    }
+            case HostRoot:
+              currentParent = parentStateNode.containerInfo;
+              currentParentIsContainer = true;
+              break findParent;
 
-    if (node.tag === HostComponent || node.tag === HostText) {
-      commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the
-      // node from the tree.
+            case HostPortal:
+              currentParent = parentStateNode.containerInfo;
+              currentParentIsContainer = true;
+              break findParent;
 
-      if (currentParentIsContainer) {
-        removeChildFromContainer(currentParent, node.stateNode);
-      } else {
-        removeChild(currentParent, node.stateNode);
-      } // Don't visit children because we already visited them.
+          }
 
-    } else if (enableFundamentalAPI && node.tag === FundamentalComponent) {
-      var fundamentalNode = node.stateNode.instance;
-      commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the
-      // node from the tree.
+          parent = parent.return;
+        }
 
-      if (currentParentIsContainer) {
-        removeChildFromContainer(currentParent, fundamentalNode);
-      } else {
-        removeChild(currentParent, fundamentalNode);
+        currentParentIsValid = true;
       }
-    } else if (enableSuspenseServerRenderer && node.tag === DehydratedFragment) {
-      if (enableSuspenseCallback) {
-        var hydrationCallbacks = finishedRoot.hydrationCallbacks;
 
-        if (hydrationCallbacks !== null) {
-          var onDeleted = hydrationCallbacks.onDeleted;
+      if (node.tag === HostComponent || node.tag === HostText) {
+        commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the
+        // node from the tree.
 
-          if (onDeleted) {
-            onDeleted(node.stateNode);
-          }
-        }
-      } // Delete the dehydrated suspense boundary and all of its content.
+        if (currentParentIsContainer) {
+          removeChildFromContainer(currentParent, node.stateNode);
+        } else {
+          removeChild(currentParent, node.stateNode);
+        } // Don't visit children because we already visited them.
 
+      } else if (node.tag === HostPortal) {
+        if (node.child !== null) {
+          // When we go into a portal, it becomes the parent to remove from.
+          // We will reassign it back when we pop the portal on the way up.
+          currentParent = node.stateNode.containerInfo;
+          currentParentIsContainer = true; // Visit children because portals might contain host components.
 
-      if (currentParentIsContainer) {
-        clearSuspenseBoundaryFromContainer(currentParent, node.stateNode);
+          node.child.return = node;
+          node = node.child;
+          continue;
+        }
       } else {
-        clearSuspenseBoundary(currentParent, node.stateNode);
-      }
-    } else if (node.tag === HostPortal) {
-      if (node.child !== null) {
-        // When we go into a portal, it becomes the parent to remove from.
-        // We will reassign it back when we pop the portal on the way up.
-        currentParent = node.stateNode.containerInfo;
-        currentParentIsContainer = true; // Visit children because portals might contain host components.
-
-        node.child.return = node;
-        node = node.child;
-        continue;
-      }
-    } else {
-      commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below.
+        commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below.
 
-      if (node.child !== null) {
-        node.child.return = node;
-        node = node.child;
-        continue;
+        if (node.child !== null) {
+          node.child.return = node;
+          node = node.child;
+          continue;
+        }
       }
-    }
-
-    if (node === current$$1) {
-      return;
-    }
 
-    while (node.sibling === null) {
-      if (node.return === null || node.return === current$$1) {
+      if (node === current) {
         return;
       }
 
-      node = node.return;
+      while (node.sibling === null) {
+        if (node.return === null || node.return === current) {
+          return;
+        }
 
-      if (node.tag === HostPortal) {
-        // When we go out of the portal, we need to restore the parent.
-        // Since we don't keep a stack of them, we will search for it.
-        currentParentIsValid = false;
+        node = node.return;
+
+        if (node.tag === HostPortal) {
+          // When we go out of the portal, we need to restore the parent.
+          // Since we don't keep a stack of them, we will search for it.
+          currentParentIsValid = false;
+        }
       }
-    }
 
-    node.sibling.return = node.return;
-    node = node.sibling;
+      node.sibling.return = node.return;
+      node = node.sibling;
+    }
   }
-}
 
-function commitDeletion(finishedRoot, current$$1, renderPriorityLevel) {
-  if (supportsMutation) {
-    // Recursively delete all host nodes from the parent.
-    // Detach refs and call componentWillUnmount() on the whole subtree.
-    unmountHostComponents(finishedRoot, current$$1, renderPriorityLevel);
-  } else {
-    // Detach refs and call componentWillUnmount() on the whole subtree.
-    commitNestedUnmounts(finishedRoot, current$$1, renderPriorityLevel);
+  function commitDeletion(finishedRoot, current, renderPriorityLevel) {
+    {
+      // Recursively delete all host nodes from the parent.
+      // Detach refs and call componentWillUnmount() on the whole subtree.
+      unmountHostComponents(finishedRoot, current, renderPriorityLevel);
+    }
+
+    detachFiber(current);
   }
 
-  detachFiber(current$$1);
-}
+  function commitWork(current, finishedWork) {
 
-function commitWork(current$$1, finishedWork) {
-  if (!supportsMutation) {
     switch (finishedWork.tag) {
       case FunctionComponent:
       case ForwardRef:
       case MemoComponent:
       case SimpleMemoComponent:
+      case Block:
         {
-          // Note: We currently never use MountMutation, but useLayout uses
-          // UnmountMutation.
-          commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
+          // Layout effects are destroyed during the mutation phase so that all
+          // destroy functions for all fibers are called before any create functions.
+          // This prevents sibling component effects from interfering with each other,
+          // e.g. a destroy function in one component should never override a ref set
+          // by a create function in another component during the same commit.
+          commitHookEffectListUnmount(Layout | HasEffect, finishedWork);
           return;
         }
 
-      case Profiler:
+      case ClassComponent:
         {
           return;
         }
 
-      case SuspenseComponent:
+      case HostComponent:
         {
-          commitSuspenseComponent(finishedWork);
-          attachSuspenseRetryListeners(finishedWork);
-          return;
-        }
+          var instance = finishedWork.stateNode;
 
-      case SuspenseListComponent:
-        {
-          attachSuspenseRetryListeners(finishedWork);
-          return;
-        }
+          if (instance != null) {
+            // Commit the work prepared earlier.
+            var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
+            // as the newProps. The updatePayload will contain the real change in
+            // this case.
 
-      case HostRoot:
-        {
-          if (supportsHydration) {
-            var root = finishedWork.stateNode;
+            var oldProps = current !== null ? current.memoizedProps : newProps;
+            var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.
 
-            if (root.hydrate) {
-              // We've just hydrated. No need to hydrate again.
-              root.hydrate = false;
-              commitHydratedContainer(root.containerInfo);
+            var updatePayload = finishedWork.updateQueue;
+            finishedWork.updateQueue = null;
+
+            if (updatePayload !== null) {
+              commitUpdate(instance, updatePayload, type, oldProps, newProps);
             }
           }
 
-          break;
+          return;
         }
-    }
-
-    commitContainer(finishedWork);
-    return;
-  }
-
-  switch (finishedWork.tag) {
-    case FunctionComponent:
-    case ForwardRef:
-    case MemoComponent:
-    case SimpleMemoComponent:
-      {
-        // Note: We currently never use MountMutation, but useLayout uses
-        // UnmountMutation.
-        commitHookEffectList(UnmountMutation, MountMutation, finishedWork);
-        return;
-      }
-
-    case ClassComponent:
-      {
-        return;
-      }
 
-    case HostComponent:
-      {
-        var instance = finishedWork.stateNode;
+      case HostText:
+        {
+          if (!(finishedWork.stateNode !== null)) {
+            {
+              throw Error( "This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue." );
+            }
+          }
 
-        if (instance != null) {
-          // Commit the work prepared earlier.
-          var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
+          var textInstance = finishedWork.stateNode;
+          var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
           // as the newProps. The updatePayload will contain the real change in
           // this case.
 
-          var oldProps = current$$1 !== null ? current$$1.memoizedProps : newProps;
-          var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.
-
-          var updatePayload = finishedWork.updateQueue;
-          finishedWork.updateQueue = null;
-
-          if (updatePayload !== null) {
-            commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);
-          }
+          var oldText = current !== null ? current.memoizedProps : newText;
+          commitTextUpdate(textInstance, oldText, newText);
+          return;
+        }
 
-          if (enableFlareAPI) {
-            var prevListeners = oldProps.listeners;
-            var nextListeners = newProps.listeners;
+      case HostRoot:
+        {
+          {
+            var _root = finishedWork.stateNode;
 
-            if (prevListeners !== nextListeners) {
-              updateEventListeners(nextListeners, finishedWork, null);
+            if (_root.hydrate) {
+              // We've just hydrated. No need to hydrate again.
+              _root.hydrate = false;
+              commitHydratedContainer(_root.containerInfo);
             }
           }
-        }
-
-        return;
-      }
 
-    case HostText:
-      {
-        if (!(finishedWork.stateNode !== null)) {
-          {
-            throw Error("This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.");
-          }
+          return;
         }
 
-        var textInstance = finishedWork.stateNode;
-        var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
-        // as the newProps. The updatePayload will contain the real change in
-        // this case.
-
-        var oldText = current$$1 !== null ? current$$1.memoizedProps : newText;
-        commitTextUpdate(textInstance, oldText, newText);
-        return;
-      }
-
-    case HostRoot:
-      {
-        if (supportsHydration) {
-          var _root = finishedWork.stateNode;
-
-          if (_root.hydrate) {
-            // We've just hydrated. No need to hydrate again.
-            _root.hydrate = false;
-            commitHydratedContainer(_root.containerInfo);
-          }
+      case Profiler:
+        {
+          return;
         }
 
-        return;
-      }
-
-    case Profiler:
-      {
-        return;
-      }
-
-    case SuspenseComponent:
-      {
-        commitSuspenseComponent(finishedWork);
-        attachSuspenseRetryListeners(finishedWork);
-        return;
-      }
-
-    case SuspenseListComponent:
-      {
-        attachSuspenseRetryListeners(finishedWork);
-        return;
-      }
-
-    case IncompleteClassComponent:
-      {
-        return;
-      }
-
-    case FundamentalComponent:
-      {
-        if (enableFundamentalAPI) {
-          var fundamentalInstance = finishedWork.stateNode;
-          updateFundamentalComponent(fundamentalInstance);
+      case SuspenseComponent:
+        {
+          commitSuspenseComponent(finishedWork);
+          attachSuspenseRetryListeners(finishedWork);
+          return;
         }
 
-        return;
-      }
-
-    case ScopeComponent:
-      {
-        if (enableScopeAPI) {
-          var scopeInstance = finishedWork.stateNode;
-          scopeInstance.fiber = finishedWork;
-
-          if (enableFlareAPI) {
-            var _newProps = finishedWork.memoizedProps;
-
-            var _oldProps = current$$1 !== null ? current$$1.memoizedProps : _newProps;
-
-            var _prevListeners = _oldProps.listeners;
-            var _nextListeners = _newProps.listeners;
-
-            if (_prevListeners !== _nextListeners) {
-              updateEventListeners(_nextListeners, finishedWork, null);
-            }
-          }
+      case SuspenseListComponent:
+        {
+          attachSuspenseRetryListeners(finishedWork);
+          return;
         }
 
-        return;
-      }
-
-    default:
-      {
+      case IncompleteClassComponent:
         {
-          {
-            throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
-          }
+          return;
         }
-      }
-  }
-}
-
-function commitSuspenseComponent(finishedWork) {
-  var newState = finishedWork.memoizedState;
-  var newDidTimeout;
-  var primaryChildParent = finishedWork;
-
-  if (newState === null) {
-    newDidTimeout = false;
-  } else {
-    newDidTimeout = true;
-    primaryChildParent = finishedWork.child;
-    markCommitTimeOfFallback();
-  }
+    }
 
-  if (supportsMutation && primaryChildParent !== null) {
-    hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);
+    {
+      {
+        throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." );
+      }
+    }
   }
 
-  if (enableSuspenseCallback && newState !== null) {
-    var suspenseCallback = finishedWork.memoizedProps.suspenseCallback;
+  function commitSuspenseComponent(finishedWork) {
+    var newState = finishedWork.memoizedState;
+    var newDidTimeout;
+    var primaryChildParent = finishedWork;
 
-    if (typeof suspenseCallback === 'function') {
-      var thenables = finishedWork.updateQueue;
-
-      if (thenables !== null) {
-        suspenseCallback(new Set(thenables));
-      }
+    if (newState === null) {
+      newDidTimeout = false;
     } else {
-      if (suspenseCallback !== undefined) {
-        warning$1(false, 'Unexpected type for suspenseCallback.');
-      }
+      newDidTimeout = true;
+      primaryChildParent = finishedWork.child;
+      markCommitTimeOfFallback();
     }
-  }
-}
 
-function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {
-  if (!supportsHydration) {
-    return;
+    if ( primaryChildParent !== null) {
+      hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);
+    }
   }
 
-  var newState = finishedWork.memoizedState;
-
-  if (newState === null) {
-    var current$$1 = finishedWork.alternate;
+  function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {
 
-    if (current$$1 !== null) {
-      var prevState = current$$1.memoizedState;
-
-      if (prevState !== null) {
-        var suspenseInstance = prevState.dehydrated;
+    var newState = finishedWork.memoizedState;
 
-        if (suspenseInstance !== null) {
-          commitHydratedSuspenseInstance(suspenseInstance);
+    if (newState === null) {
+      var current = finishedWork.alternate;
 
-          if (enableSuspenseCallback) {
-            var hydrationCallbacks = finishedRoot.hydrationCallbacks;
+      if (current !== null) {
+        var prevState = current.memoizedState;
 
-            if (hydrationCallbacks !== null) {
-              var onHydrated = hydrationCallbacks.onHydrated;
+        if (prevState !== null) {
+          var suspenseInstance = prevState.dehydrated;
 
-              if (onHydrated) {
-                onHydrated(suspenseInstance);
-              }
-            }
+          if (suspenseInstance !== null) {
+            commitHydratedSuspenseInstance(suspenseInstance);
           }
         }
       }
     }
   }
-}
 
-function attachSuspenseRetryListeners(finishedWork) {
-  // If this boundary just timed out, then it will have a set of thenables.
-  // For each thenable, attach a listener so that when it resolves, React
-  // attempts to re-render the boundary in the primary (pre-timeout) state.
-  var thenables = finishedWork.updateQueue;
+  function attachSuspenseRetryListeners(finishedWork) {
+    // If this boundary just timed out, then it will have a set of thenables.
+    // For each thenable, attach a listener so that when it resolves, React
+    // attempts to re-render the boundary in the primary (pre-timeout) state.
+    var thenables = finishedWork.updateQueue;
 
-  if (thenables !== null) {
-    finishedWork.updateQueue = null;
-    var retryCache = finishedWork.stateNode;
+    if (thenables !== null) {
+      finishedWork.updateQueue = null;
+      var retryCache = finishedWork.stateNode;
 
-    if (retryCache === null) {
-      retryCache = finishedWork.stateNode = new PossiblyWeakSet();
-    }
+      if (retryCache === null) {
+        retryCache = finishedWork.stateNode = new PossiblyWeakSet();
+      }
 
-    thenables.forEach(function (thenable) {
-      // Memoize using the boundary fiber to prevent redundant listeners.
-      var retry = resolveRetryThenable.bind(null, finishedWork, thenable);
+      thenables.forEach(function (thenable) {
+        // Memoize using the boundary fiber to prevent redundant listeners.
+        var retry = resolveRetryThenable.bind(null, finishedWork, thenable);
 
-      if (!retryCache.has(thenable)) {
-        if (enableSchedulerTracing) {
-          if (thenable.__reactDoNotTraceInteractions !== true) {
-            retry = unstable_wrap(retry);
+        if (!retryCache.has(thenable)) {
+          {
+            if (thenable.__reactDoNotTraceInteractions !== true) {
+              retry = unstable_wrap(retry);
+            }
           }
-        }
-
-        retryCache.add(thenable);
-        thenable.then(retry, retry);
-      }
-    });
-  }
-}
 
-function commitResetTextContent(current$$1) {
-  if (!supportsMutation) {
-    return;
+          retryCache.add(thenable);
+          thenable.then(retry, retry);
+        }
+      });
+    }
   }
 
-  resetTextContent(current$$1.stateNode);
-}
+  function commitResetTextContent(current) {
 
-var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;
-
-function createRootErrorUpdate(fiber, errorInfo, expirationTime) {
-  var update = createUpdate(expirationTime, null); // Unmount the root by rendering null.
-
-  update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property
-  // being called "element".
-
-  update.payload = {
-    element: null
-  };
-  var error = errorInfo.value;
+    resetTextContent(current.stateNode);
+  }
 
-  update.callback = function () {
-    onUncaughtError(error);
-    logError(fiber, errorInfo);
-  };
+  var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;
 
-  return update;
-}
+  function createRootErrorUpdate(fiber, errorInfo, expirationTime) {
+    var update = createUpdate(expirationTime, null); // Unmount the root by rendering null.
 
-function createClassErrorUpdate(fiber, errorInfo, expirationTime) {
-  var update = createUpdate(expirationTime, null);
-  update.tag = CaptureUpdate;
-  var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
+    update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property
+    // being called "element".
 
-  if (typeof getDerivedStateFromError === 'function') {
+    update.payload = {
+      element: null
+    };
     var error = errorInfo.value;
 
-    update.payload = function () {
+    update.callback = function () {
+      onUncaughtError(error);
       logError(fiber, errorInfo);
-      return getDerivedStateFromError(error);
     };
-  }
 
-  var inst = fiber.stateNode;
+    return update;
+  }
 
-  if (inst !== null && typeof inst.componentDidCatch === 'function') {
-    update.callback = function callback() {
-      {
-        markFailedErrorBoundaryForHotReloading(fiber);
-      }
+  function createClassErrorUpdate(fiber, errorInfo, expirationTime) {
+    var update = createUpdate(expirationTime, null);
+    update.tag = CaptureUpdate;
+    var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
 
-      if (typeof getDerivedStateFromError !== 'function') {
-        // To preserve the preexisting retry behavior of error boundaries,
-        // we keep track of which ones already failed during this batch.
-        // This gets reset before we yield back to the browser.
-        // TODO: Warn in strict mode if getDerivedStateFromError is
-        // not defined.
-        markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined
+    if (typeof getDerivedStateFromError === 'function') {
+      var error$1 = errorInfo.value;
 
+      update.payload = function () {
         logError(fiber, errorInfo);
-      }
+        return getDerivedStateFromError(error$1);
+      };
+    }
 
-      var error = errorInfo.value;
-      var stack = errorInfo.stack;
-      this.componentDidCatch(error, {
-        componentStack: stack !== null ? stack : ''
-      });
+    var inst = fiber.stateNode;
+
+    if (inst !== null && typeof inst.componentDidCatch === 'function') {
+      update.callback = function callback() {
+        {
+          markFailedErrorBoundaryForHotReloading(fiber);
+        }
 
-      {
         if (typeof getDerivedStateFromError !== 'function') {
-          // If componentDidCatch is the only error boundary method defined,
-          // then it needs to call setState to recover from errors.
-          // If no state update is scheduled then the boundary will swallow the error.
-          !(fiber.expirationTime === Sync) ? warningWithoutStack$1(false, '%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown') : void 0;
+          // To preserve the preexisting retry behavior of error boundaries,
+          // we keep track of which ones already failed during this batch.
+          // This gets reset before we yield back to the browser.
+          // TODO: Warn in strict mode if getDerivedStateFromError is
+          // not defined.
+          markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined
+
+          logError(fiber, errorInfo);
         }
-      }
-    };
-  } else {
-    update.callback = function () {
-      markFailedErrorBoundaryForHotReloading(fiber);
-    };
-  }
 
-  return update;
-}
+        var error$1 = errorInfo.value;
+        var stack = errorInfo.stack;
+        this.componentDidCatch(error$1, {
+          componentStack: stack !== null ? stack : ''
+        });
+
+        {
+          if (typeof getDerivedStateFromError !== 'function') {
+            // If componentDidCatch is the only error boundary method defined,
+            // then it needs to call setState to recover from errors.
+            // If no state update is scheduled then the boundary will swallow the error.
+            if (fiber.expirationTime !== Sync) {
+              error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown');
+            }
+          }
+        }
+      };
+    } else {
+      update.callback = function () {
+        markFailedErrorBoundaryForHotReloading(fiber);
+      };
+    }
 
-function attachPingListener(root, renderExpirationTime, thenable) {
-  // Attach a listener to the promise to "ping" the root and retry. But
-  // only if one does not already exist for the current render expiration
-  // time (which acts like a "thread ID" here).
-  var pingCache = root.pingCache;
-  var threadIDs;
+    return update;
+  }
 
-  if (pingCache === null) {
-    pingCache = root.pingCache = new PossiblyWeakMap$1();
-    threadIDs = new Set();
-    pingCache.set(thenable, threadIDs);
-  } else {
-    threadIDs = pingCache.get(thenable);
+  function attachPingListener(root, renderExpirationTime, thenable) {
+    // Attach a listener to the promise to "ping" the root and retry. But
+    // only if one does not already exist for the current render expiration
+    // time (which acts like a "thread ID" here).
+    var pingCache = root.pingCache;
+    var threadIDs;
 
-    if (threadIDs === undefined) {
+    if (pingCache === null) {
+      pingCache = root.pingCache = new PossiblyWeakMap$1();
       threadIDs = new Set();
       pingCache.set(thenable, threadIDs);
+    } else {
+      threadIDs = pingCache.get(thenable);
+
+      if (threadIDs === undefined) {
+        threadIDs = new Set();
+        pingCache.set(thenable, threadIDs);
+      }
     }
-  }
 
-  if (!threadIDs.has(renderExpirationTime)) {
-    // Memoize using the thread ID to prevent redundant listeners.
-    threadIDs.add(renderExpirationTime);
-    var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);
-    thenable.then(ping, ping);
+    if (!threadIDs.has(renderExpirationTime)) {
+      // Memoize using the thread ID to prevent redundant listeners.
+      threadIDs.add(renderExpirationTime);
+      var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);
+      thenable.then(ping, ping);
+    }
   }
-}
 
-function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {
-  // The source fiber did not complete.
-  sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid.
+  function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {
+    // The source fiber did not complete.
+    sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid.
 
-  sourceFiber.firstEffect = sourceFiber.lastEffect = null;
+    sourceFiber.firstEffect = sourceFiber.lastEffect = null;
 
-  if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
-    // This is a thenable.
-    var thenable = value;
-    checkForWrongSuspensePriorityInDEV(sourceFiber);
-    var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view.
+    if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
+      // This is a thenable.
+      var thenable = value;
 
-    var _workInProgress = returnFiber;
+      if ((sourceFiber.mode & BlockingMode) === NoMode) {
+        // Reset the memoizedState to what it was before we attempted
+        // to render it.
+        var currentSource = sourceFiber.alternate;
 
-    do {
-      if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) {
-        // Found the nearest boundary.
-        // Stash the promise on the boundary fiber. If the boundary times out, we'll
-        // attach another listener to flip the boundary back to its normal state.
-        var thenables = _workInProgress.updateQueue;
-
-        if (thenables === null) {
-          var updateQueue = new Set();
-          updateQueue.add(thenable);
-          _workInProgress.updateQueue = updateQueue;
+        if (currentSource) {
+          sourceFiber.updateQueue = currentSource.updateQueue;
+          sourceFiber.memoizedState = currentSource.memoizedState;
+          sourceFiber.expirationTime = currentSource.expirationTime;
         } else {
-          thenables.add(thenable);
-        } // If the boundary is outside of blocking mode, we should *not*
-        // suspend the commit. Pretend as if the suspended component rendered
-        // null and keep rendering. In the commit phase, we'll schedule a
-        // subsequent synchronous update to re-render the Suspense.
-        //
-        // Note: It doesn't matter whether the component that suspended was
-        // inside a blocking mode tree. If the Suspense is outside of it, we
-        // should *not* suspend the commit.
+          sourceFiber.updateQueue = null;
+          sourceFiber.memoizedState = null;
+        }
+      }
 
+      var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view.
 
-        if ((_workInProgress.mode & BlockingMode) === NoMode) {
-          _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete.
-          // But we shouldn't call any lifecycle methods or callbacks. Remove
-          // all lifecycle effect tags.
+      var _workInProgress = returnFiber;
 
-          sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);
+      do {
+        if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) {
+          // Found the nearest boundary.
+          // Stash the promise on the boundary fiber. If the boundary times out, we'll
+          // attach another listener to flip the boundary back to its normal state.
+          var thenables = _workInProgress.updateQueue;
+
+          if (thenables === null) {
+            var updateQueue = new Set();
+            updateQueue.add(thenable);
+            _workInProgress.updateQueue = updateQueue;
+          } else {
+            thenables.add(thenable);
+          } // If the boundary is outside of blocking mode, we should *not*
+          // suspend the commit. Pretend as if the suspended component rendered
+          // null and keep rendering. In the commit phase, we'll schedule a
+          // subsequent synchronous update to re-render the Suspense.
+          //
+          // Note: It doesn't matter whether the component that suspended was
+          // inside a blocking mode tree. If the Suspense is outside of it, we
+          // should *not* suspend the commit.
 
-          if (sourceFiber.tag === ClassComponent) {
-            var currentSourceFiber = sourceFiber.alternate;
 
-            if (currentSourceFiber === null) {
-              // This is a new mount. Change the tag so it's not mistaken for a
-              // completed class component. For example, we should not call
-              // componentWillUnmount if it is deleted.
-              sourceFiber.tag = IncompleteClassComponent;
-            } else {
-              // When we try rendering again, we should not reuse the current fiber,
-              // since it's known to be in an inconsistent state. Use a force update to
-              // prevent a bail out.
-              var update = createUpdate(Sync, null);
-              update.tag = ForceUpdate;
-              enqueueUpdate(sourceFiber, update);
-            }
-          } // The source fiber did not complete. Mark it with Sync priority to
-          // indicate that it still has pending work.
+          if ((_workInProgress.mode & BlockingMode) === NoMode) {
+            _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete.
+            // But we shouldn't call any lifecycle methods or callbacks. Remove
+            // all lifecycle effect tags.
 
+            sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);
 
-          sourceFiber.expirationTime = Sync; // Exit without suspending.
+            if (sourceFiber.tag === ClassComponent) {
+              var currentSourceFiber = sourceFiber.alternate;
 
-          return;
-        } // Confirmed that the boundary is in a concurrent mode tree. Continue
-        // with the normal suspend path.
-        //
-        // After this we'll use a set of heuristics to determine whether this
-        // render pass will run to completion or restart or "suspend" the commit.
-        // The actual logic for this is spread out in different places.
-        //
-        // This first principle is that if we're going to suspend when we complete
-        // a root, then we should also restart if we get an update or ping that
-        // might unsuspend it, and vice versa. The only reason to suspend is
-        // because you think you might want to restart before committing. However,
-        // it doesn't make sense to restart only while in the period we're suspended.
-        //
-        // Restarting too aggressively is also not good because it starves out any
-        // intermediate loading state. So we use heuristics to determine when.
-        // Suspense Heuristics
-        //
-        // If nothing threw a Promise or all the same fallbacks are already showing,
-        // then don't suspend/restart.
-        //
-        // If this is an initial render of a new tree of Suspense boundaries and
-        // those trigger a fallback, then don't suspend/restart. We want to ensure
-        // that we can show the initial loading state as quickly as possible.
-        //
-        // If we hit a "Delayed" case, such as when we'd switch from content back into
-        // a fallback, then we should always suspend/restart. SuspenseConfig applies to
-        // this case. If none is defined, JND is used instead.
-        //
-        // If we're already showing a fallback and it gets "retried", allowing us to show
-        // another level, but there's still an inner boundary that would show a fallback,
-        // then we suspend/restart for 500ms since the last time we showed a fallback
-        // anywhere in the tree. This effectively throttles progressive loading into a
-        // consistent train of commits. This also gives us an opportunity to restart to
-        // get to the completed state slightly earlier.
-        //
-        // If there's ambiguity due to batching it's resolved in preference of:
-        // 1) "delayed", 2) "initial render", 3) "retry".
-        //
-        // We want to ensure that a "busy" state doesn't get force committed. We want to
-        // ensure that new initial loading states can commit as soon as possible.
+              if (currentSourceFiber === null) {
+                // This is a new mount. Change the tag so it's not mistaken for a
+                // completed class component. For example, we should not call
+                // componentWillUnmount if it is deleted.
+                sourceFiber.tag = IncompleteClassComponent;
+              } else {
+                // When we try rendering again, we should not reuse the current fiber,
+                // since it's known to be in an inconsistent state. Use a force update to
+                // prevent a bail out.
+                var update = createUpdate(Sync, null);
+                update.tag = ForceUpdate;
+                enqueueUpdate(sourceFiber, update);
+              }
+            } // The source fiber did not complete. Mark it with Sync priority to
+            // indicate that it still has pending work.
 
 
-        attachPingListener(root, renderExpirationTime, thenable);
-        _workInProgress.effectTag |= ShouldCapture;
-        _workInProgress.expirationTime = renderExpirationTime;
-        return;
-      } // This boundary already captured during this render. Continue to the next
-      // boundary.
+            sourceFiber.expirationTime = Sync; // Exit without suspending.
 
+            return;
+          } // Confirmed that the boundary is in a concurrent mode tree. Continue
+          // with the normal suspend path.
+          //
+          // After this we'll use a set of heuristics to determine whether this
+          // render pass will run to completion or restart or "suspend" the commit.
+          // The actual logic for this is spread out in different places.
+          //
+          // This first principle is that if we're going to suspend when we complete
+          // a root, then we should also restart if we get an update or ping that
+          // might unsuspend it, and vice versa. The only reason to suspend is
+          // because you think you might want to restart before committing. However,
+          // it doesn't make sense to restart only while in the period we're suspended.
+          //
+          // Restarting too aggressively is also not good because it starves out any
+          // intermediate loading state. So we use heuristics to determine when.
+          // Suspense Heuristics
+          //
+          // If nothing threw a Promise or all the same fallbacks are already showing,
+          // then don't suspend/restart.
+          //
+          // If this is an initial render of a new tree of Suspense boundaries and
+          // those trigger a fallback, then don't suspend/restart. We want to ensure
+          // that we can show the initial loading state as quickly as possible.
+          //
+          // If we hit a "Delayed" case, such as when we'd switch from content back into
+          // a fallback, then we should always suspend/restart. SuspenseConfig applies to
+          // this case. If none is defined, JND is used instead.
+          //
+          // If we're already showing a fallback and it gets "retried", allowing us to show
+          // another level, but there's still an inner boundary that would show a fallback,
+          // then we suspend/restart for 500ms since the last time we showed a fallback
+          // anywhere in the tree. This effectively throttles progressive loading into a
+          // consistent train of commits. This also gives us an opportunity to restart to
+          // get to the completed state slightly earlier.
+          //
+          // If there's ambiguity due to batching it's resolved in preference of:
+          // 1) "delayed", 2) "initial render", 3) "retry".
+          //
+          // We want to ensure that a "busy" state doesn't get force committed. We want to
+          // ensure that new initial loading states can commit as soon as possible.
 
-      _workInProgress = _workInProgress.return;
-    } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode.
-    // TODO: Use invariant so the message is stripped in prod?
 
+          attachPingListener(root, renderExpirationTime, thenable);
+          _workInProgress.effectTag |= ShouldCapture;
+          _workInProgress.expirationTime = renderExpirationTime;
+          return;
+        } // This boundary already captured during this render. Continue to the next
+        // boundary.
 
-    value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\n' + '\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber));
-  } // We didn't find a boundary that could handle this type of exception. Start
-  // over and traverse parent path again, this time treating the exception
-  // as an error.
 
+        _workInProgress = _workInProgress.return;
+      } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode.
+      // TODO: Use invariant so the message is stripped in prod?
 
-  renderDidError();
-  value = createCapturedValue(value, sourceFiber);
-  var workInProgress = returnFiber;
 
-  do {
-    switch (workInProgress.tag) {
-      case HostRoot:
-        {
-          var _errorInfo = value;
-          workInProgress.effectTag |= ShouldCapture;
-          workInProgress.expirationTime = renderExpirationTime;
+      value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\n' + '\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber));
+    } // We didn't find a boundary that could handle this type of exception. Start
+    // over and traverse parent path again, this time treating the exception
+    // as an error.
 
-          var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);
 
-          enqueueCapturedUpdate(workInProgress, _update);
-          return;
-        }
+    renderDidError();
+    value = createCapturedValue(value, sourceFiber);
+    var workInProgress = returnFiber;
 
-      case ClassComponent:
-        // Capture and retry
-        var errorInfo = value;
-        var ctor = workInProgress.type;
-        var instance = workInProgress.stateNode;
+    do {
+      switch (workInProgress.tag) {
+        case HostRoot:
+          {
+            var _errorInfo = value;
+            workInProgress.effectTag |= ShouldCapture;
+            workInProgress.expirationTime = renderExpirationTime;
 
-        if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
-          workInProgress.effectTag |= ShouldCapture;
-          workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state
+            var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);
 
-          var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);
+            enqueueCapturedUpdate(workInProgress, _update);
+            return;
+          }
 
-          enqueueCapturedUpdate(workInProgress, _update2);
-          return;
-        }
+        case ClassComponent:
+          // Capture and retry
+          var errorInfo = value;
+          var ctor = workInProgress.type;
+          var instance = workInProgress.stateNode;
 
-        break;
+          if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
+            workInProgress.effectTag |= ShouldCapture;
+            workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state
 
-      default:
-        break;
-    }
+            var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);
 
-    workInProgress = workInProgress.return;
-  } while (workInProgress !== null);
-}
-
-var ceil = Math.ceil;
-var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
-var ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner;
-var IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing;
-var NoContext =
-/*                    */
-0;
-var BatchedContext =
-/*               */
-1;
-var EventContext =
-/*                 */
-2;
-var DiscreteEventContext =
-/*         */
-4;
-var LegacyUnbatchedContext =
-/*       */
-8;
-var RenderContext =
-/*                */
-16;
-var CommitContext =
-/*                */
-32;
-var RootIncomplete = 0;
-var RootFatalErrored = 1;
-var RootErrored = 2;
-var RootSuspended = 3;
-var RootSuspendedWithDelay = 4;
-var RootCompleted = 5;
-// Describes where we are in the React execution stack
-var executionContext = NoContext; // The root we're working on
-
-var workInProgressRoot = null; // The fiber we're working on
-
-var workInProgress = null; // The expiration time we're rendering
-
-var renderExpirationTime = NoWork; // Whether to root completed, errored, suspended, etc.
-
-var workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown
-
-var workInProgressRootFatalError = null; // Most recent event time among processed updates during this render.
-// This is conceptually a time stamp but expressed in terms of an ExpirationTime
-// because we deal mostly with expiration times in the hot path, so this avoids
-// the conversion happening in the hot path.
-
-var workInProgressRootLatestProcessedExpirationTime = Sync;
-var workInProgressRootLatestSuspenseTimeout = Sync;
-var workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only
-// includes unprocessed updates, not work in bailed out children.
-
-var workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately.
-// This flag determines if it might be worthwhile to restart if an opportunity
-// happens latere.
-
-var workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train
-// model where we don't commit new loading states in too quick succession.
-
-var globalMostRecentFallbackTime = 0;
-var FALLBACK_THROTTLE_MS = 500;
-var nextEffect = null;
-var hasUncaughtError = false;
-var firstUncaughtError = null;
-var legacyErrorBoundariesThatAlreadyFailed = null;
-var rootDoesHavePassiveEffects = false;
-var rootWithPendingPassiveEffects = null;
-var pendingPassiveEffectsRenderPriority = NoPriority;
-var pendingPassiveEffectsExpirationTime = NoWork;
-var rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates
-
-var NESTED_UPDATE_LIMIT = 50;
-var nestedUpdateCount = 0;
-var rootWithNestedUpdates = null;
-var NESTED_PASSIVE_UPDATE_LIMIT = 50;
-var nestedPassiveUpdateCount = 0;
-var interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times
-// during the commit phase. This enables them to be traced across components
-// that spawn new work during render. E.g. hidden boundaries, suspended SSR
-// hydration or SuspenseList.
-
-var spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start
-// time). However, if two updates are scheduled within the same event, we
-// should treat their start times as simultaneous, even if the actual clock
-// time has advanced between the first and second call.
-// In other words, because expiration times determine how updates are batched,
-// we want all updates of like priority that occur within the same event to
-// receive the same expiration time. Otherwise we get tearing.
-
-var currentEventTime = NoWork;
-function requestCurrentTimeForUpdate() {
-  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
-    // We're inside React, so it's fine to read the actual time.
-    return msToExpirationTime(now());
-  } // We're not inside React, so we may be in the middle of a browser event.
+            enqueueCapturedUpdate(workInProgress, _update2);
+            return;
+          }
 
+          break;
+      }
 
-  if (currentEventTime !== NoWork) {
-    // Use the same start time for all updates until we enter React again.
+      workInProgress = workInProgress.return;
+    } while (workInProgress !== null);
+  }
+
+  var ceil = Math.ceil;
+  var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,
+      ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,
+      IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing;
+  var NoContext =
+  /*                    */
+  0;
+  var BatchedContext =
+  /*               */
+  1;
+  var EventContext =
+  /*                 */
+  2;
+  var DiscreteEventContext =
+  /*         */
+  4;
+  var LegacyUnbatchedContext =
+  /*       */
+  8;
+  var RenderContext =
+  /*                */
+  16;
+  var CommitContext =
+  /*                */
+  32;
+  var RootIncomplete = 0;
+  var RootFatalErrored = 1;
+  var RootErrored = 2;
+  var RootSuspended = 3;
+  var RootSuspendedWithDelay = 4;
+  var RootCompleted = 5;
+  // Describes where we are in the React execution stack
+  var executionContext = NoContext; // The root we're working on
+
+  var workInProgressRoot = null; // The fiber we're working on
+
+  var workInProgress = null; // The expiration time we're rendering
+
+  var renderExpirationTime$1 = NoWork; // Whether to root completed, errored, suspended, etc.
+
+  var workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown
+
+  var workInProgressRootFatalError = null; // Most recent event time among processed updates during this render.
+  // This is conceptually a time stamp but expressed in terms of an ExpirationTime
+  // because we deal mostly with expiration times in the hot path, so this avoids
+  // the conversion happening in the hot path.
+
+  var workInProgressRootLatestProcessedExpirationTime = Sync;
+  var workInProgressRootLatestSuspenseTimeout = Sync;
+  var workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only
+  // includes unprocessed updates, not work in bailed out children.
+
+  var workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately.
+  // This flag determines if it might be worthwhile to restart if an opportunity
+  // happens latere.
+
+  var workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train
+  // model where we don't commit new loading states in too quick succession.
+
+  var globalMostRecentFallbackTime = 0;
+  var FALLBACK_THROTTLE_MS = 500;
+  var nextEffect = null;
+  var hasUncaughtError = false;
+  var firstUncaughtError = null;
+  var legacyErrorBoundariesThatAlreadyFailed = null;
+  var rootDoesHavePassiveEffects = false;
+  var rootWithPendingPassiveEffects = null;
+  var pendingPassiveEffectsRenderPriority = NoPriority;
+  var pendingPassiveEffectsExpirationTime = NoWork;
+  var rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates
+
+  var NESTED_UPDATE_LIMIT = 50;
+  var nestedUpdateCount = 0;
+  var rootWithNestedUpdates = null;
+  var NESTED_PASSIVE_UPDATE_LIMIT = 50;
+  var nestedPassiveUpdateCount = 0;
+  var interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times
+  // during the commit phase. This enables them to be traced across components
+  // that spawn new work during render. E.g. hidden boundaries, suspended SSR
+  // hydration or SuspenseList.
+
+  var spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start
+  // time). However, if two updates are scheduled within the same event, we
+  // should treat their start times as simultaneous, even if the actual clock
+  // time has advanced between the first and second call.
+  // In other words, because expiration times determine how updates are batched,
+  // we want all updates of like priority that occur within the same event to
+  // receive the same expiration time. Otherwise we get tearing.
+
+  var currentEventTime = NoWork;
+  function requestCurrentTimeForUpdate() {
+    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
+      // We're inside React, so it's fine to read the actual time.
+      return msToExpirationTime(now());
+    } // We're not inside React, so we may be in the middle of a browser event.
+
+
+    if (currentEventTime !== NoWork) {
+      // Use the same start time for all updates until we enter React again.
+      return currentEventTime;
+    } // This is the first update since React yielded. Compute a new start time.
+
+
+    currentEventTime = msToExpirationTime(now());
     return currentEventTime;
-  } // This is the first update since React yielded. Compute a new start time.
-
-
-  currentEventTime = msToExpirationTime(now());
-  return currentEventTime;
-}
-function getCurrentTime() {
-  return msToExpirationTime(now());
-}
-function computeExpirationForFiber(currentTime, fiber, suspenseConfig) {
-  var mode = fiber.mode;
-
-  if ((mode & BlockingMode) === NoMode) {
-    return Sync;
   }
+  function getCurrentTime() {
+    return msToExpirationTime(now());
+  }
+  function computeExpirationForFiber(currentTime, fiber, suspenseConfig) {
+    var mode = fiber.mode;
+
+    if ((mode & BlockingMode) === NoMode) {
+      return Sync;
+    }
 
-  var priorityLevel = getCurrentPriorityLevel();
+    var priorityLevel = getCurrentPriorityLevel();
 
-  if ((mode & ConcurrentMode) === NoMode) {
-    return priorityLevel === ImmediatePriority ? Sync : Batched;
-  }
+    if ((mode & ConcurrentMode) === NoMode) {
+      return priorityLevel === ImmediatePriority ? Sync : Batched;
+    }
 
-  if ((executionContext & RenderContext) !== NoContext) {
-    // Use whatever time we're already rendering
-    // TODO: Should there be a way to opt out, like with `runWithPriority`?
-    return renderExpirationTime;
-  }
+    if ((executionContext & RenderContext) !== NoContext) {
+      // Use whatever time we're already rendering
+      // TODO: Should there be a way to opt out, like with `runWithPriority`?
+      return renderExpirationTime$1;
+    }
 
-  var expirationTime;
+    var expirationTime;
 
-  if (suspenseConfig !== null) {
-    // Compute an expiration time based on the Suspense timeout.
-    expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);
-  } else {
-    // Compute an expiration time based on the Scheduler priority.
-    switch (priorityLevel) {
-      case ImmediatePriority:
-        expirationTime = Sync;
-        break;
+    if (suspenseConfig !== null) {
+      // Compute an expiration time based on the Suspense timeout.
+      expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);
+    } else {
+      // Compute an expiration time based on the Scheduler priority.
+      switch (priorityLevel) {
+        case ImmediatePriority:
+          expirationTime = Sync;
+          break;
 
-      case UserBlockingPriority$2:
-        // TODO: Rename this to computeUserBlockingExpiration
-        expirationTime = computeInteractiveExpiration(currentTime);
-        break;
+        case UserBlockingPriority$1:
+          // TODO: Rename this to computeUserBlockingExpiration
+          expirationTime = computeInteractiveExpiration(currentTime);
+          break;
 
-      case NormalPriority:
-      case LowPriority:
-        // TODO: Handle LowPriority
-        // TODO: Rename this to... something better.
-        expirationTime = computeAsyncExpiration(currentTime);
-        break;
+        case NormalPriority:
+        case LowPriority:
+          // TODO: Handle LowPriority
+          // TODO: Rename this to... something better.
+          expirationTime = computeAsyncExpiration(currentTime);
+          break;
 
-      case IdlePriority:
-        expirationTime = Idle;
-        break;
+        case IdlePriority:
+          expirationTime = Idle;
+          break;
 
-      default:
-        {
+        default:
           {
-            throw Error("Expected a valid priority level");
+            {
+              throw Error( "Expected a valid priority level" );
+            }
           }
-        }
 
-    }
-  } // If we're in the middle of rendering a tree, do not update at the same
-  // expiration time that is already rendering.
-  // TODO: We shouldn't have to do this if the update is on a different root.
-  // Refactor computeExpirationForFiber + scheduleUpdate so we have access to
-  // the root when we check for this condition.
+      }
+    } // If we're in the middle of rendering a tree, do not update at the same
+    // expiration time that is already rendering.
+    // TODO: We shouldn't have to do this if the update is on a different root.
+    // Refactor computeExpirationForFiber + scheduleUpdate so we have access to
+    // the root when we check for this condition.
 
 
-  if (workInProgressRoot !== null && expirationTime === renderExpirationTime) {
-    // This is a trick to move this update into a separate batch
-    expirationTime -= 1;
+    if (workInProgressRoot !== null && expirationTime === renderExpirationTime$1) {
+      // This is a trick to move this update into a separate batch
+      expirationTime -= 1;
+    }
+
+    return expirationTime;
   }
+  function scheduleUpdateOnFiber(fiber, expirationTime) {
+    checkForNestedUpdates();
+    warnAboutRenderPhaseUpdatesInDEV(fiber);
+    var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime);
 
-  return expirationTime;
-}
-function scheduleUpdateOnFiber(fiber, expirationTime) {
-  checkForNestedUpdates();
-  warnAboutInvalidUpdatesOnClassComponentsInDEV(fiber);
-  var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime);
+    if (root === null) {
+      warnAboutUpdateOnUnmountedFiberInDEV(fiber);
+      return;
+    }
 
-  if (root === null) {
-    warnAboutUpdateOnUnmountedFiberInDEV(fiber);
-    return;
-  }
+    checkForInterruption(fiber, expirationTime);
+    recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the
+    // priority as an argument to that function and this one.
 
-  checkForInterruption(fiber, expirationTime);
-  recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the
-  // priority as an argument to that function and this one.
+    var priorityLevel = getCurrentPriorityLevel();
 
-  var priorityLevel = getCurrentPriorityLevel();
+    if (expirationTime === Sync) {
+      if ( // Check if we're inside unbatchedUpdates
+      (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering
+      (executionContext & (RenderContext | CommitContext)) === NoContext) {
+        // Register pending interactions on the root to avoid losing traced interaction data.
+        schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed
+        // root inside of batchedUpdates should be synchronous, but layout updates
+        // should be deferred until the end of the batch.
 
-  if (expirationTime === Sync) {
-    if ( // Check if we're inside unbatchedUpdates
-    (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering
-    (executionContext & (RenderContext | CommitContext)) === NoContext) {
-      // Register pending interactions on the root to avoid losing traced interaction data.
-      schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed
-      // root inside of batchedUpdates should be synchronous, but layout updates
-      // should be deferred until the end of the batch.
+        performSyncWorkOnRoot(root);
+      } else {
+        ensureRootIsScheduled(root);
+        schedulePendingInteractions(root, expirationTime);
 
-      performSyncWorkOnRoot(root);
+        if (executionContext === NoContext) {
+          // Flush the synchronous work now, unless we're already working or inside
+          // a batch. This is intentionally inside scheduleUpdateOnFiber instead of
+          // scheduleCallbackForFiber to preserve the ability to schedule a callback
+          // without immediately flushing it. We only do this for user-initiated
+          // updates, to preserve historical behavior of legacy mode.
+          flushSyncCallbackQueue();
+        }
+      }
     } else {
       ensureRootIsScheduled(root);
       schedulePendingInteractions(root, expirationTime);
-
-      if (executionContext === NoContext) {
-        // Flush the synchronous work now, unless we're already working or inside
-        // a batch. This is intentionally inside scheduleUpdateOnFiber instead of
-        // scheduleCallbackForFiber to preserve the ability to schedule a callback
-        // without immediately flushing it. We only do this for user-initiated
-        // updates, to preserve historical behavior of legacy mode.
-        flushSyncCallbackQueue();
-      }
     }
-  } else {
-    ensureRootIsScheduled(root);
-    schedulePendingInteractions(root, expirationTime);
-  }
 
-  if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered
-  // discrete, even inside a discrete event.
-  priorityLevel === UserBlockingPriority$2 || priorityLevel === ImmediatePriority)) {
-    // This is the result of a discrete event. Track the lowest priority
-    // discrete update per root so we can flush them early, if needed.
-    if (rootsWithPendingDiscreteUpdates === null) {
-      rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]);
-    } else {
-      var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root);
+    if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered
+    // discrete, even inside a discrete event.
+    priorityLevel === UserBlockingPriority$1 || priorityLevel === ImmediatePriority)) {
+      // This is the result of a discrete event. Track the lowest priority
+      // discrete update per root so we can flush them early, if needed.
+      if (rootsWithPendingDiscreteUpdates === null) {
+        rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]);
+      } else {
+        var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root);
 
-      if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) {
-        rootsWithPendingDiscreteUpdates.set(root, expirationTime);
+        if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) {
+          rootsWithPendingDiscreteUpdates.set(root, expirationTime);
+        }
       }
     }
   }
-}
-var scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending
-// work without treating it as a typical update that originates from an event;
-// e.g. retrying a Suspense boundary isn't an update, but it does schedule work
-// on a fiber.
+  var scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending
+  // work without treating it as a typical update that originates from an event;
+  // e.g. retrying a Suspense boundary isn't an update, but it does schedule work
+  // on a fiber.
 
-function markUpdateTimeFromFiberToRoot(fiber, expirationTime) {
-  // Update the source fiber's expiration time
-  if (fiber.expirationTime < expirationTime) {
-    fiber.expirationTime = expirationTime;
-  }
+  function markUpdateTimeFromFiberToRoot(fiber, expirationTime) {
+    // Update the source fiber's expiration time
+    if (fiber.expirationTime < expirationTime) {
+      fiber.expirationTime = expirationTime;
+    }
 
-  var alternate = fiber.alternate;
+    var alternate = fiber.alternate;
 
-  if (alternate !== null && alternate.expirationTime < expirationTime) {
-    alternate.expirationTime = expirationTime;
-  } // Walk the parent path to the root and update the child expiration time.
+    if (alternate !== null && alternate.expirationTime < expirationTime) {
+      alternate.expirationTime = expirationTime;
+    } // Walk the parent path to the root and update the child expiration time.
 
 
-  var node = fiber.return;
-  var root = null;
+    var node = fiber.return;
+    var root = null;
 
-  if (node === null && fiber.tag === HostRoot) {
-    root = fiber.stateNode;
-  } else {
-    while (node !== null) {
-      alternate = node.alternate;
+    if (node === null && fiber.tag === HostRoot) {
+      root = fiber.stateNode;
+    } else {
+      while (node !== null) {
+        alternate = node.alternate;
 
-      if (node.childExpirationTime < expirationTime) {
-        node.childExpirationTime = expirationTime;
+        if (node.childExpirationTime < expirationTime) {
+          node.childExpirationTime = expirationTime;
 
-        if (alternate !== null && alternate.childExpirationTime < expirationTime) {
+          if (alternate !== null && alternate.childExpirationTime < expirationTime) {
+            alternate.childExpirationTime = expirationTime;
+          }
+        } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {
           alternate.childExpirationTime = expirationTime;
         }
-      } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {
-        alternate.childExpirationTime = expirationTime;
-      }
 
-      if (node.return === null && node.tag === HostRoot) {
-        root = node.stateNode;
-        break;
-      }
+        if (node.return === null && node.tag === HostRoot) {
+          root = node.stateNode;
+          break;
+        }
 
-      node = node.return;
+        node = node.return;
+      }
     }
-  }
 
-  if (root !== null) {
-    if (workInProgressRoot === root) {
-      // Received an update to a tree that's in the middle of rendering. Mark
-      // that's unprocessed work on this root.
-      markUnprocessedUpdateTime(expirationTime);
+    if (root !== null) {
+      if (workInProgressRoot === root) {
+        // Received an update to a tree that's in the middle of rendering. Mark
+        // that's unprocessed work on this root.
+        markUnprocessedUpdateTime(expirationTime);
 
-      if (workInProgressRootExitStatus === RootSuspendedWithDelay) {
-        // The root already suspended with a delay, which means this render
-        // definitely won't finish. Since we have a new update, let's mark it as
-        // suspended now, right before marking the incoming update. This has the
-        // effect of interrupting the current render and switching to the update.
-        // TODO: This happens to work when receiving an update during the render
-        // phase, because of the trick inside computeExpirationForFiber to
-        // subtract 1 from `renderExpirationTime` to move it into a
-        // separate bucket. But we should probably model it with an exception,
-        // using the same mechanism we use to force hydration of a subtree.
-        // TODO: This does not account for low pri updates that were already
-        // scheduled before the root started rendering. Need to track the next
-        // pending expiration time (perhaps by backtracking the return path) and
-        // then trigger a restart in the `renderDidSuspendDelayIfPossible` path.
-        markRootSuspendedAtTime(root, renderExpirationTime);
-      }
-    } // Mark that the root has a pending update.
+        if (workInProgressRootExitStatus === RootSuspendedWithDelay) {
+          // The root already suspended with a delay, which means this render
+          // definitely won't finish. Since we have a new update, let's mark it as
+          // suspended now, right before marking the incoming update. This has the
+          // effect of interrupting the current render and switching to the update.
+          // TODO: This happens to work when receiving an update during the render
+          // phase, because of the trick inside computeExpirationForFiber to
+          // subtract 1 from `renderExpirationTime` to move it into a
+          // separate bucket. But we should probably model it with an exception,
+          // using the same mechanism we use to force hydration of a subtree.
+          // TODO: This does not account for low pri updates that were already
+          // scheduled before the root started rendering. Need to track the next
+          // pending expiration time (perhaps by backtracking the return path) and
+          // then trigger a restart in the `renderDidSuspendDelayIfPossible` path.
+          markRootSuspendedAtTime(root, renderExpirationTime$1);
+        }
+      } // Mark that the root has a pending update.
 
 
-    markRootUpdatedAtTime(root, expirationTime);
-  }
+      markRootUpdatedAtTime(root, expirationTime);
+    }
 
-  return root;
-}
+    return root;
+  }
 
-function getNextRootExpirationTimeToWorkOn(root) {
-  // Determines the next expiration time that the root should render, taking
-  // into account levels that may be suspended, or levels that may have
-  // received a ping.
-  var lastExpiredTime = root.lastExpiredTime;
+  function getNextRootExpirationTimeToWorkOn(root) {
+    // Determines the next expiration time that the root should render, taking
+    // into account levels that may be suspended, or levels that may have
+    // received a ping.
+    var lastExpiredTime = root.lastExpiredTime;
 
-  if (lastExpiredTime !== NoWork) {
-    return lastExpiredTime;
-  } // "Pending" refers to any update that hasn't committed yet, including if it
-  // suspended. The "suspended" range is therefore a subset.
+    if (lastExpiredTime !== NoWork) {
+      return lastExpiredTime;
+    } // "Pending" refers to any update that hasn't committed yet, including if it
+    // suspended. The "suspended" range is therefore a subset.
 
 
-  var firstPendingTime = root.firstPendingTime;
+    var firstPendingTime = root.firstPendingTime;
 
-  if (!isRootSuspendedAtTime(root, firstPendingTime)) {
-    // The highest priority pending time is not suspended. Let's work on that.
-    return firstPendingTime;
-  } // If the first pending time is suspended, check if there's a lower priority
-  // pending level that we know about. Or check if we received a ping. Work
-  // on whichever is higher priority.
+    if (!isRootSuspendedAtTime(root, firstPendingTime)) {
+      // The highest priority pending time is not suspended. Let's work on that.
+      return firstPendingTime;
+    } // If the first pending time is suspended, check if there's a lower priority
+    // pending level that we know about. Or check if we received a ping. Work
+    // on whichever is higher priority.
 
 
-  var lastPingedTime = root.lastPingedTime;
-  var nextKnownPendingLevel = root.nextKnownPendingLevel;
-  return lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel;
-} // Use this function to schedule a task for a root. There's only one task per
-// root; if a task was already scheduled, we'll check to make sure the
-// expiration time of the existing task is the same as the expiration time of
-// the next level that the root has work on. This function is called on every
-// update, and right before exiting a task.
+    var lastPingedTime = root.lastPingedTime;
+    var nextKnownPendingLevel = root.nextKnownPendingLevel;
+    var nextLevel = lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel;
 
+    if ( nextLevel <= Idle && firstPendingTime !== nextLevel) {
+      // Don't work on Idle/Never priority unless everything else is committed.
+      return NoWork;
+    }
 
-function ensureRootIsScheduled(root) {
-  var lastExpiredTime = root.lastExpiredTime;
+    return nextLevel;
+  } // Use this function to schedule a task for a root. There's only one task per
+  // root; if a task was already scheduled, we'll check to make sure the
+  // expiration time of the existing task is the same as the expiration time of
+  // the next level that the root has work on. This function is called on every
+  // update, and right before exiting a task.
 
-  if (lastExpiredTime !== NoWork) {
-    // Special case: Expired work should flush synchronously.
-    root.callbackExpirationTime = Sync;
-    root.callbackPriority = ImmediatePriority;
-    root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
-    return;
-  }
 
-  var expirationTime = getNextRootExpirationTimeToWorkOn(root);
-  var existingCallbackNode = root.callbackNode;
+  function ensureRootIsScheduled(root) {
+    var lastExpiredTime = root.lastExpiredTime;
 
-  if (expirationTime === NoWork) {
-    // There's nothing to work on.
-    if (existingCallbackNode !== null) {
-      root.callbackNode = null;
-      root.callbackExpirationTime = NoWork;
-      root.callbackPriority = NoPriority;
+    if (lastExpiredTime !== NoWork) {
+      // Special case: Expired work should flush synchronously.
+      root.callbackExpirationTime = Sync;
+      root.callbackPriority = ImmediatePriority;
+      root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
+      return;
     }
 
-    return;
-  } // TODO: If this is an update, we already read the current time. Pass the
-  // time as an argument.
-
-
-  var currentTime = requestCurrentTimeForUpdate();
-  var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and
-  // expiration time. Otherwise, we'll cancel it and schedule a new one.
+    var expirationTime = getNextRootExpirationTimeToWorkOn(root);
+    var existingCallbackNode = root.callbackNode;
 
-  if (existingCallbackNode !== null) {
-    var existingCallbackPriority = root.callbackPriority;
-    var existingCallbackExpirationTime = root.callbackExpirationTime;
+    if (expirationTime === NoWork) {
+      // There's nothing to work on.
+      if (existingCallbackNode !== null) {
+        root.callbackNode = null;
+        root.callbackExpirationTime = NoWork;
+        root.callbackPriority = NoPriority;
+      }
 
-    if ( // Callback must have the exact same expiration time.
-    existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority.
-    existingCallbackPriority >= priorityLevel) {
-      // Existing callback is sufficient.
       return;
-    } // Need to schedule a new task.
-    // TODO: Instead of scheduling a new task, we should be able to change the
-    // priority of the existing one.
-
+    } // TODO: If this is an update, we already read the current time. Pass the
+    // time as an argument.
 
-    cancelCallback(existingCallbackNode);
-  }
 
-  root.callbackExpirationTime = expirationTime;
-  root.callbackPriority = priorityLevel;
-  var callbackNode;
+    var currentTime = requestCurrentTimeForUpdate();
+    var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and
+    // expiration time. Otherwise, we'll cancel it and schedule a new one.
 
-  if (expirationTime === Sync) {
-    // Sync React callbacks are scheduled on a special internal queue
-    callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
-  } else if (disableSchedulerTimeoutBasedOnReactExpirationTime) {
-    callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root));
-  } else {
-    callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects
-    // ordering because tasks are processed in timeout order.
-    {
-      timeout: expirationTimeToMs(expirationTime) - now()
-    });
-  }
+    if (existingCallbackNode !== null) {
+      var existingCallbackPriority = root.callbackPriority;
+      var existingCallbackExpirationTime = root.callbackExpirationTime;
 
-  root.callbackNode = callbackNode;
-} // This is the entry point for every concurrent task, i.e. anything that
-// goes through Scheduler.
+      if ( // Callback must have the exact same expiration time.
+      existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority.
+      existingCallbackPriority >= priorityLevel) {
+        // Existing callback is sufficient.
+        return;
+      } // Need to schedule a new task.
+      // TODO: Instead of scheduling a new task, we should be able to change the
+      // priority of the existing one.
 
 
-function performConcurrentWorkOnRoot(root, didTimeout) {
-  // Since we know we're in a React event, we can clear the current
-  // event time. The next update will compute a new event time.
-  currentEventTime = NoWork;
+      cancelCallback(existingCallbackNode);
+    }
 
-  if (didTimeout) {
-    // The render task took too long to complete. Mark the current time as
-    // expired to synchronously render all expired work in a single batch.
-    var currentTime = requestCurrentTimeForUpdate();
-    markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback.
+    root.callbackExpirationTime = expirationTime;
+    root.callbackPriority = priorityLevel;
+    var callbackNode;
 
-    ensureRootIsScheduled(root);
-    return null;
-  } // Determine the next expiration time to work on, using the fields stored
-  // on the root.
+    if (expirationTime === Sync) {
+      // Sync React callbacks are scheduled on a special internal queue
+      callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
+    } else {
+      callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects
+      // ordering because tasks are processed in timeout order.
+      {
+        timeout: expirationTimeToMs(expirationTime) - now()
+      });
+    }
 
+    root.callbackNode = callbackNode;
+  } // This is the entry point for every concurrent task, i.e. anything that
+  // goes through Scheduler.
 
-  var expirationTime = getNextRootExpirationTimeToWorkOn(root);
 
-  if (expirationTime !== NoWork) {
-    var originalCallbackNode = root.callbackNode;
+  function performConcurrentWorkOnRoot(root, didTimeout) {
+    // Since we know we're in a React event, we can clear the current
+    // event time. The next update will compute a new event time.
+    currentEventTime = NoWork;
 
-    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {
-      {
-        throw Error("Should not already be working.");
-      }
-    }
+    if (didTimeout) {
+      // The render task took too long to complete. Mark the current time as
+      // expired to synchronously render all expired work in a single batch.
+      var currentTime = requestCurrentTimeForUpdate();
+      markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback.
 
-    flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack
-    // and prepare a fresh one. Otherwise we'll continue where we left off.
+      ensureRootIsScheduled(root);
+      return null;
+    } // Determine the next expiration time to work on, using the fields stored
+    // on the root.
 
-    if (root !== workInProgressRoot || expirationTime !== renderExpirationTime) {
-      prepareFreshStack(root, expirationTime);
-      startWorkOnPendingInteractions(root, expirationTime);
-    } // If we have a work-in-progress fiber, it means there's still work to do
-    // in this root.
 
+    var expirationTime = getNextRootExpirationTimeToWorkOn(root);
 
-    if (workInProgress !== null) {
-      var prevExecutionContext = executionContext;
-      executionContext |= RenderContext;
-      var prevDispatcher = pushDispatcher(root);
-      var prevInteractions = pushInteractions(root);
-      startWorkLoopTimer(workInProgress);
+    if (expirationTime !== NoWork) {
+      var originalCallbackNode = root.callbackNode;
 
-      do {
-        try {
-          workLoopConcurrent();
-          break;
-        } catch (thrownValue) {
-          handleError(root, thrownValue);
+      if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {
+        {
+          throw Error( "Should not already be working." );
         }
-      } while (true);
-
-      resetContextDependencies();
-      executionContext = prevExecutionContext;
-      popDispatcher(prevDispatcher);
-
-      if (enableSchedulerTracing) {
-        popInteractions(prevInteractions);
       }
 
-      if (workInProgressRootExitStatus === RootFatalErrored) {
-        var fatalError = workInProgressRootFatalError;
-        stopInterruptedWorkLoopTimer();
+      flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack
+      // and prepare a fresh one. Otherwise we'll continue where we left off.
+
+      if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {
         prepareFreshStack(root, expirationTime);
-        markRootSuspendedAtTime(root, expirationTime);
-        ensureRootIsScheduled(root);
-        throw fatalError;
-      }
+        startWorkOnPendingInteractions(root, expirationTime);
+      } // If we have a work-in-progress fiber, it means there's still work to do
+      // in this root.
+
+
+      if (workInProgress !== null) {
+        var prevExecutionContext = executionContext;
+        executionContext |= RenderContext;
+        var prevDispatcher = pushDispatcher();
+        var prevInteractions = pushInteractions(root);
+        startWorkLoopTimer(workInProgress);
+
+        do {
+          try {
+            workLoopConcurrent();
+            break;
+          } catch (thrownValue) {
+            handleError(root, thrownValue);
+          }
+        } while (true);
 
-      if (workInProgress !== null) {
-        // There's still work left over. Exit without committing.
-        stopInterruptedWorkLoopTimer();
-      } else {
-        // We now have a consistent tree. The next step is either to commit it,
-        // or, if something suspended, wait to commit it after a timeout.
-        stopFinishedWorkLoopTimer();
-        var finishedWork = root.finishedWork = root.current.alternate;
-        root.finishedExpirationTime = expirationTime;
-        finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime);
-      }
+        resetContextDependencies();
+        executionContext = prevExecutionContext;
+        popDispatcher(prevDispatcher);
 
-      ensureRootIsScheduled(root);
+        {
+          popInteractions(prevInteractions);
+        }
+
+        if (workInProgressRootExitStatus === RootFatalErrored) {
+          var fatalError = workInProgressRootFatalError;
+          stopInterruptedWorkLoopTimer();
+          prepareFreshStack(root, expirationTime);
+          markRootSuspendedAtTime(root, expirationTime);
+          ensureRootIsScheduled(root);
+          throw fatalError;
+        }
+
+        if (workInProgress !== null) {
+          // There's still work left over. Exit without committing.
+          stopInterruptedWorkLoopTimer();
+        } else {
+          // We now have a consistent tree. The next step is either to commit it,
+          // or, if something suspended, wait to commit it after a timeout.
+          stopFinishedWorkLoopTimer();
+          var finishedWork = root.finishedWork = root.current.alternate;
+          root.finishedExpirationTime = expirationTime;
+          finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime);
+        }
+
+        ensureRootIsScheduled(root);
 
-      if (root.callbackNode === originalCallbackNode) {
-        // The task node scheduled for this root is the same one that's
-        // currently executed. Need to return a continuation.
-        return performConcurrentWorkOnRoot.bind(null, root);
+        if (root.callbackNode === originalCallbackNode) {
+          // The task node scheduled for this root is the same one that's
+          // currently executed. Need to return a continuation.
+          return performConcurrentWorkOnRoot.bind(null, root);
+        }
       }
     }
-  }
 
-  return null;
-}
+    return null;
+  }
 
-function finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) {
-  // Set this to null to indicate there's no in-progress render.
-  workInProgressRoot = null;
+  function finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) {
+    // Set this to null to indicate there's no in-progress render.
+    workInProgressRoot = null;
 
-  switch (exitStatus) {
-    case RootIncomplete:
-    case RootFatalErrored:
-      {
+    switch (exitStatus) {
+      case RootIncomplete:
+      case RootFatalErrored:
         {
           {
-            throw Error("Root did not complete. This is a bug in React.");
+            {
+              throw Error( "Root did not complete. This is a bug in React." );
+            }
           }
         }
-      }
-    // Flow knows about invariant, so it complains if I add a break
-    // statement, but eslint doesn't know about invariant, so it complains
-    // if I do. eslint-disable-next-line no-fallthrough
+      // Flow knows about invariant, so it complains if I add a break
+      // statement, but eslint doesn't know about invariant, so it complains
+      // if I do. eslint-disable-next-line no-fallthrough
 
-    case RootErrored:
-      {
-        // If this was an async render, the error may have happened due to
-        // a mutation in a concurrent event. Try rendering one more time,
-        // synchronously, to see if the error goes away. If there are
-        // lower priority updates, let's include those, too, in case they
-        // fix the inconsistency. Render at Idle to include all updates.
-        // If it was Idle or Never or some not-yet-invented time, render
-        // at that time.
-        markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous
-        // and therefore not hit this path again.
+      case RootErrored:
+        {
+          // If this was an async render, the error may have happened due to
+          // a mutation in a concurrent event. Try rendering one more time,
+          // synchronously, to see if the error goes away. If there are
+          // lower priority updates, let's include those, too, in case they
+          // fix the inconsistency. Render at Idle to include all updates.
+          // If it was Idle or Never or some not-yet-invented time, render
+          // at that time.
+          markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous
+          // and therefore not hit this path again.
 
-        break;
-      }
+          break;
+        }
 
-    case RootSuspended:
-      {
-        markRootSuspendedAtTime(root, expirationTime);
-        var lastSuspendedTime = root.lastSuspendedTime;
+      case RootSuspended:
+        {
+          markRootSuspendedAtTime(root, expirationTime);
+          var lastSuspendedTime = root.lastSuspendedTime;
+
+          if (expirationTime === lastSuspendedTime) {
+            root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);
+          } // We have an acceptable loading state. We need to figure out if we
+          // should immediately commit it or wait a bit.
+          // If we have processed new updates during this render, we may now
+          // have a new loading state ready. We want to ensure that we commit
+          // that as soon as possible.
+
+
+          var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync;
+
+          if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope
+          !( IsThisRendererActing.current)) {
+            // If we have not processed any new updates during this pass, then
+            // this is either a retry of an existing fallback state or a
+            // hidden tree. Hidden trees shouldn't be batched with other work
+            // and after that's fixed it can only be a retry. We're going to
+            // throttle committing retries so that we don't show too many
+            // loading states too quickly.
+            var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.
+
+            if (msUntilTimeout > 10) {
+              if (workInProgressRootHasPendingPing) {
+                var lastPingedTime = root.lastPingedTime;
+
+                if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) {
+                  // This render was pinged but we didn't get to restart
+                  // earlier so try restarting now instead.
+                  root.lastPingedTime = expirationTime;
+                  prepareFreshStack(root, expirationTime);
+                  break;
+                }
+              }
 
-        if (expirationTime === lastSuspendedTime) {
-          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);
-        }
+              var nextTime = getNextRootExpirationTimeToWorkOn(root);
+
+              if (nextTime !== NoWork && nextTime !== expirationTime) {
+                // There's additional work on this root.
+                break;
+              }
+
+              if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) {
+                // We should prefer to render the fallback of at the last
+                // suspended level. Ping the last suspended level to try
+                // rendering it again.
+                root.lastPingedTime = lastSuspendedTime;
+                break;
+              } // The render is suspended, it hasn't timed out, and there's no
+              // lower priority work to do. Instead of committing the fallback
+              // immediately, wait for more data to arrive.
+
+
+              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout);
+              break;
+            }
+          } // The work expired. Commit immediately.
 
-        flushSuspensePriorityWarningInDEV(); // We have an acceptable loading state. We need to figure out if we
-        // should immediately commit it or wait a bit.
-        // If we have processed new updates during this render, we may now
-        // have a new loading state ready. We want to ensure that we commit
-        // that as soon as possible.
 
-        var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync;
+          commitRoot(root);
+          break;
+        }
+
+      case RootSuspendedWithDelay:
+        {
+          markRootSuspendedAtTime(root, expirationTime);
+          var _lastSuspendedTime = root.lastSuspendedTime;
 
-        if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope
-        !(true && flushSuspenseFallbacksInTests && IsThisRendererActing.current)) {
-          // If we have not processed any new updates during this pass, then
-          // this is either a retry of an existing fallback state or a
-          // hidden tree. Hidden trees shouldn't be batched with other work
-          // and after that's fixed it can only be a retry. We're going to
-          // throttle committing retries so that we don't show too many
-          // loading states too quickly.
-          var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.
+          if (expirationTime === _lastSuspendedTime) {
+            root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);
+          }
 
-          if (msUntilTimeout > 10) {
+          if ( // do not delay if we're inside an act() scope
+          !( IsThisRendererActing.current)) {
+            // We're suspended in a state that should be avoided. We'll try to
+            // avoid committing it for as long as the timeouts let us.
             if (workInProgressRootHasPendingPing) {
-              var lastPingedTime = root.lastPingedTime;
+              var _lastPingedTime = root.lastPingedTime;
 
-              if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) {
-                // This render was pinged but we didn't get to restart
-                // earlier so try restarting now instead.
+              if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) {
+                // This render was pinged but we didn't get to restart earlier
+                // so try restarting now instead.
                 root.lastPingedTime = expirationTime;
                 prepareFreshStack(root, expirationTime);
                 break;
               }
             }
 
-            var nextTime = getNextRootExpirationTimeToWorkOn(root);
+            var _nextTime = getNextRootExpirationTimeToWorkOn(root);
 
-            if (nextTime !== NoWork && nextTime !== expirationTime) {
+            if (_nextTime !== NoWork && _nextTime !== expirationTime) {
               // There's additional work on this root.
               break;
             }
 
-            if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) {
+            if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) {
               // We should prefer to render the fallback of at the last
               // suspended level. Ping the last suspended level to try
               // rendering it again.
-              root.lastPingedTime = lastSuspendedTime;
+              root.lastPingedTime = _lastSuspendedTime;
               break;
-            } // The render is suspended, it hasn't timed out, and there's no
-            // lower priority work to do. Instead of committing the fallback
-            // immediately, wait for more data to arrive.
-
-
-            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout);
-            break;
-          }
-        } // The work expired. Commit immediately.
-
-
-        commitRoot(root);
-        break;
-      }
+            }
 
-    case RootSuspendedWithDelay:
-      {
-        markRootSuspendedAtTime(root, expirationTime);
-        var _lastSuspendedTime = root.lastSuspendedTime;
+            var _msUntilTimeout;
+
+            if (workInProgressRootLatestSuspenseTimeout !== Sync) {
+              // We have processed a suspense config whose expiration time we
+              // can use as the timeout.
+              _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now();
+            } else if (workInProgressRootLatestProcessedExpirationTime === Sync) {
+              // This should never normally happen because only new updates
+              // cause delayed states, so we should have processed something.
+              // However, this could also happen in an offscreen tree.
+              _msUntilTimeout = 0;
+            } else {
+              // If we don't have a suspense config, we're going to use a
+              // heuristic to determine how long we can suspend.
+              var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime);
+              var currentTimeMs = now();
+              var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs;
+              var timeElapsed = currentTimeMs - eventTimeMs;
+
+              if (timeElapsed < 0) {
+                // We get this wrong some time since we estimate the time.
+                timeElapsed = 0;
+              }
 
-        if (expirationTime === _lastSuspendedTime) {
-          root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);
-        }
+              _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the
+              // event time is exact instead of inferred from expiration time
+              // we don't need this.
 
-        flushSuspensePriorityWarningInDEV();
+              if (timeUntilExpirationMs < _msUntilTimeout) {
+                _msUntilTimeout = timeUntilExpirationMs;
+              }
+            } // Don't bother with a very short suspense time.
 
-        if ( // do not delay if we're inside an act() scope
-        !(true && flushSuspenseFallbacksInTests && IsThisRendererActing.current)) {
-          // We're suspended in a state that should be avoided. We'll try to
-          // avoid committing it for as long as the timeouts let us.
-          if (workInProgressRootHasPendingPing) {
-            var _lastPingedTime = root.lastPingedTime;
 
-            if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) {
-              // This render was pinged but we didn't get to restart earlier
-              // so try restarting now instead.
-              root.lastPingedTime = expirationTime;
-              prepareFreshStack(root, expirationTime);
+            if (_msUntilTimeout > 10) {
+              // The render is suspended, it hasn't timed out, and there's no
+              // lower priority work to do. Instead of committing the fallback
+              // immediately, wait for more data to arrive.
+              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout);
               break;
             }
-          }
-
-          var _nextTime = getNextRootExpirationTimeToWorkOn(root);
+          } // The work expired. Commit immediately.
 
-          if (_nextTime !== NoWork && _nextTime !== expirationTime) {
-            // There's additional work on this root.
-            break;
-          }
-
-          if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) {
-            // We should prefer to render the fallback of at the last
-            // suspended level. Ping the last suspended level to try
-            // rendering it again.
-            root.lastPingedTime = _lastSuspendedTime;
-            break;
-          }
-
-          var _msUntilTimeout;
-
-          if (workInProgressRootLatestSuspenseTimeout !== Sync) {
-            // We have processed a suspense config whose expiration time we
-            // can use as the timeout.
-            _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now();
-          } else if (workInProgressRootLatestProcessedExpirationTime === Sync) {
-            // This should never normally happen because only new updates
-            // cause delayed states, so we should have processed something.
-            // However, this could also happen in an offscreen tree.
-            _msUntilTimeout = 0;
-          } else {
-            // If we don't have a suspense config, we're going to use a
-            // heuristic to determine how long we can suspend.
-            var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime);
-            var currentTimeMs = now();
-            var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs;
-            var timeElapsed = currentTimeMs - eventTimeMs;
-
-            if (timeElapsed < 0) {
-              // We get this wrong some time since we estimate the time.
-              timeElapsed = 0;
-            }
 
-            _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the
-            // event time is exact instead of inferred from expiration time
-            // we don't need this.
+          commitRoot(root);
+          break;
+        }
 
-            if (timeUntilExpirationMs < _msUntilTimeout) {
-              _msUntilTimeout = timeUntilExpirationMs;
+      case RootCompleted:
+        {
+          // The work completed. Ready to commit.
+          if ( // do not delay if we're inside an act() scope
+          !( IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) {
+            // If we have exceeded the minimum loading delay, which probably
+            // means we have shown a spinner already, we might have to suspend
+            // a bit longer to ensure that the spinner is shown for
+            // enough time.
+            var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig);
+
+            if (_msUntilTimeout2 > 10) {
+              markRootSuspendedAtTime(root, expirationTime);
+              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2);
+              break;
             }
-          } // Don't bother with a very short suspense time.
-
-
-          if (_msUntilTimeout > 10) {
-            // The render is suspended, it hasn't timed out, and there's no
-            // lower priority work to do. Instead of committing the fallback
-            // immediately, wait for more data to arrive.
-            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout);
-            break;
           }
-        } // The work expired. Commit immediately.
-
 
-        commitRoot(root);
-        break;
-      }
-
-    case RootCompleted:
-      {
-        // The work completed. Ready to commit.
-        if ( // do not delay if we're inside an act() scope
-        !(true && flushSuspenseFallbacksInTests && IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) {
-          // If we have exceeded the minimum loading delay, which probably
-          // means we have shown a spinner already, we might have to suspend
-          // a bit longer to ensure that the spinner is shown for
-          // enough time.
-          var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig);
-
-          if (_msUntilTimeout2 > 10) {
-            markRootSuspendedAtTime(root, expirationTime);
-            root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2);
-            break;
-          }
+          commitRoot(root);
+          break;
         }
 
-        commitRoot(root);
-        break;
-      }
-
-    default:
-      {
+      default:
         {
           {
-            throw Error("Unknown root exit status.");
+            {
+              throw Error( "Unknown root exit status." );
+            }
           }
         }
-      }
-  }
-} // This is the entry point for synchronous tasks that don't go
-// through Scheduler
+    }
+  } // This is the entry point for synchronous tasks that don't go
+  // through Scheduler
 
 
-function performSyncWorkOnRoot(root) {
-  // Check if there's expired work on this root. Otherwise, render at Sync.
-  var lastExpiredTime = root.lastExpiredTime;
-  var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync;
+  function performSyncWorkOnRoot(root) {
+    // Check if there's expired work on this root. Otherwise, render at Sync.
+    var lastExpiredTime = root.lastExpiredTime;
+    var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync;
 
-  if (root.finishedExpirationTime === expirationTime) {
-    // There's already a pending commit at this expiration time.
-    // TODO: This is poorly factored. This case only exists for the
-    // batch.commit() API.
-    commitRoot(root);
-  } else {
     if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {
       {
-        throw Error("Should not already be working.");
+        throw Error( "Should not already be working." );
       }
     }
 
     flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack
     // and prepare a fresh one. Otherwise we'll continue where we left off.
 
-    if (root !== workInProgressRoot || expirationTime !== renderExpirationTime) {
+    if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {
       prepareFreshStack(root, expirationTime);
       startWorkOnPendingInteractions(root, expirationTime);
     } // If we have a work-in-progress fiber, it means there's still work to do
@@ -24407,7 +21882,7 @@ function performSyncWorkOnRoot(root) {
     if (workInProgress !== null) {
       var prevExecutionContext = executionContext;
       executionContext |= RenderContext;
-      var prevDispatcher = pushDispatcher(root);
+      var prevDispatcher = pushDispatcher();
       var prevInteractions = pushInteractions(root);
       startWorkLoopTimer(workInProgress);
 
@@ -24424,7 +21899,7 @@ function performSyncWorkOnRoot(root) {
       executionContext = prevExecutionContext;
       popDispatcher(prevDispatcher);
 
-      if (enableSchedulerTracing) {
+      {
         popInteractions(prevInteractions);
       }
 
@@ -24441,7 +21916,7 @@ function performSyncWorkOnRoot(root) {
         // This is a sync render, so we should have finished the whole tree.
         {
           {
-            throw Error("Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.");
+            throw Error( "Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue." );
           }
         }
       } else {
@@ -24450,2176 +21925,1953 @@ function performSyncWorkOnRoot(root) {
         stopFinishedWorkLoopTimer();
         root.finishedWork = root.current.alternate;
         root.finishedExpirationTime = expirationTime;
-        finishSyncRender(root, workInProgressRootExitStatus, expirationTime);
+        finishSyncRender(root);
       } // Before exiting, make sure there's a callback scheduled for the next
       // pending level.
 
 
       ensureRootIsScheduled(root);
     }
+
+    return null;
   }
 
-  return null;
-}
+  function finishSyncRender(root) {
+    // Set this to null to indicate there's no in-progress render.
+    workInProgressRoot = null;
+    commitRoot(root);
+  }
+  function flushDiscreteUpdates() {
+    // TODO: Should be able to flush inside batchedUpdates, but not inside `act`.
+    // However, `act` uses `batchedUpdates`, so there's no way to distinguish
+    // those two cases. Need to fix this before exposing flushDiscreteUpdates
+    // as a public API.
+    if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) {
+      {
+        if ((executionContext & RenderContext) !== NoContext) {
+          error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.');
+        }
+      } // We're already rendering, so we can't synchronously flush pending work.
+      // This is probably a nested event dispatch triggered by a lifecycle/effect,
+      // like `el.focus()`. Exit.
 
-function finishSyncRender(root, exitStatus, expirationTime) {
-  // Set this to null to indicate there's no in-progress render.
-  workInProgressRoot = null;
 
-  {
-    if (exitStatus === RootSuspended || exitStatus === RootSuspendedWithDelay) {
-      flushSuspensePriorityWarningInDEV();
+      return;
     }
-  }
-
-  commitRoot(root);
-}
 
-function flushRoot(root, expirationTime) {
-  markRootExpiredAtTime(root, expirationTime);
-  ensureRootIsScheduled(root);
+    flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that
+    // they fire before the next serial event.
 
-  if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
-    flushSyncCallbackQueue();
+    flushPassiveEffects();
+  }
+  function syncUpdates(fn, a, b, c) {
+    return runWithPriority$1(ImmediatePriority, fn.bind(null, a, b, c));
   }
-}
-function flushDiscreteUpdates() {
-  // TODO: Should be able to flush inside batchedUpdates, but not inside `act`.
-  // However, `act` uses `batchedUpdates`, so there's no way to distinguish
-  // those two cases. Need to fix this before exposing flushDiscreteUpdates
-  // as a public API.
-  if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) {
-    if (true && (executionContext & RenderContext) !== NoContext) {
-      warning$1(false, 'unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.');
-    } // We're already rendering, so we can't synchronously flush pending work.
-    // This is probably a nested event dispatch triggered by a lifecycle/effect,
-    // like `el.focus()`. Exit.
-
-
-    return;
-  }
-
-  flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that
-  // they fire before the next serial event.
-
-  flushPassiveEffects();
-}
-
-function syncUpdates(fn, a, b, c) {
-  return runWithPriority$2(ImmediatePriority, fn.bind(null, a, b, c));
-}
-
-function flushPendingDiscreteUpdates() {
-  if (rootsWithPendingDiscreteUpdates !== null) {
-    // For each root with pending discrete updates, schedule a callback to
-    // immediately flush them.
-    var roots = rootsWithPendingDiscreteUpdates;
-    rootsWithPendingDiscreteUpdates = null;
-    roots.forEach(function (expirationTime, root) {
-      markRootExpiredAtTime(root, expirationTime);
-      ensureRootIsScheduled(root);
-    }); // Now flush the immediate queue.
 
-    flushSyncCallbackQueue();
+  function flushPendingDiscreteUpdates() {
+    if (rootsWithPendingDiscreteUpdates !== null) {
+      // For each root with pending discrete updates, schedule a callback to
+      // immediately flush them.
+      var roots = rootsWithPendingDiscreteUpdates;
+      rootsWithPendingDiscreteUpdates = null;
+      roots.forEach(function (expirationTime, root) {
+        markRootExpiredAtTime(root, expirationTime);
+        ensureRootIsScheduled(root);
+      }); // Now flush the immediate queue.
+
+      flushSyncCallbackQueue();
+    }
   }
-}
 
-function batchedUpdates$1(fn, a) {
-  var prevExecutionContext = executionContext;
-  executionContext |= BatchedContext;
+  function batchedUpdates$1(fn, a) {
+    var prevExecutionContext = executionContext;
+    executionContext |= BatchedContext;
 
-  try {
-    return fn(a);
-  } finally {
-    executionContext = prevExecutionContext;
+    try {
+      return fn(a);
+    } finally {
+      executionContext = prevExecutionContext;
 
-    if (executionContext === NoContext) {
-      // Flush the immediate callbacks that were scheduled during this batch
-      flushSyncCallbackQueue();
+      if (executionContext === NoContext) {
+        // Flush the immediate callbacks that were scheduled during this batch
+        flushSyncCallbackQueue();
+      }
     }
   }
-}
-function batchedEventUpdates$1(fn, a) {
-  var prevExecutionContext = executionContext;
-  executionContext |= EventContext;
+  function batchedEventUpdates$1(fn, a) {
+    var prevExecutionContext = executionContext;
+    executionContext |= EventContext;
 
-  try {
-    return fn(a);
-  } finally {
-    executionContext = prevExecutionContext;
+    try {
+      return fn(a);
+    } finally {
+      executionContext = prevExecutionContext;
 
-    if (executionContext === NoContext) {
-      // Flush the immediate callbacks that were scheduled during this batch
-      flushSyncCallbackQueue();
+      if (executionContext === NoContext) {
+        // Flush the immediate callbacks that were scheduled during this batch
+        flushSyncCallbackQueue();
+      }
     }
   }
-}
-function discreteUpdates$1(fn, a, b, c) {
-  var prevExecutionContext = executionContext;
-  executionContext |= DiscreteEventContext;
+  function discreteUpdates$1(fn, a, b, c, d) {
+    var prevExecutionContext = executionContext;
+    executionContext |= DiscreteEventContext;
 
-  try {
-    // Should this
-    return runWithPriority$2(UserBlockingPriority$2, fn.bind(null, a, b, c));
-  } finally {
-    executionContext = prevExecutionContext;
+    try {
+      // Should this
+      return runWithPriority$1(UserBlockingPriority$1, fn.bind(null, a, b, c, d));
+    } finally {
+      executionContext = prevExecutionContext;
 
-    if (executionContext === NoContext) {
-      // Flush the immediate callbacks that were scheduled during this batch
-      flushSyncCallbackQueue();
+      if (executionContext === NoContext) {
+        // Flush the immediate callbacks that were scheduled during this batch
+        flushSyncCallbackQueue();
+      }
     }
   }
-}
-function unbatchedUpdates(fn, a) {
-  var prevExecutionContext = executionContext;
-  executionContext &= ~BatchedContext;
-  executionContext |= LegacyUnbatchedContext;
+  function unbatchedUpdates(fn, a) {
+    var prevExecutionContext = executionContext;
+    executionContext &= ~BatchedContext;
+    executionContext |= LegacyUnbatchedContext;
 
-  try {
-    return fn(a);
-  } finally {
-    executionContext = prevExecutionContext;
+    try {
+      return fn(a);
+    } finally {
+      executionContext = prevExecutionContext;
 
-    if (executionContext === NoContext) {
-      // Flush the immediate callbacks that were scheduled during this batch
-      flushSyncCallbackQueue();
+      if (executionContext === NoContext) {
+        // Flush the immediate callbacks that were scheduled during this batch
+        flushSyncCallbackQueue();
+      }
     }
   }
-}
-function flushSync(fn, a) {
-  if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
-    {
+  function flushSync(fn, a) {
+    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
       {
-        throw Error("flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.");
+        {
+          throw Error( "flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering." );
+        }
       }
     }
-  }
-
-  var prevExecutionContext = executionContext;
-  executionContext |= BatchedContext;
 
-  try {
-    return runWithPriority$2(ImmediatePriority, fn.bind(null, a));
-  } finally {
-    executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.
-    // Note that this will happen even if batchedUpdates is higher up
-    // the stack.
-
-    flushSyncCallbackQueue();
-  }
-}
-function flushControlled(fn) {
-  var prevExecutionContext = executionContext;
-  executionContext |= BatchedContext;
+    var prevExecutionContext = executionContext;
+    executionContext |= BatchedContext;
 
-  try {
-    runWithPriority$2(ImmediatePriority, fn);
-  } finally {
-    executionContext = prevExecutionContext;
+    try {
+      return runWithPriority$1(ImmediatePriority, fn.bind(null, a));
+    } finally {
+      executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.
+      // Note that this will happen even if batchedUpdates is higher up
+      // the stack.
 
-    if (executionContext === NoContext) {
-      // Flush the immediate callbacks that were scheduled during this batch
       flushSyncCallbackQueue();
     }
   }
-}
 
-function prepareFreshStack(root, expirationTime) {
-  root.finishedWork = null;
-  root.finishedExpirationTime = NoWork;
-  var timeoutHandle = root.timeoutHandle;
+  function prepareFreshStack(root, expirationTime) {
+    root.finishedWork = null;
+    root.finishedExpirationTime = NoWork;
+    var timeoutHandle = root.timeoutHandle;
 
-  if (timeoutHandle !== noTimeout) {
-    // The root previous suspended and scheduled a timeout to commit a fallback
-    // state. Now that we have additional work, cancel the timeout.
-    root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
+    if (timeoutHandle !== noTimeout) {
+      // The root previous suspended and scheduled a timeout to commit a fallback
+      // state. Now that we have additional work, cancel the timeout.
+      root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
 
-    cancelTimeout(timeoutHandle);
-  }
+      cancelTimeout(timeoutHandle);
+    }
 
-  if (workInProgress !== null) {
-    var interruptedWork = workInProgress.return;
+    if (workInProgress !== null) {
+      var interruptedWork = workInProgress.return;
 
-    while (interruptedWork !== null) {
-      unwindInterruptedWork(interruptedWork);
-      interruptedWork = interruptedWork.return;
+      while (interruptedWork !== null) {
+        unwindInterruptedWork(interruptedWork);
+        interruptedWork = interruptedWork.return;
+      }
     }
-  }
 
-  workInProgressRoot = root;
-  workInProgress = createWorkInProgress(root.current, null, expirationTime);
-  renderExpirationTime = expirationTime;
-  workInProgressRootExitStatus = RootIncomplete;
-  workInProgressRootFatalError = null;
-  workInProgressRootLatestProcessedExpirationTime = Sync;
-  workInProgressRootLatestSuspenseTimeout = Sync;
-  workInProgressRootCanSuspendUsingConfig = null;
-  workInProgressRootNextUnprocessedUpdateTime = NoWork;
-  workInProgressRootHasPendingPing = false;
+    workInProgressRoot = root;
+    workInProgress = createWorkInProgress(root.current, null);
+    renderExpirationTime$1 = expirationTime;
+    workInProgressRootExitStatus = RootIncomplete;
+    workInProgressRootFatalError = null;
+    workInProgressRootLatestProcessedExpirationTime = Sync;
+    workInProgressRootLatestSuspenseTimeout = Sync;
+    workInProgressRootCanSuspendUsingConfig = null;
+    workInProgressRootNextUnprocessedUpdateTime = NoWork;
+    workInProgressRootHasPendingPing = false;
 
-  if (enableSchedulerTracing) {
-    spawnedWorkDuringRender = null;
-  }
+    {
+      spawnedWorkDuringRender = null;
+    }
 
-  {
-    ReactStrictModeWarnings.discardPendingWarnings();
-    componentsThatTriggeredHighPriSuspend = null;
+    {
+      ReactStrictModeWarnings.discardPendingWarnings();
+    }
   }
-}
-
-function handleError(root, thrownValue) {
-  do {
-    try {
-      // Reset module-level state that was set during the render phase.
-      resetContextDependencies();
-      resetHooks();
-      resetCurrentFiber();
 
-      if (workInProgress === null || workInProgress.return === null) {
-        // Expected to be working on a non-root fiber. This is a fatal error
-        // because there's no ancestor that can handle it; the root is
-        // supposed to capture all errors that weren't caught by an error
-        // boundary.
-        workInProgressRootExitStatus = RootFatalErrored;
-        workInProgressRootFatalError = thrownValue;
-        return null;
-      }
+  function handleError(root, thrownValue) {
+    do {
+      try {
+        // Reset module-level state that was set during the render phase.
+        resetContextDependencies();
+        resetHooksAfterThrow();
+        resetCurrentFiber();
+
+        if (workInProgress === null || workInProgress.return === null) {
+          // Expected to be working on a non-root fiber. This is a fatal error
+          // because there's no ancestor that can handle it; the root is
+          // supposed to capture all errors that weren't caught by an error
+          // boundary.
+          workInProgressRootExitStatus = RootFatalErrored;
+          workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next
+          // sibling, or the parent if there are no siblings. But since the root
+          // has no siblings nor a parent, we set it to null. Usually this is
+          // handled by `completeUnitOfWork` or `unwindWork`, but since we're
+          // interntionally not calling those, we need set it here.
+          // TODO: Consider calling `unwindWork` to pop the contexts.
+
+          workInProgress = null;
+          return null;
+        }
 
-      if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
-        // Record the time spent rendering before an error was thrown. This
-        // avoids inaccurate Profiler durations in the case of a
-        // suspended render.
-        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);
-      }
+        if (enableProfilerTimer && workInProgress.mode & ProfileMode) {
+          // Record the time spent rendering before an error was thrown. This
+          // avoids inaccurate Profiler durations in the case of a
+          // suspended render.
+          stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);
+        }
 
-      throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime);
-      workInProgress = completeUnitOfWork(workInProgress);
-    } catch (yetAnotherThrownValue) {
-      // Something in the return path also threw.
-      thrownValue = yetAnotherThrownValue;
-      continue;
-    } // Return to the normal work loop.
+        throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime$1);
+        workInProgress = completeUnitOfWork(workInProgress);
+      } catch (yetAnotherThrownValue) {
+        // Something in the return path also threw.
+        thrownValue = yetAnotherThrownValue;
+        continue;
+      } // Return to the normal work loop.
 
 
-    return;
-  } while (true);
-}
+      return;
+    } while (true);
+  }
 
-function pushDispatcher(root) {
-  var prevDispatcher = ReactCurrentDispatcher.current;
-  ReactCurrentDispatcher.current = ContextOnlyDispatcher;
+  function pushDispatcher(root) {
+    var prevDispatcher = ReactCurrentDispatcher$1.current;
+    ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
 
-  if (prevDispatcher === null) {
-    // The React isomorphic package does not include a default dispatcher.
-    // Instead the first renderer will lazily attach one, in order to give
-    // nicer error messages.
-    return ContextOnlyDispatcher;
-  } else {
-    return prevDispatcher;
+    if (prevDispatcher === null) {
+      // The React isomorphic package does not include a default dispatcher.
+      // Instead the first renderer will lazily attach one, in order to give
+      // nicer error messages.
+      return ContextOnlyDispatcher;
+    } else {
+      return prevDispatcher;
+    }
   }
-}
-
-function popDispatcher(prevDispatcher) {
-  ReactCurrentDispatcher.current = prevDispatcher;
-}
 
-function pushInteractions(root) {
-  if (enableSchedulerTracing) {
-    var prevInteractions = __interactionsRef.current;
-    __interactionsRef.current = root.memoizedInteractions;
-    return prevInteractions;
+  function popDispatcher(prevDispatcher) {
+    ReactCurrentDispatcher$1.current = prevDispatcher;
   }
 
-  return null;
-}
+  function pushInteractions(root) {
+    {
+      var prevInteractions = __interactionsRef.current;
+      __interactionsRef.current = root.memoizedInteractions;
+      return prevInteractions;
+    }
+  }
 
-function popInteractions(prevInteractions) {
-  if (enableSchedulerTracing) {
-    __interactionsRef.current = prevInteractions;
+  function popInteractions(prevInteractions) {
+    {
+      __interactionsRef.current = prevInteractions;
+    }
   }
-}
 
-function markCommitTimeOfFallback() {
-  globalMostRecentFallbackTime = now();
-}
-function markRenderEventTimeAndConfig(expirationTime, suspenseConfig) {
-  if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) {
-    workInProgressRootLatestProcessedExpirationTime = expirationTime;
+  function markCommitTimeOfFallback() {
+    globalMostRecentFallbackTime = now();
   }
+  function markRenderEventTimeAndConfig(expirationTime, suspenseConfig) {
+    if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) {
+      workInProgressRootLatestProcessedExpirationTime = expirationTime;
+    }
 
-  if (suspenseConfig !== null) {
-    if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) {
-      workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad.
+    if (suspenseConfig !== null) {
+      if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) {
+        workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad.
 
-      workInProgressRootCanSuspendUsingConfig = suspenseConfig;
+        workInProgressRootCanSuspendUsingConfig = suspenseConfig;
+      }
     }
   }
-}
-function markUnprocessedUpdateTime(expirationTime) {
-  if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) {
-    workInProgressRootNextUnprocessedUpdateTime = expirationTime;
+  function markUnprocessedUpdateTime(expirationTime) {
+    if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) {
+      workInProgressRootNextUnprocessedUpdateTime = expirationTime;
+    }
   }
-}
-function renderDidSuspend() {
-  if (workInProgressRootExitStatus === RootIncomplete) {
-    workInProgressRootExitStatus = RootSuspended;
+  function renderDidSuspend() {
+    if (workInProgressRootExitStatus === RootIncomplete) {
+      workInProgressRootExitStatus = RootSuspended;
+    }
   }
-}
-function renderDidSuspendDelayIfPossible() {
-  if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) {
-    workInProgressRootExitStatus = RootSuspendedWithDelay;
-  } // Check if there's a lower priority update somewhere else in the tree.
+  function renderDidSuspendDelayIfPossible() {
+    if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) {
+      workInProgressRootExitStatus = RootSuspendedWithDelay;
+    } // Check if there's a lower priority update somewhere else in the tree.
 
 
-  if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) {
-    // Mark the current render as suspended, and then mark that there's a
-    // pending update.
-    // TODO: This should immediately interrupt the current render, instead
-    // of waiting until the next time we yield.
-    markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime);
-    markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime);
-  }
-}
-function renderDidError() {
-  if (workInProgressRootExitStatus !== RootCompleted) {
-    workInProgressRootExitStatus = RootErrored;
+    if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) {
+      // Mark the current render as suspended, and then mark that there's a
+      // pending update.
+      // TODO: This should immediately interrupt the current render, instead
+      // of waiting until the next time we yield.
+      markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime$1);
+      markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime);
+    }
   }
-} // Called during render to determine if anything has suspended.
-// Returns false if we're not sure.
-
-function renderHasNotSuspendedYet() {
-  // If something errored or completed, we can't really be sure,
-  // so those are false.
-  return workInProgressRootExitStatus === RootIncomplete;
-}
-
-function inferTimeFromExpirationTime(expirationTime) {
-  // We don't know exactly when the update was scheduled, but we can infer an
-  // approximate start time from the expiration time.
-  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);
-  return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;
-}
-
-function inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) {
-  // We don't know exactly when the update was scheduled, but we can infer an
-  // approximate start time from the expiration time by subtracting the timeout
-  // that was added to the event time.
-  var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);
-  return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);
-} // The work loop is an extremely hot path. Tell Closure not to inline it.
-
-/** @noinline */
+  function renderDidError() {
+    if (workInProgressRootExitStatus !== RootCompleted) {
+      workInProgressRootExitStatus = RootErrored;
+    }
+  } // Called during render to determine if anything has suspended.
+  // Returns false if we're not sure.
 
+  function renderHasNotSuspendedYet() {
+    // If something errored or completed, we can't really be sure,
+    // so those are false.
+    return workInProgressRootExitStatus === RootIncomplete;
+  }
 
-function workLoopSync() {
-  // Already timed out, so perform work without checking if we need to yield.
-  while (workInProgress !== null) {
-    workInProgress = performUnitOfWork(workInProgress);
+  function inferTimeFromExpirationTime(expirationTime) {
+    // We don't know exactly when the update was scheduled, but we can infer an
+    // approximate start time from the expiration time.
+    var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);
+    return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;
   }
-}
-/** @noinline */
 
+  function inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) {
+    // We don't know exactly when the update was scheduled, but we can infer an
+    // approximate start time from the expiration time by subtracting the timeout
+    // that was added to the event time.
+    var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);
+    return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);
+  } // The work loop is an extremely hot path. Tell Closure not to inline it.
 
-function workLoopConcurrent() {
-  // Perform work until Scheduler asks us to yield
-  while (workInProgress !== null && !shouldYield()) {
-    workInProgress = performUnitOfWork(workInProgress);
-  }
-}
+  /** @noinline */
 
-function performUnitOfWork(unitOfWork) {
-  // The current, flushed, state of this fiber is the alternate. Ideally
-  // nothing should rely on this, but relying on it here means that we don't
-  // need an additional field on the work in progress.
-  var current$$1 = unitOfWork.alternate;
-  startWorkTimer(unitOfWork);
-  setCurrentFiber(unitOfWork);
-  var next;
 
-  if (enableProfilerTimer && (unitOfWork.mode & ProfileMode) !== NoMode) {
-    startProfilerTimer(unitOfWork);
-    next = beginWork$$1(current$$1, unitOfWork, renderExpirationTime);
-    stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
-  } else {
-    next = beginWork$$1(current$$1, unitOfWork, renderExpirationTime);
+  function workLoopSync() {
+    // Already timed out, so perform work without checking if we need to yield.
+    while (workInProgress !== null) {
+      workInProgress = performUnitOfWork(workInProgress);
+    }
   }
+  /** @noinline */
 
-  resetCurrentFiber();
-  unitOfWork.memoizedProps = unitOfWork.pendingProps;
 
-  if (next === null) {
-    // If this doesn't spawn new work, complete the current work.
-    next = completeUnitOfWork(unitOfWork);
+  function workLoopConcurrent() {
+    // Perform work until Scheduler asks us to yield
+    while (workInProgress !== null && !shouldYield()) {
+      workInProgress = performUnitOfWork(workInProgress);
+    }
   }
 
-  ReactCurrentOwner$2.current = null;
-  return next;
-}
-
-function completeUnitOfWork(unitOfWork) {
-  // Attempt to complete the current unit of work, then move to the next
-  // sibling. If there are no more siblings, return to the parent fiber.
-  workInProgress = unitOfWork;
-
-  do {
+  function performUnitOfWork(unitOfWork) {
     // The current, flushed, state of this fiber is the alternate. Ideally
     // nothing should rely on this, but relying on it here means that we don't
     // need an additional field on the work in progress.
-    var current$$1 = workInProgress.alternate;
-    var returnFiber = workInProgress.return; // Check if the work completed or if something threw.
+    var current = unitOfWork.alternate;
+    startWorkTimer(unitOfWork);
+    setCurrentFiber(unitOfWork);
+    var next;
+
+    if ( (unitOfWork.mode & ProfileMode) !== NoMode) {
+      startProfilerTimer(unitOfWork);
+      next = beginWork$1(current, unitOfWork, renderExpirationTime$1);
+      stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
+    } else {
+      next = beginWork$1(current, unitOfWork, renderExpirationTime$1);
+    }
 
-    if ((workInProgress.effectTag & Incomplete) === NoEffect) {
-      setCurrentFiber(workInProgress);
-      var next = void 0;
+    resetCurrentFiber();
+    unitOfWork.memoizedProps = unitOfWork.pendingProps;
 
-      if (!enableProfilerTimer || (workInProgress.mode & ProfileMode) === NoMode) {
-        next = completeWork(current$$1, workInProgress, renderExpirationTime);
-      } else {
-        startProfilerTimer(workInProgress);
-        next = completeWork(current$$1, workInProgress, renderExpirationTime); // Update render duration assuming we didn't error.
+    if (next === null) {
+      // If this doesn't spawn new work, complete the current work.
+      next = completeUnitOfWork(unitOfWork);
+    }
 
-        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
-      }
+    ReactCurrentOwner$2.current = null;
+    return next;
+  }
 
-      stopWorkTimer(workInProgress);
-      resetCurrentFiber();
-      resetChildExpirationTime(workInProgress);
+  function completeUnitOfWork(unitOfWork) {
+    // Attempt to complete the current unit of work, then move to the next
+    // sibling. If there are no more siblings, return to the parent fiber.
+    workInProgress = unitOfWork;
 
-      if (next !== null) {
-        // Completing this fiber spawned new work. Work on that next.
-        return next;
-      }
+    do {
+      // The current, flushed, state of this fiber is the alternate. Ideally
+      // nothing should rely on this, but relying on it here means that we don't
+      // need an additional field on the work in progress.
+      var current = workInProgress.alternate;
+      var returnFiber = workInProgress.return; // Check if the work completed or if something threw.
+
+      if ((workInProgress.effectTag & Incomplete) === NoEffect) {
+        setCurrentFiber(workInProgress);
+        var next = void 0;
+
+        if ( (workInProgress.mode & ProfileMode) === NoMode) {
+          next = completeWork(current, workInProgress, renderExpirationTime$1);
+        } else {
+          startProfilerTimer(workInProgress);
+          next = completeWork(current, workInProgress, renderExpirationTime$1); // Update render duration assuming we didn't error.
 
-      if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete
-      (returnFiber.effectTag & Incomplete) === NoEffect) {
-        // Append all the effects of the subtree and this fiber onto the effect
-        // list of the parent. The completion order of the children affects the
-        // side-effect order.
-        if (returnFiber.firstEffect === null) {
-          returnFiber.firstEffect = workInProgress.firstEffect;
+          stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);
         }
 
-        if (workInProgress.lastEffect !== null) {
-          if (returnFiber.lastEffect !== null) {
-            returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;
+        stopWorkTimer(workInProgress);
+        resetCurrentFiber();
+        resetChildExpirationTime(workInProgress);
+
+        if (next !== null) {
+          // Completing this fiber spawned new work. Work on that next.
+          return next;
+        }
+
+        if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete
+        (returnFiber.effectTag & Incomplete) === NoEffect) {
+          // Append all the effects of the subtree and this fiber onto the effect
+          // list of the parent. The completion order of the children affects the
+          // side-effect order.
+          if (returnFiber.firstEffect === null) {
+            returnFiber.firstEffect = workInProgress.firstEffect;
+          }
+
+          if (workInProgress.lastEffect !== null) {
+            if (returnFiber.lastEffect !== null) {
+              returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;
+            }
+
+            returnFiber.lastEffect = workInProgress.lastEffect;
+          } // If this fiber had side-effects, we append it AFTER the children's
+          // side-effects. We can perform certain side-effects earlier if needed,
+          // by doing multiple passes over the effect list. We don't want to
+          // schedule our own side-effect on our own list because if end up
+          // reusing children we'll schedule this effect onto itself since we're
+          // at the end.
+
+
+          var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect
+          // list. PerformedWork effect is read by React DevTools but shouldn't be
+          // committed.
+
+          if (effectTag > PerformedWork) {
+            if (returnFiber.lastEffect !== null) {
+              returnFiber.lastEffect.nextEffect = workInProgress;
+            } else {
+              returnFiber.firstEffect = workInProgress;
+            }
+
+            returnFiber.lastEffect = workInProgress;
           }
+        }
+      } else {
+        // This fiber did not complete because something threw. Pop values off
+        // the stack without entering the complete phase. If this is a boundary,
+        // capture values if possible.
+        var _next = unwindWork(workInProgress); // Because this fiber did not complete, don't reset its expiration time.
 
-          returnFiber.lastEffect = workInProgress.lastEffect;
-        } // If this fiber had side-effects, we append it AFTER the children's
-        // side-effects. We can perform certain side-effects earlier if needed,
-        // by doing multiple passes over the effect list. We don't want to
-        // schedule our own side-effect on our own list because if end up
-        // reusing children we'll schedule this effect onto itself since we're
-        // at the end.
 
+        if ( (workInProgress.mode & ProfileMode) !== NoMode) {
+          // Record the render duration for the fiber that errored.
+          stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing.
 
-        var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect
-        // list. PerformedWork effect is read by React DevTools but shouldn't be
-        // committed.
+          var actualDuration = workInProgress.actualDuration;
+          var child = workInProgress.child;
 
-        if (effectTag > PerformedWork) {
-          if (returnFiber.lastEffect !== null) {
-            returnFiber.lastEffect.nextEffect = workInProgress;
-          } else {
-            returnFiber.firstEffect = workInProgress;
+          while (child !== null) {
+            actualDuration += child.actualDuration;
+            child = child.sibling;
           }
 
-          returnFiber.lastEffect = workInProgress;
+          workInProgress.actualDuration = actualDuration;
         }
-      }
-    } else {
-      // This fiber did not complete because something threw. Pop values off
-      // the stack without entering the complete phase. If this is a boundary,
-      // capture values if possible.
-      var _next = unwindWork(workInProgress, renderExpirationTime); // Because this fiber did not complete, don't reset its expiration time.
-
 
-      if (enableProfilerTimer && (workInProgress.mode & ProfileMode) !== NoMode) {
-        // Record the render duration for the fiber that errored.
-        stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing.
-
-        var actualDuration = workInProgress.actualDuration;
-        var child = workInProgress.child;
-
-        while (child !== null) {
-          actualDuration += child.actualDuration;
-          child = child.sibling;
+        if (_next !== null) {
+          // If completing this work spawned new work, do that next. We'll come
+          // back here again.
+          // Since we're restarting, remove anything that is not a host effect
+          // from the effect tag.
+          // TODO: The name stopFailedWorkTimer is misleading because Suspense
+          // also captures and restarts.
+          stopFailedWorkTimer(workInProgress);
+          _next.effectTag &= HostEffectMask;
+          return _next;
         }
 
-        workInProgress.actualDuration = actualDuration;
-      }
+        stopWorkTimer(workInProgress);
 
-      if (_next !== null) {
-        // If completing this work spawned new work, do that next. We'll come
-        // back here again.
-        // Since we're restarting, remove anything that is not a host effect
-        // from the effect tag.
-        // TODO: The name stopFailedWorkTimer is misleading because Suspense
-        // also captures and restarts.
-        stopFailedWorkTimer(workInProgress);
-        _next.effectTag &= HostEffectMask;
-        return _next;
+        if (returnFiber !== null) {
+          // Mark the parent fiber as incomplete and clear its effect list.
+          returnFiber.firstEffect = returnFiber.lastEffect = null;
+          returnFiber.effectTag |= Incomplete;
+        }
       }
 
-      stopWorkTimer(workInProgress);
-
-      if (returnFiber !== null) {
-        // Mark the parent fiber as incomplete and clear its effect list.
-        returnFiber.firstEffect = returnFiber.lastEffect = null;
-        returnFiber.effectTag |= Incomplete;
-      }
-    }
+      var siblingFiber = workInProgress.sibling;
 
-    var siblingFiber = workInProgress.sibling;
+      if (siblingFiber !== null) {
+        // If there is more work to do in this returnFiber, do that next.
+        return siblingFiber;
+      } // Otherwise, return to the parent
 
-    if (siblingFiber !== null) {
-      // If there is more work to do in this returnFiber, do that next.
-      return siblingFiber;
-    } // Otherwise, return to the parent
 
+      workInProgress = returnFiber;
+    } while (workInProgress !== null); // We've reached the root.
 
-    workInProgress = returnFiber;
-  } while (workInProgress !== null); // We've reached the root.
 
+    if (workInProgressRootExitStatus === RootIncomplete) {
+      workInProgressRootExitStatus = RootCompleted;
+    }
 
-  if (workInProgressRootExitStatus === RootIncomplete) {
-    workInProgressRootExitStatus = RootCompleted;
+    return null;
   }
 
-  return null;
-}
+  function getRemainingExpirationTime(fiber) {
+    var updateExpirationTime = fiber.expirationTime;
+    var childExpirationTime = fiber.childExpirationTime;
+    return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime;
+  }
 
-function getRemainingExpirationTime(fiber) {
-  var updateExpirationTime = fiber.expirationTime;
-  var childExpirationTime = fiber.childExpirationTime;
-  return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime;
-}
+  function resetChildExpirationTime(completedWork) {
+    if (renderExpirationTime$1 !== Never && completedWork.childExpirationTime === Never) {
+      // The children of this component are hidden. Don't bubble their
+      // expiration times.
+      return;
+    }
 
-function resetChildExpirationTime(completedWork) {
-  if (renderExpirationTime !== Never && completedWork.childExpirationTime === Never) {
-    // The children of this component are hidden. Don't bubble their
-    // expiration times.
-    return;
-  }
+    var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time.
 
-  var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time.
+    if ( (completedWork.mode & ProfileMode) !== NoMode) {
+      // In profiling mode, resetChildExpirationTime is also used to reset
+      // profiler durations.
+      var actualDuration = completedWork.actualDuration;
+      var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will
+      // only be updated if work is done on the fiber (i.e. it doesn't bailout).
+      // When work is done, it should bubble to the parent's actualDuration. If
+      // the fiber has not been cloned though, (meaning no work was done), then
+      // this value will reflect the amount of time spent working on a previous
+      // render. In that case it should not bubble. We determine whether it was
+      // cloned by comparing the child pointer.
 
-  if (enableProfilerTimer && (completedWork.mode & ProfileMode) !== NoMode) {
-    // In profiling mode, resetChildExpirationTime is also used to reset
-    // profiler durations.
-    var actualDuration = completedWork.actualDuration;
-    var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will
-    // only be updated if work is done on the fiber (i.e. it doesn't bailout).
-    // When work is done, it should bubble to the parent's actualDuration. If
-    // the fiber has not been cloned though, (meaning no work was done), then
-    // this value will reflect the amount of time spent working on a previous
-    // render. In that case it should not bubble. We determine whether it was
-    // cloned by comparing the child pointer.
+      var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child;
+      var child = completedWork.child;
 
-    var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child;
-    var child = completedWork.child;
+      while (child !== null) {
+        var childUpdateExpirationTime = child.expirationTime;
+        var childChildExpirationTime = child.childExpirationTime;
 
-    while (child !== null) {
-      var childUpdateExpirationTime = child.expirationTime;
-      var childChildExpirationTime = child.childExpirationTime;
+        if (childUpdateExpirationTime > newChildExpirationTime) {
+          newChildExpirationTime = childUpdateExpirationTime;
+        }
 
-      if (childUpdateExpirationTime > newChildExpirationTime) {
-        newChildExpirationTime = childUpdateExpirationTime;
-      }
+        if (childChildExpirationTime > newChildExpirationTime) {
+          newChildExpirationTime = childChildExpirationTime;
+        }
 
-      if (childChildExpirationTime > newChildExpirationTime) {
-        newChildExpirationTime = childChildExpirationTime;
-      }
+        if (shouldBubbleActualDurations) {
+          actualDuration += child.actualDuration;
+        }
 
-      if (shouldBubbleActualDurations) {
-        actualDuration += child.actualDuration;
+        treeBaseDuration += child.treeBaseDuration;
+        child = child.sibling;
       }
 
-      treeBaseDuration += child.treeBaseDuration;
-      child = child.sibling;
-    }
+      completedWork.actualDuration = actualDuration;
+      completedWork.treeBaseDuration = treeBaseDuration;
+    } else {
+      var _child = completedWork.child;
 
-    completedWork.actualDuration = actualDuration;
-    completedWork.treeBaseDuration = treeBaseDuration;
-  } else {
-    var _child = completedWork.child;
+      while (_child !== null) {
+        var _childUpdateExpirationTime = _child.expirationTime;
+        var _childChildExpirationTime = _child.childExpirationTime;
 
-    while (_child !== null) {
-      var _childUpdateExpirationTime = _child.expirationTime;
-      var _childChildExpirationTime = _child.childExpirationTime;
+        if (_childUpdateExpirationTime > newChildExpirationTime) {
+          newChildExpirationTime = _childUpdateExpirationTime;
+        }
 
-      if (_childUpdateExpirationTime > newChildExpirationTime) {
-        newChildExpirationTime = _childUpdateExpirationTime;
-      }
+        if (_childChildExpirationTime > newChildExpirationTime) {
+          newChildExpirationTime = _childChildExpirationTime;
+        }
 
-      if (_childChildExpirationTime > newChildExpirationTime) {
-        newChildExpirationTime = _childChildExpirationTime;
+        _child = _child.sibling;
       }
-
-      _child = _child.sibling;
     }
-  }
-
-  completedWork.childExpirationTime = newChildExpirationTime;
-}
-
-function commitRoot(root) {
-  var renderPriorityLevel = getCurrentPriorityLevel();
-  runWithPriority$2(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel));
-  return null;
-}
-
-function commitRootImpl(root, renderPriorityLevel) {
-  do {
-    // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which
-    // means `flushPassiveEffects` will sometimes result in additional
-    // passive effects. So we need to keep flushing in a loop until there are
-    // no more pending effects.
-    // TODO: Might be better if `flushPassiveEffects` did not automatically
-    // flush synchronous work at the end, to avoid factoring hazards like this.
-    flushPassiveEffects();
-  } while (rootWithPendingPassiveEffects !== null);
 
-  flushRenderPhaseStrictModeWarningsInDEV();
-
-  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {
-    {
-      throw Error("Should not already be working.");
-    }
+    completedWork.childExpirationTime = newChildExpirationTime;
   }
 
-  var finishedWork = root.finishedWork;
-  var expirationTime = root.finishedExpirationTime;
-
-  if (finishedWork === null) {
+  function commitRoot(root) {
+    var renderPriorityLevel = getCurrentPriorityLevel();
+    runWithPriority$1(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel));
     return null;
   }
 
-  root.finishedWork = null;
-  root.finishedExpirationTime = NoWork;
-
-  if (!(finishedWork !== root.current)) {
-    {
-      throw Error("Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.");
-    }
-  } // commitRoot never returns a continuation; it always finishes synchronously.
-  // So we can clear these now to allow a new callback to be scheduled.
-
+  function commitRootImpl(root, renderPriorityLevel) {
+    do {
+      // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which
+      // means `flushPassiveEffects` will sometimes result in additional
+      // passive effects. So we need to keep flushing in a loop until there are
+      // no more pending effects.
+      // TODO: Might be better if `flushPassiveEffects` did not automatically
+      // flush synchronous work at the end, to avoid factoring hazards like this.
+      flushPassiveEffects();
+    } while (rootWithPendingPassiveEffects !== null);
 
-  root.callbackNode = null;
-  root.callbackExpirationTime = NoWork;
-  root.callbackPriority = NoPriority;
-  root.nextKnownPendingLevel = NoWork;
-  startCommitTimer(); // Update the first and last pending times on this root. The new first
-  // pending time is whatever is left on the root fiber.
+    flushRenderPhaseStrictModeWarningsInDEV();
 
-  var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork);
-  markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit);
+    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {
+      {
+        throw Error( "Should not already be working." );
+      }
+    }
 
-  if (root === workInProgressRoot) {
-    // We can reset these now that they are finished.
-    workInProgressRoot = null;
-    workInProgress = null;
-    renderExpirationTime = NoWork;
-  } else {} // This indicates that the last root we worked on is not the same one that
-  // we're committing now. This most commonly happens when a suspended root
-  // times out.
-  // Get the list of effects.
+    var finishedWork = root.finishedWork;
+    var expirationTime = root.finishedExpirationTime;
 
+    if (finishedWork === null) {
+      return null;
+    }
 
-  var firstEffect;
+    root.finishedWork = null;
+    root.finishedExpirationTime = NoWork;
 
-  if (finishedWork.effectTag > PerformedWork) {
-    // A fiber's effect list consists only of its children, not itself. So if
-    // the root has an effect, we need to add it to the end of the list. The
-    // resulting list is the set that would belong to the root's parent, if it
-    // had one; that is, all the effects in the tree including the root.
-    if (finishedWork.lastEffect !== null) {
-      finishedWork.lastEffect.nextEffect = finishedWork;
-      firstEffect = finishedWork.firstEffect;
+    if (!(finishedWork !== root.current)) {
+      {
+        throw Error( "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." );
+      }
+    } // commitRoot never returns a continuation; it always finishes synchronously.
+    // So we can clear these now to allow a new callback to be scheduled.
+
+
+    root.callbackNode = null;
+    root.callbackExpirationTime = NoWork;
+    root.callbackPriority = NoPriority;
+    root.nextKnownPendingLevel = NoWork;
+    startCommitTimer(); // Update the first and last pending times on this root. The new first
+    // pending time is whatever is left on the root fiber.
+
+    var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork);
+    markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit);
+
+    if (root === workInProgressRoot) {
+      // We can reset these now that they are finished.
+      workInProgressRoot = null;
+      workInProgress = null;
+      renderExpirationTime$1 = NoWork;
+    } // This indicates that the last root we worked on is not the same one that
+    // we're committing now. This most commonly happens when a suspended root
+    // times out.
+    // Get the list of effects.
+
+
+    var firstEffect;
+
+    if (finishedWork.effectTag > PerformedWork) {
+      // A fiber's effect list consists only of its children, not itself. So if
+      // the root has an effect, we need to add it to the end of the list. The
+      // resulting list is the set that would belong to the root's parent, if it
+      // had one; that is, all the effects in the tree including the root.
+      if (finishedWork.lastEffect !== null) {
+        finishedWork.lastEffect.nextEffect = finishedWork;
+        firstEffect = finishedWork.firstEffect;
+      } else {
+        firstEffect = finishedWork;
+      }
     } else {
-      firstEffect = finishedWork;
+      // There is no effect on the root.
+      firstEffect = finishedWork.firstEffect;
     }
-  } else {
-    // There is no effect on the root.
-    firstEffect = finishedWork.firstEffect;
-  }
 
-  if (firstEffect !== null) {
-    var prevExecutionContext = executionContext;
-    executionContext |= CommitContext;
-    var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles
+    if (firstEffect !== null) {
+      var prevExecutionContext = executionContext;
+      executionContext |= CommitContext;
+      var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles
 
-    ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass
-    // of the effect list for each phase: all mutation effects come before all
-    // layout effects, and so on.
-    // The first phase a "before mutation" phase. We use this phase to read the
-    // state of the host tree right before we mutate it. This is where
-    // getSnapshotBeforeUpdate is called.
+      ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass
+      // of the effect list for each phase: all mutation effects come before all
+      // layout effects, and so on.
+      // The first phase a "before mutation" phase. We use this phase to read the
+      // state of the host tree right before we mutate it. This is where
+      // getSnapshotBeforeUpdate is called.
 
-    startCommitSnapshotEffectsTimer();
-    prepareForCommit(root.containerInfo);
-    nextEffect = firstEffect;
+      startCommitSnapshotEffectsTimer();
+      prepareForCommit(root.containerInfo);
+      nextEffect = firstEffect;
 
-    do {
-      {
-        invokeGuardedCallback(null, commitBeforeMutationEffects, null);
+      do {
+        {
+          invokeGuardedCallback(null, commitBeforeMutationEffects, null);
 
-        if (hasCaughtError()) {
-          if (!(nextEffect !== null)) {
-            {
-              throw Error("Should be working on an effect.");
+          if (hasCaughtError()) {
+            if (!(nextEffect !== null)) {
+              {
+                throw Error( "Should be working on an effect." );
+              }
             }
-          }
 
-          var error = clearCaughtError();
-          captureCommitPhaseError(nextEffect, error);
-          nextEffect = nextEffect.nextEffect;
+            var error = clearCaughtError();
+            captureCommitPhaseError(nextEffect, error);
+            nextEffect = nextEffect.nextEffect;
+          }
         }
-      }
-    } while (nextEffect !== null);
+      } while (nextEffect !== null);
 
-    stopCommitSnapshotEffectsTimer();
+      stopCommitSnapshotEffectsTimer();
 
-    if (enableProfilerTimer) {
-      // Mark the current commit time to be shared by all Profilers in this
-      // batch. This enables them to be grouped later.
-      recordCommitTime();
-    } // The next phase is the mutation phase, where we mutate the host tree.
+      {
+        // Mark the current commit time to be shared by all Profilers in this
+        // batch. This enables them to be grouped later.
+        recordCommitTime();
+      } // The next phase is the mutation phase, where we mutate the host tree.
 
 
-    startCommitHostEffectsTimer();
-    nextEffect = firstEffect;
+      startCommitHostEffectsTimer();
+      nextEffect = firstEffect;
 
-    do {
-      {
-        invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel);
+      do {
+        {
+          invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel);
 
-        if (hasCaughtError()) {
-          if (!(nextEffect !== null)) {
-            {
-              throw Error("Should be working on an effect.");
+          if (hasCaughtError()) {
+            if (!(nextEffect !== null)) {
+              {
+                throw Error( "Should be working on an effect." );
+              }
             }
-          }
 
-          var _error = clearCaughtError();
+            var _error = clearCaughtError();
 
-          captureCommitPhaseError(nextEffect, _error);
-          nextEffect = nextEffect.nextEffect;
+            captureCommitPhaseError(nextEffect, _error);
+            nextEffect = nextEffect.nextEffect;
+          }
         }
-      }
-    } while (nextEffect !== null);
+      } while (nextEffect !== null);
 
-    stopCommitHostEffectsTimer();
-    resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after
-    // the mutation phase, so that the previous tree is still current during
-    // componentWillUnmount, but before the layout phase, so that the finished
-    // work is current during componentDidMount/Update.
+      stopCommitHostEffectsTimer();
+      resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after
+      // the mutation phase, so that the previous tree is still current during
+      // componentWillUnmount, but before the layout phase, so that the finished
+      // work is current during componentDidMount/Update.
 
-    root.current = finishedWork; // The next phase is the layout phase, where we call effects that read
-    // the host tree after it's been mutated. The idiomatic use case for this is
-    // layout, but class component lifecycles also fire here for legacy reasons.
+      root.current = finishedWork; // The next phase is the layout phase, where we call effects that read
+      // the host tree after it's been mutated. The idiomatic use case for this is
+      // layout, but class component lifecycles also fire here for legacy reasons.
 
-    startCommitLifeCyclesTimer();
-    nextEffect = firstEffect;
+      startCommitLifeCyclesTimer();
+      nextEffect = firstEffect;
 
-    do {
-      {
-        invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime);
+      do {
+        {
+          invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime);
 
-        if (hasCaughtError()) {
-          if (!(nextEffect !== null)) {
-            {
-              throw Error("Should be working on an effect.");
+          if (hasCaughtError()) {
+            if (!(nextEffect !== null)) {
+              {
+                throw Error( "Should be working on an effect." );
+              }
             }
-          }
 
-          var _error2 = clearCaughtError();
+            var _error2 = clearCaughtError();
 
-          captureCommitPhaseError(nextEffect, _error2);
-          nextEffect = nextEffect.nextEffect;
+            captureCommitPhaseError(nextEffect, _error2);
+            nextEffect = nextEffect.nextEffect;
+          }
         }
-      }
-    } while (nextEffect !== null);
+      } while (nextEffect !== null);
 
-    stopCommitLifeCyclesTimer();
-    nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an
-    // opportunity to paint.
+      stopCommitLifeCyclesTimer();
+      nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an
+      // opportunity to paint.
 
-    requestPaint();
+      requestPaint();
 
-    if (enableSchedulerTracing) {
-      popInteractions(prevInteractions);
-    }
+      {
+        popInteractions(prevInteractions);
+      }
 
-    executionContext = prevExecutionContext;
-  } else {
-    // No effects.
-    root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were
-    // no effects.
-    // TODO: Maybe there's a better way to report this.
+      executionContext = prevExecutionContext;
+    } else {
+      // No effects.
+      root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were
+      // no effects.
+      // TODO: Maybe there's a better way to report this.
 
-    startCommitSnapshotEffectsTimer();
-    stopCommitSnapshotEffectsTimer();
+      startCommitSnapshotEffectsTimer();
+      stopCommitSnapshotEffectsTimer();
 
-    if (enableProfilerTimer) {
-      recordCommitTime();
-    }
+      {
+        recordCommitTime();
+      }
 
-    startCommitHostEffectsTimer();
-    stopCommitHostEffectsTimer();
-    startCommitLifeCyclesTimer();
-    stopCommitLifeCyclesTimer();
-  }
+      startCommitHostEffectsTimer();
+      stopCommitHostEffectsTimer();
+      startCommitLifeCyclesTimer();
+      stopCommitLifeCyclesTimer();
+    }
 
-  stopCommitTimer();
-  var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;
+    stopCommitTimer();
+    var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;
 
-  if (rootDoesHavePassiveEffects) {
-    // This commit has passive effects. Stash a reference to them. But don't
-    // schedule a callback until after flushing layout work.
-    rootDoesHavePassiveEffects = false;
-    rootWithPendingPassiveEffects = root;
-    pendingPassiveEffectsExpirationTime = expirationTime;
-    pendingPassiveEffectsRenderPriority = renderPriorityLevel;
-  } else {
-    // We are done with the effect chain at this point so let's clear the
-    // nextEffect pointers to assist with GC. If we have passive effects, we'll
-    // clear this in flushPassiveEffects.
-    nextEffect = firstEffect;
+    if (rootDoesHavePassiveEffects) {
+      // This commit has passive effects. Stash a reference to them. But don't
+      // schedule a callback until after flushing layout work.
+      rootDoesHavePassiveEffects = false;
+      rootWithPendingPassiveEffects = root;
+      pendingPassiveEffectsExpirationTime = expirationTime;
+      pendingPassiveEffectsRenderPriority = renderPriorityLevel;
+    } else {
+      // We are done with the effect chain at this point so let's clear the
+      // nextEffect pointers to assist with GC. If we have passive effects, we'll
+      // clear this in flushPassiveEffects.
+      nextEffect = firstEffect;
 
-    while (nextEffect !== null) {
-      var nextNextEffect = nextEffect.nextEffect;
-      nextEffect.nextEffect = null;
-      nextEffect = nextNextEffect;
-    }
-  } // Check if there's remaining work on this root
+      while (nextEffect !== null) {
+        var nextNextEffect = nextEffect.nextEffect;
+        nextEffect.nextEffect = null;
+        nextEffect = nextNextEffect;
+      }
+    } // Check if there's remaining work on this root
 
 
-  var remainingExpirationTime = root.firstPendingTime;
+    var remainingExpirationTime = root.firstPendingTime;
 
-  if (remainingExpirationTime !== NoWork) {
-    if (enableSchedulerTracing) {
-      if (spawnedWorkDuringRender !== null) {
-        var expirationTimes = spawnedWorkDuringRender;
-        spawnedWorkDuringRender = null;
+    if (remainingExpirationTime !== NoWork) {
+      {
+        if (spawnedWorkDuringRender !== null) {
+          var expirationTimes = spawnedWorkDuringRender;
+          spawnedWorkDuringRender = null;
 
-        for (var i = 0; i < expirationTimes.length; i++) {
-          scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions);
+          for (var i = 0; i < expirationTimes.length; i++) {
+            scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions);
+          }
         }
-      }
 
-      schedulePendingInteractions(root, remainingExpirationTime);
+        schedulePendingInteractions(root, remainingExpirationTime);
+      }
+    } else {
+      // If there's no remaining work, we can clear the set of already failed
+      // error boundaries.
+      legacyErrorBoundariesThatAlreadyFailed = null;
     }
-  } else {
-    // If there's no remaining work, we can clear the set of already failed
-    // error boundaries.
-    legacyErrorBoundariesThatAlreadyFailed = null;
-  }
 
-  if (enableSchedulerTracing) {
-    if (!rootDidHavePassiveEffects) {
-      // If there are no passive effects, then we can complete the pending interactions.
-      // Otherwise, we'll wait until after the passive effects are flushed.
-      // Wait to do this until after remaining work has been scheduled,
-      // so that we don't prematurely signal complete for interactions when there's e.g. hidden work.
-      finishPendingInteractions(root, expirationTime);
+    {
+      if (!rootDidHavePassiveEffects) {
+        // If there are no passive effects, then we can complete the pending interactions.
+        // Otherwise, we'll wait until after the passive effects are flushed.
+        // Wait to do this until after remaining work has been scheduled,
+        // so that we don't prematurely signal complete for interactions when there's e.g. hidden work.
+        finishPendingInteractions(root, expirationTime);
+      }
     }
-  }
 
-  if (remainingExpirationTime === Sync) {
-    // Count the number of times the root synchronously re-renders without
-    // finishing. If there are too many, it indicates an infinite update loop.
-    if (root === rootWithNestedUpdates) {
-      nestedUpdateCount++;
+    if (remainingExpirationTime === Sync) {
+      // Count the number of times the root synchronously re-renders without
+      // finishing. If there are too many, it indicates an infinite update loop.
+      if (root === rootWithNestedUpdates) {
+        nestedUpdateCount++;
+      } else {
+        nestedUpdateCount = 0;
+        rootWithNestedUpdates = root;
+      }
     } else {
       nestedUpdateCount = 0;
-      rootWithNestedUpdates = root;
     }
-  } else {
-    nestedUpdateCount = 0;
-  }
-
-  onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any
-  // additional work on this root is scheduled.
-
-  ensureRootIsScheduled(root);
-
-  if (hasUncaughtError) {
-    hasUncaughtError = false;
-    var _error3 = firstUncaughtError;
-    firstUncaughtError = null;
-    throw _error3;
-  }
-
-  if ((executionContext & LegacyUnbatchedContext) !== NoContext) {
-    // This is a legacy edge case. We just committed the initial mount of
-    // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired
-    // synchronously, but layout updates should be deferred until the end
-    // of the batch.
-    return null;
-  } // If layout work was scheduled, flush it now.
 
+    onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any
+    // additional work on this root is scheduled.
 
-  flushSyncCallbackQueue();
-  return null;
-}
-
-function commitBeforeMutationEffects() {
-  while (nextEffect !== null) {
-    var effectTag = nextEffect.effectTag;
+    ensureRootIsScheduled(root);
 
-    if ((effectTag & Snapshot) !== NoEffect) {
-      setCurrentFiber(nextEffect);
-      recordEffect();
-      var current$$1 = nextEffect.alternate;
-      commitBeforeMutationLifeCycles(current$$1, nextEffect);
-      resetCurrentFiber();
+    if (hasUncaughtError) {
+      hasUncaughtError = false;
+      var _error3 = firstUncaughtError;
+      firstUncaughtError = null;
+      throw _error3;
     }
 
-    if ((effectTag & Passive) !== NoEffect) {
-      // If there are passive effects, schedule a callback to flush at
-      // the earliest opportunity.
-      if (!rootDoesHavePassiveEffects) {
-        rootDoesHavePassiveEffects = true;
-        scheduleCallback(NormalPriority, function () {
-          flushPassiveEffects();
-          return null;
-        });
-      }
-    }
+    if ((executionContext & LegacyUnbatchedContext) !== NoContext) {
+      // This is a legacy edge case. We just committed the initial mount of
+      // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired
+      // synchronously, but layout updates should be deferred until the end
+      // of the batch.
+      return null;
+    } // If layout work was scheduled, flush it now.
 
-    nextEffect = nextEffect.nextEffect;
+
+    flushSyncCallbackQueue();
+    return null;
   }
-}
 
-function commitMutationEffects(root, renderPriorityLevel) {
-  // TODO: Should probably move the bulk of this function to commitWork.
-  while (nextEffect !== null) {
-    setCurrentFiber(nextEffect);
-    var effectTag = nextEffect.effectTag;
+  function commitBeforeMutationEffects() {
+    while (nextEffect !== null) {
+      var effectTag = nextEffect.effectTag;
+
+      if ((effectTag & Snapshot) !== NoEffect) {
+        setCurrentFiber(nextEffect);
+        recordEffect();
+        var current = nextEffect.alternate;
+        commitBeforeMutationLifeCycles(current, nextEffect);
+        resetCurrentFiber();
+      }
+
+      if ((effectTag & Passive) !== NoEffect) {
+        // If there are passive effects, schedule a callback to flush at
+        // the earliest opportunity.
+        if (!rootDoesHavePassiveEffects) {
+          rootDoesHavePassiveEffects = true;
+          scheduleCallback(NormalPriority, function () {
+            flushPassiveEffects();
+            return null;
+          });
+        }
+      }
 
-    if (effectTag & ContentReset) {
-      commitResetTextContent(nextEffect);
+      nextEffect = nextEffect.nextEffect;
     }
+  }
 
-    if (effectTag & Ref) {
-      var current$$1 = nextEffect.alternate;
+  function commitMutationEffects(root, renderPriorityLevel) {
+    // TODO: Should probably move the bulk of this function to commitWork.
+    while (nextEffect !== null) {
+      setCurrentFiber(nextEffect);
+      var effectTag = nextEffect.effectTag;
 
-      if (current$$1 !== null) {
-        commitDetachRef(current$$1);
+      if (effectTag & ContentReset) {
+        commitResetTextContent(nextEffect);
       }
-    } // The following switch statement is only concerned about placement,
-    // updates, and deletions. To avoid needing to add a case for every possible
-    // bitmap value, we remove the secondary effects from the effect tag and
-    // switch on that value.
-
 
-    var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating);
+      if (effectTag & Ref) {
+        var current = nextEffect.alternate;
 
-    switch (primaryEffectTag) {
-      case Placement:
-        {
-          commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is
-          // inserted, before any life-cycles like componentDidMount gets called.
-          // TODO: findDOMNode doesn't rely on this any more but isMounted does
-          // and isMounted is deprecated anyway so we should be able to kill this.
-
-          nextEffect.effectTag &= ~Placement;
-          break;
-        }
-
-      case PlacementAndUpdate:
-        {
-          // Placement
-          commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is
-          // inserted, before any life-cycles like componentDidMount gets called.
-
-          nextEffect.effectTag &= ~Placement; // Update
-
-          var _current = nextEffect.alternate;
-          commitWork(_current, nextEffect);
-          break;
-        }
-
-      case Hydrating:
-        {
-          nextEffect.effectTag &= ~Hydrating;
-          break;
+        if (current !== null) {
+          commitDetachRef(current);
         }
+      } // The following switch statement is only concerned about placement,
+      // updates, and deletions. To avoid needing to add a case for every possible
+      // bitmap value, we remove the secondary effects from the effect tag and
+      // switch on that value.
 
-      case HydratingAndUpdate:
-        {
-          nextEffect.effectTag &= ~Hydrating; // Update
 
-          var _current2 = nextEffect.alternate;
-          commitWork(_current2, nextEffect);
-          break;
-        }
+      var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating);
 
-      case Update:
-        {
-          var _current3 = nextEffect.alternate;
-          commitWork(_current3, nextEffect);
-          break;
-        }
+      switch (primaryEffectTag) {
+        case Placement:
+          {
+            commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is
+            // inserted, before any life-cycles like componentDidMount gets called.
+            // TODO: findDOMNode doesn't rely on this any more but isMounted does
+            // and isMounted is deprecated anyway so we should be able to kill this.
 
-      case Deletion:
-        {
-          commitDeletion(root, nextEffect, renderPriorityLevel);
-          break;
-        }
-    } // TODO: Only record a mutation effect if primaryEffectTag is non-zero.
+            nextEffect.effectTag &= ~Placement;
+            break;
+          }
 
+        case PlacementAndUpdate:
+          {
+            // Placement
+            commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is
+            // inserted, before any life-cycles like componentDidMount gets called.
 
-    recordEffect();
-    resetCurrentFiber();
-    nextEffect = nextEffect.nextEffect;
-  }
-}
+            nextEffect.effectTag &= ~Placement; // Update
 
-function commitLayoutEffects(root, committedExpirationTime) {
-  // TODO: Should probably move the bulk of this function to commitWork.
-  while (nextEffect !== null) {
-    setCurrentFiber(nextEffect);
-    var effectTag = nextEffect.effectTag;
+            var _current = nextEffect.alternate;
+            commitWork(_current, nextEffect);
+            break;
+          }
 
-    if (effectTag & (Update | Callback)) {
-      recordEffect();
-      var current$$1 = nextEffect.alternate;
-      commitLifeCycles(root, current$$1, nextEffect, committedExpirationTime);
-    }
+        case Hydrating:
+          {
+            nextEffect.effectTag &= ~Hydrating;
+            break;
+          }
 
-    if (effectTag & Ref) {
-      recordEffect();
-      commitAttachRef(nextEffect);
-    }
+        case HydratingAndUpdate:
+          {
+            nextEffect.effectTag &= ~Hydrating; // Update
 
-    resetCurrentFiber();
-    nextEffect = nextEffect.nextEffect;
-  }
-}
+            var _current2 = nextEffect.alternate;
+            commitWork(_current2, nextEffect);
+            break;
+          }
 
-function flushPassiveEffects() {
-  if (pendingPassiveEffectsRenderPriority !== NoPriority) {
-    var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority;
-    pendingPassiveEffectsRenderPriority = NoPriority;
-    return runWithPriority$2(priorityLevel, flushPassiveEffectsImpl);
-  }
-}
+        case Update:
+          {
+            var _current3 = nextEffect.alternate;
+            commitWork(_current3, nextEffect);
+            break;
+          }
 
-function flushPassiveEffectsImpl() {
-  if (rootWithPendingPassiveEffects === null) {
-    return false;
-  }
+        case Deletion:
+          {
+            commitDeletion(root, nextEffect, renderPriorityLevel);
+            break;
+          }
+      } // TODO: Only record a mutation effect if primaryEffectTag is non-zero.
 
-  var root = rootWithPendingPassiveEffects;
-  var expirationTime = pendingPassiveEffectsExpirationTime;
-  rootWithPendingPassiveEffects = null;
-  pendingPassiveEffectsExpirationTime = NoWork;
 
-  if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {
-    {
-      throw Error("Cannot flush passive effects while already rendering.");
+      recordEffect();
+      resetCurrentFiber();
+      nextEffect = nextEffect.nextEffect;
     }
   }
 
-  var prevExecutionContext = executionContext;
-  executionContext |= CommitContext;
-  var prevInteractions = pushInteractions(root); // Note: This currently assumes there are no passive effects on the root
-  // fiber, because the root is not part of its own effect list. This could
-  // change in the future.
-
-  var effect = root.current.firstEffect;
-
-  while (effect !== null) {
-    {
-      setCurrentFiber(effect);
-      invokeGuardedCallback(null, commitPassiveHookEffects, null, effect);
+  function commitLayoutEffects(root, committedExpirationTime) {
+    // TODO: Should probably move the bulk of this function to commitWork.
+    while (nextEffect !== null) {
+      setCurrentFiber(nextEffect);
+      var effectTag = nextEffect.effectTag;
 
-      if (hasCaughtError()) {
-        if (!(effect !== null)) {
-          {
-            throw Error("Should be working on an effect.");
-          }
-        }
+      if (effectTag & (Update | Callback)) {
+        recordEffect();
+        var current = nextEffect.alternate;
+        commitLifeCycles(root, current, nextEffect);
+      }
 
-        var error = clearCaughtError();
-        captureCommitPhaseError(effect, error);
+      if (effectTag & Ref) {
+        recordEffect();
+        commitAttachRef(nextEffect);
       }
 
       resetCurrentFiber();
+      nextEffect = nextEffect.nextEffect;
     }
-
-    var nextNextEffect = effect.nextEffect; // Remove nextEffect pointer to assist GC
-
-    effect.nextEffect = null;
-    effect = nextNextEffect;
   }
 
-  if (enableSchedulerTracing) {
-    popInteractions(prevInteractions);
-    finishPendingInteractions(root, expirationTime);
+  function flushPassiveEffects() {
+    if (pendingPassiveEffectsRenderPriority !== NoPriority) {
+      var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority;
+      pendingPassiveEffectsRenderPriority = NoPriority;
+      return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl);
+    }
   }
 
-  executionContext = prevExecutionContext;
-  flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this
-  // exceeds the limit, we'll fire a warning.
-
-  nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1;
-  return true;
-}
-
-function isAlreadyFailedLegacyErrorBoundary(instance) {
-  return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
-}
-function markLegacyErrorBoundaryAsFailed(instance) {
-  if (legacyErrorBoundariesThatAlreadyFailed === null) {
-    legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
-  } else {
-    legacyErrorBoundariesThatAlreadyFailed.add(instance);
-  }
-}
+  function flushPassiveEffectsImpl() {
+    if (rootWithPendingPassiveEffects === null) {
+      return false;
+    }
 
-function prepareToThrowUncaughtError(error) {
-  if (!hasUncaughtError) {
-    hasUncaughtError = true;
-    firstUncaughtError = error;
-  }
-}
+    var root = rootWithPendingPassiveEffects;
+    var expirationTime = pendingPassiveEffectsExpirationTime;
+    rootWithPendingPassiveEffects = null;
+    pendingPassiveEffectsExpirationTime = NoWork;
 
-var onUncaughtError = prepareToThrowUncaughtError;
+    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {
+      {
+        throw Error( "Cannot flush passive effects while already rendering." );
+      }
+    }
 
-function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {
-  var errorInfo = createCapturedValue(error, sourceFiber);
-  var update = createRootErrorUpdate(rootFiber, errorInfo, Sync);
-  enqueueUpdate(rootFiber, update);
-  var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync);
+    var prevExecutionContext = executionContext;
+    executionContext |= CommitContext;
+    var prevInteractions = pushInteractions(root);
 
-  if (root !== null) {
-    ensureRootIsScheduled(root);
-    schedulePendingInteractions(root, Sync);
-  }
-}
+    {
+      // Note: This currently assumes there are no passive effects on the root fiber
+      // because the root is not part of its own effect list.
+      // This could change in the future.
+      var _effect2 = root.current.firstEffect;
 
-function captureCommitPhaseError(sourceFiber, error) {
-  if (sourceFiber.tag === HostRoot) {
-    // Error was thrown at the root. There is no parent, so the root
-    // itself should capture it.
-    captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);
-    return;
-  }
+      while (_effect2 !== null) {
+        {
+          setCurrentFiber(_effect2);
+          invokeGuardedCallback(null, commitPassiveHookEffects, null, _effect2);
 
-  var fiber = sourceFiber.return;
+          if (hasCaughtError()) {
+            if (!(_effect2 !== null)) {
+              {
+                throw Error( "Should be working on an effect." );
+              }
+            }
 
-  while (fiber !== null) {
-    if (fiber.tag === HostRoot) {
-      captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);
-      return;
-    } else if (fiber.tag === ClassComponent) {
-      var ctor = fiber.type;
-      var instance = fiber.stateNode;
+            var _error5 = clearCaughtError();
 
-      if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
-        var errorInfo = createCapturedValue(error, sourceFiber);
-        var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync
-        Sync);
-        enqueueUpdate(fiber, update);
-        var root = markUpdateTimeFromFiberToRoot(fiber, Sync);
+            captureCommitPhaseError(_effect2, _error5);
+          }
 
-        if (root !== null) {
-          ensureRootIsScheduled(root);
-          schedulePendingInteractions(root, Sync);
+          resetCurrentFiber();
         }
 
-        return;
+        var nextNextEffect = _effect2.nextEffect; // Remove nextEffect pointer to assist GC
+
+        _effect2.nextEffect = null;
+        _effect2 = nextNextEffect;
       }
     }
 
-    fiber = fiber.return;
-  }
-}
-function pingSuspendedRoot(root, thenable, suspendedTime) {
-  var pingCache = root.pingCache;
+    {
+      popInteractions(prevInteractions);
+      finishPendingInteractions(root, expirationTime);
+    }
+
+    executionContext = prevExecutionContext;
+    flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this
+    // exceeds the limit, we'll fire a warning.
 
-  if (pingCache !== null) {
-    // The thenable resolved, so we no longer need to memoize, because it will
-    // never be thrown again.
-    pingCache.delete(thenable);
+    nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1;
+    return true;
   }
 
-  if (workInProgressRoot === root && renderExpirationTime === suspendedTime) {
-    // Received a ping at the same priority level at which we're currently
-    // rendering. We might want to restart this render. This should mirror
-    // the logic of whether or not a root suspends once it completes.
-    // TODO: If we're rendering sync either due to Sync, Batched or expired,
-    // we should probably never restart.
-    // If we're suspended with delay, we'll always suspend so we can always
-    // restart. If we're suspended without any updates, it might be a retry.
-    // If it's early in the retry we can restart. We can't know for sure
-    // whether we'll eventually process an update during this render pass,
-    // but it's somewhat unlikely that we get to a ping before that, since
-    // getting to the root most update is usually very fast.
-    if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {
-      // Restart from the root. Don't need to schedule a ping because
-      // we're already working on this tree.
-      prepareFreshStack(root, renderExpirationTime);
+  function isAlreadyFailedLegacyErrorBoundary(instance) {
+    return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
+  }
+  function markLegacyErrorBoundaryAsFailed(instance) {
+    if (legacyErrorBoundariesThatAlreadyFailed === null) {
+      legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
     } else {
-      // Even though we can't restart right now, we might get an
-      // opportunity later. So we mark this render as having a ping.
-      workInProgressRootHasPendingPing = true;
+      legacyErrorBoundariesThatAlreadyFailed.add(instance);
     }
+  }
 
-    return;
+  function prepareToThrowUncaughtError(error) {
+    if (!hasUncaughtError) {
+      hasUncaughtError = true;
+      firstUncaughtError = error;
+    }
   }
 
-  if (!isRootSuspendedAtTime(root, suspendedTime)) {
-    // The root is no longer suspended at this time.
-    return;
+  var onUncaughtError = prepareToThrowUncaughtError;
+
+  function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {
+    var errorInfo = createCapturedValue(error, sourceFiber);
+    var update = createRootErrorUpdate(rootFiber, errorInfo, Sync);
+    enqueueUpdate(rootFiber, update);
+    var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync);
+
+    if (root !== null) {
+      ensureRootIsScheduled(root);
+      schedulePendingInteractions(root, Sync);
+    }
   }
 
-  var lastPingedTime = root.lastPingedTime;
+  function captureCommitPhaseError(sourceFiber, error) {
+    if (sourceFiber.tag === HostRoot) {
+      // Error was thrown at the root. There is no parent, so the root
+      // itself should capture it.
+      captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);
+      return;
+    }
 
-  if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) {
-    // There's already a lower priority ping scheduled.
-    return;
-  } // Mark the time at which this ping was scheduled.
+    var fiber = sourceFiber.return;
 
+    while (fiber !== null) {
+      if (fiber.tag === HostRoot) {
+        captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);
+        return;
+      } else if (fiber.tag === ClassComponent) {
+        var ctor = fiber.type;
+        var instance = fiber.stateNode;
+
+        if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
+          var errorInfo = createCapturedValue(error, sourceFiber);
+          var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync
+          Sync);
+          enqueueUpdate(fiber, update);
+          var root = markUpdateTimeFromFiberToRoot(fiber, Sync);
+
+          if (root !== null) {
+            ensureRootIsScheduled(root);
+            schedulePendingInteractions(root, Sync);
+          }
 
-  root.lastPingedTime = suspendedTime;
+          return;
+        }
+      }
 
-  if (root.finishedExpirationTime === suspendedTime) {
-    // If there's a pending fallback waiting to commit, throw it away.
-    root.finishedExpirationTime = NoWork;
-    root.finishedWork = null;
+      fiber = fiber.return;
+    }
   }
+  function pingSuspendedRoot(root, thenable, suspendedTime) {
+    var pingCache = root.pingCache;
+
+    if (pingCache !== null) {
+      // The thenable resolved, so we no longer need to memoize, because it will
+      // never be thrown again.
+      pingCache.delete(thenable);
+    }
+
+    if (workInProgressRoot === root && renderExpirationTime$1 === suspendedTime) {
+      // Received a ping at the same priority level at which we're currently
+      // rendering. We might want to restart this render. This should mirror
+      // the logic of whether or not a root suspends once it completes.
+      // TODO: If we're rendering sync either due to Sync, Batched or expired,
+      // we should probably never restart.
+      // If we're suspended with delay, we'll always suspend so we can always
+      // restart. If we're suspended without any updates, it might be a retry.
+      // If it's early in the retry we can restart. We can't know for sure
+      // whether we'll eventually process an update during this render pass,
+      // but it's somewhat unlikely that we get to a ping before that, since
+      // getting to the root most update is usually very fast.
+      if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {
+        // Restart from the root. Don't need to schedule a ping because
+        // we're already working on this tree.
+        prepareFreshStack(root, renderExpirationTime$1);
+      } else {
+        // Even though we can't restart right now, we might get an
+        // opportunity later. So we mark this render as having a ping.
+        workInProgressRootHasPendingPing = true;
+      }
 
-  ensureRootIsScheduled(root);
-  schedulePendingInteractions(root, suspendedTime);
-}
-
-function retryTimedOutBoundary(boundaryFiber, retryTime) {
-  // The boundary fiber (a Suspense component or SuspenseList component)
-  // previously was rendered in its fallback state. One of the promises that
-  // suspended it has resolved, which means at least part of the tree was
-  // likely unblocked. Try rendering again, at a new expiration time.
-  if (retryTime === NoWork) {
-    var suspenseConfig = null; // Retries don't carry over the already committed update.
+      return;
+    }
 
-    var currentTime = requestCurrentTimeForUpdate();
-    retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig);
-  } // TODO: Special case idle priority?
+    if (!isRootSuspendedAtTime(root, suspendedTime)) {
+      // The root is no longer suspended at this time.
+      return;
+    }
 
+    var lastPingedTime = root.lastPingedTime;
 
-  var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime);
+    if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) {
+      // There's already a lower priority ping scheduled.
+      return;
+    } // Mark the time at which this ping was scheduled.
 
-  if (root !== null) {
-    ensureRootIsScheduled(root);
-    schedulePendingInteractions(root, retryTime);
-  }
-}
 
-function retryDehydratedSuspenseBoundary(boundaryFiber) {
-  var suspenseState = boundaryFiber.memoizedState;
-  var retryTime = NoWork;
+    root.lastPingedTime = suspendedTime;
 
-  if (suspenseState !== null) {
-    retryTime = suspenseState.retryTime;
+    ensureRootIsScheduled(root);
+    schedulePendingInteractions(root, suspendedTime);
   }
 
-  retryTimedOutBoundary(boundaryFiber, retryTime);
-}
-function resolveRetryThenable(boundaryFiber, thenable) {
-  var retryTime = NoWork; // Default
+  function retryTimedOutBoundary(boundaryFiber, retryTime) {
+    // The boundary fiber (a Suspense component or SuspenseList component)
+    // previously was rendered in its fallback state. One of the promises that
+    // suspended it has resolved, which means at least part of the tree was
+    // likely unblocked. Try rendering again, at a new expiration time.
+    if (retryTime === NoWork) {
+      var suspenseConfig = null; // Retries don't carry over the already committed update.
 
-  var retryCache;
+      var currentTime = requestCurrentTimeForUpdate();
+      retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig);
+    } // TODO: Special case idle priority?
 
-  if (enableSuspenseServerRenderer) {
-    switch (boundaryFiber.tag) {
-      case SuspenseComponent:
-        retryCache = boundaryFiber.stateNode;
-        var suspenseState = boundaryFiber.memoizedState;
 
-        if (suspenseState !== null) {
-          retryTime = suspenseState.retryTime;
-        }
+    var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime);
 
-        break;
+    if (root !== null) {
+      ensureRootIsScheduled(root);
+      schedulePendingInteractions(root, retryTime);
+    }
+  }
+  function resolveRetryThenable(boundaryFiber, thenable) {
+    var retryTime = NoWork; // Default
 
-      case SuspenseListComponent:
-        retryCache = boundaryFiber.stateNode;
-        break;
+    var retryCache;
 
-      default:
-        {
-          {
-            throw Error("Pinged unknown suspense boundary type. This is probably a bug in React.");
-          }
-        }
+    {
+      retryCache = boundaryFiber.stateNode;
+    }
 
+    if (retryCache !== null) {
+      // The thenable resolved, so we no longer need to memoize, because it will
+      // never be thrown again.
+      retryCache.delete(thenable);
     }
-  } else {
-    retryCache = boundaryFiber.stateNode;
-  }
 
-  if (retryCache !== null) {
-    // The thenable resolved, so we no longer need to memoize, because it will
-    // never be thrown again.
-    retryCache.delete(thenable);
+    retryTimedOutBoundary(boundaryFiber, retryTime);
+  } // Computes the next Just Noticeable Difference (JND) boundary.
+  // The theory is that a person can't tell the difference between small differences in time.
+  // Therefore, if we wait a bit longer than necessary that won't translate to a noticeable
+  // difference in the experience. However, waiting for longer might mean that we can avoid
+  // showing an intermediate loading state. The longer we have already waited, the harder it
+  // is to tell small differences in time. Therefore, the longer we've already waited,
+  // the longer we can wait additionally. At some point we have to give up though.
+  // We pick a train model where the next boundary commits at a consistent schedule.
+  // These particular numbers are vague estimates. We expect to adjust them based on research.
+
+  function jnd(timeElapsed) {
+    return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;
   }
 
-  retryTimedOutBoundary(boundaryFiber, retryTime);
-} // Computes the next Just Noticeable Difference (JND) boundary.
-// The theory is that a person can't tell the difference between small differences in time.
-// Therefore, if we wait a bit longer than necessary that won't translate to a noticeable
-// difference in the experience. However, waiting for longer might mean that we can avoid
-// showing an intermediate loading state. The longer we have already waited, the harder it
-// is to tell small differences in time. Therefore, the longer we've already waited,
-// the longer we can wait additionally. At some point we have to give up though.
-// We pick a train model where the next boundary commits at a consistent schedule.
-// These particular numbers are vague estimates. We expect to adjust them based on research.
+  function computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) {
+    var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0;
 
-function jnd(timeElapsed) {
-  return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;
-}
+    if (busyMinDurationMs <= 0) {
+      return 0;
+    }
 
-function computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) {
-  var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0;
+    var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire.
 
-  if (busyMinDurationMs <= 0) {
-    return 0;
-  }
+    var currentTimeMs = now();
+    var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig);
+    var timeElapsed = currentTimeMs - eventTimeMs;
 
-  var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire.
+    if (timeElapsed <= busyDelayMs) {
+      // If we haven't yet waited longer than the initial delay, we don't
+      // have to wait any additional time.
+      return 0;
+    }
 
-  var currentTimeMs = now();
-  var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig);
-  var timeElapsed = currentTimeMs - eventTimeMs;
+    var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`.
 
-  if (timeElapsed <= busyDelayMs) {
-    // If we haven't yet waited longer than the initial delay, we don't
-    // have to wait any additional time.
-    return 0;
+    return msUntilTimeout;
   }
 
-  var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`.
-
-  return msUntilTimeout;
-}
-
-function checkForNestedUpdates() {
-  if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
-    nestedUpdateCount = 0;
-    rootWithNestedUpdates = null;
+  function checkForNestedUpdates() {
+    if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
+      nestedUpdateCount = 0;
+      rootWithNestedUpdates = null;
 
-    {
       {
-        throw Error("Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.");
+        {
+          throw Error( "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops." );
+        }
       }
     }
-  }
 
-  {
-    if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {
-      nestedPassiveUpdateCount = 0;
-      warning$1(false, 'Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');
+    {
+      if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {
+        nestedPassiveUpdateCount = 0;
+
+        error('Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');
+      }
     }
   }
-}
 
-function flushRenderPhaseStrictModeWarningsInDEV() {
-  {
-    ReactStrictModeWarnings.flushLegacyContextWarning();
+  function flushRenderPhaseStrictModeWarningsInDEV() {
+    {
+      ReactStrictModeWarnings.flushLegacyContextWarning();
 
-    if (warnAboutDeprecatedLifecycles) {
-      ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
+      {
+        ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
+      }
     }
   }
-}
 
-function stopFinishedWorkLoopTimer() {
-  var didCompleteRoot = true;
-  stopWorkLoopTimer(interruptedBy, didCompleteRoot);
-  interruptedBy = null;
-}
+  function stopFinishedWorkLoopTimer() {
+    var didCompleteRoot = true;
+    stopWorkLoopTimer(interruptedBy, didCompleteRoot);
+    interruptedBy = null;
+  }
 
-function stopInterruptedWorkLoopTimer() {
-  // TODO: Track which fiber caused the interruption.
-  var didCompleteRoot = false;
-  stopWorkLoopTimer(interruptedBy, didCompleteRoot);
-  interruptedBy = null;
-}
+  function stopInterruptedWorkLoopTimer() {
+    // TODO: Track which fiber caused the interruption.
+    var didCompleteRoot = false;
+    stopWorkLoopTimer(interruptedBy, didCompleteRoot);
+    interruptedBy = null;
+  }
 
-function checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) {
-  if (enableUserTimingAPI && workInProgressRoot !== null && updateExpirationTime > renderExpirationTime) {
-    interruptedBy = fiberThatReceivedUpdate;
+  function checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) {
+    if ( workInProgressRoot !== null && updateExpirationTime > renderExpirationTime$1) {
+      interruptedBy = fiberThatReceivedUpdate;
+    }
   }
-}
 
-var didWarnStateUpdateForUnmountedComponent = null;
+  var didWarnStateUpdateForUnmountedComponent = null;
 
-function warnAboutUpdateOnUnmountedFiberInDEV(fiber) {
-  {
-    var tag = fiber.tag;
+  function warnAboutUpdateOnUnmountedFiberInDEV(fiber) {
+    {
+      var tag = fiber.tag;
 
-    if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent) {
-      // Only warn for user-defined components, not internal ones like Suspense.
-      return;
-    } // We show the whole stack but dedupe on the top component's name because
-    // the problematic code almost always lies inside that component.
+      if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) {
+        // Only warn for user-defined components, not internal ones like Suspense.
+        return;
+      }
+      // the problematic code almost always lies inside that component.
 
 
-    var componentName = getComponentName(fiber.type) || 'ReactComponent';
+      var componentName = getComponentName(fiber.type) || 'ReactComponent';
 
-    if (didWarnStateUpdateForUnmountedComponent !== null) {
-      if (didWarnStateUpdateForUnmountedComponent.has(componentName)) {
-        return;
+      if (didWarnStateUpdateForUnmountedComponent !== null) {
+        if (didWarnStateUpdateForUnmountedComponent.has(componentName)) {
+          return;
+        }
+
+        didWarnStateUpdateForUnmountedComponent.add(componentName);
+      } else {
+        didWarnStateUpdateForUnmountedComponent = new Set([componentName]);
       }
 
-      didWarnStateUpdateForUnmountedComponent.add(componentName);
-    } else {
-      didWarnStateUpdateForUnmountedComponent = new Set([componentName]);
+      error("Can't perform a React state update on an unmounted component. This " + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber));
     }
-
-    warningWithoutStack$1(false, "Can't perform a React state update on an unmounted component. This " + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber));
   }
-}
 
-var beginWork$$1;
+  var beginWork$1;
 
-if (true && replayFailedUnitOfWorkWithInvokeGuardedCallback) {
-  var dummyFiber = null;
+  {
+    var dummyFiber = null;
 
-  beginWork$$1 = function (current$$1, unitOfWork, expirationTime) {
-    // If a component throws an error, we replay it again in a synchronously
-    // dispatched event, so that the debugger will treat it as an uncaught
-    // error See ReactErrorUtils for more information.
-    // Before entering the begin phase, copy the work-in-progress onto a dummy
-    // fiber. If beginWork throws, we'll use this to reset the state.
-    var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);
+    beginWork$1 = function (current, unitOfWork, expirationTime) {
+      // If a component throws an error, we replay it again in a synchronously
+      // dispatched event, so that the debugger will treat it as an uncaught
+      // error See ReactErrorUtils for more information.
+      // Before entering the begin phase, copy the work-in-progress onto a dummy
+      // fiber. If beginWork throws, we'll use this to reset the state.
+      var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);
 
-    try {
-      return beginWork$1(current$$1, unitOfWork, expirationTime);
-    } catch (originalError) {
-      if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {
-        // Don't replay promises. Treat everything else like an error.
-        throw originalError;
-      } // Keep this code in sync with handleError; any changes here must have
-      // corresponding changes there.
+      try {
+        return beginWork(current, unitOfWork, expirationTime);
+      } catch (originalError) {
+        if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {
+          // Don't replay promises. Treat everything else like an error.
+          throw originalError;
+        } // Keep this code in sync with handleError; any changes here must have
+        // corresponding changes there.
 
 
-      resetContextDependencies();
-      resetHooks(); // Don't reset current debug fiber, since we're about to work on the
-      // same fiber again.
-      // Unwind the failed stack frame
+        resetContextDependencies();
+        resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the
+        // same fiber again.
+        // Unwind the failed stack frame
 
-      unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber.
+        unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber.
 
-      assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);
+        assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);
 
-      if (enableProfilerTimer && unitOfWork.mode & ProfileMode) {
-        // Reset the profiler timer.
-        startProfilerTimer(unitOfWork);
-      } // Run beginWork again.
+        if ( unitOfWork.mode & ProfileMode) {
+          // Reset the profiler timer.
+          startProfilerTimer(unitOfWork);
+        } // Run beginWork again.
 
 
-      invokeGuardedCallback(null, beginWork$1, null, current$$1, unitOfWork, expirationTime);
+        invokeGuardedCallback(null, beginWork, null, current, unitOfWork, expirationTime);
 
-      if (hasCaughtError()) {
-        var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`.
-        // Rethrow this error instead of the original one.
+        if (hasCaughtError()) {
+          var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`.
+          // Rethrow this error instead of the original one.
 
-        throw replayError;
-      } else {
-        // This branch is reachable if the render phase is impure.
-        throw originalError;
+          throw replayError;
+        } else {
+          // This branch is reachable if the render phase is impure.
+          throw originalError;
+        }
       }
-    }
-  };
-} else {
-  beginWork$$1 = beginWork$1;
-}
+    };
+  }
 
-var didWarnAboutUpdateInRender = false;
-var didWarnAboutUpdateInGetChildContext = false;
+  var didWarnAboutUpdateInRender = false;
+  var didWarnAboutUpdateInRenderForAnotherComponent;
 
-function warnAboutInvalidUpdatesOnClassComponentsInDEV(fiber) {
   {
-    if (fiber.tag === ClassComponent) {
-      switch (phase) {
-        case 'getChildContext':
-          if (didWarnAboutUpdateInGetChildContext) {
-            return;
-          }
+    didWarnAboutUpdateInRenderForAnotherComponent = new Set();
+  }
 
-          warningWithoutStack$1(false, 'setState(...): Cannot call setState() inside getChildContext()');
-          didWarnAboutUpdateInGetChildContext = true;
-          break;
+  function warnAboutRenderPhaseUpdatesInDEV(fiber) {
+    {
+      if (isRendering && (executionContext & RenderContext) !== NoContext) {
+        switch (fiber.tag) {
+          case FunctionComponent:
+          case ForwardRef:
+          case SimpleMemoComponent:
+            {
+              var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.
 
-        case 'render':
-          if (didWarnAboutUpdateInRender) {
-            return;
-          }
+              var dedupeKey = renderingComponentName;
 
-          warningWithoutStack$1(false, 'Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure function of ' + 'props and state.');
-          didWarnAboutUpdateInRender = true;
-          break;
+              if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {
+                didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);
+                var setStateComponentName = getComponentName(fiber.type) || 'Unknown';
+
+                error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://fb.me/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);
+              }
+
+              break;
+            }
+
+          case ClassComponent:
+            {
+              if (!didWarnAboutUpdateInRender) {
+                error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');
+
+                didWarnAboutUpdateInRender = true;
+              }
+
+              break;
+            }
+        }
       }
     }
-  }
-} // a 'shared' variable that changes when act() opens/closes in tests.
+  } // a 'shared' variable that changes when act() opens/closes in tests.
 
 
-var IsThisRendererActing = {
-  current: false
-};
-function warnIfNotScopedWithMatchingAct(fiber) {
-  {
-    if (warnsIfNotActing === true && IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) {
-      warningWithoutStack$1(false, "It looks like you're using the wrong act() around your test interactions.\n" + 'Be sure to use the matching version of act() corresponding to your renderer:\n\n' + '// for react-dom:\n' + "import {act} from 'react-dom/test-utils';\n" + '// ...\n' + 'act(() => ...);\n\n' + '// for react-test-renderer:\n' + "import TestRenderer from 'react-test-renderer';\n" + 'const {act} = TestRenderer;\n' + '// ...\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber));
+  var IsThisRendererActing = {
+    current: false
+  };
+  function warnIfNotScopedWithMatchingAct(fiber) {
+    {
+      if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) {
+        error("It looks like you're using the wrong act() around your test interactions.\n" + 'Be sure to use the matching version of act() corresponding to your renderer:\n\n' + '// for react-dom:\n' + "import {act} from 'react-dom/test-utils';\n" + '// ...\n' + 'act(() => ...);\n\n' + '// for react-test-renderer:\n' + "import TestRenderer from 'react-test-renderer';\n" + 'const {act} = TestRenderer;\n' + '// ...\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber));
+      }
     }
   }
-}
-function warnIfNotCurrentlyActingEffectsInDEV(fiber) {
-  {
-    if (warnsIfNotActing === true && (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {
-      warningWithoutStack$1(false, 'An update to %s ran an effect, but was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + '  /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));
+  function warnIfNotCurrentlyActingEffectsInDEV(fiber) {
+    {
+      if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {
+        error('An update to %s ran an effect, but was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + '  /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));
+      }
     }
   }
-}
 
-function warnIfNotCurrentlyActingUpdatesInDEV(fiber) {
-  {
-    if (warnsIfNotActing === true && executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {
-      warningWithoutStack$1(false, 'An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + '  /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));
+  function warnIfNotCurrentlyActingUpdatesInDEV(fiber) {
+    {
+      if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {
+        error('An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + '  /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));
+      }
     }
   }
-}
 
-var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler.
+  var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler.
 
-var didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked
-// scheduler is the actual recommendation. The alternative could be a testing build,
-// a new lib, or whatever; we dunno just yet. This message is for early adopters
-// to get their tests right.
+  var didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked
+  // scheduler is the actual recommendation. The alternative could be a testing build,
+  // a new lib, or whatever; we dunno just yet. This message is for early adopters
+  // to get their tests right.
 
-function warnIfUnmockedScheduler(fiber) {
-  {
-    if (didWarnAboutUnmockedScheduler === false && unstable_flushAllWithoutAsserting === undefined) {
-      if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) {
-        didWarnAboutUnmockedScheduler = true;
-        warningWithoutStack$1(false, 'In Concurrent or Sync modes, the "scheduler" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + "jest.mock('scheduler', () => require('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://fb.me/react-mock-scheduler');
-      } else if (warnAboutUnmockedScheduler === true) {
-        didWarnAboutUnmockedScheduler = true;
-        warningWithoutStack$1(false, 'Starting from React v17, the "scheduler" module will need to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + "jest.mock('scheduler', () => require('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://fb.me/react-mock-scheduler');
+  function warnIfUnmockedScheduler(fiber) {
+    {
+      if (didWarnAboutUnmockedScheduler === false && unstable_flushAllWithoutAsserting === undefined) {
+        if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) {
+          didWarnAboutUnmockedScheduler = true;
+
+          error('In Concurrent or Sync modes, the "scheduler" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + "jest.mock('scheduler', () => require('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://fb.me/react-mock-scheduler');
+        }
       }
     }
   }
-}
-var componentsThatTriggeredHighPriSuspend = null;
-function checkForWrongSuspensePriorityInDEV(sourceFiber) {
-  {
-    var currentPriorityLevel = getCurrentPriorityLevel();
-
-    if ((sourceFiber.mode & ConcurrentMode) !== NoEffect && (currentPriorityLevel === UserBlockingPriority$2 || currentPriorityLevel === ImmediatePriority)) {
-      var workInProgressNode = sourceFiber;
-
-      while (workInProgressNode !== null) {
-        // Add the component that triggered the suspense
-        var current$$1 = workInProgressNode.alternate;
-
-        if (current$$1 !== null) {
-          // TODO: warn component that triggers the high priority
-          // suspend is the HostRoot
-          switch (workInProgressNode.tag) {
-            case ClassComponent:
-              // Loop through the component's update queue and see whether the component
-              // has triggered any high priority updates
-              var updateQueue = current$$1.updateQueue;
-
-              if (updateQueue !== null) {
-                var update = updateQueue.firstUpdate;
-
-                while (update !== null) {
-                  var priorityLevel = update.priority;
-
-                  if (priorityLevel === UserBlockingPriority$2 || priorityLevel === ImmediatePriority) {
-                    if (componentsThatTriggeredHighPriSuspend === null) {
-                      componentsThatTriggeredHighPriSuspend = new Set([getComponentName(workInProgressNode.type)]);
-                    } else {
-                      componentsThatTriggeredHighPriSuspend.add(getComponentName(workInProgressNode.type));
-                    }
 
-                    break;
-                  }
-
-                  update = update.next;
-                }
-              }
-
-              break;
-
-            case FunctionComponent:
-            case ForwardRef:
-            case SimpleMemoComponent:
-              if (workInProgressNode.memoizedState !== null && workInProgressNode.memoizedState.baseUpdate !== null) {
-                var _update = workInProgressNode.memoizedState.baseUpdate; // Loop through the functional component's memoized state to see whether
-                // the component has triggered any high pri updates
-
-                while (_update !== null) {
-                  var priority = _update.priority;
-
-                  if (priority === UserBlockingPriority$2 || priority === ImmediatePriority) {
-                    if (componentsThatTriggeredHighPriSuspend === null) {
-                      componentsThatTriggeredHighPriSuspend = new Set([getComponentName(workInProgressNode.type)]);
-                    } else {
-                      componentsThatTriggeredHighPriSuspend.add(getComponentName(workInProgressNode.type));
-                    }
+  function computeThreadID(root, expirationTime) {
+    // Interaction threads are unique per root and expiration time.
+    return expirationTime * 1000 + root.interactionThreadID;
+  }
 
-                    break;
-                  }
+  function markSpawnedWork(expirationTime) {
 
-                  if (_update.next === workInProgressNode.memoizedState.baseUpdate) {
-                    break;
-                  }
+    if (spawnedWorkDuringRender === null) {
+      spawnedWorkDuringRender = [expirationTime];
+    } else {
+      spawnedWorkDuringRender.push(expirationTime);
+    }
+  }
 
-                  _update = _update.next;
-                }
-              }
+  function scheduleInteractions(root, expirationTime, interactions) {
 
-              break;
+    if (interactions.size > 0) {
+      var pendingInteractionMap = root.pendingInteractionMap;
+      var pendingInteractions = pendingInteractionMap.get(expirationTime);
 
-            default:
-              break;
+      if (pendingInteractions != null) {
+        interactions.forEach(function (interaction) {
+          if (!pendingInteractions.has(interaction)) {
+            // Update the pending async work count for previously unscheduled interaction.
+            interaction.__count++;
           }
-        }
 
-        workInProgressNode = workInProgressNode.return;
+          pendingInteractions.add(interaction);
+        });
+      } else {
+        pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions.
+
+        interactions.forEach(function (interaction) {
+          interaction.__count++;
+        });
       }
-    }
-  }
-}
 
-function flushSuspensePriorityWarningInDEV() {
-  {
-    if (componentsThatTriggeredHighPriSuspend !== null) {
-      var componentNames = [];
-      componentsThatTriggeredHighPriSuspend.forEach(function (name) {
-        return componentNames.push(name);
-      });
-      componentsThatTriggeredHighPriSuspend = null;
+      var subscriber = __subscriberRef.current;
 
-      if (componentNames.length > 0) {
-        warningWithoutStack$1(false, '%s triggered a user-blocking update that suspended.' + '\n\n' + 'The fix is to split the update into multiple parts: a user-blocking ' + 'update to provide immediate feedback, and another update that ' + 'triggers the bulk of the changes.' + '\n\n' + 'Refer to the documentation for useTransition to learn how ' + 'to implement this pattern.', // TODO: Add link to React docs with more information, once it exists
-        componentNames.sort().join(', '));
+      if (subscriber !== null) {
+        var threadID = computeThreadID(root, expirationTime);
+        subscriber.onWorkScheduled(interactions, threadID);
       }
     }
   }
-}
-
-function computeThreadID(root, expirationTime) {
-  // Interaction threads are unique per root and expiration time.
-  return expirationTime * 1000 + root.interactionThreadID;
-}
 
-function markSpawnedWork(expirationTime) {
-  if (!enableSchedulerTracing) {
-    return;
-  }
+  function schedulePendingInteractions(root, expirationTime) {
 
-  if (spawnedWorkDuringRender === null) {
-    spawnedWorkDuringRender = [expirationTime];
-  } else {
-    spawnedWorkDuringRender.push(expirationTime);
+    scheduleInteractions(root, expirationTime, __interactionsRef.current);
   }
-}
 
-function scheduleInteractions(root, expirationTime, interactions) {
-  if (!enableSchedulerTracing) {
-    return;
-  }
+  function startWorkOnPendingInteractions(root, expirationTime) {
+    // we can accurately attribute time spent working on it, And so that cascading
+    // work triggered during the render phase will be associated with it.
 
-  if (interactions.size > 0) {
-    var pendingInteractionMap = root.pendingInteractionMap;
-    var pendingInteractions = pendingInteractionMap.get(expirationTime);
 
-    if (pendingInteractions != null) {
-      interactions.forEach(function (interaction) {
-        if (!pendingInteractions.has(interaction)) {
-          // Update the pending async work count for previously unscheduled interaction.
-          interaction.__count++;
-        }
+    var interactions = new Set();
+    root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
+      if (scheduledExpirationTime >= expirationTime) {
+        scheduledInteractions.forEach(function (interaction) {
+          return interactions.add(interaction);
+        });
+      }
+    }); // Store the current set of interactions on the FiberRoot for a few reasons:
+    // We can re-use it in hot functions like performConcurrentWorkOnRoot()
+    // without having to recalculate it. We will also use it in commitWork() to
+    // pass to any Profiler onRender() hooks. This also provides DevTools with a
+    // way to access it when the onCommitRoot() hook is called.
 
-        pendingInteractions.add(interaction);
-      });
-    } else {
-      pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions.
+    root.memoizedInteractions = interactions;
 
-      interactions.forEach(function (interaction) {
-        interaction.__count++;
-      });
-    }
+    if (interactions.size > 0) {
+      var subscriber = __subscriberRef.current;
 
-    var subscriber = __subscriberRef.current;
+      if (subscriber !== null) {
+        var threadID = computeThreadID(root, expirationTime);
 
-    if (subscriber !== null) {
-      var threadID = computeThreadID(root, expirationTime);
-      subscriber.onWorkScheduled(interactions, threadID);
+        try {
+          subscriber.onWorkStarted(interactions, threadID);
+        } catch (error) {
+          // If the subscriber throws, rethrow it in a separate task
+          scheduleCallback(ImmediatePriority, function () {
+            throw error;
+          });
+        }
+      }
     }
   }
-}
-
-function schedulePendingInteractions(root, expirationTime) {
-  // This is called when work is scheduled on a root.
-  // It associates the current interactions with the newly-scheduled expiration.
-  // They will be restored when that expiration is later committed.
-  if (!enableSchedulerTracing) {
-    return;
-  }
 
-  scheduleInteractions(root, expirationTime, __interactionsRef.current);
-}
+  function finishPendingInteractions(root, committedExpirationTime) {
 
-function startWorkOnPendingInteractions(root, expirationTime) {
-  // This is called when new work is started on a root.
-  if (!enableSchedulerTracing) {
-    return;
-  } // Determine which interactions this batch of work currently includes, So that
-  // we can accurately attribute time spent working on it, And so that cascading
-  // work triggered during the render phase will be associated with it.
+    var earliestRemainingTimeAfterCommit = root.firstPendingTime;
+    var subscriber;
 
+    try {
+      subscriber = __subscriberRef.current;
 
-  var interactions = new Set();
-  root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
-    if (scheduledExpirationTime >= expirationTime) {
-      scheduledInteractions.forEach(function (interaction) {
-        return interactions.add(interaction);
+      if (subscriber !== null && root.memoizedInteractions.size > 0) {
+        var threadID = computeThreadID(root, committedExpirationTime);
+        subscriber.onWorkStopped(root.memoizedInteractions, threadID);
+      }
+    } catch (error) {
+      // If the subscriber throws, rethrow it in a separate task
+      scheduleCallback(ImmediatePriority, function () {
+        throw error;
+      });
+    } finally {
+      // Clear completed interactions from the pending Map.
+      // Unless the render was suspended or cascading work was scheduled,
+      // In which case– leave pending interactions until the subsequent render.
+      var pendingInteractionMap = root.pendingInteractionMap;
+      pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
+        // Only decrement the pending interaction count if we're done.
+        // If there's still work at the current priority,
+        // That indicates that we are waiting for suspense data.
+        if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {
+          pendingInteractionMap.delete(scheduledExpirationTime);
+          scheduledInteractions.forEach(function (interaction) {
+            interaction.__count--;
+
+            if (subscriber !== null && interaction.__count === 0) {
+              try {
+                subscriber.onInteractionScheduledWorkCompleted(interaction);
+              } catch (error) {
+                // If the subscriber throws, rethrow it in a separate task
+                scheduleCallback(ImmediatePriority, function () {
+                  throw error;
+                });
+              }
+            }
+          });
+        }
       });
     }
-  }); // Store the current set of interactions on the FiberRoot for a few reasons:
-  // We can re-use it in hot functions like performConcurrentWorkOnRoot()
-  // without having to recalculate it. We will also use it in commitWork() to
-  // pass to any Profiler onRender() hooks. This also provides DevTools with a
-  // way to access it when the onCommitRoot() hook is called.
-
-  root.memoizedInteractions = interactions;
+  }
 
-  if (interactions.size > 0) {
-    var subscriber = __subscriberRef.current;
+  var onScheduleFiberRoot = null;
+  var onCommitFiberRoot = null;
+  var onCommitFiberUnmount = null;
+  var hasLoggedError = false;
+  var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
+  function injectInternals(internals) {
+    if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
+      // No DevTools
+      return false;
+    }
 
-    if (subscriber !== null) {
-      var threadID = computeThreadID(root, expirationTime);
+    var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
 
-      try {
-        subscriber.onWorkStarted(interactions, threadID);
-      } catch (error) {
-        // If the subscriber throws, rethrow it in a separate task
-        scheduleCallback(ImmediatePriority, function () {
-          throw error;
-        });
-      }
+    if (hook.isDisabled) {
+      // This isn't a real property on the hook, but it can be set to opt out
+      // of DevTools integration and associated warnings and logs.
+      // https://github.com/facebook/react/issues/3877
+      return true;
     }
-  }
-}
-
-function finishPendingInteractions(root, committedExpirationTime) {
-  if (!enableSchedulerTracing) {
-    return;
-  }
 
-  var earliestRemainingTimeAfterCommit = root.firstPendingTime;
-  var subscriber;
+    if (!hook.supportsFiber) {
+      {
+        error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');
+      } // DevTools exists, even though it doesn't support Fiber.
 
-  try {
-    subscriber = __subscriberRef.current;
 
-    if (subscriber !== null && root.memoizedInteractions.size > 0) {
-      var threadID = computeThreadID(root, committedExpirationTime);
-      subscriber.onWorkStopped(root.memoizedInteractions, threadID);
+      return true;
     }
-  } catch (error) {
-    // If the subscriber throws, rethrow it in a separate task
-    scheduleCallback(ImmediatePriority, function () {
-      throw error;
-    });
-  } finally {
-    // Clear completed interactions from the pending Map.
-    // Unless the render was suspended or cascading work was scheduled,
-    // In which case– leave pending interactions until the subsequent render.
-    var pendingInteractionMap = root.pendingInteractionMap;
-    pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {
-      // Only decrement the pending interaction count if we're done.
-      // If there's still work at the current priority,
-      // That indicates that we are waiting for suspense data.
-      if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {
-        pendingInteractionMap.delete(scheduledExpirationTime);
-        scheduledInteractions.forEach(function (interaction) {
-          interaction.__count--;
 
-          if (subscriber !== null && interaction.__count === 0) {
+    try {
+      var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.
+
+      if (true) {
+        // Only used by Fast Refresh
+        if (typeof hook.onScheduleFiberRoot === 'function') {
+          onScheduleFiberRoot = function (root, children) {
             try {
-              subscriber.onInteractionScheduledWorkCompleted(interaction);
-            } catch (error) {
-              // If the subscriber throws, rethrow it in a separate task
-              scheduleCallback(ImmediatePriority, function () {
-                throw error;
-              });
+              hook.onScheduleFiberRoot(rendererID, root, children);
+            } catch (err) {
+              if (true && !hasLoggedError) {
+                hasLoggedError = true;
+
+                error('React instrumentation encountered an error: %s', err);
+              }
             }
-          }
-        });
+          };
+        }
       }
-    });
-  }
-}
-
-var onCommitFiberRoot = null;
-var onCommitFiberUnmount = null;
-var hasLoggedError = false;
-var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
-function injectInternals(internals) {
-  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
-    // No DevTools
-    return false;
-  }
-
-  var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
-
-  if (hook.isDisabled) {
-    // This isn't a real property on the hook, but it can be set to opt out
-    // of DevTools integration and associated warnings and logs.
-    // https://github.com/facebook/react/issues/3877
-    return true;
-  }
-
-  if (!hook.supportsFiber) {
-    {
-      warningWithoutStack$1(false, 'The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');
-    } // DevTools exists, even though it doesn't support Fiber.
-
-
-    return true;
-  }
 
-  try {
-    var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.
+      onCommitFiberRoot = function (root, expirationTime) {
+        try {
+          var didError = (root.current.effectTag & DidCapture) === DidCapture;
 
-    onCommitFiberRoot = function (root, expirationTime) {
-      try {
-        var didError = (root.current.effectTag & DidCapture) === DidCapture;
+          if (enableProfilerTimer) {
+            var currentTime = getCurrentTime();
+            var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);
+            hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError);
+          } else {
+            hook.onCommitFiberRoot(rendererID, root, undefined, didError);
+          }
+        } catch (err) {
+          if (true) {
+            if (!hasLoggedError) {
+              hasLoggedError = true;
 
-        if (enableProfilerTimer) {
-          var currentTime = getCurrentTime();
-          var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);
-          hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError);
-        } else {
-          hook.onCommitFiberRoot(rendererID, root, undefined, didError);
-        }
-      } catch (err) {
-        if (true && !hasLoggedError) {
-          hasLoggedError = true;
-          warningWithoutStack$1(false, 'React DevTools encountered an error: %s', err);
+              error('React instrumentation encountered an error: %s', err);
+            }
+          }
         }
-      }
-    };
+      };
 
-    onCommitFiberUnmount = function (fiber) {
-      try {
-        hook.onCommitFiberUnmount(rendererID, fiber);
-      } catch (err) {
-        if (true && !hasLoggedError) {
-          hasLoggedError = true;
-          warningWithoutStack$1(false, 'React DevTools encountered an error: %s', err);
+      onCommitFiberUnmount = function (fiber) {
+        try {
+          hook.onCommitFiberUnmount(rendererID, fiber);
+        } catch (err) {
+          if (true) {
+            if (!hasLoggedError) {
+              hasLoggedError = true;
+
+              error('React instrumentation encountered an error: %s', err);
+            }
+          }
         }
+      };
+    } catch (err) {
+      // Catch all errors because it is unsafe to throw during initialization.
+      {
+        error('React instrumentation encountered an error: %s.', err);
       }
-    };
-  } catch (err) {
-    // Catch all errors because it is unsafe to throw during initialization.
-    {
-      warningWithoutStack$1(false, 'React DevTools encountered an error: %s.', err);
-    }
-  } // DevTools exists
-
-
-  return true;
-}
-function onCommitRoot(root, expirationTime) {
-  if (typeof onCommitFiberRoot === 'function') {
-    onCommitFiberRoot(root, expirationTime);
-  }
-}
-function onCommitUnmount(fiber) {
-  if (typeof onCommitFiberUnmount === 'function') {
-    onCommitFiberUnmount(fiber);
-  }
-}
-
-var hasBadMapPolyfill;
-
-{
-  hasBadMapPolyfill = false;
-
-  try {
-    var nonExtensibleObject = Object.preventExtensions({});
-    var testMap = new Map([[nonExtensibleObject, null]]);
-    var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused.
-    // https://github.com/rollup/rollup/issues/1771
-    // TODO: we can remove these if Rollup fixes the bug.
-
-    testMap.set(0, 0);
-    testSet.add(0);
-  } catch (e) {
-    // TODO: Consider warning about bad polyfills
-    hasBadMapPolyfill = true;
-  }
-}
-
-var debugCounter = 1;
-
-function FiberNode(tag, pendingProps, key, mode) {
-  // Instance
-  this.tag = tag;
-  this.key = key;
-  this.elementType = null;
-  this.type = null;
-  this.stateNode = null; // Fiber
-
-  this.return = null;
-  this.child = null;
-  this.sibling = null;
-  this.index = 0;
-  this.ref = null;
-  this.pendingProps = pendingProps;
-  this.memoizedProps = null;
-  this.updateQueue = null;
-  this.memoizedState = null;
-  this.dependencies = null;
-  this.mode = mode; // Effects
-
-  this.effectTag = NoEffect;
-  this.nextEffect = null;
-  this.firstEffect = null;
-  this.lastEffect = null;
-  this.expirationTime = NoWork;
-  this.childExpirationTime = NoWork;
-  this.alternate = null;
-
-  if (enableProfilerTimer) {
-    // Note: The following is done to avoid a v8 performance cliff.
-    //
-    // Initializing the fields below to smis and later updating them with
-    // double values will cause Fibers to end up having separate shapes.
-    // This behavior/bug has something to do with Object.preventExtension().
-    // Fortunately this only impacts DEV builds.
-    // Unfortunately it makes React unusably slow for some applications.
-    // To work around this, initialize the fields below with doubles.
-    //
-    // Learn more about this here:
-    // https://github.com/facebook/react/issues/14365
-    // https://bugs.chromium.org/p/v8/issues/detail?id=8538
-    this.actualDuration = Number.NaN;
-    this.actualStartTime = Number.NaN;
-    this.selfBaseDuration = Number.NaN;
-    this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.
-    // This won't trigger the performance cliff mentioned above,
-    // and it simplifies other profiler code (including DevTools).
-
-    this.actualDuration = 0;
-    this.actualStartTime = -1;
-    this.selfBaseDuration = 0;
-    this.treeBaseDuration = 0;
-  } // This is normally DEV-only except www when it adds listeners.
-  // TODO: remove the User Timing integration in favor of Root Events.
+    } // DevTools exists
 
 
-  if (enableUserTimingAPI) {
-    this._debugID = debugCounter++;
-    this._debugIsCurrentlyTiming = false;
+    return true;
+  }
+  function onScheduleRoot(root, children) {
+    if (typeof onScheduleFiberRoot === 'function') {
+      onScheduleFiberRoot(root, children);
+    }
+  }
+  function onCommitRoot(root, expirationTime) {
+    if (typeof onCommitFiberRoot === 'function') {
+      onCommitFiberRoot(root, expirationTime);
+    }
+  }
+  function onCommitUnmount(fiber) {
+    if (typeof onCommitFiberUnmount === 'function') {
+      onCommitFiberUnmount(fiber);
+    }
   }
 
+  var hasBadMapPolyfill;
+
   {
-    this._debugSource = null;
-    this._debugOwner = null;
-    this._debugNeedsRemount = false;
-    this._debugHookTypes = null;
-
-    if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
-      Object.preventExtensions(this);
-    }
-  }
-} // This is a constructor function, rather than a POJO constructor, still
-// please ensure we do the following:
-// 1) Nobody should add any instance methods on this. Instance methods can be
-//    more difficult to predict when they get optimized and they are almost
-//    never inlined properly in static compilers.
-// 2) Nobody should rely on `instanceof Fiber` for type testing. We should
-//    always know when it is a fiber.
-// 3) We might want to experiment with using numeric keys since they are easier
-//    to optimize in a non-JIT environment.
-// 4) We can easily go from a constructor to a createFiber object literal if that
-//    is faster.
-// 5) It should be easy to port this to a C struct and keep a C implementation
-//    compatible.
-
-
-var createFiber = function (tag, pendingProps, key, mode) {
-  // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
-  return new FiberNode(tag, pendingProps, key, mode);
-};
-
-function shouldConstruct(Component) {
-  var prototype = Component.prototype;
-  return !!(prototype && prototype.isReactComponent);
-}
-
-function isSimpleFunctionComponent(type) {
-  return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;
-}
-function resolveLazyComponentTag(Component) {
-  if (typeof Component === 'function') {
-    return shouldConstruct(Component) ? ClassComponent : FunctionComponent;
-  } else if (Component !== undefined && Component !== null) {
-    var $$typeof = Component.$$typeof;
-
-    if ($$typeof === REACT_FORWARD_REF_TYPE) {
-      return ForwardRef;
-    }
-
-    if ($$typeof === REACT_MEMO_TYPE) {
-      return MemoComponent;
-    }
-  }
-
-  return IndeterminateComponent;
-} // This is used to create an alternate fiber to do work on.
-
-function createWorkInProgress(current, pendingProps, expirationTime) {
-  var workInProgress = current.alternate;
-
-  if (workInProgress === null) {
-    // We use a double buffering pooling technique because we know that we'll
-    // only ever need at most two versions of a tree. We pool the "other" unused
-    // node that we're free to reuse. This is lazily created to avoid allocating
-    // extra objects for things that are never updated. It also allow us to
-    // reclaim the extra memory if needed.
-    workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
-    workInProgress.elementType = current.elementType;
-    workInProgress.type = current.type;
-    workInProgress.stateNode = current.stateNode;
+    hasBadMapPolyfill = false;
+
+    try {
+      var nonExtensibleObject = Object.preventExtensions({});
+      var testMap = new Map([[nonExtensibleObject, null]]);
+      var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused.
+      // https://github.com/rollup/rollup/issues/1771
+      // TODO: we can remove these if Rollup fixes the bug.
+
+      testMap.set(0, 0);
+      testSet.add(0);
+    } catch (e) {
+      // TODO: Consider warning about bad polyfills
+      hasBadMapPolyfill = true;
+    }
+  }
+
+  var debugCounter = 1;
+
+  function FiberNode(tag, pendingProps, key, mode) {
+    // Instance
+    this.tag = tag;
+    this.key = key;
+    this.elementType = null;
+    this.type = null;
+    this.stateNode = null; // Fiber
+
+    this.return = null;
+    this.child = null;
+    this.sibling = null;
+    this.index = 0;
+    this.ref = null;
+    this.pendingProps = pendingProps;
+    this.memoizedProps = null;
+    this.updateQueue = null;
+    this.memoizedState = null;
+    this.dependencies = null;
+    this.mode = mode; // Effects
+
+    this.effectTag = NoEffect;
+    this.nextEffect = null;
+    this.firstEffect = null;
+    this.lastEffect = null;
+    this.expirationTime = NoWork;
+    this.childExpirationTime = NoWork;
+    this.alternate = null;
 
     {
-      // DEV-only fields
-      workInProgress._debugID = current._debugID;
-      workInProgress._debugSource = current._debugSource;
-      workInProgress._debugOwner = current._debugOwner;
-      workInProgress._debugHookTypes = current._debugHookTypes;
-    }
+      // Note: The following is done to avoid a v8 performance cliff.
+      //
+      // Initializing the fields below to smis and later updating them with
+      // double values will cause Fibers to end up having separate shapes.
+      // This behavior/bug has something to do with Object.preventExtension().
+      // Fortunately this only impacts DEV builds.
+      // Unfortunately it makes React unusably slow for some applications.
+      // To work around this, initialize the fields below with doubles.
+      //
+      // Learn more about this here:
+      // https://github.com/facebook/react/issues/14365
+      // https://bugs.chromium.org/p/v8/issues/detail?id=8538
+      this.actualDuration = Number.NaN;
+      this.actualStartTime = Number.NaN;
+      this.selfBaseDuration = Number.NaN;
+      this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.
+      // This won't trigger the performance cliff mentioned above,
+      // and it simplifies other profiler code (including DevTools).
+
+      this.actualDuration = 0;
+      this.actualStartTime = -1;
+      this.selfBaseDuration = 0;
+      this.treeBaseDuration = 0;
+    } // This is normally DEV-only except www when it adds listeners.
+    // TODO: remove the User Timing integration in favor of Root Events.
 
-    workInProgress.alternate = current;
-    current.alternate = workInProgress;
-  } else {
-    workInProgress.pendingProps = pendingProps; // We already have an alternate.
-    // Reset the effect tag.
 
-    workInProgress.effectTag = NoEffect; // The effect list is no longer valid.
+    {
+      this._debugID = debugCounter++;
+      this._debugIsCurrentlyTiming = false;
+    }
 
-    workInProgress.nextEffect = null;
-    workInProgress.firstEffect = null;
-    workInProgress.lastEffect = null;
+    {
+      this._debugSource = null;
+      this._debugOwner = null;
+      this._debugNeedsRemount = false;
+      this._debugHookTypes = null;
+
+      if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
+        Object.preventExtensions(this);
+      }
+    }
+  } // This is a constructor function, rather than a POJO constructor, still
+  // please ensure we do the following:
+  // 1) Nobody should add any instance methods on this. Instance methods can be
+  //    more difficult to predict when they get optimized and they are almost
+  //    never inlined properly in static compilers.
+  // 2) Nobody should rely on `instanceof Fiber` for type testing. We should
+  //    always know when it is a fiber.
+  // 3) We might want to experiment with using numeric keys since they are easier
+  //    to optimize in a non-JIT environment.
+  // 4) We can easily go from a constructor to a createFiber object literal if that
+  //    is faster.
+  // 5) It should be easy to port this to a C struct and keep a C implementation
+  //    compatible.
+
+
+  var createFiber = function (tag, pendingProps, key, mode) {
+    // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
+    return new FiberNode(tag, pendingProps, key, mode);
+  };
 
-    if (enableProfilerTimer) {
-      // We intentionally reset, rather than copy, actualDuration & actualStartTime.
-      // This prevents time from endlessly accumulating in new commits.
-      // This has the downside of resetting values for different priority renders,
-      // But works for yielding (the common case) and should support resuming.
-      workInProgress.actualDuration = 0;
-      workInProgress.actualStartTime = -1;
-    }
+  function shouldConstruct(Component) {
+    var prototype = Component.prototype;
+    return !!(prototype && prototype.isReactComponent);
+  }
+
+  function isSimpleFunctionComponent(type) {
+    return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;
   }
+  function resolveLazyComponentTag(Component) {
+    if (typeof Component === 'function') {
+      return shouldConstruct(Component) ? ClassComponent : FunctionComponent;
+    } else if (Component !== undefined && Component !== null) {
+      var $$typeof = Component.$$typeof;
 
-  workInProgress.childExpirationTime = current.childExpirationTime;
-  workInProgress.expirationTime = current.expirationTime;
-  workInProgress.child = current.child;
-  workInProgress.memoizedProps = current.memoizedProps;
-  workInProgress.memoizedState = current.memoizedState;
-  workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so
-  // it cannot be shared with the current fiber.
+      if ($$typeof === REACT_FORWARD_REF_TYPE) {
+        return ForwardRef;
+      }
 
-  var currentDependencies = current.dependencies;
-  workInProgress.dependencies = currentDependencies === null ? null : {
-    expirationTime: currentDependencies.expirationTime,
-    firstContext: currentDependencies.firstContext,
-    responders: currentDependencies.responders
-  }; // These will be overridden during the parent's reconciliation
+      if ($$typeof === REACT_MEMO_TYPE) {
+        return MemoComponent;
+      }
+    }
 
-  workInProgress.sibling = current.sibling;
-  workInProgress.index = current.index;
-  workInProgress.ref = current.ref;
+    return IndeterminateComponent;
+  } // This is used to create an alternate fiber to do work on.
 
-  if (enableProfilerTimer) {
-    workInProgress.selfBaseDuration = current.selfBaseDuration;
-    workInProgress.treeBaseDuration = current.treeBaseDuration;
-  }
+  function createWorkInProgress(current, pendingProps) {
+    var workInProgress = current.alternate;
 
-  {
-    workInProgress._debugNeedsRemount = current._debugNeedsRemount;
+    if (workInProgress === null) {
+      // We use a double buffering pooling technique because we know that we'll
+      // only ever need at most two versions of a tree. We pool the "other" unused
+      // node that we're free to reuse. This is lazily created to avoid allocating
+      // extra objects for things that are never updated. It also allow us to
+      // reclaim the extra memory if needed.
+      workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
+      workInProgress.elementType = current.elementType;
+      workInProgress.type = current.type;
+      workInProgress.stateNode = current.stateNode;
 
-    switch (workInProgress.tag) {
-      case IndeterminateComponent:
-      case FunctionComponent:
-      case SimpleMemoComponent:
-        workInProgress.type = resolveFunctionForHotReloading(current.type);
-        break;
+      {
+        // DEV-only fields
+        {
+          workInProgress._debugID = current._debugID;
+        }
 
-      case ClassComponent:
-        workInProgress.type = resolveClassForHotReloading(current.type);
-        break;
+        workInProgress._debugSource = current._debugSource;
+        workInProgress._debugOwner = current._debugOwner;
+        workInProgress._debugHookTypes = current._debugHookTypes;
+      }
 
-      case ForwardRef:
-        workInProgress.type = resolveForwardRefForHotReloading(current.type);
-        break;
+      workInProgress.alternate = current;
+      current.alternate = workInProgress;
+    } else {
+      workInProgress.pendingProps = pendingProps; // We already have an alternate.
+      // Reset the effect tag.
 
-      default:
-        break;
-    }
-  }
+      workInProgress.effectTag = NoEffect; // The effect list is no longer valid.
 
-  return workInProgress;
-} // Used to reuse a Fiber for a second pass.
-
-function resetWorkInProgress(workInProgress, renderExpirationTime) {
-  // This resets the Fiber to what createFiber or createWorkInProgress would
-  // have set the values to before during the first pass. Ideally this wouldn't
-  // be necessary but unfortunately many code paths reads from the workInProgress
-  // when they should be reading from current and writing to workInProgress.
-  // We assume pendingProps, index, key, ref, return are still untouched to
-  // avoid doing another reconciliation.
-  // Reset the effect tag but keep any Placement tags, since that's something
-  // that child fiber is setting, not the reconciliation.
-  workInProgress.effectTag &= Placement; // The effect list is no longer valid.
-
-  workInProgress.nextEffect = null;
-  workInProgress.firstEffect = null;
-  workInProgress.lastEffect = null;
-  var current = workInProgress.alternate;
-
-  if (current === null) {
-    // Reset to createFiber's initial values.
-    workInProgress.childExpirationTime = NoWork;
-    workInProgress.expirationTime = renderExpirationTime;
-    workInProgress.child = null;
-    workInProgress.memoizedProps = null;
-    workInProgress.memoizedState = null;
-    workInProgress.updateQueue = null;
-    workInProgress.dependencies = null;
+      workInProgress.nextEffect = null;
+      workInProgress.firstEffect = null;
+      workInProgress.lastEffect = null;
 
-    if (enableProfilerTimer) {
-      // Note: We don't reset the actualTime counts. It's useful to accumulate
-      // actual time across multiple render passes.
-      workInProgress.selfBaseDuration = 0;
-      workInProgress.treeBaseDuration = 0;
+      {
+        // We intentionally reset, rather than copy, actualDuration & actualStartTime.
+        // This prevents time from endlessly accumulating in new commits.
+        // This has the downside of resetting values for different priority renders,
+        // But works for yielding (the common case) and should support resuming.
+        workInProgress.actualDuration = 0;
+        workInProgress.actualStartTime = -1;
+      }
     }
-  } else {
-    // Reset to the cloned values that createWorkInProgress would've.
+
     workInProgress.childExpirationTime = current.childExpirationTime;
     workInProgress.expirationTime = current.expirationTime;
     workInProgress.child = current.child;
@@ -26633,1309 +23885,1263 @@ function resetWorkInProgress(workInProgress, renderExpirationTime) {
       expirationTime: currentDependencies.expirationTime,
       firstContext: currentDependencies.firstContext,
       responders: currentDependencies.responders
-    };
+    }; // These will be overridden during the parent's reconciliation
 
-    if (enableProfilerTimer) {
-      // Note: We don't reset the actualTime counts. It's useful to accumulate
-      // actual time across multiple render passes.
+    workInProgress.sibling = current.sibling;
+    workInProgress.index = current.index;
+    workInProgress.ref = current.ref;
+
+    {
       workInProgress.selfBaseDuration = current.selfBaseDuration;
       workInProgress.treeBaseDuration = current.treeBaseDuration;
     }
-  }
 
-  return workInProgress;
-}
-function createHostRootFiber(tag) {
-  var mode;
+    {
+      workInProgress._debugNeedsRemount = current._debugNeedsRemount;
+
+      switch (workInProgress.tag) {
+        case IndeterminateComponent:
+        case FunctionComponent:
+        case SimpleMemoComponent:
+          workInProgress.type = resolveFunctionForHotReloading(current.type);
+          break;
 
-  if (tag === ConcurrentRoot) {
-    mode = ConcurrentMode | BlockingMode | StrictMode;
-  } else if (tag === BlockingRoot) {
-    mode = BlockingMode | StrictMode;
-  } else {
-    mode = NoMode;
-  }
+        case ClassComponent:
+          workInProgress.type = resolveClassForHotReloading(current.type);
+          break;
 
-  if (enableProfilerTimer && isDevToolsPresent) {
-    // Always collect profile timings when DevTools are present.
-    // This enables DevTools to start capturing timing at any point–
-    // Without some nodes in the tree having empty base times.
-    mode |= ProfileMode;
-  }
+        case ForwardRef:
+          workInProgress.type = resolveForwardRefForHotReloading(current.type);
+          break;
+      }
+    }
+
+    return workInProgress;
+  } // Used to reuse a Fiber for a second pass.
 
-  return createFiber(HostRoot, null, null, mode);
-}
-function createFiberFromTypeAndProps(type, // React$ElementType
-key, pendingProps, owner, mode, expirationTime) {
-  var fiber;
-  var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
+  function resetWorkInProgress(workInProgress, renderExpirationTime) {
+    // This resets the Fiber to what createFiber or createWorkInProgress would
+    // have set the values to before during the first pass. Ideally this wouldn't
+    // be necessary but unfortunately many code paths reads from the workInProgress
+    // when they should be reading from current and writing to workInProgress.
+    // We assume pendingProps, index, key, ref, return are still untouched to
+    // avoid doing another reconciliation.
+    // Reset the effect tag but keep any Placement tags, since that's something
+    // that child fiber is setting, not the reconciliation.
+    workInProgress.effectTag &= Placement; // The effect list is no longer valid.
 
-  var resolvedType = type;
+    workInProgress.nextEffect = null;
+    workInProgress.firstEffect = null;
+    workInProgress.lastEffect = null;
+    var current = workInProgress.alternate;
 
-  if (typeof type === 'function') {
-    if (shouldConstruct(type)) {
-      fiberTag = ClassComponent;
+    if (current === null) {
+      // Reset to createFiber's initial values.
+      workInProgress.childExpirationTime = NoWork;
+      workInProgress.expirationTime = renderExpirationTime;
+      workInProgress.child = null;
+      workInProgress.memoizedProps = null;
+      workInProgress.memoizedState = null;
+      workInProgress.updateQueue = null;
+      workInProgress.dependencies = null;
 
       {
-        resolvedType = resolveClassForHotReloading(resolvedType);
+        // Note: We don't reset the actualTime counts. It's useful to accumulate
+        // actual time across multiple render passes.
+        workInProgress.selfBaseDuration = 0;
+        workInProgress.treeBaseDuration = 0;
       }
     } else {
+      // Reset to the cloned values that createWorkInProgress would've.
+      workInProgress.childExpirationTime = current.childExpirationTime;
+      workInProgress.expirationTime = current.expirationTime;
+      workInProgress.child = current.child;
+      workInProgress.memoizedProps = current.memoizedProps;
+      workInProgress.memoizedState = current.memoizedState;
+      workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so
+      // it cannot be shared with the current fiber.
+
+      var currentDependencies = current.dependencies;
+      workInProgress.dependencies = currentDependencies === null ? null : {
+        expirationTime: currentDependencies.expirationTime,
+        firstContext: currentDependencies.firstContext,
+        responders: currentDependencies.responders
+      };
+
       {
-        resolvedType = resolveFunctionForHotReloading(resolvedType);
+        // Note: We don't reset the actualTime counts. It's useful to accumulate
+        // actual time across multiple render passes.
+        workInProgress.selfBaseDuration = current.selfBaseDuration;
+        workInProgress.treeBaseDuration = current.treeBaseDuration;
       }
     }
-  } else if (typeof type === 'string') {
-    fiberTag = HostComponent;
-  } else {
-    getTag: switch (type) {
-      case REACT_FRAGMENT_TYPE:
-        return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);
 
-      case REACT_CONCURRENT_MODE_TYPE:
-        fiberTag = Mode;
-        mode |= ConcurrentMode | BlockingMode | StrictMode;
-        break;
+    return workInProgress;
+  }
+  function createHostRootFiber(tag) {
+    var mode;
 
-      case REACT_STRICT_MODE_TYPE:
-        fiberTag = Mode;
-        mode |= StrictMode;
-        break;
+    if (tag === ConcurrentRoot) {
+      mode = ConcurrentMode | BlockingMode | StrictMode;
+    } else if (tag === BlockingRoot) {
+      mode = BlockingMode | StrictMode;
+    } else {
+      mode = NoMode;
+    }
 
-      case REACT_PROFILER_TYPE:
-        return createFiberFromProfiler(pendingProps, mode, expirationTime, key);
+    if ( isDevToolsPresent) {
+      // Always collect profile timings when DevTools are present.
+      // This enables DevTools to start capturing timing at any point–
+      // Without some nodes in the tree having empty base times.
+      mode |= ProfileMode;
+    }
 
-      case REACT_SUSPENSE_TYPE:
-        return createFiberFromSuspense(pendingProps, mode, expirationTime, key);
+    return createFiber(HostRoot, null, null, mode);
+  }
+  function createFiberFromTypeAndProps(type, // React$ElementType
+  key, pendingProps, owner, mode, expirationTime) {
+    var fiber;
+    var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
 
-      case REACT_SUSPENSE_LIST_TYPE:
-        return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key);
+    var resolvedType = type;
 
-      default:
+    if (typeof type === 'function') {
+      if (shouldConstruct(type)) {
+        fiberTag = ClassComponent;
+
+        {
+          resolvedType = resolveClassForHotReloading(resolvedType);
+        }
+      } else {
         {
-          if (typeof type === 'object' && type !== null) {
-            switch (type.$$typeof) {
-              case REACT_PROVIDER_TYPE:
-                fiberTag = ContextProvider;
-                break getTag;
+          resolvedType = resolveFunctionForHotReloading(resolvedType);
+        }
+      }
+    } else if (typeof type === 'string') {
+      fiberTag = HostComponent;
+    } else {
+      getTag: switch (type) {
+        case REACT_FRAGMENT_TYPE:
+          return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);
 
-              case REACT_CONTEXT_TYPE:
-                // This is a consumer
-                fiberTag = ContextConsumer;
-                break getTag;
+        case REACT_CONCURRENT_MODE_TYPE:
+          fiberTag = Mode;
+          mode |= ConcurrentMode | BlockingMode | StrictMode;
+          break;
 
-              case REACT_FORWARD_REF_TYPE:
-                fiberTag = ForwardRef;
+        case REACT_STRICT_MODE_TYPE:
+          fiberTag = Mode;
+          mode |= StrictMode;
+          break;
 
-                {
-                  resolvedType = resolveForwardRefForHotReloading(resolvedType);
-                }
+        case REACT_PROFILER_TYPE:
+          return createFiberFromProfiler(pendingProps, mode, expirationTime, key);
 
-                break getTag;
+        case REACT_SUSPENSE_TYPE:
+          return createFiberFromSuspense(pendingProps, mode, expirationTime, key);
 
-              case REACT_MEMO_TYPE:
-                fiberTag = MemoComponent;
-                break getTag;
+        case REACT_SUSPENSE_LIST_TYPE:
+          return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key);
 
-              case REACT_LAZY_TYPE:
-                fiberTag = LazyComponent;
-                resolvedType = null;
-                break getTag;
+        default:
+          {
+            if (typeof type === 'object' && type !== null) {
+              switch (type.$$typeof) {
+                case REACT_PROVIDER_TYPE:
+                  fiberTag = ContextProvider;
+                  break getTag;
+
+                case REACT_CONTEXT_TYPE:
+                  // This is a consumer
+                  fiberTag = ContextConsumer;
+                  break getTag;
+
+                case REACT_FORWARD_REF_TYPE:
+                  fiberTag = ForwardRef;
+
+                  {
+                    resolvedType = resolveForwardRefForHotReloading(resolvedType);
+                  }
 
-              case REACT_FUNDAMENTAL_TYPE:
-                if (enableFundamentalAPI) {
-                  return createFiberFromFundamental(type, pendingProps, mode, expirationTime, key);
-                }
+                  break getTag;
 
-                break;
+                case REACT_MEMO_TYPE:
+                  fiberTag = MemoComponent;
+                  break getTag;
 
-              case REACT_SCOPE_TYPE:
-                if (enableScopeAPI) {
-                  return createFiberFromScope(type, pendingProps, mode, expirationTime, key);
-                }
+                case REACT_LAZY_TYPE:
+                  fiberTag = LazyComponent;
+                  resolvedType = null;
+                  break getTag;
+
+                case REACT_BLOCK_TYPE:
+                  fiberTag = Block;
+                  break getTag;
 
+              }
             }
-          }
 
-          var info = '';
+            var info = '';
 
-          {
-            if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
-              info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.';
-            }
+            {
+              if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
+                info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.';
+              }
 
-            var ownerName = owner ? getComponentName(owner.type) : null;
+              var ownerName = owner ? getComponentName(owner.type) : null;
 
-            if (ownerName) {
-              info += '\n\nCheck the render method of `' + ownerName + '`.';
+              if (ownerName) {
+                info += '\n\nCheck the render method of `' + ownerName + '`.';
+              }
             }
-          }
 
-          {
             {
-              throw Error("Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (type == null ? type : typeof type) + "." + info);
+              {
+                throw Error( "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (type == null ? type : typeof type) + "." + info );
+              }
             }
           }
-        }
+      }
     }
-  }
 
-  fiber = createFiber(fiberTag, pendingProps, key, mode);
-  fiber.elementType = type;
-  fiber.type = resolvedType;
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
-function createFiberFromElement(element, mode, expirationTime) {
-  var owner = null;
-
-  {
-    owner = element._owner;
+    fiber = createFiber(fiberTag, pendingProps, key, mode);
+    fiber.elementType = type;
+    fiber.type = resolvedType;
+    fiber.expirationTime = expirationTime;
+    return fiber;
   }
+  function createFiberFromElement(element, mode, expirationTime) {
+    var owner = null;
 
-  var type = element.type;
-  var key = element.key;
-  var pendingProps = element.props;
-  var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);
+    {
+      owner = element._owner;
+    }
 
-  {
-    fiber._debugSource = element._source;
-    fiber._debugOwner = element._owner;
-  }
-
-  return fiber;
-}
-function createFiberFromFragment(elements, mode, expirationTime, key) {
-  var fiber = createFiber(Fragment, elements, key, mode);
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
-function createFiberFromFundamental(fundamentalComponent, pendingProps, mode, expirationTime, key) {
-  var fiber = createFiber(FundamentalComponent, pendingProps, key, mode);
-  fiber.elementType = fundamentalComponent;
-  fiber.type = fundamentalComponent;
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
-
-function createFiberFromScope(scope, pendingProps, mode, expirationTime, key) {
-  var fiber = createFiber(ScopeComponent, pendingProps, key, mode);
-  fiber.type = scope;
-  fiber.elementType = scope;
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
-
-function createFiberFromProfiler(pendingProps, mode, expirationTime, key) {
-  {
-    if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {
-      warningWithoutStack$1(false, 'Profiler must specify an "id" string and "onRender" function as props');
+    var type = element.type;
+    var key = element.key;
+    var pendingProps = element.props;
+    var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);
+
+    {
+      fiber._debugSource = element._source;
+      fiber._debugOwner = element._owner;
     }
-  }
 
-  var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag.
+    return fiber;
+  }
+  function createFiberFromFragment(elements, mode, expirationTime, key) {
+    var fiber = createFiber(Fragment, elements, key, mode);
+    fiber.expirationTime = expirationTime;
+    return fiber;
+  }
 
-  fiber.elementType = REACT_PROFILER_TYPE;
-  fiber.type = REACT_PROFILER_TYPE;
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
+  function createFiberFromProfiler(pendingProps, mode, expirationTime, key) {
+    {
+      if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {
+        error('Profiler must specify an "id" string and "onRender" function as props');
+      }
+    }
 
-function createFiberFromSuspense(pendingProps, mode, expirationTime, key) {
-  var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.
-  // This needs to be fixed in getComponentName so that it relies on the tag
-  // instead.
+    var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag.
 
-  fiber.type = REACT_SUSPENSE_TYPE;
-  fiber.elementType = REACT_SUSPENSE_TYPE;
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
-function createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) {
-  var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);
+    fiber.elementType = REACT_PROFILER_TYPE;
+    fiber.type = REACT_PROFILER_TYPE;
+    fiber.expirationTime = expirationTime;
+    return fiber;
+  }
 
-  {
-    // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag.
+  function createFiberFromSuspense(pendingProps, mode, expirationTime, key) {
+    var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.
     // This needs to be fixed in getComponentName so that it relies on the tag
     // instead.
-    fiber.type = REACT_SUSPENSE_LIST_TYPE;
-  }
-
-  fiber.elementType = REACT_SUSPENSE_LIST_TYPE;
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
-function createFiberFromText(content, mode, expirationTime) {
-  var fiber = createFiber(HostText, content, null, mode);
-  fiber.expirationTime = expirationTime;
-  return fiber;
-}
-function createFiberFromHostInstanceForDeletion() {
-  var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type.
-
-  fiber.elementType = 'DELETED';
-  fiber.type = 'DELETED';
-  return fiber;
-}
-function createFiberFromDehydratedFragment(dehydratedNode) {
-  var fiber = createFiber(DehydratedFragment, null, null, NoMode);
-  fiber.stateNode = dehydratedNode;
-  return fiber;
-}
-function createFiberFromPortal(portal, mode, expirationTime) {
-  var pendingProps = portal.children !== null ? portal.children : [];
-  var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
-  fiber.expirationTime = expirationTime;
-  fiber.stateNode = {
-    containerInfo: portal.containerInfo,
-    pendingChildren: null,
-    // Used by persistent updates
-    implementation: portal.implementation
-  };
-  return fiber;
-} // Used for stashing WIP properties to replay failed work in DEV.
-
-function assignFiberPropertiesInDEV(target, source) {
-  if (target === null) {
-    // This Fiber's initial properties will always be overwritten.
-    // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
-    target = createFiber(IndeterminateComponent, null, null, NoMode);
-  } // This is intentionally written as a list of all properties.
-  // We tried to use Object.assign() instead but this is called in
-  // the hottest path, and Object.assign() was too slow:
-  // https://github.com/facebook/react/issues/12502
-  // This code is DEV-only so size is not a concern.
-
-
-  target.tag = source.tag;
-  target.key = source.key;
-  target.elementType = source.elementType;
-  target.type = source.type;
-  target.stateNode = source.stateNode;
-  target.return = source.return;
-  target.child = source.child;
-  target.sibling = source.sibling;
-  target.index = source.index;
-  target.ref = source.ref;
-  target.pendingProps = source.pendingProps;
-  target.memoizedProps = source.memoizedProps;
-  target.updateQueue = source.updateQueue;
-  target.memoizedState = source.memoizedState;
-  target.dependencies = source.dependencies;
-  target.mode = source.mode;
-  target.effectTag = source.effectTag;
-  target.nextEffect = source.nextEffect;
-  target.firstEffect = source.firstEffect;
-  target.lastEffect = source.lastEffect;
-  target.expirationTime = source.expirationTime;
-  target.childExpirationTime = source.childExpirationTime;
-  target.alternate = source.alternate;
-
-  if (enableProfilerTimer) {
-    target.actualDuration = source.actualDuration;
-    target.actualStartTime = source.actualStartTime;
-    target.selfBaseDuration = source.selfBaseDuration;
-    target.treeBaseDuration = source.treeBaseDuration;
-  }
-
-  target._debugID = source._debugID;
-  target._debugSource = source._debugSource;
-  target._debugOwner = source._debugOwner;
-  target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;
-  target._debugNeedsRemount = source._debugNeedsRemount;
-  target._debugHookTypes = source._debugHookTypes;
-  return target;
-}
-
-function FiberRootNode(containerInfo, tag, hydrate) {
-  this.tag = tag;
-  this.current = null;
-  this.containerInfo = containerInfo;
-  this.pendingChildren = null;
-  this.pingCache = null;
-  this.finishedExpirationTime = NoWork;
-  this.finishedWork = null;
-  this.timeoutHandle = noTimeout;
-  this.context = null;
-  this.pendingContext = null;
-  this.hydrate = hydrate;
-  this.callbackNode = null;
-  this.callbackPriority = NoPriority;
-  this.firstPendingTime = NoWork;
-  this.firstSuspendedTime = NoWork;
-  this.lastSuspendedTime = NoWork;
-  this.nextKnownPendingLevel = NoWork;
-  this.lastPingedTime = NoWork;
-  this.lastExpiredTime = NoWork;
-
-  if (enableSchedulerTracing) {
-    this.interactionThreadID = unstable_getThreadID();
-    this.memoizedInteractions = new Set();
-    this.pendingInteractionMap = new Map();
-  }
-
-  if (enableSuspenseCallback) {
-    this.hydrationCallbacks = null;
-  }
-}
-
-function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) {
-  var root = new FiberRootNode(containerInfo, tag, hydrate);
-
-  if (enableSuspenseCallback) {
-    root.hydrationCallbacks = hydrationCallbacks;
-  } // Cyclic construction. This cheats the type system right now because
-  // stateNode is any.
-
-
-  var uninitializedFiber = createHostRootFiber(tag);
-  root.current = uninitializedFiber;
-  uninitializedFiber.stateNode = root;
-  return root;
-}
-function isRootSuspendedAtTime(root, expirationTime) {
-  var firstSuspendedTime = root.firstSuspendedTime;
-  var lastSuspendedTime = root.lastSuspendedTime;
-  return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime;
-}
-function markRootSuspendedAtTime(root, expirationTime) {
-  var firstSuspendedTime = root.firstSuspendedTime;
-  var lastSuspendedTime = root.lastSuspendedTime;
-
-  if (firstSuspendedTime < expirationTime) {
-    root.firstSuspendedTime = expirationTime;
-  }
-
-  if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) {
-    root.lastSuspendedTime = expirationTime;
-  }
-
-  if (expirationTime <= root.lastPingedTime) {
-    root.lastPingedTime = NoWork;
-  }
-
-  if (expirationTime <= root.lastExpiredTime) {
-    root.lastExpiredTime = NoWork;
-  }
-}
-function markRootUpdatedAtTime(root, expirationTime) {
-  // Update the range of pending times
-  var firstPendingTime = root.firstPendingTime;
-
-  if (expirationTime > firstPendingTime) {
-    root.firstPendingTime = expirationTime;
-  } // Update the range of suspended times. Treat everything lower priority or
-  // equal to this update as unsuspended.
-
-
-  var firstSuspendedTime = root.firstSuspendedTime;
-
-  if (firstSuspendedTime !== NoWork) {
-    if (expirationTime >= firstSuspendedTime) {
-      // The entire suspended range is now unsuspended.
-      root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;
-    } else if (expirationTime >= root.lastSuspendedTime) {
-      root.lastSuspendedTime = expirationTime + 1;
-    } // This is a pending level. Check if it's higher priority than the next
-    // known pending level.
 
+    fiber.type = REACT_SUSPENSE_TYPE;
+    fiber.elementType = REACT_SUSPENSE_TYPE;
+    fiber.expirationTime = expirationTime;
+    return fiber;
+  }
+  function createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) {
+    var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);
 
-    if (expirationTime > root.nextKnownPendingLevel) {
-      root.nextKnownPendingLevel = expirationTime;
+    {
+      // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag.
+      // This needs to be fixed in getComponentName so that it relies on the tag
+      // instead.
+      fiber.type = REACT_SUSPENSE_LIST_TYPE;
     }
-  }
-}
-function markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) {
-  // Update the range of pending times
-  root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or
-  // equal to this update as unsuspended.
 
-  if (finishedExpirationTime <= root.lastSuspendedTime) {
-    // The entire suspended range is now unsuspended.
-    root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;
-  } else if (finishedExpirationTime <= root.firstSuspendedTime) {
-    // Part of the suspended range is now unsuspended. Narrow the range to
-    // include everything between the unsuspended time (non-inclusive) and the
-    // last suspended time.
-    root.firstSuspendedTime = finishedExpirationTime - 1;
+    fiber.elementType = REACT_SUSPENSE_LIST_TYPE;
+    fiber.expirationTime = expirationTime;
+    return fiber;
   }
-
-  if (finishedExpirationTime <= root.lastPingedTime) {
-    // Clear the pinged time
-    root.lastPingedTime = NoWork;
+  function createFiberFromText(content, mode, expirationTime) {
+    var fiber = createFiber(HostText, content, null, mode);
+    fiber.expirationTime = expirationTime;
+    return fiber;
   }
+  function createFiberFromHostInstanceForDeletion() {
+    var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type.
 
-  if (finishedExpirationTime <= root.lastExpiredTime) {
-    // Clear the expired time
-    root.lastExpiredTime = NoWork;
+    fiber.elementType = 'DELETED';
+    fiber.type = 'DELETED';
+    return fiber;
   }
-}
-function markRootExpiredAtTime(root, expirationTime) {
-  var lastExpiredTime = root.lastExpiredTime;
+  function createFiberFromPortal(portal, mode, expirationTime) {
+    var pendingProps = portal.children !== null ? portal.children : [];
+    var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
+    fiber.expirationTime = expirationTime;
+    fiber.stateNode = {
+      containerInfo: portal.containerInfo,
+      pendingChildren: null,
+      // Used by persistent updates
+      implementation: portal.implementation
+    };
+    return fiber;
+  } // Used for stashing WIP properties to replay failed work in DEV.
+
+  function assignFiberPropertiesInDEV(target, source) {
+    if (target === null) {
+      // This Fiber's initial properties will always be overwritten.
+      // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
+      target = createFiber(IndeterminateComponent, null, null, NoMode);
+    } // This is intentionally written as a list of all properties.
+    // We tried to use Object.assign() instead but this is called in
+    // the hottest path, and Object.assign() was too slow:
+    // https://github.com/facebook/react/issues/12502
+    // This code is DEV-only so size is not a concern.
+
+
+    target.tag = source.tag;
+    target.key = source.key;
+    target.elementType = source.elementType;
+    target.type = source.type;
+    target.stateNode = source.stateNode;
+    target.return = source.return;
+    target.child = source.child;
+    target.sibling = source.sibling;
+    target.index = source.index;
+    target.ref = source.ref;
+    target.pendingProps = source.pendingProps;
+    target.memoizedProps = source.memoizedProps;
+    target.updateQueue = source.updateQueue;
+    target.memoizedState = source.memoizedState;
+    target.dependencies = source.dependencies;
+    target.mode = source.mode;
+    target.effectTag = source.effectTag;
+    target.nextEffect = source.nextEffect;
+    target.firstEffect = source.firstEffect;
+    target.lastEffect = source.lastEffect;
+    target.expirationTime = source.expirationTime;
+    target.childExpirationTime = source.childExpirationTime;
+    target.alternate = source.alternate;
 
-  if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) {
-    root.lastExpiredTime = expirationTime;
-  }
-}
+    {
+      target.actualDuration = source.actualDuration;
+      target.actualStartTime = source.actualStartTime;
+      target.selfBaseDuration = source.selfBaseDuration;
+      target.treeBaseDuration = source.treeBaseDuration;
+    }
 
-// This lets us hook into Fiber to debug what it's doing.
-// See https://github.com/facebook/react/pull/8033.
-// This is not part of the public API, not even for React DevTools.
-// You may only inject a debugTool if you work on React Fiber itself.
-var ReactFiberInstrumentation = {
-  debugTool: null
-};
-var ReactFiberInstrumentation_1 = ReactFiberInstrumentation;
+    {
+      target._debugID = source._debugID;
+    }
+
+    target._debugSource = source._debugSource;
+    target._debugOwner = source._debugOwner;
+    target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;
+    target._debugNeedsRemount = source._debugNeedsRemount;
+    target._debugHookTypes = source._debugHookTypes;
+    return target;
+  }
+
+  function FiberRootNode(containerInfo, tag, hydrate) {
+    this.tag = tag;
+    this.current = null;
+    this.containerInfo = containerInfo;
+    this.pendingChildren = null;
+    this.pingCache = null;
+    this.finishedExpirationTime = NoWork;
+    this.finishedWork = null;
+    this.timeoutHandle = noTimeout;
+    this.context = null;
+    this.pendingContext = null;
+    this.hydrate = hydrate;
+    this.callbackNode = null;
+    this.callbackPriority = NoPriority;
+    this.firstPendingTime = NoWork;
+    this.firstSuspendedTime = NoWork;
+    this.lastSuspendedTime = NoWork;
+    this.nextKnownPendingLevel = NoWork;
+    this.lastPingedTime = NoWork;
+    this.lastExpiredTime = NoWork;
+
+    {
+      this.interactionThreadID = unstable_getThreadID();
+      this.memoizedInteractions = new Set();
+      this.pendingInteractionMap = new Map();
+    }
+  }
 
-var didWarnAboutNestedUpdates;
-var didWarnAboutFindNodeInStrictMode;
+  function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) {
+    var root = new FiberRootNode(containerInfo, tag, hydrate);
+    // stateNode is any.
 
-{
-  didWarnAboutNestedUpdates = false;
-  didWarnAboutFindNodeInStrictMode = {};
-}
 
-function getContextForSubtree(parentComponent) {
-  if (!parentComponent) {
-    return emptyContextObject;
+    var uninitializedFiber = createHostRootFiber(tag);
+    root.current = uninitializedFiber;
+    uninitializedFiber.stateNode = root;
+    initializeUpdateQueue(uninitializedFiber);
+    return root;
+  }
+  function isRootSuspendedAtTime(root, expirationTime) {
+    var firstSuspendedTime = root.firstSuspendedTime;
+    var lastSuspendedTime = root.lastSuspendedTime;
+    return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime;
   }
+  function markRootSuspendedAtTime(root, expirationTime) {
+    var firstSuspendedTime = root.firstSuspendedTime;
+    var lastSuspendedTime = root.lastSuspendedTime;
+
+    if (firstSuspendedTime < expirationTime) {
+      root.firstSuspendedTime = expirationTime;
+    }
 
-  var fiber = get(parentComponent);
-  var parentContext = findCurrentUnmaskedContext(fiber);
+    if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) {
+      root.lastSuspendedTime = expirationTime;
+    }
 
-  if (fiber.tag === ClassComponent) {
-    var Component = fiber.type;
+    if (expirationTime <= root.lastPingedTime) {
+      root.lastPingedTime = NoWork;
+    }
 
-    if (isContextProvider(Component)) {
-      return processChildContext(fiber, Component, parentContext);
+    if (expirationTime <= root.lastExpiredTime) {
+      root.lastExpiredTime = NoWork;
     }
   }
+  function markRootUpdatedAtTime(root, expirationTime) {
+    // Update the range of pending times
+    var firstPendingTime = root.firstPendingTime;
 
-  return parentContext;
-}
+    if (expirationTime > firstPendingTime) {
+      root.firstPendingTime = expirationTime;
+    } // Update the range of suspended times. Treat everything lower priority or
+    // equal to this update as unsuspended.
 
-function findHostInstance(component) {
-  var fiber = get(component);
 
-  if (fiber === undefined) {
-    if (typeof component.render === 'function') {
-      {
-        {
-          throw Error("Unable to find node on an unmounted component.");
-        }
-      }
-    } else {
-      {
-        {
-          throw Error("Argument appears to not be a ReactComponent. Keys: " + Object.keys(component));
-        }
+    var firstSuspendedTime = root.firstSuspendedTime;
+
+    if (firstSuspendedTime !== NoWork) {
+      if (expirationTime >= firstSuspendedTime) {
+        // The entire suspended range is now unsuspended.
+        root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;
+      } else if (expirationTime >= root.lastSuspendedTime) {
+        root.lastSuspendedTime = expirationTime + 1;
+      } // This is a pending level. Check if it's higher priority than the next
+      // known pending level.
+
+
+      if (expirationTime > root.nextKnownPendingLevel) {
+        root.nextKnownPendingLevel = expirationTime;
       }
     }
   }
+  function markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) {
+    // Update the range of pending times
+    root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or
+    // equal to this update as unsuspended.
+
+    if (finishedExpirationTime <= root.lastSuspendedTime) {
+      // The entire suspended range is now unsuspended.
+      root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;
+    } else if (finishedExpirationTime <= root.firstSuspendedTime) {
+      // Part of the suspended range is now unsuspended. Narrow the range to
+      // include everything between the unsuspended time (non-inclusive) and the
+      // last suspended time.
+      root.firstSuspendedTime = finishedExpirationTime - 1;
+    }
 
-  var hostFiber = findCurrentHostFiber(fiber);
+    if (finishedExpirationTime <= root.lastPingedTime) {
+      // Clear the pinged time
+      root.lastPingedTime = NoWork;
+    }
 
-  if (hostFiber === null) {
-    return null;
+    if (finishedExpirationTime <= root.lastExpiredTime) {
+      // Clear the expired time
+      root.lastExpiredTime = NoWork;
+    }
+  }
+  function markRootExpiredAtTime(root, expirationTime) {
+    var lastExpiredTime = root.lastExpiredTime;
+
+    if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) {
+      root.lastExpiredTime = expirationTime;
+    }
   }
 
-  return hostFiber.stateNode;
-}
+  var didWarnAboutNestedUpdates;
+  var didWarnAboutFindNodeInStrictMode;
 
-function findHostInstanceWithWarning(component, methodName) {
   {
-    var fiber = get(component);
+    didWarnAboutNestedUpdates = false;
+    didWarnAboutFindNodeInStrictMode = {};
+  }
 
-    if (fiber === undefined) {
-      if (typeof component.render === 'function') {
-        {
+  function getContextForSubtree(parentComponent) {
+    if (!parentComponent) {
+      return emptyContextObject;
+    }
+
+    var fiber = get(parentComponent);
+    var parentContext = findCurrentUnmaskedContext(fiber);
+
+    if (fiber.tag === ClassComponent) {
+      var Component = fiber.type;
+
+      if (isContextProvider(Component)) {
+        return processChildContext(fiber, Component, parentContext);
+      }
+    }
+
+    return parentContext;
+  }
+
+  function findHostInstanceWithWarning(component, methodName) {
+    {
+      var fiber = get(component);
+
+      if (fiber === undefined) {
+        if (typeof component.render === 'function') {
           {
-            throw Error("Unable to find node on an unmounted component.");
+            {
+              throw Error( "Unable to find node on an unmounted component." );
+            }
           }
-        }
-      } else {
-        {
+        } else {
           {
-            throw Error("Argument appears to not be a ReactComponent. Keys: " + Object.keys(component));
+            {
+              throw Error( "Argument appears to not be a ReactComponent. Keys: " + Object.keys(component) );
+            }
           }
         }
       }
-    }
 
-    var hostFiber = findCurrentHostFiber(fiber);
+      var hostFiber = findCurrentHostFiber(fiber);
 
-    if (hostFiber === null) {
-      return null;
-    }
+      if (hostFiber === null) {
+        return null;
+      }
 
-    if (hostFiber.mode & StrictMode) {
-      var componentName = getComponentName(fiber.type) || 'Component';
+      if (hostFiber.mode & StrictMode) {
+        var componentName = getComponentName(fiber.type) || 'Component';
 
-      if (!didWarnAboutFindNodeInStrictMode[componentName]) {
-        didWarnAboutFindNodeInStrictMode[componentName] = true;
+        if (!didWarnAboutFindNodeInStrictMode[componentName]) {
+          didWarnAboutFindNodeInStrictMode[componentName] = true;
 
-        if (fiber.mode & StrictMode) {
-          warningWithoutStack$1(false, '%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));
-        } else {
-          warningWithoutStack$1(false, '%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));
+          if (fiber.mode & StrictMode) {
+            error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));
+          } else {
+            error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));
+          }
         }
       }
-    }
 
-    return hostFiber.stateNode;
+      return hostFiber.stateNode;
+    }
   }
 
-  return findHostInstance(component);
-}
-
-function createContainer(containerInfo, tag, hydrate, hydrationCallbacks) {
-  return createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks);
-}
-function updateContainer(element, container, parentComponent, callback) {
-  var current$$1 = container.current;
-  var currentTime = requestCurrentTimeForUpdate();
-
-  {
-    // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
-    if ('undefined' !== typeof jest) {
-      warnIfUnmockedScheduler(current$$1);
-      warnIfNotScopedWithMatchingAct(current$$1);
-    }
+  function createContainer(containerInfo, tag, hydrate, hydrationCallbacks) {
+    return createFiberRoot(containerInfo, tag, hydrate);
   }
+  function updateContainer(element, container, parentComponent, callback) {
+    {
+      onScheduleRoot(container, element);
+    }
 
-  var suspenseConfig = requestCurrentSuspenseConfig();
-  var expirationTime = computeExpirationForFiber(currentTime, current$$1, suspenseConfig);
+    var current$1 = container.current;
+    var currentTime = requestCurrentTimeForUpdate();
 
-  {
-    if (ReactFiberInstrumentation_1.debugTool) {
-      if (current$$1.alternate === null) {
-        ReactFiberInstrumentation_1.debugTool.onMountContainer(container);
-      } else if (element === null) {
-        ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container);
-      } else {
-        ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container);
+    {
+      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests
+      if ('undefined' !== typeof jest) {
+        warnIfUnmockedScheduler(current$1);
+        warnIfNotScopedWithMatchingAct(current$1);
       }
     }
-  }
-
-  var context = getContextForSubtree(parentComponent);
 
-  if (container.context === null) {
-    container.context = context;
-  } else {
-    container.pendingContext = context;
-  }
+    var suspenseConfig = requestCurrentSuspenseConfig();
+    var expirationTime = computeExpirationForFiber(currentTime, current$1, suspenseConfig);
+    var context = getContextForSubtree(parentComponent);
 
-  {
-    if (phase === 'render' && current !== null && !didWarnAboutNestedUpdates) {
-      didWarnAboutNestedUpdates = true;
-      warningWithoutStack$1(false, 'Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown');
+    if (container.context === null) {
+      container.context = context;
+    } else {
+      container.pendingContext = context;
     }
-  }
 
-  var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property
-  // being called "element".
+    {
+      if (isRendering && current !== null && !didWarnAboutNestedUpdates) {
+        didWarnAboutNestedUpdates = true;
 
-  update.payload = {
-    element: element
-  };
-  callback = callback === undefined ? null : callback;
+        error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown');
+      }
+    }
 
-  if (callback !== null) {
-    !(typeof callback === 'function') ? warningWithoutStack$1(false, 'render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback) : void 0;
-    update.callback = callback;
-  }
+    var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property
+    // being called "element".
 
-  enqueueUpdate(current$$1, update);
-  scheduleWork(current$$1, expirationTime);
-  return expirationTime;
-}
-function getPublicRootInstance(container) {
-  var containerFiber = container.current;
+    update.payload = {
+      element: element
+    };
+    callback = callback === undefined ? null : callback;
 
-  if (!containerFiber.child) {
-    return null;
-  }
+    if (callback !== null) {
+      {
+        if (typeof callback !== 'function') {
+          error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);
+        }
+      }
 
-  switch (containerFiber.child.tag) {
-    case HostComponent:
-      return getPublicInstance(containerFiber.child.stateNode);
+      update.callback = callback;
+    }
 
-    default:
-      return containerFiber.child.stateNode;
+    enqueueUpdate(current$1, update);
+    scheduleWork(current$1, expirationTime);
+    return expirationTime;
   }
-}
-function attemptSynchronousHydration$1(fiber) {
-  switch (fiber.tag) {
-    case HostRoot:
-      var root = fiber.stateNode;
-
-      if (root.hydrate) {
-        // Flush the first scheduled "update".
-        flushRoot(root, root.firstPendingTime);
-      }
+  function getPublicRootInstance(container) {
+    var containerFiber = container.current;
 
-      break;
+    if (!containerFiber.child) {
+      return null;
+    }
 
-    case SuspenseComponent:
-      flushSync(function () {
-        return scheduleWork(fiber, Sync);
-      }); // If we're still blocked after this, we need to increase
-      // the priority of any promises resolving within this
-      // boundary so that they next attempt also has higher pri.
+    switch (containerFiber.child.tag) {
+      case HostComponent:
+        return getPublicInstance(containerFiber.child.stateNode);
 
-      var retryExpTime = computeInteractiveExpiration(requestCurrentTimeForUpdate());
-      markRetryTimeIfNotHydrated(fiber, retryExpTime);
-      break;
+      default:
+        return containerFiber.child.stateNode;
+    }
   }
-}
 
-function markRetryTimeImpl(fiber, retryTime) {
-  var suspenseState = fiber.memoizedState;
+  function markRetryTimeImpl(fiber, retryTime) {
+    var suspenseState = fiber.memoizedState;
 
-  if (suspenseState !== null && suspenseState.dehydrated !== null) {
-    if (suspenseState.retryTime < retryTime) {
-      suspenseState.retryTime = retryTime;
+    if (suspenseState !== null && suspenseState.dehydrated !== null) {
+      if (suspenseState.retryTime < retryTime) {
+        suspenseState.retryTime = retryTime;
+      }
     }
-  }
-} // Increases the priority of thennables when they resolve within this boundary.
+  } // Increases the priority of thennables when they resolve within this boundary.
 
 
-function markRetryTimeIfNotHydrated(fiber, retryTime) {
-  markRetryTimeImpl(fiber, retryTime);
-  var alternate = fiber.alternate;
+  function markRetryTimeIfNotHydrated(fiber, retryTime) {
+    markRetryTimeImpl(fiber, retryTime);
+    var alternate = fiber.alternate;
 
-  if (alternate) {
-    markRetryTimeImpl(alternate, retryTime);
-  }
-}
-
-function attemptUserBlockingHydration$1(fiber) {
-  if (fiber.tag !== SuspenseComponent) {
-    // We ignore HostRoots here because we can't increase
-    // their priority and they should not suspend on I/O,
-    // since you have to wrap anything that might suspend in
-    // Suspense.
-    return;
+    if (alternate) {
+      markRetryTimeImpl(alternate, retryTime);
+    }
   }
 
-  var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate());
-  scheduleWork(fiber, expTime);
-  markRetryTimeIfNotHydrated(fiber, expTime);
-}
-function attemptContinuousHydration$1(fiber) {
-  if (fiber.tag !== SuspenseComponent) {
-    // We ignore HostRoots here because we can't increase
-    // their priority and they should not suspend on I/O,
-    // since you have to wrap anything that might suspend in
-    // Suspense.
-    return;
-  }
+  function attemptUserBlockingHydration$1(fiber) {
+    if (fiber.tag !== SuspenseComponent) {
+      // We ignore HostRoots here because we can't increase
+      // their priority and they should not suspend on I/O,
+      // since you have to wrap anything that might suspend in
+      // Suspense.
+      return;
+    }
 
-  var expTime = computeContinuousHydrationExpiration(requestCurrentTimeForUpdate());
-  scheduleWork(fiber, expTime);
-  markRetryTimeIfNotHydrated(fiber, expTime);
-}
-function attemptHydrationAtCurrentPriority$1(fiber) {
-  if (fiber.tag !== SuspenseComponent) {
-    // We ignore HostRoots here because we can't increase
-    // their priority other than synchronously flush it.
-    return;
+    var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate());
+    scheduleWork(fiber, expTime);
+    markRetryTimeIfNotHydrated(fiber, expTime);
   }
+  function attemptContinuousHydration$1(fiber) {
+    if (fiber.tag !== SuspenseComponent) {
+      // We ignore HostRoots here because we can't increase
+      // their priority and they should not suspend on I/O,
+      // since you have to wrap anything that might suspend in
+      // Suspense.
+      return;
+    }
 
-  var currentTime = requestCurrentTimeForUpdate();
-  var expTime = computeExpirationForFiber(currentTime, fiber, null);
-  scheduleWork(fiber, expTime);
-  markRetryTimeIfNotHydrated(fiber, expTime);
-}
-function findHostInstanceWithNoPortals(fiber) {
-  var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
-
-  if (hostFiber === null) {
-    return null;
+    scheduleWork(fiber, ContinuousHydration);
+    markRetryTimeIfNotHydrated(fiber, ContinuousHydration);
   }
+  function attemptHydrationAtCurrentPriority$1(fiber) {
+    if (fiber.tag !== SuspenseComponent) {
+      // We ignore HostRoots here because we can't increase
+      // their priority other than synchronously flush it.
+      return;
+    }
 
-  if (hostFiber.tag === FundamentalComponent) {
-    return hostFiber.stateNode.instance;
+    var currentTime = requestCurrentTimeForUpdate();
+    var expTime = computeExpirationForFiber(currentTime, fiber, null);
+    scheduleWork(fiber, expTime);
+    markRetryTimeIfNotHydrated(fiber, expTime);
   }
+  function findHostInstanceWithNoPortals(fiber) {
+    var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
 
-  return hostFiber.stateNode;
-}
-
-var shouldSuspendImpl = function (fiber) {
-  return false;
-};
-
-function shouldSuspend(fiber) {
-  return shouldSuspendImpl(fiber);
-}
-var overrideHookState = null;
-var overrideProps = null;
-var scheduleUpdate = null;
-var setSuspenseHandler = null;
+    if (hostFiber === null) {
+      return null;
+    }
 
-{
-  var copyWithSetImpl = function (obj, path, idx, value) {
-    if (idx >= path.length) {
-      return value;
+    if (hostFiber.tag === FundamentalComponent) {
+      return hostFiber.stateNode.instance;
     }
 
-    var key = path[idx];
-    var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here
+    return hostFiber.stateNode;
+  }
 
-    updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);
-    return updated;
+  var shouldSuspendImpl = function (fiber) {
+    return false;
   };
 
-  var copyWithSet = function (obj, path, value) {
-    return copyWithSetImpl(obj, path, 0, value);
-  }; // Support DevTools editable values for useState and useReducer.
+  function shouldSuspend(fiber) {
+    return shouldSuspendImpl(fiber);
+  }
+  var overrideHookState = null;
+  var overrideProps = null;
+  var scheduleUpdate = null;
+  var setSuspenseHandler = null;
 
+  {
+    var copyWithSetImpl = function (obj, path, idx, value) {
+      if (idx >= path.length) {
+        return value;
+      }
 
-  overrideHookState = function (fiber, id, path, value) {
-    // For now, the "id" of stateful hooks is just the stateful hook index.
-    // This may change in the future with e.g. nested hooks.
-    var currentHook = fiber.memoizedState;
+      var key = path[idx];
+      var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here
 
-    while (currentHook !== null && id > 0) {
-      currentHook = currentHook.next;
-      id--;
-    }
+      updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);
+      return updated;
+    };
 
-    if (currentHook !== null) {
-      var newState = copyWithSet(currentHook.memoizedState, path, value);
-      currentHook.memoizedState = newState;
-      currentHook.baseState = newState; // We aren't actually adding an update to the queue,
-      // because there is no update we can add for useReducer hooks that won't trigger an error.
-      // (There's no appropriate action type for DevTools overrides.)
-      // As a result though, React will see the scheduled update as a noop and bailout.
-      // Shallow cloning props works as a workaround for now to bypass the bailout check.
-
-      fiber.memoizedProps = _assign({}, fiber.memoizedProps);
-      scheduleWork(fiber, Sync);
-    }
-  }; // Support DevTools props for function components, forwardRef, memo, host components, etc.
+    var copyWithSet = function (obj, path, value) {
+      return copyWithSetImpl(obj, path, 0, value);
+    }; // Support DevTools editable values for useState and useReducer.
 
 
-  overrideProps = function (fiber, path, value) {
-    fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
+    overrideHookState = function (fiber, id, path, value) {
+      // For now, the "id" of stateful hooks is just the stateful hook index.
+      // This may change in the future with e.g. nested hooks.
+      var currentHook = fiber.memoizedState;
 
-    if (fiber.alternate) {
-      fiber.alternate.pendingProps = fiber.pendingProps;
-    }
+      while (currentHook !== null && id > 0) {
+        currentHook = currentHook.next;
+        id--;
+      }
 
-    scheduleWork(fiber, Sync);
-  };
+      if (currentHook !== null) {
+        var newState = copyWithSet(currentHook.memoizedState, path, value);
+        currentHook.memoizedState = newState;
+        currentHook.baseState = newState; // We aren't actually adding an update to the queue,
+        // because there is no update we can add for useReducer hooks that won't trigger an error.
+        // (There's no appropriate action type for DevTools overrides.)
+        // As a result though, React will see the scheduled update as a noop and bailout.
+        // Shallow cloning props works as a workaround for now to bypass the bailout check.
 
-  scheduleUpdate = function (fiber) {
-    scheduleWork(fiber, Sync);
-  };
+        fiber.memoizedProps = _assign({}, fiber.memoizedProps);
+        scheduleWork(fiber, Sync);
+      }
+    }; // Support DevTools props for function components, forwardRef, memo, host components, etc.
 
-  setSuspenseHandler = function (newShouldSuspendImpl) {
-    shouldSuspendImpl = newShouldSuspendImpl;
-  };
-}
-
-function injectIntoDevTools(devToolsConfig) {
-  var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
-  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
-  return injectInternals(_assign({}, devToolsConfig, {
-    overrideHookState: overrideHookState,
-    overrideProps: overrideProps,
-    setSuspenseHandler: setSuspenseHandler,
-    scheduleUpdate: scheduleUpdate,
-    currentDispatcherRef: ReactCurrentDispatcher,
-    findHostInstanceByFiber: function (fiber) {
-      var hostFiber = findCurrentHostFiber(fiber);
 
-      if (hostFiber === null) {
-        return null;
-      }
+    overrideProps = function (fiber, path, value) {
+      fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
 
-      return hostFiber.stateNode;
-    },
-    findFiberByHostInstance: function (instance) {
-      if (!findFiberByHostInstance) {
-        // Might not be implemented by the renderer.
-        return null;
+      if (fiber.alternate) {
+        fiber.alternate.pendingProps = fiber.pendingProps;
       }
 
-      return findFiberByHostInstance(instance);
-    },
-    // React Refresh
-    findHostInstancesForRefresh: findHostInstancesForRefresh,
-    scheduleRefresh: scheduleRefresh,
-    scheduleRoot: scheduleRoot,
-    setRefreshHandler: setRefreshHandler,
-    // Enables DevTools to append owner stacks to error messages in DEV mode.
-    getCurrentFiber: function () {
-      return current;
-    }
-  }));
-}
+      scheduleWork(fiber, Sync);
+    };
 
-// This file intentionally does *not* have the Flow annotation.
-// Don't add it. See `./inline-typed.js` for an explanation.
+    scheduleUpdate = function (fiber) {
+      scheduleWork(fiber, Sync);
+    };
 
-// TODO: This type is shared between the reconciler and ReactDOM, but will
-// eventually be lifted out to the renderer.
-function ReactDOMRoot(container, options) {
-  this._internalRoot = createRootImpl(container, ConcurrentRoot, options);
-}
+    setSuspenseHandler = function (newShouldSuspendImpl) {
+      shouldSuspendImpl = newShouldSuspendImpl;
+    };
+  }
 
-function ReactDOMBlockingRoot(container, tag, options) {
-  this._internalRoot = createRootImpl(container, tag, options);
-}
+  function injectIntoDevTools(devToolsConfig) {
+    var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
+    var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
+    return injectInternals(_assign({}, devToolsConfig, {
+      overrideHookState: overrideHookState,
+      overrideProps: overrideProps,
+      setSuspenseHandler: setSuspenseHandler,
+      scheduleUpdate: scheduleUpdate,
+      currentDispatcherRef: ReactCurrentDispatcher,
+      findHostInstanceByFiber: function (fiber) {
+        var hostFiber = findCurrentHostFiber(fiber);
 
-ReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children, callback) {
-  var root = this._internalRoot;
-  var cb = callback === undefined ? null : callback;
+        if (hostFiber === null) {
+          return null;
+        }
 
-  {
-    warnOnInvalidCallback(cb, 'render');
-  }
+        return hostFiber.stateNode;
+      },
+      findFiberByHostInstance: function (instance) {
+        if (!findFiberByHostInstance) {
+          // Might not be implemented by the renderer.
+          return null;
+        }
 
-  updateContainer(children, root, null, cb);
-};
+        return findFiberByHostInstance(instance);
+      },
+      // React Refresh
+      findHostInstancesForRefresh:  findHostInstancesForRefresh ,
+      scheduleRefresh:  scheduleRefresh ,
+      scheduleRoot:  scheduleRoot ,
+      setRefreshHandler:  setRefreshHandler ,
+      // Enables DevTools to append owner stacks to error messages in DEV mode.
+      getCurrentFiber:  function () {
+        return current;
+      } 
+    }));
+  }
+  var IsSomeRendererActing$1 = ReactSharedInternals.IsSomeRendererActing;
 
-ReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function (callback) {
-  var root = this._internalRoot;
-  var cb = callback === undefined ? null : callback;
+  function ReactDOMRoot(container, options) {
+    this._internalRoot = createRootImpl(container, ConcurrentRoot, options);
+  }
 
-  {
-    warnOnInvalidCallback(cb, 'render');
+  function ReactDOMBlockingRoot(container, tag, options) {
+    this._internalRoot = createRootImpl(container, tag, options);
   }
 
-  var container = root.containerInfo;
-  updateContainer(null, root, null, function () {
-    unmarkContainerAsRoot(container);
+  ReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) {
+    var root = this._internalRoot;
 
-    if (cb !== null) {
-      cb();
-    }
-  });
-};
+    {
+      if (typeof arguments[1] === 'function') {
+        error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
+      }
 
-function createRootImpl(container, tag, options) {
-  // Tag is either LegacyRoot or Concurrent Root
-  var hydrate = options != null && options.hydrate === true;
-  var hydrationCallbacks = options != null && options.hydrationOptions || null;
-  var root = createContainer(container, tag, hydrate, hydrationCallbacks);
-  markContainerAsRoot(root.current, container);
+      var container = root.containerInfo;
 
-  if (hydrate && tag !== LegacyRoot) {
-    var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument;
-    eagerlyTrapReplayableEvents(doc);
-  }
+      if (container.nodeType !== COMMENT_NODE) {
+        var hostInstance = findHostInstanceWithNoPortals(root.current);
+
+        if (hostInstance) {
+          if (hostInstance.parentNode !== container) {
+            error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + "root.unmount() to empty a root's container.");
+          }
+        }
+      }
+    }
 
-  return root;
-}
+    updateContainer(children, root, null, null);
+  };
 
-function createRoot(container, options) {
-  if (!isValidContainer(container)) {
+  ReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () {
     {
-      throw Error("createRoot(...): Target container is not a DOM element.");
+      if (typeof arguments[0] === 'function') {
+        error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
+      }
     }
-  }
 
-  warnIfReactDOMContainerInDEV(container);
-  return new ReactDOMRoot(container, options);
-}
-function createBlockingRoot(container, options) {
-  if (!isValidContainer(container)) {
-    {
-      throw Error("createRoot(...): Target container is not a DOM element.");
+    var root = this._internalRoot;
+    var container = root.containerInfo;
+    updateContainer(null, root, null, function () {
+      unmarkContainerAsRoot(container);
+    });
+  };
+
+  function createRootImpl(container, tag, options) {
+    // Tag is either LegacyRoot or Concurrent Root
+    var hydrate = options != null && options.hydrate === true;
+    var hydrationCallbacks = options != null && options.hydrationOptions || null;
+    var root = createContainer(container, tag, hydrate);
+    markContainerAsRoot(root.current, container);
+
+    if (hydrate && tag !== LegacyRoot) {
+      var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument;
+      eagerlyTrapReplayableEvents(container, doc);
     }
-  }
 
-  warnIfReactDOMContainerInDEV(container);
-  return new ReactDOMBlockingRoot(container, BlockingRoot, options);
-}
-function createLegacyRoot(container, options) {
-  return new ReactDOMBlockingRoot(container, LegacyRoot, options);
-}
-function isValidContainer(node) {
-  return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));
-}
-function warnOnInvalidCallback(callback, callerName) {
-  {
-    !(callback === null || typeof callback === 'function') ? warningWithoutStack$1(false, '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback) : void 0;
+    return root;
+  }
+  function createLegacyRoot(container, options) {
+    return new ReactDOMBlockingRoot(container, LegacyRoot, options);
+  }
+  function isValidContainer(node) {
+    return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));
   }
-}
 
-function warnIfReactDOMContainerInDEV(container) {
+  var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
+  var topLevelUpdateWarnings;
+  var warnedAboutHydrateAPI = false;
+
   {
-    if (isContainerMarkedAsRoot(container)) {
-      if (container._reactRootContainer) {
-        warningWithoutStack$1(false, 'You are calling ReactDOM.createRoot() on a container that was previously ' + 'passed to ReactDOM.render(). This is not supported.');
-      } else {
-        warningWithoutStack$1(false, 'You are calling ReactDOM.createRoot() on a container that ' + 'has already been passed to createRoot() before. Instead, call ' + 'root.render() on the existing root instead if you want to update it.');
+    topLevelUpdateWarnings = function (container) {
+      if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
+        var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);
+
+        if (hostInstance) {
+          if (hostInstance.parentNode !== container) {
+            error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');
+          }
+        }
       }
-    }
-  }
-}
 
-var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;
-var topLevelUpdateWarnings;
-var warnedAboutHydrateAPI = false;
+      var isRootRenderedBySomeReact = !!container._reactRootContainer;
+      var rootEl = getReactRootElementInContainer(container);
+      var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));
 
-{
-  topLevelUpdateWarnings = function (container) {
-    if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
-      var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);
+      if (hasNonRootReactChild && !isRootRenderedBySomeReact) {
+        error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');
+      }
 
-      if (hostInstance) {
-        !(hostInstance.parentNode === container) ? warningWithoutStack$1(false, 'render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.') : void 0;
+      if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {
+        error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');
       }
-    }
+    };
+  }
 
-    var isRootRenderedBySomeReact = !!container._reactRootContainer;
-    var rootEl = getReactRootElementInContainer(container);
-    var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));
-    !(!hasNonRootReactChild || isRootRenderedBySomeReact) ? warningWithoutStack$1(false, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : void 0;
-    !(container.nodeType !== ELEMENT_NODE || !container.tagName || container.tagName.toUpperCase() !== 'BODY') ? warningWithoutStack$1(false, 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : void 0;
-  };
-}
+  function getReactRootElementInContainer(container) {
+    if (!container) {
+      return null;
+    }
 
-function getReactRootElementInContainer(container) {
-  if (!container) {
-    return null;
+    if (container.nodeType === DOCUMENT_NODE) {
+      return container.documentElement;
+    } else {
+      return container.firstChild;
+    }
   }
 
-  if (container.nodeType === DOCUMENT_NODE) {
-    return container.documentElement;
-  } else {
-    return container.firstChild;
+  function shouldHydrateDueToLegacyHeuristic(container) {
+    var rootElement = getReactRootElementInContainer(container);
+    return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));
   }
-}
 
-function shouldHydrateDueToLegacyHeuristic(container) {
-  var rootElement = getReactRootElementInContainer(container);
-  return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));
-}
+  function legacyCreateRootFromDOMContainer(container, forceHydrate) {
+    var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content.
 
-function legacyCreateRootFromDOMContainer(container, forceHydrate) {
-  var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content.
+    if (!shouldHydrate) {
+      var warned = false;
+      var rootSibling;
 
-  if (!shouldHydrate) {
-    var warned = false;
-    var rootSibling;
+      while (rootSibling = container.lastChild) {
+        {
+          if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {
+            warned = true;
 
-    while (rootSibling = container.lastChild) {
-      {
-        if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {
-          warned = true;
-          warningWithoutStack$1(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');
+            error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');
+          }
         }
+
+        container.removeChild(rootSibling);
       }
+    }
+
+    {
+      if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {
+        warnedAboutHydrateAPI = true;
 
-      container.removeChild(rootSibling);
+        warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');
+      }
     }
+
+    return createLegacyRoot(container, shouldHydrate ? {
+      hydrate: true
+    } : undefined);
   }
 
-  {
-    if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {
-      warnedAboutHydrateAPI = true;
-      lowPriorityWarningWithoutStack$1(false, 'render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');
+  function warnOnInvalidCallback$1(callback, callerName) {
+    {
+      if (callback !== null && typeof callback !== 'function') {
+        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
+      }
     }
   }
 
-  return createLegacyRoot(container, shouldHydrate ? {
-    hydrate: true
-  } : undefined);
-}
+  function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
+    {
+      topLevelUpdateWarnings(container);
+      warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');
+    } // TODO: Without `any` type, Flow says "Property cannot be accessed on any
+    // member of intersection type." Whyyyyyy.
 
-function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
-  {
-    topLevelUpdateWarnings(container);
-    warnOnInvalidCallback(callback === undefined ? null : callback, 'render');
-  } // TODO: Without `any` type, Flow says "Property cannot be accessed on any
-  // member of intersection type." Whyyyyyy.
 
+    var root = container._reactRootContainer;
+    var fiberRoot;
 
-  var root = container._reactRootContainer;
-  var fiberRoot;
+    if (!root) {
+      // Initial mount
+      root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);
+      fiberRoot = root._internalRoot;
 
-  if (!root) {
-    // Initial mount
-    root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);
-    fiberRoot = root._internalRoot;
+      if (typeof callback === 'function') {
+        var originalCallback = callback;
 
-    if (typeof callback === 'function') {
-      var originalCallback = callback;
+        callback = function () {
+          var instance = getPublicRootInstance(fiberRoot);
+          originalCallback.call(instance);
+        };
+      } // Initial mount should not be batched.
 
-      callback = function () {
-        var instance = getPublicRootInstance(fiberRoot);
-        originalCallback.call(instance);
-      };
-    } // Initial mount should not be batched.
 
+      unbatchedUpdates(function () {
+        updateContainer(children, fiberRoot, parentComponent, callback);
+      });
+    } else {
+      fiberRoot = root._internalRoot;
 
-    unbatchedUpdates(function () {
-      updateContainer(children, fiberRoot, parentComponent, callback);
-    });
-  } else {
-    fiberRoot = root._internalRoot;
+      if (typeof callback === 'function') {
+        var _originalCallback = callback;
 
-    if (typeof callback === 'function') {
-      var _originalCallback = callback;
+        callback = function () {
+          var instance = getPublicRootInstance(fiberRoot);
 
-      callback = function () {
-        var instance = getPublicRootInstance(fiberRoot);
+          _originalCallback.call(instance);
+        };
+      } // Update
 
-        _originalCallback.call(instance);
-      };
-    } // Update
 
+      updateContainer(children, fiberRoot, parentComponent, callback);
+    }
 
-    updateContainer(children, fiberRoot, parentComponent, callback);
+    return getPublicRootInstance(fiberRoot);
   }
 
-  return getPublicRootInstance(fiberRoot);
-}
+  function findDOMNode(componentOrElement) {
+    {
+      var owner = ReactCurrentOwner$3.current;
+
+      if (owner !== null && owner.stateNode !== null) {
+        var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
 
-function findDOMNode(componentOrElement) {
-  {
-    var owner = ReactCurrentOwner$1.current;
+        if (!warnedAboutRefsInRender) {
+          error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component');
+        }
 
-    if (owner !== null && owner.stateNode !== null) {
-      var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
-      !warnedAboutRefsInRender ? warningWithoutStack$1(false, '%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component') : void 0;
-      owner.stateNode._warnedAboutRefsInRender = true;
+        owner.stateNode._warnedAboutRefsInRender = true;
+      }
     }
-  }
-
-  if (componentOrElement == null) {
-    return null;
-  }
 
-  if (componentOrElement.nodeType === ELEMENT_NODE) {
-    return componentOrElement;
-  }
+    if (componentOrElement == null) {
+      return null;
+    }
 
-  {
-    return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
-  }
+    if (componentOrElement.nodeType === ELEMENT_NODE) {
+      return componentOrElement;
+    }
 
-  return findHostInstance(componentOrElement);
-}
-function hydrate(element, container, callback) {
-  if (!isValidContainer(container)) {
     {
-      throw Error("Target container is not a DOM element.");
+      return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
     }
   }
-
-  {
-    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
-
-    if (isModernRoot) {
-      warningWithoutStack$1(false, 'You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?');
+  function hydrate(element, container, callback) {
+    if (!isValidContainer(container)) {
+      {
+        throw Error( "Target container is not a DOM element." );
+      }
     }
-  } // TODO: throw or warn if we couldn't hydrate?
-
 
-  return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
-}
-function render(element, container, callback) {
-  if (!isValidContainer(container)) {
     {
-      throw Error("Target container is not a DOM element.");
-    }
-  }
+      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
 
-  {
-    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
+      if (isModernRoot) {
+        error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?');
+      }
+    } // TODO: throw or warn if we couldn't hydrate?
 
-    if (isModernRoot) {
-      warningWithoutStack$1(false, 'You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');
-    }
+
+    return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
   }
+  function render(element, container, callback) {
+    if (!isValidContainer(container)) {
+      {
+        throw Error( "Target container is not a DOM element." );
+      }
+    }
 
-  return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
-}
-function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
-  if (!isValidContainer(containerNode)) {
     {
-      throw Error("Target container is not a DOM element.");
+      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
+
+      if (isModernRoot) {
+        error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');
+      }
     }
+
+    return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
   }
+  function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
+    if (!isValidContainer(containerNode)) {
+      {
+        throw Error( "Target container is not a DOM element." );
+      }
+    }
 
-  if (!(parentComponent != null && has$1(parentComponent))) {
-    {
-      throw Error("parentComponent must be a valid React Component");
+    if (!(parentComponent != null && has$1(parentComponent))) {
+      {
+        throw Error( "parentComponent must be a valid React Component" );
+      }
     }
+
+    return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
   }
+  function unmountComponentAtNode(container) {
+    if (!isValidContainer(container)) {
+      {
+        throw Error( "unmountComponentAtNode(...): Target container is not a DOM element." );
+      }
+    }
 
-  return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
-}
-function unmountComponentAtNode(container) {
-  if (!isValidContainer(container)) {
     {
-      throw Error("unmountComponentAtNode(...): Target container is not a DOM element.");
+      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
+
+      if (isModernRoot) {
+        error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?');
+      }
     }
-  }
 
-  {
-    var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
+    if (container._reactRootContainer) {
+      {
+        var rootEl = getReactRootElementInContainer(container);
+        var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);
 
-    if (isModernRoot) {
-      warningWithoutStack$1(false, 'You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?');
-    }
-  }
+        if (renderedByDifferentReact) {
+          error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.');
+        }
+      } // Unmount should not be batched.
 
-  if (container._reactRootContainer) {
-    {
-      var rootEl = getReactRootElementInContainer(container);
-      var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);
-      !!renderedByDifferentReact ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0;
-    } // Unmount should not be batched.
 
+      unbatchedUpdates(function () {
+        legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
+          // $FlowFixMe This should probably use `delete container._reactRootContainer`
+          container._reactRootContainer = null;
+          unmarkContainerAsRoot(container);
+        });
+      }); // If you call unmountComponentAtNode twice in quick succession, you'll
+      // get `true` twice. That's probably fine?
 
-    unbatchedUpdates(function () {
-      legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
-        container._reactRootContainer = null;
-        unmarkContainerAsRoot(container);
-      });
-    }); // If you call unmountComponentAtNode twice in quick succession, you'll
-    // get `true` twice. That's probably fine?
+      return true;
+    } else {
+      {
+        var _rootEl = getReactRootElementInContainer(container);
 
-    return true;
-  } else {
-    {
-      var _rootEl = getReactRootElementInContainer(container);
+        var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node.
 
-      var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node.
+        var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;
 
-      var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;
-      !!hasNonRootReactChild ? warningWithoutStack$1(false, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : void 0;
-    }
+        if (hasNonRootReactChild) {
+          error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');
+        }
+      }
 
-    return false;
+      return false;
+    }
   }
-}
-
-function createPortal$1(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.
-implementation) {
-  var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-  return {
-    // This tag allow us to uniquely identify this as a React Portal
-    $$typeof: REACT_PORTAL_TYPE,
-    key: key == null ? null : '' + key,
-    children: children,
-    containerInfo: containerInfo,
-    implementation: implementation
-  };
-}
 
-// TODO: this is special because it gets imported during build.
+  function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.
+  implementation) {
+    var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
+    return {
+      // This tag allow us to uniquely identify this as a React Portal
+      $$typeof: REACT_PORTAL_TYPE,
+      key: key == null ? null : '' + key,
+      children: children,
+      containerInfo: containerInfo,
+      implementation: implementation
+    };
+  }
 
-var ReactVersion = '16.12.0';
+  var ReactVersion = '16.13.1';
 
-setAttemptSynchronousHydration(attemptSynchronousHydration$1);
-setAttemptUserBlockingHydration(attemptUserBlockingHydration$1);
-setAttemptContinuousHydration(attemptContinuousHydration$1);
-setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);
-var didWarnAboutUnstableCreatePortal = false;
+  setAttemptUserBlockingHydration(attemptUserBlockingHydration$1);
+  setAttemptContinuousHydration(attemptContinuousHydration$1);
+  setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);
+  var didWarnAboutUnstableCreatePortal = false;
 
-{
-  if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype
-  Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype
-  Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
-    warningWithoutStack$1(false, 'React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
+  {
+    if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype
+    Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype
+    Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
+      error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');
+    }
   }
-}
-
-setRestoreImplementation(restoreControlledState$$1);
-setBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1);
 
-function createPortal$$1(children, container) {
-  var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+  setRestoreImplementation(restoreControlledState$3);
+  setBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1);
 
-  if (!isValidContainer(container)) {
-    {
-      throw Error("Target container is not a DOM element.");
-    }
-  } // TODO: pass ReactDOM portal implementation as third argument
-
-
-  return createPortal$1(children, container, null, key);
-}
-
-var ReactDOM = {
-  createPortal: createPortal$$1,
-  // Legacy
-  findDOMNode: findDOMNode,
-  hydrate: hydrate,
-  render: render,
-  unstable_renderSubtreeIntoContainer: unstable_renderSubtreeIntoContainer,
-  unmountComponentAtNode: unmountComponentAtNode,
-  // Temporary alias since we already shipped React 16 RC with it.
-  // TODO: remove in React 17.
-  unstable_createPortal: function () {
-    if (!didWarnAboutUnstableCreatePortal) {
-      didWarnAboutUnstableCreatePortal = true;
-      lowPriorityWarningWithoutStack$1(false, 'The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the "unstable_" prefix.');
-    }
-
-    return createPortal$$1.apply(void 0, arguments);
-  },
-  unstable_batchedUpdates: batchedUpdates$1,
-  flushSync: flushSync,
-  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
-    // Keep in sync with ReactDOMUnstableNativeDependencies.js
-    // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification.
-    Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injection.injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing]
-  }
-};
+  function createPortal$1(children, container) {
+    var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
 
-if (exposeConcurrentModeAPIs) {
-  ReactDOM.createRoot = createRoot;
-  ReactDOM.createBlockingRoot = createBlockingRoot;
-  ReactDOM.unstable_discreteUpdates = discreteUpdates$1;
-  ReactDOM.unstable_flushDiscreteUpdates = flushDiscreteUpdates;
-  ReactDOM.unstable_flushControlled = flushControlled;
+    if (!isValidContainer(container)) {
+      {
+        throw Error( "Target container is not a DOM element." );
+      }
+    } // TODO: pass ReactDOM portal implementation as third argument
+    // $FlowFixMe The Flow type is opaque but there's no way to actually create it.
 
-  ReactDOM.unstable_scheduleHydration = function (target) {
-    if (target) {
-      queueExplicitHydrationTarget(target);
-    }
-  };
-}
 
-var foundDevTools = injectIntoDevTools({
-  findFiberByHostInstance: getClosestInstanceFromNode,
-  bundleType: 1,
-  version: ReactVersion,
-  rendererPackageName: 'react-dom'
-});
+    return createPortal(children, container, null, key);
+  }
 
-{
-  if (!foundDevTools && canUseDOM && window.top === window.self) {
-    // If we're in Chrome or Firefox, provide a download link if not installed.
-    if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
-      var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.
+  function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
 
-      if (/^(https?|file):$/.test(protocol)) {
-        console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');
-      }
-    }
+    return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);
   }
-}
 
+  function unstable_createPortal(children, container) {
+    var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
 
+    {
+      if (!didWarnAboutUnstableCreatePortal) {
+        didWarnAboutUnstableCreatePortal = true;
 
-var ReactDOM$2 = Object.freeze({
-	default: ReactDOM
-});
+        warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the "unstable_" prefix.');
+      }
+    }
 
-var ReactDOM$3 = ( ReactDOM$2 && ReactDOM ) || ReactDOM$2;
+    return createPortal$1(children, container, key);
+  }
 
-// TODO: decide on the top-level export form.
-// This is hacky but makes it work with both Rollup and Jest.
+  var Internals = {
+    // Keep in sync with ReactDOMUnstableNativeDependencies.js
+    // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification.
+    Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing]
+  };
+  var foundDevTools = injectIntoDevTools({
+    findFiberByHostInstance: getClosestInstanceFromNode,
+    bundleType:  1 ,
+    version: ReactVersion,
+    rendererPackageName: 'react-dom'
+  });
 
+  {
+    if (!foundDevTools && canUseDOM && window.top === window.self) {
+      // If we're in Chrome or Firefox, provide a download link if not installed.
+      if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
+        var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.
 
-var reactDom = ReactDOM$3.default || ReactDOM$3;
+        if (/^(https?|file):$/.test(protocol)) {
+          // eslint-disable-next-line react-internal/no-production-logging
+          console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');
+        }
+      }
+    }
+  }
 
-return reactDom;
+  exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;
+  exports.createPortal = createPortal$1;
+  exports.findDOMNode = findDOMNode;
+  exports.flushSync = flushSync;
+  exports.hydrate = hydrate;
+  exports.render = render;
+  exports.unmountComponentAtNode = unmountComponentAtNode;
+  exports.unstable_batchedUpdates = batchedUpdates$1;
+  exports.unstable_createPortal = unstable_createPortal;
+  exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;
+  exports.version = ReactVersion;
 
 })));
diff --git a/browser/components/newtab/vendor/react-dom.js b/browser/components/newtab/vendor/react-dom.js
index c932590d62da..8ddde060c738 100644
--- a/browser/components/newtab/vendor/react-dom.js
+++ b/browser/components/newtab/vendor/react-dom.js
@@ -1,4 +1,4 @@
-/** @license React v16.12.0
+/** @license React v16.13.1
  * react-dom.production.min.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -9,234 +9,231 @@
 /*
  Modernizr 3.0.0pre (Custom Build) | MIT
 */
-'use strict';(function(la,m){"object"===typeof exports&&"undefined"!==typeof module?module.exports=m(require("react")):"function"===typeof define&&define.amd?define(["react"],m):la.ReactDOM=m(la.React)})(this,function(la){function m(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
-function uf(){if(qc)for(var a in bb){var b=bb[a],c=qc.indexOf(a);if(!(-1<c))throw Error(m(96,a));if(!rc[c]){if(!b.extractEvents)throw Error(m(97,a));rc[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(wd.hasOwnProperty(h))throw Error(m(99,h));wd[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&vf(k[e],g,h);e=!0}else f.registrationName?(vf(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(m(98,d,a));}}}}function vf(a,b,c){if(cb[a])throw Error(m(100,
-a));cb[a]=b;xd[a]=b.eventTypes[c].dependencies}function Ai(a,b,c,d,e,f,g,h,k){Cb=!1;sc=null;Bi.apply(Ci,arguments)}function Di(a,b,c,d,e,f,g,h,k){Ai.apply(this,arguments);if(Cb){if(Cb){var l=sc;Cb=!1;sc=null}else throw Error(m(198));tc||(tc=!0,yd=l)}}function wf(a,b,c){var d=a.type||"unknown-event";a.currentTarget=xf(c);Di(d,b,void 0,a);a.currentTarget=null}function db(a,b){if(null==b)throw Error(m(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);
-return a}return Array.isArray(b)?[a].concat(b):[a,b]}function zd(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}function uc(a){null!==a&&(Db=db(Db,a));a=Db;Db=null;if(a){zd(a,Ei);if(Db)throw Error(m(95));if(tc)throw a=yd,tc=!1,yd=null,a;}}function yf(a,b){var c=a.stateNode;if(!c)return null;var d=Ad(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":(d=
-!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw Error(m(231,b,typeof c));return c}function Eb(a){if(null===a||"object"!==typeof a)return null;a=zf&&a[zf]||a["@@iterator"];return"function"===typeof a?a:null}function Fi(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=
-2,a._result=b)})}}function ua(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case va:return"Fragment";case eb:return"Portal";case vc:return"Profiler";case Af:return"StrictMode";case wc:return"Suspense";case Bd:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case Bf:return"Context.Consumer";case Cf:return"Context.Provider";case Cd:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b?
-"ForwardRef("+b+")":"ForwardRef");case Dd:return ua(a.type);case Df:if(a=1===a._status?a._result:null)return ua(a)}return null}function Ed(a){var b="";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c="";break a;default:var d=a._debugOwner,e=a._debugSource,f=ua(a.type);c=null;d&&(c=ua(d.type));d=f;f="";e?f=" (at "+e.fileName.replace(Gi,"")+":"+e.lineNumber+")":c&&(f=" (created by "+c+")");c="\n    in "+(d||"Unknown")+f}b+=c;a=a.return}while(a);return b}function Ef(a){if(a=Ff(a)){if("function"!==
-typeof Fd)throw Error(m(280));var b=Ad(a.stateNode);Fd(a.stateNode,a.type,b)}}function Gf(a){fb?gb?gb.push(a):gb=[a]:fb=a}function Hf(){if(fb){var a=fb,b=gb;gb=fb=null;Ef(a);if(b)for(a=0;a<b.length;a++)Ef(b[a])}}function Gd(){if(null!==fb||null!==gb)Hd(),Hf()}function Hi(a){if(If.call(Jf,a))return!0;if(If.call(Kf,a))return!1;if(Ii.test(a))return Jf[a]=!0;Kf[a]=!0;return!1}function Ji(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;
-if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}function Ki(a,b,c,d){if(null===b||"undefined"===typeof b||Ji(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function E(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=
-f}function wa(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;default:return""}}function Id(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(Ki(b,c,e,d)&&(c=null),d||null===e?Hi(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,d=e.attributeNamespace,null===
-c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}function Lf(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}function Li(a){var b=Lf(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,
-get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}}function xc(a){a._valueTracker||(a._valueTracker=Li(a))}function Mf(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Lf(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Jd(a,
-b){var c=b.checked;return J({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Nf(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=wa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function Of(a,b){b=b.checked;null!=b&&Id(a,"checked",b,!1)}function Kd(a,b){Of(a,b);var c=wa(b.value),
-d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Ld(a,b.type,c):b.hasOwnProperty("defaultValue")&&Ld(a,b.type,wa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}function Pf(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==
-d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}function Ld(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function Mi(a){var b="";la.Children.forEach(a,function(a){null!=a&&(b+=a)});
-return b}function Md(a,b){a=J({children:void 0},b);if(b=Mi(b.children))a.children=b;return a}function hb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+wa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}function Nd(a,b){if(null!=
-b.dangerouslySetInnerHTML)throw Error(m(91));return J({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}function Qf(a,b){var c=b.value;if(null==c){c=b.defaultValue;b=b.children;if(null!=b){if(null!=c)throw Error(m(92));if(Array.isArray(b)){if(!(1>=b.length))throw Error(m(93));b=b[0]}c=b}null==c&&(c="")}a._wrapperState={initialValue:wa(c)}}function Rf(a,b){var c=wa(b.value),d=wa(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==
-c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function Sf(a,b){b=a.textContent;b===a._wrapperState.initialValue&&""!==b&&null!==b&&(a.value=b)}function Tf(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Od(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?Tf(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}function yc(a,b){var c=
-{};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}function zc(a){if(Pd[a])return Pd[a];if(!ib[a])return a;var b=ib[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Uf)return Pd[a]=b[c];return a}function Na(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Vf(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));
-if(null!==b)return b.dehydrated}return null}function Wf(a){if(Na(a)!==a)throw Error(m(188));}function Ni(a){var b=a.alternate;if(!b){b=Na(a);if(null===b)throw Error(m(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Wf(e),a;if(f===d)return Wf(e),b;f=f.sibling}throw Error(m(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===
-c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(m(189));}}if(c.alternate!==d)throw Error(m(190));}if(3!==c.tag)throw Error(m(188));return c.stateNode.current===c?a:b}function Xf(a){a=Ni(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=
-b.return;b=b.sibling}}return null}function Oi(a){var b=Qd(a);Rd.forEach(function(c){Sd(c,a,b)});Pi.forEach(function(c){Sd(c,a,b)})}function Td(a,b,c,d){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:d}}function Yf(a,b){switch(a){case "focus":case "blur":xa=null;break;case "dragenter":case "dragleave":ya=null;break;case "mouseover":case "mouseout":za=null;break;case "pointerover":case "pointerout":Fb.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Gb.delete(b.pointerId)}}
-function Hb(a,b,c,d,e){if(null===a||a.nativeEvent!==e)return a=Td(b,c,d,e),null!==b&&(b=Ib(b),null!==b&&Zf(b)),a;a.eventSystemFlags|=d;return a}function Qi(a,b,c,d){switch(b){case "focus":return xa=Hb(xa,a,b,c,d),!0;case "dragenter":return ya=Hb(ya,a,b,c,d),!0;case "mouseover":return za=Hb(za,a,b,c,d),!0;case "pointerover":var e=d.pointerId;Fb.set(e,Hb(Fb.get(e)||null,a,b,c,d));return!0;case "gotpointercapture":return e=d.pointerId,Gb.set(e,Hb(Gb.get(e)||null,a,b,c,d)),!0}return!1}function Ri(a){var b=
-Jb(a.target);if(null!==b){var c=Na(b);if(null!==c)if(b=c.tag,13===b){if(b=Vf(c),null!==b){a.blockedOn=b;Ud(a.priority,function(){Si(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Ac(a){if(null!==a.blockedOn)return!1;var b=Vd(a.topLevelType,a.eventSystemFlags,a.nativeEvent);if(null!==b){var c=Ib(b);null!==c&&Zf(c);a.blockedOn=b;return!1}return!0}function $f(a,b,c){Ac(a)&&c.delete(b)}function Ti(){for(Wd=!1;0<ba.length;){var a=
-ba[0];if(null!==a.blockedOn){a=Ib(a.blockedOn);null!==a&&Ui(a);break}var b=Vd(a.topLevelType,a.eventSystemFlags,a.nativeEvent);null!==b?a.blockedOn=b:ba.shift()}null!==xa&&Ac(xa)&&(xa=null);null!==ya&&Ac(ya)&&(ya=null);null!==za&&Ac(za)&&(za=null);Fb.forEach($f);Gb.forEach($f)}function Kb(a,b){a.blockedOn===b&&(a.blockedOn=null,Wd||(Wd=!0,ag(bg,Ti)))}function cg(a){if(0<ba.length){Kb(ba[0],a);for(var b=1;b<ba.length;b++){var c=ba[b];c.blockedOn===a&&(c.blockedOn=null)}}null!==xa&&Kb(xa,a);null!==
-ya&&Kb(ya,a);null!==za&&Kb(za,a);b=function(b){return Kb(b,a)};Fb.forEach(b);Gb.forEach(b);for(b=0;b<Lb.length;b++)c=Lb[b],c.blockedOn===a&&(c.blockedOn=null);for(;0<Lb.length&&(b=Lb[0],null===b.blockedOn);)Ri(b),null===b.blockedOn&&Lb.shift()}function Xd(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function ma(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function dg(a,b,c){if(b=yf(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=
-db(c._dispatchListeners,b),c._dispatchInstances=db(c._dispatchInstances,a)}function Vi(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=ma(b);for(b=c.length;0<b--;)dg(c[b],"captured",a);for(b=0;b<c.length;b++)dg(c[b],"bubbled",a)}}function Yd(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=yf(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=db(c._dispatchListeners,b),c._dispatchInstances=db(c._dispatchInstances,a))}function Wi(a){a&&a.dispatchConfig.registrationName&&
-Yd(a._targetInst,null,a)}function jb(a){zd(a,Vi)}function Bc(){return!0}function Cc(){return!1}function M(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?Bc:Cc;this.isPropagationStopped=Cc;return this}function Xi(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();
-this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function Yi(a){if(!(a instanceof this))throw Error(m(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function eg(a){a.eventPool=[];a.getPooled=Xi;a.release=Yi}function Dc(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function Zi(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=$i[a])?!!b[a]:!1}function Zd(a){return Zi}function aj(a){var b=
-a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Jb(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Xd(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=a.eventSystemFlags,h=null,k=0;k<rc.length;k++){var l=rc[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=db(h,l))}uc(h)}}function x(a,b){Mb(b,a,
-!1)}function Mb(a,b,c){switch(bj(b)){case 0:var d=cj.bind(null,b,1);break;case 1:d=dj.bind(null,b,1);break;default:d=Ec.bind(null,b,1)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function cj(a,b,c){Oa||Hd();var d=Ec,e=Oa;Oa=!0;try{fg(d,a,b,c)}finally{(Oa=e)||Gd()}}function dj(a,b,c){ej(fj,Ec.bind(null,a,b,c))}function gg(a,b,c,d){if(Fc.length){var e=Fc.pop();e.topLevelType=a;e.eventSystemFlags=b;e.nativeEvent=c;e.targetInst=d;a=e}else a={topLevelType:a,eventSystemFlags:b,nativeEvent:c,
-targetInst:d,ancestors:[]};try{if(b=aj,c=a,$d)b(c,void 0);else{$d=!0;try{hg(b,c,void 0)}finally{$d=!1,Gd()}}}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,Fc.length<gj&&Fc.push(a)}}function Ec(a,b,c){if(Gc)if(0<ba.length&&-1<Rd.indexOf(a))a=Td(null,a,b,c),ba.push(a);else{var d=Vd(a,b,c);null===d?Yf(a,c):-1<Rd.indexOf(a)?(a=Td(d,a,b,c),ba.push(a)):Qi(d,a,b,c)||(Yf(a,c),gg(a,b,c,null))}}function Vd(a,b,c){var d=Xd(c);d=Jb(d);if(null!==d){var e=Na(d);if(null===
-e)d=null;else{var f=e.tag;if(13===f){d=Vf(e);if(null!==d)return d;d=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;d=null}else e!==d&&(d=null)}}gg(a,b,c,d);return null}function ig(a){if(!Aa)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Qd(a){var b=jg.get(a);void 0===b&&(b=new Set,jg.set(a,b));return b}function Sd(a,b,c){if(!c.has(a)){switch(a){case "scroll":Mb(b,
-"scroll",!0);break;case "focus":case "blur":Mb(b,"focus",!0);Mb(b,"blur",!0);c.add("blur");c.add("focus");break;case "cancel":case "close":ig(a)&&Mb(b,a,!0);break;case "invalid":case "submit":case "reset":break;default:-1===Nb.indexOf(a)&&x(a,b)}c.add(a)}}function kg(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||Ob.hasOwnProperty(a)&&Ob[a]?(""+b).trim():b+"px"}function lg(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=kg(c,
-b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}function ae(a,b){if(b){if(hj[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(m(137,a,""));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(m(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(m(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(m(62,""));}}function be(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;
-default:return!0}}function na(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Qd(a);b=xd[b];for(var d=0;d<b.length;d++)Sd(b[d],a,c)}function Hc(){}function ce(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function mg(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function ng(a,b){var c=mg(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,
-offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=mg(c)}}function og(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?og(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function pg(){for(var a=window,b=ce();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=ce(a.document)}return b}
-function de(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}function qg(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}function ee(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&
-null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function kb(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function rg(a){a=a.previousSibling;for(var b=0;a;){if(a.nodeType===Pa){var c=a.data;if(c===sg||c===fe||c===ge){if(0===b)return a;b--}else c===tg&&b++}a=a.previousSibling}return null}function Jb(a){var b=a[Ba];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Pb]||c[Ba]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=rg(a);null!==
-a;){if(c=a[Ba])return c;a=rg(a)}return b}a=c;c=a.parentNode}return null}function Ib(a){a=a[Ba]||a[Pb];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Qa(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(m(33));}function he(a){return a[Ic]||null}function ug(){if(Jc)return Jc;var a,b=ie,c=b.length,d,e="value"in Ca?Ca.value:Ca.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return Jc=e.slice(a,1<d?1-d:void 0)}function vg(a,
-b){switch(a){case "keyup":return-1!==ij.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function wg(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}function jj(a,b){switch(a){case "compositionend":return wg(b);case "keypress":if(32!==b.which)return null;xg=!0;return yg;case "textInput":return a=b.data,a===yg&&xg?null:a;default:return null}}function kj(a,b){if(lb)return"compositionend"===a||!je&&vg(a,b)?
-(a=ug(),Jc=ie=Ca=null,lb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case "compositionend":return zg&&"ko"!==b.locale?null:b.data;default:return null}}function Ag(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!lj[a.type]:"textarea"===b?!0:!1}function Bg(a,b,c){a=M.getPooled(Cg.change,a,b,c);a.type="change";
-Gf(c);jb(a);return a}function mj(a){uc(a)}function Kc(a){var b=Qa(a);if(Mf(b))return a}function nj(a,b){if("change"===a)return b}function Dg(){Qb&&(Qb.detachEvent("onpropertychange",Eg),Rb=Qb=null)}function Eg(a){if("value"===a.propertyName&&Kc(Rb))if(a=Bg(Rb,a,Xd(a)),Oa)uc(a);else{Oa=!0;try{ke(mj,a)}finally{Oa=!1,Gd()}}}function oj(a,b,c){"focus"===a?(Dg(),Qb=b,Rb=c,Qb.attachEvent("onpropertychange",Eg)):"blur"===a&&Dg()}function pj(a,b){if("selectionchange"===a||"keyup"===a||"keydown"===a)return Kc(Rb)}
-function qj(a,b){if("click"===a)return Kc(b)}function rj(a,b){if("input"===a||"change"===a)return Kc(b)}function sj(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}function Sb(a,b){if(Ra(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!tj.call(b,c[d])||!Ra(a[c[d]],b[c[d]]))return!1;return!0}function Fg(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;
-if(le||null==mb||mb!==ce(c))return null;c=mb;"selectionStart"in c&&de(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Tb&&Sb(Tb,c)?null:(Tb=c,a=M.getPooled(Gg.select,me,a,b),a.type="select",a.target=mb,jb(a),a)}function B(a,b){0>nb||(a.current=ne[nb],ne[nb]=null,nb--)}function y(a,b,c){nb++;ne[nb]=a.current;a.current=
-b}function ob(a,b){var c=a.type.contextTypes;if(!c)return Da;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function K(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Lc(a){B(Q,a);B(L,a)}function oe(a){B(Q,a);B(L,a)}function Hg(a,b,c){if(L.current!==Da)throw Error(m(168));
-y(L,b,a);y(Q,c,a)}function Ig(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(m(108,ua(b)||"Unknown",e));return J({},c,{},d)}function Mc(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||Da;Sa=L.current;y(L,b,a);y(Q,Q.current,a);return!0}function Jg(a,b,c){var d=a.stateNode;if(!d)throw Error(m(169));c?(b=Ig(a,b,Sa),d.__reactInternalMemoizedMergedChildContext=b,B(Q,a),
-B(L,a),y(L,b,a)):B(Q,a);y(Q,c,a)}function pe(){switch(uj()){case Nc:return 99;case Kg:return 98;case Lg:return 97;case Mg:return 96;case Ng:return 95;default:throw Error(m(332));}}function Og(a){switch(a){case 99:return Nc;case 98:return Kg;case 97:return Lg;case 96:return Mg;case 95:return Ng;default:throw Error(m(332));}}function pb(a,b){a=Og(a);return vj(a,b)}function Pg(a,b,c){a=Og(a);return qe(a,b,c)}function Qg(a){null===oa?(oa=[a],Oc=qe(Nc,Rg)):oa.push(a);return Sg}function ca(){if(null!==
-Oc){var a=Oc;Oc=null;Tg(a)}Rg()}function Rg(){if(!re&&null!==oa){re=!0;var a=0;try{var b=oa;pb(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});oa=null}catch(c){throw null!==oa&&(oa=oa.slice(a+1)),qe(Nc,ca),c;}finally{re=!1}}}function Pc(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function V(a,b){if(a&&a.defaultProps){b=J({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}function se(){Qc=qb=Rc=null}function Ug(a,b){var c=a.type._context;
-y(te,c._currentValue,a);c._currentValue=b}function ue(a){var b=te.current;B(te,a);a.type._context._currentValue=b}function Vg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function rb(a,b){Rc=a;Qc=qb=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(da=!0),a.firstContext=null)}function ea(a,
-b){if(Qc!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)Qc=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===qb){if(null===Rc)throw Error(m(308));qb=b;Rc.dependencies={expirationTime:0,firstContext:b,responders:null}}else qb=qb.next=b}return a._currentValue}function Sc(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function ve(a){return{baseState:a.baseState,
-firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Ea(a,b){return{expirationTime:a,suspenseConfig:b,tag:Wg,payload:null,callback:null,next:null,nextEffect:null}}function Tc(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}function Fa(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=
-Sc(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=Sc(a.memoizedState),e=c.updateQueue=Sc(c.memoizedState)):d=a.updateQueue=ve(e):null===e&&(e=c.updateQueue=ve(d));null===e||d===e?Tc(d,b):null===d.lastUpdate||null===e.lastUpdate?(Tc(d,b),Tc(e,b)):(Tc(d,b),e.lastUpdate=b)}function Xg(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=Sc(a.memoizedState):Yg(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=
-b,c.lastCapturedUpdate=b)}function Yg(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=ve(b));return b}function Zg(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,"function"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-4097|64;case Wg:a=c.payload;e="function"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return J({},d,e);case Uc:Ga=!0}return d}function Ub(a,b,c,d,e){Ga=!1;b=Yg(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m=
-k.expirationTime;m<e?(null===g&&(g=k,f=l),h<m&&(h=m)):($g(m,k.suspenseConfig),l=Zg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k)));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var n=k.expirationTime;n<e?(null===m&&(m=k,null===g&&(f=l)),h<n&&(h=n)):(l=Zg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect=
-k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k)));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;Vc(h);a.expirationTime=h;a.memoizedState=l}function ah(a,b,c,d){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);bh(b.firstEffect,c);b.firstEffect=
-b.lastEffect=null;bh(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function bh(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;if("function"!==typeof c)throw Error(m(191,c));c.call(d)}a=a.nextEffect}}function Wc(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:J({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}function ch(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?
-a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Sb(c,d)||!Sb(e,f):!0}function dh(a,b,c,d){var e=!1;d=Da;var f=b.contextType;"object"===typeof f&&null!==f?f=ea(f):(d=K(b)?Sa:L.current,e=b.contextTypes,f=(e=null!==e&&void 0!==e)?ob(a,d):Da);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Xc;a.stateNode=b;b._reactInternalFiber=a;e&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=d,a.__reactInternalMemoizedMaskedChildContext=
-f);return b}function eh(a,b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Xc.enqueueReplaceState(b,b.state,null)}function we(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=fh;var f=b.contextType;"object"===typeof f&&null!==f?e.context=ea(f):(f=K(b)?Sa:L.current,e.context=ob(a,f));f=a.updateQueue;null!==f&&(Ub(a,f,c,e,d),
-e.state=a.memoizedState);f=b.getDerivedStateFromProps;"function"===typeof f&&(Wc(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Xc.enqueueReplaceState(e,e.state,
-null),f=a.updateQueue,null!==f&&(Ub(a,f,c,e,d),e.state=a.memoizedState));"function"===typeof e.componentDidMount&&(a.effectTag|=4)}function Vb(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(m(309));var d=c.stateNode}if(!d)throw Error(m(147,a));var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===fh&&(b=d.refs={});null===a?delete b[e]:b[e]=a};
-b._stringRef=e;return b}if("string"!==typeof a)throw Error(m(284));if(!c._owner)throw Error(m(290,a));}return a}function Yc(a,b){if("textarea"!==a.type)throw Error(m(31,"[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,""));}function gh(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;
-return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Ta(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=xe(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a,
-b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props,d),d.ref=Vb(a,b,c),d.return=a,d;d=Zc(c.type,c.key,c.props,null,a.mode,d);d.ref=Vb(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=ye(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function p(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ha(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b}
-function n(a,b,c){if("string"===typeof b||"number"===typeof b)return b=xe(""+b,a.mode,c),b.return=a,b;if("object"===typeof b&&null!==b){switch(b.$$typeof){case $c:return c=Zc(b.type,b.key,b.props,null,a.mode,c),c.ref=Vb(a,null,b),c.return=a,c;case eb:return b=ye(b,a.mode,c),b.return=a,b}if(ad(b)||Eb(b))return b=Ha(b,a.mode,c,null),b.return=a,b;Yc(a,b)}return null}function q(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===
-typeof c&&null!==c){switch(c.$$typeof){case $c:return c.key===e?c.type===va?p(a,b,c.props.children,d,e):k(a,b,c,d):null;case eb:return c.key===e?l(a,b,c,d):null}if(ad(c)||Eb(c))return null!==e?null:p(a,b,c,d,null);Yc(a,c)}return null}function v(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case $c:return a=a.get(null===d.key?c:d.key)||null,d.type===va?p(b,a,d.props.children,e,d.key):k(b,a,d,e);case eb:return a=
-a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(ad(d)||Eb(d))return a=a.get(c)||null,p(b,a,d,e,null);Yc(b,d)}return null}function x(e,g,h,k){for(var l=null,m=null,p=g,t=g=0,z=null;null!==p&&t<h.length;t++){p.index>t?(z=p,p=null):z=p.sibling;var W=q(e,p,h[t],k);if(null===W){null===p&&(p=z);break}a&&p&&null===W.alternate&&b(e,p);g=f(W,g,t);null===m?l=W:m.sibling=W;m=W;p=z}if(t===h.length)return c(e,p),l;if(null===p){for(;t<h.length;t++)p=n(e,h[t],k),null!==p&&(g=f(p,g,t),null===m?l=p:m.sibling=p,m=
-p);return l}for(p=d(e,p);t<h.length;t++)z=v(p,e,t,h[t],k),null!==z&&(a&&null!==z.alternate&&p.delete(null===z.key?t:z.key),g=f(z,g,t),null===m?l=z:m.sibling=z,m=z);a&&p.forEach(function(a){return b(e,a)});return l}function A(e,g,h,k){var l=Eb(h);if("function"!==typeof l)throw Error(m(150));h=l.call(h);if(null==h)throw Error(m(151));for(var p=l=null,t=g,z=g=0,W=null,r=h.next();null!==t&&!r.done;z++,r=h.next()){t.index>z?(W=t,t=null):W=t.sibling;var sb=q(e,t,r.value,k);if(null===sb){null===t&&(t=W);
-break}a&&t&&null===sb.alternate&&b(e,t);g=f(sb,g,z);null===p?l=sb:p.sibling=sb;p=sb;t=W}if(r.done)return c(e,t),l;if(null===t){for(;!r.done;z++,r=h.next())r=n(e,r.value,k),null!==r&&(g=f(r,g,z),null===p?l=r:p.sibling=r,p=r);return l}for(t=d(e,t);!r.done;z++,r=h.next())r=v(t,e,z,r.value,k),null!==r&&(a&&null!==r.alternate&&t.delete(null===r.key?z:r.key),g=f(r,g,z),null===p?l=r:p.sibling=r,p=r);a&&t.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k="object"===typeof f&&null!==
-f&&f.type===va&&null===f.key;k&&(f=f.props.children);var l="object"===typeof f&&null!==f;if(l)switch(f.$$typeof){case $c:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(7===k.tag?f.type===va:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===va?f.props.children:f.props,h);d.ref=Vb(a,k,f);d.return=a;a=d;break a}else{c(a,k);break}else b(a,k);k=k.sibling}f.type===va?(d=Ha(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Zc(f.type,f.key,f.props,null,a.mode,h),h.ref=Vb(a,d,f),h.return=a,a=h)}return g(a);
-case eb:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=ye(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=xe(f,a.mode,h),d.return=a,a=d),g(a);if(ad(f))return x(a,d,f,h);if(Eb(f))return A(a,
-d,f,h);l&&Yc(a,f);if("undefined"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(m(152,a.displayName||a.name||"Component"));}return c(a,d)}}function Ua(a){if(a===Wb)throw Error(m(174));return a}function ze(a,b){y(Xb,b,a);y(Yb,a,a);y(fa,Wb,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Od(null,"");break;default:c=c===Pa?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=Od(b,c)}B(fa,a);y(fa,b,a)}function tb(a){B(fa,a);B(Yb,a);B(Xb,a)}function hh(a){Ua(Xb.current);
-var b=Ua(fa.current);var c=Od(b,a.type);b!==c&&(y(Yb,a,a),y(fa,c,a))}function Ae(a){Yb.current===a&&(B(fa,a),B(Yb,a))}function bd(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===ge||c.data===fe))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;
-b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ih(a,b){return{responder:a,props:b}}function N(){throw Error(m(321));}function Be(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!Ra(a[c],b[c]))return!1;return!0}function Ce(a,b,c,d,e,f){Zb=f;Ia=b;ha=null!==a?a.memoizedState:null;cd.current=null===ha?wj:jh;b=c(d,e);if($b){do $b=!1,ac+=1,ha=null!==a?a.memoizedState:null,ub=vb,ia=O=H=null,cd.current=jh,b=c(d,e);while($b);pa=null;ac=0}cd.current=dd;a=Ia;a.memoizedState=
-vb;a.expirationTime=wb;a.updateQueue=ia;a.effectTag|=bc;a=null!==H&&null!==H.next;Zb=0;ub=O=vb=ha=H=Ia=null;wb=0;ia=null;bc=0;if(a)throw Error(m(300));return b}function kh(){cd.current=dd;Zb=0;ub=O=vb=ha=H=Ia=null;wb=0;ia=null;bc=0;$b=!1;pa=null;ac=0}function xb(){var a={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};null===O?vb=O=a:O=O.next=a;return O}function cc(){if(null!==ub)O=ub,ub=O.next,H=ha,ha=null!==H?H.next:null;else{if(null===ha)throw Error(m(310));H=ha;var a={memoizedState:H.memoizedState,
-baseState:H.baseState,queue:H.queue,baseUpdate:H.baseUpdate,next:null};O=null===O?vb=a:O.next=a;ha=H.next}return O}function lh(a,b){return"function"===typeof b?b(a):b}function mh(a,b,c){b=cc();c=b.queue;if(null===c)throw Error(m(311));c.lastRenderedReducer=a;if(0<ac){var d=c.dispatch;if(null!==pa){var e=pa.get(c);if(void 0!==e){pa.delete(c);var f=b.memoizedState;do f=a(f,e.action),e=e.next;while(null!==e);Ra(f,b.memoizedState)||(da=!0);b.memoizedState=f;b.baseUpdate===c.last&&(b.baseState=f);c.lastRenderedState=
-f;return[f,d]}}return[b.memoizedState,d]}d=c.last;var g=b.baseUpdate;f=b.baseState;null!==g?(null!==d&&(d.next=null),d=g.next):d=null!==d?d.next:null;if(null!==d){var h=e=null,k=d,l=!1;do{var p=k.expirationTime;p<Zb?(l||(l=!0,h=g,e=f),p>wb&&(wb=p,Vc(wb))):($g(p,k.suspenseConfig),f=k.eagerReducer===a?k.eagerState:a(f,k.action));g=k;k=k.next}while(null!==k&&k!==d);l||(h=g,e=f);Ra(f,b.memoizedState)||(da=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.lastRenderedState=f}return[b.memoizedState,
-c.dispatch]}function De(a){var b=xb();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,dispatch:null,lastRenderedReducer:lh,lastRenderedState:a};a=a.dispatch=nh.bind(null,Ia,a);return[b.memoizedState,a]}function Ee(a){return mh(lh,a)}function Fe(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===ia?(ia={lastEffect:null},ia.lastEffect=a.next=a):(b=ia.lastEffect,null===b?ia.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,ia.lastEffect=a));return a}function Ge(a,
-b,c,d){var e=xb();bc|=a;e.memoizedState=Fe(b,c,void 0,void 0===d?null:d)}function He(a,b,c,d){var e=cc();d=void 0===d?null:d;var f=void 0;if(null!==H){var g=H.memoizedState;f=g.destroy;if(null!==d&&Be(d,g.deps)){Fe(0,c,f,d);return}}bc|=a;e.memoizedState=Fe(b,c,f,d)}function oh(a,b){return Ge(516,192,a,b)}function ph(a,b){return He(516,192,a,b)}function qh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}
-function rh(a,b){}function sh(a,b){xb().memoizedState=[a,void 0===b?null:b];return a}function th(a,b){var c=cc();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Be(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function nh(a,b,c){if(!(25>ac))throw Error(m(301));var d=a.alternate;if(a===Ia||null!==d&&d===Ia)if($b=!0,a={expirationTime:Zb,suspenseConfig:null,action:c,eagerReducer:null,eagerState:null,next:null},null===pa&&(pa=new Map),c=pa.get(b),void 0===c)pa.set(b,a);else{for(b=
-c;null!==b.next;)b=b.next;b.next=a}else{var e=X(),f=dc.suspense;e=Va(e,a,f);f={expirationTime:e,suspenseConfig:f,action:c,eagerReducer:null,eagerState:null,next:null};var g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===d||0===d.expirationTime)&&(d=b.lastRenderedReducer,null!==d))try{var k=b.lastRenderedState,l=d(k,c);f.eagerReducer=d;f.eagerState=l;if(Ra(l,k))return}catch(p){}finally{}Ja(a,e)}}function uh(a,b){var c=ja(5,null,
-null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function vh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}function Ie(a){if(Wa){var b=Ka;if(b){var c=
-b;if(!vh(a,b)){b=kb(c.nextSibling);if(!b||!vh(a,b)){a.effectTag=a.effectTag&-1025|2;Wa=!1;qa=a;return}uh(qa,c)}qa=a;Ka=kb(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Wa=!1,qa=a}}function wh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;qa=a}function ed(a){if(a!==qa)return!1;if(!Wa)return wh(a),Wa=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==b&&!ee(b,a.memoizedProps))for(b=Ka;b;)uh(a,b),b=kb(b.nextSibling);wh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?
-a.dehydrated:null;if(!a)throw Error(m(317));a:{a=a.nextSibling;for(b=0;a;){if(a.nodeType===Pa){var c=a.data;if(c===tg){if(0===b){Ka=kb(a.nextSibling);break a}b--}else c!==sg&&c!==fe&&c!==ge||b++}a=a.nextSibling}Ka=null}}else Ka=qa?kb(a.stateNode.nextSibling):null;return!0}function Je(){Ka=qa=null;Wa=!1}function P(a,b,c,d){b.child=null===a?Ke(b,null,c,d):yb(b,a.child,c,d)}function xh(a,b,c,d,e){c=c.render;var f=b.ref;rb(b,e);d=Ce(a,b,c,d,f,e);if(null!==a&&!da)return b.updateQueue=a.updateQueue,b.effectTag&=
--517,a.expirationTime<=e&&(a.expirationTime=0),ra(a,b,e);b.effectTag|=1;P(a,b,d,e);return b.child}function yh(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!Le(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,zh(a,b,g,d,e,f);a=Zc(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Sb,c(e,d)&&a.ref===b.ref))return ra(a,b,f);b.effectTag|=1;a=Ta(g,d,f);a.ref=
-b.ref;a.return=b;return b.child=a}function zh(a,b,c,d,e,f){return null!==a&&Sb(a.memoizedProps,d)&&a.ref===b.ref&&(da=!1,e<f)?ra(a,b,f):Me(a,b,c,d,f)}function Ah(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function Me(a,b,c,d,e){var f=K(c)?Sa:L.current;f=ob(b,f);rb(b,e);c=Ce(a,b,c,d,f,e);if(null!==a&&!da)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),ra(a,b,e);b.effectTag|=1;P(a,b,c,e);return b.child}function Bh(a,b,
-c,d,e){if(K(c)){var f=!0;Mc(b)}else f=!1;rb(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),dh(b,c,d,e),we(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;"object"===typeof l&&null!==l?l=ea(l):(l=K(c)?Sa:L.current,l=ob(b,l));var m=c.getDerivedStateFromProps,n="function"===typeof m||"function"===typeof g.getSnapshotBeforeUpdate;n||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==
-typeof g.componentWillReceiveProps||(h!==d||k!==l)&&eh(b,g,d,l);Ga=!1;var q=b.memoizedState;k=g.state=q;var v=b.updateQueue;null!==v&&(Ub(b,v,d,g,e),k=b.memoizedState);h!==d||q!==k||Q.current||Ga?("function"===typeof m&&(Wc(b,c,m,d),k=b.memoizedState),(h=Ga||ch(b,c,h,d,q,k,l))?(n||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),
-"function"===typeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=b.memoizedProps,g.props=b.type===b.elementType?h:V(b.type,h),k=g.context,l=c.contextType,"object"===typeof l&&null!==l?l=ea(l):(l=K(c)?Sa:L.current,l=ob(b,l)),m=c.getDerivedStateFromProps,(n="function"===typeof m||"function"===
-typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&eh(b,g,d,l),Ga=!1,k=b.memoizedState,q=g.state=k,v=b.updateQueue,null!==v&&(Ub(b,v,d,g,e),q=b.memoizedState),h!==d||k!==q||Q.current||Ga?("function"===typeof m&&(Wc(b,c,m,d),q=b.memoizedState),(m=Ga||ch(b,c,h,d,k,q,l))?(n||"function"!==typeof g.UNSAFE_componentWillUpdate&&"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&
-g.componentWillUpdate(d,q,l),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,q,l)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=q),g.props=d,g.state=
-q,g.context=l,d=m):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return Ne(a,b,c,d,f,e)}function Ne(a,b,c,d,e,f){Ah(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Jg(b,c,!1),ra(a,b,f);d=b.stateNode;xj.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=yb(b,a.child,
-null,f),b.child=yb(b,null,h,f)):P(a,b,h,f);b.memoizedState=d.state;e&&Jg(b,c,!0);return b.child}function Ch(a){var b=a.stateNode;b.pendingContext?Hg(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Hg(a,b.context,!1);ze(a,b.containerInfo)}function Dh(a,b,c){var d=b.mode,e=b.pendingProps,f=A.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||
-(f|=1);y(A,f&1,b);if(null===a){void 0!==e.fallback&&Ie(b);if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=Oe;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Ke(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Ta(a,a.pendingProps,0);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?
-b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Ta(d,e,d.expirationTime);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=Oe;b.child=c;return d}c=yb(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=
-c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=Oe;b.child=e;return c}b.memoizedState=null;return b.child=yb(b,a,e.children,c)}function Eh(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);Vg(a.return,b)}function Pe(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.last=d,g.tail=c,g.tailExpiration=
-0,g.tailMode=e,g.lastEffect=f)}function Fh(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;P(a,b,d.children,c);d=A.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&Eh(a,c);else if(19===a.tag)Eh(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}y(A,
-d,b);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===bd(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Pe(b,!1,e,c,f,b.lastEffect);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===bd(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Pe(b,!0,c,null,f,b.lastEffect);break;case "together":Pe(b,!1,null,null,void 0,b.lastEffect);
-break;default:b.memoizedState=null}return b.child}function ra(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Vc(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(m(153));if(null!==b.child){a=b.child;c=Ta(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Ta(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}function zb(a){a.effectTag|=4}function fd(a,b){switch(a.tailMode){case "hidden":b=
-a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}function yj(a,b){switch(a.tag){case 1:return K(a.type)&&Lc(a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 3:tb(a);oe(a);b=a.effectTag;if(0!==(b&64))throw Error(m(285));a.effectTag=b&-4097|64;return a;case 5:return Ae(a),
-null;case 13:return B(A,a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return B(A,a),null;case 4:return tb(a),null;case 10:return ue(a),null;default:return null}}function Qe(a,b){return{value:a,source:b,stack:Ed(b)}}function Re(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Ed(c));null!==c&&ua(c.type);b=b.value;null!==a&&1===a.tag&&ua(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function zj(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,
-b.componentWillUnmount()}catch(c){Xa(a,c)}}function Gh(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Xa(a,c)}else b.current=null}function Aj(a,b){switch(b.tag){case 0:case 11:case 15:ec(2,0,b);break;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:V(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:case 17:break;default:throw Error(m(163));
-}}function ec(a,b,c){c=c.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do{if(0!==(d.tag&a)){var e=d.destroy;d.destroy=void 0;void 0!==e&&e()}0!==(d.tag&b)&&(e=d.create,d.destroy=e());d=d.next}while(d!==c)}}function Hh(a,b,c){"function"===typeof Se&&Se(b);switch(b.tag){case 0:case 11:case 14:case 15:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;pb(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Xa(g,h)}}a=a.next}while(a!==
-d)})}break;case 1:Gh(b);c=b.stateNode;"function"===typeof c.componentWillUnmount&&zj(b,c);break;case 5:Gh(b);break;case 4:Ih(a,b,c)}}function Jh(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;null!==b&&Jh(b)}function Kh(a){return 5===a.tag||3===a.tag||4===a.tag}function Lh(a){a:{for(var b=a.return;null!==b;){if(Kh(b)){var c=b;break a}b=b.return}throw Error(m(160));
-}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(m(161));}c.effectTag&16&&(fc(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Kh(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;
-break a}}for(var e=a;;){var f=5===e.tag||6===e.tag;if(f){var g=f?e.stateNode:e.stateNode.instance;if(c)if(d){f=b;var h=g;g=c;f.nodeType===Pa?f.parentNode.insertBefore(h,g):f.insertBefore(h,g)}else b.insertBefore(g,c);else d?(h=b,h.nodeType===Pa?(f=h.parentNode,f.insertBefore(g,h)):(f=h,f.appendChild(g)),h=h._reactRootContainer,null!==h&&void 0!==h||null!==f.onclick||(f.onclick=Hc)):b.appendChild(g)}else if(4!==e.tag&&null!==e.child){e.child.return=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===
-e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}function Ih(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(m(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,p=k;;)if(Hh(h,p,l),null!==p.child&&4!==p.tag)p.child.return=p,p=p.child;else{if(p===k)break;for(;null===p.sibling;){if(null===p.return||
-p.return===k)break a;p=p.return}p.sibling.return=p.return;p=p.sibling}g?(h=f,k=d.stateNode,h.nodeType===Pa?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Hh(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}
-function Te(a,b){switch(b.tag){case 0:case 11:case 14:case 15:ec(4,8,b);break;case 1:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Ic]=d;"input"===a&&"radio"===d.type&&null!=d.name&&Of(c,d);be(a,e);b=be(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];"style"===g?lg(c,h):"dangerouslySetInnerHTML"===g?Mh(c,h):"children"===g?fc(c,h):Id(c,g,h,b)}switch(a){case "input":Kd(c,d);break;case "textarea":Rf(c,
-d);break;case "select":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?hb(c,!!d.multiple,d.defaultValue,!0):hb(c,!!d.multiple,d.multiple?[]:"",!1))}}}break;case 6:if(null===b.stateNode)throw Error(m(162));b.stateNode.nodeValue=b.memoizedProps;break;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,cg(b.containerInfo));break;case 12:break;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Ue=Y());
-if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null,f.style.display=kg("display",e));else if(6===a.tag)a.stateNode.nodeValue=d?"":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=
-a;a=a.child;continue}if(a===c)break a;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Nh(b);break;case 19:Nh(b);break;case 17:break;case 20:break;case 21:break;default:throw Error(m(163));}}function Nh(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Bj);b.forEach(function(b){var d=Cj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}function Oh(a,b,c){c=Ea(c,null);c.tag=3;c.payload=
-{element:null};var d=b.value;c.callback=function(){gd||(gd=!0,Ve=d);Re(a,b)};return c}function Ph(a,b,c){c=Ea(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Re(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&(null===La?La=new Set([this]):La.add(this),Re(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}
-function X(){return(q&(Z|ka))!==F?1073741821-(Y()/10|0):0!==hd?hd:hd=1073741821-(Y()/10|0)}function Va(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=pe();if(0===(b&4))return 99===d?1073741823:1073741822;if((q&Z)!==F)return R;if(null!==c)a=Pc(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=Pc(a,150,100);break;case 97:case 96:a=Pc(a,5E3,250);break;case 95:a=2;break;default:throw Error(m(326));}null!==S&&a===R&&--a;return a}function id(a,b){a.expirationTime<b&&(a.expirationTime=
-b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(S===e&&(Vc(b),G===jd&&Ya(e,R)),Qh(e,b));return e}function kd(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Rh(a,b))return b;b=
-a.lastPingedTime;a=a.nextKnownPendingLevel;return b>a?b:a}function T(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=Qg(We.bind(null,a));else{var b=kd(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=X();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===
-b&&e>=d)return;c!==Sg&&Tg(c)}a.callbackExpirationTime=b;a.callbackPriority=d;b=1073741823===b?Qg(We.bind(null,a)):Pg(d,Sh.bind(null,a),{timeout:10*(1073741821-b)-Y()});a.callbackNode=b}}}function Sh(a,b){hd=0;if(b)return b=X(),Xe(a,b),T(a),null;var c=kd(a);if(0!==c){b=a.callbackNode;if((q&(Z|ka))!==F)throw Error(m(327));Ab();a===S&&c===R||Za(a,c);if(null!==v){var d=q;q|=Z;var e=Th(a);do try{Dj();break}catch(h){Uh(a,h)}while(1);se();q=d;ld.current=e;if(G===md)throw b=nd,Za(a,c),Ya(a,c),T(a),b;if(null===
-v)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=G,S=null,d){case $a:case md:throw Error(m(345));case Vh:Xe(a,2<c?2:c);break;case od:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ye(e));if(1073741823===sa&&(e=Ue+Wh-Y(),10<e)){if(pd){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Za(a,c);break}}f=kd(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=Ze(Ma.bind(null,a),e);break}Ma(a);break;case jd:Ya(a,c);d=a.lastSuspendedTime;
-c===d&&(a.nextKnownPendingLevel=Ye(e));if(pd&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Za(a,c);break}e=kd(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}1073741823!==gc?d=10*(1073741821-gc)-Y():1073741823===sa?d=0:(d=10*(1073741821-sa)-5E3,e=Y(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*Ej(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=Ze(Ma.bind(null,a),d);break}Ma(a);break;case $e:if(1073741823!==
-sa&&null!==qd){f=sa;var g=qd;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Y()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Ya(a,c);a.timeoutHandle=Ze(Ma.bind(null,a),d);break}}Ma(a);break;default:throw Error(m(329));}T(a);if(a.callbackNode===b)return Sh.bind(null,a)}}return null}function We(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if(a.finishedExpirationTime===b)Ma(a);else{if((q&(Z|ka))!==F)throw Error(m(327));Ab();a===S&&b===R||Za(a,b);if(null!==v){var c=q;q|=
-Z;var d=Th(a);do try{Fj();break}catch(e){Uh(a,e)}while(1);se();q=c;ld.current=d;if(G===md)throw c=nd,Za(a,b),Ya(a,b),T(a),c;if(null!==v)throw Error(m(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;S=null;Ma(a);T(a)}}return null}function Gj(){if(null!==ab){var a=ab;ab=null;a.forEach(function(a,c){Xe(c,a);T(c)});ca()}}function Xh(a,b){var c=q;q|=1;try{return a(b)}finally{q=c,q===F&&ca()}}function Yh(a,b){var c=q;q&=-2;q|=af;try{return a(b)}finally{q=c,q===F&&ca()}}function Za(a,
-b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Hj(c));if(null!==v)for(c=v.return;null!==c;){var d=c;switch(d.tag){case 1:var e=d.type.childContextTypes;null!==e&&void 0!==e&&Lc(d);break;case 3:tb(d);oe(d);break;case 5:Ae(d);break;case 4:tb(d);break;case 13:B(A,d);break;case 19:B(A,d);break;case 10:ue(d)}c=c.return}S=a;v=Ta(a.current,null,b);R=b;G=$a;nd=null;gc=sa=1073741823;qd=null;hc=0;pd=!1}function Uh(a,b){do{try{se();kh();if(null===v||null===
-v.return)return G=md,nd=b,null;a:{var c=a,d=v.return,e=v,f=b;b=R;e.effectTag|=2048;e.firstEffect=e.lastEffect=null;if(null!==f&&"object"===typeof f&&"function"===typeof f.then){var g=f,h=0!==(A.current&1),k=d;do{var l;if(l=13===k.tag){var m=k.memoizedState;if(null!==m)l=null!==m.dehydrated?!0:!1;else{var n=k.memoizedProps;l=void 0===n.fallback?!1:!0!==n.unstable_avoidThisFallback?!0:h?!1:!0}}if(l){var q=k.updateQueue;if(null===q){var x=new Set;x.add(g);k.updateQueue=x}else q.add(g);if(0===(k.mode&
-2)){k.effectTag|=64;e.effectTag&=-2981;if(1===e.tag)if(null===e.alternate)e.tag=17;else{var B=Ea(1073741823,null);B.tag=Uc;Fa(e,B)}e.expirationTime=1073741823;break a}f=void 0;e=b;var y=c.pingCache;null===y?(y=c.pingCache=new Ij,f=new Set,y.set(g,f)):(f=y.get(g),void 0===f&&(f=new Set,y.set(g,f)));if(!f.has(e)){f.add(e);var t=Jj.bind(null,c,g,e);g.then(t,t)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);f=Error((ua(e.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+
-Ed(e))}G!==$e&&(G=Vh);f=Qe(f,e);k=d;do{switch(k.tag){case 3:g=f;k.effectTag|=4096;k.expirationTime=b;var z=Oh(k,g,b);Xg(k,z);break a;case 1:g=f;var F=k.type,r=k.stateNode;if(0===(k.effectTag&64)&&("function"===typeof F.getDerivedStateFromError||null!==r&&"function"===typeof r.componentDidCatch&&(null===La||!La.has(r)))){k.effectTag|=4096;k.expirationTime=b;var u=Ph(k,g,b);Xg(k,u);break a}}k=k.return}while(null!==k)}v=Zh(v)}catch(w){b=w;continue}break}while(1)}function Th(a){a=ld.current;ld.current=
-dd;return null===a?dd:a}function $g(a,b){a<sa&&2<a&&(sa=a);null!==b&&a<gc&&2<a&&(gc=a,qd=b)}function Vc(a){a>hc&&(hc=a)}function Fj(){for(;null!==v;)v=$h(v)}function Dj(){for(;null!==v&&!Kj();)v=$h(v)}function $h(a){var b=Lj(a.alternate,a,R);a.memoizedProps=a.pendingProps;null===b&&(b=Zh(a));ai.current=null;return b}function Zh(a){v=a;do{var b=v.alternate;a=v.return;if(0===(v.effectTag&2048)){a:{var c=b;b=v;var d=R;var e=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;
-case 1:K(b.type)&&Lc(b);break;case 3:tb(b);oe(b);e=b.stateNode;e.pendingContext&&(e.context=e.pendingContext,e.pendingContext=null);(null===c||null===c.child)&&ed(b)&&zb(b);bi(b);break;case 5:Ae(b);var f=Ua(Xb.current);d=b.type;if(null!==c&&null!=b.stateNode)Mj(c,b,d,e,f),c.ref!==b.ref&&(b.effectTag|=128);else if(e){var g=Ua(fa.current);if(ed(b)){e=b;c=e.stateNode;var h=e.type;g=e.memoizedProps;c[Ba]=e;c[Ic]=g;d=void 0;switch(h){case "iframe":case "object":case "embed":x("load",c);break;case "video":case "audio":for(var k=
-0;k<Nb.length;k++)x(Nb[k],c);break;case "source":x("error",c);break;case "img":case "image":case "link":x("error",c);x("load",c);break;case "form":x("reset",c);x("submit",c);break;case "details":x("toggle",c);break;case "input":Nf(c,g);x("invalid",c);na(f,"onChange");break;case "select":c._wrapperState={wasMultiple:!!g.multiple};x("invalid",c);na(f,"onChange");break;case "textarea":Qf(c,g),x("invalid",c),na(f,"onChange")}ae(h,g);k=null;for(d in g)if(g.hasOwnProperty(d)){var l=g[d];"children"===d?
-"string"===typeof l?c.textContent!==l&&(k=["children",l]):"number"===typeof l&&c.textContent!==""+l&&(k=["children",""+l]):cb.hasOwnProperty(d)&&null!=l&&na(f,d)}switch(h){case "input":xc(c);Pf(c,g,!0);break;case "textarea":xc(c);Sf(c,g);break;case "select":case "option":break;default:"function"===typeof g.onClick&&(c.onclick=Hc)}f=k;e.updateQueue=f;e=null!==f?!0:!1;e&&zb(b)}else{h=b;c=9===f.nodeType?f:f.ownerDocument;"http://www.w3.org/1999/xhtml"===g&&(g=Tf(d));"http://www.w3.org/1999/xhtml"===
-g?"script"===d?(c=c.createElement("div"),c.innerHTML="<script>\x3c/script>",c=c.removeChild(c.firstChild)):"string"===typeof e.is?c=c.createElement(d,{is:e.is}):(c=c.createElement(d),"select"===d&&(g=c,e.multiple?g.multiple=!0:e.size&&(g.size=e.size))):c=c.createElementNS(g,d);c[Ba]=h;c[Ic]=e;Nj(c,b,!1,!1);b.stateNode=c;var p=be(d,e);switch(d){case "iframe":case "object":case "embed":x("load",c);h=e;break;case "video":case "audio":for(h=0;h<Nb.length;h++)x(Nb[h],c);h=e;break;case "source":x("error",
-c);h=e;break;case "img":case "image":case "link":x("error",c);x("load",c);h=e;break;case "form":x("reset",c);x("submit",c);h=e;break;case "details":x("toggle",c);h=e;break;case "input":Nf(c,e);h=Jd(c,e);x("invalid",c);na(f,"onChange");break;case "option":h=Md(c,e);break;case "select":c._wrapperState={wasMultiple:!!e.multiple};h=J({},e,{value:void 0});x("invalid",c);na(f,"onChange");break;case "textarea":Qf(c,e);h=Nd(c,e);x("invalid",c);na(f,"onChange");break;default:h=e}ae(d,h);g=void 0;k=d;l=c;var n=
-h;for(g in n)if(n.hasOwnProperty(g)){var q=n[g];"style"===g?lg(l,q):"dangerouslySetInnerHTML"===g?(q=q?q.__html:void 0,null!=q&&Mh(l,q)):"children"===g?"string"===typeof q?("textarea"!==k||""!==q)&&fc(l,q):"number"===typeof q&&fc(l,""+q):"suppressContentEditableWarning"!==g&&"suppressHydrationWarning"!==g&&"autoFocus"!==g&&(cb.hasOwnProperty(g)?null!=q&&na(f,g):null!=q&&Id(l,g,q,p))}switch(d){case "input":xc(c);Pf(c,e,!1);break;case "textarea":xc(c);Sf(c,e);break;case "option":null!=e.value&&c.setAttribute("value",
-""+wa(e.value));break;case "select":f=c;c=e;f.multiple=!!c.multiple;h=c.value;null!=h?hb(f,!!c.multiple,h,!1):null!=c.defaultValue&&hb(f,!!c.multiple,c.defaultValue,!0);break;default:"function"===typeof h.onClick&&(c.onclick=Hc)}qg(d,e)&&zb(b)}null!==b.ref&&(b.effectTag|=128)}else if(null===b.stateNode)throw Error(m(166));break;case 6:if(c&&null!=b.stateNode)Oj(c,b,c.memoizedProps,e);else{if("string"!==typeof e&&null===b.stateNode)throw Error(m(166));d=Ua(Xb.current);Ua(fa.current);ed(b)?(e=b,f=e.stateNode,
-d=e.memoizedProps,f[Ba]=e,(e=f.nodeValue!==d)&&zb(b)):(f=b,e=(9===d.nodeType?d:d.ownerDocument).createTextNode(e),e[Ba]=f,b.stateNode=e)}break;case 11:break;case 13:B(A,b);e=b.memoizedState;if(0!==(b.effectTag&64)){b.expirationTime=d;break a}e=null!==e;f=!1;null===c?void 0!==b.memoizedProps.fallback&&ed(b):(d=c.memoizedState,f=null!==d,e||null===d||(d=c.child.sibling,null!==d&&(h=b.firstEffect,null!==h?(b.firstEffect=d,d.nextEffect=h):(b.firstEffect=b.lastEffect=d,d.nextEffect=null),d.effectTag=8)));
-if(e&&!f&&0!==(b.mode&2))if(null===c&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(A.current&1))G===$a&&(G=od);else{if(G===$a||G===od)G=jd;0!==hc&&null!==S&&(Ya(S,R),Qh(S,hc))}if(e||f)b.effectTag|=4;break;case 7:break;case 8:break;case 12:break;case 4:tb(b);bi(b);break;case 10:ue(b);break;case 9:break;case 14:break;case 17:K(b.type)&&Lc(b);break;case 19:B(A,b);e=b.memoizedState;if(null===e)break;f=0!==(b.effectTag&64);h=e.rendering;if(null===h)if(f)fd(e,!1);else{if(G!==$a||null!==c&&0!==
-(c.effectTag&64))for(c=b.child;null!==c;){h=bd(c);if(null!==h){b.effectTag|=64;fd(e,!1);f=h.updateQueue;null!==f&&(b.updateQueue=f,b.effectTag|=4);null===e.lastEffect&&(b.firstEffect=null);b.lastEffect=e.lastEffect;e=d;for(f=b.child;null!==f;)d=f,c=e,d.effectTag&=2,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null,h=d.alternate,null===h?(d.childExpirationTime=0,d.expirationTime=c,d.child=null,d.memoizedProps=null,d.memoizedState=null,d.updateQueue=null,d.dependencies=null):(d.childExpirationTime=
-h.childExpirationTime,d.expirationTime=h.expirationTime,d.child=h.child,d.memoizedProps=h.memoizedProps,d.memoizedState=h.memoizedState,d.updateQueue=h.updateQueue,c=h.dependencies,d.dependencies=null===c?null:{expirationTime:c.expirationTime,firstContext:c.firstContext,responders:c.responders}),f=f.sibling;y(A,A.current&1|2,b);b=b.child;break a}c=c.sibling}}else{if(!f)if(c=bd(h),null!==c){if(b.effectTag|=64,f=!0,d=c.updateQueue,null!==d&&(b.updateQueue=d,b.effectTag|=4),fd(e,!0),null===e.tail&&"hidden"===
-e.tailMode&&!h.alternate){b=b.lastEffect=e.lastEffect;null!==b&&(b.nextEffect=null);break}}else Y()>e.tailExpiration&&1<d&&(b.effectTag|=64,f=!0,fd(e,!1),b.expirationTime=b.childExpirationTime=d-1);e.isBackwards?(h.sibling=b.child,b.child=h):(d=e.last,null!==d?d.sibling=h:b.child=h,e.last=h)}if(null!==e.tail){0===e.tailExpiration&&(e.tailExpiration=Y()+500);d=e.tail;e.rendering=d;e.tail=d.sibling;e.lastEffect=b.lastEffect;d.sibling=null;e=A.current;e=f?e&1|2:e&1;y(A,e,b);b=d;break a}break;case 20:break;
-case 21:break;default:throw Error(m(156,b.tag));}b=null}e=v;if(1===R||1!==e.childExpirationTime){f=0;for(d=e.child;null!==d;)c=d.expirationTime,h=d.childExpirationTime,c>f&&(f=c),h>f&&(f=h),d=d.sibling;e.childExpirationTime=f}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=v.firstEffect),null!==v.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=v.firstEffect),a.lastEffect=v.lastEffect),1<v.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=
-v:a.firstEffect=v,a.lastEffect=v))}else{b=yj(v,R);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=v.sibling;if(null!==b)return b;v=a}while(null!==v);G===$a&&(G=$e);return null}function Ye(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Ma(a){var b=pe();pb(99,Pj.bind(null,a,b));return null}function Pj(a,b){do Ab();while(null!==ic);if((q&(Z|ka))!==F)throw Error(m(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===
-c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(m(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ye(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===S&&(v=S=null,R=0);1<c.effectTag?null!==c.lastEffect?
-(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=q;q|=ka;ai.current=null;bf=Gc;var g=pg();if(de(g)){if("selectionStart"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,p=k.focusNode;k=k.focusOffset;try{h.nodeType,p.nodeType}catch(Bb){h=null;break a}var x=0,y=-1,A=-1,B=0,G=0,t=g,z=null;b:for(;;){for(var C;;){t!==
-h||0!==l&&3!==t.nodeType||(y=x+l);t!==p||0!==k&&3!==t.nodeType||(A=x+k);3===t.nodeType&&(x+=t.nodeValue.length);if(null===(C=t.firstChild))break;z=t;t=C}for(;;){if(t===g)break b;z===h&&++B===l&&(y=x);z===p&&++G===k&&(A=x);if(null!==(C=t.nextSibling))break;t=z;z=t.parentNode}t=C}h=-1===y||-1===A?null:{start:y,end:A}}else h=null}h=h||{start:0,end:0}}else h=null;cf={focusedElem:g,selectionRange:h};Gc=!1;n=e;do try{Qj()}catch(Bb){if(null===n)throw Error(m(330));Xa(n,Bb);n=n.nextEffect}while(null!==n);
-n=e;do try{for(g=a,h=b;null!==n;){var r=n.effectTag;r&16&&fc(n.stateNode,"");if(r&128){var u=n.alternate;if(null!==u){var w=u.ref;null!==w&&("function"===typeof w?w(null):w.current=null)}}switch(r&1038){case 2:Lh(n);n.effectTag&=-3;break;case 6:Lh(n);n.effectTag&=-3;Te(n.alternate,n);break;case 1024:n.effectTag&=-1025;break;case 1028:n.effectTag&=-1025;Te(n.alternate,n);break;case 4:Te(n.alternate,n);break;case 8:l=n,Ih(g,l,h),Jh(l)}n=n.nextEffect}}catch(Bb){if(null===n)throw Error(m(330));Xa(n,Bb);
-n=n.nextEffect}while(null!==n);w=cf;u=pg();r=w.focusedElem;h=w.selectionRange;if(u!==r&&r&&r.ownerDocument&&og(r.ownerDocument.documentElement,r)){null!==h&&de(r)&&(u=h.start,w=h.end,void 0===w&&(w=u),"selectionStart"in r?(r.selectionStart=u,r.selectionEnd=Math.min(w,r.value.length)):(w=(u=r.ownerDocument||document)&&u.defaultView||window,w.getSelection&&(w=w.getSelection(),l=r.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!w.extend&&g>h&&(l=h,h=g,g=l),l=ng(r,g),p=
-ng(r,h),l&&p&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==p.node||w.focusOffset!==p.offset)&&(u=u.createRange(),u.setStart(l.node,l.offset),w.removeAllRanges(),g>h?(w.addRange(u),w.extend(p.node,p.offset)):(u.setEnd(p.node,p.offset),w.addRange(u))))));u=[];for(w=r;w=w.parentNode;)1===w.nodeType&&u.push({element:w,left:w.scrollLeft,top:w.scrollTop});"function"===typeof r.focus&&r.focus();for(r=0;r<u.length;r++)w=u[r],w.element.scrollLeft=w.left,w.element.scrollTop=
-w.top}cf=null;Gc=!!bf;bf=null;a.current=c;n=e;do try{for(r=d;null!==n;){var H=n.effectTag;if(H&36){var D=n.alternate;u=n;w=r;switch(u.tag){case 0:case 11:case 15:ec(16,32,u);break;case 1:var E=u.stateNode;if(u.effectTag&4)if(null===D)E.componentDidMount();else{var J=u.elementType===u.type?D.memoizedProps:V(u.type,D.memoizedProps);E.componentDidUpdate(J,D.memoizedState,E.__reactInternalSnapshotBeforeUpdate)}var K=u.updateQueue;null!==K&&ah(u,K,E,w);break;case 3:var L=u.updateQueue;if(null!==L){g=null;
-if(null!==u.child)switch(u.child.tag){case 5:g=u.child.stateNode;break;case 1:g=u.child.stateNode}ah(u,L,g,w)}break;case 5:var O=u.stateNode;null===D&&u.effectTag&4&&qg(u.type,u.memoizedProps)&&O.focus();break;case 6:break;case 4:break;case 12:break;case 13:if(null===u.memoizedState){var M=u.alternate;if(null!==M){var N=M.memoizedState;if(null!==N){var P=N.dehydrated;null!==P&&cg(P)}}}break;case 19:case 17:case 20:case 21:break;default:throw Error(m(163));}}if(H&128){u=void 0;var I=n.ref;if(null!==
-I){var Q=n.stateNode;switch(n.tag){case 5:u=Q;break;default:u=Q}"function"===typeof I?I(u):I.current=u}}n=n.nextEffect}}catch(Bb){if(null===n)throw Error(m(330));Xa(n,Bb);n=n.nextEffect}while(null!==n);n=null;Rj();q=f}else a.current=c;if(rd)rd=!1,ic=a,jc=b;else for(n=e;null!==n;)b=n.nextEffect,n.nextEffect=null,n=b;b=a.firstPendingTime;0===b&&(La=null);1073741823===b?a===df?kc++:(kc=0,df=a):kc=0;"function"===typeof ef&&ef(c.stateNode,d);T(a);if(gd)throw gd=!1,a=Ve,Ve=null,a;if((q&af)!==F)return null;
-ca();return null}function Qj(){for(;null!==n;){var a=n.effectTag;0!==(a&256)&&Aj(n.alternate,n);0===(a&512)||rd||(rd=!0,Pg(97,function(){Ab();return null}));n=n.nextEffect}}function Ab(){if(90!==jc){var a=97<jc?97:jc;jc=90;return pb(a,Sj)}}function Sj(){if(null===ic)return!1;var a=ic;ic=null;if((q&(Z|ka))!==F)throw Error(m(331));var b=q;q|=ka;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:ec(128,0,c),ec(0,64,c)}}catch(d){if(null===
-a)throw Error(m(330));Xa(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}q=b;ca();return!0}function ci(a,b,c){b=Qe(c,b);b=Oh(a,b,1073741823);Fa(a,b);a=id(a,1073741823);null!==a&&T(a)}function Xa(a,b){if(3===a.tag)ci(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){ci(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===La||!La.has(d))){a=Qe(b,a);a=Ph(c,a,1073741823);Fa(c,a);c=id(c,1073741823);null!==
-c&&T(c);break}}c=c.return}}function Jj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);S===a&&R===c?G===jd||G===od&&1073741823===sa&&Y()-Ue<Wh?Za(a,R):pd=!0:Rh(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,a.finishedExpirationTime===c&&(a.finishedExpirationTime=0,a.finishedWork=null),T(a)))}function Cj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=X(),b=Va(b,a,null));a=id(a,b);null!==a&&T(a)}function Tj(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=
-__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);ef=function(a,e){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(f){}};Se=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}function Uj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=
-null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Le(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Vj(a){if("function"===typeof a)return Le(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Cd)return 11;if(a===Dd)return 14}return 2}function Ta(a,b,c){c=a.alternate;null===c?(c=ja(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=
-a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,firstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}function Zc(a,b,c,d,e,
-f){var g=2;d=a;if("function"===typeof a)Le(a)&&(g=1);else if("string"===typeof a)g=5;else a:switch(a){case va:return Ha(c.children,e,f,b);case Wj:g=8;e|=7;break;case Af:g=8;e|=1;break;case vc:return a=ja(12,c,b,e|8),a.elementType=vc,a.type=vc,a.expirationTime=f,a;case wc:return a=ja(13,c,b,e),a.type=wc,a.elementType=wc,a.expirationTime=f,a;case Bd:return a=ja(19,c,b,e),a.elementType=Bd,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case Cf:g=10;break a;case Bf:g=
-9;break a;case Cd:g=11;break a;case Dd:g=14;break a;case Df:g=16;d=null;break a}throw Error(m(130,null==a?a:typeof a,""));}b=ja(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ha(a,b,c,d){a=ja(7,a,d,b);a.expirationTime=c;return a}function xe(a,b,c){a=ja(6,a,null,b);a.expirationTime=c;return a}function ye(a,b,c){b=ja(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}
-function Xj(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Rh(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==
-c&&c>=b&&a<=b}function Ya(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}function Qh(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=
-b))}function Xe(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}function sd(a,b,c,d){var e=b.current,f=X(),g=dc.suspense;f=Va(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(Na(c)!==c||1!==c.tag)throw Error(m(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(K(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(m(171));}if(1===c.tag){var k=c.type;if(K(k)){c=Ig(c,k,h);break a}}c=h}else c=Da;null===
-b.context?b.context=c:b.pendingContext=c;b=Ea(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);Fa(e,b);Ja(e,f);return f}function ff(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function di(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function gf(a,b){di(a,b);(a=a.alternate)&&di(a,b)}function hf(a,b,c){c=null!=c&&!0===c.hydrate;var d=new Xj(a,b,c),e=ja(3,null,
-null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;a[Pb]=d.current;c&&0!==b&&Oi(9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}function lc(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(a.nodeType!==Pa||" react-mount-point-unstable "!==a.nodeValue))}function Yj(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new hf(a,0,b?{hydrate:!0}:void 0)}function td(a,
-b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if("function"===typeof e){var h=e;e=function(){var a=ff(g);h.call(a)}}sd(b,g,a,e)}else{f=c._reactRootContainer=Yj(c,d);g=f._internalRoot;if("function"===typeof e){var k=e;e=function(){var a=ff(g);k.call(a)}}Yh(function(){sd(b,g,a,e)})}return ff(g)}function Zj(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:eb,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}function ei(a,b){var c=
-2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!lc(b))throw Error(m(200));return Zj(a,b,null,c)}if(!la)throw Error(m(227));var qc=null,bb={},rc=[],wd={},cb={},xd={},Bi=function(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(p){this.onError(p)}},Cb=!1,sc=null,tc=!1,yd=null,Ci={onError:function(a){Cb=!0;sc=a}},Ad=null,Ff=null,xf=null,Db=null,Ei=function(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<
-b.length&&!a.isPropagationStopped();d++)wf(a,b[d],c[d]);else b&&wf(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}},jf={injectEventPluginOrder:function(a){if(qc)throw Error(m(101));qc=Array.prototype.slice.call(a);uf()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!bb.hasOwnProperty(c)||bb[c]!==d){if(bb[c])throw Error(m(102,c));bb[c]=d;b=!0}}b&&uf()}},aa=la.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
-aa.hasOwnProperty("ReactCurrentDispatcher")||(aa.ReactCurrentDispatcher={current:null});aa.hasOwnProperty("ReactCurrentBatchConfig")||(aa.ReactCurrentBatchConfig={suspense:null});var Gi=/^(.*)[\\\/]/,D="function"===typeof Symbol&&Symbol.for,$c=D?Symbol.for("react.element"):60103,eb=D?Symbol.for("react.portal"):60106,va=D?Symbol.for("react.fragment"):60107,Af=D?Symbol.for("react.strict_mode"):60108,vc=D?Symbol.for("react.profiler"):60114,Cf=D?Symbol.for("react.provider"):60109,Bf=D?Symbol.for("react.context"):
-60110,Wj=D?Symbol.for("react.concurrent_mode"):60111,Cd=D?Symbol.for("react.forward_ref"):60112,wc=D?Symbol.for("react.suspense"):60113,Bd=D?Symbol.for("react.suspense_list"):60120,Dd=D?Symbol.for("react.memo"):60115,Df=D?Symbol.for("react.lazy"):60116;D&&Symbol.for("react.fundamental");D&&Symbol.for("react.responder");D&&Symbol.for("react.scope");var zf="function"===typeof Symbol&&Symbol.iterator,Aa=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),
-J=la.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.assign,Fd=null,fb=null,gb=null,ke=function(a,b){return a(b)},fg=function(a,b,c,d){return a(b,c,d)},Hd=function(){},hg=ke,Oa=!1,$d=!1,I=la.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler,ak=I.unstable_cancelCallback,kf=I.unstable_now,ag=I.unstable_scheduleCallback,bk=I.unstable_shouldYield,fi=I.unstable_requestPaint,Ud=I.unstable_runWithPriority,ud=I.unstable_next,ck=I.unstable_getCurrentPriorityLevel,dk=I.unstable_ImmediatePriority,
-gi=I.unstable_UserBlockingPriority,bg=I.unstable_NormalPriority,ek=I.unstable_LowPriority,fk=I.unstable_IdlePriority;new Map;var Ii=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,If=Object.prototype.hasOwnProperty,
-Kf={},Jf={},C={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){C[a]=new E(a,0,!1,a,null,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];C[b]=new E(b,1,!1,a[1],null,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){C[a]=new E(a,2,!1,a.toLowerCase(),null,!1)});
-["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){C[a]=new E(a,2,!1,a,null,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){C[a]=new E(a,3,!1,a.toLowerCase(),null,!1)});["checked","multiple","muted","selected"].forEach(function(a){C[a]=new E(a,3,!0,a,null,
-!1)});["capture","download"].forEach(function(a){C[a]=new E(a,4,!1,a,null,!1)});["cols","rows","size","span"].forEach(function(a){C[a]=new E(a,6,!1,a,null,!1)});["rowSpan","start"].forEach(function(a){C[a]=new E(a,5,!1,a.toLowerCase(),null,!1)});var lf=/[\-:]([a-z])/g,mf=function(a){return a[1].toUpperCase()};"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=
-a.replace(lf,mf);C[b]=new E(b,1,!1,a,null,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(lf,mf);C[b]=new E(b,1,!1,a,"http://www.w3.org/1999/xlink",!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(lf,mf);C[b]=new E(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1)});["tabIndex","crossOrigin"].forEach(function(a){C[a]=new E(a,1,!1,a.toLowerCase(),null,!1)});C.xlinkHref=new E("xlinkHref",1,
-!1,"xlink:href","http://www.w3.org/1999/xlink",!0);["src","href","action","formAction"].forEach(function(a){C[a]=new E(a,1,!1,a.toLowerCase(),null,!0)});var vd,Mh=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{vd=vd||document.createElement("div");vd.innerHTML="<svg>"+b.valueOf().toString()+
-"</svg>";for(b=vd.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}}),Pa=8,fc=function(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b},ib={animationend:yc("Animation","AnimationEnd"),animationiteration:yc("Animation","AnimationIteration"),animationstart:yc("Animation","AnimationStart"),transitionend:yc("Transition","TransitionEnd")},Pd={},Uf={};Aa&&(Uf=document.createElement("div").style,
-"AnimationEvent"in window||(delete ib.animationend.animation,delete ib.animationiteration.animation,delete ib.animationstart.animation),"TransitionEvent"in window||delete ib.transitionend.transition);var hi=zc("animationend"),ii=zc("animationiteration"),ji=zc("animationstart"),ki=zc("transitionend"),Nb="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),
-Wd=!1,ba=[],xa=null,ya=null,za=null,Fb=new Map,Gb=new Map,Lb=[],Rd="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),Pi="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" ");J(M.prototype,{preventDefault:function(){this.defaultPrevented=
-!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=Bc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=Bc)},persist:function(){this.isPersistent=Bc},isPersistent:Cc,destructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=
-null;this.isPropagationStopped=this.isDefaultPrevented=Cc;this._dispatchInstances=this._dispatchListeners=null}});M.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};M.extend=function(a){function b(){return c.apply(this,arguments)}var c=this,d=function(){};d.prototype=c.prototype;d=new d;J(d,b.prototype);b.prototype=d;b.prototype.constructor=
-b;b.Interface=J({},c.Interface,a);b.extend=c.extend;eg(b);return b};eg(M);var gk=M.extend({animationName:null,elapsedTime:null,pseudoElement:null}),hk=M.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),mc=M.extend({view:null,detail:null}),ik=mc.extend({relatedTarget:null}),jk={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",
-MozPrintableKey:"Unidentified"},kk={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},$i={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"},
-lk=mc.extend({key:function(a){if(a.key){var b=jk[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=Dc(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?kk[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Zd,charCode:function(a){return"keypress"===a.type?Dc(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===
-a.type?Dc(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),li=0,mi=0,ni=!1,oi=!1,nc=mc.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Zd,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=li;li=a.screenX;return ni?"mousemove"===a.type?a.screenX-
-b:0:(ni=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;var b=mi;mi=a.screenY;return oi?"mousemove"===a.type?a.screenY-b:0:(oi=!0,0)}}),pi=nc.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),mk=nc.extend({dataTransfer:null}),nk=mc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Zd}),ok=M.extend({propertyName:null,
-elapsedTime:null,pseudoElement:null}),pk=nc.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),qi=[["blur","blur",0],["cancel","cancel",0],["click","click",0],["close","close",0],["contextmenu","contextMenu",0],["copy","copy",0],["cut","cut",0],["auxclick","auxClick",0],["dblclick","doubleClick",0],["dragend","dragEnd",
-0],["dragstart","dragStart",0],["drop","drop",0],["focus","focus",0],["input","input",0],["invalid","invalid",0],["keydown","keyDown",0],["keypress","keyPress",0],["keyup","keyUp",0],["mousedown","mouseDown",0],["mouseup","mouseUp",0],["paste","paste",0],["pause","pause",0],["play","play",0],["pointercancel","pointerCancel",0],["pointerdown","pointerDown",0],["pointerup","pointerUp",0],["ratechange","rateChange",0],["reset","reset",0],["seeked","seeked",0],["submit","submit",0],["touchcancel","touchCancel",
-0],["touchend","touchEnd",0],["touchstart","touchStart",0],["volumechange","volumeChange",0],["drag","drag",1],["dragenter","dragEnter",1],["dragexit","dragExit",1],["dragleave","dragLeave",1],["dragover","dragOver",1],["mousemove","mouseMove",1],["mouseout","mouseOut",1],["mouseover","mouseOver",1],["pointermove","pointerMove",1],["pointerout","pointerOut",1],["pointerover","pointerOver",1],["scroll","scroll",1],["toggle","toggle",1],["touchmove","touchMove",1],["wheel","wheel",1],["abort","abort",
-2],[hi,"animationEnd",2],[ii,"animationIteration",2],[ji,"animationStart",2],["canplay","canPlay",2],["canplaythrough","canPlayThrough",2],["durationchange","durationChange",2],["emptied","emptied",2],["encrypted","encrypted",2],["ended","ended",2],["error","error",2],["gotpointercapture","gotPointerCapture",2],["load","load",2],["loadeddata","loadedData",2],["loadedmetadata","loadedMetadata",2],["loadstart","loadStart",2],["lostpointercapture","lostPointerCapture",2],["playing","playing",2],["progress",
-"progress",2],["seeking","seeking",2],["stalled","stalled",2],["suspend","suspend",2],["timeupdate","timeUpdate",2],[ki,"transitionEnd",2],["waiting","waiting",2]],ri={},nf={},of=0;for(;of<qi.length;of++){var pf=qi[of],si=pf[0],qf=pf[1],qk=pf[2],ti="on"+(qf[0].toUpperCase()+qf.slice(1)),ui={phasedRegistrationNames:{bubbled:ti,captured:ti+"Capture"},dependencies:[si],eventPriority:qk};ri[qf]=ui;nf[si]=ui}var vi={eventTypes:ri,getEventPriority:function(a){a=nf[a];return void 0!==a?a.eventPriority:2},
-extractEvents:function(a,b,c,d,e){e=nf[a];if(!e)return null;switch(a){case "keypress":if(0===Dc(c))return null;case "keydown":case "keyup":a=lk;break;case "blur":case "focus":a=ik;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=nc;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a=mk;break;
-case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=nk;break;case hi:case ii:case ji:a=gk;break;case ki:a=ok;break;case "scroll":a=mc;break;case "wheel":a=pk;break;case "copy":case "cut":case "paste":a=hk;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=pi;break;default:a=M}b=a.getPooled(e,b,c,d);jb(b);return b}},fj=gi,ej=Ud,bj=vi.getEventPriority,gj=10,Fc=
-[],Gc=!0,jg=new ("function"===typeof WeakMap?WeakMap:Map),Ob={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,
-tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},rk=["Webkit","ms","Moz","O"];Object.keys(Ob).forEach(function(a){rk.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Ob[b]=Ob[a]})});var hj=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),sg="$",tg="/$",ge="$?",fe="$!",
-bf=null,cf=null,Ze="function"===typeof setTimeout?setTimeout:void 0,Hj="function"===typeof clearTimeout?clearTimeout:void 0,rf=Math.random().toString(36).slice(2),Ba="__reactInternalInstance$"+rf,Ic="__reactEventHandlers$"+rf,Pb="__reactContainere$"+rf,Ca=null,ie=null,Jc=null,sk=M.extend({data:null}),tk=M.extend({data:null}),ij=[9,13,27,32],je=Aa&&"CompositionEvent"in window,oc=null;Aa&&"documentMode"in document&&(oc=document.documentMode);var uk=Aa&&"TextEvent"in window&&!oc,zg=Aa&&(!je||oc&&8<oc&&
-11>=oc),yg=String.fromCharCode(32),ta={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},
-compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},xg=!1,lb=!1,vk={eventTypes:ta,extractEvents:function(a,b,c,d,e){var f;if(je)b:{switch(a){case "compositionstart":var g=ta.compositionStart;break b;case "compositionend":g=ta.compositionEnd;break b;case "compositionupdate":g=ta.compositionUpdate;break b}g=void 0}else lb?vg(a,c)&&(g=ta.compositionEnd):"keydown"===
-a&&229===c.keyCode&&(g=ta.compositionStart);g?(zg&&"ko"!==c.locale&&(lb||g!==ta.compositionStart?g===ta.compositionEnd&&lb&&(f=ug()):(Ca=d,ie="value"in Ca?Ca.value:Ca.textContent,lb=!0)),e=sk.getPooled(g,b,c,d),f?e.data=f:(f=wg(c),null!==f&&(e.data=f)),jb(e),f=e):f=null;(a=uk?jj(a,c):kj(a,c))?(b=tk.getPooled(ta.beforeInput,b,c,d),b.data=a,jb(b)):b=null;return null===f?b:null===b?f:[f,b]}},lj={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,
-tel:!0,text:!0,time:!0,url:!0,week:!0},Cg={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}},Qb=null,Rb=null,sf=!1;Aa&&(sf=ig("input")&&(!document.documentMode||9<document.documentMode));var wk={eventTypes:Cg,_isInputEventSupported:sf,extractEvents:function(a,b,c,d,e){e=b?Qa(b):window;var f=e.nodeName&&e.nodeName.toLowerCase();if("select"===f||"input"===f&&"file"===e.type)var g=nj;
-else if(Ag(e))if(sf)g=rj;else{g=pj;var h=oj}else(f=e.nodeName)&&"input"===f.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(g=qj);if(g&&(g=g(a,b)))return Bg(g,c,d);h&&h(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Ld(e,"number",e.value)}},pc={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout",
-"pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout","pointerover"]}},tf,xk={eventTypes:pc,extractEvents:function(a,b,c,d,e){var f="mouseover"===a||"pointerover"===a,g="mouseout"===a||"pointerout"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;e=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Jb(b):null,null!==b&&(f=Na(b),b!==f||5!==b.tag&&6!==b.tag))b=null}else g=
-null;if(g===b)return null;if("mouseout"===a||"mouseover"===a){var h=nc;var k=pc.mouseLeave;var l=pc.mouseEnter;var m="mouse"}else if("pointerout"===a||"pointerover"===a)h=pi,k=pc.pointerLeave,l=pc.pointerEnter,m="pointer";a=null==g?e:Qa(g);e=null==b?e:Qa(b);k=h.getPooled(k,g,c,d);k.type=m+"leave";k.target=a;k.relatedTarget=e;d=h.getPooled(l,b,c,d);d.type=m+"enter";d.target=e;d.relatedTarget=a;h=g;m=b;if(h&&m)a:{l=h;a=m;g=0;for(b=l;b;b=ma(b))g++;b=0;for(e=a;e;e=ma(e))b++;for(;0<g-b;)l=ma(l),g--;for(;0<
-b-g;)a=ma(a),b--;for(;g--;){if(l===a||l===a.alternate)break a;l=ma(l);a=ma(a)}l=null}else l=null;a=l;for(l=[];h&&h!==a;){g=h.alternate;if(null!==g&&g===a)break;l.push(h);h=ma(h)}for(h=[];m&&m!==a;){g=m.alternate;if(null!==g&&g===a)break;h.push(m);m=ma(m)}for(m=0;m<l.length;m++)Yd(l[m],"bubbled",k);for(m=h.length;0<m--;)Yd(h[m],"captured",d);if(c===tf)return tf=null,[k];tf=c;return[k,d]}},Ra="function"===typeof Object.is?Object.is:sj,tj=Object.prototype.hasOwnProperty,yk=Aa&&"documentMode"in document&&
-11>=document.documentMode,Gg={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},mb=null,me=null,Tb=null,le=!1,zk={eventTypes:Gg,extractEvents:function(a,b,c,d,e){e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument;var f;if(!(f=!e)){a:{e=Qd(e);f=xd.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Qa(b):window;
-switch(a){case "focus":if(Ag(e)||"true"===e.contentEditable)mb=e,me=b,Tb=null;break;case "blur":Tb=me=mb=null;break;case "mousedown":le=!0;break;case "contextmenu":case "mouseup":case "dragend":return le=!1,Fg(c,d);case "selectionchange":if(yk)break;case "keydown":case "keyup":return Fg(c,d)}return null}};jf.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));(function(a,b,c){Ad=a;Ff=b;xf=c})(he,
-Ib,Qa);jf.injectEventPluginsByName({SimpleEventPlugin:vi,EnterLeaveEventPlugin:xk,ChangeEventPlugin:wk,SelectEventPlugin:zk,BeforeInputEventPlugin:vk});new Set;var ne=[],nb=-1,Da={},L={current:Da},Q={current:!1},Sa=Da,vj=Ud,qe=ag,Tg=ak,uj=ck,Nc=dk,Kg=gi,Lg=bg,Mg=ek,Ng=fk,Sg={},Kj=bk,Rj=void 0!==fi?fi:function(){},oa=null,Oc=null,re=!1,wi=kf(),Y=1E4>wi?kf:function(){return kf()-wi},Ak=3,te={current:null},Rc=null,qb=null,Qc=null,Wg=0,Uc=2,Ga=!1,dc=aa.ReactCurrentBatchConfig,fh=(new la.Component).refs,
-Xc={isMounted:function(a){return(a=a._reactInternalFiber)?Na(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=X(),e=dc.suspense;d=Va(d,a,e);e=Ea(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=X(),e=dc.suspense;d=Va(d,a,e);e=Ea(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=X(),d=dc.suspense;
-c=Va(c,a,d);d=Ea(c,d);d.tag=Uc;void 0!==b&&null!==b&&(d.callback=b);Fa(a,d);Ja(a,c)}},ad=Array.isArray,yb=gh(!0),Ke=gh(!1),Wb={},fa={current:Wb},Yb={current:Wb},Xb={current:Wb},A={current:0},cd=aa.ReactCurrentDispatcher,U=aa.ReactCurrentBatchConfig,Zb=0,Ia=null,H=null,ha=null,vb=null,O=null,ub=null,wb=0,ia=null,bc=0,$b=!1,pa=null,ac=0,dd={readContext:ea,useCallback:N,useContext:N,useEffect:N,useImperativeHandle:N,useLayoutEffect:N,useMemo:N,useReducer:N,useRef:N,useState:N,useDebugValue:N,useResponder:N,
-useDeferredValue:N,useTransition:N},wj={readContext:ea,useCallback:sh,useContext:ea,useEffect:oh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Ge(4,36,qh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Ge(4,36,a,b)},useMemo:function(a,b){var c=xb();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=xb();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};
-a=a.dispatch=nh.bind(null,Ia,a);return[d.memoizedState,a]},useRef:function(a){var b=xb();a={current:a};return b.memoizedState=a},useState:De,useDebugValue:rh,useResponder:ih,useDeferredValue:function(a,b){var c=De(a),d=c[0],e=c[1];oh(function(){ud(function(){var c=U.suspense;U.suspense=void 0===b?null:b;try{e(a)}finally{U.suspense=c}})},[a,b]);return d},useTransition:function(a){var b=De(!1),c=b[0],d=b[1];return[sh(function(b){d(!0);ud(function(){var c=U.suspense;U.suspense=void 0===a?null:a;try{d(!1),
-b()}finally{U.suspense=c}})},[a,c]),c]}},jh={readContext:ea,useCallback:th,useContext:ea,useEffect:ph,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return He(4,36,qh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return He(4,36,a,b)},useMemo:function(a,b){var c=cc();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Be(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:mh,useRef:function(a){return cc().memoizedState},useState:Ee,useDebugValue:rh,
-useResponder:ih,useDeferredValue:function(a,b){var c=Ee(a),d=c[0],e=c[1];ph(function(){ud(function(){var c=U.suspense;U.suspense=void 0===b?null:b;try{e(a)}finally{U.suspense=c}})},[a,b]);return d},useTransition:function(a){var b=Ee(!1),c=b[0],d=b[1];return[th(function(b){d(!0);ud(function(){var c=U.suspense;U.suspense=void 0===a?null:a;try{d(!1),b()}finally{U.suspense=c}})},[a,c]),c]}},qa=null,Ka=null,Wa=!1,xj=aa.ReactCurrentOwner,da=!1,Oe={dehydrated:null,retryTime:0};var Nj=function(a,b,c,d){for(c=
-b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};var bi=function(a){};var Mj=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;Ua(fa.current);a=null;switch(c){case "input":f=Jd(g,f);d=Jd(g,d);a=[];break;case "option":f=Md(g,f);d=Md(g,d);a=[];break;case "select":f=
-J({},f,{value:void 0});d=J({},d,{value:void 0});a=[];break;case "textarea":f=Nd(g,f);d=Nd(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=Hc)}ae(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if("style"===h)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]="");else"dangerouslySetInnerHTML"!==h&&"children"!==h&&"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&"autoFocus"!==h&&(cb.hasOwnProperty(h)?
-a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if("style"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]="");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),c[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else"dangerouslySetInnerHTML"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,""+l)):"children"===h?g===l||"string"!==typeof l&&"number"!==typeof l||
-(a=a||[]).push(h,""+l):"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&(cb.hasOwnProperty(h)?(null!=l&&na(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push("style",c);e=a;(b.updateQueue=e)&&zb(b)}};var Oj=function(a,b,c,d){c!==d&&zb(b)};var Bj="function"===typeof WeakSet?WeakSet:Set,Ij="function"===typeof WeakMap?WeakMap:Map,Ej=Math.ceil,ld=aa.ReactCurrentDispatcher,ai=aa.ReactCurrentOwner,F=0,af=8,Z=16,ka=32,$a=0,md=1,Vh=2,od=3,jd=4,$e=5,q=F,S=null,v=null,R=0,G=
-$a,nd=null,sa=1073741823,gc=1073741823,qd=null,hc=0,pd=!1,Ue=0,Wh=500,n=null,gd=!1,Ve=null,La=null,rd=!1,ic=null,jc=90,ab=null,kc=0,df=null,hd=0,Ja=function(a,b){if(50<kc)throw kc=0,df=null,Error(m(185));a=id(a,b);if(null!==a){var c=pe();1073741823===b?(q&af)!==F&&(q&(Z|ka))===F?We(a):(T(a),q===F&&ca()):T(a);(q&4)===F||98!==c&&99!==c||(null===ab?ab=new Map([[a,b]]):(c=ab.get(a),(void 0===c||c>b)&&ab.set(a,b)))}};var Lj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==
-e||Q.current)da=!0;else{if(d<c){da=!1;switch(b.tag){case 3:Ch(b);Je();break;case 5:hh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:K(b.type)&&Mc(b);break;case 4:ze(b,b.stateNode.containerInfo);break;case 10:Ug(b,b.memoizedProps.value);break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;if(0!==d&&d>=c)return Dh(a,b,c);y(A,A.current&1,b);b=ra(a,b,c);return null!==b?b.sibling:null}y(A,A.current&1,b);break;case 19:d=b.childExpirationTime>=
-c;if(0!==(a.effectTag&64)){if(d)return Fh(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);y(A,A.current,b);if(!d)return null}return ra(a,b,c)}da=!1}}else da=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=ob(b,L.current);rb(b,c);e=Ce(null,b,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;kh();if(K(d)){var f=!0;Mc(b)}else f=
-!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;"function"===typeof g&&Wc(b,d,g,a);e.updater=Xc;b.stateNode=e;e._reactInternalFiber=b;we(b,d,a,c);b=Ne(null,b,d,!0,f,c)}else b.tag=0,P(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;Fi(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Vj(e);a=V(e,a);switch(f){case 0:b=Me(null,b,e,a,c);break;case 1:b=Bh(null,
-b,e,a,c);break;case 11:b=xh(null,b,e,a,c);break;case 14:b=yh(null,b,e,V(e.type,a),d,c);break;default:throw Error(m(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),Me(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),Bh(a,b,d,e,c);case 3:Ch(b);d=b.updateQueue;if(null===d)throw Error(m(282));e=b.memoizedState;e=null!==e?e.element:null;Ub(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)Je(),b=ra(a,b,c);else{if(e=b.stateNode.hydrate)Ka=
-kb(b.stateNode.containerInfo.firstChild),qa=b,e=Wa=!0;if(e)for(c=Ke(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else P(a,b,d,c),Je();b=b.child}return b;case 5:return hh(b),null===a&&Ie(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,ee(d,e)?g=null:null!==f&&ee(d,f)&&(b.effectTag|=16),Ah(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(P(a,b,g,c),b=b.child),b;case 6:return null===a&&Ie(b),null;case 13:return Dh(a,b,
-c);case 4:return ze(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=yb(b,null,d,c):P(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),xh(a,b,d,e,c);case 7:return P(a,b,b.pendingProps,c),b.child;case 8:return P(a,b,b.pendingProps.children,c),b.child;case 12:return P(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;Ug(b,f);if(null!==g){var h=g.value;f=Ra(h,f)?0:("function"===typeof d._calculateChangedBits?
-d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!Q.current){b=ra(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Ea(c,null),l.tag=Uc,Fa(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);Vg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=
-l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}}P(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,rb(b,c),e=ea(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,P(a,b,d,c),b.child;case 14:return e=b.type,f=V(e,b.pendingProps),f=V(e.type,f),yh(a,b,e,f,d,c);case 15:return zh(a,b,b.type,b.pendingProps,d,c);case 17:return d=
-b.type,e=b.pendingProps,e=b.elementType===d?e:V(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,K(d)?(a=!0,Mc(b)):a=!1,rb(b,c),dh(b,d,e,c),we(b,d,e,c),Ne(null,b,d,!0,a,c);case 19:return Fh(a,b,c)}throw Error(m(156,b.tag));};var ef=null,Se=null,ja=function(a,b,c,d){return new Uj(a,b,c,d)};hf.prototype.render=function(a,b){sd(a,this._internalRoot,null,void 0===b?null:b)};hf.prototype.unmount=function(a){var b=this._internalRoot,c=void 0===a?null:a,d=b.containerInfo;sd(null,
-b,null,function(){d[Pb]=null;null!==c&&c()})};var Ui=function(a){if(13===a.tag){var b=Pc(X(),150,100);Ja(a,b);gf(a,b)}};var Zf=function(a){if(13===a.tag){X();var b=Ak++;Ja(a,b);gf(a,b)}};var Si=function(a){if(13===a.tag){var b=X();b=Va(b,a,null);Ja(a,b);gf(a,b)}};Fd=function(a,b,c){switch(b){case "input":Kd(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==
-a&&d.form===a.form){var e=he(d);if(!e)throw Error(m(90));Mf(d);Kd(d,e)}}}break;case "textarea":Rf(a,c);break;case "select":b=c.value,null!=b&&hb(a,!!c.multiple,b,!1)}};(function(a,b,c,d){ke=a;fg=b;Hd=c;hg=d})(Xh,function(a,b,c,d){var e=q;q|=4;try{return pb(98,a.bind(null,b,c,d))}finally{q=e,q===F&&ca()}},function(){(q&(1|Z|ka))===F&&(Gj(),Ab())},function(a,b){var c=q;q|=2;try{return a(b)}finally{q=c,q===F&&ca()}});var xi={createPortal:ei,findDOMNode:function(a){if(null==a)return null;if(1===a.nodeType)return a;
-var b=a._reactInternalFiber;if(void 0===b){if("function"===typeof a.render)throw Error(m(188));throw Error(m(268,Object.keys(a)));}a=Xf(b);a=null===a?null:a.stateNode;return a},hydrate:function(a,b,c){if(!lc(b))throw Error(m(200));return td(null,a,b,!0,c)},render:function(a,b,c){if(!lc(b))throw Error(m(200));return td(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){if(!lc(c))throw Error(m(200));if(null==a||void 0===a._reactInternalFiber)throw Error(m(38));return td(a,b,c,!1,
-d)},unmountComponentAtNode:function(a){if(!lc(a))throw Error(m(40));return a._reactRootContainer?(Yh(function(){td(null,null,a,!1,function(){a._reactRootContainer=null;a[Pb]=null})}),!0):!1},unstable_createPortal:function(){return ei.apply(void 0,arguments)},unstable_batchedUpdates:Xh,flushSync:function(a,b){if((q&(Z|ka))!==F)throw Error(m(187));var c=q;q|=1;try{return pb(99,a.bind(null,b))}finally{q=c,ca()}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[Ib,Qa,he,jf.injectEventPluginsByName,
-wd,jb,function(a){zd(a,Wi)},Gf,Hf,Ec,uc,Ab,{current:!1}]}};(function(a){var b=a.findFiberByHostInstance;return Tj(J({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:aa.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Xf(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Jb,
-bundleType:0,version:"16.12.0",rendererPackageName:"react-dom"});var yi={default:xi},zi=yi&&xi||yi;return zi.default||zi});
+'use strict';(function(I,ea){"object"===typeof exports&&"undefined"!==typeof module?ea(exports,require("react")):"function"===typeof define&&define.amd?define(["exports","react"],ea):(I=I||self,ea(I.ReactDOM={},I.React))})(this,function(I,ea){function k(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
+function ji(a,b,c,d,e,f,g,h,m){yb=!1;gc=null;ki.apply(li,arguments)}function mi(a,b,c,d,e,f,g,h,m){ji.apply(this,arguments);if(yb){if(yb){var n=gc;yb=!1;gc=null}else throw Error(k(198));hc||(hc=!0,pd=n)}}function lf(a,b,c){var d=a.type||"unknown-event";a.currentTarget=mf(c);mi(d,b,void 0,a);a.currentTarget=null}function nf(){if(ic)for(var a in cb){var b=cb[a],c=ic.indexOf(a);if(!(-1<c))throw Error(k(96,a));if(!jc[c]){if(!b.extractEvents)throw Error(k(97,a));jc[c]=b;c=b.eventTypes;for(var d in c){var e=
+void 0;var f=c[d],g=b,h=d;if(qd.hasOwnProperty(h))throw Error(k(99,h));qd[h]=f;var m=f.phasedRegistrationNames;if(m){for(e in m)m.hasOwnProperty(e)&&of(m[e],g,h);e=!0}else f.registrationName?(of(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(k(98,d,a));}}}}function of(a,b,c){if(db[a])throw Error(k(100,a));db[a]=b;rd[a]=b.eventTypes[c].dependencies}function pf(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!cb.hasOwnProperty(c)||cb[c]!==d){if(cb[c])throw Error(k(102,c));cb[c]=
+d;b=!0}}b&&nf()}function qf(a){if(a=rf(a)){if("function"!==typeof sd)throw Error(k(280));var b=a.stateNode;b&&(b=td(b),sd(a.stateNode,a.type,b))}}function sf(a){eb?fb?fb.push(a):fb=[a]:eb=a}function tf(){if(eb){var a=eb,b=fb;fb=eb=null;qf(a);if(b)for(a=0;a<b.length;a++)qf(b[a])}}function ud(){if(null!==eb||null!==fb)vd(),tf()}function uf(a,b,c){if(wd)return a(b,c);wd=!0;try{return vf(a,b,c)}finally{wd=!1,ud()}}function ni(a){if(wf.call(xf,a))return!0;if(wf.call(yf,a))return!1;if(oi.test(a))return xf[a]=
+!0;yf[a]=!0;return!1}function pi(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}function qi(a,b,c,d){if(null===b||"undefined"===typeof b||pi(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function L(a,
+b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}function xd(a,b,c,d){var e=E.hasOwnProperty(b)?E[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(qi(b,c,e,d)&&(c=null),d||null===e?ni(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,
+d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}function zb(a){if(null===a||"object"!==typeof a)return null;a=zf&&a[zf]||a["@@iterator"];return"function"===typeof a?a:null}function ri(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}function na(a){if(null==a)return null;
+if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case Ma:return"Fragment";case gb:return"Portal";case kc:return"Profiler";case Af:return"StrictMode";case lc:return"Suspense";case yd:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case Bf:return"Context.Consumer";case Cf:return"Context.Provider";case zd:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b?"ForwardRef("+b+")":"ForwardRef");case Ad:return na(a.type);
+case Df:return na(a.render);case Ef:if(a=1===a._status?a._result:null)return na(a)}return null}function Bd(a){var b="";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c="";break a;default:var d=a._debugOwner,e=a._debugSource,f=na(a.type);c=null;d&&(c=na(d.type));d=f;f="";e?f=" (at "+e.fileName.replace(si,"")+":"+e.lineNumber+")":c&&(f=" (created by "+c+")");c="\n    in "+(d||"Unknown")+f}b+=c;a=a.return}while(a);return b}function va(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;
+default:return""}}function Ff(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}function ti(a){var b=Ff(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,
+b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}}function mc(a){a._valueTracker||(a._valueTracker=ti(a))}function Gf(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ff(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Cd(a,b){var c=b.checked;return M({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=
+c?c:a._wrapperState.initialChecked})}function Hf(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=va(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function If(a,b){b=b.checked;null!=b&&xd(a,"checked",b,!1)}function Dd(a,b){If(a,b);var c=va(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==
+""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Ed(a,b.type,c):b.hasOwnProperty("defaultValue")&&Ed(a,b.type,va(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}function Jf(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=
+b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}function Ed(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function ui(a){var b="";ea.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Fd(a,b){a=M({children:void 0},b);if(b=ui(b.children))a.children=b;return a}function hb(a,b,c,d){a=a.options;if(b){b={};
+for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+va(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}function Gd(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(k(91));return M({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}
+function Kf(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(k(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(k(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:va(c)}}function Lf(a,b){var c=va(b.value),d=va(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function Mf(a,b){b=a.textContent;b===a._wrapperState.initialValue&&""!==
+b&&null!==b&&(a.value=b)}function Nf(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Hd(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?Nf(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}function nc(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}function oc(a){if(Id[a])return Id[a];
+if(!ib[a])return a;var b=ib[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Of)return Id[a]=b[c];return a}function Jd(a){var b=Pf.get(a);void 0===b&&(b=new Map,Pf.set(a,b));return b}function Na(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Qf(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Rf(a){if(Na(a)!==
+a)throw Error(k(188));}function vi(a){var b=a.alternate;if(!b){b=Na(a);if(null===b)throw Error(k(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Rf(e),a;if(f===d)return Rf(e),b;f=f.sibling}throw Error(k(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=
+f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(k(189));}}if(c.alternate!==d)throw Error(k(190));}if(3!==c.tag)throw Error(k(188));return c.stateNode.current===c?a:b}function Sf(a){a=vi(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}function jb(a,b){if(null==
+b)throw Error(k(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function Kd(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}function pc(a){null!==a&&(Ab=jb(Ab,a));a=Ab;Ab=null;if(a){Kd(a,wi);if(Ab)throw Error(k(95));if(hc)throw a=pd,hc=!1,pd=null,a;}}function Ld(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:
+a}function Tf(a){if(!wa)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Uf(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>qc.length&&qc.push(a)}function Vf(a,b,c,d){if(qc.length){var e=qc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}function Wf(a){var b=
+a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Bb(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Ld(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,m=0;m<jc.length;m++){var n=jc[m];n&&(n=n.extractEvents(d,b,f,e,g))&&(h=jb(h,n))}pc(h)}}function Md(a,
+b,c){if(!c.has(a)){switch(a){case "scroll":Cb(b,"scroll",!0);break;case "focus":case "blur":Cb(b,"focus",!0);Cb(b,"blur",!0);c.set("blur",null);c.set("focus",null);break;case "cancel":case "close":Tf(a)&&Cb(b,a,!0);break;case "invalid":case "submit":case "reset":break;default:-1===Db.indexOf(a)&&w(a,b)}c.set(a,null)}}function xi(a,b){var c=Jd(b);Nd.forEach(function(a){Md(a,b,c)});yi.forEach(function(a){Md(a,b,c)})}function Od(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e,
+container:d}}function Xf(a,b){switch(a){case "focus":case "blur":xa=null;break;case "dragenter":case "dragleave":ya=null;break;case "mouseover":case "mouseout":za=null;break;case "pointerover":case "pointerout":Eb.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Fb.delete(b.pointerId)}}function Gb(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Od(b,c,d,e,f),null!==b&&(b=Hb(b),null!==b&&Yf(b)),a;a.eventSystemFlags|=d;return a}function zi(a,b,c,d,e){switch(b){case "focus":return xa=
+Gb(xa,a,b,c,d,e),!0;case "dragenter":return ya=Gb(ya,a,b,c,d,e),!0;case "mouseover":return za=Gb(za,a,b,c,d,e),!0;case "pointerover":var f=e.pointerId;Eb.set(f,Gb(Eb.get(f)||null,a,b,c,d,e));return!0;case "gotpointercapture":return f=e.pointerId,Fb.set(f,Gb(Fb.get(f)||null,a,b,c,d,e)),!0}return!1}function Ai(a){var b=Bb(a.target);if(null!==b){var c=Na(b);if(null!==c)if(b=c.tag,13===b){if(b=Qf(c),null!==b){a.blockedOn=b;Pd(a.priority,function(){Bi(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=
+3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function rc(a){if(null!==a.blockedOn)return!1;var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Hb(b);null!==c&&Yf(c);a.blockedOn=b;return!1}return!0}function Zf(a,b,c){rc(a)&&c.delete(b)}function Ci(){for(Rd=!1;0<fa.length;){var a=fa[0];if(null!==a.blockedOn){a=Hb(a.blockedOn);null!==a&&Di(a);break}var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:fa.shift()}null!==
+xa&&rc(xa)&&(xa=null);null!==ya&&rc(ya)&&(ya=null);null!==za&&rc(za)&&(za=null);Eb.forEach(Zf);Fb.forEach(Zf)}function Ib(a,b){a.blockedOn===b&&(a.blockedOn=null,Rd||(Rd=!0,$f(ag,Ci)))}function bg(a){if(0<fa.length){Ib(fa[0],a);for(var b=1;b<fa.length;b++){var c=fa[b];c.blockedOn===a&&(c.blockedOn=null)}}null!==xa&&Ib(xa,a);null!==ya&&Ib(ya,a);null!==za&&Ib(za,a);b=function(b){return Ib(b,a)};Eb.forEach(b);Fb.forEach(b);for(b=0;b<Jb.length;b++)c=Jb[b],c.blockedOn===a&&(c.blockedOn=null);for(;0<Jb.length&&
+(b=Jb[0],null===b.blockedOn);)Ai(b),null===b.blockedOn&&Jb.shift()}function Sd(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f="on"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+"Capture"},dependencies:[d],eventPriority:b};Td.set(d,b);cg.set(d,f);dg[e]=f}}function w(a,b){Cb(b,a,!1)}function Cb(a,b,c){var d=Td.get(b);switch(void 0===d?2:d){case 0:d=Ei.bind(null,b,1,a);break;case 1:d=Fi.bind(null,b,1,a);break;default:d=sc.bind(null,b,1,a)}c?a.addEventListener(b,
+d,!0):a.addEventListener(b,d,!1)}function Ei(a,b,c,d){Oa||vd();var e=sc,f=Oa;Oa=!0;try{eg(e,a,b,c,d)}finally{(Oa=f)||ud()}}function Fi(a,b,c,d){Gi(Hi,sc.bind(null,a,b,c,d))}function sc(a,b,c,d){if(tc)if(0<fa.length&&-1<Nd.indexOf(a))a=Od(null,a,b,c,d),fa.push(a);else{var e=Qd(a,b,c,d);if(null===e)Xf(a,d);else if(-1<Nd.indexOf(a))a=Od(e,a,b,c,d),fa.push(a);else if(!zi(e,a,b,c,d)){Xf(a,d);a=Vf(a,d,null,b);try{uf(Wf,a)}finally{Uf(a)}}}}function Qd(a,b,c,d){c=Ld(d);c=Bb(c);if(null!==c){var e=Na(c);if(null===
+e)c=null;else{var f=e.tag;if(13===f){c=Qf(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=Vf(a,d,c,b);try{uf(Wf,a)}finally{Uf(a)}return null}function fg(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||Kb.hasOwnProperty(a)&&Kb[a]?(""+b).trim():b+"px"}function gg(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=fg(c,b[c],d);"float"===
+c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}function Ud(a,b){if(b){if(Ii[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(k(137,a,""));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(k(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(k(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(k(62,""));}}function Vd(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;
+default:return!0}}function oa(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Jd(a);b=rd[b];for(var d=0;d<b.length;d++)Md(b[d],a,c)}function uc(){}function Wd(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function hg(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function ig(a,b){var c=hg(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,
+offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=hg(c)}}function jg(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?jg(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function kg(){for(var a=window,b=Wd();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Wd(a.document)}return b}
+function Xd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}function lg(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}function Yd(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&
+null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function kb(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function mg(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ng||c===Zd||c===$d){if(0===b)return a;b--}else c===og&&b++}a=a.previousSibling}return null}function Bb(a){var b=a[Aa];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Lb]||c[Aa]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=mg(a);null!==
+a;){if(c=a[Aa])return c;a=mg(a)}return b}a=c;c=a.parentNode}return null}function Hb(a){a=a[Aa]||a[Lb];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pa(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(k(33));}function ae(a){return a[vc]||null}function pa(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function pg(a,b){var c=a.stateNode;if(!c)return null;var d=td(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":case "onMouseEnter":(d=
+!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw Error(k(231,b,typeof c));return c}function qg(a,b,c){if(b=pg(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a)}function Ji(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=pa(b);for(b=c.length;0<b--;)qg(c[b],
+"captured",a);for(b=0;b<c.length;b++)qg(c[b],"bubbled",a)}}function be(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=pg(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a))}function Ki(a){a&&a.dispatchConfig.registrationName&&be(a._targetInst,null,a)}function lb(a){Kd(a,Ji)}function rg(){if(wc)return wc;var a,b=ce,c=b.length,d,e="value"in Ba?Ba.value:Ba.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=
+c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return wc=e.slice(a,1<d?1-d:void 0)}function xc(){return!0}function yc(){return!1}function R(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?xc:yc;this.isPropagationStopped=yc;return this}function Li(a,b,c,d){if(this.eventPool.length){var e=
+this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function Mi(a){if(!(a instanceof this))throw Error(k(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function sg(a){a.eventPool=[];a.getPooled=Li;a.release=Mi}function tg(a,b){switch(a){case "keyup":return-1!==Ni.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function ug(a){a=a.detail;return"object"===typeof a&&"data"in
+a?a.data:null}function Oi(a,b){switch(a){case "compositionend":return ug(b);case "keypress":if(32!==b.which)return null;vg=!0;return wg;case "textInput":return a=b.data,a===wg&&vg?null:a;default:return null}}function Pi(a,b){if(mb)return"compositionend"===a||!de&&tg(a,b)?(a=rg(),wc=ce=Ba=null,mb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;
+case "compositionend":return xg&&"ko"!==b.locale?null:b.data;default:return null}}function yg(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!Qi[a.type]:"textarea"===b?!0:!1}function zg(a,b,c){a=R.getPooled(Ag.change,a,b,c);a.type="change";sf(c);lb(a);return a}function Ri(a){pc(a)}function zc(a){var b=Pa(a);if(Gf(b))return a}function Si(a,b){if("change"===a)return b}function Bg(){Mb&&(Mb.detachEvent("onpropertychange",Cg),Nb=Mb=null)}function Cg(a){if("value"===a.propertyName&&
+zc(Nb))if(a=zg(Nb,a,Ld(a)),Oa)pc(a);else{Oa=!0;try{ee(Ri,a)}finally{Oa=!1,ud()}}}function Ti(a,b,c){"focus"===a?(Bg(),Mb=b,Nb=c,Mb.attachEvent("onpropertychange",Cg)):"blur"===a&&Bg()}function Ui(a,b){if("selectionchange"===a||"keyup"===a||"keydown"===a)return zc(Nb)}function Vi(a,b){if("click"===a)return zc(b)}function Wi(a,b){if("input"===a||"change"===a)return zc(b)}function Xi(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Yi[a])?!!b[a]:!1}function fe(a){return Xi}
+function Zi(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}function Ob(a,b){if(Qa(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!$i.call(b,c[d])||!Qa(a[c[d]],b[c[d]]))return!1;return!0}function Dg(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(ge||null==nb||nb!==Wd(c))return null;c=nb;"selectionStart"in c&&Xd(c)?c={start:c.selectionStart,
+end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Pb&&Ob(Pb,c)?null:(Pb=c,a=R.getPooled(Eg.select,he,a,b),a.type="select",a.target=nb,lb(a),a)}function Ac(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function q(a,b){0>ob||(a.current=ie[ob],ie[ob]=null,ob--)}function y(a,b,c){ob++;
+ie[ob]=a.current;a.current=b}function pb(a,b){var c=a.type.contextTypes;if(!c)return Ca;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function N(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Fg(a,b,c){if(B.current!==Ca)throw Error(k(168));y(B,b);y(G,c)}
+function Gg(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(k(108,na(b)||"Unknown",e));return M({},c,{},d)}function Bc(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Ca;Ra=B.current;y(B,a);y(G,G.current);return!0}function Hg(a,b,c){var d=a.stateNode;if(!d)throw Error(k(169));c?(a=Gg(a,b,Ra),d.__reactInternalMemoizedMergedChildContext=a,q(G),q(B),y(B,a)):q(G);y(G,c)}function Cc(){switch(aj()){case Dc:return 99;
+case Ig:return 98;case Jg:return 97;case Kg:return 96;case Lg:return 95;default:throw Error(k(332));}}function Mg(a){switch(a){case 99:return Dc;case 98:return Ig;case 97:return Jg;case 96:return Kg;case 95:return Lg;default:throw Error(k(332));}}function Da(a,b){a=Mg(a);return bj(a,b)}function Ng(a,b,c){a=Mg(a);return je(a,b,c)}function Og(a){null===qa?(qa=[a],Ec=je(Dc,Pg)):qa.push(a);return Qg}function ha(){if(null!==Ec){var a=Ec;Ec=null;Rg(a)}Pg()}function Pg(){if(!ke&&null!==qa){ke=!0;var a=0;
+try{var b=qa;Da(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});qa=null}catch(c){throw null!==qa&&(qa=qa.slice(a+1)),je(Dc,ha),c;}finally{ke=!1}}}function Fc(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function aa(a,b){if(a&&a.defaultProps){b=M({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}function le(){Gc=qb=Hc=null}function me(a){var b=Ic.current;q(Ic);a.type._context._currentValue=b}function Sg(a,b){for(;null!==a;){var c=
+a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function rb(a,b){Hc=a;Gc=qb=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(ia=!0),a.firstContext=null)}function W(a,b){if(Gc!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)Gc=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===qb){if(null===
+Hc)throw Error(k(308));qb=b;Hc.dependencies={expirationTime:0,firstContext:b,responders:null}}else qb=qb.next=b}return a._currentValue}function ne(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}function oe(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function Ea(a,b){a={expirationTime:a,suspenseConfig:b,tag:Tg,payload:null,callback:null,next:null};return a.next=
+a}function Fa(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}function Ug(a,b){var c=a.alternate;null!==c&&oe(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}function Qb(a,b,c,d){var e=a.updateQueue;Ga=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&&
+(h.baseQueue=g))}if(null!==f){h=f.next;var m=e.baseState,n=0,k=null,ba=null,l=null;if(null!==h){var p=h;do{g=p.expirationTime;if(g<d){var t={expirationTime:p.expirationTime,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null};null===l?(ba=l=t,k=m):l=l.next=t;g>n&&(n=g)}else{null!==l&&(l=l.next={expirationTime:1073741823,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null});Vg(g,p.suspenseConfig);a:{var q=a,r=p;g=b;t=c;switch(r.tag){case 1:q=
+r.payload;if("function"===typeof q){m=q.call(t,m,g);break a}m=q;break a;case 3:q.effectTag=q.effectTag&-4097|64;case Tg:q=r.payload;g="function"===typeof q?q.call(t,m,g):q;if(null===g||void 0===g)break a;m=M({},m,g);break a;case Jc:Ga=!0}}null!==p.callback&&(a.effectTag|=32,g=e.effects,null===g?e.effects=[p]:g.push(p))}p=p.next;if(null===p||p===h)if(g=e.shared.pending,null===g)break;else p=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===l?k=m:l.next=ba;e.baseState=k;e.baseQueue=
+l;Kc(n);a.expirationTime=n;a.memoizedState=m}}function Wg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if("function"!==typeof d)throw Error(k(191,d));d.call(e)}}}function Lc(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:M({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}function Xg(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,
+f,g):b.prototype&&b.prototype.isPureReactComponent?!Ob(c,d)||!Ob(e,f):!0}function Yg(a,b,c){var d=!1,e=Ca;var f=b.contextType;"object"===typeof f&&null!==f?f=W(f):(e=N(b)?Ra:B.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?pb(a,e):Ca);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Mc;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}function Zg(a,
+b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Mc.enqueueReplaceState(b,b.state,null)}function pe(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=$g;ne(a);var f=b.contextType;"object"===typeof f&&null!==f?e.context=W(f):(f=N(b)?Ra:B.current,e.context=pb(a,f));Qb(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;
+"function"===typeof f&&(Lc(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Mc.enqueueReplaceState(e,e.state,null),Qb(a,c,e,d),e.state=a.memoizedState);"function"===
+typeof e.componentDidMount&&(a.effectTag|=4)}function Rb(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(k(309));var d=c.stateNode}if(!d)throw Error(k(147,a));var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===$g&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if("string"!==typeof a)throw Error(k(284));if(!c._owner)throw Error(k(290,
+a));}return a}function Nc(a,b){if("textarea"!==a.type)throw Error(k(31,"[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,""));}function ah(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,
+b),b=b.sibling;return a}function e(a,b){a=Sa(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=qe(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function m(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Rb(a,b,c),d.return=a,d;d=Oc(c.type,
+c.key,c.props,null,a.mode,d);d.ref=Rb(a,b,c);d.return=a;return d}function n(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=re(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function l(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ha(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function ba(a,b,c){if("string"===typeof b||"number"===typeof b)return b=qe(""+b,a.mode,c),b.return=a,b;if("object"===
+typeof b&&null!==b){switch(b.$$typeof){case Pc:return c=Oc(b.type,b.key,b.props,null,a.mode,c),c.ref=Rb(a,null,b),c.return=a,c;case gb:return b=re(b,a.mode,c),b.return=a,b}if(Qc(b)||zb(b))return b=Ha(b,a.mode,c,null),b.return=a,b;Nc(a,b)}return null}function p(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case Pc:return c.key===e?c.type===Ma?l(a,b,c.props.children,d,e):m(a,b,c,
+d):null;case gb:return c.key===e?n(a,b,c,d):null}if(Qc(c)||zb(c))return null!==e?null:l(a,b,c,d,null);Nc(a,c)}return null}function t(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case Pc:return a=a.get(null===d.key?c:d.key)||null,d.type===Ma?l(b,a,d.props.children,e,d.key):m(b,a,d,e);case gb:return a=a.get(null===d.key?c:d.key)||null,n(b,a,d,e)}if(Qc(d)||zb(d))return a=a.get(c)||null,l(b,a,d,e,null);
+Nc(b,d)}return null}function q(e,g,h,m){for(var n=null,k=null,l=g,r=g=0,C=null;null!==l&&r<h.length;r++){l.index>r?(C=l,l=null):C=l.sibling;var O=p(e,l,h[r],m);if(null===O){null===l&&(l=C);break}a&&l&&null===O.alternate&&b(e,l);g=f(O,g,r);null===k?n=O:k.sibling=O;k=O;l=C}if(r===h.length)return c(e,l),n;if(null===l){for(;r<h.length;r++)l=ba(e,h[r],m),null!==l&&(g=f(l,g,r),null===k?n=l:k.sibling=l,k=l);return n}for(l=d(e,l);r<h.length;r++)C=t(l,e,r,h[r],m),null!==C&&(a&&null!==C.alternate&&l.delete(null===
+C.key?r:C.key),g=f(C,g,r),null===k?n=C:k.sibling=C,k=C);a&&l.forEach(function(a){return b(e,a)});return n}function w(e,g,h,n){var m=zb(h);if("function"!==typeof m)throw Error(k(150));h=m.call(h);if(null==h)throw Error(k(151));for(var l=m=null,r=g,C=g=0,O=null,v=h.next();null!==r&&!v.done;C++,v=h.next()){r.index>C?(O=r,r=null):O=r.sibling;var q=p(e,r,v.value,n);if(null===q){null===r&&(r=O);break}a&&r&&null===q.alternate&&b(e,r);g=f(q,g,C);null===l?m=q:l.sibling=q;l=q;r=O}if(v.done)return c(e,r),m;
+if(null===r){for(;!v.done;C++,v=h.next())v=ba(e,v.value,n),null!==v&&(g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);return m}for(r=d(e,r);!v.done;C++,v=h.next())v=t(r,e,C,v.value,n),null!==v&&(a&&null!==v.alternate&&r.delete(null===v.key?C:v.key),g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);a&&r.forEach(function(a){return b(e,a)});return m}return function(a,d,f,h){var m="object"===typeof f&&null!==f&&f.type===Ma&&null===f.key;m&&(f=f.props.children);var n="object"===typeof f&&null!==f;if(n)switch(f.$$typeof){case Pc:a:{n=
+f.key;for(m=d;null!==m;){if(m.key===n){switch(m.tag){case 7:if(f.type===Ma){c(a,m.sibling);d=e(m,f.props.children);d.return=a;a=d;break a}break;default:if(m.elementType===f.type){c(a,m.sibling);d=e(m,f.props);d.ref=Rb(a,m,f);d.return=a;a=d;break a}}c(a,m);break}else b(a,m);m=m.sibling}f.type===Ma?(d=Ha(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Oc(f.type,f.key,f.props,null,a.mode,h),h.ref=Rb(a,d,f),h.return=a,a=h)}return g(a);case gb:a:{for(m=f.key;null!==d;){if(d.key===m)if(4===d.tag&&d.stateNode.containerInfo===
+f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=re(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=qe(f,a.mode,h),d.return=a,a=d),g(a);if(Qc(f))return q(a,d,f,h);if(zb(f))return w(a,d,f,h);n&&Nc(a,f);if("undefined"===typeof f&&!m)switch(a.tag){case 1:case 0:throw a=
+a.type,Error(k(152,a.displayName||a.name||"Component"));}return c(a,d)}}function Ta(a){if(a===Sb)throw Error(k(174));return a}function se(a,b){y(Tb,b);y(Ub,a);y(ja,Sb);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Hd(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Hd(b,a)}q(ja);y(ja,b)}function tb(a){q(ja);q(Ub);q(Tb)}function bh(a){Ta(Tb.current);var b=Ta(ja.current);var c=Hd(b,a.type);b!==c&&(y(Ub,a),y(ja,c))}function te(a){Ub.current===
+a&&(q(ja),q(Ub))}function Rc(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===$d||c.data===Zd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ue(a,b){return{responder:a,props:b}}
+function S(){throw Error(k(321));}function ve(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!Qa(a[c],b[c]))return!1;return!0}function we(a,b,c,d,e,f){Ia=f;z=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;Sc.current=null===a||null===a.memoizedState?dj:ej;a=c(d,e);if(b.expirationTime===Ia){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(k(301));f+=1;J=K=null;b.updateQueue=null;Sc.current=fj;a=c(d,e)}while(b.expirationTime===Ia)}Sc.current=Tc;b=null!==K&&null!==K.next;
+Ia=0;J=K=z=null;Uc=!1;if(b)throw Error(k(300));return a}function ub(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===J?z.memoizedState=J=a:J=J.next=a;return J}function vb(){if(null===K){var a=z.alternate;a=null!==a?a.memoizedState:null}else a=K.next;var b=null===J?z.memoizedState:J.next;if(null!==b)J=b,K=a;else{if(null===a)throw Error(k(310));K=a;a={memoizedState:K.memoizedState,baseState:K.baseState,baseQueue:K.baseQueue,queue:K.queue,next:null};null===J?z.memoizedState=
+J=a:J=J.next=a}return J}function Ua(a,b){return"function"===typeof b?b(a):b}function Vc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=K,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,m=e;do{var n=m.expirationTime;if(n<Ia){var l={expirationTime:m.expirationTime,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState,
+next:null};null===h?(g=h=l,f=d):h=h.next=l;n>z.expirationTime&&(z.expirationTime=n,Kc(n))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState,next:null}),Vg(n,m.suspenseConfig),d=m.eagerReducer===a?m.eagerState:a(d,m.action);m=m.next}while(null!==m&&m!==e);null===h?f=d:h.next=g;Qa(d,b.memoizedState)||(ia=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,
+c.dispatch]}function Wc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);Qa(f,b.memoizedState)||(ia=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function xe(a){var b=ub();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:Ua,
+lastRenderedState:a};a=a.dispatch=ch.bind(null,z,a);return[b.memoizedState,a]}function ye(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=z.updateQueue;null===b?(b={lastEffect:null},z.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function dh(a){return vb().memoizedState}function ze(a,b,c,d){var e=ub();z.effectTag|=a;e.memoizedState=ye(1|b,c,void 0,void 0===d?null:d)}function Ae(a,b,c,d){var e=vb();
+d=void 0===d?null:d;var f=void 0;if(null!==K){var g=K.memoizedState;f=g.destroy;if(null!==d&&ve(d,g.deps)){ye(b,c,f,d);return}}z.effectTag|=a;e.memoizedState=ye(1|b,c,f,d)}function eh(a,b){return ze(516,4,a,b)}function Xc(a,b){return Ae(516,4,a,b)}function fh(a,b){return Ae(4,2,a,b)}function gh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function hh(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;
+return Ae(4,2,gh.bind(null,b,a),c)}function Be(a,b){}function ih(a,b){ub().memoizedState=[a,void 0===b?null:b];return a}function Yc(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function jh(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Ce(a,b,c){var d=Cc();Da(98>d?98:d,function(){a(!0)});Da(97<d?97:d,function(){var d=
+X.suspense;X.suspense=void 0===b?null:b;try{a(!1),c()}finally{X.suspense=d}})}function ch(a,b,c){var d=ka(),e=Vb.suspense;d=Va(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===z||null!==f&&f===z)Uc=!0,e.expirationTime=Ia,z.expirationTime=Ia;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,
+h=f(g,c);e.eagerReducer=f;e.eagerState=h;if(Qa(h,g))return}catch(m){}finally{}Ja(a,d)}}function kh(a,b){var c=la(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function lh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?
+null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}function De(a){if(Wa){var b=Ka;if(b){var c=b;if(!lh(a,b)){b=kb(c.nextSibling);if(!b||!lh(a,b)){a.effectTag=a.effectTag&-1025|2;Wa=!1;ra=a;return}kh(ra,c)}ra=a;Ka=kb(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Wa=!1,ra=a}}function mh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;ra=a}function Zc(a){if(a!==ra)return!1;if(!Wa)return mh(a),Wa=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==
+b&&!Yd(b,a.memoizedProps))for(b=Ka;b;)kh(a,b),b=kb(b.nextSibling);mh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(k(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===og){if(0===b){Ka=kb(a.nextSibling);break a}b--}else c!==ng&&c!==Zd&&c!==$d||b++}a=a.nextSibling}Ka=null}}else Ka=ra?kb(a.stateNode.nextSibling):null;return!0}function Ee(){Ka=ra=null;Wa=!1}function T(a,b,c,d){b.child=null===a?Fe(b,null,c,d):wb(b,a.child,c,d)}function nh(a,
+b,c,d,e){c=c.render;var f=b.ref;rb(b,e);d=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,d,e);return b.child}function oh(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!Ge(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ph(a,b,g,d,e,f);a=Oc(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<
+f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Ob,c(e,d)&&a.ref===b.ref))return sa(a,b,f);b.effectTag|=1;a=Sa(g,d);a.ref=b.ref;a.return=b;return b.child=a}function ph(a,b,c,d,e,f){return null!==a&&Ob(a.memoizedProps,d)&&a.ref===b.ref&&(ia=!1,e<f)?(b.expirationTime=a.expirationTime,sa(a,b,f)):He(a,b,c,d,f)}function qh(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function He(a,b,c,d,e){var f=N(c)?Ra:B.current;f=pb(b,f);rb(b,e);c=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue=
+a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,c,e);return b.child}function rh(a,b,c,d,e){if(N(c)){var f=!0;Bc(b)}else f=!1;rb(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Yg(b,c,d),pe(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var m=g.context,n=c.contextType;"object"===typeof n&&null!==n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n));var l=c.getDerivedStateFromProps,k="function"===
+typeof l||"function"===typeof g.getSnapshotBeforeUpdate;k||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n);Ga=!1;var p=b.memoizedState;g.state=p;Qb(b,d,g,e);m=b.memoizedState;h!==d||p!==m||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),m=b.memoizedState),(h=Ga||Xg(b,c,h,d,p,m,n))?(k||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&
+g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===typeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=m),g.props=d,g.state=m,g.context=n,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,oe(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:aa(b.type,h),m=g.context,n=c.contextType,"object"===typeof n&&null!==
+n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n)),l=c.getDerivedStateFromProps,(k="function"===typeof l||"function"===typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n),Ga=!1,m=b.memoizedState,g.state=m,Qb(b,d,g,e),p=b.memoizedState,h!==d||m!==p||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),p=b.memoizedState),(l=Ga||Xg(b,c,h,d,m,p,n))?(k||"function"!==typeof g.UNSAFE_componentWillUpdate&&
+"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,p,n),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,p,n)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===
+a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=p),g.props=d,g.state=p,g.context=n,d=l):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),d=!1);return Ie(a,b,c,d,f,e)}function Ie(a,b,c,d,e,f){qh(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hg(b,c,!1),sa(a,b,f);d=b.stateNode;gj.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?
+null:d.render();b.effectTag|=1;null!==a&&g?(b.child=wb(b,a.child,null,f),b.child=wb(b,null,h,f)):T(a,b,h,f);b.memoizedState=d.state;e&&Hg(b,c,!0);return b.child}function sh(a){var b=a.stateNode;b.pendingContext?Fg(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Fg(a,b.context,!1);se(a,b.containerInfo)}function th(a,b,c){var d=b.mode,e=b.pendingProps,f=D.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===
+a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);y(D,f&1);if(null===a){void 0!==e.fallback&&De(b);if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=Je;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Fe(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;
+c=Sa(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sa(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=Je;b.child=c;return d}c=wb(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==
+a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=Je;b.child=e;return c}b.memoizedState=null;return b.child=wb(b,a,e.children,c)}function uh(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);Sg(a.return,b)}function Ke(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e,
+lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}function vh(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;T(a,b,d.children,c);d=D.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&uh(a,c);else if(19===a.tag)uh(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===
+a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}y(D,d);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Rc(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Ke(b,!1,e,c,f,b.lastEffect);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Rc(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Ke(b,
+!0,c,null,f,b.lastEffect);break;case "together":Ke(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}function sa(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Kc(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(k(153));if(null!==b.child){a=b.child;c=Sa(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sa(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}
+function $c(a,b){switch(a.tailMode){case "hidden":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}function hj(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return N(b.type)&&(q(G),q(B)),
+null;case 3:return tb(),q(G),q(B),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Zc(b)||(b.effectTag|=4),wh(b),null;case 5:te(b);c=Ta(Tb.current);var e=b.type;if(null!==a&&null!=b.stateNode)ij(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(k(166));return null}a=Ta(ja.current);if(Zc(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Aa]=b;d[vc]=f;switch(e){case "iframe":case "object":case "embed":w("load",
+d);break;case "video":case "audio":for(a=0;a<Db.length;a++)w(Db[a],d);break;case "source":w("error",d);break;case "img":case "image":case "link":w("error",d);w("load",d);break;case "form":w("reset",d);w("submit",d);break;case "details":w("toggle",d);break;case "input":Hf(d,f);w("invalid",d);oa(c,"onChange");break;case "select":d._wrapperState={wasMultiple:!!f.multiple};w("invalid",d);oa(c,"onChange");break;case "textarea":Kf(d,f),w("invalid",d),oa(c,"onChange")}Ud(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h=
+f[g];"children"===g?"string"===typeof h?d.textContent!==h&&(a=["children",h]):"number"===typeof h&&d.textContent!==""+h&&(a=["children",""+h]):db.hasOwnProperty(g)&&null!=h&&oa(c,g)}switch(e){case "input":mc(d);Jf(d,f,!0);break;case "textarea":mc(d);Mf(d);break;case "select":case "option":break;default:"function"===typeof f.onClick&&(d.onclick=uc)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;"http://www.w3.org/1999/xhtml"===a&&(a=Nf(e));"http://www.w3.org/1999/xhtml"===
+a?"script"===e?(a=g.createElement("div"),a.innerHTML="<script>\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),"select"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Aa]=b;a[vc]=d;jj(a,b,!1,!1);b.stateNode=a;g=Vd(e,d);switch(e){case "iframe":case "object":case "embed":w("load",a);h=d;break;case "video":case "audio":for(h=0;h<Db.length;h++)w(Db[h],a);h=d;break;case "source":w("error",a);
+h=d;break;case "img":case "image":case "link":w("error",a);w("load",a);h=d;break;case "form":w("reset",a);w("submit",a);h=d;break;case "details":w("toggle",a);h=d;break;case "input":Hf(a,d);h=Cd(a,d);w("invalid",a);oa(c,"onChange");break;case "option":h=Fd(a,d);break;case "select":a._wrapperState={wasMultiple:!!d.multiple};h=M({},d,{value:void 0});w("invalid",a);oa(c,"onChange");break;case "textarea":Kf(a,d);h=Gd(a,d);w("invalid",a);oa(c,"onChange");break;default:h=d}Ud(e,h);var m=h;for(f in m)if(m.hasOwnProperty(f)){var n=
+m[f];"style"===f?gg(a,n):"dangerouslySetInnerHTML"===f?(n=n?n.__html:void 0,null!=n&&xh(a,n)):"children"===f?"string"===typeof n?("textarea"!==e||""!==n)&&Wb(a,n):"number"===typeof n&&Wb(a,""+n):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&(db.hasOwnProperty(f)?null!=n&&oa(c,f):null!=n&&xd(a,f,n,g))}switch(e){case "input":mc(a);Jf(a,d,!1);break;case "textarea":mc(a);Mf(a);break;case "option":null!=d.value&&a.setAttribute("value",""+va(d.value));break;case "select":a.multiple=
+!!d.multiple;c=d.value;null!=c?hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&hb(a,!!d.multiple,d.defaultValue,!0);break;default:"function"===typeof h.onClick&&(a.onclick=uc)}lg(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)kj(a,b,a.memoizedProps,d);else{if("string"!==typeof d&&null===b.stateNode)throw Error(k(166));c=Ta(Tb.current);Ta(ja.current);Zc(b)?(c=b.stateNode,d=b.memoizedProps,c[Aa]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType?
+c:c.ownerDocument).createTextNode(d),c[Aa]=b,b.stateNode=c)}return null;case 13:q(D);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Zc(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=e,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||
+0!==(D.current&1))F===Xa&&(F=ad);else{if(F===Xa||F===ad)F=bd;0!==Xb&&null!==U&&(Ya(U,P),yh(U,Xb))}if(c||d)b.effectTag|=4;return null;case 4:return tb(),wh(b),null;case 10:return me(b),null;case 17:return N(b.type)&&(q(G),q(B)),null;case 19:q(D);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)$c(d,!1);else{if(F!==Xa||null!==a&&0!==(a.effectTag&64))for(f=b.child;null!==f;){a=Rc(f);if(null!==a){b.effectTag|=64;$c(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue=
+e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,e.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,
+e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;y(D,D.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=Rc(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),$c(d,!0),null===d.tail&&"hidden"===d.tailMode&&!f.alternate)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*Y()-d.renderingStartTime>d.tailExpiration&&
+1<c&&(b.effectTag|=64,e=!0,$c(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=Y()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=Y(),c.sibling=null,b=D.current,y(D,e?b&1|2:b&1),c):null}throw Error(k(156,b.tag));}function lj(a,b){switch(a.tag){case 1:return N(a.type)&&(q(G),q(B)),b=a.effectTag,b&4096?
+(a.effectTag=b&-4097|64,a):null;case 3:tb();q(G);q(B);b=a.effectTag;if(0!==(b&64))throw Error(k(285));a.effectTag=b&-4097|64;return a;case 5:return te(a),null;case 13:return q(D),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return q(D),null;case 4:return tb(),null;case 10:return me(a),null;default:return null}}function Le(a,b){return{value:a,source:b,stack:Bd(b)}}function Me(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Bd(c));null!==c&&na(c.type);b=b.value;null!==a&&1===a.tag&&
+na(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function mj(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Za(a,c)}}function zh(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Za(a,c)}else b.current=null}function nj(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===
+b.type?c:aa(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(k(163));}function Ah(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Bh(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function oj(a,b,c,d){switch(c.tag){case 0:case 11:case 15:case 22:Bh(3,
+c);return;case 1:a=c.stateNode;c.effectTag&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:aa(c.type,b.memoizedProps),a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Wg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Wg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.effectTag&4&&lg(c.type,c.memoizedProps)&&
+a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&bg(c))));return;case 19:case 17:case 20:case 21:return}throw Error(k(163));}function Ch(a,b,c){"function"===typeof Ne&&Ne(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;Da(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Za(g,
+h)}}a=a.next}while(a!==d)})}break;case 1:zh(b);c=b.stateNode;"function"===typeof c.componentWillUnmount&&mj(b,c);break;case 5:zh(b);break;case 4:Dh(a,b,c)}}function Eh(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Eh(b)}function Fh(a){return 5===a.tag||3===a.tag||4===a.tag}function Gh(a){a:{for(var b=a.return;null!==
+b;){if(Fh(b)){var c=b;break a}b=b.return}throw Error(k(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(k(161));}c.effectTag&16&&(Wb(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Fh(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b;
+else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Oe(a,c,b):Pe(a,c,b)}function Oe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=uc));else if(4!==d&&(a=a.child,null!==a))for(Oe(a,b,c),a=a.sibling;null!==a;)Oe(a,b,c),a=a.sibling}
+function Pe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Pe(a,b,c),a=a.sibling;null!==a;)Pe(a,b,c),a=a.sibling}function Dh(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(k(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=
+a,m=d,n=c,l=m;;)if(Ch(h,l,n),null!==l.child&&4!==l.tag)l.child.return=l,l=l.child;else{if(l===m)break a;for(;null===l.sibling;){if(null===l.return||l.return===m)break a;l=l.return}l.sibling.return=l.return;l=l.sibling}g?(h=f,m=d.stateNode,8===h.nodeType?h.parentNode.removeChild(m):h.removeChild(m)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ch(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===
+b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}function Qe(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Ah(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[vc]=d;"input"===a&&"radio"===d.type&&null!=d.name&&If(c,d);Vd(a,e);b=Vd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],
+h=f[e+1];"style"===g?gg(c,h):"dangerouslySetInnerHTML"===g?xh(c,h):"children"===g?Wb(c,h):xd(c,g,h,b)}switch(a){case "input":Dd(c,d);break;case "textarea":Lf(c,d);break;case "select":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?hb(c,!!d.multiple,d.defaultValue,!0):hb(c,!!d.multiple,d.multiple?[]:"",!1))}}}return;case 6:if(null===b.stateNode)throw Error(k(162));b.stateNode.nodeValue=b.memoizedProps;
+return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,bg(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Re=Y());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null,f.style.display=fg("display",e));else if(6===a.tag)a.stateNode.nodeValue=d?
+"":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Hh(b);return;case 19:Hh(b);return;case 17:return}throw Error(k(163));}function Hh(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=
+new pj);b.forEach(function(b){var d=qj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}function Ih(a,b,c){c=Ea(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){cd||(cd=!0,Se=d);Me(a,b)};return c}function Jh(a,b,c){c=Ea(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Me(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&
+(null===La?La=new Set([this]):La.add(this),Me(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}function ka(){return(p&(ca|ma))!==H?1073741821-(Y()/10|0):0!==dd?dd:dd=1073741821-(Y()/10|0)}function Va(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=Cc();if(0===(b&4))return 99===d?1073741823:1073741822;if((p&ca)!==H)return P;if(null!==c)a=Fc(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=Fc(a,150,100);break;case 97:case 96:a=
+Fc(a,5E3,250);break;case 95:a=2;break;default:throw Error(k(326));}null!==U&&a===P&&--a;return a}function ed(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&
+(U===e&&(Kc(b),F===bd&&Ya(e,P)),yh(e,b));return e}function fd(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Kh(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}function V(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=Og(Te.bind(null,a));else{var b=fd(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=ka();
+1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Qg&&Rg(c)}a.callbackExpirationTime=b;a.callbackPriority=d;b=1073741823===b?Og(Te.bind(null,a)):Ng(d,Lh.bind(null,a),{timeout:10*(1073741821-b)-Y()});a.callbackNode=b}}}function Lh(a,b){dd=0;if(b)return b=ka(),Ue(a,b),V(a),null;var c=fd(a);if(0!==c){b=a.callbackNode;if((p&(ca|ma))!==H)throw Error(k(327));
+xb();a===U&&c===P||$a(a,c);if(null!==t){var d=p;p|=ca;var e=Mh();do try{rj();break}catch(h){Nh(a,h)}while(1);le();p=d;gd.current=e;if(F===hd)throw b=id,$a(a,c),Ya(a,c),V(a),b;if(null===t)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=F,U=null,d){case Xa:case hd:throw Error(k(345));case Oh:Ue(a,2<c?2:c);break;case ad:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(1073741823===ta&&(e=Re+Ph-Y(),10<e)){if(jd){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=
+c;$a(a,c);break}}f=fd(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=We(ab.bind(null,a),e);break}ab(a);break;case bd:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(jd&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;$a(a,c);break}e=fd(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}1073741823!==Yb?d=10*(1073741821-Yb)-Y():1073741823===ta?d=0:(d=10*(1073741821-ta)-5E3,e=Y(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=
+(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*sj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=We(ab.bind(null,a),d);break}ab(a);break;case Xe:if(1073741823!==ta&&null!==kd){f=ta;var g=kd;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Y()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Ya(a,c);a.timeoutHandle=We(ab.bind(null,a),d);break}}ab(a);break;default:throw Error(k(329));}V(a);if(a.callbackNode===b)return Lh.bind(null,a)}}return null}function Te(a){var b=
+a.lastExpiredTime;b=0!==b?b:1073741823;if((p&(ca|ma))!==H)throw Error(k(327));xb();a===U&&b===P||$a(a,b);if(null!==t){var c=p;p|=ca;var d=Mh();do try{tj();break}catch(e){Nh(a,e)}while(1);le();p=c;gd.current=d;if(F===hd)throw c=id,$a(a,b),Ya(a,b),V(a),c;if(null!==t)throw Error(k(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;U=null;ab(a);V(a)}return null}function uj(){if(null!==bb){var a=bb;bb=null;a.forEach(function(a,c){Ue(c,a);V(c)});ha()}}function Qh(a,b){var c=p;p|=1;try{return a(b)}finally{p=
+c,p===H&&ha()}}function Rh(a,b){var c=p;p&=-2;p|=Ye;try{return a(b)}finally{p=c,p===H&&ha()}}function $a(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,vj(c));if(null!==t)for(c=t.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&(q(G),q(B));break;case 3:tb();q(G);q(B);break;case 5:te(d);break;case 4:tb();break;case 13:q(D);break;case 19:q(D);break;case 10:me(d)}c=c.return}U=a;t=Sa(a.current,null);
+P=b;F=Xa;id=null;Yb=ta=1073741823;kd=null;Xb=0;jd=!1}function Nh(a,b){do{try{le();Sc.current=Tc;if(Uc)for(var c=z.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}Ia=0;J=K=z=null;Uc=!1;if(null===t||null===t.return)return F=hd,id=b,t=null;a:{var e=a,f=t.return,g=t,h=b;b=P;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&"object"===typeof h&&"function"===typeof h.then){var m=h;if(0===(g.mode&2)){var n=g.alternate;n?(g.updateQueue=n.updateQueue,g.memoizedState=
+n.memoizedState,g.expirationTime=n.expirationTime):(g.updateQueue=null,g.memoizedState=null)}var l=0!==(D.current&1),k=f;do{var p;if(p=13===k.tag){var q=k.memoizedState;if(null!==q)p=null!==q.dehydrated?!0:!1;else{var w=k.memoizedProps;p=void 0===w.fallback?!1:!0!==w.unstable_avoidThisFallback?!0:l?!1:!0}}if(p){var y=k.updateQueue;if(null===y){var r=new Set;r.add(m);k.updateQueue=r}else y.add(m);if(0===(k.mode&2)){k.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var O=
+Ea(1073741823,null);O.tag=Jc;Fa(g,O)}g.expirationTime=1073741823;break a}h=void 0;g=b;var v=e.pingCache;null===v?(v=e.pingCache=new wj,h=new Set,v.set(m,h)):(h=v.get(m),void 0===h&&(h=new Set,v.set(m,h)));if(!h.has(g)){h.add(g);var x=xj.bind(null,e,m,g);m.then(x,x)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);h=Error((na(g.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+
+Bd(g))}F!==Xe&&(F=Oh);h=Le(h,g);k=f;do{switch(k.tag){case 3:m=h;k.effectTag|=4096;k.expirationTime=b;var A=Ih(k,m,b);Ug(k,A);break a;case 1:m=h;var u=k.type,B=k.stateNode;if(0===(k.effectTag&64)&&("function"===typeof u.getDerivedStateFromError||null!==B&&"function"===typeof B.componentDidCatch&&(null===La||!La.has(B)))){k.effectTag|=4096;k.expirationTime=b;var H=Jh(k,m,b);Ug(k,H);break a}}k=k.return}while(null!==k)}t=Sh(t)}catch(cj){b=cj;continue}break}while(1)}function Mh(a){a=gd.current;gd.current=
+Tc;return null===a?Tc:a}function Vg(a,b){a<ta&&2<a&&(ta=a);null!==b&&a<Yb&&2<a&&(Yb=a,kd=b)}function Kc(a){a>Xb&&(Xb=a)}function tj(){for(;null!==t;)t=Th(t)}function rj(){for(;null!==t&&!yj();)t=Th(t)}function Th(a){var b=zj(a.alternate,a,P);a.memoizedProps=a.pendingProps;null===b&&(b=Sh(a));Uh.current=null;return b}function Sh(a){t=a;do{var b=t.alternate;a=t.return;if(0===(t.effectTag&2048)){b=hj(b,t,P);if(1===P||1!==t.childExpirationTime){for(var c=0,d=t.child;null!==d;){var e=d.expirationTime,
+f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}t.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=t.firstEffect),a.lastEffect=t.lastEffect),1<t.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=t:a.firstEffect=t,a.lastEffect=t))}else{b=lj(t);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=
+2048)}b=t.sibling;if(null!==b)return b;t=a}while(null!==t);F===Xa&&(F=Xe);return null}function Ve(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function ab(a){var b=Cc();Da(99,Aj.bind(null,a,b));return null}function Aj(a,b){do xb();while(null!==Zb);if((p&(ca|ma))!==H)throw Error(k(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(k(177));a.callbackNode=null;a.callbackExpirationTime=
+0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ve(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(t=U=null,P=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=p;p|=ma;Uh.current=null;Ze=tc;var g=kg();if(Xd(g)){if("selectionStart"in
+g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var m=h.getSelection&&h.getSelection();if(m&&0!==m.rangeCount){h=m.anchorNode;var n=m.anchorOffset,q=m.focusNode;m=m.focusOffset;try{h.nodeType,q.nodeType}catch(sb){h=null;break a}var ba=0,w=-1,y=-1,B=0,D=0,r=g,z=null;b:for(;;){for(var v;;){r!==h||0!==n&&3!==r.nodeType||(w=ba+n);r!==q||0!==m&&3!==r.nodeType||(y=ba+m);3===r.nodeType&&(ba+=r.nodeValue.length);if(null===(v=r.firstChild))break;z=r;
+r=v}for(;;){if(r===g)break b;z===h&&++B===n&&(w=ba);z===q&&++D===m&&(y=ba);if(null!==(v=r.nextSibling))break;r=z;z=r.parentNode}r=v}h=-1===w||-1===y?null:{start:w,end:y}}else h=null}h=h||{start:0,end:0}}else h=null;$e={activeElementDetached:null,focusedElem:g,selectionRange:h};tc=!1;l=e;do try{Bj()}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=e;do try{for(g=a,h=b;null!==l;){var x=l.effectTag;x&16&&Wb(l.stateNode,"");if(x&128){var A=l.alternate;if(null!==A){var u=
+A.ref;null!==u&&("function"===typeof u?u(null):u.current=null)}}switch(x&1038){case 2:Gh(l);l.effectTag&=-3;break;case 6:Gh(l);l.effectTag&=-3;Qe(l.alternate,l);break;case 1024:l.effectTag&=-1025;break;case 1028:l.effectTag&=-1025;Qe(l.alternate,l);break;case 4:Qe(l.alternate,l);break;case 8:n=l,Dh(g,n,h),Eh(n)}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);u=$e;A=kg();x=u.focusedElem;h=u.selectionRange;if(A!==x&&x&&x.ownerDocument&&jg(x.ownerDocument.documentElement,
+x)){null!==h&&Xd(x)&&(A=h.start,u=h.end,void 0===u&&(u=A),"selectionStart"in x?(x.selectionStart=A,x.selectionEnd=Math.min(u,x.value.length)):(u=(A=x.ownerDocument||document)&&A.defaultView||window,u.getSelection&&(u=u.getSelection(),n=x.textContent.length,g=Math.min(h.start,n),h=void 0===h.end?g:Math.min(h.end,n),!u.extend&&g>h&&(n=h,h=g,g=n),n=ig(x,g),q=ig(x,h),n&&q&&(1!==u.rangeCount||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==q.node||u.focusOffset!==q.offset)&&(A=A.createRange(),
+A.setStart(n.node,n.offset),u.removeAllRanges(),g>h?(u.addRange(A),u.extend(q.node,q.offset)):(A.setEnd(q.node,q.offset),u.addRange(A))))));A=[];for(u=x;u=u.parentNode;)1===u.nodeType&&A.push({element:u,left:u.scrollLeft,top:u.scrollTop});"function"===typeof x.focus&&x.focus();for(x=0;x<A.length;x++)u=A[x],u.element.scrollLeft=u.left,u.element.scrollTop=u.top}tc=!!Ze;$e=Ze=null;a.current=c;l=e;do try{for(x=a;null!==l;){var F=l.effectTag;F&36&&oj(x,l.alternate,l);if(F&128){A=void 0;var E=l.ref;if(null!==
+E){var G=l.stateNode;switch(l.tag){case 5:A=G;break;default:A=G}"function"===typeof E?E(A):E.current=A}}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=null;Cj();p=f}else a.current=c;if(ld)ld=!1,Zb=a,$b=b;else for(l=e;null!==l;)b=l.nextEffect,l.nextEffect=null,l=b;b=a.firstPendingTime;0===b&&(La=null);1073741823===b?a===af?ac++:(ac=0,af=a):ac=0;"function"===typeof bf&&bf(c.stateNode,d);V(a);if(cd)throw cd=!1,a=Se,Se=null,a;if((p&Ye)!==H)return null;
+ha();return null}function Bj(){for(;null!==l;){var a=l.effectTag;0!==(a&256)&&nj(l.alternate,l);0===(a&512)||ld||(ld=!0,Ng(97,function(){xb();return null}));l=l.nextEffect}}function xb(){if(90!==$b){var a=97<$b?97:$b;$b=90;return Da(a,Dj)}}function Dj(){if(null===Zb)return!1;var a=Zb;Zb=null;if((p&(ca|ma))!==H)throw Error(k(331));var b=p;p|=ma;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Ah(5,c),Bh(5,c)}}catch(d){if(null===
+a)throw Error(k(330));Za(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}p=b;ha();return!0}function Vh(a,b,c){b=Le(c,b);b=Ih(a,b,1073741823);Fa(a,b);a=ed(a,1073741823);null!==a&&V(a)}function Za(a,b){if(3===a.tag)Vh(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Vh(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===La||!La.has(d))){a=Le(b,a);a=Jh(c,a,1073741823);Fa(c,a);c=ed(c,1073741823);null!==
+c&&V(c);break}}c=c.return}}function xj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&P===c?F===bd||F===ad&&1073741823===ta&&Y()-Re<Ph?$a(a,P):jd=!0:Kh(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,V(a)))}function qj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=ka(),b=Va(b,a,null));a=ed(a,b);null!==a&&V(a)}function Ej(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=
+b.inject(a);bf=function(a,e){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(f){}};Ne=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}function Fj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=
+null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Ge(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Gj(a){if("function"===typeof a)return Ge(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===zd)return 11;if(a===Ad)return 14}return 2}function Sa(a,b){var c=a.alternate;null===c?(c=la(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=
+null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,firstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}function Oc(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)Ge(a)&&(g=1);else if("string"===typeof a)g=
+5;else a:switch(a){case Ma:return Ha(c.children,e,f,b);case Hj:g=8;e|=7;break;case Af:g=8;e|=1;break;case kc:return a=la(12,c,b,e|8),a.elementType=kc,a.type=kc,a.expirationTime=f,a;case lc:return a=la(13,c,b,e),a.type=lc,a.elementType=lc,a.expirationTime=f,a;case yd:return a=la(19,c,b,e),a.elementType=yd,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case Cf:g=10;break a;case Bf:g=9;break a;case zd:g=11;break a;case Ad:g=14;break a;case Ef:g=16;d=null;break a;case Df:g=
+22;break a}throw Error(k(130,null==a?a:typeof a,""));}b=la(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ha(a,b,c,d){a=la(7,a,d,b);a.expirationTime=c;return a}function qe(a,b,c){a=la(6,a,null,b);a.expirationTime=c;return a}function re(a,b,c){b=la(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function Ij(a,b,c){this.tag=b;this.current=null;this.containerInfo=
+a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Kh(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function Ya(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;
+c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}function yh(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Ue(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}
+function md(a,b,c,d){var e=b.current,f=ka(),g=Vb.suspense;f=Va(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(Na(c)!==c||1!==c.tag)throw Error(k(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(N(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(k(171));}if(1===c.tag){var m=c.type;if(N(m)){c=Gg(c,m,h);break a}}c=h}else c=Ca;null===b.context?b.context=c:b.pendingContext=c;b=Ea(f,g);b.payload={element:a};d=void 0===
+d?null:d;null!==d&&(b.callback=d);Fa(e,b);Ja(e,f);return f}function cf(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Wh(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function df(a,b){Wh(a,b);(a=a.alternate)&&Wh(a,b)}function ef(a,b,c){c=null!=c&&!0===c.hydrate;var d=new Ij(a,b,c),e=la(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ne(e);a[Lb]=d.current;c&&0!==b&&
+xi(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}function bc(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}function Jj(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new ef(a,0,b?{hydrate:!0}:void 0)}function nd(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;
+if("function"===typeof e){var h=e;e=function(){var a=cf(g);h.call(a)}}md(b,g,a,e)}else{f=c._reactRootContainer=Jj(c,d);g=f._internalRoot;if("function"===typeof e){var m=e;e=function(){var a=cf(g);m.call(a)}}Rh(function(){md(b,g,a,e)})}return cf(g)}function Kj(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:gb,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}function Xh(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;
+if(!bc(b))throw Error(k(200));return Kj(a,b,null,c)}if(!ea)throw Error(k(227));var ki=function(a,b,c,d,e,f,g,h,m){var n=Array.prototype.slice.call(arguments,3);try{b.apply(c,n)}catch(C){this.onError(C)}},yb=!1,gc=null,hc=!1,pd=null,li={onError:function(a){yb=!0;gc=a}},td=null,rf=null,mf=null,ic=null,cb={},jc=[],qd={},db={},rd={},wa=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),M=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.assign,
+sd=null,eb=null,fb=null,ee=function(a,b){return a(b)},eg=function(a,b,c,d,e){return a(b,c,d,e)},vd=function(){},vf=ee,Oa=!1,wd=!1,Z=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler,Lj=Z.unstable_cancelCallback,ff=Z.unstable_now,$f=Z.unstable_scheduleCallback,Mj=Z.unstable_shouldYield,Yh=Z.unstable_requestPaint,Pd=Z.unstable_runWithPriority,Nj=Z.unstable_getCurrentPriorityLevel,Oj=Z.unstable_ImmediatePriority,Zh=Z.unstable_UserBlockingPriority,ag=Z.unstable_NormalPriority,Pj=Z.unstable_LowPriority,
+Qj=Z.unstable_IdlePriority,oi=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,wf=Object.prototype.hasOwnProperty,yf={},xf={},E={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){E[a]=
+new L(a,0,!1,a,null,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];E[b]=new L(b,1,!1,a[1],null,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){E[a]=new L(a,2,!1,a.toLowerCase(),null,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){E[a]=new L(a,2,!1,a,null,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){E[a]=
+new L(a,3,!1,a.toLowerCase(),null,!1)});["checked","multiple","muted","selected"].forEach(function(a){E[a]=new L(a,3,!0,a,null,!1)});["capture","download"].forEach(function(a){E[a]=new L(a,4,!1,a,null,!1)});["cols","rows","size","span"].forEach(function(a){E[a]=new L(a,6,!1,a,null,!1)});["rowSpan","start"].forEach(function(a){E[a]=new L(a,5,!1,a.toLowerCase(),null,!1)});var gf=/[\-:]([a-z])/g,hf=function(a){return a[1].toUpperCase()};"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=
+a.replace(gf,hf);E[b]=new L(b,1,!1,a,null,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/1999/xlink",!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1)});["tabIndex","crossOrigin"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!1)});E.xlinkHref=new L("xlinkHref",1,
+!1,"xlink:href","http://www.w3.org/1999/xlink",!0);["src","href","action","formAction"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!0)});var da=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;da.hasOwnProperty("ReactCurrentDispatcher")||(da.ReactCurrentDispatcher={current:null});da.hasOwnProperty("ReactCurrentBatchConfig")||(da.ReactCurrentBatchConfig={suspense:null});var si=/^(.*)[\\\/]/,Q="function"===typeof Symbol&&Symbol.for,Pc=Q?Symbol.for("react.element"):60103,gb=Q?Symbol.for("react.portal"):
+60106,Ma=Q?Symbol.for("react.fragment"):60107,Af=Q?Symbol.for("react.strict_mode"):60108,kc=Q?Symbol.for("react.profiler"):60114,Cf=Q?Symbol.for("react.provider"):60109,Bf=Q?Symbol.for("react.context"):60110,Hj=Q?Symbol.for("react.concurrent_mode"):60111,zd=Q?Symbol.for("react.forward_ref"):60112,lc=Q?Symbol.for("react.suspense"):60113,yd=Q?Symbol.for("react.suspense_list"):60120,Ad=Q?Symbol.for("react.memo"):60115,Ef=Q?Symbol.for("react.lazy"):60116,Df=Q?Symbol.for("react.block"):60121,zf="function"===
+typeof Symbol&&Symbol.iterator,od,xh=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{od=od||document.createElement("div");od.innerHTML="<svg>"+b.valueOf().toString()+"</svg>";for(b=od.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}}),Wb=function(a,
+b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b},ib={animationend:nc("Animation","AnimationEnd"),animationiteration:nc("Animation","AnimationIteration"),animationstart:nc("Animation","AnimationStart"),transitionend:nc("Transition","TransitionEnd")},Id={},Of={};wa&&(Of=document.createElement("div").style,"AnimationEvent"in window||(delete ib.animationend.animation,delete ib.animationiteration.animation,delete ib.animationstart.animation),"TransitionEvent"in
+window||delete ib.transitionend.transition);var $h=oc("animationend"),ai=oc("animationiteration"),bi=oc("animationstart"),ci=oc("transitionend"),Db="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Pf=new ("function"===typeof WeakMap?WeakMap:Map),Ab=null,wi=function(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;
+if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)lf(a,b[d],c[d]);else b&&lf(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}},qc=[],Rd=!1,fa=[],xa=null,ya=null,za=null,Eb=new Map,Fb=new Map,Jb=[],Nd="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),
+yi="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" "),dg={},cg=new Map,Td=new Map,Rj=["abort","abort",$h,"animationEnd",ai,"animationIteration",bi,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata",
+"loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",ci,"transitionEnd","waiting","waiting"];Sd("blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),
+0);Sd("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1);Sd(Rj,2);(function(a,b){for(var c=0;c<a.length;c++)Td.set(a[c],b)})("change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),0);var Hi=Zh,Gi=Pd,tc=!0,Kb={animationIterationCount:!0,
+borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,
+strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sj=["Webkit","ms","Moz","O"];Object.keys(Kb).forEach(function(a){Sj.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Kb[b]=Kb[a]})});var Ii=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),ng="$",og="/$",$d="$?",Zd="$!",Ze=null,$e=null,We="function"===typeof setTimeout?setTimeout:void 0,vj="function"===
+typeof clearTimeout?clearTimeout:void 0,jf=Math.random().toString(36).slice(2),Aa="__reactInternalInstance$"+jf,vc="__reactEventHandlers$"+jf,Lb="__reactContainere$"+jf,Ba=null,ce=null,wc=null;M(R.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=xc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==
+typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=xc)},persist:function(){this.isPersistent=xc},isPersistent:yc,destructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=yc;this._dispatchInstances=this._dispatchListeners=null}});R.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||
+Date.now()},defaultPrevented:null,isTrusted:null};R.extend=function(a){function b(){return c.apply(this,arguments)}var c=this,d=function(){};d.prototype=c.prototype;d=new d;M(d,b.prototype);b.prototype=d;b.prototype.constructor=b;b.Interface=M({},c.Interface,a);b.extend=c.extend;sg(b);return b};sg(R);var Tj=R.extend({data:null}),Uj=R.extend({data:null}),Ni=[9,13,27,32],de=wa&&"CompositionEvent"in window,cc=null;wa&&"documentMode"in document&&(cc=document.documentMode);var Vj=wa&&"TextEvent"in window&&
+!cc,xg=wa&&(!de||cc&&8<cc&&11>=cc),wg=String.fromCharCode(32),ua={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},
+dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},vg=!1,mb=!1,Wj={eventTypes:ua,extractEvents:function(a,b,c,d,e){var f;if(de)b:{switch(a){case "compositionstart":var g=ua.compositionStart;break b;case "compositionend":g=ua.compositionEnd;break b;case "compositionupdate":g=
+ua.compositionUpdate;break b}g=void 0}else mb?tg(a,c)&&(g=ua.compositionEnd):"keydown"===a&&229===c.keyCode&&(g=ua.compositionStart);g?(xg&&"ko"!==c.locale&&(mb||g!==ua.compositionStart?g===ua.compositionEnd&&mb&&(f=rg()):(Ba=d,ce="value"in Ba?Ba.value:Ba.textContent,mb=!0)),e=Tj.getPooled(g,b,c,d),f?e.data=f:(f=ug(c),null!==f&&(e.data=f)),lb(e),f=e):f=null;(a=Vj?Oi(a,c):Pi(a,c))?(b=Uj.getPooled(ua.beforeInput,b,c,d),b.data=a,lb(b)):b=null;return null===f?b:null===b?f:[f,b]}},Qi={color:!0,date:!0,
+datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0},Ag={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}},Mb=null,Nb=null,kf=!1;wa&&(kf=Tf("input")&&(!document.documentMode||9<document.documentMode));var Xj={eventTypes:Ag,_isInputEventSupported:kf,extractEvents:function(a,b,c,d,e){e=b?Pa(b):window;var f=
+e.nodeName&&e.nodeName.toLowerCase();if("select"===f||"input"===f&&"file"===e.type)var g=Si;else if(yg(e))if(kf)g=Wi;else{g=Ui;var h=Ti}else(f=e.nodeName)&&"input"===f.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(g=Vi);if(g&&(g=g(a,b)))return zg(g,c,d);h&&h(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Ed(e,"number",e.value)}},dc=R.extend({view:null,detail:null}),Yi={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"},di=0,ei=0,fi=!1,gi=!1,ec=dc.extend({screenX:null,
+screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:fe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=di;di=a.screenX;return fi?"mousemove"===a.type?a.screenX-b:0:(fi=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;var b=ei;ei=a.screenY;return gi?"mousemove"===
+a.type?a.screenY-b:0:(gi=!0,0)}}),hi=ec.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),fc={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout",
+"pointerover"]}},Yj={eventTypes:fc,extractEvents:function(a,b,c,d,e){var f="mouseover"===a||"pointerover"===a,g="mouseout"===a||"pointerout"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Bb(b):null,null!==b){var h=Na(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if("mouseout"===a||"mouseover"===a){var m=ec;var n=fc.mouseLeave;
+var l=fc.mouseEnter;var k="mouse"}else if("pointerout"===a||"pointerover"===a)m=hi,n=fc.pointerLeave,l=fc.pointerEnter,k="pointer";a=null==g?f:Pa(g);f=null==b?f:Pa(b);n=m.getPooled(n,g,c,d);n.type=k+"leave";n.target=a;n.relatedTarget=f;c=m.getPooled(l,b,c,d);c.type=k+"enter";c.target=f;c.relatedTarget=a;d=g;k=b;if(d&&k)a:{m=d;l=k;g=0;for(a=m;a;a=pa(a))g++;a=0;for(b=l;b;b=pa(b))a++;for(;0<g-a;)m=pa(m),g--;for(;0<a-g;)l=pa(l),a--;for(;g--;){if(m===l||m===l.alternate)break a;m=pa(m);l=pa(l)}m=null}else m=
+null;l=m;for(m=[];d&&d!==l;){g=d.alternate;if(null!==g&&g===l)break;m.push(d);d=pa(d)}for(d=[];k&&k!==l;){g=k.alternate;if(null!==g&&g===l)break;d.push(k);k=pa(k)}for(k=0;k<m.length;k++)be(m[k],"bubbled",n);for(k=d.length;0<k--;)be(d[k],"captured",c);return 0===(e&64)?[n]:[n,c]}},Qa="function"===typeof Object.is?Object.is:Zi,$i=Object.prototype.hasOwnProperty,Zj=wa&&"documentMode"in document&&11>=document.documentMode,Eg={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},
+dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},nb=null,he=null,Pb=null,ge=!1,ak={eventTypes:Eg,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=Jd(e);f=rd.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pa(b):window;switch(a){case "focus":if(yg(e)||"true"===e.contentEditable)nb=e,he=b,Pb=null;break;case "blur":Pb=he=nb=null;
+break;case "mousedown":ge=!0;break;case "contextmenu":case "mouseup":case "dragend":return ge=!1,Dg(c,d);case "selectionchange":if(Zj)break;case "keydown":case "keyup":return Dg(c,d)}return null}},bk=R.extend({animationName:null,elapsedTime:null,pseudoElement:null}),ck=R.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),dk=dc.extend({relatedTarget:null}),ek={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",
+Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},fk={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",
+224:"Meta"},gk=dc.extend({key:function(a){if(a.key){var b=ek[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=Ac(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?fk[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:fe,charCode:function(a){return"keypress"===a.type?Ac(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===
+a.type?Ac(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),hk=ec.extend({dataTransfer:null}),ik=dc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:fe}),jk=R.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),kk=ec.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?
+-a.wheelDelta:0},deltaZ:null,deltaMode:null}),lk={eventTypes:dg,extractEvents:function(a,b,c,d,e){e=cg.get(a);if(!e)return null;switch(a){case "keypress":if(0===Ac(c))return null;case "keydown":case "keyup":a=gk;break;case "blur":case "focus":a=dk;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=ec;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a=
+hk;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=ik;break;case $h:case ai:case bi:a=bk;break;case ci:a=jk;break;case "scroll":a=dc;break;case "wheel":a=kk;break;case "copy":case "cut":case "paste":a=ck;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=hi;break;default:a=R}b=a.getPooled(e,b,c,d);lb(b);return b}};(function(a){if(ic)throw Error(k(101));
+ic=Array.prototype.slice.call(a);nf()})("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));(function(a,b,c){td=a;rf=b;mf=c})(ae,Hb,Pa);pf({SimpleEventPlugin:lk,EnterLeaveEventPlugin:Yj,ChangeEventPlugin:Xj,SelectEventPlugin:ak,BeforeInputEventPlugin:Wj});var ie=[],ob=-1,Ca={},B={current:Ca},G={current:!1},Ra=Ca,bj=Pd,je=$f,Rg=Lj,aj=Nj,Dc=Oj,Ig=Zh,Jg=ag,Kg=Pj,Lg=Qj,Qg={},yj=Mj,Cj=void 0!==Yh?Yh:function(){},qa=null,
+Ec=null,ke=!1,ii=ff(),Y=1E4>ii?ff:function(){return ff()-ii},Ic={current:null},Hc=null,qb=null,Gc=null,Tg=0,Jc=2,Ga=!1,Vb=da.ReactCurrentBatchConfig,$g=(new ea.Component).refs,Mc={isMounted:function(a){return(a=a._reactInternalFiber)?Na(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense;d=Va(d,a,e);e=Ea(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense;
+d=Va(d,a,e);e=Ea(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=ka(),d=Vb.suspense;c=Va(c,a,d);d=Ea(c,d);d.tag=Jc;void 0!==b&&null!==b&&(d.callback=b);Fa(a,d);Ja(a,c)}},Qc=Array.isArray,wb=ah(!0),Fe=ah(!1),Sb={},ja={current:Sb},Ub={current:Sb},Tb={current:Sb},D={current:0},Sc=da.ReactCurrentDispatcher,X=da.ReactCurrentBatchConfig,Ia=0,z=null,K=null,J=null,Uc=!1,Tc={readContext:W,useCallback:S,useContext:S,
+useEffect:S,useImperativeHandle:S,useLayoutEffect:S,useMemo:S,useReducer:S,useRef:S,useState:S,useDebugValue:S,useResponder:S,useDeferredValue:S,useTransition:S},dj={readContext:W,useCallback:ih,useContext:W,useEffect:eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ze(4,2,gh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ze(4,2,a,b)},useMemo:function(a,b){var c=ub();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=
+ub();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=ch.bind(null,z,a);return[d.memoizedState,a]},useRef:function(a){var b=ub();a={current:a};return b.memoizedState=a},useState:xe,useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=xe(a),d=c[0],e=c[1];eh(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=
+xe(!1),c=b[0];b=b[1];return[ih(Ce.bind(null,b,a),[b,a]),c]}},ej={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Vc,useRef:dh,useState:function(a){return Vc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Vc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Vc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null,
+b,a),[b,a]),c]}},fj={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Wc,useRef:dh,useState:function(a){return Wc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Wc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Wc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null,b,a),[b,a]),c]}},ra=null,Ka=null,Wa=
+!1,gj=da.ReactCurrentOwner,ia=!1,Je={dehydrated:null,retryTime:0};var jj=function(a,b,c,d){for(c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};var wh=function(a){};var ij=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;Ta(ja.current);a=null;switch(c){case "input":f=
+Cd(g,f);d=Cd(g,d);a=[];break;case "option":f=Fd(g,f);d=Fd(g,d);a=[];break;case "select":f=M({},f,{value:void 0});d=M({},d,{value:void 0});a=[];break;case "textarea":f=Gd(g,f);d=Gd(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=uc)}Ud(c,d);var h,m;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if("style"===h)for(m in g=f[h],g)g.hasOwnProperty(m)&&(c||(c={}),c[m]="");else"dangerouslySetInnerHTML"!==h&&"children"!==h&&"suppressContentEditableWarning"!==
+h&&"suppressHydrationWarning"!==h&&"autoFocus"!==h&&(db.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var k=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&k!==g&&(null!=k||null!=g))if("style"===h)if(g){for(m in g)!g.hasOwnProperty(m)||k&&k.hasOwnProperty(m)||(c||(c={}),c[m]="");for(m in k)k.hasOwnProperty(m)&&g[m]!==k[m]&&(c||(c={}),c[m]=k[m])}else c||(a||(a=[]),a.push(h,c)),c=k;else"dangerouslySetInnerHTML"===h?(k=k?k.__html:void 0,g=g?g.__html:void 0,null!=k&&g!==k&&(a=a||
+[]).push(h,k)):"children"===h?g===k||"string"!==typeof k&&"number"!==typeof k||(a=a||[]).push(h,""+k):"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&(db.hasOwnProperty(h)?(null!=k&&oa(e,h),a||g===k||(a=[])):(a=a||[]).push(h,k))}c&&(a=a||[]).push("style",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};var kj=function(a,b,c,d){c!==d&&(b.effectTag|=4)};var pj="function"===typeof WeakSet?WeakSet:Set,wj="function"===typeof WeakMap?WeakMap:Map,sj=Math.ceil,gd=da.ReactCurrentDispatcher,
+Uh=da.ReactCurrentOwner,H=0,Ye=8,ca=16,ma=32,Xa=0,hd=1,Oh=2,ad=3,bd=4,Xe=5,p=H,U=null,t=null,P=0,F=Xa,id=null,ta=1073741823,Yb=1073741823,kd=null,Xb=0,jd=!1,Re=0,Ph=500,l=null,cd=!1,Se=null,La=null,ld=!1,Zb=null,$b=90,bb=null,ac=0,af=null,dd=0,Ja=function(a,b){if(50<ac)throw ac=0,af=null,Error(k(185));a=ed(a,b);if(null!==a){var c=Cc();1073741823===b?(p&Ye)!==H&&(p&(ca|ma))===H?Te(a):(V(a),p===H&&ha()):V(a);(p&4)===H||98!==c&&99!==c||(null===bb?bb=new Map([[a,b]]):(c=bb.get(a),(void 0===c||c>b)&&bb.set(a,
+b)))}};var zj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||G.current)ia=!0;else{if(d<c){ia=!1;switch(b.tag){case 3:sh(b);Ee();break;case 5:bh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:N(b.type)&&Bc(b);break;case 4:se(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;y(Ic,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;
+if(0!==d&&d>=c)return th(a,b,c);y(D,D.current&1);b=sa(a,b,c);return null!==b?b.sibling:null}y(D,D.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return vh(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);y(D,D.current);if(!d)return null}return sa(a,b,c)}ia=!1}}else ia=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=pb(b,B.current);rb(b,c);e=we(null,
+b,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(N(d)){var f=!0;Bc(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ne(b);var g=d.getDerivedStateFromProps;"function"===typeof g&&Lc(b,d,g,a);e.updater=Mc;b.stateNode=e;e._reactInternalFiber=b;pe(b,d,a,c);b=Ie(null,b,d,!0,f,c)}else b.tag=0,T(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate=
+null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ri(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Gj(e);a=aa(e,a);switch(f){case 0:b=He(null,b,e,a,c);break a;case 1:b=rh(null,b,e,a,c);break a;case 11:b=nh(null,b,e,a,c);break a;case 14:b=oh(null,b,e,aa(e.type,a),d,c);break a}throw Error(k(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),He(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),rh(a,b,d,e,c);
+case 3:sh(b);d=b.updateQueue;if(null===a||null===d)throw Error(k(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;oe(a,b);Qb(b,d,null,c);d=b.memoizedState.element;if(d===e)Ee(),b=sa(a,b,c);else{if(e=b.stateNode.hydrate)Ka=kb(b.stateNode.containerInfo.firstChild),ra=b,e=Wa=!0;if(e)for(c=Fe(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else T(a,b,d,c),Ee();b=b.child}return b;case 5:return bh(b),null===a&&De(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:
+null,g=e.children,Yd(d,e)?g=null:null!==f&&Yd(d,f)&&(b.effectTag|=16),qh(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(T(a,b,g,c),b=b.child),b;case 6:return null===a&&De(b),null;case 13:return th(a,b,c);case 4:return se(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=wb(b,null,d,c):T(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),nh(a,b,d,e,c);case 7:return T(a,b,b.pendingProps,c),b.child;case 8:return T(a,
+b,b.pendingProps.children,c),b.child;case 12:return T(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;y(Ic,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=Qa(h,f)?0:("function"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!G.current){b=sa(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var m=h.dependencies;if(null!==
+m){g=h.child;for(var l=m.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Ea(c,null),l.tag=Jc,Fa(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);Sg(h.return,c);m.expirationTime<c&&(m.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=
+g}T(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,rb(b,c),e=W(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,T(a,b,d,c),b.child;case 14:return e=b.type,f=aa(e,b.pendingProps),f=aa(e.type,f),oh(a,b,e,f,d,c);case 15:return ph(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,N(d)?(a=!0,Bc(b)):a=!1,rb(b,c),Yg(b,d,e),pe(b,d,e,c),Ie(null,
+b,d,!0,a,c);case 19:return vh(a,b,c)}throw Error(k(156,b.tag));};var bf=null,Ne=null,la=function(a,b,c,d){return new Fj(a,b,c,d)};ef.prototype.render=function(a){md(a,this._internalRoot,null,null)};ef.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;md(null,a,null,function(){b[Lb]=null})};var Di=function(a){if(13===a.tag){var b=Fc(ka(),150,100);Ja(a,b);df(a,b)}};var Yf=function(a){13===a.tag&&(Ja(a,3),df(a,3))};var Bi=function(a){if(13===a.tag){var b=ka();b=Va(b,a,null);Ja(a,
+b);df(a,b)}};sd=function(a,b,c){switch(b){case "input":Dd(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=ae(d);if(!e)throw Error(k(90));Gf(d);Dd(d,e)}}}break;case "textarea":Lf(a,c);break;case "select":b=c.value,null!=b&&hb(a,!!c.multiple,b,!1)}};(function(a,b,c,d){ee=a;eg=b;vd=c;vf=d})(Qh,function(a,b,c,d,e){var f=p;p|=4;
+try{return Da(98,a.bind(null,b,c,d,e))}finally{p=f,p===H&&ha()}},function(){(p&(1|ca|ma))===H&&(uj(),xb())},function(a,b){var c=p;p|=2;try{return a(b)}finally{p=c,p===H&&ha()}});var mk={Events:[Hb,Pa,ae,pf,qd,lb,function(a){Kd(a,Ki)},sf,tf,sc,pc,xb,{current:!1}]};(function(a){var b=a.findFiberByHostInstance;return Ej(M({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:da.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Sf(a);
+return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Bb,bundleType:0,version:"16.13.1",rendererPackageName:"react-dom"});I.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=mk;I.createPortal=Xh;I.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===
+b){if("function"===typeof a.render)throw Error(k(188));throw Error(k(268,Object.keys(a)));}a=Sf(b);a=null===a?null:a.stateNode;return a};I.flushSync=function(a,b){if((p&(ca|ma))!==H)throw Error(k(187));var c=p;p|=1;try{return Da(99,a.bind(null,b))}finally{p=c,ha()}};I.hydrate=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!0,c)};I.render=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!1,c)};I.unmountComponentAtNode=function(a){if(!bc(a))throw Error(k(40));return a._reactRootContainer?
+(Rh(function(){nd(null,null,a,!1,function(){a._reactRootContainer=null;a[Lb]=null})}),!0):!1};I.unstable_batchedUpdates=Qh;I.unstable_createPortal=function(a,b){return Xh(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};I.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!bc(c))throw Error(k(200));if(null==a||void 0===a._reactInternalFiber)throw Error(k(38));return nd(a,b,c,!1,d)};I.version="16.13.1"});
diff --git a/browser/components/newtab/vendor/react.js b/browser/components/newtab/vendor/react.js
index 2d9fb9aa29b7..a6338f8b6275 100644
--- a/browser/components/newtab/vendor/react.js
+++ b/browser/components/newtab/vendor/react.js
@@ -1,4 +1,4 @@
-/** @license React v16.12.0
+/** @license React v16.13.1
  * react.production.min.js
  *
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -6,27 +6,27 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-'use strict';(function(v,m){"object"===typeof exports&&"undefined"!==typeof module?module.exports=m():"function"===typeof define&&define.amd?define(m):v.React=m()})(this,function(){function v(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function m(a,
-b,c){this.props=a;this.context=b;this.refs=da;this.updater=c||ea}function fa(){}function M(a,b,c){this.props=a;this.context=b;this.refs=da;this.updater=c||ea}function ha(a,b,c){var d,e={},p=null,f=null;if(null!=b)for(d in void 0!==b.ref&&(f=b.ref),void 0!==b.key&&(p=""+b.key),b)ia.call(b,d)&&!ja.hasOwnProperty(d)&&(e[d]=b[d]);var g=arguments.length-2;if(1===g)e.children=c;else if(1<g){for(var k=Array(g),h=0;h<g;h++)k[h]=arguments[h+2];e.children=k}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===
-e[d]&&(e[d]=g[d]);return{$$typeof:y,type:a,key:p,ref:f,props:e,_owner:N.current}}function wa(a,b){return{$$typeof:y,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return"object"===typeof a&&null!==a&&a.$$typeof===y}function xa(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}function ka(a,b,c,d){if(D.length){var e=D.pop();e.result=a;e.keyPrefix=b;e.func=c;e.context=d;e.count=0;return e}return{result:a,keyPrefix:b,func:c,context:d,count:0}}
-function la(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>D.length&&D.push(a)}function P(a,b,c,d){var e=typeof a;if("undefined"===e||"boolean"===e)a=null;var p=!1;if(null===a)p=!0;else switch(e){case "string":case "number":p=!0;break;case "object":switch(a.$$typeof){case y:case ya:p=!0}}if(p)return c(d,a,""===b?"."+Q(a,0):b),1;p=0;b=""===b?".":b+":";if(Array.isArray(a))for(var f=0;f<a.length;f++){e=a[f];var g=b+Q(e,f);p+=P(e,g,c,d)}else if(null===a||"object"!==typeof a?
-g=null:(g=ma&&a[ma]||a["@@iterator"],g="function"===typeof g?g:null),"function"===typeof g)for(a=g.call(a),f=0;!(e=a.next()).done;)e=e.value,g=b+Q(e,f++),p+=P(e,g,c,d);else if("object"===e)throw c=""+a,Error(v(31,"[object Object]"===c?"object with keys {"+Object.keys(a).join(", ")+"}":c,""));return p}function R(a,b,c){return null==a?0:P(a,"",b,c)}function Q(a,b){return"object"===typeof a&&null!==a&&null!=a.key?xa(a.key):b.toString(36)}function za(a,b,c){a.func.call(a.context,b,a.count++)}function Aa(a,
-b,c){var d=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?S(a,d,c,function(a){return a}):null!=a&&(O(a)&&(a=wa(a,e+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(na,"$&/")+"/")+c)),d.push(a))}function S(a,b,c,d,e){var f="";null!=c&&(f=(""+c).replace(na,"$&/")+"/");b=ka(b,f,d,e);R(a,Aa,b);la(b)}function t(){var a=oa.current;if(null===a)throw Error(v(321));return a}function T(a,b){var c=a.length;a.push(b);a:for(;;){var d=Math.floor((c-1)/2),e=a[d];if(void 0!==e&&0<E(e,
-b))a[d]=b,a[c]=e,c=d;else break a}}function n(a){a=a[0];return void 0===a?null:a}function F(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var f=2*(d+1)-1,h=a[f],g=f+1,k=a[g];if(void 0!==h&&0>E(h,c))void 0!==k&&0>E(k,h)?(a[d]=k,a[g]=c,d=g):(a[d]=h,a[f]=c,d=f);else if(void 0!==k&&0>E(k,c))a[d]=k,a[g]=c,d=g;else break a}}return b}return null}function E(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function G(a){for(var b=n(u);null!==b;){if(null===
-b.callback)F(u);else if(b.startTime<=a)F(u),b.sortIndex=b.expirationTime,T(q,b);else break;b=n(u)}}function U(a){z=!1;G(a);if(!w)if(null!==n(q))w=!0,A(V);else{var b=n(u);null!==b&&H(U,b.startTime-a)}}function V(a,b){w=!1;z&&(z=!1,W());I=!0;var c=h;try{G(b);for(l=n(q);null!==l&&(!(l.expirationTime>b)||a&&!X());){var d=l.callback;if(null!==d){l.callback=null;h=l.priorityLevel;var e=d(l.expirationTime<=b);b=r();"function"===typeof e?l.callback=e:l===n(q)&&F(q);G(b)}else F(q);l=n(q)}if(null!==l)var f=
-!0;else{var m=n(u);null!==m&&H(U,m.startTime-b);f=!1}return f}finally{l=null,h=c,I=!1}}function pa(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var f="function"===typeof Symbol&&Symbol.for,y=f?Symbol.for("react.element"):60103,ya=f?Symbol.for("react.portal"):60106,x=f?Symbol.for("react.fragment"):60107,Y=f?Symbol.for("react.strict_mode"):60108,Ba=f?Symbol.for("react.profiler"):60114,Ca=f?Symbol.for("react.provider"):60109,Da=f?Symbol.for("react.context"):
-60110,Ea=f?Symbol.for("react.forward_ref"):60112,Fa=f?Symbol.for("react.suspense"):60113;f&&Symbol.for("react.suspense_list");var Ga=f?Symbol.for("react.memo"):60115,Ha=f?Symbol.for("react.lazy"):60116;f&&Symbol.for("react.fundamental");f&&Symbol.for("react.responder");f&&Symbol.for("react.scope");var ma="function"===typeof Symbol&&Symbol.iterator,qa=Object.getOwnPropertySymbols,Ia=Object.prototype.hasOwnProperty,Ja=Object.prototype.propertyIsEnumerable,J=function(){try{if(!Object.assign)return!1;
-var a=new String("abc");a[5]="de";if("5"===Object.getOwnPropertyNames(a)[0])return!1;var b={};for(a=0;10>a;a++)b["_"+String.fromCharCode(a)]=a;if("0123456789"!==Object.getOwnPropertyNames(b).map(function(a){return b[a]}).join(""))return!1;var c={};"abcdefghijklmnopqrst".split("").forEach(function(a){c[a]=a});return"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},c)).join("")?!1:!0}catch(d){return!1}}()?Object.assign:function(a,b){if(null===a||void 0===a)throw new TypeError("Object.assign cannot be called with null or undefined");
-var c=Object(a);for(var d,e=1;e<arguments.length;e++){var f=Object(arguments[e]);for(var h in f)Ia.call(f,h)&&(c[h]=f[h]);if(qa){d=qa(f);for(var g=0;g<d.length;g++)Ja.call(f,d[g])&&(c[d[g]]=f[d[g]])}}return c},ea={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,d){},enqueueSetState:function(a,b,c,d){}},da={};m.prototype.isReactComponent={};m.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error(v(85));
-this.updater.enqueueSetState(this,a,b,"setState")};m.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};fa.prototype=m.prototype;f=M.prototype=new fa;f.constructor=M;J(f,m.prototype);f.isPureReactComponent=!0;var oa={current:null},N={current:null},ia=Object.prototype.hasOwnProperty,ja={key:!0,ref:!0,__self:!0,__source:!0},na=/\/+/g,D=[],Z;if("undefined"===typeof window||"function"!==typeof MessageChannel){var B=null,ra=null,sa=function(){if(null!==B)try{var a=
-r();B(!0,a);B=null}catch(b){throw setTimeout(sa,0),b;}},Ka=Date.now();var r=function(){return Date.now()-Ka};var A=function(a){null!==B?setTimeout(A,0,a):(B=a,setTimeout(sa,0))};var H=function(a,b){ra=setTimeout(a,b)};var W=function(){clearTimeout(ra)};var X=function(){return!1};f=Z=function(){}}else{var aa=window.performance,ta=window.Date,La=window.setTimeout,Ma=window.clearTimeout;"undefined"!==typeof console&&(f=window.cancelAnimationFrame,"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),
-"function"!==typeof f&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));if("object"===typeof aa&&"function"===typeof aa.now)r=function(){return aa.now()};else{var Na=ta.now();r=function(){return ta.now()-Na}}var K=!1,L=null,ba=-1,ua=5,va=0;X=function(){return r()>=va};f=function(){};Z=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):
-ua=0<a?Math.floor(1E3/a):5};var C=new MessageChannel,ca=C.port2;C.port1.onmessage=function(){if(null!==L){var a=r();va=a+ua;try{L(!0,a)?ca.postMessage(null):(K=!1,L=null)}catch(b){throw ca.postMessage(null),b;}}else K=!1};A=function(a){L=a;K||(K=!0,ca.postMessage(null))};H=function(a,b){ba=La(function(){a(r())},b)};W=function(){Ma(ba);ba=-1}}var q=[],u=[],Oa=1,l=null,h=3,I=!1,w=!1,z=!1,Pa=0;C={ReactCurrentDispatcher:oa,ReactCurrentOwner:N,IsSomeRendererActing:{current:!1},assign:J};J(C,{Scheduler:{unstable_ImmediatePriority:1,
-unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=h;h=a;try{return b()}finally{h=c}},unstable_next:function(a){switch(h){case 1:case 2:case 3:var b=3;break;default:b=h}var c=h;h=b;try{return a()}finally{h=c}},unstable_scheduleCallback:function(a,b,c){var d=r();if("object"===typeof c&&null!==c){var e=c.delay;e="number"===typeof e&&0<e?d+
-e:d;c="number"===typeof c.timeout?c.timeout:pa(a)}else c=pa(a),e=d;c=e+c;a={id:Oa++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,T(u,a),null===n(q)&&a===n(u)&&(z?W():z=!0,H(U,e-d))):(a.sortIndex=c,T(q,a),w||I||(w=!0,A(V)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=h;return function(){var c=h;h=b;try{return a.apply(this,arguments)}finally{h=c}}},unstable_getCurrentPriorityLevel:function(){return h},
-unstable_shouldYield:function(){var a=r();G(a);var b=n(q);return b!==l&&null!==l&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<l.expirationTime||X()},unstable_requestPaint:f,unstable_continueExecution:function(){w||I||(w=!0,A(V))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return n(q)},get unstable_now(){return r},get unstable_forceFrameRate(){return Z},unstable_Profiling:null},SchedulerTracing:{get __interactionsRef(){return null},get __subscriberRef(){return null},
-unstable_clear:function(a){return a()},unstable_getCurrent:function(){return null},unstable_getThreadID:function(){return++Pa},unstable_trace:function(a,b,c){return c()},unstable_wrap:function(a){return a},unstable_subscribe:function(a){},unstable_unsubscribe:function(a){}}});x={Children:{map:function(a,b,c){if(null==a)return a;var d=[];S(a,d,null,b,c);return d},forEach:function(a,b,c){if(null==a)return a;b=ka(null,null,b,c);R(a,za,b);la(b)},count:function(a){return R(a,function(){return null},null)},
-toArray:function(a){var b=[];S(a,b,null,function(a){return a});return b},only:function(a){if(!O(a))throw Error(v(143));return a}},createRef:function(){return{current:null}},Component:m,PureComponent:M,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:Da,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:Ca,_context:a};return a.Consumer=a},forwardRef:function(a){return{$$typeof:Ea,render:a}},lazy:function(a){return{$$typeof:Ha,
-_ctor:a,_status:-1,_result:null}},memo:function(a,b){return{$$typeof:Ga,type:a,compare:void 0===b?null:b}},useCallback:function(a,b){return t().useCallback(a,b)},useContext:function(a,b){return t().useContext(a,b)},useEffect:function(a,b){return t().useEffect(a,b)},useImperativeHandle:function(a,b,c){return t().useImperativeHandle(a,b,c)},useDebugValue:function(a,b){},useLayoutEffect:function(a,b){return t().useLayoutEffect(a,b)},useMemo:function(a,b){return t().useMemo(a,b)},useReducer:function(a,
-b,c){return t().useReducer(a,b,c)},useRef:function(a){return t().useRef(a)},useState:function(a){return t().useState(a)},Fragment:x,Profiler:Ba,StrictMode:Y,Suspense:Fa,createElement:ha,cloneElement:function(a,b,c){if(null===a||void 0===a)throw Error(v(267,a));var d=J({},a.props),e=a.key,f=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(f=b.ref,h=N.current);void 0!==b.key&&(e=""+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(k in b)ia.call(b,k)&&!ja.hasOwnProperty(k)&&(d[k]=void 0===
-b[k]&&void 0!==g?g[k]:b[k])}var k=arguments.length-2;if(1===k)d.children=c;else if(1<k){g=Array(k);for(var l=0;l<k;l++)g[l]=arguments[l+2];d.children=g}return{$$typeof:y,type:a.type,key:e,ref:f,props:d,_owner:h}},createFactory:function(a){var b=ha.bind(null,a);b.type=a;return b},isValidElement:O,version:"16.12.0",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:C};x=(Y={default:x},x)||Y;return x.default||x});
+'use strict';(function(d,r){"object"===typeof exports&&"undefined"!==typeof module?r(exports):"function"===typeof define&&define.amd?define(["exports"],r):(d=d||self,r(d.React={}))})(this,function(d){function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
+function w(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function da(){}function L(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function ea(a,b,c){var g,e={},fa=null,d=null;if(null!=b)for(g in void 0!==b.ref&&(d=b.ref),void 0!==b.key&&(fa=""+b.key),b)ha.call(b,g)&&!ia.hasOwnProperty(g)&&(e[g]=b[g]);var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){for(var k=Array(h),f=0;f<h;f++)k[f]=arguments[f+2];e.children=k}if(a&&a.defaultProps)for(g in h=a.defaultProps,
+h)void 0===e[g]&&(e[g]=h[g]);return{$$typeof:x,type:a,key:fa,ref:d,props:e,_owner:M.current}}function va(a,b){return{$$typeof:x,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function N(a){return"object"===typeof a&&null!==a&&a.$$typeof===x}function wa(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}function ja(a,b,c,g){if(C.length){var e=C.pop();e.result=a;e.keyPrefix=b;e.func=c;e.context=g;e.count=0;return e}return{result:a,keyPrefix:b,func:c,
+context:g,count:0}}function ka(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>C.length&&C.push(a)}function O(a,b,c,g){var e=typeof a;if("undefined"===e||"boolean"===e)a=null;var d=!1;if(null===a)d=!0;else switch(e){case "string":case "number":d=!0;break;case "object":switch(a.$$typeof){case x:case xa:d=!0}}if(d)return c(g,a,""===b?"."+P(a,0):b),1;d=0;b=""===b?".":b+":";if(Array.isArray(a))for(var f=0;f<a.length;f++){e=a[f];var h=b+P(e,f);d+=O(e,h,c,g)}else if(null===a||
+"object"!==typeof a?h=null:(h=la&&a[la]||a["@@iterator"],h="function"===typeof h?h:null),"function"===typeof h)for(a=h.call(a),f=0;!(e=a.next()).done;)e=e.value,h=b+P(e,f++),d+=O(e,h,c,g);else if("object"===e)throw c=""+a,Error(r(31,"[object Object]"===c?"object with keys {"+Object.keys(a).join(", ")+"}":c,""));return d}function Q(a,b,c){return null==a?0:O(a,"",b,c)}function P(a,b){return"object"===typeof a&&null!==a&&null!=a.key?wa(a.key):b.toString(36)}function ya(a,b,c){a.func.call(a.context,b,
+a.count++)}function za(a,b,c){var g=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?R(a,g,c,function(a){return a}):null!=a&&(N(a)&&(a=va(a,e+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(ma,"$&/")+"/")+c)),g.push(a))}function R(a,b,c,g,e){var d="";null!=c&&(d=(""+c).replace(ma,"$&/")+"/");b=ja(b,d,g,e);Q(a,za,b);ka(b)}function t(){var a=na.current;if(null===a)throw Error(r(321));return a}function S(a,b){var c=a.length;a.push(b);a:for(;;){var g=c-1>>>1,e=a[g];if(void 0!==
+e&&0<D(e,b))a[g]=b,a[c]=e,c=g;else break a}}function n(a){a=a[0];return void 0===a?null:a}function E(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var g=0,e=a.length;g<e;){var d=2*(g+1)-1,f=a[d],h=d+1,k=a[h];if(void 0!==f&&0>D(f,c))void 0!==k&&0>D(k,f)?(a[g]=k,a[h]=c,g=h):(a[g]=f,a[d]=c,g=d);else if(void 0!==k&&0>D(k,c))a[g]=k,a[h]=c,g=h;else break a}}return b}return null}function D(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function F(a){for(var b=n(u);null!==
+b;){if(null===b.callback)E(u);else if(b.startTime<=a)E(u),b.sortIndex=b.expirationTime,S(p,b);else break;b=n(u)}}function T(a){y=!1;F(a);if(!v)if(null!==n(p))v=!0,z(U);else{var b=n(u);null!==b&&G(T,b.startTime-a)}}function U(a,b){v=!1;y&&(y=!1,V());H=!0;var c=m;try{F(b);for(l=n(p);null!==l&&(!(l.expirationTime>b)||a&&!W());){var g=l.callback;if(null!==g){l.callback=null;m=l.priorityLevel;var e=g(l.expirationTime<=b);b=q();"function"===typeof e?l.callback=e:l===n(p)&&E(p);F(b)}else E(p);l=n(p)}if(null!==
+l)var d=!0;else{var f=n(u);null!==f&&G(T,f.startTime-b);d=!1}return d}finally{l=null,m=c,H=!1}}function oa(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var f="function"===typeof Symbol&&Symbol.for,x=f?Symbol.for("react.element"):60103,xa=f?Symbol.for("react.portal"):60106,Aa=f?Symbol.for("react.fragment"):60107,Ba=f?Symbol.for("react.strict_mode"):60108,Ca=f?Symbol.for("react.profiler"):60114,Da=f?Symbol.for("react.provider"):60109,
+Ea=f?Symbol.for("react.context"):60110,Fa=f?Symbol.for("react.forward_ref"):60112,Ga=f?Symbol.for("react.suspense"):60113,Ha=f?Symbol.for("react.memo"):60115,Ia=f?Symbol.for("react.lazy"):60116,la="function"===typeof Symbol&&Symbol.iterator,pa=Object.getOwnPropertySymbols,Ja=Object.prototype.hasOwnProperty,Ka=Object.prototype.propertyIsEnumerable,I=function(){try{if(!Object.assign)return!1;var a=new String("abc");a[5]="de";if("5"===Object.getOwnPropertyNames(a)[0])return!1;var b={};for(a=0;10>a;a++)b["_"+
+String.fromCharCode(a)]=a;if("0123456789"!==Object.getOwnPropertyNames(b).map(function(a){return b[a]}).join(""))return!1;var c={};"abcdefghijklmnopqrst".split("").forEach(function(a){c[a]=a});return"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},c)).join("")?!1:!0}catch(g){return!1}}()?Object.assign:function(a,b){if(null===a||void 0===a)throw new TypeError("Object.assign cannot be called with null or undefined");var c=Object(a);for(var g,e=1;e<arguments.length;e++){var d=Object(arguments[e]);
+for(var f in d)Ja.call(d,f)&&(c[f]=d[f]);if(pa){g=pa(d);for(var h=0;h<g.length;h++)Ka.call(d,g[h])&&(c[g[h]]=d[g[h]])}}return c},ca={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,d){},enqueueSetState:function(a,b,c,d){}},ba={};w.prototype.isReactComponent={};w.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error(r(85));this.updater.enqueueSetState(this,a,b,"setState")};w.prototype.forceUpdate=
+function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};da.prototype=w.prototype;f=L.prototype=new da;f.constructor=L;I(f,w.prototype);f.isPureReactComponent=!0;var M={current:null},ha=Object.prototype.hasOwnProperty,ia={key:!0,ref:!0,__self:!0,__source:!0},ma=/\/+/g,C=[],na={current:null},X;if("undefined"===typeof window||"function"!==typeof MessageChannel){var A=null,qa=null,ra=function(){if(null!==A)try{var a=q();A(!0,a);A=null}catch(b){throw setTimeout(ra,0),b;}},La=Date.now();var q=
+function(){return Date.now()-La};var z=function(a){null!==A?setTimeout(z,0,a):(A=a,setTimeout(ra,0))};var G=function(a,b){qa=setTimeout(a,b)};var V=function(){clearTimeout(qa)};var W=function(){return!1};f=X=function(){}}else{var Y=window.performance,sa=window.Date,Ma=window.setTimeout,Na=window.clearTimeout;"undefined"!==typeof console&&(f=window.cancelAnimationFrame,"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),
+"function"!==typeof f&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));if("object"===typeof Y&&"function"===typeof Y.now)q=function(){return Y.now()};else{var Oa=sa.now();q=function(){return sa.now()-Oa}}var J=!1,K=null,Z=-1,ta=5,ua=0;W=function(){return q()>=ua};f=function(){};X=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):
+ta=0<a?Math.floor(1E3/a):5};var B=new MessageChannel,aa=B.port2;B.port1.onmessage=function(){if(null!==K){var a=q();ua=a+ta;try{K(!0,a)?aa.postMessage(null):(J=!1,K=null)}catch(b){throw aa.postMessage(null),b;}}else J=!1};z=function(a){K=a;J||(J=!0,aa.postMessage(null))};G=function(a,b){Z=Ma(function(){a(q())},b)};V=function(){Na(Z);Z=-1}}var p=[],u=[],Pa=1,l=null,m=3,H=!1,v=!1,y=!1,Qa=0;B={ReactCurrentDispatcher:na,ReactCurrentOwner:M,IsSomeRendererActing:{current:!1},assign:I};I(B,{Scheduler:{__proto__:null,
+unstable_ImmediatePriority:1,unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=m;m=a;try{return b()}finally{m=c}},unstable_next:function(a){switch(m){case 1:case 2:case 3:var b=3;break;default:b=m}var c=m;m=b;try{return a()}finally{m=c}},unstable_scheduleCallback:function(a,b,c){var d=q();if("object"===typeof c&&null!==c){var e=c.delay;
+e="number"===typeof e&&0<e?d+e:d;c="number"===typeof c.timeout?c.timeout:oa(a)}else c=oa(a),e=d;c=e+c;a={id:Pa++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,S(u,a),null===n(p)&&a===n(u)&&(y?V():y=!0,G(T,e-d))):(a.sortIndex=c,S(p,a),v||H||(v=!0,z(U)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=m;return function(){var c=m;m=b;try{return a.apply(this,arguments)}finally{m=c}}},unstable_getCurrentPriorityLevel:function(){return m},
+unstable_shouldYield:function(){var a=q();F(a);var b=n(p);return b!==l&&null!==l&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<l.expirationTime||W()},unstable_requestPaint:f,unstable_continueExecution:function(){v||H||(v=!0,z(U))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return n(p)},get unstable_now(){return q},get unstable_forceFrameRate(){return X},unstable_Profiling:null},SchedulerTracing:{__proto__:null,__interactionsRef:null,__subscriberRef:null,
+unstable_clear:function(a){return a()},unstable_getCurrent:function(){return null},unstable_getThreadID:function(){return++Qa},unstable_trace:function(a,b,c){return c()},unstable_wrap:function(a){return a},unstable_subscribe:function(a){},unstable_unsubscribe:function(a){}}});d.Children={map:function(a,b,c){if(null==a)return a;var d=[];R(a,d,null,b,c);return d},forEach:function(a,b,c){if(null==a)return a;b=ja(null,null,b,c);Q(a,ya,b);ka(b)},count:function(a){return Q(a,function(){return null},null)},
+toArray:function(a){var b=[];R(a,b,null,function(a){return a});return b},only:function(a){if(!N(a))throw Error(r(143));return a}};d.Component=w;d.Fragment=Aa;d.Profiler=Ca;d.PureComponent=L;d.StrictMode=Ba;d.Suspense=Ga;d.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=B;d.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(r(267,a));var d=I({},a.props),e=a.key,f=a.ref,m=a._owner;if(null!=b){void 0!==b.ref&&(f=b.ref,m=M.current);void 0!==b.key&&(e=""+b.key);if(a.type&&a.type.defaultProps)var h=
+a.type.defaultProps;for(k in b)ha.call(b,k)&&!ia.hasOwnProperty(k)&&(d[k]=void 0===b[k]&&void 0!==h?h[k]:b[k])}var k=arguments.length-2;if(1===k)d.children=c;else if(1<k){h=Array(k);for(var l=0;l<k;l++)h[l]=arguments[l+2];d.children=h}return{$$typeof:x,type:a.type,key:e,ref:f,props:d,_owner:m}};d.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:Ea,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:Da,_context:a};return a.Consumer=
+a};d.createElement=ea;d.createFactory=function(a){var b=ea.bind(null,a);b.type=a;return b};d.createRef=function(){return{current:null}};d.forwardRef=function(a){return{$$typeof:Fa,render:a}};d.isValidElement=N;d.lazy=function(a){return{$$typeof:Ia,_ctor:a,_status:-1,_result:null}};d.memo=function(a,b){return{$$typeof:Ha,type:a,compare:void 0===b?null:b}};d.useCallback=function(a,b){return t().useCallback(a,b)};d.useContext=function(a,b){return t().useContext(a,b)};d.useDebugValue=function(a,b){};
+d.useEffect=function(a,b){return t().useEffect(a,b)};d.useImperativeHandle=function(a,b,c){return t().useImperativeHandle(a,b,c)};d.useLayoutEffect=function(a,b){return t().useLayoutEffect(a,b)};d.useMemo=function(a,b){return t().useMemo(a,b)};d.useReducer=function(a,b,c){return t().useReducer(a,b,c)};d.useRef=function(a){return t().useRef(a)};d.useState=function(a){return t().useState(a)};d.version="16.13.1"});
diff --git a/browser/components/preferences/in-content/privacy.js b/browser/components/preferences/in-content/privacy.js
index 45a46b019438..4dbebfcddeaf 100644
--- a/browser/components/preferences/in-content/privacy.js
+++ b/browser/components/preferences/in-content/privacy.js
@@ -1933,7 +1933,7 @@ var gPrivacyPane = {
         window,
         false
       );
-      if (!loggedIn) {
+      if (!loggedIn.authenticated) {
         return;
       }
     }
diff --git a/browser/components/protections/content/protections.css b/browser/components/protections/content/protections.css
index b9c5d41ce326..9a5739163bf6 100644
--- a/browser/components/protections/content/protections.css
+++ b/browser/components/protections/content/protections.css
@@ -234,7 +234,7 @@ a.hidden,
   padding-inline: 24px 3px;
   -moz-context-properties: fill;
   fill: currentColor;
-  background: url("chrome://browser/skin/settings.svg") no-repeat 3px 3px;
+  background: url("chrome://browser/skin/settings.svg") no-repeat 3px;
   font-size: 0.75em;
   cursor: default;
   width: max-content;
diff --git a/browser/components/urlbar/UrlbarInput.jsm b/browser/components/urlbar/UrlbarInput.jsm
index d93c7429f46d..91c24d3a9281 100644
--- a/browser/components/urlbar/UrlbarInput.jsm
+++ b/browser/components/urlbar/UrlbarInput.jsm
@@ -321,7 +321,7 @@ class UrlbarInput {
       valid = true;
     }
 
-    let isDifferentValidValue = valid && value != this.value;
+    let isDifferentValidValue = valid && value != this.untrimmedValue;
     this.value = value;
     this.valueIsTyped = !valid;
     this.removeAttribute("usertyping");
@@ -786,6 +786,11 @@ class UrlbarInput {
   setValueFromResult(result = null, event = null) {
     let canonizedUrl;
 
+    // Usually this is set by a previous input event, but in certain cases, like
+    // when opening Top Sites on a loaded page, it wouldn't happen. To avoid
+    // confusing the user, we always enforce it when a result changes our value.
+    this.setPageProxyState("invalid", true);
+
     if (!result) {
       // This usually happens when there's no selected results (the user cycles
       // through results and there was no heuristic), and we reset the input
diff --git a/browser/components/urlbar/tests/browser/browser_top_sites.js b/browser/components/urlbar/tests/browser/browser_top_sites.js
index 24d37537bc3c..186907bfec9b 100644
--- a/browser/components/urlbar/tests/browser/browser_top_sites.js
+++ b/browser/components/urlbar/tests/browser/browser_top_sites.js
@@ -43,6 +43,9 @@ add_task(async function topSitesShown() {
     "The test suite browser should have 6 Top Sites."
   );
   await UrlbarTestUtils.promisePopupOpen(window, () => {
+    if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+      gURLBar.handleRevert();
+    }
     EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {});
   });
   Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open.");
@@ -87,6 +90,9 @@ add_task(async function selectSearchTopSite() {
     true
   );
   await UrlbarTestUtils.promisePopupOpen(window, () => {
+    if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+      gURLBar.handleRevert();
+    }
     EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {});
   });
   await UrlbarTestUtils.promiseSearchComplete(window);
@@ -150,6 +156,9 @@ add_task(async function topSitesBookmarksAndTabs() {
   );
 
   await UrlbarTestUtils.promisePopupOpen(window, () => {
+    if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+      gURLBar.handleRevert();
+    }
     EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {});
   });
   Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open.");
@@ -189,6 +198,54 @@ add_task(async function topSitesBookmarksAndTabs() {
   });
 });
 
+add_task(async function topSitesKeywordNavigationPageproxystate() {
+  Assert.equal(
+    gURLBar.getAttribute("pageproxystate"),
+    "valid",
+    "Sanity check initial state"
+  );
+
+  await UrlbarTestUtils.promisePopupOpen(window, () => {
+    if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+      gURLBar.handleRevert();
+    }
+    EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {});
+  });
+  Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open.");
+  await UrlbarTestUtils.promiseSearchComplete(window);
+
+  let count = UrlbarTestUtils.getResultCount(window);
+  Assert.equal(count, 7, "The number of results should be the expected one.");
+
+  for (let i = 0; i < count; ++i) {
+    EventUtils.synthesizeKey("KEY_ArrowDown");
+    Assert.equal(
+      gURLBar.getAttribute("pageproxystate"),
+      "invalid",
+      "Moving through results"
+    );
+  }
+  for (let i = 0; i < count; ++i) {
+    EventUtils.synthesizeKey("KEY_ArrowUp");
+    Assert.equal(
+      gURLBar.getAttribute("pageproxystate"),
+      "invalid",
+      "Moving through results"
+    );
+  }
+
+  // Double ESC should restore state.
+  await UrlbarTestUtils.promisePopupClose(window, () => {
+    EventUtils.synthesizeKey("KEY_Escape");
+  });
+  EventUtils.synthesizeKey("KEY_Escape");
+  Assert.equal(
+    gURLBar.getAttribute("pageproxystate"),
+    "valid",
+    "Double ESC should restore state"
+  );
+});
+
 add_task(async function topSitesDisabled() {
   // Disable top sites.
   await SpecialPowers.pushPrefEnv({
@@ -205,6 +262,9 @@ add_task(async function topSitesDisabled() {
 
   // Open the view.
   await UrlbarTestUtils.promisePopupOpen(window, () => {
+    if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+      gURLBar.handleRevert();
+    }
     EventUtils.synthesizeMouseAtCenter(window.gURLBar.inputField, {});
   });
   Assert.ok(window.gURLBar.view.isOpen, "UrlbarView should be open.");
diff --git a/browser/config/version_display.txt b/browser/config/version_display.txt
index 097167986683..e69b6d18e6d4 100644
--- a/browser/config/version_display.txt
+++ b/browser/config/version_display.txt
@@ -1 +1 @@
-76.0b1
+76.0b6
diff --git a/browser/extensions/formautofill/FormAutofillParent.jsm b/browser/extensions/formautofill/FormAutofillParent.jsm
index 46f4b94140c9..e3a11481593a 100644
--- a/browser/extensions/formautofill/FormAutofillParent.jsm
+++ b/browser/extensions/formautofill/FormAutofillParent.jsm
@@ -341,7 +341,7 @@ class FormAutofillParent extends JSWindowActorParent {
         break;
       }
       case "FormAutofill:SaveCreditCard": {
-        if (!(await FormAutofillUtils.ensureLoggedIn())) {
+        if (!(await FormAutofillUtils.ensureLoggedIn()).authenticated) {
           log.warn("User canceled encryption login");
           return undefined;
         }
@@ -690,7 +690,7 @@ class FormAutofillParent extends JSWindowActorParent {
         return;
       }
 
-      if (!(await FormAutofillUtils.ensureLoggedIn())) {
+      if (!(await FormAutofillUtils.ensureLoggedIn()).authenticated) {
         log.warn("User canceled encryption login");
         return;
       }
diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh
index b091d8fddfbe..ef40317486c9 100755
--- a/browser/installer/windows/nsis/shared.nsh
+++ b/browser/installer/windows/nsis/shared.nsh
@@ -506,6 +506,11 @@ ${EndIf}
 !macroend
 !define SetHandlers "!insertmacro SetHandlers"
 
+!macro WriteApplicationsSupportedType RegKey Type
+  WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" "${Type}" ""
+!macroend
+!define WriteApplicationsSupportedType "!insertmacro WriteApplicationsSupportedType"
+
 ; Adds the HKLM\Software\Clients\StartMenuInternet\Firefox-[pathhash] registry
 ; entries (does not use SHCTX).
 ;
@@ -605,20 +610,44 @@ ${EndIf}
     ; If we're going to create this key at all, we also need to list our supported
     ; file types in it, because otherwise we'll be shown as a suggestion for every
     ; single file type, whether we support it in any way or not.
-    WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \
-                ".htm" ""
-    WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \
-                ".html" ""
-    WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \
-                ".shtml" ""
-    WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \
-                ".xht" ""
-    WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \
-                ".xhtml" ""
-    WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \
-                ".svg" ""
-    WriteRegStr ${RegKey} "Software\Classes\Applications\${FileMainEXE}\SupportedTypes" \
-                ".webp" ""
+    ; We take a more expansive approach to the set of file types registered
+    ; here compared to elsewhere because this key is interpreted by the OS as
+    ; containing every file type that we can possibly open, so if something
+    ; isn't listed it assumes we can't open it and hides us from e.g. the Open
+    ; With context menu, even if the user has tried to add us there manually.
+    ; The list here was derived from the file /layout/build/components.conf,
+    ; filtered down to only those types which make sense to open on their own
+    ; in Firefox, basically meaning that plain text file types were left out,
+    ; but not JSON or XML types because we have specific viewers for those.
+    ${WriteApplicationsSupportedType} ${RegKey} ".apng"
+    ${WriteApplicationsSupportedType} ${RegKey} ".bmp"
+    ${WriteApplicationsSupportedType} ${RegKey} ".flac"
+    ${WriteApplicationsSupportedType} ${RegKey} ".gif"
+    ${WriteApplicationsSupportedType} ${RegKey} ".htm"
+    ${WriteApplicationsSupportedType} ${RegKey} ".html"
+    ${WriteApplicationsSupportedType} ${RegKey} ".ico"
+    ${WriteApplicationsSupportedType} ${RegKey} ".jfif"
+    ${WriteApplicationsSupportedType} ${RegKey} ".jpeg"
+    ${WriteApplicationsSupportedType} ${RegKey} ".jpg"
+    ${WriteApplicationsSupportedType} ${RegKey} ".json"
+    ${WriteApplicationsSupportedType} ${RegKey} ".m4a"
+    ${WriteApplicationsSupportedType} ${RegKey} ".mp3"
+    ${WriteApplicationsSupportedType} ${RegKey} ".oga"
+    ${WriteApplicationsSupportedType} ${RegKey} ".ogg"
+    ${WriteApplicationsSupportedType} ${RegKey} ".ogv"
+    ${WriteApplicationsSupportedType} ${RegKey} ".opus"
+    ${WriteApplicationsSupportedType} ${RegKey} ".pdf"
+    ${WriteApplicationsSupportedType} ${RegKey} ".pjpeg"
+    ${WriteApplicationsSupportedType} ${RegKey} ".pjp"
+    ${WriteApplicationsSupportedType} ${RegKey} ".png"
+    ${WriteApplicationsSupportedType} ${RegKey} ".rdf"
+    ${WriteApplicationsSupportedType} ${RegKey} ".shtml"
+    ${WriteApplicationsSupportedType} ${RegKey} ".svg"
+    ${WriteApplicationsSupportedType} ${RegKey} ".webm"
+    ${WriteApplicationsSupportedType} ${RegKey} ".webp"
+    ${WriteApplicationsSupportedType} ${RegKey} ".xht"
+    ${WriteApplicationsSupportedType} ${RegKey} ".xhtml"
+    ${WriteApplicationsSupportedType} ${RegKey} ".xml"
   ${EndIf}
 !macroend
 !define SetStartMenuInternet "!insertmacro SetStartMenuInternet"
diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi
index 16b9b1c72834..5b8e7c9d1703 100755
--- a/browser/installer/windows/nsis/uninstaller.nsi
+++ b/browser/installer/windows/nsis/uninstaller.nsi
@@ -460,7 +460,7 @@ Section "Uninstall"
 
   ; Uninstall the default browser agent scheduled task.
   ; This also removes the registry entries it creates.
-  Exec '"$INSTDIR\default-browser-agent.exe" unregister-task $AppUserModelID'
+  ExecWait '"$INSTDIR\default-browser-agent.exe" unregister-task $AppUserModelID'
 
   ${un.RemovePrecompleteEntries} "false"
 
diff --git a/browser/locales/l10n-changesets.json b/browser/locales/l10n-changesets.json
index f7e477f8b0c0..f065716542f5 100644
--- a/browser/locales/l10n-changesets.json
+++ b/browser/locales/l10n-changesets.json
@@ -14,7 +14,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a8e73b9557fc"
+        "revision": "60ac15515db3"
     },
     "af": {
         "platforms": [
@@ -31,7 +31,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "813d51f5f62e"
+        "revision": "9e536e74ce12"
     },
     "an": {
         "platforms": [
@@ -48,7 +48,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "52bf37156a36"
+        "revision": "b9a24a96f788"
     },
     "ar": {
         "platforms": [
@@ -65,7 +65,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ae9f937c138e"
+        "revision": "471f0e44c311"
     },
     "ast": {
         "platforms": [
@@ -82,7 +82,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "85ec2fa70911"
+        "revision": "8077f557a738"
     },
     "az": {
         "platforms": [
@@ -99,7 +99,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "95288b2f9830"
+        "revision": "7ddb72fcaa23"
     },
     "be": {
         "platforms": [
@@ -116,7 +116,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "bc58cd411a53"
+        "revision": "4160b1aa3405"
     },
     "bg": {
         "platforms": [
@@ -133,7 +133,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "0b026cc5aaef"
+        "revision": "6a1d92e050cf"
     },
     "bn": {
         "platforms": [
@@ -150,7 +150,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "7d09c80c97d9"
+        "revision": "5763bc876d44"
     },
     "br": {
         "platforms": [
@@ -167,7 +167,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "80e7f4f6f20a"
+        "revision": "4a1851560bf1"
     },
     "bs": {
         "platforms": [
@@ -184,7 +184,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "2492d7f5ea78"
+        "revision": "b5166857f653"
     },
     "ca": {
         "platforms": [
@@ -201,7 +201,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "c358fb7c5a93"
+        "revision": "dce0366dd43d"
     },
     "ca-valencia": {
         "platforms": [
@@ -218,7 +218,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ea31957a0c35"
+        "revision": "d4cfce5f0199"
     },
     "cak": {
         "platforms": [
@@ -235,7 +235,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "6efa849aa6f4"
+        "revision": "3b137bdd17d2"
     },
     "cs": {
         "platforms": [
@@ -252,7 +252,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "c1e454141681"
+        "revision": "4ce7d7b8edb0"
     },
     "cy": {
         "platforms": [
@@ -269,7 +269,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "f4e3fa995ef3"
+        "revision": "b1ebedf46a6a"
     },
     "da": {
         "platforms": [
@@ -286,7 +286,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "03a2576e0b62"
+        "revision": "51d69cdac5ef"
     },
     "de": {
         "platforms": [
@@ -303,7 +303,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "65df9763a30d"
+        "revision": "1299e3fd1372"
     },
     "dsb": {
         "platforms": [
@@ -320,7 +320,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "487b957514d0"
+        "revision": "03284d710304"
     },
     "el": {
         "platforms": [
@@ -337,7 +337,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "b856307f21f7"
+        "revision": "0fce8bf04d07"
     },
     "en-CA": {
         "platforms": [
@@ -354,7 +354,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "7ee70da1246f"
+        "revision": "470e1baac9b9"
     },
     "en-GB": {
         "platforms": [
@@ -371,7 +371,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "8a6cd5366bb4"
+        "revision": "f66463c44006"
     },
     "eo": {
         "platforms": [
@@ -388,7 +388,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "9ba898797c9a"
+        "revision": "3d2c852d28b4"
     },
     "es-AR": {
         "platforms": [
@@ -405,7 +405,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "9235862e2764"
+        "revision": "19b93bbde3d3"
     },
     "es-CL": {
         "platforms": [
@@ -422,7 +422,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "6c920f8a5a84"
+        "revision": "e70b94142329"
     },
     "es-ES": {
         "platforms": [
@@ -439,7 +439,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ac5f8bc23aa0"
+        "revision": "a5796389eaf5"
     },
     "es-MX": {
         "platforms": [
@@ -456,7 +456,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "7dc9ff27ee85"
+        "revision": "ce40075973db"
     },
     "et": {
         "platforms": [
@@ -473,7 +473,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a08596786389"
+        "revision": "adf3f128dc69"
     },
     "eu": {
         "platforms": [
@@ -490,7 +490,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "c6d6b9cd7dcd"
+        "revision": "e0ecc5128dca"
     },
     "fa": {
         "platforms": [
@@ -507,7 +507,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "3f3ae3689e76"
+        "revision": "1acedf644223"
     },
     "ff": {
         "platforms": [
@@ -524,7 +524,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "fe1900462912"
+        "revision": "ee1438e2918e"
     },
     "fi": {
         "platforms": [
@@ -541,7 +541,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a0411378bb4c"
+        "revision": "bcafb6c221ea"
     },
     "fr": {
         "platforms": [
@@ -558,7 +558,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ecb6bbd84382"
+        "revision": "986ae59956a1"
     },
     "fy-NL": {
         "platforms": [
@@ -575,7 +575,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "6fbe78d4acad"
+        "revision": "3f61217ce280"
     },
     "ga-IE": {
         "platforms": [
@@ -592,7 +592,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "4c54dc829afd"
+        "revision": "a14f1e7b4089"
     },
     "gd": {
         "platforms": [
@@ -609,7 +609,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "2439a0322ab1"
+        "revision": "e2e42c718a2b"
     },
     "gl": {
         "platforms": [
@@ -626,7 +626,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "0055707aa718"
+        "revision": "48fda83a2a70"
     },
     "gn": {
         "platforms": [
@@ -643,7 +643,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "d99e0018135b"
+        "revision": "cc9b3b4d8338"
     },
     "gu-IN": {
         "platforms": [
@@ -660,7 +660,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "5861f91c9142"
+        "revision": "86b1098ae36c"
     },
     "he": {
         "platforms": [
@@ -677,7 +677,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ff0a4d49fc9f"
+        "revision": "db911a9ee52c"
     },
     "hi-IN": {
         "platforms": [
@@ -694,7 +694,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a05893948fbb"
+        "revision": "7144369af595"
     },
     "hr": {
         "platforms": [
@@ -711,7 +711,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "c708a22fca65"
+        "revision": "ae4c238100eb"
     },
     "hsb": {
         "platforms": [
@@ -728,7 +728,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "173d2211c5de"
+        "revision": "c18f01fcadf5"
     },
     "hu": {
         "platforms": [
@@ -745,7 +745,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a8517a2ebaf2"
+        "revision": "5d0dc98e1a01"
     },
     "hy-AM": {
         "platforms": [
@@ -762,7 +762,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "1b612c698334"
+        "revision": "c19cf92ebc15"
     },
     "ia": {
         "platforms": [
@@ -779,7 +779,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "531c78827fac"
+        "revision": "1066f6851a57"
     },
     "id": {
         "platforms": [
@@ -796,7 +796,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "356331c9508f"
+        "revision": "f08b5b2476c6"
     },
     "is": {
         "platforms": [
@@ -813,7 +813,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a9d1dbe033f2"
+        "revision": "236b6c0a8114"
     },
     "it": {
         "platforms": [
@@ -830,7 +830,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "4e2970abb9d0"
+        "revision": "783c4a702603"
     },
     "ja": {
         "platforms": [
@@ -845,14 +845,14 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "0e0cf5d0042a"
+        "revision": "53409d1b9a80"
     },
     "ja-JP-mac": {
         "platforms": [
             "macosx64",
             "macosx64-devedition"
         ],
-        "revision": "5ea03acdb131"
+        "revision": "255210ef04a1"
     },
     "ka": {
         "platforms": [
@@ -869,7 +869,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "9d650ef3f4f5"
+        "revision": "b6a95f8803cf"
     },
     "kab": {
         "platforms": [
@@ -886,7 +886,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "f4d1d0c25912"
+        "revision": "e615a861b948"
     },
     "kk": {
         "platforms": [
@@ -903,7 +903,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "068b291f689a"
+        "revision": "07814f160f73"
     },
     "km": {
         "platforms": [
@@ -920,7 +920,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ebe97e39b630"
+        "revision": "5ef756e32960"
     },
     "kn": {
         "platforms": [
@@ -937,7 +937,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "07565ae6cb50"
+        "revision": "aa1fbdb56ea0"
     },
     "ko": {
         "platforms": [
@@ -954,7 +954,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "c48fb21eea74"
+        "revision": "7434834dfd48"
     },
     "lij": {
         "platforms": [
@@ -971,7 +971,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "1cf9e72f1dbb"
+        "revision": "f4d88de83247"
     },
     "lt": {
         "platforms": [
@@ -988,7 +988,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a881c91becb4"
+        "revision": "0b85f1ae3c3e"
     },
     "lv": {
         "platforms": [
@@ -1005,7 +1005,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a944366cc8f5"
+        "revision": "cecd28c90654"
     },
     "mk": {
         "platforms": [
@@ -1022,7 +1022,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "48726fa78404"
+        "revision": "52b8f839cf6b"
     },
     "mr": {
         "platforms": [
@@ -1039,7 +1039,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "3bb44a611e9a"
+        "revision": "c77e4468b4b4"
     },
     "ms": {
         "platforms": [
@@ -1056,7 +1056,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "50773fdde329"
+        "revision": "1f033ed85e75"
     },
     "my": {
         "platforms": [
@@ -1073,7 +1073,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "920d1a52038f"
+        "revision": "5382a4a7e330"
     },
     "nb-NO": {
         "platforms": [
@@ -1090,7 +1090,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "3e958c33d216"
+        "revision": "eeb68f2d374c"
     },
     "ne-NP": {
         "platforms": [
@@ -1107,7 +1107,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "8842f750206f"
+        "revision": "379acbb4fe75"
     },
     "nl": {
         "platforms": [
@@ -1124,7 +1124,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "77c074fce875"
+        "revision": "f6ebedc73abc"
     },
     "nn-NO": {
         "platforms": [
@@ -1141,7 +1141,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "81a8132db0ea"
+        "revision": "6343d32ad901"
     },
     "oc": {
         "platforms": [
@@ -1158,7 +1158,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "c0ec97c9655e"
+        "revision": "11e89c9a9a15"
     },
     "pa-IN": {
         "platforms": [
@@ -1175,7 +1175,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "4f7d85fda0af"
+        "revision": "3a9e0a35d655"
     },
     "pl": {
         "platforms": [
@@ -1192,7 +1192,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "38dbb1c4aff5"
+        "revision": "d4ed5ed70d5d"
     },
     "pt-BR": {
         "platforms": [
@@ -1209,7 +1209,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "8eaa154f3a30"
+        "revision": "6bb51095f3e0"
     },
     "pt-PT": {
         "platforms": [
@@ -1226,7 +1226,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ab07bfc80e7b"
+        "revision": "d778eafc508c"
     },
     "rm": {
         "platforms": [
@@ -1243,7 +1243,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "5731c96c50e8"
+        "revision": "1834e92c1d81"
     },
     "ro": {
         "platforms": [
@@ -1260,7 +1260,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "6fcc3b058bb4"
+        "revision": "cc8c351b64ca"
     },
     "ru": {
         "platforms": [
@@ -1277,7 +1277,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ad1c74cc8188"
+        "revision": "50ab49d57f5c"
     },
     "si": {
         "platforms": [
@@ -1294,7 +1294,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "71e2e8c1aa83"
+        "revision": "b7a4c2aad443"
     },
     "sk": {
         "platforms": [
@@ -1311,7 +1311,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "b268e4643355"
+        "revision": "df56fd163cad"
     },
     "sl": {
         "platforms": [
@@ -1328,7 +1328,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "0264695cad75"
+        "revision": "850a439fcb8d"
     },
     "son": {
         "platforms": [
@@ -1345,7 +1345,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "d6895ca679be"
+        "revision": "220a82ec364c"
     },
     "sq": {
         "platforms": [
@@ -1362,7 +1362,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a4762980152a"
+        "revision": "f188c24c537c"
     },
     "sr": {
         "platforms": [
@@ -1379,7 +1379,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "c97eee9e13b9"
+        "revision": "3db79780f4f3"
     },
     "sv-SE": {
         "platforms": [
@@ -1396,7 +1396,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "a027c730364f"
+        "revision": "f2f89a8d149b"
     },
     "ta": {
         "platforms": [
@@ -1413,7 +1413,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "e46a33fb213c"
+        "revision": "95f68a6356dd"
     },
     "te": {
         "platforms": [
@@ -1430,7 +1430,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "3654aac693b6"
+        "revision": "a0571be8190c"
     },
     "th": {
         "platforms": [
@@ -1447,7 +1447,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "2602cd18b0bb"
+        "revision": "f9d7ccac9441"
     },
     "tl": {
         "platforms": [
@@ -1464,7 +1464,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "427c9ee3a1ce"
+        "revision": "39794888c7b1"
     },
     "tr": {
         "platforms": [
@@ -1481,7 +1481,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "621e71ae044f"
+        "revision": "b82a33db222c"
     },
     "trs": {
         "platforms": [
@@ -1498,7 +1498,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "233b0f68a061"
+        "revision": "708276a44cf3"
     },
     "uk": {
         "platforms": [
@@ -1515,7 +1515,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "91336afdb618"
+        "revision": "c805769b84b8"
     },
     "ur": {
         "platforms": [
@@ -1532,7 +1532,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "e8c0879d04c6"
+        "revision": "45a100439fc9"
     },
     "uz": {
         "platforms": [
@@ -1549,7 +1549,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "ef762dcbce1d"
+        "revision": "b98bac8f6c55"
     },
     "vi": {
         "platforms": [
@@ -1566,7 +1566,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "336a342b9b1d"
+        "revision": "ddf89f86aa53"
     },
     "xh": {
         "platforms": [
@@ -1583,7 +1583,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "1c9d19ddc8e3"
+        "revision": "a9b7f26ac216"
     },
     "zh-CN": {
         "platforms": [
@@ -1600,7 +1600,7 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "e2dd4692a2cb"
+        "revision": "152a1bc43f0b"
     },
     "zh-TW": {
         "platforms": [
@@ -1617,6 +1617,6 @@
             "win64-aarch64-devedition",
             "win64-devedition"
         ],
-        "revision": "23b796922728"
+        "revision": "674289f83c58"
     }
 }
\ No newline at end of file
diff --git a/browser/themes/shared/browser.inc.css b/browser/themes/shared/browser.inc.css
index 8a61b3a08afb..3ddaaf3bd2c5 100644
--- a/browser/themes/shared/browser.inc.css
+++ b/browser/themes/shared/browser.inc.css
@@ -61,7 +61,7 @@
 #PersonalToolbar {
   overflow: -moz-hidden-unscrollable;
   max-height: 4em;
-  padding: 0 6px 2px;
+  padding: 2px 6px;
 }
 
 :root[uidensity=compact] #PersonalToolbar {
diff --git a/browser/themes/shared/toolbarbuttons.inc.css b/browser/themes/shared/toolbarbuttons.inc.css
index cc8d02053746..3c709cbaf288 100644
--- a/browser/themes/shared/toolbarbuttons.inc.css
+++ b/browser/themes/shared/toolbarbuttons.inc.css
@@ -314,17 +314,17 @@ toolbar .toolbarbutton-1:-moz-focusring {
 
 toolbarbutton.bookmark-item:not(.subviewbutton) {
   margin: 0 2px;
-  padding: 2px 4px;
+  padding: 4px;
   -moz-appearance: none;
 }
 
 :root[uidensity=compact] toolbarbutton.bookmark-item:not(.subviewbutton) {
-  margin: 0 1px;
-  padding: 1px 4px;
+  margin-inline: 1px;
+  padding-block: 1px;
 }
 
 :root[uidensity=touch] toolbarbutton.bookmark-item:not(.subviewbutton) {
-  padding: 4px;
+  padding-block: 7px;
 }
 
 toolbarbutton.bookmark-item {
diff --git a/browser/tools/mozscreenshots/permissionPrompts/browser.ini b/browser/tools/mozscreenshots/permissionPrompts/browser.ini
index 65ce1a6fac75..9a97184c738a 100644
--- a/browser/tools/mozscreenshots/permissionPrompts/browser.ini
+++ b/browser/tools/mozscreenshots/permissionPrompts/browser.ini
@@ -2,6 +2,9 @@
 subsuite = screenshots
 support-files =
   ../head.js
-  
+prefs =
+  signon.testOnlyUserHasInteractedByPrefValue=true
+  signon.testOnlyUserHasInteractedWithDocument=true
+
 [browser_permissionPrompts.js]
 skip-if = os == 'mac' # times out on macosx1014, see 1570098
diff --git a/build/defines.sh b/build/defines.sh
index 9de47c446b5b..cf98c3d8bf72 100644
--- a/build/defines.sh
+++ b/build/defines.sh
@@ -1,3 +1,3 @@
 # Define indicating that this build is prior to one of the early betas. To be
 # unset mid-way through the beta cycle.
-EARLY_BETA_OR_EARLIER=1
+EARLY_BETA_OR_EARLIER=
diff --git a/comm/.gecko_rev.yml b/comm/.gecko_rev.yml
index 153e810c4c82..61f01e2ae7e4 100644
--- a/comm/.gecko_rev.yml
+++ b/comm/.gecko_rev.yml
@@ -1,7 +1,8 @@
 ---
 GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified
 GECKO_HEAD_REPOSITORY: https://hg.mozilla.org/releases/mozilla-beta
-GECKO_HEAD_REV: b4ef8571957b03316302e9dd21979a0d2612f648
+GECKO_HEAD_REF: FIREFOX_76_0b6_RELEASE
+GECKO_HEAD_REV: d64d5ccf2b14498b6de0bb18c4e9e66abae5efce
 
 ### For comm-central
 # GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified
diff --git a/comm/chat/components/public/imIConversationsService.idl b/comm/chat/components/public/imIConversationsService.idl
index 5a360a357803..12975b67c9cf 100644
--- a/comm/chat/components/public/imIConversationsService.idl
+++ b/comm/chat/components/public/imIConversationsService.idl
@@ -16,12 +16,14 @@ interface imIConversation: prplIConversation {
 
   // Write a system message into the conversation.
   // Note: this will not be logged.
-  void systemMessage(in AUTF8String aMessage, [optional] in boolean aIsError);
+  void systemMessage(in AUTF8String aMessage,
+                     [optional] in boolean aIsError,
+                     [optional] in boolean aNoCollapse);
 
   // Write a system message into the conversation and trigger the udpate of the
   // notification counter during an off-the-record authentication request.
   // Note: this will not be logged.
-  void notificationOTR(in AUTF8String aMessage);
+  void notifyVerifyOTR(in AUTF8String aMessage);
 
   attribute prplIConversation target;
 
diff --git a/comm/chat/components/public/prplIMessage.idl b/comm/chat/components/public/prplIMessage.idl
index 034c60f3d454..f4d5b19c4659 100644
--- a/comm/chat/components/public/prplIMessage.idl
+++ b/comm/chat/components/public/prplIMessage.idl
@@ -65,6 +65,8 @@ interface prplIMessage: nsISupports {
   readonly attribute boolean notification;
   /*  PURPLE_MESSAGE_NO_LINKIFY  = 0x4000  /**< Message should not be auto-linkified */
   readonly attribute boolean noLinkification;
+  /* Do not collapse the message. */
+  readonly attribute boolean noCollapse;
 
   /**
    * Get an array of actions the user may perform on this message.
diff --git a/comm/chat/components/src/imConversations.jsm b/comm/chat/components/src/imConversations.jsm
index bea430f749f7..f53b64ea803c 100644
--- a/comm/chat/components/src/imConversations.jsm
+++ b/comm/chat/components/src/imConversations.jsm
@@ -114,6 +114,9 @@ imMessage.prototype = {
   get noLinkification() {
     return this.prplMessage.noLinkification;
   },
+  get noCollapse() {
+    return this.prplMessage.noCollapse;
+  },
   get originalMessage() {
     return this.prplMessage.originalMessage;
   },
@@ -445,14 +448,25 @@ UIConversation.prototype = {
     this.notifyObservers(aSubject, aTopic, aData);
   },
 
-  systemMessage(aText, aIsError) {
-    let flags = { system: true, noLog: true, error: !!aIsError };
+  systemMessage(aText, aIsError, aNoCollapse) {
+    let flags = {
+      system: true,
+      noLog: true,
+      error: !!aIsError,
+      noCollapse: !!aNoCollapse,
+    };
     new Message("system", aText, flags).conversation = this;
   },
 
-  notificationOTR(aText) {
+  /**
+   * Emit a notification sound for a new chat message and trigger the
+   * global notificationbox to prompt the user with the verifiation request.
+   *
+   * @param String aText - The system message.
+   */
+  notifyVerifyOTR(aText) {
     this._unreadOTRNotificationCount++;
-    this.systemMessage(aText);
+    this.systemMessage(aText, false, true);
     for (let observer of this._observers) {
       observer.observe(
         this,
diff --git a/comm/chat/modules/OTR.jsm b/comm/chat/modules/OTR.jsm
index 32d28acfaa45..1b389e8f2a9f 100644
--- a/comm/chat/modules/OTR.jsm
+++ b/comm/chat/modules/OTR.jsm
@@ -1136,7 +1136,7 @@ var OTR = {
   },
 
   sendAlert(context, msg) {
-    this.getUIConvFromContext(context).systemMessage(msg);
+    this.getUIConvFromContext(context).systemMessage(msg, false, true);
   },
 
   observe(aObject, aTopic, aMsg) {
diff --git a/comm/chat/modules/OTRUI.jsm b/comm/chat/modules/OTRUI.jsm
index c182342619c9..f1237e170f8b 100644
--- a/comm/chat/modules/OTRUI.jsm
+++ b/comm/chat/modules/OTRUI.jsm
@@ -331,7 +331,11 @@ var OTRUI = {
   },
 
   sendSystemAlert(uiConv, conv, bundleId) {
-    uiConv.systemMessage(_strArgs(bundleId, { name: conv.normalizedName }));
+    uiConv.systemMessage(
+      _strArgs(bundleId, { name: conv.normalizedName }),
+      false,
+      true
+    );
   },
 
   setNotificationBox(notificationbox) {
@@ -429,7 +433,7 @@ var OTRUI = {
         } else {
           msg = syncL10n.formatValueSync(id, { name: context.username });
         }
-        uiConv.systemMessage(msg);
+        uiConv.systemMessage(msg, false, true);
       }
     } catch (e) {
       OTRUI.noOtrPossible(otrContainer, context);
@@ -460,7 +464,9 @@ var OTRUI = {
     let uiConv = OTR.getUIConvFromContext(context);
     let trust = OTRUI.getTrustSettings(context);
     uiConv.systemMessage(
-      _strArgs("afterauth-" + trust.class, { name: context.username })
+      _strArgs("afterauth-" + trust.class, { name: context.username }),
+      false,
+      true
     );
   },
 
@@ -478,7 +484,7 @@ var OTRUI = {
     let name = uiConv.target.normalizedName;
     let msg = _strArgs("verify-request", { name });
     // Trigger the udpate of the unread message counter.
-    uiConv.notificationOTR(msg);
+    uiConv.notifyVerifyOTR(msg);
     Services.obs.notifyObservers(uiConv, "new-otr-verification-request");
 
     // Trigger the inline notification.
diff --git a/comm/chat/modules/imThemes.jsm b/comm/chat/modules/imThemes.jsm
index 051ec3d793ef..f063e4cceacf 100644
--- a/comm/chat/modules/imThemes.jsm
+++ b/comm/chat/modules/imThemes.jsm
@@ -474,6 +474,9 @@ var statusMessageReplacements = {
     if (aMsg.noFormat) {
       msgClass.push("monospaced");
     }
+    if (aMsg.noCollapse) {
+      msgClass.push("no-collapse");
+    }
 
     return msgClass.join(" ");
   },
diff --git a/comm/chat/modules/jsProtoHelper.jsm b/comm/chat/modules/jsProtoHelper.jsm
index c9b1fd8a7bfe..32d8f3bb6d42 100644
--- a/comm/chat/modules/jsProtoHelper.jsm
+++ b/comm/chat/modules/jsProtoHelper.jsm
@@ -593,6 +593,7 @@ var GenericMessagePrototype = {
   containsImages: false,
   notification: false,
   noLinkification: false,
+  noCollapse: false,
 
   getActions() {
     return [];
diff --git a/comm/mail/base/content/mailWindowOverlay.js b/comm/mail/base/content/mailWindowOverlay.js
index d10f91afb838..c846d3f2c1e3 100644
--- a/comm/mail/base/content/mailWindowOverlay.js
+++ b/comm/mail/base/content/mailWindowOverlay.js
@@ -1501,7 +1501,13 @@ function populateHistoryMenu(menuPopup, isBackMenu) {
     );
 
     var menuText = "";
-    var msgHdr = messenger.msgHdrFromURI(historyArray[i]);
+    var msgHdr;
+    try {
+      msgHdr = messenger.msgHdrFromURI(historyArray[i]);
+    } catch (ex) {
+      // Let's just ignore this history entry.
+      continue;
+    }
     var msgSubject = msgHdr.mime2DecodedSubject;
     var msgAuthor = msgHdr.mime2DecodedAuthor;
 
diff --git a/comm/mail/base/content/messenger.xhtml b/comm/mail/base/content/messenger.xhtml
index d2aecac36eaf..176ad3c5cd30 100644
--- a/comm/mail/base/content/messenger.xhtml
+++ b/comm/mail/base/content/messenger.xhtml
@@ -933,7 +933,10 @@
       <!-- notificationbox will be added here lazily. -->
   </hbox>
   <statuspanel id="statusbar-display"/>
-  <hbox id="status-bar" class="statusbar chromeclass-status" role="status">
+  <hbox id="status-bar"
+        class="statusbar chromeclass-status"
+        role="status"
+        aria-live="off">
 #include mainStatusbar.inc.xhtml
     <hbox id="calendar-invitations-panel"
           class="statusbarpanel"
diff --git a/comm/mail/components/extensions/ExtensionToolbarButtons.jsm b/comm/mail/components/extensions/ExtensionToolbarButtons.jsm
index 394342f474b9..e9aef44451e0 100644
--- a/comm/mail/components/extensions/ExtensionToolbarButtons.jsm
+++ b/comm/mail/components/extensions/ExtensionToolbarButtons.jsm
@@ -468,8 +468,13 @@ this.ToolbarButtonAPI = class extends ExtensionAPI {
   async updateOnChange(target) {
     if (target) {
       let window = Cu.getGlobalForObject(target);
-      if (target === window || target.selected) {
+      if (target === window) {
         await this.updateWindow(window);
+      } else {
+        let tabmail = window.document.getElementById("tabmail");
+        if (tabmail && target == tabmail.selectedTab) {
+          await this.updateWindow(window);
+        }
       }
     } else {
       let promises = [];
diff --git a/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js b/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js
index 9827985b296a..cd31cb79182c 100644
--- a/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js
+++ b/comm/mail/components/extensions/test/browser/browser_ext_browserAction_properties.js
@@ -33,7 +33,7 @@ add_task(async () => {
             browser.test.onMessage.removeListener(listener);
             resolve();
           });
-          browser.test.sendMessage("checkProperty", property, expected);
+          browser.test.sendMessage(whichTest, property, expected);
         });
       }
 
@@ -41,6 +41,8 @@ add_task(async () => {
       browser.test.assertEq(3, tabs.length);
       let tabIDs = tabs.map(t => t.id);
 
+      let whichTest = "checkProperty";
+
       await checkProperty("isEnabled", true, true, true, true);
       await browser.browserAction.disable();
       await checkProperty("isEnabled", false, false, false, false);
@@ -81,7 +83,55 @@ add_task(async () => {
         "default"
       );
 
-      await browser.tabs.remove(tabIDs[0]);
+      // Check that properties are updated without switching tabs. We might be
+      // relying on the tab switch to update the properties.
+
+      // Tab 0's enabled state doesn't reflect the default any more, so we
+      // can't just run the code above again.
+
+      browser.test.log("checkPropertyCurrent");
+      whichTest = "checkPropertyCurrent";
+
+      await checkProperty("isEnabled", true, false, true, true);
+      await browser.browserAction.disable();
+      await checkProperty("isEnabled", false, false, false, false);
+      await browser.browserAction.enable(tabIDs[0]);
+      await checkProperty("isEnabled", false, true, false, false);
+      await browser.browserAction.enable();
+      await checkProperty("isEnabled", true, true, true, true);
+      await browser.browserAction.disable();
+      await checkProperty("isEnabled", false, true, false, false);
+      await browser.browserAction.disable(tabIDs[0]);
+      await checkProperty("isEnabled", false, false, false, false);
+      await browser.browserAction.enable();
+      await checkProperty("isEnabled", true, false, true, true);
+
+      await checkProperty(
+        "getTitle",
+        "default",
+        "default",
+        "default",
+        "default"
+      );
+      await browser.browserAction.setTitle({ tabId: tabIDs[0], title: "tab0" });
+      await checkProperty("getTitle", "default", "tab0", "default", "default");
+      await browser.browserAction.setTitle({ title: "new" });
+      await checkProperty("getTitle", "new", "tab0", "new", "new");
+      await browser.browserAction.setTitle({ tabId: tabIDs[1], title: "tab1" });
+      await checkProperty("getTitle", "new", "tab0", "tab1", "new");
+      await browser.browserAction.setTitle({ tabId: tabIDs[0], title: null });
+      await checkProperty("getTitle", "new", "new", "tab1", "new");
+      await browser.browserAction.setTitle({ title: null });
+      await checkProperty("getTitle", "default", "default", "tab1", "default");
+      await browser.browserAction.setTitle({ tabId: tabIDs[1], title: null });
+      await checkProperty(
+        "getTitle",
+        "default",
+        "default",
+        "default",
+        "default"
+      );
+
       await browser.tabs.remove(tabIDs[1]);
       await browser.tabs.remove(tabIDs[2]);
       browser.test.notifyPass("finished");
@@ -104,6 +154,7 @@ add_task(async () => {
 
   let mailTabs = tabmail.tabInfo;
   is(mailTabs.length, 3);
+  tabmail.switchToTab(mailTabs[0]);
 
   await extension.startup();
 
@@ -125,6 +176,21 @@ add_task(async () => {
       }
     }
 
+    tabmail.switchToTab(mailTabs[0]);
+    extension.sendMessage();
+  });
+
+  extension.onMessage("checkPropertyCurrent", async (property, expected) => {
+    await new Promise(resolve => requestAnimationFrame(resolve));
+    switch (property) {
+      case "isEnabled":
+        is(button.disabled, !expected[0], `button 0 enabled state`);
+        break;
+      case "getTitle":
+        is(button.getAttribute("label"), expected[0], `button 0 label`);
+        break;
+    }
+
     extension.sendMessage();
   });
 
diff --git a/comm/mail/components/im/messages/bubbles/main.css b/comm/mail/components/im/messages/bubbles/main.css
index 6520757dddf4..b9d82c109f82 100644
--- a/comm/mail/components/im/messages/bubbles/main.css
+++ b/comm/mail/components/im/messages/bubbles/main.css
@@ -175,7 +175,7 @@ p *:any-link img {
   color: hsl(0, 0%, 60%);
 }
 
-.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type) {
+.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type):not(.no-collapse) {
   display: none;
 }
 
diff --git a/comm/mail/components/im/messages/mail/main.css b/comm/mail/components/im/messages/mail/main.css
index 9d4d2075cafa..35131f2aab79 100644
--- a/comm/mail/components/im/messages/mail/main.css
+++ b/comm/mail/components/im/messages/mail/main.css
@@ -132,7 +132,7 @@ p *:any-link img {
   color: GrayText;
 }
 
-.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type) {
+.hide-children > :-moz-any(p.event, hr):not(:first-of-type):not(:last-of-type):not(.no-collapse) {
   display: none;
 }
 
diff --git a/comm/mail/components/preferences/general.inc.xhtml b/comm/mail/components/preferences/general.inc.xhtml
index 4d23865cf46d..034e24894186 100644
--- a/comm/mail/components/preferences/general.inc.xhtml
+++ b/comm/mail/components/preferences/general.inc.xhtml
@@ -363,17 +363,19 @@
 
       <separator class="thin"/>
 
-      <listheader equalsize="always">
-        <treecol id="typeColumn" label="&typeColumn.label;" value="type"
-                 accesskey="&typeColumn.accesskey;" persist="sortDirection"
-                 flex="1" onclick="gGeneralPane.sort(event);"
-                 sortDirection="ascending" sort="typeDescription"/>
-        <treecol id="actionColumn" label="&actionColumn2.label;" value="action"
-                 accesskey="&actionColumn2.accesskey;" persist="sortDirection"
-                 flex="1" onclick="gGeneralPane.sort(event);"/>
-      </listheader>
-      <richlistbox id="handlersView" height="180px"
-                   preference="pref.downloads.disable_button.edit_actions"/>
+      <vbox>
+        <listheader equalsize="always">
+          <treecol id="typeColumn" label="&typeColumn.label;" value="type"
+                   accesskey="&typeColumn.accesskey;" persist="sortDirection"
+                   flex="1" onclick="gGeneralPane.sort(event);"
+                   sortDirection="ascending" sort="typeDescription"/>
+          <treecol id="actionColumn" label="&actionColumn2.label;" value="action"
+                   accesskey="&actionColumn2.accesskey;" persist="sortDirection"
+                   flex="1" onclick="gGeneralPane.sort(event);"/>
+        </listheader>
+        <richlistbox id="handlersView" height="180px"
+                     preference="pref.downloads.disable_button.edit_actions"/>
+      </vbox>
 
       <separator class="thin"/>
 
diff --git a/comm/mail/components/preferences/passwordManager.js b/comm/mail/components/preferences/passwordManager.js
index 464f712bf8cc..910a2b0a4c19 100644
--- a/comm/mail/components/preferences/passwordManager.js
+++ b/comm/mail/components/preferences/passwordManager.js
@@ -833,7 +833,7 @@ async function masterPasswordLogin(noPasswordCallback) {
         window,
         false
       );
-      if (!loggedIn) {
+      if (!loggedIn.authenticated) {
         return false;
       }
       return true;
diff --git a/comm/mail/components/preferences/privacy.js b/comm/mail/components/preferences/privacy.js
index ef1871715c53..47ca9fe0c873 100644
--- a/comm/mail/components/preferences/privacy.js
+++ b/comm/mail/components/preferences/privacy.js
@@ -352,7 +352,7 @@ var gPrivacyPane = {
         window,
         false
       );
-      if (!loggedIn) {
+      if (!loggedIn.authenticated) {
         return;
       }
     }
diff --git a/comm/mail/config/version_display.txt b/comm/mail/config/version_display.txt
index 097167986683..4c142d648b8f 100644
--- a/comm/mail/config/version_display.txt
+++ b/comm/mail/config/version_display.txt
@@ -1 +1 @@
-76.0b1
+76.0b2
diff --git a/comm/mail/locales/l10n-changesets.json b/comm/mail/locales/l10n-changesets.json
index 5a2520c41e4d..577d348b6853 100644
--- a/comm/mail/locales/l10n-changesets.json
+++ b/comm/mail/locales/l10n-changesets.json
@@ -7,7 +7,7 @@
             "win32",
             "win64"
         ],
-        "revision": "ae9f937c138e"
+        "revision": "471f0e44c311"
     },
     "ast": {
         "platforms": [
@@ -17,7 +17,7 @@
             "win32",
             "win64"
         ],
-        "revision": "85ec2fa70911"
+        "revision": "8077f557a738"
     },
     "be": {
         "platforms": [
@@ -27,7 +27,7 @@
             "win32",
             "win64"
         ],
-        "revision": "bc58cd411a53"
+        "revision": "ea559a223207"
     },
     "bg": {
         "platforms": [
@@ -37,7 +37,7 @@
             "win32",
             "win64"
         ],
-        "revision": "0b026cc5aaef"
+        "revision": "6a1d92e050cf"
     },
     "br": {
         "platforms": [
@@ -47,7 +47,7 @@
             "win32",
             "win64"
         ],
-        "revision": "80e7f4f6f20a"
+        "revision": "4a1851560bf1"
     },
     "ca": {
         "platforms": [
@@ -57,7 +57,7 @@
             "win32",
             "win64"
         ],
-        "revision": "c358fb7c5a93"
+        "revision": "56e335a7a9c3"
     },
     "cak": {
         "platforms": [
@@ -67,7 +67,7 @@
             "win32",
             "win64"
         ],
-        "revision": "6efa849aa6f4"
+        "revision": "3b137bdd17d2"
     },
     "cs": {
         "platforms": [
@@ -77,7 +77,7 @@
             "win32",
             "win64"
         ],
-        "revision": "c1e454141681"
+        "revision": "5472bffca437"
     },
     "cy": {
         "platforms": [
@@ -87,7 +87,7 @@
             "win32",
             "win64"
         ],
-        "revision": "f4e3fa995ef3"
+        "revision": "b1ebedf46a6a"
     },
     "da": {
         "platforms": [
@@ -97,7 +97,7 @@
             "win32",
             "win64"
         ],
-        "revision": "03a2576e0b62"
+        "revision": "f51dcb55b08f"
     },
     "de": {
         "platforms": [
@@ -107,7 +107,7 @@
             "win32",
             "win64"
         ],
-        "revision": "65df9763a30d"
+        "revision": "1299e3fd1372"
     },
     "dsb": {
         "platforms": [
@@ -117,7 +117,7 @@
             "win32",
             "win64"
         ],
-        "revision": "487b957514d0"
+        "revision": "03284d710304"
     },
     "el": {
         "platforms": [
@@ -127,7 +127,7 @@
             "win32",
             "win64"
         ],
-        "revision": "b856307f21f7"
+        "revision": "0fce8bf04d07"
     },
     "en-GB": {
         "platforms": [
@@ -137,7 +137,7 @@
             "win32",
             "win64"
         ],
-        "revision": "8a6cd5366bb4"
+        "revision": "f66463c44006"
     },
     "es-AR": {
         "platforms": [
@@ -147,7 +147,7 @@
             "win32",
             "win64"
         ],
-        "revision": "9235862e2764"
+        "revision": "19b93bbde3d3"
     },
     "es-ES": {
         "platforms": [
@@ -157,7 +157,7 @@
             "win32",
             "win64"
         ],
-        "revision": "ac5f8bc23aa0"
+        "revision": "7796746946f9"
     },
     "et": {
         "platforms": [
@@ -167,7 +167,7 @@
             "win32",
             "win64"
         ],
-        "revision": "a08596786389"
+        "revision": "adf3f128dc69"
     },
     "eu": {
         "platforms": [
@@ -177,7 +177,7 @@
             "win32",
             "win64"
         ],
-        "revision": "c6d6b9cd7dcd"
+        "revision": "84ae7e1ba981"
     },
     "fi": {
         "platforms": [
@@ -187,7 +187,7 @@
             "win32",
             "win64"
         ],
-        "revision": "8a5816e8fb4c"
+        "revision": "cda9a8b13087"
     },
     "fr": {
         "platforms": [
@@ -197,7 +197,7 @@
             "win32",
             "win64"
         ],
-        "revision": "ecb6bbd84382"
+        "revision": "e963c27cb8b1"
     },
     "fy-NL": {
         "platforms": [
@@ -207,7 +207,7 @@
             "win32",
             "win64"
         ],
-        "revision": "6fbe78d4acad"
+        "revision": "3f61217ce280"
     },
     "ga-IE": {
         "platforms": [
@@ -217,7 +217,7 @@
             "win32",
             "win64"
         ],
-        "revision": "4c54dc829afd"
+        "revision": "a14f1e7b4089"
     },
     "gd": {
         "platforms": [
@@ -227,7 +227,7 @@
             "win32",
             "win64"
         ],
-        "revision": "2439a0322ab1"
+        "revision": "e2e42c718a2b"
     },
     "gl": {
         "platforms": [
@@ -237,7 +237,7 @@
             "win32",
             "win64"
         ],
-        "revision": "0055707aa718"
+        "revision": "48fda83a2a70"
     },
     "he": {
         "platforms": [
@@ -247,7 +247,7 @@
             "win32",
             "win64"
         ],
-        "revision": "ff0a4d49fc9f"
+        "revision": "6dab8b8a3f99"
     },
     "hr": {
         "platforms": [
@@ -257,7 +257,7 @@
             "win32",
             "win64"
         ],
-        "revision": "c708a22fca65"
+        "revision": "ae4c238100eb"
     },
     "hsb": {
         "platforms": [
@@ -267,7 +267,7 @@
             "win32",
             "win64"
         ],
-        "revision": "173d2211c5de"
+        "revision": "641e796f2b83"
     },
     "hu": {
         "platforms": [
@@ -277,7 +277,7 @@
             "win32",
             "win64"
         ],
-        "revision": "a8517a2ebaf2"
+        "revision": "aa4a03cc6c76"
     },
     "hy-AM": {
         "platforms": [
@@ -287,7 +287,7 @@
             "win32",
             "win64"
         ],
-        "revision": "1b612c698334"
+        "revision": "ef88e370a28a"
     },
     "id": {
         "platforms": [
@@ -297,7 +297,7 @@
             "win32",
             "win64"
         ],
-        "revision": "356331c9508f"
+        "revision": "f08b5b2476c6"
     },
     "is": {
         "platforms": [
@@ -307,7 +307,7 @@
             "win32",
             "win64"
         ],
-        "revision": "a9d1dbe033f2"
+        "revision": "6e05fc06a401"
     },
     "it": {
         "platforms": [
@@ -317,7 +317,7 @@
             "win32",
             "win64"
         ],
-        "revision": "4e2970abb9d0"
+        "revision": "93f7c2db6104"
     },
     "ja": {
         "platforms": [
@@ -326,13 +326,13 @@
             "win32",
             "win64"
         ],
-        "revision": "0e0cf5d0042a"
+        "revision": "53409d1b9a80"
     },
     "ja-JP-mac": {
         "platforms": [
             "macosx64"
         ],
-        "revision": "5ea03acdb131"
+        "revision": "255210ef04a1"
     },
     "ka": {
         "platforms": [
@@ -342,7 +342,7 @@
             "win32",
             "win64"
         ],
-        "revision": "9d650ef3f4f5"
+        "revision": "b6a95f8803cf"
     },
     "kab": {
         "platforms": [
@@ -352,7 +352,7 @@
             "win32",
             "win64"
         ],
-        "revision": "f4d1d0c25912"
+        "revision": "c935fde54e6f"
     },
     "kk": {
         "platforms": [
@@ -362,7 +362,7 @@
             "win32",
             "win64"
         ],
-        "revision": "068b291f689a"
+        "revision": "484455adb06c"
     },
     "ko": {
         "platforms": [
@@ -372,7 +372,7 @@
             "win32",
             "win64"
         ],
-        "revision": "c48fb21eea74"
+        "revision": "15e10604c92e"
     },
     "lt": {
         "platforms": [
@@ -382,7 +382,7 @@
             "win32",
             "win64"
         ],
-        "revision": "a881c91becb4"
+        "revision": "350800636e69"
     },
     "ms": {
         "platforms": [
@@ -392,7 +392,7 @@
             "win32",
             "win64"
         ],
-        "revision": "50773fdde329"
+        "revision": "1f033ed85e75"
     },
     "nb-NO": {
         "platforms": [
@@ -402,7 +402,7 @@
             "win32",
             "win64"
         ],
-        "revision": "3e958c33d216"
+        "revision": "dac9950ba164"
     },
     "nl": {
         "platforms": [
@@ -412,7 +412,7 @@
             "win32",
             "win64"
         ],
-        "revision": "77c074fce875"
+        "revision": "f6ebedc73abc"
     },
     "nn-NO": {
         "platforms": [
@@ -422,7 +422,7 @@
             "win32",
             "win64"
         ],
-        "revision": "27f99013866a"
+        "revision": "b23848917fbb"
     },
     "pl": {
         "platforms": [
@@ -432,7 +432,7 @@
             "win32",
             "win64"
         ],
-        "revision": "38dbb1c4aff5"
+        "revision": "d4ed5ed70d5d"
     },
     "pt-BR": {
         "platforms": [
@@ -442,7 +442,7 @@
             "win32",
             "win64"
         ],
-        "revision": "8eaa154f3a30"
+        "revision": "6bb51095f3e0"
     },
     "pt-PT": {
         "platforms": [
@@ -452,7 +452,7 @@
             "win32",
             "win64"
         ],
-        "revision": "ab07bfc80e7b"
+        "revision": "d778eafc508c"
     },
     "rm": {
         "platforms": [
@@ -462,7 +462,7 @@
             "win32",
             "win64"
         ],
-        "revision": "5731c96c50e8"
+        "revision": "1834e92c1d81"
     },
     "ro": {
         "platforms": [
@@ -472,7 +472,7 @@
             "win32",
             "win64"
         ],
-        "revision": "6fcc3b058bb4"
+        "revision": "cc8c351b64ca"
     },
     "ru": {
         "platforms": [
@@ -482,7 +482,7 @@
             "win32",
             "win64"
         ],
-        "revision": "ad1c74cc8188"
+        "revision": "7d95425fd9fe"
     },
     "si": {
         "platforms": [
@@ -492,7 +492,7 @@
             "win32",
             "win64"
         ],
-        "revision": "71e2e8c1aa83"
+        "revision": "b7a4c2aad443"
     },
     "sk": {
         "platforms": [
@@ -502,7 +502,7 @@
             "win32",
             "win64"
         ],
-        "revision": "b268e4643355"
+        "revision": "9575fdeff158"
     },
     "sl": {
         "platforms": [
@@ -512,7 +512,7 @@
             "win32",
             "win64"
         ],
-        "revision": "0264695cad75"
+        "revision": "a0140b8874dc"
     },
     "sq": {
         "platforms": [
@@ -522,7 +522,7 @@
             "win32",
             "win64"
         ],
-        "revision": "a4762980152a"
+        "revision": "f188c24c537c"
     },
     "sr": {
         "platforms": [
@@ -532,7 +532,7 @@
             "win32",
             "win64"
         ],
-        "revision": "68aceb141b13"
+        "revision": "3db79780f4f3"
     },
     "sv-SE": {
         "platforms": [
@@ -542,7 +542,7 @@
             "win32",
             "win64"
         ],
-        "revision": "a027c730364f"
+        "revision": "338c76f278b5"
     },
     "tr": {
         "platforms": [
@@ -552,7 +552,7 @@
             "win32",
             "win64"
         ],
-        "revision": "621e71ae044f"
+        "revision": "b82a33db222c"
     },
     "uk": {
         "platforms": [
@@ -562,7 +562,7 @@
             "win32",
             "win64"
         ],
-        "revision": "91336afdb618"
+        "revision": "c805769b84b8"
     },
     "uz": {
         "platforms": [
@@ -572,7 +572,7 @@
             "win32",
             "win64"
         ],
-        "revision": "ef762dcbce1d"
+        "revision": "b98bac8f6c55"
     },
     "vi": {
         "platforms": [
@@ -582,7 +582,7 @@
             "win32",
             "win64"
         ],
-        "revision": "336a342b9b1d"
+        "revision": "2b0105602659"
     },
     "zh-CN": {
         "platforms": [
@@ -592,7 +592,7 @@
             "win32",
             "win64"
         ],
-        "revision": "e2dd4692a2cb"
+        "revision": "152a1bc43f0b"
     },
     "zh-TW": {
         "platforms": [
@@ -602,6 +602,6 @@
             "win32",
             "win64"
         ],
-        "revision": "23b796922728"
+        "revision": "674289f83c58"
     }
 }
\ No newline at end of file
diff --git a/config/recurse.mk b/config/recurse.mk
index 9dbefebcd257..38b3364078c2 100644
--- a/config/recurse.mk
+++ b/config/recurse.mk
@@ -206,15 +206,11 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),gtk)
 toolkit/library/target: widget/gtk/mozgtk/gtk3/target
 endif
 
-ifeq ($(OS_ARCH), Linux)
-ifneq ($(OS_TARGET), Android)
+ifeq (,$(filter WINNT Darwin Android,$(OS_TARGET)))
 netwerk/test/http3server/target: security/nss/lib/nss/nss_nss3/target security/nss/lib/ssl/ssl_ssl3/target config/external/nspr/pr/target
 else
 netwerk/test/http3server/target: security/target
 endif
-else
-netwerk/test/http3server/target: security/target
-endif
 
 # Most things are built during compile (target/host), but some things happen during export
 # Those need to depend on config/export for system wrappers.
diff --git a/devtools/client/inspector/rules/views/text-property-editor.js b/devtools/client/inspector/rules/views/text-property-editor.js
index 3aac0f2c49b7..5e38cd45c616 100644
--- a/devtools/client/inspector/rules/views/text-property-editor.js
+++ b/devtools/client/inspector/rules/views/text-property-editor.js
@@ -740,12 +740,12 @@ TextPropertyEditor.prototype = {
   updatePropertyState: function() {
     if (this.prop.enabled) {
       this.enable.style.removeProperty("visibility");
-      this.enable.setAttribute("checked", "");
     } else {
       this.enable.style.visibility = "visible";
-      this.enable.removeAttribute("checked");
     }
 
+    this.enable.checked = this.prop.enabled;
+
     this.warning.title = !this.isNameValid()
       ? l10n("rule.warningName.title")
       : l10n("rule.warning.title");
@@ -926,13 +926,7 @@ TextPropertyEditor.prototype = {
    * Handles clicks on the disabled property.
    */
   _onEnableChanged: function(event) {
-    const checked = this.enable.hasAttribute("checked");
-    if (checked) {
-      this.enable.removeAttribute("checked");
-    } else {
-      this.enable.setAttribute("checked", "");
-    }
-    this.prop.setEnabled(!checked);
+    this.prop.setEnabled(this.enable.checked);
     event.stopPropagation();
     this.telemetry.recordEvent("edit_rule", "ruleview", null, {
       session_id: this.toolbox.sessionId,
diff --git a/devtools/client/netmonitor/src/utils/tooltips.js b/devtools/client/netmonitor/src/utils/tooltips.js
index be3fdc67e957..1f35346353fb 100644
--- a/devtools/client/netmonitor/src/utils/tooltips.js
+++ b/devtools/client/netmonitor/src/utils/tooltips.js
@@ -5,12 +5,12 @@
 "use strict";
 
 /**
- * Returns first 1024 characters of value for use as a tooltip.
+ * Returns first 128 characters of value for use as a tooltip.
  * @param object
  * @returns {*}
  */
 function limitTooltipLength(object) {
-  return object.length > 1024 ? object.substring(0, 1024) + "…" : object;
+  return object.length > 128 ? object.substring(0, 128) + "…" : object;
 }
 
 module.exports = {
diff --git a/devtools/client/netmonitor/test/browser_net_copy_as_curl.js b/devtools/client/netmonitor/test/browser_net_copy_as_curl.js
index de09202b8d08..883771b3c8e2 100644
--- a/devtools/client/netmonitor/test/browser_net_copy_as_curl.js
+++ b/devtools/client/netmonitor/test/browser_net_copy_as_curl.js
@@ -72,7 +72,7 @@ function buildTestData(QUOTE) {
   const COOKIE_PARTIAL_RESULT = [header("Cookie: bob=true; tom=cool")];
 
   const POST_PARTIAL_RESULT = [
-    "--data " + quote(POST_PAYLOAD),
+    "--data-raw " + quote(POST_PAYLOAD),
     header("Content-Type: text/plain;charset=UTF-8"),
   ];
   const ORIGIN_RESULT = [header("Origin: http://example.com")];
diff --git a/devtools/client/netmonitor/test/browser_net_curl-utils.js b/devtools/client/netmonitor/test/browser_net_curl-utils.js
index 8beeb8af1416..4e73acaad644 100644
--- a/devtools/client/netmonitor/test/browser_net_curl-utils.js
+++ b/devtools/client/netmonitor/test/browser_net_curl-utils.js
@@ -142,25 +142,25 @@ function testWriteEmptyPostDataTextParams(data) {
 function testDataArgumentOnGeneratedCommand(data) {
   const curlCommand = Curl.generateCommand(data);
   ok(
-    curlCommand.includes("--data"),
-    "Should return a curl command with --data"
+    curlCommand.includes("--data-raw"),
+    "Should return a curl command with --data-raw"
   );
 }
 
 function testDataEscapeOnGeneratedCommand(data) {
-  const paramsWin = `--data "{""param1"":""value1"",""param2"":""value2""}"`;
-  const paramsPosix = `--data '{"param1":"value1","param2":"value2"}'`;
+  const paramsWin = `--data-raw "{""param1"":""value1"",""param2"":""value2""}"`;
+  const paramsPosix = `--data-raw '{"param1":"value1","param2":"value2"}'`;
 
   let curlCommand = Curl.generateCommand(data, "WINNT");
   ok(
     curlCommand.includes(paramsWin),
-    "Should return a curl command with --data escaped for Windows systems"
+    "Should return a curl command with --data-raw escaped for Windows systems"
   );
 
   curlCommand = Curl.generateCommand(data, "Linux");
   ok(
     curlCommand.includes(paramsPosix),
-    "Should return a curl command with --data escaped for Posix systems"
+    "Should return a curl command with --data-raw escaped for Posix systems"
   );
 }
 
diff --git a/devtools/client/shared/curl.js b/devtools/client/shared/curl.js
index 32b2b57072cc..d9592ab6d453 100644
--- a/devtools/client/shared/curl.js
+++ b/devtools/client/shared/curl.js
@@ -119,7 +119,7 @@ const Curl = {
       ["PUT", "POST", "PATCH"].includes(data.method)
     ) {
       postDataText = data.postDataText;
-      addPostData("--data");
+      addPostData("--data-raw");
       addPostData(utils.writePostDataTextParams(postDataText));
       ignoredHeaders.add("content-length");
     }
diff --git a/devtools/client/shared/test/xpcshell/test_curl.js b/devtools/client/shared/test/xpcshell/test_curl.js
index b6f90a0d575d..3c54e39db284 100644
--- a/devtools/client/shared/test/xpcshell/test_curl.js
+++ b/devtools/client/shared/test/xpcshell/test_curl.js
@@ -81,6 +81,10 @@ add_task(async function() {
     "content-type header present in curl output"
   );
   ok(!inParams(curlParams, "--data"), "no data param in GET curl output");
+  ok(
+    !inParams(curlParams, "--data-raw"),
+    "no raw data param in GET curl output"
+  );
 });
 
 // Test `Curl.generateCommand` URL glob handling
@@ -140,9 +144,12 @@ add_task(async function() {
     exactHeaderInParams(curlParams, "Content-Type: text/plain"),
     "content-type header present in curl output"
   );
-  ok(inParams(curlParams, "--data"), '"--data" param present in curl output');
   ok(
-    inParams(curlParams, `--data ${quote(request.postDataText)}`),
+    inParams(curlParams, "--data-raw"),
+    '"--data-raw" param present in curl output'
+  );
+  ok(
+    inParams(curlParams, `--data-raw ${quote(request.postDataText)}`),
     "proper payload data present in output"
   );
 });
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp
index b03154ede0be..9f86f0e991f7 100644
--- a/dom/base/CustomElementRegistry.cpp
+++ b/dom/base/CustomElementRegistry.cpp
@@ -182,7 +182,7 @@ void CustomElementData::AttachedInternals() {
   mIsAttachedInternals = true;
 }
 
-CustomElementDefinition* CustomElementData::GetCustomElementDefinition() {
+CustomElementDefinition* CustomElementData::GetCustomElementDefinition() const {
   // Per spec, if there is a definition, the custom element state should be
   // either "failed" (during upgrade) or "customized".
   MOZ_ASSERT_IF(mCustomElementDefinition, mState != State::eUndefined);
@@ -492,6 +492,7 @@ CustomElementRegistry::CreateCustomElementCallback(
   return callback;
 }
 
+// https://html.spec.whatwg.org/commit-snapshots/65f39c6fc0efa92b0b2b23b93197016af6ac0de6/#enqueue-a-custom-element-callback-reaction
 /* static */
 void CustomElementRegistry::EnqueueLifecycleCallback(
     Document::ElementCallbackType aType, Element* aCustomElement,
diff --git a/dom/base/CustomElementRegistry.h b/dom/base/CustomElementRegistry.h
index cce28249b879..7733dcd33355 100644
--- a/dom/base/CustomElementRegistry.h
+++ b/dom/base/CustomElementRegistry.h
@@ -103,7 +103,7 @@ struct CustomElementData {
   AutoTArray<UniquePtr<CustomElementReaction>, 3> mReactionQueue;
 
   void SetCustomElementDefinition(CustomElementDefinition* aDefinition);
-  CustomElementDefinition* GetCustomElementDefinition();
+  CustomElementDefinition* GetCustomElementDefinition() const;
   nsAtom* GetCustomElementType() const { return mType; }
   void AttachedInternals();
   bool HasAttachedInternals() const { return mIsAttachedInternals; }
diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp
index 7882474875e9..e43e6090d1b8 100644
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -2322,31 +2322,34 @@ nsresult Element::SetAttrAndNotify(
     }
   }
 
-  CustomElementDefinition* definition = GetCustomElementDefinition();
-  // Only custom element which is in `custom` state could get the
-  // CustomElementDefinition.
-  if (definition && definition->IsInObservedAttributeList(aName)) {
-    RefPtr<nsAtom> oldValueAtom;
-    if (oldValue) {
-      oldValueAtom = oldValue->GetAsAtom();
-    } else {
-      // If there is no old value, get the value of the uninitialized
-      // attribute that was swapped with aParsedValue.
-      oldValueAtom = aParsedValue.GetAsAtom();
+  const CustomElementData* data = GetCustomElementData();
+  if (data && data->mState == CustomElementData::State::eCustom) {
+    CustomElementDefinition* definition = data->GetCustomElementDefinition();
+    MOZ_ASSERT(definition, "Should have a valid CustomElementDefinition");
+
+    if (definition->IsInObservedAttributeList(aName)) {
+      RefPtr<nsAtom> oldValueAtom;
+      if (oldValue) {
+        oldValueAtom = oldValue->GetAsAtom();
+      } else {
+        // If there is no old value, get the value of the uninitialized
+        // attribute that was swapped with aParsedValue.
+        oldValueAtom = aParsedValue.GetAsAtom();
+      }
+      RefPtr<nsAtom> newValueAtom = valueForAfterSetAttr.GetAsAtom();
+      nsAutoString ns;
+      nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns);
+
+      LifecycleCallbackArgs args = {nsDependentAtomString(aName),
+                                    aModType == MutationEvent_Binding::ADDITION
+                                        ? VoidString()
+                                        : nsDependentAtomString(oldValueAtom),
+                                    nsDependentAtomString(newValueAtom),
+                                    (ns.IsEmpty() ? VoidString() : ns)};
+
+      nsContentUtils::EnqueueLifecycleCallback(
+          Document::eAttributeChanged, this, &args, nullptr, definition);
     }
-    RefPtr<nsAtom> newValueAtom = valueForAfterSetAttr.GetAsAtom();
-    nsAutoString ns;
-    nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns);
-
-    LifecycleCallbackArgs args = {nsDependentAtomString(aName),
-                                  aModType == MutationEvent_Binding::ADDITION
-                                      ? VoidString()
-                                      : nsDependentAtomString(oldValueAtom),
-                                  nsDependentAtomString(newValueAtom),
-                                  (ns.IsEmpty() ? VoidString() : ns)};
-
-    nsContentUtils::EnqueueLifecycleCallback(Document::eAttributeChanged, this,
-                                             &args, nullptr, definition);
   }
 
   if (aCallAfterSetAttr) {
@@ -2514,19 +2517,22 @@ void Element::PostIdMaybeChange(int32_t aNamespaceID, nsAtom* aName,
 nsresult Element::OnAttrSetButNotChanged(int32_t aNamespaceID, nsAtom* aName,
                                          const nsAttrValueOrString& aValue,
                                          bool aNotify) {
-  // Only custom element which is in `custom` state could get the
-  // CustomElementDefinition.
-  CustomElementDefinition* definition = GetCustomElementDefinition();
-  if (definition && definition->IsInObservedAttributeList(aName)) {
-    nsAutoString ns;
-    nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns);
+  const CustomElementData* data = GetCustomElementData();
+  if (data && data->mState == CustomElementData::State::eCustom) {
+    CustomElementDefinition* definition = data->GetCustomElementDefinition();
+    MOZ_ASSERT(definition, "Should have a valid CustomElementDefinition");
+
+    if (definition->IsInObservedAttributeList(aName)) {
+      nsAutoString ns;
+      nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNamespaceID, ns);
 
-    nsAutoString value(aValue.String());
-    LifecycleCallbackArgs args = {nsDependentAtomString(aName), value, value,
-                                  (ns.IsEmpty() ? VoidString() : ns)};
+      nsAutoString value(aValue.String());
+      LifecycleCallbackArgs args = {nsDependentAtomString(aName), value, value,
+                                    (ns.IsEmpty() ? VoidString() : ns)};
 
-    nsContentUtils::EnqueueLifecycleCallback(Document::eAttributeChanged, this,
-                                             &args, nullptr, definition);
+      nsContentUtils::EnqueueLifecycleCallback(
+          Document::eAttributeChanged, this, &args, nullptr, definition);
+    }
   }
 
   return NS_OK;
@@ -2622,20 +2628,23 @@ nsresult Element::UnsetAttr(int32_t aNameSpaceID, nsAtom* aName, bool aNotify) {
 
   PostIdMaybeChange(aNameSpaceID, aName, nullptr);
 
-  CustomElementDefinition* definition = GetCustomElementDefinition();
-  // Only custom element which is in `custom` state could get the
-  // CustomElementDefinition.
-  if (definition && definition->IsInObservedAttributeList(aName)) {
-    nsAutoString ns;
-    nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNameSpaceID, ns);
+  const CustomElementData* data = GetCustomElementData();
+  if (data && data->mState == CustomElementData::State::eCustom) {
+    CustomElementDefinition* definition = data->GetCustomElementDefinition();
+    MOZ_ASSERT(definition, "Should have a valid CustomElementDefinition");
+
+    if (definition->IsInObservedAttributeList(aName)) {
+      nsAutoString ns;
+      nsContentUtils::NameSpaceManager()->GetNameSpaceURI(aNameSpaceID, ns);
 
-    RefPtr<nsAtom> oldValueAtom = oldValue.GetAsAtom();
-    LifecycleCallbackArgs args = {
-        nsDependentAtomString(aName), nsDependentAtomString(oldValueAtom),
-        VoidString(), (ns.IsEmpty() ? VoidString() : ns)};
+      RefPtr<nsAtom> oldValueAtom = oldValue.GetAsAtom();
+      LifecycleCallbackArgs args = {
+          nsDependentAtomString(aName), nsDependentAtomString(oldValueAtom),
+          VoidString(), (ns.IsEmpty() ? VoidString() : ns)};
 
-    nsContentUtils::EnqueueLifecycleCallback(Document::eAttributeChanged, this,
-                                             &args, nullptr, definition);
+      nsContentUtils::EnqueueLifecycleCallback(
+          Document::eAttributeChanged, this, &args, nullptr, definition);
+    }
   }
 
   rv = AfterSetAttr(aNameSpaceID, aName, nullptr, &oldValue, nullptr, aNotify);
diff --git a/dom/base/test/common_postMessages.js b/dom/base/test/common_postMessages.js
index 71ac8cfc8118..c7c16ee3b358 100644
--- a/dom/base/test/common_postMessages.js
+++ b/dom/base/test/common_postMessages.js
@@ -152,13 +152,19 @@ function create_wasmModule() {
   ok(WebAssembly, "WebAssembly object should exist");
   ok(WebAssembly.compile, "WebAssembly.compile function should exist");
 
-  const wasmTextToBinary = SpecialPowers.unwrap(
-    SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary
-  );
-  const fooModuleCode = wasmTextToBinary(`(module
-    (func $foo (result i32) (i32.const 42))
-    (export "foo" (func $foo))
-  )`);
+  /*
+    js -e '
+      t = wasmTextToBinary(`
+        (module
+          (func $foo (result i32) (i32.const 42))
+          (export "foo" (func $foo))
+        )
+      `);
+      print(t)
+    '
+  */
+  // eslint-disable-next-line
+  const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]);
 
   WebAssembly.compile(fooModuleCode).then(
     m => {
diff --git a/dom/clients/manager/ClientOpenWindowUtils.cpp b/dom/clients/manager/ClientOpenWindowUtils.cpp
index 28a39b983435..5633333e581b 100644
--- a/dom/clients/manager/ClientOpenWindowUtils.cpp
+++ b/dom/clients/manager/ClientOpenWindowUtils.cpp
@@ -239,8 +239,9 @@ void OpenWindow(const ClientOpenWindowArgs& aArgs, BrowsingContext** aBC,
     aRv.ThrowTypeError("Unable to open window");
     return;
   }
-
-  rv = bwin->OpenURI(uri, nullptr, nsIBrowserDOMWindow::OPEN_DEFAULTWINDOW,
+  // annyG: This is a hack to fix bug 1622749.
+  // We will force to open new windows in tabs so we don't crash later.
+  rv = bwin->OpenURI(uri, nullptr, nsIBrowserDOMWindow::OPEN_NEWTAB,
                      nsIBrowserDOMWindow::OPEN_NEW, principal, csp, aBC);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     aRv.ThrowTypeError("Unable to open window");
diff --git a/dom/filehandle/ActorsParent.cpp b/dom/filehandle/ActorsParent.cpp
index f1638736a631..5cf6238b6b9b 100644
--- a/dom/filehandle/ActorsParent.cpp
+++ b/dom/filehandle/ActorsParent.cpp
@@ -2137,6 +2137,25 @@ nsresult TruncateOp::DoFileWork(FileHandle* aFileHandle) {
   nsCOMPtr<nsISeekableStream> sstream = do_QueryInterface(mFileStream);
   MOZ_ASSERT(sstream);
 
+  if (mParams.offset()) {
+    nsCOMPtr<nsIFileMetadata> fileMetadata = do_QueryInterface(mFileStream);
+    MOZ_ASSERT(fileMetadata);
+
+    int64_t size;
+    nsresult rv = fileMetadata->GetSize(&size);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
+    }
+    MOZ_ASSERT(size >= 0);
+
+    if (mParams.offset() > static_cast<uint64_t>(size)) {
+      // Cannot extend the size of a file through truncate.
+      return NS_ERROR_DOM_INVALID_MODIFICATION_ERR;
+    }
+  }
+
+  // XXX If we allowed truncate to extend the file size, we would to ensure that
+  // the quota limit is checked, e.g. by making FileQuotaStream override Seek.
   nsresult rv = sstream->Seek(nsISeekableStream::NS_SEEK_SET, mParams.offset());
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
diff --git a/dom/html/HTMLImageElement.cpp b/dom/html/HTMLImageElement.cpp
index 4abcd3bae9a6..f137c2909a92 100644
--- a/dom/html/HTMLImageElement.cpp
+++ b/dom/html/HTMLImageElement.cpp
@@ -86,7 +86,15 @@ class ImageLoadTask final : public MicroTaskRunnable {
     if (mElement->mPendingImageLoadTask == this) {
       mElement->mPendingImageLoadTask = nullptr;
       mElement->mUseUrgentStartForChannel = mUseUrgentStartForChannel;
-      mElement->LoadSelectedImage(true, true, mAlwaysLoad);
+      // Defer loading this image if loading="lazy" was set after this microtask
+      // was queued.
+      // NOTE: Using ShouldLoadImage() will violate the HTML standard spec
+      // because ShouldLoadImage() checks the document active state which should
+      // have done just once before this queue is created as per the spec, so
+      // we just check the lazy loading state here.
+      if (!mElement->IsLazyLoading()) {
+        mElement->LoadSelectedImage(true, true, mAlwaysLoad);
+      }
     }
     mDocument->UnblockOnload(false);
   }
diff --git a/dom/html/HTMLImageElement.h b/dom/html/HTMLImageElement.h
index 60347057077c..d6a9d6a300e2 100644
--- a/dom/html/HTMLImageElement.h
+++ b/dom/html/HTMLImageElement.h
@@ -197,6 +197,8 @@ class HTMLImageElement final : public nsGenericHTMLElement,
     return mLazyLoading || mPendingImageLoadTask;
   }
 
+  bool IsLazyLoading() const { return mLazyLoading; }
+
   Loading LoadingState() const;
 
   already_AddRefed<Promise> Decode(ErrorResult& aRv);
diff --git a/dom/indexedDB/IDBCursor.cpp b/dom/indexedDB/IDBCursor.cpp
index 8ce4f636d63e..05591540def5 100644
--- a/dom/indexedDB/IDBCursor.cpp
+++ b/dom/indexedDB/IDBCursor.cpp
@@ -828,19 +828,13 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
   NS_IMPL_ADDREF_INHERITED(_subclassName, IDBCursor)                          \
   NS_IMPL_RELEASE_INHERITED(_subclassName, IDBCursor)
 
-#define NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(_subclassName) \
-  NS_IMPL_CYCLE_COLLECTION_CLASS(_subclassName)                    \
+#define NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(_subclassName)  \
+  NS_IMPL_CYCLE_COLLECTION_MULTI_ZONE_JSHOLDER_CLASS(_subclassName) \
   NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS_METHODS(_subclassName)
 
-#define NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_MULTI_ZONE_JSHOLDER_SUBCLASS( \
-    _subclassName)                                                       \
-  NS_IMPL_CYCLE_COLLECTION_MULTI_ZONE_JSHOLDER_CLASS(_subclassName)      \
-  NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS_METHODS(_subclassName)
-
-NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_MULTI_ZONE_JSHOLDER_SUBCLASS(
-    IDBObjectStoreCursor)
+NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBObjectStoreCursor)
 NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBObjectStoreKeyCursor)
-NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_MULTI_ZONE_JSHOLDER_SUBCLASS(IDBIndexCursor)
+NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBIndexCursor)
 NS_IMPL_CYCLE_COLLECTION_IDBCURSOR_SUBCLASS(IDBIndexKeyCursor)
 
 template <IDBCursor::Type CursorType>
diff --git a/dom/indexedDB/test/file.js b/dom/indexedDB/test/file.js
index 12e02a66e35c..8089a541f06a 100644
--- a/dom/indexedDB/test/file.js
+++ b/dom/indexedDB/test/file.js
@@ -76,14 +76,6 @@ function getNullFile(name, size) {
   return getFile(name, "binary/null", getView(size));
 }
 
-// This needs to be async to make it available on workers too.
-function getWasmBinary(text) {
-  let binary = getWasmBinarySync(text);
-  SimpleTest.executeSoon(function() {
-    testGenerator.next(binary);
-  });
-}
-
 function getWasmModule(binary) {
   let module = new WebAssembly.Module(binary);
   return module;
diff --git a/dom/indexedDB/test/helpers.js b/dom/indexedDB/test/helpers.js
index be69207121fb..f093aaaf3e45 100644
--- a/dom/indexedDB/test/helpers.js
+++ b/dom/indexedDB/test/helpers.js
@@ -357,23 +357,6 @@ function isWasmSupported() {
   return testingFunctions.wasmIsSupported();
 }
 
-function getWasmBinarySync(text) {
-  let testingFunctions = SpecialPowers.Cu.getJSTestingFunctions();
-  let wasmTextToBinary = SpecialPowers.unwrap(
-    testingFunctions.wasmTextToBinary
-  );
-  let binary = wasmTextToBinary(text);
-  return binary;
-}
-
-// (Async versions to imitate the on-worker behavior where getWasmBinarySync is
-// not available.)
-function getWasmBinary(text) {
-  let binary = getWasmBinarySync(text);
-  SimpleTest.executeSoon(function() {
-    testGenerator.next(binary);
-  });
-}
 function getWasmModule(_binary_) {
   let module = new WebAssembly.Module(_binary_);
   return module;
@@ -415,6 +398,7 @@ function expectingError(request, errorName) {
   return new Promise(function(resolve, reject) {
     request.onerror = function(event) {
       is(errorName, event.target.error.name, "Correct exception type");
+      event.stopPropagation();
       resolve(event);
     };
     request.onsuccess = function(event) {
@@ -671,14 +655,6 @@ function workerScript() {
     return self.wasmSupported;
   };
 
-  self.getWasmBinarySync = function(_text_) {
-    self.ok(false, "This can't be used on workers");
-  };
-
-  self.getWasmBinary = function(_text_) {
-    self.postMessage({ op: "getWasmBinary", text: _text_ });
-  };
-
   self.getWasmModule = function(_binary_) {
     let module = new WebAssembly.Module(_binary_);
     return module;
@@ -729,11 +705,6 @@ function workerScript() {
         }
         break;
 
-      case "getWasmBinaryDone":
-        info("Worker: get wasm binary done");
-        testGenerator.next(message.wasmBinary);
-        break;
-
       default:
         throw new Error(
           "Received a bad message from parent: " + JSON.stringify(message)
@@ -846,13 +817,6 @@ async function executeWorkerTestAndCleanUp(testScriptPath) {
             });
             break;
 
-          case "getWasmBinary":
-            worker.postMessage({
-              op: "getWasmBinaryDone",
-              wasmBinary: getWasmBinarySync(message.text),
-            });
-            break;
-
           default:
             ok(
               false,
diff --git a/dom/indexedDB/test/test_filehandle_truncate_exceptions.html b/dom/indexedDB/test/test_filehandle_truncate_exceptions.html
index 847465577a50..857859268b4f 100644
--- a/dom/indexedDB/test/test_filehandle_truncate_exceptions.html
+++ b/dom/indexedDB/test/test_filehandle_truncate_exceptions.html
@@ -27,6 +27,14 @@
     info("Expecting TypeError on truncating to a negative length that converts to UINT64_MAX implicitly");
     let message = assertThrowsInstanceOf(() => { fileHandle.truncate(-1); }, TypeError);
     is(message, "IDBFileHandle.truncate: UINT64_MAX is not a valid size", "Correct message");
+
+    info ("Attempt to truncate to a size larger than the current size should fail.");
+    // XXX Expect a more specific error here?
+    await expectingError(fileHandle.truncate(10000000), "UnknownError");
+
+    info("Still the state should be consistent and we should be able to truncate to a valid size after this.");
+    // This wasn't always the case, see Bug 1626973
+    await expectingSuccess(fileHandle.truncate(0));
   }
   </script>
   <script type="text/javascript" src="file.js"></script>
diff --git a/dom/indexedDB/test/unit/test_wasm_put_get_values.js b/dom/indexedDB/test/unit/test_wasm_put_get_values.js
index 3d4062aafeaf..d84633910186 100644
--- a/dom/indexedDB/test/unit/test_wasm_put_get_values.js
+++ b/dom/indexedDB/test/unit/test_wasm_put_get_values.js
@@ -19,8 +19,10 @@ function* testSteps() {
     return;
   }
 
-  getWasmBinary(`(module (func (export "run") (result i32) (i32.const 13)))`);
-  let binary = yield undefined;
+  // js -e 'print(wasmTextToBinary(`(module (func (export "run") (result i32) (i32.const 13)))`))'
+  // eslint-disable-next-line
+  let binary = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,114,117,110,0,0,10,6,1,4,0,65,13,11]);
+
   wasmData.value = getWasmModule(binary);
 
   info("Opening database");
diff --git a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js
index d5d438b20c81..17e2913ceb4a 100644
--- a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js
+++ b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js
@@ -406,19 +406,6 @@ function isWasmSupported() {
   return testingFunctions.wasmIsSupported();
 }
 
-function getWasmBinarySync(text) {
-  let testingFunctions = Cu.getJSTestingFunctions();
-  let binary = testingFunctions.wasmTextToBinary(text);
-  return binary;
-}
-
-function getWasmBinary(text) {
-  let binary = getWasmBinarySync(text);
-  executeSoon(function() {
-    testGenerator.next(binary);
-  });
-}
-
 function getWasmModule(binary) {
   let module = new WebAssembly.Module(binary);
   return module;
diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp
index 9d0d1f778376..31004668460f 100644
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -1899,6 +1899,7 @@ MediaManager::MediaManager(UniquePtr<base::Thread> aMediaThread)
   mPrefs.mAecOn = false;
   mPrefs.mUseAecMobile = false;
   mPrefs.mAgcOn = false;
+  mPrefs.mHPFOn = false;
   mPrefs.mNoiseOn = false;
   mPrefs.mExtendedFilter = true;
   mPrefs.mDelayAgnostic = true;
@@ -1925,13 +1926,15 @@ MediaManager::MediaManager(UniquePtr<base::Thread> aMediaThread)
     }
   }
   LOG("%s: default prefs: %dx%d @%dfps, %dHz test tones, aec: %s,"
-      "agc: %s, noise: %s, aec level: %d, agc level: %d, noise level: %d,"
+      "agc: %s, hpf: %s, noise: %s, aec level: %d, agc level: %d, noise level: "
+      "%d,"
       "%sfull_duplex, extended aec %s, delay_agnostic %s "
       "channels %d",
       __FUNCTION__, mPrefs.mWidth, mPrefs.mHeight, mPrefs.mFPS, mPrefs.mFreq,
       mPrefs.mAecOn ? "on" : "off", mPrefs.mAgcOn ? "on" : "off",
-      mPrefs.mNoiseOn ? "on" : "off", mPrefs.mAec, mPrefs.mAgc, mPrefs.mNoise,
-      mPrefs.mFullDuplex ? "" : "not ", mPrefs.mExtendedFilter ? "on" : "off",
+      mPrefs.mHPFOn ? "on" : "off", mPrefs.mNoiseOn ? "on" : "off", mPrefs.mAec,
+      mPrefs.mAgc, mPrefs.mNoise, mPrefs.mFullDuplex ? "" : "not ",
+      mPrefs.mExtendedFilter ? "on" : "off",
       mPrefs.mDelayAgnostic ? "on" : "off", mPrefs.mChannels);
 }
 
@@ -2037,6 +2040,7 @@ MediaManager* MediaManager::Get() {
       prefs->AddObserver("media.getusermedia.aec", sSingleton, false);
       prefs->AddObserver("media.getusermedia.agc_enabled", sSingleton, false);
       prefs->AddObserver("media.getusermedia.agc", sSingleton, false);
+      prefs->AddObserver("media.getusermedia.hpf_enabled", sSingleton, false);
       prefs->AddObserver("media.getusermedia.noise_enabled", sSingleton, false);
       prefs->AddObserver("media.getusermedia.noise", sSingleton, false);
       prefs->AddObserver("media.ondevicechange.fakeDeviceChangeEvent.enabled",
@@ -3477,6 +3481,7 @@ void MediaManager::GetPrefs(nsIPrefBranch* aBranch, const char* aData) {
 #ifdef MOZ_WEBRTC
   GetPrefBool(aBranch, "media.getusermedia.aec_enabled", aData, &mPrefs.mAecOn);
   GetPrefBool(aBranch, "media.getusermedia.agc_enabled", aData, &mPrefs.mAgcOn);
+  GetPrefBool(aBranch, "media.getusermedia.hpf_enabled", aData, &mPrefs.mHPFOn);
   GetPrefBool(aBranch, "media.getusermedia.noise_enabled", aData,
               &mPrefs.mNoiseOn);
   GetPref(aBranch, "media.getusermedia.aec", aData, &mPrefs.mAec);
@@ -3533,6 +3538,7 @@ void MediaManager::Shutdown() {
     prefs->RemoveObserver("media.getusermedia.aec_enabled", this);
     prefs->RemoveObserver("media.getusermedia.aec", this);
     prefs->RemoveObserver("media.getusermedia.agc_enabled", this);
+    prefs->RemoveObserver("media.getusermedia.hpf_enabled", this);
     prefs->RemoveObserver("media.getusermedia.agc", this);
     prefs->RemoveObserver("media.getusermedia.noise_enabled", this);
     prefs->RemoveObserver("media.getusermedia.noise", this);
diff --git a/dom/media/webrtc/MediaEnginePrefs.h b/dom/media/webrtc/MediaEnginePrefs.h
index f782f3d098d8..1aa076ab72d7 100644
--- a/dom/media/webrtc/MediaEnginePrefs.h
+++ b/dom/media/webrtc/MediaEnginePrefs.h
@@ -28,6 +28,7 @@ class MediaEnginePrefs {
         mAecOn(false),
         mUseAecMobile(false),
         mAgcOn(false),
+        mHPFOn(false),
         mNoiseOn(false),
         mAec(0),
         mAgc(0),
@@ -45,6 +46,7 @@ class MediaEnginePrefs {
   bool mAecOn;
   bool mUseAecMobile;
   bool mAgcOn;
+  bool mHPFOn;
   bool mNoiseOn;
   int32_t mAec;
   int32_t mAgc;
diff --git a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
index c5dc0ff0a935..e38ee74b6aac 100644
--- a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
@@ -236,6 +236,35 @@ void MediaEngineWebRTCMicrophoneSource::UpdateAGCSettings(
       }));
 }
 
+void MediaEngineWebRTCMicrophoneSource::UpdateHPFSettings(bool aEnable) {
+  AssertIsOnOwningThread();
+
+  RefPtr<MediaEngineWebRTCMicrophoneSource> that = this;
+  NS_DispatchToMainThread(
+      NS_NewRunnableFunction(__func__, [that, track = mTrack, aEnable] {
+        class Message : public ControlMessage {
+         public:
+          Message(AudioInputProcessing* aInputProcessing, bool aEnable)
+              : ControlMessage(nullptr),
+                mInputProcessing(aInputProcessing),
+                mEnable(aEnable) {}
+
+          void Run() override { mInputProcessing->UpdateHPFSettings(mEnable); }
+
+         protected:
+          RefPtr<AudioInputProcessing> mInputProcessing;
+          bool mEnable;
+        };
+
+        if (track->IsDestroyed()) {
+          return;
+        }
+
+        track->GraphImpl()->AppendMessage(
+            MakeUnique<Message>(that->mInputProcessing, aEnable));
+      }));
+}
+
 void MediaEngineWebRTCMicrophoneSource::UpdateNSSettings(
     bool aEnable, webrtc::NoiseSuppression::Level aLevel) {
   AssertIsOnOwningThread();
@@ -324,6 +353,7 @@ void MediaEngineWebRTCMicrophoneSource::ApplySettings(
     UpdateAECSettings(
         aPrefs.mAecOn, aPrefs.mUseAecMobile,
         static_cast<webrtc::EchoCancellation::SuppressionLevel>(aPrefs.mAec));
+    UpdateHPFSettings(aPrefs.mHPFOn);
 
     UpdateAPMExtraOptions(mExtendedFilter, mDelayAgnostic);
   }
@@ -357,6 +387,8 @@ void MediaEngineWebRTCMicrophoneSource::ApplySettings(
           uint32_t mRequestedInputChannelCount;
         };
 
+        // The high-pass filter is not taken into account when activating the
+        // pass through, since it's not controllable from content.
         bool passThrough = !(prefs.mAecOn || prefs.mAgcOn || prefs.mNoiseOn);
         if (track->IsDestroyed()) {
           return;
@@ -690,6 +722,10 @@ void AudioInputProcessing::UpdateAGCSettings(bool aEnable,
   HANDLE_APM_ERROR(mAudioProcessing->gain_control()->Enable(aEnable));
 }
 
+void AudioInputProcessing::UpdateHPFSettings(bool aEnable) {
+  HANDLE_APM_ERROR(mAudioProcessing->high_pass_filter()->Enable(aEnable));
+}
+
 void AudioInputProcessing::UpdateNSSettings(
     bool aEnable, webrtc::NoiseSuppression::Level aLevel) {
   if (aLevel != NoiseSuppression::Level::kLow &&
diff --git a/dom/media/webrtc/MediaEngineWebRTCAudio.h b/dom/media/webrtc/MediaEngineWebRTCAudio.h
index c38da7fd6550..161166dd1029 100644
--- a/dom/media/webrtc/MediaEngineWebRTCAudio.h
+++ b/dom/media/webrtc/MediaEngineWebRTCAudio.h
@@ -95,6 +95,7 @@ class MediaEngineWebRTCMicrophoneSource : public MediaEngineSource {
   void UpdateAECSettings(bool aEnable, bool aUseAecMobile,
                          webrtc::EchoCancellation::SuppressionLevel aLevel);
   void UpdateAGCSettings(bool aEnable, webrtc::GainControl::Mode aMode);
+  void UpdateHPFSettings(bool aEnable);
   void UpdateNSSettings(bool aEnable, webrtc::NoiseSuppression::Level aLevel);
   void UpdateAPMExtraOptions(bool aExtendedFilter, bool aDelayAgnostic);
 
@@ -191,6 +192,7 @@ class AudioInputProcessing : public AudioDataListener {
   void UpdateAECSettings(bool aEnable, bool aUseAecMobile,
                          webrtc::EchoCancellation::SuppressionLevel aLevel);
   void UpdateAGCSettings(bool aEnable, webrtc::GainControl::Mode aMode);
+  void UpdateHPFSettings(bool aEnable);
   void UpdateNSSettings(bool aEnable, webrtc::NoiseSuppression::Level aLevel);
   void UpdateAPMExtraOptions(bool aExtendedFilter, bool aDelayAgnostic);
 
diff --git a/dom/promise/tests/test_webassembly_compile.html b/dom/promise/tests/test_webassembly_compile.html
index 2ac706d78ef2..9a2cefbc7504 100644
--- a/dom/promise/tests/test_webassembly_compile.html
+++ b/dom/promise/tests/test_webassembly_compile.html
@@ -10,7 +10,6 @@
 </head>
 <body>
 <script>
-const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary);
 const wasmIsSupported = SpecialPowers.Cu.getJSTestingFunctions().wasmIsSupported;
 
 // The test_webassembly_compile_sample.wasm is a medium-sized module with 100
diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp
index cbad7ff96c85..3f6b190cf810 100644
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -3940,6 +3940,10 @@ void QuotaManager::CollectPendingOriginsForListing(P aPredicate) {
 nsresult QuotaManager::Init(const nsAString& aBasePath) {
   mBasePath = aBasePath;
 
+#ifdef XP_WIN
+  CacheUseDOSDevicePathSyntaxPrefValue();
+#endif
+
   auto baseDirOrErr = QM_NewLocalFile(aBasePath);
   if (NS_WARN_IF(baseDirOrErr.isErr())) {
     return baseDirOrErr.unwrapErr();
diff --git a/dom/quota/FileStreams.cpp b/dom/quota/FileStreams.cpp
index 1aaa8a2c5a8f..bf94b5c5b6eb 100644
--- a/dom/quota/FileStreams.cpp
+++ b/dom/quota/FileStreams.cpp
@@ -21,7 +21,9 @@ NS_IMETHODIMP FileQuotaStream<FileStreamBase>::SetEOF() {
     nsresult rv = FileStreamBase::Tell(&offset);
     NS_ENSURE_SUCCESS(rv, rv);
 
-    mQuotaObject->MaybeUpdateSize(offset, /* aTruncate */ true);
+    DebugOnly<bool> res =
+        mQuotaObject->MaybeUpdateSize(offset, /* aTruncate */ true);
+    MOZ_ASSERT(res);
   }
 
   return NS_OK;
@@ -51,7 +53,9 @@ nsresult FileQuotaStream<FileStreamBase>::DoOpen() {
   NS_ENSURE_SUCCESS(rv, rv);
 
   if (mQuotaObject && (FileStreamBase::mOpenParams.ioFlags & PR_TRUNCATE)) {
-    mQuotaObject->MaybeUpdateSize(0, /* aTruncate */ true);
+    DebugOnly<bool> res =
+        mQuotaObject->MaybeUpdateSize(0, /* aTruncate */ true);
+    MOZ_ASSERT(res);
   }
 
   return NS_OK;
diff --git a/dom/quota/QuotaCommon.cpp b/dom/quota/QuotaCommon.cpp
index 5ab265ce986c..67ce07798a9d 100644
--- a/dom/quota/QuotaCommon.cpp
+++ b/dom/quota/QuotaCommon.cpp
@@ -8,7 +8,11 @@
 
 #include "mozilla/Logging.h"  // LazyLogModule
 #include "nsIFile.h"
+#include "nsXPCOM.h"
+#include "nsXULAppAPI.h"
 #ifdef XP_WIN
+#  include "mozilla/ipc/BackgroundParent.h"
+#  include "mozilla/StaticPrefs_dom.h"
 #  include "nsILocalFileWin.h"
 #endif
 #include "nsXPCOM.h"
@@ -19,6 +23,10 @@ namespace quota {
 
 namespace {
 
+#ifdef XP_WIN
+Atomic<int32_t> gUseDOSDevicePathSyntax(-1);
+#endif
+
 LazyLogModule gLogger("QuotaManager");
 
 void AnonymizeCString(nsACString& aCString, uint32_t aStart) {
@@ -72,6 +80,19 @@ void AnonymizeOriginString(nsACString& aOriginString) {
   AnonymizeCString(aOriginString, start);
 }
 
+#ifdef XP_WIN
+void CacheUseDOSDevicePathSyntaxPrefValue() {
+  MOZ_ASSERT(XRE_IsParentProcess());
+  AssertIsOnBackgroundThread();
+
+  if (gUseDOSDevicePathSyntax == -1) {
+    bool useDOSDevicePathSyntax =
+        StaticPrefs::dom_quotaManager_useDOSDevicePathSyntax_DoNotUseDirectly();
+    gUseDOSDevicePathSyntax = useDOSDevicePathSyntax ? 1 : 0;
+  }
+}
+#endif
+
 Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath) {
   nsCOMPtr<nsIFile> file;
   nsresult rv =
@@ -81,13 +102,17 @@ Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath) {
   }
 
 #ifdef XP_WIN
-  nsCOMPtr<nsILocalFileWin> winFile = do_QueryInterface(file, &rv);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return Err(rv);
-  }
+  MOZ_ASSERT(gUseDOSDevicePathSyntax != -1);
 
-  MOZ_ASSERT(winFile);
-  winFile->SetUseDOSDevicePathSyntax(true);
+  if (gUseDOSDevicePathSyntax) {
+    nsCOMPtr<nsILocalFileWin> winFile = do_QueryInterface(file, &rv);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return Err(rv);
+    }
+
+    MOZ_ASSERT(winFile);
+    winFile->SetUseDOSDevicePathSyntax(true);
+  }
 #endif
 
   return file;
diff --git a/dom/quota/QuotaCommon.h b/dom/quota/QuotaCommon.h
index 27413e6be799..e45d98205f93 100644
--- a/dom/quota/QuotaCommon.h
+++ b/dom/quota/QuotaCommon.h
@@ -163,6 +163,10 @@ void StringifyTableKeys(const T& aTable, nsACString& aResult) {
   }
 }
 
+#ifdef XP_WIN
+void CacheUseDOSDevicePathSyntaxPrefValue();
+#endif
+
 Result<nsCOMPtr<nsIFile>, nsresult> QM_NewLocalFile(const nsAString& aPath);
 
 class IntString : public nsAutoString {
diff --git a/dom/quota/QuotaObject.h b/dom/quota/QuotaObject.h
index 76967667ffa8..b6e29778cf89 100644
--- a/dom/quota/QuotaObject.h
+++ b/dom/quota/QuotaObject.h
@@ -32,7 +32,7 @@ class QuotaObject {
 
   const nsAString& Path() const { return mPath; }
 
-  bool MaybeUpdateSize(int64_t aSize, bool aTruncate);
+  [[nodiscard]] bool MaybeUpdateSize(int64_t aSize, bool aTruncate);
 
   bool IncreaseSize(int64_t aDelta);
 
diff --git a/dom/quota/test/unit/head-shared.js b/dom/quota/test/unit/head-shared.js
index 41fccb2f82d8..8ade6f0594ed 100644
--- a/dom/quota/test/unit/head-shared.js
+++ b/dom/quota/test/unit/head-shared.js
@@ -97,12 +97,18 @@ function continueToNextStepSync() {
 
 function enableTesting() {
   SpecialPowers.setBoolPref("dom.quotaManager.testing", true);
+  if (Services.appinfo.OS === "WINNT") {
+    SpecialPowers.setBoolPref("dom.quotaManager.useDOSDevicePathSyntax", true);
+  }
   SpecialPowers.setBoolPref("dom.simpleDB.enabled", true);
   SpecialPowers.setBoolPref("dom.storage.next_gen", true);
 }
 
 function resetTesting() {
   SpecialPowers.clearUserPref("dom.quotaManager.testing");
+  if (Services.appinfo.OS === "WINNT") {
+    SpecialPowers.clearUserPref("dom.quotaManager.useDOSDevicePathSyntax");
+  }
   SpecialPowers.clearUserPref("dom.simpleDB.enabled");
   SpecialPowers.clearUserPref("dom.storage.next_gen");
 }
diff --git a/dom/serviceworkers/test/test_notification_openWindow.html b/dom/serviceworkers/test/test_notification_openWindow.html
index 2a5233a61cc6..b7f381cdcdd4 100644
--- a/dom/serviceworkers/test/test_notification_openWindow.html
+++ b/dom/serviceworkers/test/test_notification_openWindow.html
@@ -29,7 +29,7 @@ add_task(async function setup() {
   MockServices.register();
   SimpleTest.requestFlakyTimeout("Mock alert service dispatches show and click events.");
   SimpleTest.registerCleanupFunction(() => {
-    MockServices.unregister()
+    MockServices.unregister();
   });
 });
 
@@ -43,25 +43,36 @@ add_task(async function test() {
     navigator.serviceWorker.onmessage = null;
   });
 
-  // The onclicknotification handler uses Clients.openWindow() to open a new
-  // window. This newly created window will attempt to open another window with
-  // Window.open() and some arbitrary URL. We crash before the second window
-  // finishes loading.
-  info("Showing notification.");
-  await swr.showNotification("notification");
+  for (let prefValue of [
+    SpecialPowers.Ci.nsIBrowserDOMWindow.OPEN_CURRENTWINDOW,
+    SpecialPowers.Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW,
+    SpecialPowers.Ci.nsIBrowserDOMWindow.OPEN_NEWTAB,
+  ]) {
+    info(`Setting browser.link.open_newwindow to ${prefValue}.`);
+    await SpecialPowers.pushPrefEnv({
+      set: [["browser.link.open_newwindow", prefValue]],
+    });
 
-  info("Waiting for \"DONE\" from worker.");
-  await new Promise(resolve => {
-    navigator.serviceWorker.onmessage = event => {
-      if (event.data !== "DONE") {
-        ok(false, `Unexpected message from service worker: ${JSON.stringify(event.data)}`);
+    // The onclicknotification handler uses Clients.openWindow() to open a new
+    // window. This newly created window will attempt to open another window with
+    // Window.open() and some arbitrary URL. We crash before the second window
+    // finishes loading.
+    info("Showing notification.");
+    await swr.showNotification("notification");
+
+    info("Waiting for \"DONE\" from worker.");
+    await new Promise(resolve => {
+      navigator.serviceWorker.onmessage = event => {
+        if (event.data !== "DONE") {
+          ok(false, `Unexpected message from service worker: ${JSON.stringify(event.data)}`);
+        }
+        resolve();
       }
-      resolve();
-    }
-  });
+    });
 
-  // If we make it here, then we didn't crash.
-  ok(true, "Didn't crash!");
+    // If we make it here, then we didn't crash.
+    ok(true, "Didn't crash!");
+  }
 });
 
 </script>
diff --git a/dom/tests/mochitest/general/test_interfaces.js b/dom/tests/mochitest/general/test_interfaces.js
index 8d40ac4f7c76..5b63e351fba4 100644
--- a/dom/tests/mochitest/general/test_interfaces.js
+++ b/dom/tests/mochitest/general/test_interfaces.js
@@ -167,15 +167,15 @@ var interfaceNamesInGlobalScope = [
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "AudioParam", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
-  { name: "AudioParamMap", insecureContext: false, nightly: true },
+  { name: "AudioParamMap", insecureContext: false },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "AudioProcessingEvent", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "AudioScheduledSourceNode", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
-  { name: "AudioWorklet", insecureContext: false, nightly: true },
+  { name: "AudioWorklet", insecureContext: false },
   // IMPORTANT: Do not change this list without review from a DOM peer!
-  { name: "AudioWorkletNode", insecureContext: false, nightly: true },
+  { name: "AudioWorkletNode", insecureContext: false },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "AuthenticatorAssertionResponse", android: false },
   // IMPORTANT: Do not change this list without review from a DOM peer!
@@ -1394,7 +1394,7 @@ var interfaceNamesInGlobalScope = [
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "Worker", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
-  { name: "Worklet", insecureContext: false, nightly: true },
+  { name: "Worklet", insecureContext: false },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "XMLDocument", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
diff --git a/dom/webgpu/mochitest/mochitest.ini b/dom/webgpu/mochitest/mochitest.ini
index 49f022b38ceb..e18c5586bf3b 100644
--- a/dom/webgpu/mochitest/mochitest.ini
+++ b/dom/webgpu/mochitest/mochitest.ini
@@ -1,6 +1,7 @@
 [DEFAULT]
 subsuite = webgpu
 prefs = dom.webgpu.enabled=true
+run_if = nightly_build
 
 [test_enabled.html]
 [test_device_creation.html]
diff --git a/dom/worklet/tests/test_audioWorklet_WASM.html b/dom/worklet/tests/test_audioWorklet_WASM.html
index 2195a8719b1c..92dd740d283b 100644
--- a/dom/worklet/tests/test_audioWorklet_WASM.html
+++ b/dom/worklet/tests/test_audioWorklet_WASM.html
@@ -35,10 +35,19 @@ function create_wasmModule() {
     ok(WebAssembly.compile, "WebAssembly.compile function should exist");
 
     const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary);
-    const fooModuleCode = wasmTextToBinary(`(module
-      (func $foo (result i32) (i32.const 42))
-      (export "foo" (func $foo))
-    )`);
+    /*
+      js -e '
+        t = wasmTextToBinary(`
+          (module
+            (func $foo (result i32) (i32.const 42))
+            (export "foo" (func $foo))
+          )
+        `);
+        print(t)
+      '
+    */
+    // eslint-disable-next-line
+    const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]);
 
     WebAssembly.compile(fooModuleCode).then(m => {
       ok(m instanceof WebAssembly.Module, "The WasmModule has been compiled.");
diff --git a/dom/worklet/tests/test_audioWorklet_options.html b/dom/worklet/tests/test_audioWorklet_options.html
index 4f001c334a94..714a09a2ce80 100644
--- a/dom/worklet/tests/test_audioWorklet_options.html
+++ b/dom/worklet/tests/test_audioWorklet_options.html
@@ -34,10 +34,20 @@ function create_wasmModule() {
     ok(WebAssembly.compile, "WebAssembly.compile function should exist");
 
     const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary);
-    const fooModuleCode = wasmTextToBinary(`(module
-      (func $foo (result i32) (i32.const 42))
-      (export "foo" (func $foo))
-    )`);
+
+    /*
+      js -e '
+        t = wasmTextToBinary(`
+          (module
+            (func $foo (result i32) (i32.const 42))
+            (export "foo" (func $foo))
+          )
+        `);
+        print(t)
+      '
+    */
+    // eslint-disable-next-line
+    const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]);
 
     WebAssembly.compile(fooModuleCode).then(m => {
       ok(m instanceof WebAssembly.Module, "The WasmModule has been compiled.");
diff --git a/dom/worklet/tests/test_promise.html b/dom/worklet/tests/test_promise.html
index fc371050d355..8ea71af9a631 100644
--- a/dom/worklet/tests/test_promise.html
+++ b/dom/worklet/tests/test_promise.html
@@ -35,10 +35,19 @@ function runTestInIframe() {
     }
 
     const wasmTextToBinary = SpecialPowers.unwrap(SpecialPowers.Cu.getJSTestingFunctions().wasmTextToBinary);
-    const fooModuleCode = wasmTextToBinary(`(module
-      (func $foo (result i32) (i32.const 42))
-      (export "foo" (func $foo))
-    )`);
+    /*
+      js -e '
+        t = wasmTextToBinary(`
+          (module
+            (func $foo (result i32) (i32.const 42))
+            (export "foo" (func $foo))
+          )
+        `);
+        print(t)
+      '
+    */
+    // eslint-disable-next-line
+    const fooModuleCode = new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,127,3,2,1,0,7,7,1,3,102,111,111,0,0,10,6,1,4,0,65,42,11,0,13,4,110,97,109,101,1,6,1,0,3,102,111,111]);
 
     node.port.postMessage(fooModuleCode);
   });
diff --git a/dom/xul/XULTreeElement.cpp b/dom/xul/XULTreeElement.cpp
index fe26ae9617b3..f9b3ca0a5f62 100644
--- a/dom/xul/XULTreeElement.cpp
+++ b/dom/xul/XULTreeElement.cpp
@@ -173,9 +173,9 @@ already_AddRefed<Element> XULTreeElement::GetTreeBody() {
   return nullptr;
 }
 
-already_AddRefed<nsTreeColumns> XULTreeElement::GetColumns() {
-  nsTreeBodyFrame* body = GetTreeBodyFrame();
-  if (body) {
+already_AddRefed<nsTreeColumns> XULTreeElement::GetColumns(
+    FlushType aFlushType) {
+  if (nsTreeBodyFrame* body = GetTreeBodyFrame(aFlushType)) {
     return body->Columns();
   }
   return nullptr;
diff --git a/dom/xul/XULTreeElement.h b/dom/xul/XULTreeElement.h
index 55a7767033a3..78e4926986c0 100644
--- a/dom/xul/XULTreeElement.h
+++ b/dom/xul/XULTreeElement.h
@@ -41,7 +41,7 @@ class XULTreeElement final : public nsXULElement {
   nsTreeBodyFrame* GetTreeBodyFrame(FlushType = FlushType::Frames);
   nsTreeBodyFrame* GetCachedTreeBodyFrame() { return mTreeBody; }
 
-  already_AddRefed<nsTreeColumns> GetColumns();
+  already_AddRefed<nsTreeColumns> GetColumns(FlushType = FlushType::Frames);
 
   already_AddRefed<nsITreeView> GetView(CallerType /* unused */) {
     return GetView();
diff --git a/gfx/thebes/DeviceManagerDx.cpp b/gfx/thebes/DeviceManagerDx.cpp
index 9ed382e14fad..04be5837311e 100644
--- a/gfx/thebes/DeviceManagerDx.cpp
+++ b/gfx/thebes/DeviceManagerDx.cpp
@@ -170,6 +170,34 @@ nsTArray<DXGI_OUTPUT_DESC1> DeviceManagerDx::EnumerateOutputs() {
   return outputs;
 }
 
+bool DeviceManagerDx::GetOutputFromMonitor(HMONITOR monitor,
+                                           RefPtr<IDXGIOutput>* aOutOutput) {
+  RefPtr<IDXGIAdapter> adapter = GetDXGIAdapter();
+
+  if (!adapter) {
+    NS_WARNING("Failed to acquire a DXGI adapter for GetOutputFromMonitor.");
+    return false;
+  }
+
+  for (UINT i = 0;; ++i) {
+    RefPtr<IDXGIOutput> output = nullptr;
+    if (FAILED(adapter->EnumOutputs(i, getter_AddRefs(output)))) {
+      break;
+    }
+
+    DXGI_OUTPUT_DESC desc;
+    if (FAILED(output->GetDesc(&desc))) {
+      continue;
+    }
+
+    if (desc.Monitor == monitor) {
+      *aOutOutput = output;
+      return true;
+    }
+  }
+  return false;
+}
+
 bool DeviceManagerDx::CheckHardwareStretchingSupport() {
   RefPtr<IDXGIAdapter> adapter = GetDXGIAdapter();
 
diff --git a/gfx/thebes/DeviceManagerDx.h b/gfx/thebes/DeviceManagerDx.h
index 3388163c3d95..23267bdb074c 100644
--- a/gfx/thebes/DeviceManagerDx.h
+++ b/gfx/thebes/DeviceManagerDx.h
@@ -87,6 +87,10 @@ class DeviceManagerDx final {
   // Enumerate and return all outputs on the current adapter.
   nsTArray<DXGI_OUTPUT_DESC1> EnumerateOutputs();
 
+  // find the IDXGIOutput with a description.Monitor matching
+  // 'monitor'; returns false if not found or some error occurred.
+  bool GetOutputFromMonitor(HMONITOR monitor, RefPtr<IDXGIOutput>* aOutOutput);
+
   // Check if the current adapter supports hardware stretching
   bool CheckHardwareStretchingSupport();
 
diff --git a/gfx/thebes/DisplayConfigWindows.cpp b/gfx/thebes/DisplayConfigWindows.cpp
new file mode 100644
index 000000000000..202380acf041
--- /dev/null
+++ b/gfx/thebes/DisplayConfigWindows.cpp
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * 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/. */
+
+#include <iostream>
+#include <windows.h>
+#include <wingdi.h>
+#include <optional>
+#include <vector>
+
+#include "DisplayConfigWindows.h"
+
+namespace mozilla {
+namespace gfx {
+
+using namespace std;
+
+struct DisplayConfig {
+  vector<DISPLAYCONFIG_PATH_INFO> mPaths;
+  vector<DISPLAYCONFIG_MODE_INFO> mModes;
+};
+
+optional<DisplayConfig> GetDisplayConfig() {
+  LONG result;
+
+  UINT32 numPaths;
+  UINT32 numModes;
+  vector<DISPLAYCONFIG_PATH_INFO> paths;
+  vector<DISPLAYCONFIG_MODE_INFO> modes;
+  do {
+    result = GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &numPaths,
+                                         &numModes);
+    if (result != ERROR_SUCCESS) {
+      return {};
+    }
+    // allocate the recommended amount of space
+    paths.resize(numPaths);
+    modes.resize(numModes);
+
+    result = QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &numPaths, paths.data(),
+                                &numModes, modes.data(), NULL);
+    // try again if there wasn't enough space
+  } while (result == ERROR_INSUFFICIENT_BUFFER);
+
+  if (result != ERROR_SUCCESS) return {};
+
+  // shrink to fit the actual number of modes and paths returned
+  modes.resize(numModes);
+  paths.resize(numPaths);
+
+  return DisplayConfig{paths, modes};
+}
+
+bool HasScaledResolution() {
+  auto config = GetDisplayConfig();
+  if (config) {
+    for (auto& path : config->mPaths) {
+      auto& modes = config->mModes;
+      int targetModeIndex = path.targetInfo.modeInfoIdx;
+      int sourceModeIndex = path.sourceInfo.modeInfoIdx;
+
+      // Check if the source and target resolutions are different
+      if ((modes[targetModeIndex]
+               .targetMode.targetVideoSignalInfo.activeSize.cx !=
+           modes[sourceModeIndex].sourceMode.width) ||
+          (modes[targetModeIndex]
+               .targetMode.targetVideoSignalInfo.activeSize.cy !=
+           modes[sourceModeIndex].sourceMode.height)) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+}  // namespace gfx
+}  // namespace mozilla
diff --git a/gfx/thebes/DisplayConfigWindows.h b/gfx/thebes/DisplayConfigWindows.h
new file mode 100644
index 000000000000..93d3d12d12ea
--- /dev/null
+++ b/gfx/thebes/DisplayConfigWindows.h
@@ -0,0 +1,17 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * 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/. */
+
+#ifndef mozilla_gfx_thebes_DisplayConfigWindows_h
+#define mozilla_gfx_thebes_DisplayConfigWindows_h
+
+namespace mozilla {
+namespace gfx {
+
+extern bool HasScaledResolution();
+
+}  // namespace gfx
+}  // namespace mozilla
+
+#endif  // mozilla_gfx_thebes_DisplayConfigWindows_h
diff --git a/gfx/thebes/SharedFontList.h b/gfx/thebes/SharedFontList.h
index c7e242ef3bd1..0de4b3035071 100644
--- a/gfx/thebes/SharedFontList.h
+++ b/gfx/thebes/SharedFontList.h
@@ -92,9 +92,12 @@ struct String {
 
   const nsCString AsString(FontList* aList) const {
     MOZ_ASSERT(!mPointer.IsNull());
-    nsCString res;
-    res.AssignLiteral(static_cast<const char*>(mPointer.ToPtr(aList)), mLength);
-    return res;
+    // It's tempting to use AssignLiteral here so that we get an nsCString that
+    // simply wraps the character data in the shmem block without needing to
+    // allocate or copy. But that's unsafe because in the event of font-list
+    // reinitalization, that shared memory will be unmapped; then any copy of
+    // the nsCString that may still be around will crash if accessed.
+    return nsCString(static_cast<const char*>(mPointer.ToPtr(aList)), mLength);
   }
 
   void Assign(const nsACString& aString, FontList* aList);
diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp
index bb0324408fae..7128895b0e6e 100644
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -64,6 +64,7 @@
 
 #if defined(XP_WIN)
 #  include "gfxWindowsPlatform.h"
+#  include "DisplayConfigWindows.h"
 #elif defined(XP_MACOSX)
 #  include "gfxPlatformMac.h"
 #  include "gfxQuartzSurface.h"
@@ -3060,7 +3061,8 @@ void gfxPlatform::InitWebRenderConfig() {
   // Disable native compositor when hardware stretching is not supported. It is
   // for avoiding a problem like Bug 1618370.
   // XXX Is there a better check for Bug 1618370?
-  if (!DeviceManagerDx::Get()->CheckHardwareStretchingSupport()) {
+  if (!DeviceManagerDx::Get()->CheckHardwareStretchingSupport() &&
+      HasScaledResolution()) {
     featureComp.Disable(
         FeatureStatus::Unavailable, "No hardware stretching support",
         NS_LITERAL_CSTRING("FEATURE_FAILURE_NO_HARDWARE_STRETCHING"));
@@ -3115,6 +3117,11 @@ void gfxPlatform::InitWebRenderConfig() {
 void gfxPlatform::InitWebGPUConfig() {
   FeatureState& feature = gfxConfig::GetFeature(Feature::WEBGPU);
   feature.SetDefaultFromPref("dom.webgpu.enabled", true, false);
+#ifndef NIGHTLY_BUILD
+  feature.ForceDisable(FeatureStatus::Blocked,
+                       "WebGPU can only be enabled in nightly",
+                       NS_LITERAL_CSTRING("WEBGPU_DISABLE_NON_NIGHTLY"));
+#endif
 }
 
 void gfxPlatform::InitOMTPConfig() {
diff --git a/gfx/thebes/gfxPlatformFontList.cpp b/gfx/thebes/gfxPlatformFontList.cpp
index 1c9fd2729f8a..4b78804c2ff2 100644
--- a/gfx/thebes/gfxPlatformFontList.cpp
+++ b/gfx/thebes/gfxPlatformFontList.cpp
@@ -1059,10 +1059,10 @@ bool gfxPlatformFontList::FindAndAddFamilies(
         }
         mOtherNamesMissed->PutEntry(key);
       }
-      if (family) {
-        aOutput->AppendElement(FamilyAndGeneric(family, aGeneric));
-        return true;
-      }
+    }
+    if (family) {
+      aOutput->AppendElement(FamilyAndGeneric(family, aGeneric));
+      return true;
     }
     return false;
   }
@@ -1862,12 +1862,17 @@ void gfxPlatformFontList::GetFontFamilyNames(
     fontlist::FontList* list = SharedFontList();
     const fontlist::Family* families = list->Families();
     for (uint32_t i = 0, n = list->NumFamilies(); i < n; i++) {
-      aFontFamilyNames.AppendElement(families[i].DisplayName().AsString(list));
+      const fontlist::Family& family = families[i];
+      if (!family.IsHidden()) {
+        aFontFamilyNames.AppendElement(family.DisplayName().AsString(list));
+      }
     }
   } else {
     for (auto iter = mFontFamilies.Iter(); !iter.Done(); iter.Next()) {
       RefPtr<gfxFontFamily>& family = iter.Data();
-      aFontFamilyNames.AppendElement(family->Name());
+      if (!family->IsHidden()) {
+        aFontFamilyNames.AppendElement(family->Name());
+      }
     }
   }
 }
@@ -1939,9 +1944,6 @@ bool gfxPlatformFontList::LoadFontInfo() {
       if (!family) {
         continue;
       }
-      if (family->IsHidden()) {
-        continue;
-      }
       ReadFaceNamesForFamily(family, NeedFullnamePostscriptNames());
     } else {
       // lookup in canonical (i.e. English) family name list
diff --git a/gfx/thebes/gfxTextRun.cpp b/gfx/thebes/gfxTextRun.cpp
index c7fda899c37c..57670c548d0e 100644
--- a/gfx/thebes/gfxTextRun.cpp
+++ b/gfx/thebes/gfxTextRun.cpp
@@ -1736,7 +1736,8 @@ void gfxFontGroup::BuildFontList() {
 
   if (mFontMatchingStats) {
     for (const auto& f : fonts) {
-      nsAutoCString key;
+      nsCString key;  // not nsAutoCString, as the assignment to it won't copy
+                      // characters, it'll just share the string buffer
       FontVisibility visibility;
       if (f.mFamily.mIsShared) {
         key = f.mFamily.mShared->Key().AsString(pfl->SharedFontList());
diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp
index b7af2718eac6..e527a114dadf 100644
--- a/gfx/thebes/gfxWindowsPlatform.cpp
+++ b/gfx/thebes/gfxWindowsPlatform.cpp
@@ -1591,7 +1591,8 @@ class D3DVsyncSource final : public VsyncSource {
     D3DVsyncDisplay()
         : mPrevVsync(TimeStamp::Now()),
           mVsyncEnabledLock("D3DVsyncEnabledLock"),
-          mVsyncEnabled(false) {
+          mVsyncEnabled(false),
+          mWaitVBlankMonitor(NULL) {
       mVsyncThread = new base::Thread("WindowsVsyncThread");
       MOZ_RELEASE_ASSERT(mVsyncThread->Start(),
                          "GFX: Could not start Windows vsync thread");
@@ -1766,9 +1767,16 @@ class D3DVsyncSource final : public VsyncSource {
           return;
         }
 
-        // Using WaitForVBlank, the whole system dies because WaitForVBlank
-        // only works if it's run on the same thread as the Present();
-        HRESULT hr = DwmFlush();
+        HRESULT hr = E_FAIL;
+        if (StaticPrefs::gfx_vsync_use_waitforvblank()) {
+          UpdateVBlankOutput();
+          if (mWaitVBlankOutput) {
+            hr = mWaitVBlankOutput->WaitForVBlank();
+          }
+        }
+        if (!SUCCEEDED(hr)) {
+          hr = DwmFlush();
+        }
         if (!SUCCEEDED(hr)) {
           // DWMFlush isn't working, fallback to software vsync.
           ScheduleSoftwareVsync(TimeStamp::Now());
@@ -1816,11 +1824,35 @@ class D3DVsyncSource final : public VsyncSource {
       return mVsyncThread->thread_id() == PlatformThread::CurrentId();
     }
 
+    void UpdateVBlankOutput() {
+      HMONITOR primary_monitor =
+          MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
+      if (primary_monitor == mWaitVBlankMonitor && mWaitVBlankOutput) {
+        return;
+      }
+
+      mWaitVBlankMonitor = primary_monitor;
+
+      RefPtr<IDXGIOutput> output = nullptr;
+      if (DeviceManagerDx* dx = DeviceManagerDx::Get()) {
+        if (dx->GetOutputFromMonitor(mWaitVBlankMonitor, &output)) {
+          mWaitVBlankOutput = output;
+          return;
+        }
+      }
+
+      // failed to convert a monitor to an output so keep trying
+      mWaitVBlankOutput = nullptr;
+    }
+
     TimeStamp mPrevVsync;
     Monitor mVsyncEnabledLock;
     base::Thread* mVsyncThread;
     TimeDuration mVsyncRate;
     bool mVsyncEnabled;
+
+    HMONITOR mWaitVBlankMonitor;
+    RefPtr<IDXGIOutput> mWaitVBlankOutput;
   };  // end d3dvsyncdisplay
 
   D3DVsyncSource() { mPrimaryDisplay = new D3DVsyncDisplay(); }
diff --git a/gfx/thebes/moz.build b/gfx/thebes/moz.build
index 313e750a75ea..001431ce7e30 100644
--- a/gfx/thebes/moz.build
+++ b/gfx/thebes/moz.build
@@ -155,6 +155,7 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
         'PrintTargetWindows.h',
     ]
     SOURCES += [
+        'DisplayConfigWindows.cpp',
         'gfxDWriteCommon.cpp',
         'gfxDWriteFonts.cpp',
         'gfxGDIFont.cpp',
diff --git a/gfx/wr/webrender/src/clip.rs b/gfx/wr/webrender/src/clip.rs
index 1e6d0dcde411..94bf7aeda61e 100644
--- a/gfx/wr/webrender/src/clip.rs
+++ b/gfx/wr/webrender/src/clip.rs
@@ -107,8 +107,9 @@ use crate::prim_store::{ClipData, ImageMaskData, SpaceMapper, VisibleMaskImageTi
 use crate::prim_store::{PointKey, SizeKey, RectangleKey};
 use crate::render_task_cache::to_cache_size;
 use crate::resource_cache::{ImageRequest, ResourceCache};
-use std::{iter, ops, u32};
 use crate::util::{extract_inner_rect_safe, project_rect, ScaleOffset};
+use euclid::approxeq::ApproxEq;
+use std::{iter, ops, u32};
 
 // Type definitions for interning clip nodes.
 
@@ -1573,24 +1574,25 @@ pub fn projected_rect_contains(
         target_rect.bottom_right(),
         target_rect.bottom_left(),
     ];
-
     // iterate the edges of the transformed polygon
     for (a, b) in points
         .iter()
         .cloned()
         .zip(points[1..].iter().cloned().chain(iter::once(points[0])))
     {
-        // check if every destination point is on the right of the edge
-        for &c in target_points.iter() {
-            if (b - a).cross(c - a) < 0.0 {
-                return None
-            }
+        // If this edge is redundant, it's a weird, case, and we shouldn't go
+        // length in trying to take the fast path (e.g. when the whole rectangle is a point).
+        // If any of edges of the target rectangle crosses the edge, it's not completely
+        // inside our transformed polygon either.
+        if a.approx_eq(&b) || target_points.iter().any(|&c| (b - a).cross(c - a) < 0.0) {
+            return None
         }
     }
 
     Some(())
 }
 
+
 // Add a clip node into the list of clips to be processed
 // for the current clip chain. Returns false if the clip
 // results in the entire primitive being culled out.
@@ -1650,3 +1652,22 @@ fn add_clip_node_to_current_chain(
 
     true
 }
+
+#[cfg(test)]
+mod tests {
+    use super::projected_rect_contains;
+    use euclid::{Transform3D, rect};
+
+    #[test]
+    fn test_empty_projected_rect() {
+        assert_eq!(
+            None,
+            projected_rect_contains(
+                &rect(10.0, 10.0, 0.0, 0.0),
+                &Transform3D::identity(),
+                &rect(20.0, 20.0, 10.0, 10.0),
+            ),
+            "Empty rectangle is considered to include a non-empty!"
+        );
+    }
+}
diff --git a/gfx/wr/webrender/src/device/gl.rs b/gfx/wr/webrender/src/device/gl.rs
index 66d44b0ade37..a2ad9116bd92 100644
--- a/gfx/wr/webrender/src/device/gl.rs
+++ b/gfx/wr/webrender/src/device/gl.rs
@@ -1032,6 +1032,26 @@ enum TexStorageUsage {
     Always,
 }
 
+/// Describes a required alignment for a stride,
+/// which can either be represented in bytes or pixels.
+#[derive(Copy, Clone, Debug)]
+pub enum StrideAlignment {
+    Bytes(NonZeroUsize),
+    Pixels(NonZeroUsize),
+}
+
+impl StrideAlignment {
+    pub fn num_bytes(&self, format: ImageFormat) -> NonZeroUsize {
+        match *self {
+            Self::Bytes(bytes) => bytes,
+            Self::Pixels(pixels) => {
+                assert!(format.bytes_per_pixel() > 0);
+                NonZeroUsize::new(pixels.get() * format.bytes_per_pixel() as usize).unwrap()
+            }
+        }
+    }
+}
+
 // We get 24 bits of Z value - use up 22 bits of it to give us
 // 4 bits to account for GPU issues. This seems to manifest on
 // some GPUs under certain perspectives due to z interpolation
@@ -1097,7 +1117,7 @@ pub struct Device {
     /// format, we fall back to glTexImage*.
     texture_storage_usage: TexStorageUsage,
 
-    optimal_pbo_stride: NonZeroUsize,
+    optimal_pbo_stride: StrideAlignment,
 
     /// Whether we must ensure the source strings passed to glShaderSource()
     /// are null-terminated, to work around driver bugs.
@@ -1520,16 +1540,22 @@ impl Device {
         // strings are not null-terminated. See bug 1591945.
         let requires_null_terminated_shader_source = is_emulator;
 
-        // On Adreno GPUs PBO texture upload is only performed asynchronously
-        // if the stride of the data in the PBO is a multiple of 256 bytes.
+        let is_amd_macos = cfg!(target_os = "macos") && renderer_name.starts_with("AMD");
+
+        // On certain GPUs PBO texture upload is only performed asynchronously
+        // if the stride of the data is a multiple of a certain value.
+        // On Adreno it must be a multiple of 64 pixels, meaning value in bytes
+        // varies with the texture format.
+        // On AMD Mac, it must always be a multiple of 256 bytes.
         // Other platforms may have similar requirements and should be added
         // here.
-        // The default value should be 4.
-        let is_amd_macos = cfg!(target_os = "macos") && renderer_name.starts_with("AMD");
-        let optimal_pbo_stride = if is_adreno || is_amd_macos {
-            NonZeroUsize::new(256).unwrap()
+        // The default value should be 4 bytes.
+        let optimal_pbo_stride = if is_adreno {
+            StrideAlignment::Pixels(NonZeroUsize::new(64).unwrap())
+        } else if is_amd_macos {
+            StrideAlignment::Bytes(NonZeroUsize::new(256).unwrap())
         } else {
-            NonZeroUsize::new(4).unwrap()
+            StrideAlignment::Bytes(NonZeroUsize::new(4).unwrap())
         };
 
         // On AMD Macs there is a driver bug which causes some texture uploads
@@ -1660,7 +1686,7 @@ impl Device {
         return (self.max_depth_ids() - 1) as f32;
     }
 
-    pub fn optimal_pbo_stride(&self) -> NonZeroUsize {
+    pub fn optimal_pbo_stride(&self) -> StrideAlignment {
         self.optimal_pbo_stride
     }
 
@@ -2858,7 +2884,7 @@ impl Device {
         let bytes_pp = format.bytes_per_pixel() as usize;
         let width_bytes = size.width as usize * bytes_pp;
 
-        let dst_stride = round_up_to_multiple(width_bytes, self.optimal_pbo_stride);
+        let dst_stride = round_up_to_multiple(width_bytes, self.optimal_pbo_stride.num_bytes(format));
 
         // The size of the chunk should only need to be (height - 1) * dst_stride + width_bytes,
         // however, the android emulator will error unless it is height * dst_stride.
diff --git a/gfx/wr/webrender/src/frame_builder.rs b/gfx/wr/webrender/src/frame_builder.rs
index 2942ba285532..88f838442fd9 100644
--- a/gfx/wr/webrender/src/frame_builder.rs
+++ b/gfx/wr/webrender/src/frame_builder.rs
@@ -67,6 +67,7 @@ pub struct FrameBuilderConfig {
     pub compositor_kind: CompositorKind,
     pub tile_size_override: Option<DeviceIntSize>,
     pub max_depth_ids: i32,
+    pub max_target_size: i32,
 }
 
 /// A set of common / global resources that are retained between
diff --git a/gfx/wr/webrender/src/picture.rs b/gfx/wr/webrender/src/picture.rs
index 73ce7c1a2c9b..d8faf40c9560 100644
--- a/gfx/wr/webrender/src/picture.rs
+++ b/gfx/wr/webrender/src/picture.rs
@@ -4630,6 +4630,7 @@ impl PicturePrimitive {
                 /// font size, etc. need to be scaled accordingly.
                 fn adjust_scale_for_max_surface_size(
                     raster_config: &RasterConfig,
+                    max_target_size: i32,
                     pic_rect: PictureRect,
                     map_pic_to_raster: &SpaceMapper<PicturePixel, RasterPixel>,
                     map_raster_to_world: &SpaceMapper<RasterPixel, WorldPixel>,
@@ -4638,13 +4639,15 @@ impl PicturePrimitive {
                     device_rect: &mut DeviceIntRect,
                     unclipped: &mut DeviceRect) -> Option<f32>
                 {
-                    if raster_config.establishes_raster_root &&
-                        (device_rect.size.width  > (MAX_SURFACE_SIZE as i32) ||
-                        device_rect.size.height > (MAX_SURFACE_SIZE as i32))
-                    {
+                    let limit = if raster_config.establishes_raster_root {
+                        MAX_SURFACE_SIZE as i32
+                    } else {
+                        max_target_size
+                    };
+                    if device_rect.size.width  > limit || device_rect.size.height > limit {
                         // round_out will grow by 1 integer pixel if origin is on a
                         // fractional position, so keep that margin for error with -1:
-                        let scale = (MAX_SURFACE_SIZE as f32 - 1.0) /
+                        let scale = (limit as f32 - 1.0) /
                                     (i32::max(device_rect.size.width, device_rect.size.height) as f32);
                         *device_pixel_scale = *device_pixel_scale * Scale::new(scale);
                         let new_device_rect = device_rect.to_f32() * Scale::new(scale);
@@ -4717,10 +4720,11 @@ impl PicturePrimitive {
                         );
 
                         if let Some(scale) = adjust_scale_for_max_surface_size(
-                                                raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world,
-                                                clipped_prim_bounding_rect,
-                                                &mut device_pixel_scale, &mut device_rect, &mut unclipped)
-                        {
+                            raster_config, frame_context.fb_config.max_target_size,
+                            pic_rect, &map_pic_to_raster, &map_raster_to_world,
+                            clipped_prim_bounding_rect,
+                            &mut device_pixel_scale, &mut device_rect, &mut unclipped,
+                        ) {
                             blur_std_deviation = blur_std_deviation * scale;
                             original_size = (original_size.to_f32() * scale).try_cast::<i32>().unwrap();
                             raster_config.root_scaling_factor = scale;
@@ -4791,10 +4795,11 @@ impl PicturePrimitive {
                         );
 
                         if let Some(scale) = adjust_scale_for_max_surface_size(
-                            raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world,
+                            raster_config, frame_context.fb_config.max_target_size,
+                            pic_rect, &map_pic_to_raster, &map_raster_to_world,
                             clipped_prim_bounding_rect,
-                            &mut device_pixel_scale, &mut device_rect, &mut unclipped)
-                        {
+                            &mut device_pixel_scale, &mut device_rect, &mut unclipped,
+                        ) {
                             // std_dev adjusts automatically from using device_pixel_scale
                             raster_config.root_scaling_factor = scale;
                         }
@@ -4889,10 +4894,11 @@ impl PicturePrimitive {
                     PictureCompositeMode::Filter(..) => {
 
                         if let Some(scale) = adjust_scale_for_max_surface_size(
-                            raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world,
+                            raster_config, frame_context.fb_config.max_target_size,
+                            pic_rect, &map_pic_to_raster, &map_raster_to_world,
                             clipped_prim_bounding_rect,
-                            &mut device_pixel_scale, &mut clipped, &mut unclipped)
-                        {
+                            &mut device_pixel_scale, &mut clipped, &mut unclipped,
+                        ) {
                             raster_config.root_scaling_factor = scale;
                         }
 
@@ -4922,10 +4928,11 @@ impl PicturePrimitive {
                     }
                     PictureCompositeMode::ComponentTransferFilter(..) => {
                         if let Some(scale) = adjust_scale_for_max_surface_size(
-                            raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world,
+                            raster_config, frame_context.fb_config.max_target_size,
+                            pic_rect, &map_pic_to_raster, &map_raster_to_world,
                             clipped_prim_bounding_rect,
-                            &mut device_pixel_scale, &mut clipped, &mut unclipped)
-                        {
+                            &mut device_pixel_scale, &mut clipped, &mut unclipped,
+                        ) {
                             raster_config.root_scaling_factor = scale;
                         }
 
@@ -5228,10 +5235,11 @@ impl PicturePrimitive {
                     PictureCompositeMode::MixBlend(..) |
                     PictureCompositeMode::Blit(_) => {
                         if let Some(scale) = adjust_scale_for_max_surface_size(
-                            raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world,
+                            raster_config, frame_context.fb_config.max_target_size,
+                            pic_rect, &map_pic_to_raster, &map_raster_to_world,
                             clipped_prim_bounding_rect,
-                            &mut device_pixel_scale, &mut clipped, &mut unclipped)
-                        {
+                            &mut device_pixel_scale, &mut clipped, &mut unclipped,
+                        ) {
                             raster_config.root_scaling_factor = scale;
                         }
 
@@ -5262,10 +5270,11 @@ impl PicturePrimitive {
                     PictureCompositeMode::SvgFilter(ref primitives, ref filter_datas) => {
 
                         if let Some(scale) = adjust_scale_for_max_surface_size(
-                            raster_config, pic_rect, &map_pic_to_raster, &map_raster_to_world,
+                            raster_config, frame_context.fb_config.max_target_size,
+                            pic_rect, &map_pic_to_raster, &map_raster_to_world,
                             clipped_prim_bounding_rect,
-                            &mut device_pixel_scale, &mut clipped, &mut unclipped)
-                        {
+                            &mut device_pixel_scale, &mut clipped, &mut unclipped,
+                        ) {
                             raster_config.root_scaling_factor = scale;
                         }
 
diff --git a/gfx/wr/webrender/src/renderer.rs b/gfx/wr/webrender/src/renderer.rs
index fe17540e59e0..3bed6acf5269 100644
--- a/gfx/wr/webrender/src/renderer.rs
+++ b/gfx/wr/webrender/src/renderer.rs
@@ -2276,6 +2276,7 @@ impl Renderer {
             compositor_kind,
             tile_size_override: None,
             max_depth_ids: device.max_depth_ids(),
+            max_target_size: max_texture_size,
         };
         info!("WR {:?}", config);
 
@@ -2559,8 +2560,8 @@ impl Renderer {
         self.device.preferred_color_formats().external
     }
 
-    pub fn optimal_texture_stride_alignment(&self) -> usize {
-        self.device.optimal_pbo_stride().get()
+    pub fn optimal_texture_stride_alignment(&self, format: ImageFormat) -> usize {
+        self.device.optimal_pbo_stride().num_bytes(format).get()
     }
 
     pub fn flush_pipeline_info(&mut self) -> PipelineInfo {
diff --git a/gfx/wr/webrender/src/scene.rs b/gfx/wr/webrender/src/scene.rs
index 7498f9dae5e5..3caf68ab6035 100644
--- a/gfx/wr/webrender/src/scene.rs
+++ b/gfx/wr/webrender/src/scene.rs
@@ -309,6 +309,7 @@ impl BuiltScene {
                 compositor_kind: CompositorKind::default(),
                 tile_size_override: None,
                 max_depth_ids: 0,
+                max_target_size: 0,
             },
         }
     }
diff --git a/gfx/wr/webrender/src/screen_capture.rs b/gfx/wr/webrender/src/screen_capture.rs
index 5941f4e8c5ad..56fdf4586749 100644
--- a/gfx/wr/webrender/src/screen_capture.rs
+++ b/gfx/wr/webrender/src/screen_capture.rs
@@ -141,7 +141,7 @@ impl AsyncScreenshotGrabber {
         let read_size = match self.mode {
             AsyncScreenshotGrabberMode::ProfilerScreenshots => {
                 let stride = (screenshot_size.width * image_format.bytes_per_pixel()) as usize;
-                let rounded = round_up_to_multiple(stride, device.optimal_pbo_stride());
+                let rounded = round_up_to_multiple(stride, device.optimal_pbo_stride().num_bytes(image_format));
                 let optimal_width = rounded as i32 / image_format.bytes_per_pixel();
 
                 DeviceIntSize::new(
diff --git a/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect-ref.yaml b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect-ref.yaml
new file mode 100644
index 000000000000..0dea07f57dc3
--- /dev/null
+++ b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect-ref.yaml
@@ -0,0 +1,20 @@
+# In this case, the inner rectangle of the clip is empty, because
+# the size is 200 and each corner radius is 100.
+# The blue rect should be fully invisible
+---
+root:
+  items:
+    -
+      type: "stacking-context"
+      bounds: [0, 0, 0, 0]
+      items:
+        -
+          type: clip
+          bounds: [0, 0, 200, 200]
+          complex:
+            - rect: [ 0, 0, 200, 200 ]
+              radius: 100
+          items:
+            - type: rect
+              bounds: [ 0, 0, 200, 200 ]
+              color: red
diff --git a/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect.yaml b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect.yaml
new file mode 100644
index 000000000000..f8165f90d325
--- /dev/null
+++ b/gfx/wr/wrench/reftests/clip/clip-empty-inner-rect.yaml
@@ -0,0 +1,28 @@
+# In this case, the inner rectangle of the clip is empty, because
+# the size is 200 and each corner radius is 100.
+# The blue rect should be fully invisible
+---
+root:
+  items:
+    -
+      type: "stacking-context"
+      bounds: [0, 0, 0, 0]
+      items:
+        -
+          type: clip
+          bounds: [0, 0, 200, 200]
+          complex:
+            - rect: [ 0, 0, 200, 200 ]
+              radius: 100
+          items:
+            - type: rect
+              bounds: [ 0, 0, 200, 200 ]
+              color: red
+            - type: "stacking-context"
+              bounds: [0, 0, 0, 0]
+              transform: translate(0, 0, 1)
+              items:
+                -
+                  type: rect
+                  bounds: [0, 0, 25, 25]
+                  color: blue
diff --git a/gfx/wr/wrench/reftests/clip/reftest.list b/gfx/wr/wrench/reftests/clip/reftest.list
index a436496bb168..8e8f217f7392 100644
--- a/gfx/wr/wrench/reftests/clip/reftest.list
+++ b/gfx/wr/wrench/reftests/clip/reftest.list
@@ -14,4 +14,4 @@ skip_on(android,device) == color_targets(3) alpha_targets(1) stacking-context-cl
 fuzzy(70,2400) == clip-and-filter-with-rotation.yaml clip-and-filter-with-rotation-ref.yaml
 color_targets(1) alpha_targets(0) == clip-out-rotation.yaml blank.yaml # Unexpected color targets, see bug 1580795
 == clipped-occlusion.yaml clipped-occlusion-ref.yaml
-== clip-thin-rotated.yaml clip-thin-rotated-ref.yaml
+== clip-empty-inner-rect.yaml clip-empty-inner-rect-ref.yaml
diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp
index 8197d420d57c..e2f6fa0999fc 100644
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -93,7 +93,6 @@
 #include "wasm/WasmJS.h"
 #include "wasm/WasmModule.h"
 #include "wasm/WasmSignalHandlers.h"
-#include "wasm/WasmTesting.h"
 #include "wasm/WasmTypes.h"
 
 #include "debugger/DebugAPI-inl.h"
@@ -899,90 +898,6 @@ static bool WasmIonDisabledByFeatures(JSContext* cx, unsigned argc, Value* vp) {
   return true;
 }
 
-static bool WasmTextToBinary(JSContext* cx, unsigned argc, Value* vp) {
-  CallArgs args = CallArgsFromVp(argc, vp);
-  RootedObject callee(cx, &args.callee());
-
-  if (!args.requireAtLeast(cx, "wasmTextToBinary", 1)) {
-    return false;
-  }
-
-  if (!args[0].isString()) {
-    ReportUsageErrorASCII(cx, callee, "First argument must be a String");
-    return false;
-  }
-
-  size_t textLen = args[0].toString()->length();
-
-  AutoStableStringChars twoByteChars(cx);
-  if (!twoByteChars.initTwoByte(cx, args[0].toString())) {
-    return false;
-  }
-
-  wasm::Bytes bytes;
-  UniqueChars error;
-  if (!wasm::TextToBinary(twoByteChars.twoByteChars(), textLen, &bytes,
-                          &error)) {
-    JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_TEXT_FAIL,
-                             error.get() ? error.get() : "out of memory");
-    return false;
-  }
-
-  RootedObject binary(cx, JS_NewUint8Array(cx, bytes.length()));
-  if (!binary) {
-    return false;
-  }
-
-  memcpy(binary->as<TypedArrayObject>().dataPointerUnshared(), bytes.begin(),
-         bytes.length());
-
-  args.rval().setObject(*binary);
-  return true;
-}
-
-static bool WasmCodeOffsets(JSContext* cx, unsigned argc, Value* vp) {
-  CallArgs args = CallArgsFromVp(argc, vp);
-  RootedObject callee(cx, &args.callee());
-
-  if (!args.requireAtLeast(cx, "wasmCodeOffsets", 1)) {
-    return false;
-  }
-
-  if (!args.get(0).isObject()) {
-    JS_ReportErrorASCII(cx, "argument is not an object");
-    return false;
-  }
-
-  SharedMem<uint8_t*> bytes;
-  size_t byteLength;
-
-  JSObject* bufferObject = &args[0].toObject();
-  JSObject* unwrappedBufferObject = CheckedUnwrapStatic(bufferObject);
-  if (!unwrappedBufferObject ||
-      !IsBufferSource(unwrappedBufferObject, &bytes, &byteLength)) {
-    JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr,
-                             JSMSG_WASM_BAD_BUF_ARG);
-    return false;
-  }
-
-  wasm::Uint32Vector offsets;
-  wasm::CodeOffsets(bytes.unwrap(), byteLength, &offsets);
-
-  RootedObject jsOffsets(cx, JS::NewArrayObject(cx, offsets.length()));
-  if (!jsOffsets) {
-    return false;
-  }
-  for (size_t i = 0; i < offsets.length(); i++) {
-    uint32_t offset = offsets[i];
-    RootedValue offsetVal(cx, NumberValue(offset));
-    if (!JS_SetElement(cx, jsOffsets, i, offsetVal)) {
-      return false;
-    }
-  }
-  args.rval().setObject(*jsOffsets);
-  return true;
-}
-
 static bool ConvertToTier(JSContext* cx, HandleValue value,
                           const wasm::Code& code, wasm::Tier* tier) {
   RootedString option(cx, JS::ToString(cx, value));
@@ -6712,15 +6627,6 @@ gc::ZealModeHelpText),
 "  from being used then this returns a truthy string describing the features that\n."
 "  are disabling it.  Otherwise it returns false."),
 
-    JS_FN_HELP("wasmTextToBinary", WasmTextToBinary, 1, 0,
-"wasmTextToBinary(str)",
-"  Translates the given text wasm module into its binary encoding."),
-
-    JS_FN_HELP("wasmCodeOffsets", WasmCodeOffsets, 1, 0,
-"wasmCodeOffsets(binary)",
-"  Decodes the given wasm binary to find the offsets of every instruction in the"
-"  code section."),
-
     JS_FN_HELP("wasmExtractCode", WasmExtractCode, 1, 0,
 "wasmExtractCode(module[, tier])",
 "  Extracts generated machine code from WebAssembly.Module.  The tier is a string,\n"
diff --git a/js/src/jit/AliasAnalysis.cpp b/js/src/jit/AliasAnalysis.cpp
index eed6d5c6e27c..1089ee447d3b 100644
--- a/js/src/jit/AliasAnalysis.cpp
+++ b/js/src/jit/AliasAnalysis.cpp
@@ -154,6 +154,7 @@ static inline const MDefinition* GetObject(const MDefinition* ins) {
     case MDefinition::Opcode::ThrowRuntimeLexicalError:
     case MDefinition::Opcode::GetArgumentsObjectArg:
     case MDefinition::Opcode::SetArgumentsObjectArg:
+    case MDefinition::Opcode::CreateThis:
     case MDefinition::Opcode::CompareExchangeTypedArrayElement:
     case MDefinition::Opcode::AtomicExchangeTypedArrayElement:
     case MDefinition::Opcode::AtomicTypedArrayElementBinop:
diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h
index ffa4e7d1b359..a8d546d46670 100644
--- a/js/src/jit/MIR.h
+++ b/js/src/jit/MIR.h
@@ -3561,8 +3561,11 @@ class MCreateThis : public MBinaryInstruction,
   TRIVIAL_NEW_WRAPPERS
   NAMED_OPERANDS((0, getCallee), (1, getNewTarget))
 
-  // Although creation of |this| modifies global state, it is safely repeatable.
-  AliasSet getAliasSet() const override { return AliasSet::None(); }
+  // Performs a property read from |newTarget| iff |newTarget| is a JSFunction
+  // with an own |.prototype| property.
+  AliasSet getAliasSet() const override {
+    return AliasSet::Load(AliasSet::Any);
+  }
   bool possiblyCalls() const override { return true; }
 };
 
diff --git a/js/src/rust/Cargo.toml b/js/src/rust/Cargo.toml
index 5ae614125ec2..4094a71c15fe 100644
--- a/js/src/rust/Cargo.toml
+++ b/js/src/rust/Cargo.toml
@@ -20,3 +20,5 @@ smoosh = ['jsrust_shared/smoosh']
 jsrust_shared = { path = "./shared" }
 # Workaround for https://github.com/rust-lang/rust/issues/58393
 mozglue-static = { path = "../../../mozglue/static/rust" }
+wat = { version = "1.0.14" }
+wasmparser = { version = "0.48.2" }
diff --git a/js/src/rust/lib.rs b/js/src/rust/lib.rs
index e90fb547eae2..69840a5a28ca 100644
--- a/js/src/rust/lib.rs
+++ b/js/src/rust/lib.rs
@@ -12,4 +12,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 extern crate jsrust_shared;
+extern crate wat;
+extern crate wasmparser;
+
+mod wasm;
diff --git a/js/src/rust/shared/Cargo.toml b/js/src/rust/shared/Cargo.toml
index 06c7e3fff8a8..e80f88d615cf 100644
--- a/js/src/rust/shared/Cargo.toml
+++ b/js/src/rust/shared/Cargo.toml
@@ -13,7 +13,6 @@ baldrdash = { path = "../../wasm/cranelift", optional = true }
 encoding_c = "0.9.5"
 encoding_c_mem = "0.2.4"
 smoosh = { path = "../../frontend/smoosh", optional = true }
-wasm-rust = { path = "../../wasm/rust" }
 mozilla-central-workspace-hack = { path = "../../../../build/workspace-hack" }
 mozglue-static = { path = "../../../../mozglue/static/rust" }
 
diff --git a/js/src/rust/shared/lib.rs b/js/src/rust/shared/lib.rs
index 0eccfe5e66c3..31a3d5c53aec 100644
--- a/js/src/rust/shared/lib.rs
+++ b/js/src/rust/shared/lib.rs
@@ -21,5 +21,3 @@ extern crate mozglue_static;
 
 #[cfg(feature = "smoosh")]
 extern crate smoosh;
-
-extern crate wasm_rust;
diff --git a/js/src/wasm/rust/src/lib.rs b/js/src/rust/wasm.rs
similarity index 100%
rename from js/src/wasm/rust/src/lib.rs
rename to js/src/rust/wasm.rs
diff --git a/js/src/wasm/WasmTesting.cpp b/js/src/shell/WasmTesting.cpp
similarity index 98%
rename from js/src/wasm/WasmTesting.cpp
rename to js/src/shell/WasmTesting.cpp
index 1f1a3b5c9a70..dcbbe7f4a073 100644
--- a/js/src/wasm/WasmTesting.cpp
+++ b/js/src/shell/WasmTesting.cpp
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-#include "wasm/WasmTesting.h"
+#include "shell/WasmTesting.h"
 
 #include <inttypes.h>
 #include <stdbool.h>
diff --git a/js/src/wasm/WasmTesting.h b/js/src/shell/WasmTesting.h
similarity index 95%
rename from js/src/wasm/WasmTesting.h
rename to js/src/shell/WasmTesting.h
index 595652f9e576..fc6fc88118c2 100644
--- a/js/src/wasm/WasmTesting.h
+++ b/js/src/shell/WasmTesting.h
@@ -16,8 +16,8 @@
  * limitations under the License.
  */
 
-#ifndef wasm_testing_h
-#define wasm_testing_h
+#ifndef shell_wasm_h
+#define shell_wasm_h
 
 #include "wasm/WasmTypes.h"
 
@@ -43,4 +43,4 @@ extern void CodeOffsets(const uint8_t* bytes, size_t bytesLen,
 }  // namespace wasm
 }  // namespace js
 
-#endif  // wasm_testing_h
+#endif  // shell_wasm_h
diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp
index 1a1fdbb71cda..befbe877c94f 100644
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -117,6 +117,7 @@
 #include "shell/jsoptparse.h"
 #include "shell/jsshell.h"
 #include "shell/OSObject.h"
+#include "shell/WasmTesting.h"
 #include "threading/ConditionVariable.h"
 #include "threading/ExclusiveData.h"
 #include "threading/LockGuard.h"
@@ -8218,6 +8219,90 @@ static bool SetARMHwCapFlags(JSContext* cx, unsigned argc, Value* vp) {
   return true;
 }
 
+static bool WasmTextToBinary(JSContext* cx, unsigned argc, Value* vp) {
+  CallArgs args = CallArgsFromVp(argc, vp);
+  RootedObject callee(cx, &args.callee());
+
+  if (!args.requireAtLeast(cx, "wasmTextToBinary", 1)) {
+    return false;
+  }
+
+  if (!args[0].isString()) {
+    ReportUsageErrorASCII(cx, callee, "First argument must be a String");
+    return false;
+  }
+
+  size_t textLen = args[0].toString()->length();
+
+  AutoStableStringChars twoByteChars(cx);
+  if (!twoByteChars.initTwoByte(cx, args[0].toString())) {
+    return false;
+  }
+
+  wasm::Bytes bytes;
+  UniqueChars error;
+  if (!wasm::TextToBinary(twoByteChars.twoByteChars(), textLen, &bytes,
+                          &error)) {
+    JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr, JSMSG_WASM_TEXT_FAIL,
+                             error.get() ? error.get() : "out of memory");
+    return false;
+  }
+
+  RootedObject binary(cx, JS_NewUint8Array(cx, bytes.length()));
+  if (!binary) {
+    return false;
+  }
+
+  memcpy(binary->as<TypedArrayObject>().dataPointerUnshared(), bytes.begin(),
+         bytes.length());
+
+  args.rval().setObject(*binary);
+  return true;
+}
+
+static bool WasmCodeOffsets(JSContext* cx, unsigned argc, Value* vp) {
+  CallArgs args = CallArgsFromVp(argc, vp);
+  RootedObject callee(cx, &args.callee());
+
+  if (!args.requireAtLeast(cx, "wasmCodeOffsets", 1)) {
+    return false;
+  }
+
+  if (!args.get(0).isObject()) {
+    JS_ReportErrorASCII(cx, "argument is not an object");
+    return false;
+  }
+
+  SharedMem<uint8_t*> bytes;
+  size_t byteLength;
+
+  JSObject* bufferObject = &args[0].toObject();
+  JSObject* unwrappedBufferObject = CheckedUnwrapStatic(bufferObject);
+  if (!unwrappedBufferObject ||
+      !IsBufferSource(unwrappedBufferObject, &bytes, &byteLength)) {
+    JS_ReportErrorNumberUTF8(cx, GetErrorMessage, nullptr,
+                             JSMSG_WASM_BAD_BUF_ARG);
+    return false;
+  }
+
+  wasm::Uint32Vector offsets;
+  wasm::CodeOffsets(bytes.unwrap(), byteLength, &offsets);
+
+  RootedObject jsOffsets(cx, JS::NewArrayObject(cx, offsets.length()));
+  if (!jsOffsets) {
+    return false;
+  }
+  for (size_t i = 0; i < offsets.length(); i++) {
+    uint32_t offset = offsets[i];
+    RootedValue offsetVal(cx, NumberValue(offset));
+    if (!JS_SetElement(cx, jsOffsets, i, offsetVal)) {
+      return false;
+    }
+  }
+  args.rval().setObject(*jsOffsets);
+  return true;
+}
+
 #ifndef __AFL_HAVE_MANUAL_CONTROL
 #  define __AFL_LOOP(x) true
 #endif
@@ -9222,6 +9307,15 @@ JS_FN_HELP("parseBin", BinParse, 1, 0,
 "  wasm::Module into bytes, and deserialize those bytes in the current\n"
 "  process, returning the resulting WebAssembly.Module."),
 
+    JS_FN_HELP("wasmTextToBinary", WasmTextToBinary, 1, 0,
+"wasmTextToBinary(str)",
+"  Translates the given text wasm module into its binary encoding."),
+
+    JS_FN_HELP("wasmCodeOffsets", WasmCodeOffsets, 1, 0,
+"wasmCodeOffsets(binary)",
+"  Decodes the given wasm binary to find the offsets of every instruction in the"
+"  code section."),
+
     JS_FN_HELP("transplantableObject", TransplantableObject, 0, 0,
 "transplantableObject([options])",
 "  Returns the pair {object, transplant}. |object| is an object which can be\n"
diff --git a/js/src/shell/moz.build b/js/src/shell/moz.build
index be6cea093c8b..794092487674 100644
--- a/js/src/shell/moz.build
+++ b/js/src/shell/moz.build
@@ -19,7 +19,8 @@ UNIFIED_SOURCES += [
     'js.cpp',
     'jsoptparse.cpp',
     'jsshell.cpp',
-    'OSObject.cpp'
+    'OSObject.cpp',
+    'WasmTesting.cpp'
 ]
 
 if CONFIG['FUZZING_INTERFACES']:
diff --git a/js/src/wasm/WasmStubs.cpp b/js/src/wasm/WasmStubs.cpp
index 1b402783d4e0..fc34030c2cdc 100644
--- a/js/src/wasm/WasmStubs.cpp
+++ b/js/src/wasm/WasmStubs.cpp
@@ -1889,7 +1889,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi,
       AlignBytes(StackArgBytes(invokeArgTypes), sizeof(double));
   // The abiArgCount includes a stack result pointer argument if needed.
   unsigned abiArgCount = ArgTypeVector(fi.funcType()).length();
-  unsigned argBytes = std::max<size_t>(1, abiArgCount * sizeof(Value));
+  unsigned argBytes = std::max<size_t>(1, abiArgCount) * sizeof(Value);
   unsigned framePushed =
       StackDecrementForCall(ABIStackAlignment,
                             sizeof(Frame),  // pushed by prologue
diff --git a/js/src/wasm/moz.build b/js/src/wasm/moz.build
index 9cba04c1aa6c..66cd41a2a262 100644
--- a/js/src/wasm/moz.build
+++ b/js/src/wasm/moz.build
@@ -40,7 +40,6 @@ UNIFIED_SOURCES += [
     'WasmSignalHandlers.cpp',
     'WasmStubs.cpp',
     'WasmTable.cpp',
-    'WasmTesting.cpp',
     'WasmTypes.cpp',
     'WasmValidate.cpp'
 ]
diff --git a/js/src/wasm/rust/Cargo.toml b/js/src/wasm/rust/Cargo.toml
deleted file mode 100644
index 83293dfb8508..000000000000
--- a/js/src/wasm/rust/Cargo.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-[package]
-name = "wasm-rust"
-version = "0.1.0"
-authors = ["The Spidermonkey developers"]
-edition = "2018"
-
-[lib]
-crate-type = ["rlib"]
-name = "wasm_rust"
-
-[dependencies]
-wat = { version = "1.0.14" }
-wasmparser = { version = "0.48.2" }
diff --git a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp
index 2f0c0a7ff330..2934c27cf8f3 100644
--- a/js/xpconnect/src/XPCJSContext.cpp
+++ b/js/xpconnect/src/XPCJSContext.cpp
@@ -1330,6 +1330,11 @@ void XPCJSContext::AfterProcessTask(uint32_t aNewRecursionDepth) {
   nsJSContext::MaybePokeCC();
   CycleCollectedJSContext::AfterProcessTask(aNewRecursionDepth);
   mozilla::jsipc::AfterProcessTask();
+
+  // This exception might have been set if we called an XPCWrappedJS that threw,
+  // but now we're returning to the event loop, so nothing is going to look at
+  // this value again. Clear it to prevent leaks.
+  SetPendingException(nullptr);
 }
 
 bool XPCJSContext::IsSystemCaller() const {
diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp
index 9e006823d902..f23130ed729b 100644
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -1597,6 +1597,24 @@ void PresShell::SelectionWillLoseFocus() {
   // Do nothing, the main selection is the default focused selection.
 }
 
+// Selection repainting code relies on selection offsets being properly
+// adjusted (see bug 1626291), so we need to wait until the DOM is finished
+// notifying.
+static void RepaintNormalSelectionWhenSafe(nsFrameSelection& aFrameSelection) {
+  if (nsContentUtils::IsSafeToRunScript()) {
+    aFrameSelection.RepaintSelection(SelectionType::eNormal);
+    return;
+  }
+
+  // Note that importantly we don't defer changing the DisplaySelection. That'd
+  // be potentially racy with other code that may change it.
+  nsContentUtils::AddScriptRunner(NS_NewRunnableFunction(
+      "RepaintNormalSelectionWhenSafe",
+      [sel = RefPtr<nsFrameSelection>(&aFrameSelection)] {
+        sel->RepaintSelection(SelectionType::eNormal);
+      }));
+}
+
 void PresShell::FrameSelectionWillLoseFocus(nsFrameSelection& aFrameSelection) {
   if (mFocusedFrameSelection != &aFrameSelection) {
     return;
@@ -1612,7 +1630,7 @@ void PresShell::FrameSelectionWillLoseFocus(nsFrameSelection& aFrameSelection) {
 
   if (old->GetDisplaySelection() != nsISelectionController::SELECTION_HIDDEN) {
     old->SetDisplaySelection(nsISelectionController::SELECTION_HIDDEN);
-    old->RepaintSelection(SelectionType::eNormal);
+    RepaintNormalSelectionWhenSafe(*old);
   }
 
   if (mSelection) {
@@ -1627,7 +1645,7 @@ void PresShell::FrameSelectionWillTakeFocus(nsFrameSelection& aFrameSelection) {
     // document's focused selection doesn't change, and this is currently done
     // from RepaintSelection. Maybe we should move part of the global selection
     // handling here, or something of that sort, unclear.
-    aFrameSelection.RepaintSelection(SelectionType::eNormal);
+    RepaintNormalSelectionWhenSafe(aFrameSelection);
 #endif
     return;
   }
@@ -1638,13 +1656,13 @@ void PresShell::FrameSelectionWillTakeFocus(nsFrameSelection& aFrameSelection) {
   if (old &&
       old->GetDisplaySelection() != nsISelectionController::SELECTION_HIDDEN) {
     old->SetDisplaySelection(nsISelectionController::SELECTION_HIDDEN);
-    old->RepaintSelection(SelectionType::eNormal);
+    RepaintNormalSelectionWhenSafe(*old);
   }
 
   if (aFrameSelection.GetDisplaySelection() !=
       nsISelectionController::SELECTION_ON) {
     aFrameSelection.SetDisplaySelection(nsISelectionController::SELECTION_ON);
-    aFrameSelection.RepaintSelection(SelectionType::eNormal);
+    RepaintNormalSelectionWhenSafe(aFrameSelection);
   }
 }
 
diff --git a/layout/generic/crashtests/1628804.html b/layout/generic/crashtests/1628804.html
new file mode 100644
index 000000000000..937a3474d14b
--- /dev/null
+++ b/layout/generic/crashtests/1628804.html
@@ -0,0 +1,21 @@
+<style>
+.c {
+  box-decoration-break: clone;
+  padding-bottom: 41vmax;
+}
+</style>
+<script>
+go = () => {
+  try { b.appendChild(a) } catch(e) { }
+}
+</script>
+<body onload=go()>
+<button style="columns: 72 0px">
+<dl style="columns: 1">
+<dd>-</dd>
+<dt id="b" style="float: left" class="c">x</dt>
+</dl>
+<dl>
+<map id="a">
+<canvas></canvas>
+<details open="">x</details>
diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list
index a172e736d88d..f38f37c13387 100644
--- a/layout/generic/crashtests/crashtests.list
+++ b/layout/generic/crashtests/crashtests.list
@@ -758,4 +758,5 @@ load 1618312.html
 load 1618564.html
 load 1625051-1.html
 load 1625051-2.html
+load 1628804.html
 load very-large-frameset.html
diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp
index 6c7c7438cc74..0922e9b0d441 100644
--- a/layout/generic/nsBlockFrame.cpp
+++ b/layout/generic/nsBlockFrame.cpp
@@ -3055,8 +3055,7 @@ void nsBlockFrame::ReflowDirtyLines(BlockReflowInput& aState) {
           marker->SetRect(marker->GetRect() + nsPoint(0, offset));
         }
       }
-    } else if (!Style()->IsPseudoOrAnonBox() &&
-               StyleUI()->mUserModify != StyleUserModify::ReadOnly) {
+    } else if (ShouldHaveLineIfEmpty()) {
       aState.mBCoord += aState.mMinLineHeight;
     }
   }
diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp
index 0c38f608a4bd..8dbd0cab0e9f 100644
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -4688,6 +4688,13 @@ bool nsIFrame::IsSelectable(StyleUserSelect* aSelectStyle) const {
   return style != StyleUserSelect::None;
 }
 
+bool nsIFrame::ShouldHaveLineIfEmpty() const {
+  if (Style()->IsPseudoOrAnonBox()) {
+    return false;
+  }
+  return IsEditingHost(this);
+}
+
 /**
  * Handles the Mouse Press Event for the frame
  */
diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h
index 0793b2d96292..8b9fe2266fff 100644
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -1022,7 +1022,11 @@ class nsIFrame : public nsQueryFrame {
   mozilla::LogicalSize ContentSize(mozilla::WritingMode aWritingMode) const {
     auto bp = GetLogicalUsedBorderAndPadding(aWritingMode);
     bp.ApplySkipSides(GetLogicalSkipSides());
-    return GetLogicalSize(aWritingMode) - bp.Size(aWritingMode);
+    const auto size = GetLogicalSize(aWritingMode);
+    return mozilla::LogicalSize(
+        aWritingMode,
+        std::max(0, size.ISize(aWritingMode) - bp.IStartEnd(aWritingMode)),
+        std::max(0, size.BSize(aWritingMode) - bp.BStartEnd(aWritingMode)));
   }
 
   /**
@@ -3404,6 +3408,12 @@ class nsIFrame : public nsQueryFrame {
    */
   bool IsSelectable(mozilla::StyleUserSelect* aSelectStyle) const;
 
+  /**
+   * Returns whether this frame should have the content-block-size of a line,
+   * even if empty.
+   */
+  bool ShouldHaveLineIfEmpty() const;
+
   /**
    * Called to retrieve the SelectionController associated with the frame.
    *
diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp
index f7cfe97d8357..ec7f1f2c2b30 100644
--- a/layout/generic/nsImageFrame.cpp
+++ b/layout/generic/nsImageFrame.cpp
@@ -281,6 +281,7 @@ void nsImageFrame::DestroyFrom(nsIFrame* aDestructRoot,
     imageLoader->FrameDestroyed(this);
     imageLoader->RemoveNativeObserver(mListener);
   } else if (mContentURLRequest) {
+    PresContext()->Document()->ImageTracker()->Remove(mContentURLRequest);
     nsLayoutUtils::DeregisterImageRequest(PresContext(), mContentURLRequest,
                                           &mContentURLRequestRegistered);
     mContentURLRequest->Cancel(NS_BINDING_ABORTED);
@@ -402,6 +403,10 @@ void nsImageFrame::SetupForContentURLRequest() {
     return;
   }
 
+  // We're not using AssociateRequestToFrame for the content property, so we
+  // need to add it to the image tracker manually.
+  PresContext()->Document()->ImageTracker()->Add(mContentURLRequest);
+
   uint32_t status = 0;
   nsresult rv = mContentURLRequest->GetImageStatus(&status);
   if (NS_FAILED(rv)) {
diff --git a/media/libvpx/moz.build b/media/libvpx/moz.build
index f3845941fe4d..47853d43408b 100644
--- a/media/libvpx/moz.build
+++ b/media/libvpx/moz.build
@@ -102,6 +102,8 @@ if CONFIG['OS_TARGET'] == 'Android':
 
 for f in SOURCES:
     if f.endswith('.c'):
+        if 'mmx.c' in f:
+            SOURCES[f].flags += ['-mmmx']
         if 'sse2.c' in f:
             SOURCES[f].flags += CONFIG['SSE2_FLAGS']
         if 'ssse3.c' in f:
diff --git a/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp b/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp
index 5f4cebf28110..b5575919a556 100644
--- a/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp
+++ b/media/webrtc/signaling/src/media-conduit/VideoStreamFactory.cpp
@@ -122,15 +122,14 @@ void VideoStreamFactory::SetSendingFramerate(unsigned int aSendingFramerate) {
 
 std::vector<webrtc::VideoStream> VideoStreamFactory::CreateEncoderStreams(
     int width, int height, const webrtc::VideoEncoderConfig& config) {
-  size_t streamCount = config.number_of_streams;
+  // We only allow one layer when screensharing
+  const size_t streamCount =
+      mCodecMode == webrtc::VideoCodecMode::kScreensharing
+          ? 1
+          : config.number_of_streams;
 
   MOZ_RELEASE_ASSERT(streamCount >= 1, "Should request at least one stream");
 
-  // We only allow one layer when screensharing
-  if (mCodecMode == webrtc::VideoCodecMode::kScreensharing) {
-    streamCount = 1;
-  }
-
   std::vector<webrtc::VideoStream> streams;
   streams.reserve(streamCount);
 
@@ -141,7 +140,7 @@ std::vector<webrtc::VideoStream> VideoStreamFactory::CreateEncoderStreams(
   mSimulcastAdapter->OnOutputFormatRequest(
       cricket::VideoFormat(width, height, 0, 0));
 
-  for (size_t idx = streamCount - 1; streamCount > 0; idx--, streamCount--) {
+  for (int idx = streamCount - 1; idx >= 0; --idx) {
     webrtc::VideoStream video_stream;
     auto& encoding = mCodecConfig.mEncodings[idx];
     MOZ_ASSERT(encoding.constraints.scaleDownBy >= 1.0);
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
index d8aadcaa5310..93fc19198644 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -1384,7 +1384,7 @@
 # Is support for AudioWorklet enabled?
 - name: dom.audioworklet.enabled
   type: bool
-  value: @IS_NIGHTLY_BUILD@
+  value: true
   mirror: always
 
 # Is support for Navigator.getBattery enabled?
@@ -2254,6 +2254,19 @@
   value: false
   mirror: always
 
+#ifdef XP_WIN
+  # Preference that is used to set nsILocalFileWin::useDOSDevicePathSyntax
+  # attribute for all local file instances created by QuotaManager and its
+  # clients. The value of this preference is cached so changing the preference
+  # during runtime has no effect.
+  # See bug 1626846 for setting this to false by default.
+-   name: dom.quotaManager.useDOSDevicePathSyntax
+    type: RelaxedAtomicBool
+    value: false
+    mirror: always
+    do_not_use_directly: true
+#endif
+
 # Reporting API.
 - name: dom.reporting.enabled
   type: RelaxedAtomicBool
@@ -3097,7 +3110,7 @@
 
 - name: dom.worklet.enabled
   type: bool
-  value: @IS_NIGHTLY_BUILD@
+  value: true
   mirror: always
 
 # Enable content type normalization of XHR uploads via MIME Sniffing standard
@@ -3963,6 +3976,11 @@
   value: 10
   mirror: once
 
+- name: gfx.vsync.use-waitforvblank
+  type: RelaxedAtomicBool
+  value: false
+  mirror: always
+
 # We expose two prefs: gfx.webrender.all and gfx.webrender.enabled.
 # The first enables WR+additional features, and the second just enables WR.
 # For developer convenience, building with --enable-webrender=true or just
@@ -5332,7 +5350,7 @@
 # Are implicit tracks in computed grid templates serialized?
 - name: layout.css.serialize-grid-implicit-tracks
   type: RelaxedAtomicBool
-  value: false
+  value: @IS_NOT_NIGHTLY_BUILD@
   mirror: always
 
 # Set the number of device pixels per CSS pixel. A value <= 0 means choose
@@ -6123,8 +6141,8 @@
   mirror: always
 #if defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID)
   value: true
-#elif defined(XP_WIN) && !defined(_ARM64_)
-  value: @IS_EARLY_BETA_OR_EARLIER@
+#elif defined(XP_WIN) && !defined(_ARM64_) && !defined(_X86_)
+  value: true
 #else
   value: false
 #endif
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
index 65438672e775..1fd3c4805f75 100644
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -533,6 +533,7 @@ pref("media.videocontrols.picture-in-picture.video-toggle.min-video-secs", 45);
   pref("media.getusermedia.noise", 1); // kModerate
   pref("media.getusermedia.agc_enabled", true);
   pref("media.getusermedia.agc", 1); // kAdaptiveDigital
+  pref("media.getusermedia.hpf_enabled", true);
   // full_duplex: enable cubeb full-duplex capture/playback
   pref("media.navigator.audio.full_duplex", true);
 #endif // MOZ_WEBRTC
diff --git a/netwerk/base/PartiallySeekableInputStream.cpp b/netwerk/base/PartiallySeekableInputStream.cpp
index 5a0aaf21ebca..40dcbc561f5b 100644
--- a/netwerk/base/PartiallySeekableInputStream.cpp
+++ b/netwerk/base/PartiallySeekableInputStream.cpp
@@ -56,6 +56,8 @@ PartiallySeekableInputStream::PartiallySeekableInputStream(
       mWeakCloneableInputStream(nullptr),
       mWeakIPCSerializableInputStream(nullptr),
       mWeakAsyncInputStream(nullptr),
+      mWeakInputStreamLength(nullptr),
+      mWeakAsyncInputStreamLength(nullptr),
       mCachedBuffer(aClonedFrom->mCachedBuffer),
       mBufferSize(aClonedFrom->mBufferSize),
       mPos(aClonedFrom->mPos),
diff --git a/netwerk/dns/effective_tld_names.dat b/netwerk/dns/effective_tld_names.dat
index eefd4ae9dc0f..0130401b73a6 100644
--- a/netwerk/dns/effective_tld_names.dat
+++ b/netwerk/dns/effective_tld_names.dat
@@ -212,6 +212,7 @@ ac.at
 co.at
 gv.at
 or.at
+sth.ac.at
 
 // au : https://en.wikipedia.org/wiki/.au
 // http://www.auda.org.au/
@@ -7091,7 +7092,7 @@ org.zw
 
 // newGTLDs
 
-// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2020-03-29T18:18:21Z
+// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2020-04-02T18:20:31Z
 // This list is auto-generated, don't edit it manually.
 // aaa : 2015-02-26 American Automobile Association, Inc.
 aaa
@@ -10432,9 +10433,6 @@ xin
 // xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd.
 新闻
 
-// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited
-工行
-
 // xn--fct429k : 2015-04-09 Amazon Registry Services, Inc.
 家電
 
@@ -11097,6 +11095,10 @@ realm.cz
 // Submitted by Jonathan Rudenberg <jonathan@cupcake.io>
 cupcake.is
 
+// Curv UG : https://curv-labs.de/
+// Submitted by Marvin Wiesner <Marvin@curv-labs.de>
+curv.dev
+
 // Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/
 // Submitted by Gregory Drake <support@dyn.com>
 // Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label
@@ -11132,6 +11134,10 @@ firm.dk
 reg.dk
 store.dk
 
+// dappnode.io : https://dappnode.io/
+// Submitted by Abel Boldu / DAppNode Team <community@dappnode.io>
+dyndns.dappnode.io
+
 // dapps.earth : https://dapps.earth/
 // Submitted by Daniil Burdakov <icqkill@gmail.com>
 *.dapps.earth
@@ -11614,6 +11620,10 @@ twmail.org
 mymailer.com.tw
 url.tw
 
+// Fabrica Technologies, Inc. : https://www.fabrica.dev/
+// Submitted by Eric Jiang <eric@fabrica.dev>
+onfabrica.com
+
 // Facebook, Inc.
 // Submitted by Peter Ruibal <public-suffix@fb.com>
 apps.fbsbx.com
@@ -11716,6 +11726,10 @@ global.ssl.fastly.net
 // Submitted by Likhachev Vasiliy <lihachev@fastvps.ru>
 fastpanel.direct
 fastvps-server.com
+myfast.space
+myfast.host
+fastvps.site
+fastvps.host
 
 // Featherhead : https://featherhead.xyz/
 // Submitted by Simon Menke <simon@featherhead.xyz>
@@ -11729,6 +11743,13 @@ cloud.fedoraproject.org
 app.os.fedoraproject.org
 app.os.stg.fedoraproject.org
 
+// FearWorks Media Ltd. : https://fearworksmedia.co.uk
+// submitted by Keith Fairley <domains@fearworksmedia.co.uk>
+conn.uk
+copro.uk
+couk.me
+ukco.me
+
 // Fermax : https://fermax.com/
 // submitted by Koen Van Isterdael <k.vanisterdael@fermax.be>
 mydobiss.com
@@ -11749,7 +11770,6 @@ firebaseapp.com
 
 // Flynn : https://flynn.io
 // Submitted by Jonathan Rudenberg <jonathan@flynn.io>
-flynnhub.com
 flynnhosting.net
 
 // Frederik Braun https://frederik-braun.com
@@ -11921,6 +11941,10 @@ publishproxy.com
 withgoogle.com
 withyoutube.com
 
+// Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za
+// Submitted by Aaron Marais <its_me@aaronleem.co.za>
+graphox.us
+
 // Group 53, LLC : https://www.group53.com
 // Submitted by Tyler Todd <noc@nova53.net>
 awsmppl.com
@@ -12051,8 +12075,9 @@ pixolino.com
 ipifony.net
 
 // IServ GmbH : https://iserv.eu
-// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu>
+// Submitted by Kim-Alexander Brodowski <info@iserv.eu>
 mein-iserv.de
+schulserver.de
 test-iserv.de
 iserv.dev
 
@@ -12285,6 +12310,7 @@ nctu.me
 // Netlify : https://www.netlify.com
 // Submitted by Jessica Parsons <jessica@netlify.com>
 bitballoon.com
+netlify.app
 netlify.com
 
 // Neustar Inc.
@@ -12578,6 +12604,12 @@ on-web.fr
 *.platform.sh
 *.platformsh.site
 
+// Platter: https://platter.dev
+// Submitted by Patrick Flor <patrick@platter.dev>
+platter-app.com
+platter-app.dev
+platterp.us
+
 // Port53 : https://port53.io/
 // Submitted by Maximilian Schieder <maxi@zeug.co>
 dyn53.io
@@ -12791,6 +12823,10 @@ static.land
 dev.static.land
 sites.static.land
 
+// Sony Interactive Entertainment LLC : https://sie.com/
+// Submitted by David Coles <david.coles@sony.com>
+playstation-cloud.com
+
 // SourceLair PC : https://www.sourcelair.com
 // Submitted by Antonis Kalipetis <akalipetis@sourcelair.com>
 apps.lair.io
@@ -13018,6 +13054,11 @@ wmflabs.org
 toolforge.org
 wmcloud.org
 
+// WISP : https://wisp.gg
+// Submitted by Stepan Fedotov <stepan@wisp.gg>
+panel.gg
+daemon.panel.gg
+
 // WoltLab GmbH : https://www.woltlab.com
 // Submitted by Tim Düsterhus <security@woltlab.cloud>
 myforum.community
diff --git a/netwerk/protocol/http/nsHttpResponseHead.cpp b/netwerk/protocol/http/nsHttpResponseHead.cpp
index 0de16f91d36d..3561ebf581e0 100644
--- a/netwerk/protocol/http/nsHttpResponseHead.cpp
+++ b/netwerk/protocol/http/nsHttpResponseHead.cpp
@@ -1081,7 +1081,7 @@ void nsHttpResponseHead::ParseVersion(const char* str) {
   Tokenizer t(str, nullptr, "");
   // make sure we have HTTP at the beginning
   if (!t.CheckWord("HTTP")) {
-    if (t.CheckWord("ICY ")) {
+    if (PL_strncasecmp(str, "ICY ", 4) == 0) {
       // ShoutCast ICY is HTTP/1.0-like. Assume it is HTTP/1.0.
       LOG(("Treating ICY as HTTP 1.0\n"));
       mVersion = HttpVersion::v1_0;
diff --git a/python/l10n/fluent_migrations/bug_1626381_about_addons_sidebar_titles.py b/python/l10n/fluent_migrations/bug_1626381_about_addons_sidebar_titles.py
new file mode 100644
index 000000000000..1c82384171d9
--- /dev/null
+++ b/python/l10n/fluent_migrations/bug_1626381_about_addons_sidebar_titles.py
@@ -0,0 +1,45 @@
+
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+from __future__ import absolute_import
+import fluent.syntax.ast as FTL
+from fluent.migrate.helpers import transforms_from
+from fluent.migrate import COPY_PATTERN
+
+
+def migrate(ctx):
+    """Bug 1626381 - Add titles to about:addons sidebar, part {index}"""
+
+    ctx.add_transforms(
+        'toolkit/toolkit/about/aboutAddons.ftl',
+        'toolkit/toolkit/about/aboutAddons.ftl',
+        transforms_from(
+"""
+header-back-button =
+    .title = {COPY_PATTERN(from_path, "go-back-button.tooltiptext")}
+
+addon-category-discover-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-discover")}
+addon-category-available-updates-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-available-updates")}
+addon-category-recent-updates-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-recent-updates")}
+addon-category-extension-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-extension")}
+addon-category-theme-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-theme")}
+addon-category-locale-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-locale")}
+addon-category-plugin-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-plugin")}
+addon-category-dictionary-title =
+    .title = {COPY_PATTERN(from_path, "addon-category-dictionary")}
+
+sidebar-help-button-title =
+    .title = {COPY_PATTERN(from_path, "help-button")}
+sidebar-preferences-button-title =
+    .title = {COPY_PATTERN(from_path, "preferences")}
+"""
+        , from_path='toolkit/toolkit/about/aboutAddons.ftl')
+    )
diff --git a/security/manager/ssl/OSReauthenticator.cpp b/security/manager/ssl/OSReauthenticator.cpp
index 31a8883f868e..78ff58307508 100644
--- a/security/manager/ssl/OSReauthenticator.cpp
+++ b/security/manager/ssl/OSReauthenticator.cpp
@@ -85,8 +85,10 @@ std::unique_ptr<char[]> GetUserTokenInfo() {
 static nsresult ReauthenticateUserWindows(const nsAString& aMessageText,
                                           const nsAString& aCaptionText,
                                           const WindowsHandle& hwndParent,
-                                          /* out */ bool& reauthenticated) {
+                                          /* out */ bool& reauthenticated,
+                                          /* out */ bool& isBlankPassword) {
   reauthenticated = false;
+  isBlankPassword = false;
 
   // Check if the user has a blank password before proceeding
   DWORD usernameLength = CREDUI_MAX_USERNAME_LENGTH + 1;
@@ -104,6 +106,7 @@ static nsresult ReauthenticateUserWindows(const nsAString& aMessageText,
         CloseHandle(logonUserHandle);
       }
       reauthenticated = true;
+      isBlankPassword = true;
       return NS_OK;
     }
   }
@@ -231,13 +234,15 @@ static nsresult ReauthenticateUserWindows(const nsAString& aMessageText,
 static nsresult ReauthenticateUser(const nsAString& prompt,
                                    const nsAString& caption,
                                    const WindowsHandle& hwndParent,
-                                   /* out */ bool& reauthenticated) {
+                                   /* out */ bool& reauthenticated,
+                                   /* out */ bool& isBlankPassword) {
   reauthenticated = false;
+  isBlankPassword = false;
 #if defined(XP_WIN)
-  return ReauthenticateUserWindows(prompt, caption, hwndParent,
-                                   reauthenticated);
+  return ReauthenticateUserWindows(prompt, caption, hwndParent, reauthenticated,
+                                   isBlankPassword);
 #elif defined(XP_MACOSX)
-  return ReauthenticateUserMacOS(prompt, reauthenticated);
+  return ReauthenticateUserMacOS(prompt, reauthenticated, isBlankPassword);
 #endif  // Reauthentication is not implemented for this platform.
   return NS_OK;
 }
@@ -248,15 +253,19 @@ static void BackgroundReauthenticateUser(RefPtr<Promise>& aPromise,
                                          const WindowsHandle& hwndParent) {
   nsAutoCString recovery;
   bool reauthenticated;
+  bool isBlankPassword;
   nsresult rv = ReauthenticateUser(aMessageText, aCaptionText, hwndParent,
-                                   reauthenticated);
+                                   reauthenticated, isBlankPassword);
+  nsTArray<bool> results(2);
+  results.AppendElement(reauthenticated);
+  results.AppendElement(isBlankPassword);
   nsCOMPtr<nsIRunnable> runnable(NS_NewRunnableFunction(
       "BackgroundReauthenticateUserResolve",
-      [rv, reauthenticated, aPromise = std::move(aPromise)]() {
+      [rv, results = std::move(results), aPromise = std::move(aPromise)]() {
         if (NS_FAILED(rv)) {
           aPromise->MaybeReject(rv);
         } else {
-          aPromise->MaybeResolve(reauthenticated);
+          aPromise->MaybeResolve(results);
         }
       }));
   NS_DispatchToMainThread(runnable.forget());
diff --git a/security/manager/ssl/OSReauthenticator.h b/security/manager/ssl/OSReauthenticator.h
index 4ebc059c212d..837dfa91c0fe 100644
--- a/security/manager/ssl/OSReauthenticator.h
+++ b/security/manager/ssl/OSReauthenticator.h
@@ -29,7 +29,8 @@ class OSReauthenticator : public nsIOSReauthenticator {
 
 #ifdef XP_MACOSX
 nsresult ReauthenticateUserMacOS(const nsAString& aPrompt,
-                                 /* out */ bool& aReauthenticated);
+                                 /* out */ bool& aReauthenticated,
+                                 /* out */ bool& aIsBlankPassword);
 #endif  // XP_MACOSX
 
 #endif  // OSReauthenticator_h
diff --git a/security/manager/ssl/OSReauthenticatorDarwin.mm b/security/manager/ssl/OSReauthenticatorDarwin.mm
index ac834898d91b..ac1ff66f9bcd 100644
--- a/security/manager/ssl/OSReauthenticatorDarwin.mm
+++ b/security/manager/ssl/OSReauthenticatorDarwin.mm
@@ -16,7 +16,8 @@ using namespace mozilla;
 static const int32_t kPasswordNotSetErrorCode = -1000;
 
 nsresult ReauthenticateUserMacOS(const nsAString& aPrompt,
-                                 /* out */ bool& aReauthenticated) {
+                                 /* out */ bool& aReauthenticated,
+                                 /* out */ bool& aIsBlankPassword) {
   // The idea here is that we ask to be authorized to unlock the user's session.
   // This should cause a prompt to come up for the user asking them for their
   // password. If they correctly enter it, we'll set aReauthenticated to true.
@@ -26,7 +27,8 @@ nsresult ReauthenticateUserMacOS(const nsAString& aPrompt,
 
   dispatch_semaphore_t sema = dispatch_semaphore_create(0);
 
-  __block BOOL biometricSuccess = NO;  // mark variable r/w across the block
+  __block BOOL biometricSuccess = NO;     // mark variable r/w across the block
+  __block BOOL errorPasswordNotSet = NO;  // mark variable r/w across the block
 
   // Note: This is an async callback in an already-async Promise chain.
   [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication
@@ -38,9 +40,8 @@ nsresult ReauthenticateUserMacOS(const nsAString& aPrompt,
                         // but this is a best-effort mechanism and there's no particular case for
                         // propagating up XPCOM. The one exception being a user account that
                         // has no passcode set, which we handle below.
-                        if (success || [error code] == kPasswordNotSetErrorCode) {
-                          biometricSuccess = YES;
-                        }
+                        errorPasswordNotSet = error && [error code] == kPasswordNotSetErrorCode;
+                        biometricSuccess = success || errorPasswordNotSet;
                         dispatch_semaphore_signal(sema);
                       });
                     }];
@@ -52,6 +53,7 @@ nsresult ReauthenticateUserMacOS(const nsAString& aPrompt,
   sema = NULL;
 
   aReauthenticated = biometricSuccess;
+  aIsBlankPassword = errorPasswordNotSet;
 
   [context release];
   return NS_OK;
diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h
index 120027448cd4..49c313f2e421 100644
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1149,4 +1149,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1594302968429000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1595512322973000);
diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc
index 1763f0fe0ffe..d5ce775c075a 100644
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -8,7 +8,7 @@
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
+const PRTime gPreloadListExpirationTime = INT64_C(1597931506167000);
 %%
 0--1.de, 1
 0-1.party, 1
@@ -24,7 +24,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 000a7.com, 1
 000a8.com, 1
 000a9.com, 1
-000b58.com, 1
 000bet86.com, 1
 000x2.com, 1
 000x3.com, 1
@@ -125,6 +124,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 015zl.com, 1
 0165365.com, 0
 0166z6.com, 1
+016910804.xyz, 1
 016kb.com, 1
 0175365.com, 0
 0177z6.com, 1
@@ -501,7 +501,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 0cp8778.com, 1
 0d111.com, 1
 0day.agency, 1
-0day.su, 1
 0dayexploits.gq, 1
 0des.com, 1
 0i0.nl, 1
@@ -540,6 +539,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 0x52.net, 1
 0x52.org, 1
 0x53.de, 1
+0x5d.de, 1
 0x7.io, 1
 0x76.de, 1
 0x7d.com, 1
@@ -581,7 +581,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1004233.com, 1
 1007337.com, 1
 10086.ru, 1
-100aaaa.com, 1
 100cccc.com, 1
 100dddd.com, 1
 100eeee.com, 1
@@ -596,11 +595,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 100mani.it, 1
 100onrainkajino.com, 1
 100pounds.co.uk, 1
-100pppp.com, 1
 100pudov.tk, 1
 100qqqq.com, 1
 100rrrr.com, 1
-100tttt.com, 1
 100up.de, 1
 100up.org, 1
 100uuuu.com, 1
@@ -649,7 +646,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 10495.net, 1
 105318.com, 1
 1068511.com, 1
-1069.cloud, 1
 106jamz.com, 1
 10774.net, 1
 107996.com, 1
@@ -679,11 +675,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 110bg.com, 1
 110bu.com, 1
 110bv.com, 1
-110ca.com, 1
-110cb.com, 1
 110ce.com, 1
-110cl.com, 1
-110ef.com, 1
 110eh.com, 1
 110ej.com, 1
 110ek.com, 1
@@ -691,15 +683,12 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 110ep.com, 1
 110es.com, 1
 110et.com, 1
-110ff.com, 1
 110fn.com, 1
 110fr.com, 1
 110gf.com, 1
 110gh.com, 1
-110gs.com, 1
 110hq.com, 1
 110jf.com, 1
-110jt.com, 1
 110ju.com, 1
 110jx.com, 1
 110k8.com, 1
@@ -708,18 +697,15 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 110kp.com, 1
 110lh.com, 1
 110lj.com, 1
-110na.com, 1
 110ne.com, 1
 110nf.com, 1
 110ng.com, 1
 110nl.com, 1
 110nr.com, 1
-110nx.com, 1
 110nz.com, 1
 110pe.com, 1
 110qa.com, 1
 110qc.com, 1
-110qs.com, 1
 110qu.com, 1
 110rd.com, 1
 110rl.com, 1
@@ -732,7 +718,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 110wf.com, 1
 110wq.com, 1
 110wy.com, 1
-110xn.com, 1
 110xp.com, 1
 110xz.com, 1
 110yj.com, 1
@@ -742,7 +727,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 110yu.com, 1
 110ze.com, 1
 110zg.com, 1
-110zw.com, 1
 111.one, 1
 1111365t.com, 1
 1111k8.com, 1
@@ -759,7 +743,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1117z6.com, 1
 1119365.com, 1
 1119z6.com, 1
-111b58.com, 1
 111bet86.com, 1
 111novosti.tk, 1
 111ttt.com, 1
@@ -812,7 +795,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1120350.com, 1
 112112112.net, 1
 11221jz.com, 1
-11223837.com, 1
 1122z6.com, 1
 1126p.com, 1
 112app.nl, 1
@@ -822,44 +804,29 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1130p.com, 1
 113113113.net, 1
 11321365.com, 1
-11333837.com, 1
-11335835.com, 1
 1133z6.com, 1
 11365t.com, 1
 113k8.com, 1
 113kb.com, 1
 113ks.com, 1
 113z6.com, 1
-11443837.com, 1
-11445835.com, 1
 114514ss.com, 1
-11553837.com, 1
-11555835.com, 1
-115lc.com, 1
 115z6.com, 1
-11663837.com, 1
-11665835.com, 1
 1166z6.com, 1
 116ks.com, 1
 116lc.com, 1
 116vip.net, 1
 116z6.com, 1
-11773837.com, 1
-11775835.com, 1
 1177z6.com, 1
 117lc.com, 1
 117z6.com, 1
 118118118.net, 1
-11883837.com, 1
-11885835.com, 1
 1188bet.vip, 1
 1188z6.com, 1
 118btt.com, 1
 118vip.net, 1
 118z6.com, 1
 1190america.tk, 1
-11993837.com, 1
-11995835.com, 1
 1199bet.vip, 1
 1199z6.com, 1
 119lc.com, 1
@@ -876,17 +843,14 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11b58.com, 1
 11bbee.com, 1
 11bbjj.com, 1
-11bbkk.com, 1
 11bbpp.com, 1
 11bbqq.com, 1
 11bbrr.com, 1
 11bbss.com, 1
 11bbtt.com, 1
-11bbyy.com, 1
 11bbzz.com, 1
 11bet86.com, 1
 11ccee.com, 1
-11ccff.com, 1
 11ccgg.com, 1
 11cchh.com, 1
 11ccjj.com, 1
@@ -910,13 +874,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11ddzz.com, 1
 11dzon.com, 1
 11eebb.com, 1
-11eecc.com, 1
-11eedd.com, 1
 11eeff.com, 1
 11eegg.com, 1
 11eehh.com, 1
 11eejj.com, 1
-11eepp.com, 1
 11eeqq.com, 1
 11eess.com, 1
 11eett.com, 1
@@ -928,8 +889,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11ffhh.com, 1
 11ffjj.com, 1
 11ffkk.com, 1
-11ffpp.com, 1
-11ffqq.com, 1
 11ffrr.com, 1
 11fftt.com, 1
 11ffxx.com, 1
@@ -948,10 +907,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11ggrr.com, 1
 11ggss.com, 1
 11ggtt.com, 1
-11ggxx.com, 1
 11ggyy.com, 1
 11ggzz.com, 1
-11hhcc.com, 1
 11hhee.com, 1
 11hhff.com, 1
 11hhgg.com, 1
@@ -959,33 +916,25 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11hhqq.com, 1
 11hhrr.com, 1
 11hhtt.com, 1
-11hhyy.com, 1
 11hhzz.com, 1
 11jjaa.com, 1
-11jjbb.com, 1
 11jjcc.com, 1
 11jjee.com, 1
-11jjff.com, 1
-11jjhh.com, 1
 11jjpp.com, 1
 11jjqq.com, 1
 11jjrr.com, 1
 11jjtt.com, 1
-11jjyy.com, 1
 11jjzz.com, 1
 11kkee.com, 1
 11kkff.com, 1
 11kkss.com, 1
-11kkyy.com, 1
 11lc8.com, 1
 11lc8.net, 1
 11loc.de, 1
 11men.tk, 1
-11ppbb.com, 1
 11ppcc.com, 1
 11ppdd.com, 1
 11ppee.com, 1
-11ppff.com, 1
 11ppgg.com, 1
 11pphh.com, 1
 11ppjj.com, 1
@@ -996,7 +945,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11ppzz.com, 1
 11qqbb.com, 1
 11qqdd.com, 1
-11qqee.com, 1
 11qqff.com, 1
 11qqgg.com, 1
 11qqhh.com, 1
@@ -1004,9 +952,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11qqpp.com, 1
 11qqrr.com, 1
 11qqss.com, 1
-11qqtt.com, 1
 11qqyy.com, 1
-11qqzz.com, 1
 11rrcc.com, 1
 11rrdd.com, 1
 11rree.com, 1
@@ -1018,10 +964,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11rrpp.com, 1
 11rrqq.com, 1
 11rrss.com, 1
-11rrxx.com, 1
 11rryy.com, 1
 11rrzz.com, 1
-11ssff.com, 1
 11sshh.com, 1
 11ssjj.com, 1
 11sskk.com, 1
@@ -1029,14 +973,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11ssqq.com, 1
 11ssrr.com, 1
 11sstt.com, 1
-11sszz.com, 1
 11thstreetcoffee.com, 1
 11ttbb.com, 1
-11ttcc.com, 1
 11ttdd.com, 1
 11ttee.com, 1
 11ttff.com, 1
-11ttgg.com, 1
 11tthh.com, 1
 11ttkk.com, 1
 11ttpp.com, 1
@@ -1054,19 +995,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 11yykk.com, 1
 11yypp.com, 1
 11yyqq.com, 1
-11yyrr.com, 1
-11yytt.com, 1
 11yyxx.com, 1
-11yyzz.com, 1
-11zzaa.com, 1
 11zzbb.com, 1
 11zzdd.com, 1
-11zzee.com, 1
 11zzgg.com, 1
 11zzhh.com, 1
 11zzjj.com, 1
 11zzkk.com, 1
-11zzqq.com, 1
 11zztt.com, 1
 11zzyy.com, 1
 120323.com, 1
@@ -1181,6 +1116,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 123roulement.be, 1
 123roulement.com, 1
 123seo.ml, 1
+123start.pl, 1
 123termpapers.com, 1
 123viajando.com, 1
 123writings.com, 1
@@ -1198,7 +1134,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1288fc.com, 1
 1299bet.com, 1
 12ag8.com, 1
-12ca.com, 1
 12l.nl, 1
 12nomos.tk, 1
 12thmanrising.com, 1
@@ -1401,26 +1336,17 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 157ks.com, 1
 157ks.net, 1
 157z6.com, 1
-158be.com, 1
-158bg.com, 1
-158bh.com, 1
-158bi.com, 1
-158bq.com, 1
 158fb.com, 1
-158gs.com, 1
 158ia.com, 1
 158in.com, 1
 158iw.com, 1
 158k66.ag, 1
 158k66.com, 1
 158ks.net, 1
-158nb.com, 1
 158yt.com, 1
-158yu.com, 1
 158yv.com, 1
 158z6.com, 1
 158za.com, 1
-158zh.com, 1
 1590284872.rsc.cdn77.org, 1
 15918.net, 1
 159cp.com, 1
@@ -1483,23 +1409,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 162229.com, 1
 162361.com, 1
 162632.com, 1
-162be.com, 1
 162bf.com, 1
 162bg.com, 1
-162bj.com, 1
 162ca.com, 1
 162cb.com, 1
-162ce.com, 1
 162cf.com, 1
-162ch.com, 1
-162cq.com, 1
-162cr.com, 1
-162cs.com, 1
-162cx.com, 1
-162cy.com, 1
-162dc.com, 1
-162dg.com, 1
-162ea.com, 1
 162ee.com, 1
 162ff.com, 1
 162jj.com, 1
@@ -1513,6 +1427,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1666ks.com, 1
 166jk.cc, 1
 166ks.net, 1
+166zzz.com, 1
 16836500.com, 1
 1683651.com, 1
 16836511.com, 1
@@ -1750,6 +1665,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 189ks.net, 1
 189z6.com, 1
 18agks.com, 1
+18celebration.com, 1
 18f.gov, 1
 18f.gsa.gov, 0
 18upchat.com, 1
@@ -1856,10 +1772,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1europlan.nl, 1
 1f123.net, 1
 1fach-digital.de, 1
+1fax.com, 1
 1fc0.org, 1
 1gp.us, 1
 1hc.be, 1
-1hourproofreading.com, 1
 1in9.net, 1
 1it.click, 1
 1js.de, 0
@@ -1900,7 +1816,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 1scope.com, 1
 1se.co, 1
 1se2or3.com, 1
-1simplesolution.com, 1
 1st-bounce.co.uk, 1
 1st-community.de, 1
 1st2bounce.com, 1
@@ -1930,6 +1845,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 2000feet.tk, 1
 2000meter.no, 1
 2001y.me, 1
+2002000.xyz, 1
 200201.xyz, 1
 2002138.com, 1
 20071019780415.com, 1
@@ -1947,13 +1863,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 200llll.com, 1
 200mmmm.com, 1
 200oooo.com, 1
-200pppp.com, 1
 200qqqq.com, 1
 200rrrr.com, 1
 200uuuu.com, 1
 200vvvv.com, 1
 200wwww.com, 1
-200xxxx.com, 1
 200yyyy.com, 1
 200zzzz.com, 1
 2012.ovh, 1
@@ -1978,7 +1892,22 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 202jj.com, 1
 2030404.com, 1
 2030411.com, 1
+2033004.com, 1
+2033005.com, 1
 2033a.com, 1
+2033b.com, 1
+2033c.com, 1
+2033d.com, 0
+2033e.com, 0
+2033f.com, 0
+2033g.com, 0
+2033h.com, 0
+2033i.com, 0
+2033l.com, 0
+2033m.com, 0
+2033n.com, 0
+2033r.com, 0
+2033s.com, 0
 2033z.com, 1
 204504byse.info, 1
 2048-spiel.de, 1
@@ -2025,13 +1954,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 2226321.com, 1
 2227035.com, 1
 2227552.com, 1
-222b58.com, 1
 222bet86.com, 1
 222digits.pl, 1
 222k8.com, 1
 222k8.net, 1
 222tips.com, 1
-222yn.com, 1
 222zlong.com, 1
 224918.com, 1
 225485.com, 1
@@ -2076,16 +2003,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 22bbtt.com, 1
 22bbyy.com, 1
 22bet86.com, 1
-22ccaa.com, 1
 22ccbb.com, 1
-22ccee.com, 1
 22ccpp.com, 1
 22ccxx.com, 1
 22cncn.com, 1
 22d.io, 1
 22ddhh.com, 1
 22ddii.com, 1
-22ddjj.com, 1
 22ddkk.com, 1
 22ddpp.com, 1
 22ddqq.com, 1
@@ -2098,15 +2022,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 22eegg.com, 1
 22eekk.com, 1
 22eess.com, 1
-22ffcc.com, 1
 22ffee.com, 1
-22ffgg.com, 1
 22ffpp.com, 1
 22ffxx.com, 1
 22ggaa.com, 1
 22ggdd.com, 1
-22gugu.com, 1
-22haha.com, 1
 22haose.com, 1
 22hehe.com, 1
 22hhcc.com, 1
@@ -2122,11 +2042,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 22kb88.com, 1
 22kkdd.com, 1
 22kkpp.com, 1
-22kkss.com, 1
 22kkyy.com, 1
 22lc8.com, 1
 22lc8.net, 1
-22momo.com, 1
 22ppdd.com, 1
 22ppgg.com, 1
 22ppss.com, 1
@@ -2134,21 +2052,16 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 22qqbb.com, 1
 22qqgg.com, 1
 22qqii.com, 1
-22qqjj.com, 1
 22qqrr.com, 1
 22qqtt.com, 1
-22rere.com, 1
 22rree.com, 1
 22rrff.com, 1
 22rrss.com, 1
-22ruru.com, 1
 22ssbb.com, 1
 22ssjj.com, 1
 22sskk.com, 1
 22sstt.com, 1
-22tete.com, 1
 22ttgg.com, 1
-22ttkk.com, 1
 22txc.com, 1
 22vetter.st, 1
 22xxhh.com, 1
@@ -2225,6 +2138,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 247a.co.uk, 1
 247healthshop.com, 1
 247medplan.com, 1
+247naijabuzz.com, 1
 247xchanger.com, 1
 2484811.com, 1
 24848168.com, 1
@@ -2295,21 +2209,15 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 2525admin.nl, 1
 2555z6.com, 1
 255k8.com, 1
-256ab.com, 1
 256ac.com, 1
 256be.com, 1
 256bf.com, 1
-256bk.com, 1
 256bl.com, 1
 256bp.com, 1
 256bq.com, 1
-256br.com, 1
-256bs.com, 1
 256bt.com, 1
 256bx.com, 1
-256ge.com, 1
 256hh.com, 1
-256hk.com, 1
 256k.me, 1
 256pb.com, 1
 256pf.com, 1
@@ -2331,38 +2239,20 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 266k66.com, 1
 266z6.com, 1
 269196.com, 1
-26bbc.com, 1
 26ce.com, 1
-26ck.com, 1
-26ddc.com, 1
 26gt.com, 1
-26he.com, 1
 26ja.com, 1
-26na.com, 1
 26nc.com, 1
 26nd.com, 1
-26pa.com, 1
-26pe.com, 1
 26pg.com, 1
 26pn.com, 1
-26rd.com, 1
 26sn.com, 1
 26sr.com, 1
 26ssb.com, 1
-26uuu.com, 1
 26uuu.info, 1
-26uuu.mobi, 1
-26uuu.net, 1
-26uuu.org, 1
-26uuu.tv, 1
-26uuu.us, 1
-26xe.com, 1
-26yk.com, 1
 26z6.com, 1
 27000.best, 1
 2718282.net, 1
-276112.com, 1
-276117.com, 1
 276771.com, 1
 27728522.com, 1
 2777z6.com, 1
@@ -2376,7 +2266,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 2831365.com, 0
 28365cn-365.com, 1
 28428.com, 1
-284365.com, 1
 285551.com, 1
 2858958.com, 1
 2888z6.com, 1
@@ -2437,8 +2326,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 2h-nagoya.org, 1
 2habc.com, 1
 2heartsbookings.co.uk, 1
-2hypeenterprises.com, 1
-2isk.in, 1
 2jhb.com, 1
 2kgwf.fi, 1
 2krueger.de, 1
@@ -2447,8 +2334,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 2learncomputing.ga, 1
 2link.ga, 1
 2lovebirdsblog.com, 1
+2makeu.com, 1
 2manydots.nl, 1
 2mb.solutions, 1
+2me.cl, 1
 2melo.fr, 1
 2mir.com, 1
 2monkeysandme.com, 1
@@ -2467,7 +2356,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 2ulcceria.nl, 1
 2wheel.com, 0
 2x.nu, 1
-2ximedia.com, 1
 2y.fi, 1
 2y3x.com, 1
 3-dot-careapp1-146314.appspot.com, 1
@@ -2480,11 +2368,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 300bbbb.com, 1
 300cccc.com, 1
 300dddd.com, 1
-300ffff.com, 1
-300gggg.com, 1
 300hhhh.com, 1
-300iiii.com, 1
-300jjjj.com, 1
 300kkkk.com, 1
 300llll.com, 1
 300mmmm.com, 1
@@ -2594,7 +2478,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 31du.cn, 1
 31klabs.com, 1
 320281.net, 1
-321098.com, 1
 321132.com, 1
 321666365.com, 1
 321live.nl, 1
@@ -2631,7 +2514,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 3336321.com, 1
 33365t.com, 1
 3337035.com, 1
-333b58.com, 1
 333bet86.com, 1
 333zlong.com, 1
 33445111.com, 1
@@ -2656,14 +2538,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 338sa.com, 1
 33acac.com, 1
 33am8.com, 1
-33ao.com, 1
 33b58.com, 1
 33bet86.com, 1
 33btt.net, 1
 33devici.ml, 1
-33eh.com, 1
-33ej.com, 1
-33iz.com, 1
 33jiasu.com, 1
 33kb88.com, 1
 33knkn.com, 1
@@ -2727,75 +2605,53 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 349433.com, 1
 349533.com, 1
 34ac.com, 1
-34ae.com, 1
 34ax.com, 1
-34bg.com, 1
 34bk.com, 1
 34da.com, 1
-34ex.com, 1
 34fc.com, 1
 34fy.com, 1
 34gn.com, 1
 34gr.com, 1
 34gv.com, 1
 34hc.com, 1
-34he.com, 1
 34if.com, 1
 34il.com, 1
 34iu.com, 1
 34iv.com, 1
 34ix.com, 1
-34ja.com, 1
 34jb.com, 1
-34je.com, 1
-34jf.com, 1
 34jg.com, 1
 34ji.com, 1
 34jm.com, 1
 34jn.com, 1
-34jr.com, 1
-34jt.com, 1
-34jw.com, 1
 34kr.com, 1
 34lb.com, 1
 34ld.com, 1
-34lf.com, 1
-34lk.com, 1
 34lp.com, 1
 34lq.com, 1
 34lr.com, 1
-34lz.com, 1
-34nb.com, 1
 34nd.com, 1
-34nf.com, 1
-34nh.com, 1
-34ni.com, 1
-34nj.com, 1
 34nv.com, 1
 34nw.com, 1
 34oa.com, 1
 34oh.com, 1
 34om.com, 1
 34oy.com, 1
-34pl.com, 1
 34pv.com, 1
 34py.com, 1
 34qa.com, 1
 34qf.com, 1
-34qo.com, 1
 34qx.com, 1
 34sh.com, 1
 34sk.com, 1
 34uf.com, 1
 34va.com, 1
 34vd.com, 1
-34vf.com, 1
 34vh.com, 1
 34vi.com, 1
 34vt.com, 1
 34vu.com, 1
 34vz.com, 1
-34wv.com, 1
 34xc.com, 1
 34xt.com, 1
 34xu.com, 1
@@ -2843,15 +2699,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 35898z.com, 1
 35d88.com, 1
 35dr.com, 1
-35ga.com, 1
 35if.com, 1
 35jq.com, 1
 35ud.com, 1
 35ue.com, 1
-35uh.com, 1
-35uj.com, 1
 35vn.com, 1
-360365.com, 1
 360gpscorp.com, 1
 360hosting.com.au, 1
 360live.fr, 1
@@ -2950,7 +2802,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 3659869.com, 1
 3659980.com, 1
 365a1.com, 1
-365b58.com, 1
 365beautyworld.com, 1
 365cn-288.com, 1
 365d88.com, 1
@@ -2967,6 +2818,19 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 365nnn.vip, 0
 365nnnn.com, 0
 365propertybuyer.co.uk, 0
+365q02.com, 0
+365q03.com, 0
+365q04.com, 0
+365q05.com, 0
+365q06.com, 0
+365q07.com, 0
+365q08.com, 0
+365q10.com, 0
+365q11.com, 0
+365q12.com, 0
+365q13.com, 0
+365q14.com, 0
+365q15.com, 0
 365r.co, 0
 365rr.vip, 0
 365sb-cn.com, 1
@@ -2997,51 +2861,32 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 3666ks.com, 1
 366k66.com, 1
 366z6.com, 1
-369ak.com, 1
 369az.com, 1
-369be.com, 1
 369bk.com, 1
 369bn.com, 1
-369bp.com, 1
-369bq.com, 1
-369br.com, 1
 369bu.com, 1
 369bw.com, 1
 369cd.com, 1
-369ce.com, 1
 369ck.com, 1
 369cr.com, 1
 369cu.com, 1
-369df.com, 1
-369dk.com, 1
-369dp.com, 1
 369dr.com, 1
-369ea.com, 1
 369ec.com, 1
 369eh.com, 1
 369em.com, 1
 369ep.com, 1
-369eq.com, 1
-369ex.com, 1
-369ey.com, 1
-369ez.com, 1
 369fj.com, 1
-369fm.com, 1
 369fn.com, 1
 369ft.com, 1
 369fy.com, 1
 369gh.com, 1
 369gp.com, 1
-369ha.com, 1
 369ja.com, 1
-369mb.com, 1
 369mr.com, 1
 369nk.com, 1
 369pb.com, 1
 369qb.com, 1
 369ra.com, 1
-369rr.com, 1
-369tw.com, 1
 369ve.com, 1
 369wt.com, 1
 36ag8.com, 1
@@ -3113,34 +2958,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 381115.com, 1
 38138938.com, 1
 382225.com, 1
-3837a.com, 1
-3837app.com, 1
-3837app3837app.com, 1
-3837app3837app3837app.com, 1
-3837b.com, 1
-3837c.com, 1
-3837d.com, 1
-3837e.com, 1
-3837g.com, 1
-3837h.com, 1
-3837i.com, 1
-3837j.com, 1
-3837k.com, 1
-3837l.com, 1
-3837m.com, 1
-3837n.com, 1
-3837o.com, 1
-3837p.com, 1
-3837q.com, 1
 3837r.com, 1
 3837s.com, 1
-3837t.com, 1
-3837u.com, 1
-3837v.com, 1
-3837w.com, 1
-3837x.com, 1
-3837y.com, 1
-3837z.com, 1
 3838onndo.tk, 1
 3839.ca, 1
 383aaa.com, 1
@@ -3189,17 +3008,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 3957y.com, 1
 3957z.com, 1
 396228.com, 1
-396301.com, 1
-396302.com, 1
-396303.com, 1
-396304.com, 1
-396305.com, 1
 3963aa.com, 1
-3963bb.com, 1
-3963cc.com, 1
-3963dd.com, 1
-3963ee.com, 1
-3963ff.com, 1
 396422.com, 1
 3970a.com, 1
 3970aa.com, 1
@@ -3284,6 +3093,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 3candy.com, 1
 3cbalance.pl, 1
 3cc365.com, 1
+3commas.io, 1
 3countiescastlehire.co.uk, 1
 3cs.ch, 1
 3d-animator.net, 1
@@ -3306,7 +3116,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 3dmusiclab.nl, 1
 3dnovedades.com, 1
 3do3dont.com, 1
-3dprintinggear.net, 1
 3dprintsondemand.eu, 1
 3dreactions.com, 1
 3dsupplies.be, 1
@@ -3355,6 +3164,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 3niu7.com, 1
 3niu8.com, 1
 3niu88.com, 1
+3niu888.com, 1
 3niu9.com, 1
 3niusurl.com, 1
 3niuurl.com, 1
@@ -3464,7 +3274,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4096bit.de, 0
 40acts.org.uk, 1
 40daysforlifepensacola.com, 1
-40percentpapermache.com, 0
+40percentpapermache.com, 1
 41-where.com, 1
 41199.com, 1
 411film.com, 1
@@ -3473,7 +3283,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4144bet.com, 1
 414553.com, 1
 4151365.com, 1
-416365.com, 1
 41844.de, 0
 418663.com, 1
 41studio.com, 1
@@ -3481,7 +3290,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 42.tools, 1
 420.nerdpol.ovh, 1
 420java.com, 1
-420screen.com, 1
 420weedcenter.com, 1
 4233065.com, 1
 4233068.com, 1
@@ -3520,7 +3328,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 43klive.com, 1
 44-k.com, 1
 440887.com, 1
-440cc.com, 1
 44168365.com, 1
 441jj.com, 0
 442887.com, 1
@@ -3532,11 +3339,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4447035.com, 1
 4447552.com, 1
 444887.com, 1
-444b58.com, 1
 444bet86.com, 1
 4455bet.vip, 1
 445887.com, 1
-44b58.com, 1
 44sec.com, 0
 451.ooo, 1
 451365.com, 1
@@ -3569,17 +3374,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 46ap.com, 1
 46ay.com, 1
 46az.com, 1
-46bf.com, 1
 46bg.com, 1
 46bh.com, 1
-46bk.com, 1
-46bl.com, 1
 46bn.com, 1
 46bp.com, 1
 46bq.com, 1
 46br.com, 1
 46bx.com, 1
-46ce.com, 1
 46cg.com, 1
 46cu.com, 1
 46d88.com, 1
@@ -3590,49 +3391,26 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 46dn.com, 1
 46dr.com, 1
 46ds.com, 1
-46dx.com, 1
-46ea.com, 1
 46eb.com, 1
-46ec.com, 1
 46ed.com, 1
-46ef.com, 1
 46eg.com, 1
-46eh.com, 1
-46ej.com, 1
-46ek.com, 1
 46ep.com, 1
 46eq.com, 1
-46es.com, 1
 46et.com, 1
-46ex.com, 1
 46ey.com, 1
-46ez.com, 1
 46fa.com, 1
-46fb.com, 1
-46fd.com, 1
-46fe.com, 1
-46fg.com, 1
-46fh.com, 1
-46fj.com, 1
-46fk.com, 1
-46fn.com, 1
 46fp.com, 1
 46fq.com, 1
-46fr.com, 1
-46fx.com, 1
 46gc.com, 1
 46gi.com, 1
 46gj.com, 1
 46gk.com, 1
 46gl.com, 1
-46gp.com, 1
 46gx.com, 1
 46gy.com, 1
 46gz.com, 1
 46ha.com, 1
-46hc.com, 1
 46he.com, 1
-46hf.com, 1
 46hi.com, 1
 46hl.com, 1
 46ia.com, 1
@@ -3648,10 +3426,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 46jc.com, 1
 46jd.com, 1
 46jr.com, 1
-46jx.com, 1
 46kh.com, 1
 46ki.com, 1
-46kl.com, 1
 46kn.com, 1
 46kp.com, 1
 46kq.com, 1
@@ -3659,7 +3435,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 46ky.com, 1
 46kz.com, 1
 46lf.com, 1
-46lj.com, 1
 46lk.com, 1
 46lq.com, 1
 46lt.com, 1
@@ -3667,7 +3442,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 46ng.com, 1
 46ni.com, 1
 46nk.com, 1
-46nr.com, 1
 46nu.com, 1
 46pg.com, 1
 46pj.com, 1
@@ -3682,7 +3456,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 46rj.com, 1
 46rl.com, 1
 46rn.com, 1
-46rt.com, 1
 46rx.com, 1
 46rz.com, 1
 46sd.com, 1
@@ -3727,8 +3500,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 46zk.com, 1
 46zl.com, 1
 46zn.com, 1
-46zs.com, 1
-46zt.com, 1
 47.rs, 1
 4706666.com, 1
 4716666.com, 1
@@ -3741,7 +3512,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4776070.com, 1
 4786666.com, 1
 47af.com, 1
-47an.com, 1
 47d88.com, 1
 47dp.com, 1
 47essays.com, 1
@@ -3758,10 +3528,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 47iz.com, 1
 47jc.com, 1
 47kl.com, 1
-47ld.com, 1
 47lo.com, 1
 47nf.com, 1
-47nh.com, 1
 47nt.com, 1
 47ph.com, 1
 47qe.com, 1
@@ -3775,26 +3543,17 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 47vg.com, 1
 47vk.com, 1
 47vy.com, 1
-47vz.com, 1
 47wv.com, 1
 47xc.com, 1
 47xt.com, 1
-47yf.com, 1
 47yi.com, 1
 47yp.com, 1
 47yr.com, 1
-47yt.com, 1
 47yv.com, 1
 47yw.com, 1
 47yz.com, 1
-47za.com, 1
 47ze.com, 1
 47zg.com, 1
-47zi.com, 1
-47zm.com, 1
-47zn.com, 1
-47zq.com, 1
-47zt.com, 1
 47zv.com, 1
 48365365cn.com, 1
 48365cn-365.com, 1
@@ -3828,6 +3587,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4dillusion.tk, 1
 4dlatest.com, 1
 4dpredict.com, 1
+4driver.eu, 1
 4dropping.com, 1
 4everproxy.com, 1
 4evip.com, 1
@@ -3836,10 +3596,10 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4flex.info, 1
 4freepress.com, 1
 4g-server.eu, 0
-4garage.com.br, 1
 4gnews.pt, 1
 4hmediaproductions.com, 1
 4host.ch, 1
+4hypo.cz, 1
 4iners.com, 1
 4investors.de, 1
 4kpi.eu, 1
@@ -3847,7 +3607,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4lephants.tk, 1
 4list.ml, 1
 4loc.us, 1
-4lock.com.br, 1
 4mama.ua, 1
 4maniacos.tk, 1
 4mm.org, 1
@@ -3872,6 +3631,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4vector.com, 1
 4vf.de, 1
 4vio.com, 1
+4voip.ru, 1
 4web-hosting.com, 1
 4wrd.cc, 1
 4x.fi, 1
@@ -3882,6 +3642,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 4xlabs.co, 1
 4y4a-arts.space, 1
 50-ottenkov.tk, 1
+50.gy, 1
 50.pe, 1
 5000164.com, 1
 5000164.jp, 1
@@ -3889,7 +3650,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 5002888.com, 1
 5004233.com, 1
 5007999.com, 1
-500aaaa.com, 1
 500bbbb.com, 1
 500dddd.com, 1
 500eeee.com, 1
@@ -3909,8 +3669,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 500uuuu.com, 1
 500vvvv.com, 1
 500wordessay.gq, 1
-500xxxx.com, 1
-500yyyy.com, 1
 500zzzz.com, 1
 501117.com, 1
 5017501.com, 1
@@ -4063,17 +3821,12 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 52051.com, 1
 52051a.com, 1
 5205365.com, 0
-52062a.com, 1
-52062b.com, 1
+52062e.com, 1
 52062g.com, 1
 52062i.com, 1
-52062j.com, 1
-52062m.com, 1
-52062n.com, 1
-52062r.com, 1
-52062t.com, 1
-52062w.com, 1
+52062l.com, 1
 52062y.com, 1
+52062z.com, 1
 5206365.com, 0
 5209365.com, 0
 520xpjxpj.com, 0
@@ -4085,6 +3838,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 524922.com, 1
 525.info, 1
 5287.com, 1
+528sss.com, 1
 529kb.com, 1
 529sss.com, 1
 52b9.com, 1
@@ -4130,9 +3884,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 546802.com, 1
 54below.com, 1
 54lsj.cc, 1
-551365.com, 1
 5518k3.com, 1
-552365.com, 1
 552z6.com, 1
 55321365.com, 1
 5533445.com, 1
@@ -4146,7 +3898,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 5556321.com, 1
 5557035.com, 1
 5557552.com, 1
-555b58.com, 1
 555bet86.com, 1
 555btt.com, 1
 555k8.com, 1
@@ -4161,11 +3912,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 5566bet.vip, 1
 556777.cc, 1
 556z6.com, 1
+557bbb.com, 1
 557z6.com, 1
 558btt.net, 1
 558z6.com, 1
 559z6.com, 1
-55b58.com, 1
 55bet86.com, 1
 55d88.com, 1
 55k66.vip, 1
@@ -4199,11 +3950,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 578637.com, 1
 5792.org, 1
 579422.com, 1
-5795111.com, 1
-579533.com, 1
 5795444.com, 1
-5795885.com, 1
-5795886.com, 1
 5795887.com, 1
 5796.org, 1
 5797.org, 1
@@ -4329,17 +4076,15 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 5thchichesterscouts.org.uk, 1
 5thelementtease.com, 1
 5y.fi, 1
+6.gift, 1
 6004233.com, 1
 60062b.cc, 1
 60062h.cc, 1
 60062i.cc, 1
 600aaaa.com, 1
 600bbbb.com, 1
-600cao.com, 1
 600dddd.com, 1
-600gao.com, 1
 600iiii.com, 1
-600jjjj.com, 1
 600k8.com, 1
 600kkkk.com, 1
 600llll.com, 1
@@ -4538,9 +4283,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 6396yyy.com, 1
 6396zzz.com, 1
 63aj.com, 1
-63ak.com, 1
-63ao.com, 1
-63ap.com, 1
 63at.com, 1
 63bg.com, 1
 63bh.com, 1
@@ -4555,44 +4297,30 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 63et.com, 1
 63fb.com, 1
 63fd.com, 1
-63fg.com, 1
 63fk.com, 1
 63fn.com, 1
 63fp.com, 1
-63fq.com, 1
 63ga.com, 1
 63gaming.com, 1
 63gc.com, 1
 63gf.com, 1
 63gh.com, 1
-63gi.com, 1
 63gj.com, 1
 63gn.com, 1
 63gq.com, 1
-63gt.com, 1
 63gu.com, 1
 63ha.com, 1
 63he.com, 1
-63ho.com, 1
 63hq.com, 1
 63hv.com, 1
 63hx.com, 1
 63ia.com, 1
-63ib.com, 1
-63ic.com, 1
 63if.com, 1
-63ig.com, 1
 63ik.com, 1
 63im.com, 1
-63iq.com, 1
-63ir.com, 1
-63iv.com, 1
 63iw.com, 1
-63ix.com, 1
-63jg.com, 1
 63jl.com, 1
 63jr.com, 1
-63jw.com, 1
 63kd.com, 1
 63ki.com, 1
 63kl.com, 1
@@ -4606,15 +4334,12 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 63lr.com, 1
 63md.com, 1
 63mf.com, 1
-63mj.com, 1
 63mq.com, 1
-63nc.com, 1
 63nd.com, 1
 63ng.com, 1
 63ni.com, 1
 63nk.com, 1
 63nl.com, 1
-63np.com, 1
 63nx.com, 1
 63of.com, 1
 63ox.com, 1
@@ -4630,7 +4355,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 63rz.com, 1
 63ta.com, 1
 63tf.com, 1
-63to.com, 1
 63tx.com, 1
 63ud.com, 1
 63uf.com, 1
@@ -4743,7 +4467,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 659422.com, 1
 659ks.com, 1
 65d88.com, 1
-66.tn, 1
 6602p.com, 1
 661326.com, 1
 6616.fun, 1
@@ -4792,8 +4515,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 663365x.com, 1
 663365y.com, 1
 663365z.com, 1
-663651.com, 1
-663657.com, 1
 6639s.com, 1
 663z6.com, 1
 664048.com, 1
@@ -4824,7 +4545,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 6669255.com, 1
 666999bet.com, 1
 666am8.com, 1
-666b58.com, 1
 666bet86.com, 1
 666btt.net, 1
 666k66.com, 1
@@ -4851,7 +4571,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 66ag9.com, 1
 66agks.com, 1
 66b.com, 1
-66b58.com, 1
 66bet86.com, 1
 66bwf.com, 1
 66d88.net, 1
@@ -5013,7 +4732,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 681vv.com, 1
 68277.me, 1
 6830521.com, 1
-6848.com, 1
 68522.com, 1
 68522c.com, 1
 68522k.com, 1
@@ -5140,33 +4858,22 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 7-it.ml, 1
 700.az, 1
 7004233.com, 1
-700aaaa.com, 1
 700bbbb.com, 1
 700cccc.com, 1
 700dddd.com, 1
 700gggg.com, 1
 700hhhh.com, 1
 700iiii.com, 1
-700jjjj.com, 1
 700k8.com, 1
 700mmmm.com, 1
-700nnnn.com, 1
-700oooo.com, 1
-700pppp.com, 1
-700qqqq.com, 1
-700ssss.com, 1
-700tttt.com, 1
 700uuuu.com, 1
-700vvvv.com, 1
 700wns.com, 1
-700wwww.com, 1
 700yyyy.com, 1
 700zzzz.com, 1
 701135.com, 1
 701605.com, 1
-70365365.com, 0
+70365365.com, 1
 704233.com, 1
-7045.com, 1
 704533.com, 1
 7045h.com, 1
 704633.com, 1
@@ -5199,6 +4906,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 7214.cc, 1
 721aa.com, 1
 722201.com, 1
+722sss.com, 1
 722z6.com, 1
 724233.com, 1
 724go.com, 1
@@ -5222,7 +4930,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 732365.com, 1
 732433.com, 1
 733575.com, 1
-73365365.com, 0
+73365365.com, 1
 7337006.com, 1
 7337007.com, 1
 733z6.com, 1
@@ -5239,29 +4947,18 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 73ar.com, 1
 73ax.com, 1
 73az.com, 1
-73dt.com, 1
 73ea.com, 1
 73eb.com, 1
 73ef.com, 1
-73eg.com, 1
 73eh.com, 1
 73ei.com, 1
 73ej.com, 1
 73ek.com, 1
 73en.com, 1
-73ep.com, 1
-73eq.com, 1
 73es.com, 1
-73eu.com, 1
-73ew.com, 1
 73ex.com, 1
-73ey.com, 1
-73ez.com, 1
 73fd.com, 1
 73fg.com, 1
-73fh.com, 1
-73fj.com, 1
-73fk.com, 1
 73fl.com, 1
 73fp.com, 1
 73fq.com, 1
@@ -5272,7 +4969,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 73gb.com, 1
 73gc.com, 1
 73gf.com, 1
-73gi.com, 1
 73gj.com, 1
 73gl.com, 1
 73gn.com, 1
@@ -5301,8 +4997,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 73ld.com, 1
 73lg.com, 1
 73ln.com, 1
-73ng.com, 1
-73nj.com, 1
 73nk.com, 1
 73nm.com, 1
 73np.com, 1
@@ -5318,7 +5012,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 73qe.com, 1
 73ql.com, 1
 73qx.com, 1
-73ra.com, 1
 73rh.com, 1
 73rq.com, 1
 73rt.com, 1
@@ -5349,7 +5042,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 73xm.com, 1
 73xv.com, 1
 73yj.com, 1
-73yp.com, 1
 73yr.com, 1
 73yu.com, 1
 73za.com, 1
@@ -5391,7 +5083,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 762116.com, 1
 763365.com, 1
 76365365.com, 1
-7654321c.com, 1
+7654321c.com, 0
 765666365.com, 1
 7666321.com, 1
 76668.com, 1
@@ -5426,6 +5118,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 777365t.com, 1
 7776321.com, 0
 7776365.com, 1
+7777365q.com, 0
 7777k8.com, 1
 7777k8.net, 1
 777bet86.com, 1
@@ -5435,7 +5128,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 779z6.com, 1
 77b58.com, 1
 77bet86.com, 1
-77caca.com, 1
 77dd.com, 1
 77lc8.com, 1
 77zaza.com, 1
@@ -5477,6 +5169,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 790security.co.za, 1
 791188.com, 1
 793ww.com, 1
+795sss.com, 1
 797715.com, 1
 798sss.com, 1
 799ks.com, 1
@@ -5505,11 +5198,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 7minutemiles.com, 0
 7pets.net, 1
 7plus.com.au, 1
+7proxies.com, 1
 7qly.com, 1
 7sdre.am, 1
 7starhealth.ga, 1
 7th-heaven.me, 1
-7thcircledesigns.com, 1
 7url.ml, 1
 7win.am, 1
 7x24servis.com, 1
@@ -5534,10 +5227,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 800kkkk.com, 1
 800llll.com, 1
 800nnnn.com, 1
-800pppp.com, 1
 800qqqq.com, 1
 800rrrr.com, 1
-800uuuu.com, 1
 800vvvv.com, 1
 800wwww.com, 1
 800xxxx.com, 1
@@ -5730,7 +5421,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 8199d88.com, 1
 819kb.com, 1
 81d88.com, 1
-81sese.com, 1
 81sese.net, 1
 81sese.org, 1
 81uc.com, 1
@@ -5886,39 +5576,28 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 8391p.com, 1
 8396p.com, 1
 83kb88.com, 1
-842365.com, 1
 842844.com, 1
 846773.com, 1
 847773.com, 1
 848663.com, 1
 848jz.com, 1
-84ab.com, 1
 84ag.com, 1
 84aj.com, 1
 84al.com, 1
 84an.com, 1
 84aq.com, 1
 84ar.com, 1
-84at.com, 1
 84az.com, 1
 84bd.com, 1
-84be.com, 1
 84bf.com, 1
-84bh.com, 1
 84bi.com, 1
 84bn.com, 1
 84bp.com, 1
 84bq.com, 1
 84bx.com, 1
-84cd.com, 1
-84ce.com, 1
 84cl.com, 1
 84cr.com, 1
-84cs.com, 1
-84cu.com, 1
-84cw.com, 1
 84cx.com, 1
-84df.com, 1
 84dp.com, 1
 84dt.com, 1
 84eg.com, 1
@@ -5931,21 +5610,13 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 84fb.com, 1
 84fd.com, 1
 84fe.com, 1
-84fg.com, 1
-84fh.com, 1
 84fi.com, 1
-84fj.com, 1
-84fn.com, 1
-84fp.com, 1
-84fq.com, 1
 84fs.com, 1
 84ft.com, 1
-84fy.com, 1
 84fz.com, 1
 84ga.com, 1
 84gc.com, 1
 84gf.com, 1
-84gh.com, 1
 84gi.com, 1
 84gk.com, 1
 84gt.com, 1
@@ -5953,51 +5624,33 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 84he.com, 1
 84hp.com, 1
 84hs.com, 1
-84hv.com, 1
 84hx.com, 1
 84ia.com, 1
 84if.com, 1
 84im.com, 1
 84jg.com, 1
-84jh.com, 1
 84ji.com, 1
 84jl.com, 1
-84jp.com, 1
 84jt.com, 1
 84kc.com, 1
-84kh.com, 1
-84ki.com, 1
 84kl.com, 1
 84kn.com, 1
 84kp.com, 1
 84kq.com, 1
-84kr.com, 1
-84kt.com, 1
 84kv.com, 1
-84kz.com, 1
 84lb.com, 1
 84lh.com, 1
-84nf.com, 1
-84ni.com, 1
-84nv.com, 1
-84nx.com, 1
-84pb.com, 1
-84pd.com, 1
 84pe.com, 1
 84pg.com, 1
-84ph.com, 1
 84pq.com, 1
-84qa.com, 1
 84qb.com, 1
 84qf.com, 1
-84qi.com, 1
 84qj.com, 1
 84qx.com, 1
 84rb.com, 1
 84rd.com, 1
 84rf.com, 1
 84rn.com, 1
-84rt.com, 1
 84sg.com, 1
 84sr.com, 1
 84sv.com, 1
@@ -6016,17 +5669,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 84yj.com, 1
 84yp.com, 1
 84yq.com, 1
-84yt.com, 1
 84yv.com, 1
 84yw.com, 1
-84za.com, 1
 84zb.com, 1
 84zc.com, 1
-84zd.com, 1
-84ze.com, 1
-84zm.com, 1
 84zr.com, 1
-84zt.com, 1
 84zu.com, 1
 84zv.com, 1
 850226.com, 1
@@ -6306,7 +5953,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 8886ks.com, 1
 888789j.com, 1
 8887ks.com, 1
-88881.pw, 1
+8888365q.com, 0
 888888722.com, 1
 88889822.com, 1
 8888esb.com, 1
@@ -6314,7 +5961,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 8889ks.com, 1
 888am8.com, 1
 888am8.net, 1
-888b58.com, 1
 888bet86.com, 1
 888bwf.com, 1
 888funcity.com, 1
@@ -6347,7 +5993,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 88agks.com, 1
 88bet86.com, 1
 88btt.net, 1
-88caca.com, 1
+88cakescorner.com, 1
 88d.com, 1
 88djl.cc, 1
 88home9.com, 1
@@ -6375,7 +6021,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 88yule6.com, 1
 88yule7.com, 1
 88yule9.com, 1
-88zaza.com, 1
 88zl.app, 1
 8900d.com, 1
 8901178.com, 1
@@ -6460,7 +6105,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 8yun.ga, 0
 9-11commission.gov, 1
 9005424.com, 1
-9009019.com, 1
+9009019.com, 0
 900aaaa.com, 1
 900bbbb.com, 1
 900cccc.com, 1
@@ -6474,7 +6119,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 900qqqq.com, 1
 900tttt.com, 1
 900uuuu.com, 1
-900vvvv.com, 1
 900wwww.com, 1
 900yyyy.com, 1
 900zzzz.com, 1
@@ -6503,6 +6147,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 915ers.com, 0
 915kb.com, 1
 917.moe, 1
+918-siteinfo.com, 1
 918.com, 1
 9180.fun, 1
 9180nn.com, 1
@@ -6841,7 +6486,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 9297yy.co, 1
 9297z.co, 1
 9297zz.co, 1
-92ganb.com, 1
 92kb88.com, 1
 92url.com, 1
 931422.com, 1
@@ -6872,7 +6516,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 93cq.com, 1
 93jc.cn, 1
 93kb88.com, 1
-940365.com, 1
 941988.cn, 1
 943022.com, 1
 9449-27a1-22a1-e0d9-4237-dd99-e75e-ac85-2f47-9d34.de, 1
@@ -6986,6 +6629,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 9721mm.com, 0
 9721yy.com, 0
 972422.com, 1
+9728.com, 0
 9728a.co, 1
 9728aa.co, 1
 9728b.co, 1
@@ -7054,9 +6698,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 9788876.com, 1
 9796k8.com, 1
 9796k8.net, 1
+97bros.com, 1
 9800.cc, 1
 981ccc.com, 1
 9822.am, 1
+9822.com, 1
 9822am.com, 1
 9822cn.com, 1
 9822hk.com, 1
@@ -7070,7 +6716,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 985kb.com, 1
 986ccc.com, 1
 9877bet.com, 1
-988316.com, 0
+988316.com, 1
 988am8.com, 1
 988am8.net, 1
 988wh.com, 1
@@ -7086,11 +6732,11 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 9906753.net, 1
 99123j.com, 1
 9918883.com, 1
+991ccc.com, 1
 992z6.com, 1
 99321365.com, 1
 9933445.com, 1
 99365t.com, 1
-993ccc.com, 1
 99456j.com, 1
 9950p.com, 1
 99599.fi, 1
@@ -7150,7 +6796,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 999998722.com, 1
 9999k8.com, 1
 9999k8.net, 1
-999b58.com, 1
 999bet86.com, 1
 999btt.net, 1
 999k66.com, 1
@@ -7160,7 +6805,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1596722162846000);
 999zlong.com, 1
 99agks.com, 1
 99bet86.com, 1
-99billionaire.com, 1
 99buffets.com, 1
 99d88.com, 1
 99kb88.com, 1
@@ -7399,7 +7043,6 @@ a210.online, 1
 a22z.xyz, 1
 a291.cc, 1
 a2a.me, 1
-a2a.net, 1
 a2c-co.net, 1
 a2censo.com, 1
 a2ch.ru, 1
@@ -7468,13 +7111,13 @@ aaa-racing.net, 1
 aaa-racing.uk, 1
 aaapl.com, 1
 aaapo.com.br, 1
-aabanet.com.br, 1
 aaben-bank.dk, 1
 aabenbank.dk, 1
 aabenjaminjewelry.com, 1
 aacs-design.com, 1
 aadv.com.br, 1
 aaex.uk, 1
+aaflalo.me, 1
 aagetransport.no, 1
 aalalbayt.com, 1
 aalalbayt.net, 1
@@ -7549,6 +7192,7 @@ abbottscastles.co.uk, 1
 abbruch-star.de, 1
 abbtw.com, 1
 abbyairsoft.tk, 1
+abbyvangrinsven.co.nz, 1
 abc-rz.de, 1
 abc-solutions.cf, 1
 abc.li, 1
@@ -7604,6 +7248,7 @@ aberdeencastles.co.uk, 1
 aberdeencriticalmass.tk, 1
 aberdeenjudo.co.uk, 1
 aberon.pl, 1
+abeshultz.com, 1
 abetterdeath.com, 1
 abeus.com, 1
 abg.ninja, 1
@@ -7642,7 +7287,6 @@ ableprop.net, 1
 abloomnova.net, 1
 abloop.com, 1
 abmackenzie.com, 1
-abmc.gov, 1
 abminiplex.in, 1
 abmledger.ca, 1
 abmtax.ca, 1
@@ -7727,6 +7371,7 @@ abrilect.com, 1
 abristolgeek.co.uk, 1
 abrition.com, 1
 abseits.org, 0
+absentia.cf, 1
 absolem.cc, 0
 absoluav.com, 1
 absoluconseils.com, 1
@@ -7766,6 +7411,7 @@ abvent.net, 1
 abvlbasketviganello.ch, 0
 abwatches.net, 1
 abyssproject.net, 1
+abzarweb.com, 1
 ac-admin.pl, 1
 ac-booster.net, 1
 ac-cosmetics.nl, 1
@@ -7787,7 +7433,6 @@ academkin.com, 1
 academus.io, 1
 academy-awards.ml, 1
 academytv.com.au, 1
-acampar.com.br, 1
 acandroid.top, 1
 acaonegocios.com.br, 1
 acapadena.co, 1
@@ -7806,7 +7451,7 @@ accademiapugilistica.it, 1
 accadia.academy, 1
 accelaway.com, 1
 accelerate.network, 1
-acceleratenetworks.com, 1
+acceleratenetworks.com, 0
 accelerateyourworld.org, 1
 accelsnow.com, 1
 accentthailand.com, 1
@@ -7870,7 +7515,6 @@ acemobileforce.com, 1
 acemsa.ga, 1
 acemypaper.com, 1
 acen.eu, 1
-acendealuz.com.br, 1
 acerentalandsales.com, 1
 acerislaw.com, 1
 aceshop702.com, 1
@@ -7880,6 +7524,7 @@ acg.mn, 1
 acg.social, 1
 acg.vc, 1
 acgaudio.com, 1
+acgc.nl, 1
 acgmoon.com, 1
 acgmoon.org, 1
 acgpiano.club, 1
@@ -7919,6 +7564,7 @@ acneintelligence.com, 1
 acnh.info, 1
 acnpacific.com, 1
 acodess.com, 1
+acolicy.com, 1
 acomplia20mg.cf, 1
 aconnor.xyz, 1
 acordes.online, 1
@@ -8058,7 +7704,6 @@ ad-notam.uk, 1
 ad-notam.us, 1
 ad-s.cn, 1
 ad4msan.com, 1
-ad4msan.win, 1
 ada.eco, 1
 ada.gov, 1
 adaera.com, 1
@@ -8084,6 +7729,7 @@ adamh.website, 1
 adamjoycegames.co.uk, 1
 adamkostecki.de, 1
 adamlee.com, 1
+adamliu.net, 1
 adamoutler.com, 1
 adamov.tk, 1
 adamradocz.com, 1
@@ -8171,6 +7817,7 @@ adf.rocks, 1
 adfisicateca.org, 1
 adftrasporti.it, 1
 adhd-inattentive.com, 1
+adhdyogi.ca, 1
 adhesivelaundry.co.uk, 1
 adhgroup.ug, 1
 adhockery.ga, 1
@@ -8263,11 +7910,13 @@ adrenalin.travel, 1
 adrenaline-gaming.ru, 1
 adrian-riemer.tk, 1
 adrian.web.id, 1
+adrian2023.com, 1
 adrianajewelry.my, 1
 adrianbechtold.de, 1
 adriancitu.com, 1
 adriancostin.ro, 1
 adrianjensen.com, 1
+adriankeenan.co.uk, 1
 adrianmejias.com, 1
 adrianoansaldi.it, 1
 adrianobarbosa.xyz, 1
@@ -8278,7 +7927,6 @@ adrianweb.ml, 1
 adriarae.xyz, 1
 adriatic.hr, 1
 adriatrans.ga, 1
-adrienjacquierbret.com, 1
 adrienkohlbecker.com, 1
 adriennesmiles.com, 1
 adrinet.tk, 1
@@ -8299,7 +7947,6 @@ adswoo.com, 1
 adtelligent.com, 1
 adtgroup.com, 1
 adti.pt, 1
-adult.properties, 1
 adultbizz.eu, 1
 adultforum.gr, 1
 adultshop.com.au, 1
@@ -8325,8 +7972,8 @@ advancedheatinginc.com, 1
 advancedoneroofing.com, 1
 advancedprotectionkey.com, 1
 advancedprotectionsecuritykey.com, 1
+advancedroofingmuskoka.com, 1
 advancedseotool.it, 1
-advancedsepticandpumping.com, 1
 advancedsurgicalconsultantsllc.com, 1
 advancedturf.tk, 1
 advancedurologyswla.com, 1
@@ -8383,7 +8030,6 @@ advokat-dtp.gq, 1
 advokat-dtp.ml, 1
 advokat-dtp.tk, 1
 advokat-malinovskii.ml, 1
-advokat-romanov.com, 1
 advokat-vvp.com.ua, 1
 advokatkonsult.cf, 1
 advokatonline.ml, 1
@@ -8401,7 +8047,6 @@ advokaty.gq, 1
 advst.uk, 1
 advtran.com, 1
 adware.pl, 0
-adwokatkosterka.pl, 1
 adwokatzdunek.pl, 1
 adws.io, 1
 adxperience.com, 1
@@ -8437,8 +8082,8 @@ ae86b.com, 1
 ae86c.com, 1
 ae86dj.com, 1
 ae86dy.com, 1
+ae86m.com, 1
 ae86nb.com, 1
-ae86sb.com, 1
 ae86x.com, 1
 ae86zx.com, 1
 aeb.io, 1
@@ -8488,7 +8133,7 @@ aerospace-schools.com, 1
 aerotechcoatings.com, 1
 aerowillys.tk, 1
 aertel.ie, 1
-aessencia.com.br, 1
+aes-freundeskreis.de, 1
 aestheticsplus.xyz, 1
 aesthetikpiercing.de, 1
 aesthetx.com, 1
@@ -8670,7 +8315,6 @@ ag518518.net, 1
 ag5326.com, 1
 ag5358.com, 1
 ag5392.com, 1
-ag5519.com, 1
 ag556.com, 1
 ag5623.com, 1
 ag5657.com, 1
@@ -8718,7 +8362,6 @@ ag660.com, 1
 ag66321.com, 1
 ag66567.com, 1
 ag666.vip, 1
-ag66668.com, 1
 ag6819.com, 1
 ag6825.com, 1
 ag686.com, 1
@@ -8796,7 +8439,6 @@ ag855.net, 1
 ag860.com, 1
 ag8600.com, 1
 ag865.com, 1
-ag87777.com, 1
 ag8778.net, 1
 ag878.com, 1
 ag88-guide.com, 1
@@ -8894,12 +8536,12 @@ aga-eiken.tk, 1
 agaa35.com, 1
 agaa41.com, 1
 agagent.vip, 1
-agalliasis.ch, 0
 agalloch.tk, 1
 agambarta.com, 1
 agamsecurity.ch, 0
 agari-mj.com, 1
 agarioforum.ga, 1
+agasaya.com, 1
 agatajanik.de, 1
 agate.pw, 1
 agaveandpine.com, 1
@@ -9180,6 +8822,7 @@ agworkers.com, 1
 agy.cl, 1
 agyacht.club, 1
 agzlapp.com, 1
+ahata.com, 1
 ahawkesrealtors.com, 1
 ahccorleone.tk, 1
 ahcpr.gov, 0
@@ -9193,6 +8836,7 @@ ahlac.tk, 1
 ahlaejaba.com, 1
 ahlz.sk, 1
 ahmad.works, 1
+ahmed-alasadi.tk, 1
 ahmedabadflowermall.com, 1
 ahmedcharles.com, 1
 ahmerjamilkhan.org, 1
@@ -9209,7 +8853,6 @@ ahu.la, 1
 ahughes03.com, 1
 ahwah.net, 1
 ahxxm.com, 0
-ai-cuisine.fr, 1
 ai-english.jp, 1
 ai-media.tv, 1
 ai-soft.co.jp, 1
@@ -9259,7 +8902,6 @@ aignermunich.de, 1
 aignermunich.jp, 1
 aiinsurance.io, 1
 aiinsurance.xyz, 1
-aijsk.com, 1
 aikenorganics.com, 1
 aikenpromotions.com, 1
 aiki.de, 1
@@ -9367,6 +9009,7 @@ airbnb.ru, 1
 airbnb.se, 1
 airbnb.tools, 1
 airbnbchina.cn, 1
+airbnbcupom.com, 1
 airbnbopen.com, 1
 airborne-inflatables.co.uk, 1
 airbossofamerica.com, 1
@@ -9508,6 +9151,7 @@ akademie-frankfurt.de, 1
 akalashnikov.ru, 1
 akamon.ac.jp, 1
 akaoma.com, 1
+akapumkin.com, 1
 akasha.world, 1
 akashdsouza.now.sh, 1
 akay.me, 1
@@ -9523,7 +9167,6 @@ akerboom.org, 1
 akfoundationindia.com, 1
 akhabar.tk, 1
 akhealthconnection.com, 0
-akhildev.com, 1
 akhilindurti.com, 0
 akhomesforyou.com, 1
 akiba-server.info, 1
@@ -9540,6 +9183,7 @@ akkade.be, 1
 akkbouncycastles.co.uk, 1
 akkordy-skachat.ga, 1
 akmatrix.org, 1
+aknastore.co, 1
 akoch.net, 1
 akostecki.de, 1
 akoww.de, 0
@@ -9599,7 +9243,7 @@ aladdinschools.appspot.com, 1
 aladintechnologies.tk, 1
 alainbaechlerphotography.ch, 0
 alainfrancois.eu, 1
-alainfrancois.nl, 1
+alainfrancois.nl, 0
 alainmargot.ch, 0
 alainodea.com, 1
 alainwolf.ch, 1
@@ -9662,6 +9306,7 @@ albertcuyp-markt.amsterdam, 1
 alberteinsteinbiography.tk, 1
 albertify.xyz, 1
 albertinum-goettingen.de, 1
+alberts-blatt.de, 1
 albilaga.id, 1
 albinma.com, 1
 albion2.org, 1
@@ -9692,8 +9337,17 @@ alcouponest.com, 1
 alcove.cf, 1
 alcubillas.tk, 1
 aldeal.gq, 1
+aldersgate.cf, 1
+aldersgate.ga, 1
+aldersgate.gq, 1
+aldersgate.ml, 1
+aldersgate.tk, 1
+aldersgateumc.cf, 1
+aldersgateumc.ga, 1
+aldersgateumc.gq, 1
+aldersgateumc.ml, 1
+aldersgateumc.tk, 1
 aldiabcs.com, 1
-aldien.com.br, 1
 aldo-saputra.ga, 1
 aldomedia.com, 1
 aldorr.net, 0
@@ -9726,7 +9380,6 @@ alertwire.com, 1
 alesha.tk, 1
 alesia-formation.fr, 1
 alessandrobasi.it, 1
-alessandroonline.com.br, 1
 alessandrotravel.com, 1
 alessandroz.ddns.net, 1
 aletm.it, 1
@@ -9760,7 +9413,7 @@ alexcoman.com, 1
 alexcpp.tk, 1
 alexdaniel.org, 1
 alexdiazdeleon.com, 1
-alexey-shamara.ru, 1
+alexey-shamara.ru, 0
 alexeykopytko.com, 1
 alexfabian.myftp.org, 1
 alexgaynor.net, 1
@@ -9817,10 +9470,8 @@ alfa-tech.su, 1
 alfacharlie.co, 1
 alfadlmedical.com, 1
 alfadlmedical.net, 1
-alfaei.com.br, 1
 alfalasteenyia.cf, 1
 alfambra.tk, 1
-alfaperfumes.com.br, 1
 alfaproweb.fr, 1
 alfastone.com.ua, 1
 alfavideocirurgica.com.br, 1
@@ -9830,6 +9481,7 @@ alforto.nl, 1
 alfratehotelcampiglio.it, 1
 alfred-figge.de, 1
 alfredapp.com, 1
+alfredetnestor.com, 1
 alftrain.com, 1
 algarmatic-automatismos.pt, 1
 algbee.com, 1
@@ -9881,6 +9533,7 @@ alignrs.com, 1
 aliim.gdn, 1
 alikulov.me, 1
 alilialili.ga, 1
+alimak.com, 1
 aliment-covid19.com, 1
 alimentosmcf.com, 1
 alimentsduquebecaumenu.com, 1
@@ -9921,7 +9574,6 @@ alkami.com, 1
 alkamitech.com, 1
 alkel.info, 1
 alkemi-si.fr, 1
-alko-centr.ru, 1
 alko-stop.ml, 1
 alkopedia.tk, 1
 alkor.tk, 1
@@ -9940,6 +9592,7 @@ allaboutreligions.tk, 1
 allaboutswing.co.uk, 1
 allaboutswing.com, 1
 allaboutthekink.org, 1
+allaccessglobal.tech, 1
 allactioneventhire.co.uk, 1
 allamakee.k12.ia.us, 1
 allamericanmuslim.com, 1
@@ -9968,7 +9621,6 @@ allcelebs.tk, 1
 allcinema.net, 1
 allcleanservices.ca, 1
 allcloud.com, 1
-allcountyins.com, 1
 allcovered.nl, 1
 allcoveredbyac.com, 1
 allcrimea.tk, 1
@@ -10019,6 +9671,7 @@ allinagency.com, 1
 allincoin.shop, 1
 allindiacityguide.com, 1
 allindiajobs.ga, 1
+allinform.ga, 1
 allinone-ranking150.com, 1
 allinsuranceinformation.com, 1
 allis.studio, 1
@@ -10049,13 +9702,13 @@ alloutsec.com, 1
 alloverthehill.com, 1
 allpedia.tk, 1
 allphaseclean.com, 1
-allplayer.tk, 1
 allpointsblog.com, 1
 allpointsheating.com, 1
 allproptonline.com, 1
 allpussynow.com, 1
 allrad-buck.de, 1
 allram.info, 1
+allremotecodes.com, 1
 allright.tk, 1
 allroundpvp.net, 1
 allroundtechnology.com, 1
@@ -10112,6 +9765,7 @@ almorafestival.com, 1
 almosis.tk, 1
 almostobjective.com, 1
 almstrom.org, 1
+almukhtar.se, 1
 almusbahperfume.com, 1
 almut-zielonka.de, 1
 almx.net, 1
@@ -10133,6 +9787,7 @@ alpencams.com, 1
 alpencams.net, 1
 alpengreis.ch, 1
 alpenjuice.com, 1
+alperozmen.kim, 1
 alpertron.com.ar, 1
 alpes-deis-tools.com, 1
 alpha-ag.ru, 1
@@ -10161,7 +9816,6 @@ alphaman.ooo, 1
 alphamedphysicians.com, 1
 alphanodes.com, 1
 alphapengu.in, 1
-alphaperfumes.com.br, 1
 alphapoker.ru, 1
 alpharail.se, 1
 alpharoofga.com, 1
@@ -10172,6 +9826,7 @@ alphassl.de, 1
 alphatrash.de, 1
 alphavote-avex.com, 1
 alphavote.com, 1
+alphazure.co.uk, 1
 alphera.nl, 1
 alphie.me, 1
 alphipneux.fr, 1
@@ -10188,6 +9843,7 @@ alpinestarmassage.com, 1
 alplogopedia.it, 1
 alquds.edu, 1
 alquiaga.com, 1
+alquilerps5.com, 1
 alrait.com, 1
 alre-outillage.fr, 1
 alroniks.com, 1
@@ -10217,7 +9873,6 @@ altaizemlya.ml, 1
 altaizemlya.tk, 1
 altapina.com, 0
 altaplana.be, 1
-altawfer.com, 1
 altaynews.kz, 1
 altco.group, 1
 altdforyou.tk, 1
@@ -10232,7 +9887,6 @@ altered.si, 1
 alterego.tk, 1
 altergalaxy.tk, 1
 alteria.xyz, 1
-alternador.com.br, 1
 alternative.bike, 1
 alternative.hosting, 1
 alternativebit.fr, 1
@@ -10394,6 +10048,7 @@ amateurradionotes.com, 1
 amateurs.ga, 1
 amateurvoicetalent.com, 1
 amati.solutions, 1
+amatista.tech, 1
 amato.tk, 1
 amatsuka.com, 1
 amatzen.dk, 1
@@ -10427,8 +10082,7 @@ ambra.net.nz, 1
 ambrosius.io, 1
 ambulanza.roma.it, 1
 ambulari.cz, 1
-amcangroup.com, 1
-amcchemical.com, 1
+amcchemical.com, 0
 amcfirst.com, 1
 amchainitiative.org, 1
 amcs.website, 1
@@ -10449,6 +10103,7 @@ ameliemarieintokyo.com, 1
 amello.de, 1
 amendine.fr, 1
 ameninalaceira.com.br, 1
+ameri-drain.com, 1
 america.gov, 1
 america250.gov, 1
 americafamilylawcenter.org, 1
@@ -10460,6 +10115,7 @@ americanartwarehouse.com, 1
 americanbooks.cf, 1
 americanbuzz.tk, 1
 americandetour.com, 1
+americanenergysystemswa.com, 1
 americanflooring.co, 1
 americanfootball.ml, 1
 americanfootball.tk, 1
@@ -10683,7 +10339,7 @@ anarkhe.net, 1
 anarticle.gq, 1
 anasahr.be, 1
 anassiriphotography.com, 0
-anastasia-shamara.ru, 1
+anastasia-shamara.ru, 0
 anatoray.com, 1
 anaxios.ga, 1
 anayarealm.com, 1
@@ -10729,6 +10385,7 @@ andrea-wirthensohn.at, 0
 andreaassenti.it, 1
 andreaboero.it, 1
 andreadraghetti.it, 1
+andreae.nl, 1
 andreagobetti.com, 1
 andreagourmet.it, 1
 andreahruby.it, 1
@@ -10906,7 +10563,6 @@ angular-js.ga, 1
 angular-software.at, 1
 angularjs.org, 0
 angusandperthpgl.tk, 1
-angusmak.com, 1
 anhaffen.lu, 1
 anhqv.es, 1
 ani-man.de, 1
@@ -10954,7 +10610,6 @@ animeheaven.ml, 1
 animehf.com, 1
 animeinsights.net, 1
 animelandia.tk, 1
-animelib.net, 1
 animem.es, 1
 animemotivation.com, 1
 animeone.me, 1
@@ -11004,6 +10659,8 @@ anleitung-zum-haekeln.de, 1
 anleitung-zum-schreiben.de, 1
 anleitung-zum-schweissen.de, 1
 anleitung-zum-toepfern.de, 1
+anlovegeek.com, 0
+anlovegeek.net, 0
 anlp.top, 1
 anmelden.io, 1
 anmolnayyar.com, 1
@@ -11019,6 +10676,7 @@ annangela.moe, 1
 annarokina.com, 1
 annawagner.pl, 1
 anne-marie.tk, 1
+annebacarat.fr, 1
 annedaniels.co.uk, 1
 anneeden.de, 1
 annejan.com, 1
@@ -11105,6 +10763,7 @@ ansogning-sg.dk, 1
 anstaskforce.gov, 1
 answernow.cf, 1
 answers-online.ru, 1
+ant.lgbt, 1
 antabuse.ga, 1
 antabuskaufen1.gq, 1
 antalya-yesim.cf, 1
@@ -11136,6 +10795,7 @@ antennistaroma.it, 1
 antennisti.milano.it, 1
 antennisti.roma.it, 1
 anteprima.info, 1
+anteroleppanen.fi, 1
 antfarm.cf, 1
 antha.com, 1
 anthisis.tv, 1
@@ -11215,9 +10875,9 @@ antistatik.tk, 1
 antisystem.tk, 1
 antitabak.tk, 1
 antiuser.tk, 1
+antivirusgratuitos.net, 1
 antivirusprotection.reviews, 1
 antizon.net, 1
-antocom.com, 1
 antocom.net, 1
 antocom.ru, 1
 antoga.eu, 1
@@ -11241,13 +10901,13 @@ antota.lt, 1
 antragsgruen.de, 1
 antraxx.ee, 1
 antroposboutique.it, 1
-antroposofica.com.br, 1
 anttitenhunen.com, 1
 antvklik.com, 1
 antyblokada.pl, 1
 antyfake.pl, 1
 anubisz.tk, 1
 anulowano.pl, 1
+anunciosbolivia.com, 1
 anunturitv.ro, 1
 anvartay.com, 0
 anvimpex.com, 1
@@ -11335,7 +10995,6 @@ apartment-market.ml, 1
 apartmentdecoratingblog.com, 1
 apartmentkroatien.at, 1
 apartmentregister.com.au, 1
-apasaja.tech, 1
 apbank.ch, 1
 apbforum.tk, 1
 apbox.de, 1
@@ -11379,10 +11038,12 @@ apiary.store, 1
 apiary.supplies, 1
 apiary.supply, 1
 apicruz.com, 1
+apiida.com, 1
 apila.care, 1
 apila.us, 1
 apiled.io, 1
 apimon.de, 1
+apimoveisorocaba.com.br, 1
 apination.com, 1
 apinsa.com, 1
 apio.systems, 1
@@ -11424,7 +11085,7 @@ apod.com.au, 1
 apod.ml, 1
 apogeephoto.com, 1
 apokalipsis.tk, 1
-apollo-auto.com, 1
+apollo-auto.com, 0
 apollonas.tk, 1
 apollonia.tk, 1
 apollyon.work, 1
@@ -11446,7 +11107,6 @@ apotheek-ict.nl, 1
 apotheke-ch.org, 1
 apotheke55.de, 1
 apothekeonline.tk, 1
-apothes.is, 1
 app, 1
 app-2132.com, 1
 app-2138.com, 1
@@ -11536,7 +11196,6 @@ apprenticeships.gov, 1
 approbo.com, 1
 approval-workflow.com, 1
 approvedtreecare.com, 1
-apps-cart.com, 1
 apps.co, 1
 apps.facebook.com, 0
 apps.fedoraproject.org, 1
@@ -11566,10 +11225,8 @@ aprendejainternet.tk, 1
 aprendiendoforexhoy.com, 1
 apretatuercas.es, 1
 aprikaner.de, 1
-aprogend.com.br, 1
 aproposcomputing.com, 1
 aprovpn.com, 1
-aprr.org, 1
 aprsdroid.org, 1
 aprz.de, 1
 apsa.paris, 1
@@ -11583,6 +11240,7 @@ aptnetwork.de, 1
 aptumseguros.mx, 1
 apu-board.de, 1
 apunkt.dk, 1
+apuraytravel.com, 1
 apustaja.org, 1
 apuyou.io, 1
 apv-ollon.ch, 1
@@ -11644,6 +11302,7 @@ arabicxz.com, 1
 arablovepet.com, 1
 arabska.tk, 1
 arabskills.tk, 1
+arabwomen.ml, 1
 arachina.com, 1
 arackiralama.name.tr, 1
 aracusbienestar.com, 1
@@ -11687,25 +11346,27 @@ arcadegames.com, 1
 arcadio.fr, 1
 arcaik.net, 1
 arcanetides.com, 1
-arcanist.games, 1
 arcbouncycastles.co.uk, 1
 arcenergy.co.uk, 1
 archaeoadventures.com, 1
+archaeology.lk, 1
 archambault.paris, 1
 archauthority.com, 1
 archbishop.ga, 1
 arche.es, 1
 archeologicatoscana.it, 1
+archeologiegorinchem.com, 1
 archeryaid.com, 1
+archerygearonline.com, 1
 archframe.net, 1
 archim.org.uk, 1
 archimedicx.com, 1
+archina.ir, 1
 archined.nl, 1
 archit.in, 1
 architectryan.com, 1
 architecture-colleges.com, 1
 architectureandgovernance.com, 1
-architecturequote.com, 1
 architectus.ga, 1
 architekten.tk, 1
 architekturwiki.tk, 1
@@ -11721,6 +11382,7 @@ archivosstl.com, 1
 archiweb.pl, 0
 archlinux.de, 1
 archlinux.org, 1
+archmacro.ga, 1
 archmediamarketing.com, 1
 archoit.org, 0
 archsec.info, 1
@@ -11738,7 +11400,6 @@ arcridge.ca, 1
 arctic.ca, 1
 arctic.gov, 1
 arctica.io, 1
-arcticbit.net, 1
 arcticwolf.com, 1
 arctus-security.com, 1
 arcueil-cachan.fr, 0
@@ -11785,6 +11446,7 @@ areqgaming.com, 1
 ares-trading.de, 1
 aresanel.com, 1
 arest.web.id, 1
+arethsu.se, 1
 arex-corp.com, 1
 arfad.ch, 0
 arforingenieria.com, 1
@@ -11809,6 +11471,7 @@ ariacreations.net, 1
 ariadermspa.com, 1
 ariag.tk, 1
 ariajourney.com, 1
+ariamovie.xyz, 1
 arian.io, 1
 ariana.wtf, 1
 arias.re, 1
@@ -11880,7 +11543,6 @@ arlenarmageddon.com, 1
 arletalibrary.com, 0
 arlingtonelectric.com, 1
 arlingtonwine.net, 1
-arm-host.com, 1
 arm.gov, 1
 armadale.wa.gov.au, 1
 armadaquadrat.com, 1
@@ -11893,7 +11555,6 @@ armanet-promotion.fr, 1
 armanozak.com, 1
 armansfinejewellery.com, 1
 armansfinejewellery.com.au, 1
-armarinhovirtual.com.br, 1
 armazemdaminiatura.com.br, 1
 armbrust.me, 1
 armcar.ga, 1
@@ -11920,6 +11581,7 @@ arnakdanielian.com, 1
 arnaqueoufiable.com, 1
 arnaudardans.com, 1
 arnaudb.net, 1
+arnaudfeld.de, 1
 arnaudlanna.com, 1
 arnaudminable.net, 1
 arnesegers.be, 1
@@ -11944,7 +11606,6 @@ arnoudvandalen.nl, 1
 arnove.fr, 1
 arnove.net, 1
 arnsmedia.nl, 0
-arocloud.de, 1
 arod.tk, 1
 arogov.com, 1
 arokha.com, 1
@@ -12033,13 +11694,10 @@ arteaga.me, 1
 arteaga.tech, 1
 arteaga.uk, 1
 arteaga.xyz, 1
-artebel.com.br, 1
 artecat.ch, 1
 artedellavetrina.it, 1
 artedona.com, 1
 artefakt.es, 1
-artefeita.com.br, 1
-artefeitaessencias.com.br, 1
 arteinstudio.it, 1
 artelt.com, 1
 artembusiness.tk, 1
@@ -12104,13 +11762,14 @@ artlabdentistry.com, 1
 artlantis.nl, 1
 artleading.ru, 1
 artlifeisgood.com, 1
+artlinestix.com.au, 1
 artlogo.biz, 1
 artlogo.cz, 1
 artlogo.sk, 1
 artmarketingnews.com, 1
 artmaxi.eu, 1
-artmoney.com, 1
 artmosfilms.co.za, 1
+artofclouds.ru, 1
 artofcode.co.uk, 1
 artofeyes.nl, 1
 artofhappyliving.com, 1
@@ -12207,8 +11866,10 @@ asciitable.tips, 1
 asciiwwdc.com, 1
 ascpaphilatelie.eu, 1
 asdchieti.tk, 1
+asdf.one, 1
 asdwfwqd.com, 1
 asdyx.de, 1
+asean-wen.org, 1
 asec01.net, 1
 asegem.es, 1
 aseith.com, 1
@@ -12222,6 +11883,7 @@ asexualitat.cat, 1
 asfaleianet.gr, 1
 asgapps.co.za, 1
 asgardiamc.fr, 1
+asgardsuper.com, 1
 asgrd.org, 1
 ashastalent.com, 1
 ashd1.goip.de, 1
@@ -12245,9 +11907,8 @@ ashtonc.ca, 1
 ashtonwealth.com, 1
 ashutoshmishra.org, 1
 asia-gazette.com, 1
-asia-global-risk.com, 0
+asia-global-risk.com, 1
 asia.dating, 1
-asiabike.ir, 1
 asiaflash.com, 1
 asiaheavens.com, 1
 asialeonding.at, 1
@@ -12280,7 +11941,7 @@ askcascade.com, 1
 asker-massasje.no, 1
 askerweb.cf, 1
 askeustache.com, 1
-askexpert.in, 1
+askexpert.in, 0
 askizzy.org.au, 1
 askkaren.gov, 1
 askmagicconch.com, 0
@@ -12299,7 +11960,6 @@ asmdz.com, 1
 asmeets.nl, 1
 asml.com, 1
 asmood.net, 1
-asmrbuluo.com, 1
 asngear.biz, 1
 asnhgh.biz, 1
 asoagroca.com, 1
@@ -12435,12 +12095,13 @@ astrosoc.ml, 1
 astroteam.tk, 1
 astrovandalistas.cc, 1
 astsummer.tk, 1
+asttuchaud.com, 1
 astucewebmaster.com, 1
 astural.org, 0
 astutikhonda.com, 1
 astutr.co, 1
+astyork.com, 1
 asua.ca, 1
-asuclassfinder.com, 1
 asucrews.com, 1
 asukalangley.tk, 1
 asun.co, 1
@@ -12457,6 +12118,7 @@ asylumguild.tk, 1
 asynchrono.cf, 1
 asystent-dzierzawy.pl, 1
 aszurkolassport.com, 1
+at-machining.com, 1
 at.md, 1
 at.search.yahoo.com, 0
 at.vg, 1
@@ -12464,9 +12126,6 @@ at5.nl, 1
 at7s.me, 1
 atab.se, 1
 ataber.pw, 1
-atacadocervejeiro.com.br, 1
-atacadodesandalias.com.br, 1
-atacarejovirtual.com.br, 1
 atafu-village.tk, 1
 atahualpa.com, 1
 atallo.com, 1
@@ -12494,7 +12153,6 @@ atelier-des-apprentissages.com, 1
 atelier-naruby.cz, 1
 atelier-tecna.cz, 1
 atelier-viennois-cannes.fr, 1
-atelieracbaby.com.br, 1
 atelieraphelion.com, 1
 atelierbw.com, 1
 ateliercoquelicot.fr, 1
@@ -12559,7 +12217,6 @@ atlantacompa-international.co.uk, 1
 atlantacustomfab.com, 0
 atlantahealthcare.tk, 1
 atlantareroof.com, 1
-atlantaspringroll.com, 1
 atlanticdatastream.ca, 1
 atlantichomes.com.au, 1
 atlanticmarina.com, 1
@@ -12569,7 +12226,6 @@ atlanticpediatricortho.com, 1
 atlanticyellowpages.com, 1
 atlantik.tk, 1
 atlantikwall.ga, 1
-atlantis-kh.noip.me, 1
 atlantischild.hu, 1
 atlantiswaterproofing.com, 1
 atlas-5.site, 1
@@ -12609,7 +12265,7 @@ atomism.com, 1
 atomiumvn.com, 1
 atomnetworks.ca, 1
 aton-ensemble.tk, 1
-atorcidabrasileira.com.br, 1
+atpeacerealty.com, 1
 atplonline.co, 1
 atpnutrition.com, 1
 atracaosexshop.com.br, 1
@@ -12635,7 +12291,7 @@ attimec.com, 1
 attinderdhillon.com, 1
 attiremr.tk, 1
 attitudes-bureaux.fr, 1
-attogtech.com, 1
+attoch.org, 1
 attosoft.tk, 1
 attractant.com, 1
 attractieparken.tk, 1
@@ -12660,7 +12316,7 @@ atypicom.pt, 1
 atzenchefin.de, 1
 atzzz.com, 1
 au-be.net, 1
-au.ci, 0
+au.ci, 1
 au2pb.net, 1
 au2pb.org, 1
 aubergegilly.ch, 0
@@ -12668,7 +12324,6 @@ aubg.org, 0
 aubio.org, 1
 aubonheurdeshuiles.fr, 1
 aubonmanger.fr, 0
-aubreysnider.com, 1
 auburn-housekeeper.com, 1
 auburnmedicalservices.com, 1
 auburnperio.com, 1
@@ -12698,6 +12353,7 @@ audiomaze.com, 1
 audiomind.tk, 1
 audion.cc, 1
 audionames.com, 1
+audionpack.de, 1
 audioonly.stream, 1
 audiophile.ch, 0
 audiophiledebutant.fr, 1
@@ -12746,6 +12402,7 @@ aukaraoke.su, 1
 aukcioon-domenov.ml, 1
 auksnest.ca, 1
 aulaschrank.gq, 1
+aulasprofdanilo.com.br, 1
 aulasvirtualesperu.com, 1
 aulaweb.co, 1
 aulica-conseil.com, 1
@@ -12778,6 +12435,7 @@ auspicacious.org, 1
 ausschreibungen-suedtirol.it, 1
 aussiefunadvisor.com, 1
 aussiemilfs.com, 1
+aussieparrotlets.com.au, 1
 aussieseoadelaide.com.au, 1
 aussieseobrisbane.com.au, 1
 aussieservicedown.com, 1
@@ -12786,6 +12444,7 @@ aussiestories.dk, 1
 austenplumbing.com, 1
 austin-pearce.com, 1
 austin-security-cameras.com, 1
+austinbestdjs.com, 1
 austincardiac.com, 1
 austinchase.com, 1
 austinheap.com, 0
@@ -12814,7 +12473,6 @@ austromorph.space, 1
 auszeit-lanzarote.com, 1
 auszeit-walsrode.de, 1
 auszeit.bio, 1
-autenticoperfumes.com.br, 1
 auth.adult, 1
 auth.mail.ru, 1
 authanet.ga, 1
@@ -12867,15 +12525,14 @@ autocrypt.org, 1
 autodalmacija.com, 1
 autodemolizioni.roma.it, 1
 autodidactic.ai, 1
-autodidacticstudios.com, 1
-autodidacticstudios.net, 1
+autodidacticstudios.com, 0
+autodidacticstudios.net, 0
 autodidacticstudios.org, 1
 autodius.com, 1
 autoecoledumontblanc.com, 1
 autoelettricaperbambini.com, 1
 autoentrepreneurinfo.com, 1
 autoepc.ro, 1
-autoeshop.eu, 1
 autofficina.roma.it, 1
 autofinancing.ga, 1
 autoglass.com.my, 1
@@ -12904,6 +12561,7 @@ automekano.com, 0
 automentesszolnok.hu, 1
 automotivegroup-usedcars.be, 0
 automotivemechanic.org, 1
+automotiveunlimited.net, 1
 automoto-tom.net, 1
 automuovifix.fi, 1
 automy.de, 1
@@ -12921,6 +12579,7 @@ autopeople.ru, 1
 autoplus.com.co, 1
 autoportal.tk, 1
 autopower.gr, 1
+autoprice.info, 0
 autoprogconsortium.ga, 1
 autoproshouston.com, 1
 autorai.nl, 1
@@ -12990,6 +12649,7 @@ auxbrinstresses.fr, 1
 auxiliame.com, 1
 auxille.com, 1
 auxquatrevents.ch, 0
+av-th.net, 1
 av-yummy.com, 1
 av01.tv, 1
 av0ndale.de, 1
@@ -13025,7 +12685,7 @@ avarty.com, 1
 avatardiffusion.com, 1
 avcd.cz, 1
 avdagic.net, 1
-avdh.top, 1
+avdh.top, 0
 ave.zone, 1
 aveapps.com, 0
 aveclunettesoleil.fr, 1
@@ -13040,6 +12700,7 @@ avepol.eu, 1
 averageinspired.com, 1
 averen.co.uk, 1
 avernis.de, 1
+averste.com, 1
 avestawebbtjanst.se, 0
 avexon.com, 1
 avg.club, 1
@@ -13078,6 +12739,7 @@ avionschool.com, 1
 avisofi-credit-immobilier.fr, 1
 aviteng.cloud, 1
 aviteng.com, 1
+avitus.hu, 1
 avivaplasticsurgery.com, 1
 avlhostel.com, 1
 avm-multimedia.com, 1
@@ -13087,7 +12749,6 @@ avmoo.com, 1
 avmrc.nl, 1
 avmup.com, 1
 avn-buses.tk, 1
-avnet.ws, 1
 avocad.studio, 1
 avocadooo.stream, 1
 avocode.com, 1
@@ -13096,6 +12757,7 @@ avogel.ca, 1
 avogel.co.uk, 1
 avogel.nl, 1
 avoids-troops.gq, 1
+avoinna24.fi, 1
 avonlearningcampus.com, 1
 avonture.be, 1
 avonvets.co.uk, 1
@@ -13143,6 +12805,7 @@ aw.net, 1
 await.one, 1
 awakengr.com, 1
 awakenwow.ga, 1
+awalong.work, 1
 awan.tech, 1
 awangardaszkola.pl, 1
 awanteverde.tk, 1
@@ -13170,7 +12833,7 @@ awic.ca, 1
 awinninghabit.com, 1
 awk.tw, 1
 awksolutions.com, 1
-awlgolf.com, 1
+awlgolf.com, 0
 awningcanopyus.com, 1
 awningsaboveus.com, 1
 awningsatlantaga.com, 1
@@ -13195,7 +12858,6 @@ axel-fischer.net, 1
 axel-fischer.science, 1
 axel-voss.eu, 0
 axelname.ru, 1
-axelr.me, 1
 axelteichmann.net, 1
 axelvoss.eu, 0
 axiatancell.com, 1
@@ -13216,6 +12878,7 @@ axone-computers.fr, 0
 axonholdingse.eu, 1
 axre.de, 1
 axrec.de, 1
+axtudo.com, 1
 axtux.tk, 1
 axxial.tk, 1
 axxis.co.jp, 1
@@ -13338,13 +13001,6 @@ b-tree.be, 1
 b0000.co, 1
 b00228.com, 1
 b00de.ga, 1
-b0305.com, 1
-b0306.com, 1
-b0307.com, 1
-b0309.com, 1
-b03aa.com, 1
-b03bb.com, 1
-b03cc.com, 1
 b0607.com, 1
 b0618.com, 1
 b0618.net, 1
@@ -13409,15 +13065,10 @@ b5197.co, 1
 b5289.com, 1
 b538.com, 1
 b5706.com, 0
-b5707.com, 0
 b5708.com, 0
 b5709.com, 0
 b57bb.com, 0
 b57cc.com, 0
-b58365.com, 1
-b58app.com, 1
-b58appb58app.com, 1
-b58appb58appb58app.com, 1
 b5901.com, 1
 b5902.com, 1
 b5903.com, 1
@@ -13433,7 +13084,6 @@ b5dev.com, 1
 b61688.com, 1
 b62102.com, 1
 b62103.com, 1
-b62104.com, 1
 b62105.com, 1
 b62a.com, 1
 b62aa.com, 1
@@ -13452,7 +13102,6 @@ b64.club, 1
 b6530.com, 1
 b6531.com, 1
 b6701.com, 1
-b6702.com, 1
 b6703.com, 1
 b6704.com, 1
 b6705.com, 1
@@ -13605,7 +13254,6 @@ b9488.net, 1
 b9498.net, 1
 b9518.com, 1
 b9518.info, 1
-b9518.net, 1
 b9518.org, 1
 b9528.com, 1
 b9538.com, 1
@@ -13616,7 +13264,6 @@ b9588.net, 1
 b95888.net, 1
 b9589.net, 1
 b9598.net, 1
-b960.com, 1
 b9618.com, 1
 b9658.net, 1
 b96899.com, 1
@@ -13777,11 +13424,7 @@ bachweid-baar.ch, 1
 baciu.ch, 0
 back-streets.tk, 1
 backeby.eu, 1
-background-checks-systems.com, 1
-background-checks.asia, 1
-background-checks.biz, 1
-background-checks.mobi, 1
-backgroundchecks.online, 1
+backflow.pl, 1
 backgroundscreenersofamerica.com, 1
 backgroundz.net, 1
 backjump.tk, 1
@@ -13810,7 +13453,7 @@ backtheeffup.com, 1
 backup-kurumsal.com, 1
 backupassist.de, 1
 backupcloud.ru, 1
-baconismagic.ca, 1
+baconismagic.ca, 0
 bacontreeconsulting.com, 1
 bacoux.com, 1
 bacsmegye.hu, 1
@@ -13825,6 +13468,7 @@ bacula.jp, 1
 bad-wurzach.de, 1
 bad.horse, 1
 bad.pet, 1
+badaa.info, 1
 badam.co, 1
 badanka.com, 1
 badanteinfamiglia.it, 1
@@ -13874,6 +13518,7 @@ bagelsbakery.com, 0
 bageluncle.com, 1
 baggy.me.uk, 1
 bagheera.me.uk, 1
+baghtelecom.net, 1
 bagiobella.com, 1
 bagira.guru, 1
 baglu.com, 0
@@ -13950,7 +13595,6 @@ baladecommune.ch, 0
 balafon.cloud, 1
 balaganlimited.cf, 1
 balakovo-news.tk, 1
-balancascia.com.br, 1
 balance7.jp, 1
 balanceado.com, 1
 balancedbrawl.net, 1
@@ -13982,7 +13626,6 @@ balkanpharmstore.com, 1
 balkenbushmechanical.com, 1
 balkonien.org, 1
 ball-bizarr.de, 1
-ball3d.es, 1
 ballarin.cc, 1
 ballast.tk, 1
 ballbusting-cbt.com, 1
@@ -14008,7 +13651,6 @@ balsamaiso.es, 1
 balslev.io, 1
 balter.com, 1
 balthazarlondon.com, 1
-balticer.de, 1
 balticmed.pl, 1
 balticnetworks.com, 1
 baltimorecashflow.com, 1
@@ -14046,7 +13688,6 @@ bandagastrica.es, 1
 bandally.net, 1
 bandamirandadeebro.tk, 1
 bandarifamily.com, 1
-bandeira1.com.br, 1
 bandeiraimoveisitu.com.br, 1
 bandeirasnacionais.com, 1
 banderas-mundo.es, 1
@@ -14132,6 +13773,7 @@ banzay.ml, 1
 bao-in.com, 1
 bao-in.net, 1
 baobaojihua.com, 1
+baobaoquming.net, 1
 baobeiglass.com, 1
 baodan666.com, 1
 baofengtech.com, 1
@@ -14153,7 +13795,6 @@ baptiste-peugnez.fr, 1
 baptisteplanckaert.tk, 1
 bar-harcourt.com, 1
 barabrume.fr, 1
-barakayu.com, 1
 barandazstorm.com, 1
 barandazstorm.net, 1
 barandazstorm.org, 1
@@ -14206,7 +13847,6 @@ barkassen15.se, 1
 barkerjr.xyz, 1
 barkingaboutbusiness.com, 1
 barkstop.net, 1
-barlamane.com, 1
 barlex.pl, 1
 barlotta.net, 1
 barnabycolby.io, 1
@@ -14236,7 +13876,6 @@ barrioitalia.com, 1
 barrydenicola.com, 1
 barrymarkus.tk, 1
 bars.kh.ua, 1
-barsashop.com.br, 1
 barsgroup.com, 1
 barslecht.com, 1
 barss.io, 1
@@ -14260,8 +13899,10 @@ bartvandamme.tk, 1
 bartzutow.xyz, 1
 baruch.me, 1
 barwave.com, 1
+barzallof.com, 1
 bas.co.jp, 1
 basamadco.ir, 1
+basanakia.eu, 1
 basauristudios.com, 1
 basculasconfiables.com, 1
 base-autonome-durable.com, 0
@@ -14277,7 +13918,6 @@ basel-gynaecology.com, 1
 basel-gynaekologie.ch, 1
 baselang.com, 1
 basement961.co.nz, 1
-basementdoctor.com, 0
 basementdoctornorthwest.com, 1
 basementdoctorwestvirginia.com, 1
 basementdoctorwv.com, 1
@@ -14310,6 +13950,7 @@ basisbedarf.de, 1
 basketball-brannenburg.de, 1
 basketballnewz.tk, 1
 basketforex.com, 1
+basllp.co.uk, 1
 basnoslovno.ru, 1
 basonlinemarketing.nl, 1
 basradio.tk, 1
@@ -14352,7 +13993,6 @@ bati-alu.fr, 1
 batiburrillo.net, 1
 batipresta.ch, 0
 batiskaf.ua, 1
-batistareisfloresonline.com.br, 1
 batitrakya.org, 1
 batmanvsupermanfullmovie.ga, 1
 batoit.gq, 1
@@ -14398,7 +14038,8 @@ bauunternehmen-herr.de, 1
 bavaroparadise.com, 1
 bavarovillage.com, 1
 bavartec.de, 1
-bawbby.com, 1
+bawbby.com, 0
+bayanbennett.com, 1
 bayareaenergyevents.com, 1
 bayden.com, 1
 bayer-stefan.com, 1
@@ -14463,6 +14104,7 @@ bbc67.fr, 1
 bbcastles.com, 1
 bbclyra.tk, 1
 bbcomcdn.com, 1
+bbcustomremodeling.com, 1
 bbforums.com, 1
 bbgeschenke.ch, 0
 bbimarketing.com, 1
@@ -14478,12 +14120,12 @@ bblove.me, 1
 bblsa.ch, 0
 bbmagnagrecia.it, 1
 bbnx.net, 1
-bbs8080.net, 1
 bbschat.tk, 1
 bbsec.xyz, 1
 bbsgood.com, 1
 bbswin9.cc, 1
 bbuio.com, 0
+bbunits.de, 1
 bbw-wrestling.com, 1
 bbw.dating, 1
 bbwcs.co.uk, 1
@@ -14497,6 +14139,7 @@ bc-bd.org, 0
 bc-diffusion.com, 1
 bcansw.com.au, 1
 bcbulle.ch, 0
+bccog7.org, 1
 bcdiesel.ca, 1
 bcdonadio.com, 1
 bcdonadio.com.br, 1
@@ -14514,7 +14157,6 @@ bcmainland.ca, 1
 bcmguide.com, 1
 bcmhire.co.uk, 1
 bcmlu.org, 1
-bcnation.com, 1
 bcnet.com.hk, 1
 bcoffices.com.mx, 1
 bcpc-ccgpfcheminots.com, 1
@@ -14526,6 +14168,7 @@ bcsytv.com, 0
 bcubic.net, 1
 bcvps.com, 1
 bcyw56.live, 0
+bcyw56.top, 1
 bd-media.tk, 1
 bd.foundation, 1
 bd2positivo.com, 1
@@ -14549,6 +14192,7 @@ be-real.life, 0
 be-up-developpement.com, 1
 be-webdesign.com, 1
 be.ax, 1
+be.gy, 1
 be.search.yahoo.com, 0
 be2cloud.de, 1
 be9418.com, 1
@@ -14588,8 +14232,8 @@ beanilla.com, 1
 beanjuice.me, 1
 beans-one.com, 0
 beansgalore.com.au, 1
+beaquarium.com, 1
 bearcms.com, 1
-bearcosports.com.br, 1
 bearcreekcubschildcare.com, 1
 bearded.sexy, 1
 bearden.io, 1
@@ -14640,7 +14284,6 @@ beautycom.club, 1
 beautycon.ir, 1
 beautyevent.fr, 1
 beautyeyewear.ga, 1
-beautyinweb.net, 1
 beautyseasons.ru, 1
 beautyspot.tk, 1
 beaver-creek.ga, 1
@@ -14651,7 +14294,6 @@ bebe2luxe.fr, 1
 bebeautiful.business, 1
 bebecar.com, 1
 bebef.de, 1
-bebefofuxo.com.br, 1
 bebemamae.com, 1
 bebes.uno, 1
 bebest.gov, 1
@@ -14700,7 +14342,6 @@ bee.clothing, 1
 bee.supply, 1
 bee.tools, 1
 beecare.ch, 0
-beechwoodmetalworks.com, 1
 beedsolyjas.tk, 1
 beehive.govt.nz, 1
 beehive42.com, 1
@@ -14725,7 +14366,6 @@ beer9.com, 1
 beercandle.com, 1
 beercast.co.uk, 1
 beeremovalspretoria.co.za, 1
-beergazetteer.com, 1
 beerglasses.tk, 1
 beerians.com, 1
 beerians.info, 1
@@ -14773,7 +14413,6 @@ behaviorchangeimpact.org, 1
 behead.de, 1
 beherit.pl, 1
 behindertenagentur.de, 1
-behna24hodin.cz, 1
 behoerden-online-dienste.de, 1
 behold.gq, 1
 behoreal.cz, 1
@@ -14817,8 +14456,6 @@ beleadsteam.com, 1
 belebey.city, 1
 beleggingspanden-financiering.nl, 1
 belegit.org, 1
-belevida.com.br, 1
-belezashopping.com.br, 1
 belf.ml, 1
 belfastbounce.co.uk, 1
 belfastlocks.com, 1
@@ -14877,7 +14514,6 @@ belly-button-piercings.com, 1
 bellyandbrain.amsterdam, 1
 belmontgoessolar.org, 1
 beloevino.ml, 1
-belonggsumc.com, 1
 belos.at, 1
 belouga.org, 1
 belpbleibtbelp.ch, 1
@@ -14927,7 +14563,6 @@ benefits.gov, 1
 benefitsbookcase.com, 1
 benefitshub.io, 1
 benefitshub.xyz, 1
-benepiscinas.com.br, 1
 benetcasablancas.tk, 1
 benevisim.com, 1
 benevita.bio, 1
@@ -14972,6 +14607,7 @@ benni1.eu, 1
 bennierobinson.com, 1
 bennink.me, 1
 benno.frl, 1
+benny003.de, 1
 bennygommers.nl, 1
 bennythink.com, 1
 benobi.one, 1
@@ -15016,6 +14652,7 @@ beraten-entwickeln-steuern.de, 1
 beratung.com.au, 1
 beratungswelt.dvag, 1
 berbervandenberg.tk, 1
+berchtesgaden-hilft.de, 1
 berdaguermontes.eu, 1
 berdu.id, 1
 bereaplumber.co.za, 1
@@ -15033,7 +14670,6 @@ bergman-gmbh.de, 1
 bergmanbeachproperties.com, 1
 bergsjomannen.tk, 1
 bergstoneware.com, 1
-bergunabanget.com, 1
 berichtsheft-vorlage.de, 1
 berikod.ru, 1
 beris.us, 1
@@ -15089,7 +14725,6 @@ berriescomunicacion.com, 1
 berruezoabogados.com, 1
 berrus.com, 1
 berry.cat, 1
-berrypay.com, 1
 berserk.tk, 1
 bersierservices.ch, 0
 bersotavocats.fr, 0
@@ -15163,6 +14798,7 @@ best-wedding-quotes.com, 1
 best10websitebuilders.com, 1
 best2pay.net, 1
 best66.me, 1
+bestappliancedoctor.com, 1
 bestattungen-kammerer.de, 1
 bestattungshaus-kammerer.de, 0
 bestautoinsurance.com, 1
@@ -15179,7 +14815,7 @@ bestcellular.com, 0
 bestcivilattorneys.com, 1
 bestcms.tk, 1
 bestcouponvouchercodes.com, 1
-bestcrossbowguide.com, 1
+bestcrossbowguide.com, 0
 bestdownloadscenter.com, 1
 bestechgadgets.tk, 1
 bestedeal.nl, 1
@@ -15233,6 +14869,7 @@ bestpractice.domains, 1
 bestprint.vn, 1
 bestproductsaudit.com, 1
 bestremote.io, 1
+bestreviewcenter.com, 1
 bestrevs.com, 1
 bestsatoshifaucet.ga, 1
 bestschools.io, 1
@@ -15254,15 +14891,12 @@ bestzoo.tk, 1
 bet-99.cc, 1
 bet-99.com, 1
 bet-99.net, 1
-bet.eu, 0
 bet01vip.com, 1
 bet02vip.com, 1
 bet03vip.com, 1
 bet04vip.com, 1
 bet05vip.com, 1
-bet064.com, 1
 bet06vip.com, 1
-bet074.com, 1
 bet08vip.com, 1
 bet09vip.com, 1
 bet10vip.com, 1
@@ -15295,7 +14929,6 @@ bet333123.com, 1
 bet333222.com, 1
 bet333321.com, 1
 bet333345.com, 1
-bet333432.com, 1
 bet333444.com, 1
 bet333456.com, 1
 bet333555.com, 1
@@ -15303,8 +14936,6 @@ bet333567.com, 1
 bet333666.com, 1
 bet333678.com, 1
 bet333789.com, 1
-bet333876.com, 1
-bet333987.com, 1
 bet333999.com, 1
 bet333h.com, 1
 bet333i.com, 1
@@ -15328,9 +14959,7 @@ bet333z.com, 1
 bet33app.com, 1
 bet3602.com, 0
 bet3607.com, 0
-bet3639.com, 1
 bet365bc.net, 1
-bet365bet2020.com, 1
 bet365cn-casino.com, 1
 bet365cn-game.com, 1
 bet365cn-keno.com, 1
@@ -15359,10 +14988,8 @@ bet365q6.com, 1
 bet365q8.com, 1
 bet365q9.com, 1
 bet365r8.com, 1
-bet365u.com, 1
 bet365vip1.com, 1
 bet365vip2.com, 1
-bet365vip2020.com, 1
 bet365vip7.com, 1
 bet365x0.com, 1
 bet365x1.com, 1
@@ -15371,9 +14998,6 @@ bet365x3.com, 1
 bet365x6.com, 1
 bet365x8.com, 1
 bet365x9.com, 1
-bet391.com, 1
-bet392.com, 1
-bet397.com, 1
 bet3app.com, 1
 bet3xx.com, 1
 bet3zz.com, 1
@@ -15475,6 +15099,7 @@ betaclouds.net, 1
 betacommand.tk, 1
 betaoptimize.com, 1
 betaprofiles.com, 1
+betassl.com, 1
 betaworx.de, 1
 betaworx.eu, 1
 betb33.com, 1
@@ -15566,7 +15191,7 @@ bevallarta.com, 1
 bevedo.cz, 1
 bevedo.sk, 1
 beveiligingscamerawestland.nl, 1
-beveiligingsupdate.nl, 1
+beveiligingsupdate.nl, 0
 bevelbeer.com, 1
 bevelpix.com, 1
 beverhof.nl, 1
@@ -15591,7 +15216,6 @@ bewerbungsfibel.de, 1
 bewerbungsfoto-deinfoto.ch, 1
 bewertet.de, 1
 bewildered.gq, 1
-bewonderen.com, 1
 bexit-hosting.nl, 1
 bexit-security.eu, 1
 bexit-security.nl, 1
@@ -15765,6 +15389,7 @@ bienoubien.org, 1
 biensenvue.com, 1
 bienstar.tv, 1
 bienvenidoamerica.com, 1
+biergaizi.info, 1
 bierochs.org, 1
 bierwebshop.be, 1
 bieser.ch, 1
@@ -15808,7 +15433,6 @@ bighome.ml, 1
 bighouse-events.co.uk, 1
 bight.ca, 0
 bigideasnetwork.com, 1
-bigio.com.br, 1
 biglagoonrentals.com, 1
 bigmoney.nu, 1
 bigorbitgallery.org, 1
@@ -15824,6 +15448,8 @@ bigsister.tk, 1
 bigsisterchannel.com, 1
 bigskylifestylerealestate.com, 1
 bigskymontanalandforsale.com, 1
+bigskywaterheaters.com, 1
+bigtexasbeerfest.com, 1
 bigthunder.ca, 1
 bigtimeiq.com, 1
 bigtrucker.co.uk, 1
@@ -15848,6 +15474,7 @@ bikehistory.org, 1
 biker.dating, 1
 bikersclub.tk, 1
 bikeshopitalia.com, 1
+bikesquadron.com, 0
 bikestream.tk, 1
 bikhof.com, 1
 bikiniseli.com, 1
@@ -15894,7 +15521,6 @@ billingsmtpublicworks.gov, 1
 billionaire.ml, 1
 billionaire365.com, 1
 billionairemailinglist.com, 1
-billionbooksbaby.org, 1
 billionkiaparts.com, 1
 billkochman.com, 1
 billogr.am, 1
@@ -15936,7 +15562,7 @@ bim0s.com, 1
 bimacitizen.com, 1
 bimbo.com.ar, 0
 bimbobakeriesusa.com, 0
-bimbole.it, 1
+bimechanics.com, 1
 bimibroccoli.co.uk, 1
 bimibroccoli.com, 1
 bimibroccoli.dk, 1
@@ -16012,7 +15638,6 @@ bioamtw.com, 1
 bioastin.de, 1
 bioatelier.it, 1
 bioblog.tk, 1
-biobone.net, 1
 biobuttons.ch, 1
 biocal.eu, 1
 biocal.nl, 1
@@ -16097,7 +15722,6 @@ biotechware.com, 1
 biotecommunity.com, 1
 bioteebook.com, 1
 biotin.ch, 1
-biovalue.eu, 1
 biowtage.gq, 1
 bip.gov.sa, 0
 bipyo.com, 1
@@ -16125,6 +15749,7 @@ birosuli.hu, 1
 birsinghdhami.com.np, 1
 birtamode.tk, 1
 birthday-to-you.com, 1
+birthdaycakekuching.my, 1
 birthdaytip.com, 1
 birthright.host, 1
 birthright.website, 1
@@ -16187,6 +15812,7 @@ bitcoin-fauset.cf, 1
 bitcoin-india.net, 1
 bitcoin-india.org, 1
 bitcoin-wizards.com, 1
+bitcoin-youtube.net, 1
 bitcoin.asia, 1
 bitcoin.ch, 1
 bitcoin.co.nz, 1
@@ -16216,7 +15842,6 @@ bitcointhefts.com, 1
 bitcoinwalletscript.tk, 1
 bitcoinx.ro, 1
 bitcork.io, 1
-bitcorner.de, 1
 bitcqr.io, 1
 bitcrazy.org, 1
 bitech-ec.com, 1
@@ -16373,6 +15998,7 @@ bk725.com, 1
 bkentertainments.co.uk, 1
 bkhayes.com, 1
 bkhpilates.co.uk, 1
+bkkf.at, 1
 bkkposn.com, 1
 bklaindia.com, 1
 bkositspartytime.co.uk, 1
@@ -16427,6 +16053,7 @@ blackarch.sk, 1
 blackarts.co.za, 1
 blackbag.nl, 1
 blackbam.at, 1
+blackbbwvideos.com, 1
 blackberrycentral.com, 1
 blackberryforums.be, 1
 blackbird-whitebird.com, 1
@@ -16548,11 +16175,11 @@ blbcleaningservices.com.au, 1
 blbet365.com, 1
 blblblblbl.fr, 1
 bleaching-tipps.de, 1
+bleatingsheep.org, 0
 blechbuexn.de, 1
 bleche-onlineshop.at, 1
 bleche-onlineshop.de, 1
 blechinger.io, 1
-blechschmidt.saarland, 1
 bleep.zone, 1
 blenderinsider.com, 1
 blenderman.org, 1
@@ -16637,6 +16264,7 @@ blockchaindaigakko.jp, 1
 blockchainmagazine.net, 1
 blockcheck.network, 1
 blockclique.io, 1
+blocked.icu, 1
 blockedyourcar.com, 1
 blockedyourcar.net, 1
 blockedyourcar.org, 1
@@ -16704,8 +16332,8 @@ blogthetindung.com, 1
 blogtroterzy.pl, 1
 bloguser.ru, 1
 blogvadim.ga, 1
-blok56.nl, 1
 blomberg.name, 1
+bloobet.com, 0
 blood4pets.tk, 1
 bloodhunt.eu, 1
 bloodhunt.pl, 1
@@ -16737,11 +16365,14 @@ blue-leaf81.net, 1
 blue42.net, 1
 blueangel.org.tw, 1
 bluebahari.gq, 1
+blueberrywinery.com.au, 1
 bluebie.com, 1
+bluebikesvalencia.com, 1
 bluebirdservice.us, 1
 blueblou.com, 1
 bluebnc.com, 1
 bluecanvas.io, 1
+bluecon.eu, 1
 bluecon.ninja, 1
 bluecrazii.nl, 1
 blued.moe, 1
@@ -16802,6 +16433,7 @@ bluex.net, 1
 bluex.org, 1
 blueyonder.com, 1
 bluffplumber.co.za, 1
+bluheron.ca, 1
 blui.cf, 1
 blui.xyz, 1
 bluiandaj.ml, 1
@@ -16893,7 +16525,6 @@ bobep.ru, 1
 bobfilm.ml, 1
 bobigames.com, 1
 bobiji.com, 0
-bobisec.cz, 0
 bobkidbob.com, 1
 bobkoetsier.nl, 1
 bobnbounce.ie, 1
@@ -16904,7 +16535,6 @@ bobstronomie.fr, 1
 bocaaboca.ml, 1
 bocada.com, 1
 bocamo.it, 1
-bocawa.es, 1
 boccabell.com, 1
 bochantinobgyn.com, 1
 bochs.info, 1
@@ -16935,7 +16565,6 @@ bodypainter.pl, 1
 bodypainting.waw.pl, 1
 bodyshaping.ml, 1
 bodyshopnews.net, 1
-bodyweb.com.br, 1
 bodyworksautorebuild.com, 1
 boeddhashop.nl, 1
 boegli.tk, 1
@@ -17076,6 +16705,7 @@ bonus.net.nz, 1
 bonus.pl, 1
 bonusov.tk, 1
 bonusup.tk, 1
+bonux.co, 1
 boodmo.com, 1
 boof.com, 0
 book-in-hotel.com, 1
@@ -17106,7 +16736,6 @@ bookslibrarybooks.gq, 1
 booksmp3.com, 1
 bookstores.gq, 1
 bookstrap.ga, 1
-booktoan.com, 1
 booktracker-org.appspot.com, 1
 bookwave.art, 1
 bookwormex.com, 1
@@ -17182,6 +16811,7 @@ borriquillacuenca.tk, 1
 borysek.net, 1
 borysenko.se, 1
 borza.ro, 1
+borza.us, 1
 borzaresearch.com, 1
 borzov.tk, 1
 bosabosa.org, 1
@@ -17194,6 +16824,7 @@ boschveldtuin.nl, 1
 boscoyacht.ch, 0
 boscq.fr, 1
 bosekarmelitky.cz, 1
+bosiquanao.vn, 1
 boskeopolis-stories.com, 1
 bosnia-online.tk, 1
 bospor.tk, 1
@@ -17204,6 +16835,7 @@ bostonadvisors.com, 1
 bostonaoii.com, 1
 bostonews.tk, 1
 bostonivy.co, 1
+bostonprocleaning.com, 1
 bosufitness.cz, 1
 bosun.io, 1
 bot-manager.pl, 1
@@ -17215,6 +16847,8 @@ botelegram.tk, 1
 botezdepoveste.ro, 1
 botguard.net, 1
 bothellwaygarage.net, 1
+boticadiservicio.com, 1
+botikadiservisio.com, 1
 botipedia.tk, 1
 botlab.ch, 1
 botmanager.pl, 1
@@ -17231,6 +16865,7 @@ bottinquebec.com, 1
 bottke.berlin, 1
 bottle.li, 1
 bottledstories.de, 1
+bottom9clothing.com, 1
 bottomfeedings.tk, 1
 bou.ke, 1
 bouah.net, 1
@@ -17240,6 +16875,7 @@ bouchonville-knifemaker.com, 1
 bouckaert-usedcars.be, 0
 boudah.pl, 1
 bougeret.fr, 1
+bougerpourmasante.com, 1
 boughariosbros.com, 1
 boukoubengo.com, 1
 bouldercolorado.gov, 1
@@ -17348,6 +16984,7 @@ bound2bounce.co.uk, 1
 boundarybrighton.com, 1
 boundaryford.com, 1
 boundaryvets.co.uk, 1
+boundless-designs.com, 1
 bounouh.tk, 1
 bountiful.gov, 1
 bounty.fund, 1
@@ -17362,7 +16999,7 @@ bourse-aux-vetements.org, 0
 bourse-puericulture.org, 0
 bourseauxservices.com, 1
 boutique-giovanni.fr, 1
-boutiquedecanetas.com.br, 1
+boutiquedelhogar.cl, 1
 boutiqueguenaelleverdin.com, 1
 boutoncoupdepoing.fr, 1
 bouw.live, 1
@@ -17376,6 +17013,7 @@ bowedwallcrackrepair.com, 1
 boweryandvine.com, 1
 bowlcake.fr, 1
 bowling.com, 1
+bowmanwilliams.com, 1
 bowntycdn.net, 1
 bowtie.com.hk, 1
 boxcritters.wiki, 1
@@ -17412,7 +17050,6 @@ bphostels.com, 1
 bpisites.eu, 1
 bpo.ovh, 1
 bpol-forum.de, 1
-bpreguica.com.br, 1
 bpsis.fr, 1
 bpvboekje.nl, 1
 bpvr.ddns.net, 1
@@ -17453,6 +17090,7 @@ brahmins.com, 1
 braiampeguero.xyz, 1
 brailsford.xyz, 1
 brain-club.info, 1
+brain-dev.com, 1
 brain-e.co, 1
 brain-force.ch, 1
 brainball.fr, 0
@@ -17472,11 +17110,13 @@ brainstobrand.com, 1
 brainstormproductions.tk, 1
 braintensive.com, 1
 braintonus.tk, 1
+brainvation.de, 1
 brainvoyagermusic.com, 1
 brainwav.es, 1
 brainwork.space, 1
 brainyapp.net, 1
 braithwaites.ltd, 1
+brajenovic.com, 1
 brakemanpro.com, 1
 brakpanplumber24-7.co.za, 1
 bralnik.com, 1
@@ -17489,6 +17129,7 @@ bramsikkens.be, 1
 bramstaps.nl, 1
 bramvanaken.be, 1
 bramygrozy.pl, 1
+bran.cool, 1
 bran.land, 1
 bran.soy, 1
 branch-bookkeeper.com, 1
@@ -17573,11 +17214,12 @@ bravewiki.tk, 1
 bravica.tk, 1
 bravobet.et, 1
 brawny.com, 1
+braxtonehle.com, 1
 brazenfol.io, 1
+brazilhealth.com.br, 1
 brazilian.dating, 1
 brazilianbikinishop.com, 1
 braziliex.com, 1
-brazillens.com, 1
 brazoriabar.org, 1
 brb.city, 1
 brck.nl, 1
@@ -17610,7 +17252,6 @@ brecknell.info, 1
 brecknell.name, 1
 brecknell.net, 1
 brecknell.org, 1
-breda.computer, 1
 breechdepot.com, 1
 breest.net, 1
 breeyn.com, 1
@@ -17642,6 +17283,7 @@ brestradio.tk, 1
 brestshop.tk, 1
 bretcarmichael.com, 1
 bretech.net, 1
+breteuilcommerceartisanat.com, 1
 brettabel.com, 1
 brettcornwall.com, 1
 bretti.net, 1
@@ -17655,6 +17297,7 @@ brewsouth.com, 1
 brewspark.co, 1
 brewvo.com, 1
 brexit.tk, 1
+brexitmart.com, 1
 breyerslakeshoreresort.com, 1
 breyerslakesideresort.com, 1
 breyersresort.com, 1
@@ -17667,7 +17310,6 @@ brianalaway.com, 1
 brianalawayconsulting.com, 1
 briandorey.com, 0
 briandwells.com, 1
-brianfanzo.com, 1
 brianfoshee.com, 1
 briangarcia.ga, 1
 briangosnell.com, 1
@@ -17705,6 +17347,7 @@ bridalfabrics.ru, 1
 bridalshoes.com, 1
 bridalweddingshow.ga, 1
 bride-forever.com, 1
+bride.vn, 1
 bridesbouquet.ml, 1
 bridgedigest.tk, 1
 bridgedirectoutreach.com, 1
@@ -17757,8 +17400,6 @@ brillio.com, 1
 brimspark.com, 1
 brimspark.systems, 1
 brindesgrafica.com.br, 1
-brindespegassus.com.br, 1
-brindice.com.br, 1
 bring-heaven.com, 1
 bringingbackthesweatervest.com, 1
 brinkbem.com, 1
@@ -17833,7 +17474,6 @@ brolic.com, 0
 brols.eu, 1
 bromo.cf, 1
 brompton-cocktail.com, 1
-bronetb2b.com.br, 1
 bronevichok.ru, 1
 bronn.ee, 1
 bronwynlewis.com, 1
@@ -17845,6 +17485,7 @@ brooklynboyblues.cf, 1
 brooklyncosmetics.net, 1
 brooklynentdoc.com, 1
 brooklynrealestateblog.com, 1
+brooklynreclaimed.com, 1
 brooklyntheborough.com, 1
 brookscountyga.gov, 1
 brookworth.com, 0
@@ -17902,6 +17543,7 @@ brunick.de, 0
 brunnenhof-welze.de, 1
 brunner.ninja, 1
 brunoamaral.eu, 1
+brunoarruda.com.br, 1
 brunodomingos.com, 1
 brunohenc.from.hr, 1
 brunolt.nl, 1
@@ -18019,7 +17661,6 @@ bthub.xyz, 1
 btine.tk, 1
 btio.pw, 0
 btku.org, 1
-btmstore.com.br, 1
 btnissanparts.com, 1
 btopc.jp, 1
 btorrent.xyz, 1
@@ -18275,6 +17916,7 @@ buitenposter.nl, 1
 buka.jp, 1
 bukalapak.com, 1
 buketnevesti.cf, 1
+buketon.uz, 1
 bukinist.tk, 1
 bukiskola.hu, 1
 bukivallalkozasok.hu, 1
@@ -18311,7 +17953,6 @@ bullterrierspain.tk, 1
 bullyprotection.ml, 1
 bulmanat.tk, 1
 bulmastife.com.br, 1
-bulutkey.com, 1
 bulvar.tk, 1
 bulwarkcrypto.com, 1
 bulwarkhost.com, 1
@@ -18385,7 +18026,6 @@ burnhamonseabouncycastles.co.uk, 1
 burningbird.net, 1
 burningflame.tk, 1
 burningflipside.com, 0
-burningmarket.de, 1
 burntfish.com, 1
 burnworks.com, 1
 buronwater.com, 1
@@ -18438,6 +18078,7 @@ businessetmarketing.com, 1
 businessfactors.de, 1
 businessfurs.info, 1
 businessgram.eu, 1
+businessguide.co.ke, 1
 businesshub.cz, 0
 businessimmigration-eu.com, 1
 businessimmigration-eu.ru, 1
@@ -18466,17 +18107,16 @@ busyon.cloud, 1
 butarque.es, 1
 butikvip.ru, 1
 butlercountyhistory.org, 1
+butlerdisposal.com, 1
 butlerfm.dk, 1
 butlist.com, 1
 butowka.tk, 1
 butserdocumentary.tk, 1
 butt.repair, 1
-butter.horse, 1
 butteramotors.com, 1
 butterhost.ga, 1
 buttermilk.cf, 1
 buttgun-tattoo.de, 1
-buttoned.io, 1
 buttonizer.pro, 1
 buttonline.ch, 1
 butts-are.cool, 1
@@ -18579,7 +18219,6 @@ buyprozac.cf, 1
 buyretinamicro.cf, 1
 buyrimonabant.cf, 1
 buyrogaine.ga, 1
-buyseo.store, 1
 buyshoe.org, 1
 buysildenafil.ml, 1
 buysoft.co.uk, 1
@@ -18606,10 +18245,9 @@ buzz.tools, 1
 buzzconf.io, 1
 buzzcontent.com, 1
 buzzhub.tk, 1
-buzzpop.tv, 1
+buzzpop.tv, 0
 buzzprint.it, 1
 bva.dyndns.info, 1
-bvb.moe, 1
 bvbmedia.nl, 1
 bvexplained.co.uk, 1
 bvgt.org, 1
@@ -18649,6 +18287,7 @@ bxdj3.com, 1
 bxdj4.com, 1
 bxdj5.com, 1
 bxdj6.com, 1
+bxdj66.com, 1
 bxdj666.com, 1
 bxdj7.com, 1
 bxdj8.com, 1
@@ -18741,7 +18380,7 @@ bytesoftech.ml, 1
 bytesund.biz, 1
 byteswave.cl, 1
 bytesystems.com, 1
-byteterrace.com, 1
+bytetime.net, 1
 bytheglass.gr, 1
 bythen.cn, 0
 bytheswordinc.com, 1
@@ -18763,12 +18402,14 @@ c-3.moe, 1
 c-aeroconsult.com, 1
 c-c-europeen.org, 1
 c-ma-copro.com, 1
+c-netsys.fr, 1
 c-rtx.com, 1
 c-shock.org, 1
 c-webdesign.net, 1
 c-world.co.uk, 1
 c.cc, 1
 c00ke.com, 1
+c057cl7.com, 1
 c0rn3j.com, 1
 c0rporation.com, 1
 c16t.uk, 1
@@ -18798,6 +18439,7 @@ c4539.com, 1
 c4dstudio.com, 1
 c4k3.net, 1
 c5197.co, 1
+c5h8no4na.net, 1
 c6729.co, 1
 c6729.com, 1
 c678.top, 1
@@ -18849,7 +18491,6 @@ cabuna.hr, 1
 cacao-chocolate.com, 1
 cacao.supply, 1
 cacaolalina.com, 1
-cacaumidade.com.br, 1
 caceis.bank, 1
 cachacacha.com, 1
 cachedview.nl, 1
@@ -18866,7 +18507,7 @@ cad-noerdlingen.de, 1
 cadafamilia.de, 1
 cadams.io, 1
 cadastroloteamento.com.br, 1
-cadcc.cl, 1
+cadcc.cl, 0
 caddyfashionshop.com, 1
 cadenceconstruction.com, 1
 cadep2019.com, 1
@@ -19091,12 +18732,10 @@ cameo-membership.uk, 1
 cameo.ee, 1
 cameramark.nl, 1
 cameraslyphotography.tk, 1
-cameraviva.com.br, 1
 cameronstar.tk, 1
 cameroonlounge.com, 1
 camerweb.es, 1
 camilaporto.tk, 1
-camilastore.com.br, 1
 camileonline.tk, 1
 camilomodzz.net, 1
 caminreal.tk, 1
@@ -19138,6 +18777,7 @@ campona.hu, 1
 campsoulfestival.com, 1
 camptuk.org, 1
 campula.cz, 1
+campus-competences.fr, 1
 campus-discounts.com, 1
 campus-finance.com, 1
 campusdrugprevention.gov, 1
@@ -19148,9 +18788,11 @@ camrecord.ml, 1
 camrojud.com, 1
 camshowdir.com, 1
 camshowdir.to, 1
+camshowhive.com, 1
 camshowhive.to, 1
 camshowhub.com, 1
 camshowhub.to, 1
+camshowplace.com, 1
 camshowplace.to, 1
 camshowstorage.com, 1
 camshowstorage.to, 1
@@ -19192,6 +18834,7 @@ cancan.ml, 1
 cancer-rose.fr, 1
 cancerdata.nhs.uk, 1
 candaceplayforth.com, 1
+candalgic.com.tr, 1
 candelaguatemala.tk, 1
 candelec.com, 0
 candeo-books.nl, 1
@@ -19216,6 +18859,7 @@ canhas.report, 1
 canhazip.com, 1
 canhq.tk, 1
 cani-compostelle.fr, 1
+canibeoutside.com, 1
 canihavesome.coffee, 1
 canine-mobility.com, 1
 caniuse.email, 1
@@ -19238,6 +18882,7 @@ cannon.org.cn, 1
 cannyfoxx.me, 1
 canobag.es, 1
 canoonic.se, 1
+canopy.garden, 1
 canopy.ninja, 1
 canopycleaningmelbourne.com.au, 1
 canopytax.com, 1
@@ -19256,7 +18901,6 @@ canttboardpachmarhi.org, 1
 canva-dev.com, 1
 canva.cn, 1
 canva.com, 1
-canvas-gift.com, 1
 canx.org, 1
 canyons.media, 0
 canyonshoa.com, 1
@@ -19324,6 +18968,7 @@ captainark.net, 1
 captainclaw.tk, 1
 captainfit.in, 1
 captainjanks.tk, 1
+captainkids.vn, 1
 captainsfarm.in, 1
 captalize.com, 1
 captivationscience.com, 1
@@ -19378,7 +19023,6 @@ carck.co.uk, 1
 carck.uk, 1
 carcloud.ch, 1
 carcountking.com, 1
-card-cashing.com, 1
 cardano.eco, 1
 cardanoinvestment.com, 1
 cardboard.cx, 1
@@ -19401,6 +19045,7 @@ cardjit.su, 1
 cardloan-center.jp, 1
 cardloan-manual.net, 1
 cardmart.tk, 1
+cardoneshop.it, 1
 cardoni.net, 1
 cardozovargas.com, 1
 cardranking.jp, 1
@@ -19424,9 +19069,11 @@ career.support, 1
 careercapital.co.za, 1
 careeroptionscoach.com, 1
 careerpower.co.in, 1
+careersngr.com, 1
 careertransformed.com, 1
 carefulcolor.com, 1
 caregiverva.org, 1
+careify.org, 1
 caremad.io, 1
 carepan.ga, 1
 carepassport.com, 1
@@ -19489,7 +19136,6 @@ carlitoxxpro.com, 1
 carlmjohnson.net, 0
 carlobiagi.de, 1
 carlocksmith--dallas.com, 1
-carlocksmithbaltimore.com, 1
 carlocksmithcarrollton.com, 1
 carlocksmithellicottcity.com, 1
 carlocksmithfallbrook.com, 1
@@ -19532,8 +19178,6 @@ caroes.be, 1
 caroffer.ch, 1
 carol-lambert.com, 1
 carolcappelletti.com, 1
-carolcestas.com, 1
-caroletolila.com, 1
 caroli.biz, 1
 caroli.com, 1
 caroli.info, 1
@@ -19587,7 +19231,6 @@ carspneu.cz, 1
 cartale.ru, 1
 cartaodigi.com, 1
 cartegrise.xyz, 1
-carteirasedistintivos.com.br, 1
 cartelloni.roma.it, 1
 carterdan.net, 1
 carterorland.com, 1
@@ -19622,13 +19265,10 @@ casa-mea-inteligenta.ro, 1
 casaamor.ph, 1
 casaasia.cat, 1
 casabella.com.tw, 1
-casabouquet.com, 1
 casacazoleiro.com, 1
 casacochecurro.com, 1
 casadasportasejanelas.com, 1
-casadoarbitro.com.br, 1
 casadopulpo.com, 1
-casadowifi.com.br, 1
 casaessencias.com.br, 1
 casalborgo.it, 1
 casalindamex.com, 1
@@ -19636,11 +19276,9 @@ casalinghedisperate.ga, 1
 casalribeiro.com, 1
 casalunchbreak.de, 1
 casamariposaspi.com, 1
-casamarrom.com.br, 1
 casamentos.com.br, 1
 casamiento.com.uy, 1
 casamientos.com.ar, 1
-casapalla.com.br, 1
 casasparaperross.com, 1
 casasuara.com, 1
 casasuleletrodomesticos.com.br, 1
@@ -19725,6 +19363,7 @@ casko-insurance.tk, 1
 casperfirm.com, 1
 casperpanel.com, 1
 caspicards.com, 1
+cass.cz, 1
 cassimo.com, 0
 castaneda.tk, 1
 castbulletassoc.org, 0
@@ -19760,6 +19399,7 @@ castroverde.tk, 1
 casualclubdating.ml, 1
 casualgaming.no, 1
 casusgrillcaribbean.com, 1
+casvpn.com, 1
 cat-encyclopedia.ml, 1
 cat-problems.ml, 1
 cat.ax, 1
@@ -19790,6 +19430,7 @@ caterbing.com, 1
 catering-xanadu.cz, 1
 cateringgoes.nl, 1
 cateringvanhetland.nl, 1
+cateromarket.pl, 1
 catfood.ga, 1
 catgarden.tk, 1
 catgirl.pics, 1
@@ -19834,6 +19475,7 @@ catnmeow.com, 1
 catprincess.com.tw, 1
 catram.org, 1
 catriel25noticias.com, 1
+catsgalore.org, 1
 catsmagic.pp.ua, 1
 catsnow.com, 1
 catsoft.me, 1
@@ -19866,6 +19508,7 @@ caxalt.com, 1
 caycehouse.com, 1
 caylee.de, 1
 caylercapital.com, 1
+cazadordebuenaonda.com, 1
 cazaviajes.es, 1
 cazes.info, 1
 cb-crochet.com, 1
@@ -19878,6 +19521,7 @@ cbcf.info, 0
 cbd-oil.shop, 1
 cbd.casa, 1
 cbd.supply, 1
+cbdbflo.com, 1
 cbdcontact.eu, 1
 cbdcontact.pl, 1
 cbdev.de, 1
@@ -19982,6 +19626,7 @@ cdnsys.net, 1
 cdnya.com, 1
 cdocs.ml, 1
 cdom.de, 1
+cdrjapan.co.jp, 1
 cds-infra.de, 1
 cdshining.com, 1
 cdsportal.uk, 1
@@ -20030,6 +19675,7 @@ celcomhomefibre.com.my, 1
 cele.bi, 1
 celebdaily.ga, 1
 celebmasta.com, 1
+celebphotos.blog, 1
 celebrasianconference.com, 1
 celebraze.tk, 1
 celebrex.ga, 1
@@ -20039,6 +19685,7 @@ celebritydailynews.ml, 1
 celebrityhealthcritic.com, 1
 celebrityphotos.blog, 1
 celebritypics.club, 1
+celebritypics.co, 1
 celebrityscope.net, 1
 celebritysrit.tk, 1
 celebritytopnews.tk, 1
@@ -20103,7 +19750,7 @@ centos.tips, 1
 central-apartman.tk, 1
 central4.me, 1
 centralconvergence.com, 1
-centraldoencanador.com.br, 1
+centraldelbebe.com, 1
 centrale-vapeur.pro, 1
 centralebigmat.eu, 1
 centralegedimat.eu, 1
@@ -20125,6 +19772,7 @@ centreagree.com, 1
 centredaccueil.fr, 0
 centrederessourcement.com, 1
 centreoeil.ch, 0
+centreparkhistoricdistrict.org, 1
 centrepointorguk-dev.azurewebsites.net, 1
 centretownshipin.gov, 1
 centricagency.co.uk, 1
@@ -20157,6 +19805,7 @@ centurialeonina.com, 1
 centurion-consulting-cie.eu, 1
 centurion-consulting.net, 1
 centurion-consulting.tech, 1
+centurion-meet.site, 1
 centurioninfosec.com, 1
 centurioninfosec.com.sg, 1
 centurioninfosec.hk, 1
@@ -20217,9 +19866,9 @@ certnazionale.it, 1
 certspotter.com, 1
 certspotter.org, 1
 cervejista.com, 1
-cervera.com.br, 1
 ces-ltd.co.uk, 1
 cesar-hector.tk, 1
+cesarloaiciga.com, 1
 cesarparedespacora.com, 1
 cesboard.com, 1
 cescfortuny.tk, 1
@@ -20230,9 +19879,7 @@ ceska-polygraficka.cz, 1
 ceskaexpedice.org, 1
 ceskepivnesety.sk, 1
 ceskepivnisety.cz, 1
-ceso-saco.com, 1
 cesobaly.cz, 1
-cestasedelicias.com.br, 1
 cestunmetier.ch, 1
 cetamol.com, 1
 ceu.edu, 0
@@ -20275,9 +19922,10 @@ cgbassurances.ch, 0
 cgbproduction.tk, 1
 cgcookiemarkets.com, 1
 cgelves.com, 1
+cges.xyz, 1
 cgf-charcuterie.com, 1
 cgionline.tk, 1
-cgknieuwpoort.nl, 1
+cgl.li, 1
 cglib.xyz, 1
 cgminc.net, 1
 cgnparts.com, 1
@@ -20349,7 +19997,6 @@ championweb.nz, 0
 championweb.sg, 0
 champonthis.de, 1
 chamsochoa.com, 1
-chanakyanewz.com, 1
 chancekorte.com, 1
 chancekorte.net, 1
 chancekorte.org, 1
@@ -20387,7 +20034,6 @@ chaosfield.at, 1
 chaosorchestra.com, 1
 chaospott.de, 1
 chaoswars.ddns.net, 1
-chaoswebs.net, 1
 chaotichive.com, 1
 chaoticonline.tk, 1
 chaouby.com, 0
@@ -20407,7 +20053,6 @@ charbonnel.eu, 1
 charcoal-se.org, 1
 charcoalvenice.com, 1
 charge.co, 0
-chargejuice.com, 1
 chargify.com, 1
 charisma.ai, 1
 charitylog.co.uk, 1
@@ -20416,6 +20061,7 @@ charleliphile.tk, 1
 charlenevondell.com, 1
 charlenew.xyz, 1
 charles-darwin.com, 1
+charlesbordet.com, 1
 charlesbwise.com, 1
 charlesdickens.tk, 1
 charlespitonltd.com, 1
@@ -20440,6 +20086,7 @@ charmanterelefant.at, 1
 charmcitytech.com, 1
 charmingsaul.com, 1
 charmyadesara.com, 1
+charolopezatelier.com, 1
 charon.tk, 1
 charonsecurity.com, 1
 charr.xyz, 1
@@ -20451,6 +20098,7 @@ chartkick.com, 1
 chartpen.com, 1
 chartsheets.com, 1
 chartsy.de, 1
+charuni.ru, 1
 charuru.moe, 0
 chasafilli.ch, 1
 chascrazycreations.com, 1
@@ -20465,6 +20113,7 @@ chat2.cf, 1
 chat36.ga, 1
 chat4me.tk, 1
 chataberan.cz, 1
+chataumateje.eu, 1
 chatbelgie.eu, 1
 chatbot.one, 1
 chatbotclic.com, 1
@@ -20490,6 +20139,7 @@ chatroomfans.tk, 1
 chatswoodprestige.com.au, 1
 chatsworthelectrical.com, 1
 chattanoogaface.com, 1
+chatterbox-aws.com, 1
 chattergalerie.eu, 1
 chattergallery.com, 1
 chattersworld.nl, 1
@@ -20630,6 +20280,7 @@ chemistry-schools.com, 1
 chemolak.pl, 1
 chenapartment.com, 1
 cheneypartners.com, 1
+cheng.pet, 0
 chengarda.com, 1
 chengfayun.com, 1
 chenghao360.top, 1
@@ -20696,11 +20347,12 @@ chianti2002.jp, 1
 chiaraiuola.com, 0
 chiaramail.com, 1
 chiaseeds24.com, 1
+chiasepremium.com, 1
 chiaseweb.net, 1
 chiavistello.it, 1
+chibiotaku.com, 1
 chiboard.co, 1
 chiboost.net, 1
-chibr.eu, 1
 chic-leather.com, 1
 chicagoagent.com, 1
 chicagobreastaugdrs.com, 1
@@ -20731,6 +20383,7 @@ chiki.tk, 1
 chikory.com, 1
 chilbert.co, 1
 childcare.gov, 1
+childcaresolutionscny.org, 1
 childcounseling.org, 1
 childcustodylegalaid.org, 1
 childhr.org.au, 1
@@ -20738,7 +20391,6 @@ childno.de, 1
 children-toys.tk, 1
 childrenandmedia.org.au, 1
 childrenfirstalways.org, 1
-childreninadversity.gov, 1
 childrens-room.com, 1
 childrenschoicepearland.com, 1
 childrensentertainmentleicester.co.uk, 1
@@ -20771,8 +20423,9 @@ chimpmatic.com, 1
 china-line.org, 1
 china-online-news.tk, 1
 chinacdn.org, 1
+chinafree.online, 1
+chinafree.site, 1
 chinahighlights.ru, 1
-chinaicpower.org, 1
 chinasa.net, 1
 chinaspaceflight.com, 1
 chinastory.tk, 1
@@ -20842,7 +20495,6 @@ chnlib.com, 1
 choc-o-lush.co.uk, 1
 chocgu.com, 1
 chocoband.cf, 1
-chocodecor.com.br, 1
 chocolah.com.au, 0
 chocolat-suisse.ch, 0
 chocolat.work, 1
@@ -20962,6 +20614,7 @@ christianrasch.de, 1
 christians.dating, 1
 christiansayswords.com, 1
 christiansrit.tk, 1
+christianvanos.com, 1
 christianwitts.tech, 1
 christiehawkes.com, 1
 christiesantiques.com, 1
@@ -20972,6 +20625,7 @@ christineprayon.de, 1
 christmascard.be, 1
 christmaspages.tk, 1
 christmaspartyhire.co.uk, 1
+christo.ga, 1
 christoph-conrads.name, 1
 christoph-gadow.de, 1
 christoph.media, 1
@@ -20979,7 +20633,6 @@ christophbartschat.com, 1
 christophebarbezat.ch, 1
 christopher-simon.de, 1
 christopher.sh, 0
-christopherandcharlotte.uk, 1
 christopherburg.com, 1
 christopherd.me, 1
 christopherkennelly.com, 1
@@ -21087,6 +20740,7 @@ ciat.no, 0
 cibdol.com, 1
 cibdol.nl, 1
 cibercactus.com, 1
+cibleclick.com, 1
 cica.es, 1
 cichlid-world.com, 1
 cichol.com, 1
@@ -21120,7 +20774,7 @@ cikeblog.com, 1
 cilacapnews.ml, 1
 cilloc.be, 1
 cima-idf.fr, 1
-cimaflash.co, 1
+cimaflash.co, 0
 cimbalino.org, 1
 cimballa.com, 1
 cimen.cc, 1
@@ -21156,6 +20810,7 @@ cinq-elements.com, 0
 cinq-elements.fr, 1
 cinq-elements.net, 1
 cinsects.de, 1
+cint.com, 1
 cintactimber.com, 1
 cinteo.com, 1
 cio-ciso-interchange.org, 1
@@ -21191,7 +20846,6 @@ circlepluscircle.me, 1
 circu.ml, 1
 circuitcityelectricaladelaide.com.au, 1
 circulatedigital.com, 1
-circule.cc, 1
 circulosocial77.com, 1
 circumstances.ir, 1
 circus-maximus.de, 1
@@ -21199,10 +20853,6 @@ cirfi.com, 1
 cirruslab.ch, 1
 cirugiasplasticas.com.mx, 1
 cirujanooral.com, 1
-cirurgicaexpress.com.br, 1
-cirurgicagervasio.com.br, 1
-cirurgicalucena.com.br, 1
-cirurgicavirtual.com.br, 1
 cirvapp.com, 1
 cisa.gov, 1
 ciscodude.net, 0
@@ -21247,7 +20897,6 @@ citos.ga, 1
 citrusui.me, 1
 citsc.de, 1
 cittadesign.com, 0
-citton.com.br, 1
 city-adm.lviv.ua, 1
 city-forums.ml, 1
 city-home.tk, 1
@@ -21291,6 +20940,7 @@ civicforum.pl, 1
 civics.us, 1
 civicunicorn.com, 1
 civicunicorn.us, 1
+civil-works-sri.com, 1
 civilbikes.com, 1
 civilg20.org, 1
 civillines.nl, 1
@@ -21338,6 +20988,7 @@ ckp.io, 1
 ckrubble.co.za, 1
 cktennis.com, 1
 ckventura.sk, 1
+cl-brands.com, 1
 cl-cloud.spdns.org, 1
 cl-wiki.spdns.org, 1
 cl.search.yahoo.com, 0
@@ -21385,6 +21036,7 @@ claretandbluearmy.tk, 1
 claretvillans.com, 1
 clarinet.ga, 1
 clarinexonline.gq, 1
+clariti-health.com, 1
 claritin.gq, 1
 claritin.ml, 1
 clarkelectricalservices.com.au, 1
@@ -21415,7 +21067,6 @@ classificadostodaoferta.tk, 1
 classpoint.cz, 1
 classroom.google.com, 1
 classroomconductor.com, 1
-classroomcountdown.co.nz, 1
 claster.it, 1
 claude.me, 1
 claude.photo, 1
@@ -21456,15 +21107,14 @@ cleandogsnederland.nl, 1
 cleanfiles.us, 1
 cleango.pl, 1
 cleangroup.in.ua, 1
-cleanhouse2000.us, 1
 cleaningservicejulai.com, 1
 cleaningsquad.ca, 0
 cleankey.jp, 1
 cleanplanet.co.jp, 1
 cleansewellness.com, 1
+cleanvision.space, 1
 cleanway.dk, 1
 clearance365.co.uk, 1
-clearblueday.co.uk, 1
 clearbooks.co.uk, 1
 clearbookscdn.uk, 1
 clearbreezesecuritydoors.com.au, 1
@@ -21503,6 +21153,8 @@ cleververmarkten.com, 1
 cleververmarkten.de, 1
 clevisto.com, 1
 clevvi.com.au, 1
+clevyrcares.com, 1
+clevyrlabs.com, 1
 cleysense.com, 1
 clic-et-site.com, 1
 clic-music.com, 1
@@ -21511,6 +21163,7 @@ clicandfioul.com, 1
 clicheshishalounge.co.uk, 1
 click-licht.de, 1
 click2order.co.uk, 1
+click4click.ga, 1
 clickalphaville.com.br, 1
 clickbasin.co.uk, 1
 clickclock.cc, 1
@@ -21560,6 +21213,7 @@ clinicalstats.ga, 1
 clinicaltrialpodcast.com, 1
 clinicaltrials.gov, 1
 clinicamiracueto.com, 1
+clinicasesteticas.com.br, 1
 clinicasmedicas.com.br, 1
 clinicminds.com, 1
 clinicos.cl, 1
@@ -21652,6 +21306,7 @@ cloudfiles.at, 1
 cloudflare-dns.com, 1
 cloudflare.com, 1
 cloudflareonazure.com, 1
+cloudfree.top, 1
 cloudhoreca.com, 1
 cloudia.org, 1
 cloudily.com, 1
@@ -21665,6 +21320,9 @@ cloudlessdreams.com, 0
 cloudlight.biz, 0
 cloudmigrator365.com, 1
 cloudmoney.tk, 1
+cloudmyhome.net, 1
+cloudmyhome.top, 1
+cloudmyhome.xyz, 1
 cloudninelandscapedesign.com, 1
 cloudnote.cc, 1
 cloudns.net, 1
@@ -21836,9 +21494,11 @@ cncrans.ch, 0
 cncs.gov.pt, 1
 cnet-hosting.com, 1
 cnetw.xyz, 1
+cnfree.xyz, 1
 cni-certing.it, 1
 cnitdog.com, 1
 cnlic.com, 1
+cnnc.jp, 1
 cnnet.in, 1
 cnre.eu, 1
 cnss.io, 1
@@ -21854,7 +21514,6 @@ coach-immobilier-neuf.fr, 1
 coachapp-ipass.herokuapp.com, 1
 coachbakery.com, 1
 coachezmoi.ch, 0
-coachfederation.ro, 1
 coaching-harmonique.fr, 1
 coaching-impulse.ch, 0
 coaching-park.fr, 1
@@ -21887,7 +21546,6 @@ cobraprotectionfl.com, 1
 coc.de, 0
 cocaine-import.agency, 1
 cocaine.ninja, 1
-cocalc.com, 1
 cocareonline.com, 1
 cocbaoan.com, 1
 coccinellaskitchen.com, 1
@@ -22004,6 +21662,7 @@ codestep.io, 1
 codestudies.net, 1
 codetheworld.com, 1
 codetipi.com, 1
+codetrack.se, 1
 codetripping.net, 1
 codeux.com, 1
 codeux.info, 1
@@ -22040,10 +21699,8 @@ coens.me.uk, 1
 coentropic.com, 1
 coeus.cloud, 1
 cofbev.com, 1
-coffee-machine.reviews, 1
 coffee-mamenoki.jp, 1
 coffee-up.it, 1
-coffeeandteabrothers.com, 1
 coffeebean.cf, 1
 coffeebeanstudios.tk, 1
 coffeeshopsandman.nl, 1
@@ -22095,6 +21752,7 @@ coins2001.ru, 1
 coinsmat.com, 1
 coinsuggest.com, 1
 cointosh.jp, 1
+coinvex.org, 1
 coinx.pro, 1
 coisasdemulher.org, 1
 cojam.ru, 1
@@ -22113,6 +21771,7 @@ colah.com.au, 1
 colapsys.net, 0
 colarelli.ch, 1
 colbert.ml, 1
+colbird.com, 1
 colchonesmoon.com, 1
 colchonminicuna.com, 0
 colcomm.com, 1
@@ -22127,13 +21786,13 @@ coldren.org, 1
 coldspegll.gq, 1
 coldstreamcreekfarm.com, 1
 coldtomato.ga, 1
-colectivointerconductual.com, 1
 coleg.gov, 1
 colegiosantaursula.com.br, 1
 colegiotalenti.com, 1
 colegiovallejo.edu.pe, 1
 colemak.com, 1
 colengo.com, 1
+coletrain.com, 1
 colf.online, 1
 colibris.xyz, 1
 colinchartier.com, 1
@@ -22199,6 +21858,7 @@ cololi.moe, 1
 colombiaemprendedora.org, 1
 colombian.dating, 1
 colombianas.webcam, 1
+colombiawebs.com, 1
 colonialfurniturestripping.com, 1
 colonize.africa, 1
 coloppe.com, 1
@@ -22207,6 +21867,7 @@ coloradobluebook.gov, 1
 coloradolottery.com, 1
 coloradoroofingservice.com, 1
 coloraid.net, 1
+colorbitor.com, 1
 colorblindfilms.com, 1
 colorblindprogramming.com, 1
 colorbrush.ru, 1
@@ -22258,6 +21919,7 @@ comdurav.com, 1
 come.ga, 1
 come2cook.com, 1
 comeals.com, 1
+comedicgrouperu.com, 1
 comedimagrire.it, 1
 comedyhuis.nl, 1
 comefollowme2016.com, 0
@@ -22268,7 +21930,6 @@ comercialcolombia.tk, 1
 comercialroxana.com, 1
 comercialtpv.com, 1
 comercialtrading.eu, 1
-comerciositio.com, 1
 comerford.net, 1
 comestoarra.com, 1
 cometbot.cf, 1
@@ -22280,7 +21941,6 @@ comevius.xyz, 1
 comeyegroup.com, 1
 comff.net, 1
 comfintouch.com, 1
-comflores.com.br, 1
 comfortablelife.tk, 1
 comfortmastersinsulation.com, 1
 comfortsolutionsair.com, 1
@@ -22303,6 +21963,7 @@ comiteexpertes.gc.ca, 1
 comlipa.gq, 1
 comm.cx, 1
 commania.co.kr, 1
+commaschool.com, 1
 commco.nl, 1
 commechezvous.ch, 0
 commercesend.com, 1
@@ -22315,7 +21976,7 @@ commeunamour.com, 1
 commissaris-vraagbaak.nl, 1
 commissionagenda.com, 1
 commitsandrebases.com, 1
-commlabindia.com, 1
+commlabindia.com, 0
 common.io, 1
 commoncode.com.au, 1
 commoncode.io, 0
@@ -22330,6 +21991,7 @@ communiquons.org, 1
 communist-party.tk, 1
 community-pro.de, 1
 community-pro.net, 1
+community-services.cz, 1
 communityaligned.com, 1
 communitychurchafrica.co.za, 1
 communitycodeofconduct.com, 1
@@ -22343,7 +22005,6 @@ comoculosdesol.pt, 1
 comocurarlagastritis24.online, 1
 comocurarlagastritistratamientonatural.com, 1
 comodo.nl, 1
-comodormirmasrapido.com, 1
 comodosslstore.com, 1
 comogene.com, 1
 comohacerblog.net, 1
@@ -22353,7 +22014,6 @@ comomoraremportugal.ga, 1
 comoperdonar.tk, 1
 comoquitarlacaspa24.com, 1
 comorecuperaratumujerpdf.com, 1
-comosecarabarriga.net, 1
 comoseduzir.net, 1
 comosefazisto.com.br, 1
 comoviajarcontumascota.com, 1
@@ -22368,7 +22028,6 @@ compagniemartin.com, 0
 compalliance.com, 1
 companion-web.net, 1
 comparatif-moto.fr, 1
-compareinsurance.com.au, 1
 comparelegalforms.com, 1
 comparemymobile.com, 1
 comparesoft.com, 1
@@ -22392,7 +22051,6 @@ compeuphoria.com, 1
 comphare.nl, 1
 compibus.fr, 1
 compilenix.org, 1
-compitak.com, 1
 complaint.tk, 1
 completesecurityessex.co.uk, 1
 completesecurityessex.com, 1
@@ -22428,10 +22086,10 @@ comprarparaguas.online, 1
 comprasegura.ml, 1
 comprauncelular.com, 1
 compreair.com, 1
-compreautomacao.com.br, 1
 compree.com, 1
 comprefitasadere.com.br, 1
 comprehensiveihc.com, 1
+comprocellularishop.it, 1
 compservice.in.ua, 1
 comptrollerofthecurrency.gov, 1
 comptu.com, 1
@@ -22456,15 +22114,16 @@ computerhilfe-feucht.de, 1
 computerinfobits.com, 1
 computernetwerkwestland.nl, 1
 computernetwork.be, 1
+computersforlearning.gov, 1
 computersoftware.tk, 1
 computersystems.guru, 0
 computingsociety.co.uk, 1
 computop.com, 1
 computron.ga, 1
-comschool.com.br, 1
 comtily.com, 1
 comumlab.org, 1
 comunal.co, 1
+comunate.com, 1
 comunic.io, 1
 comunicat.global, 1
 comuniclick.com.br, 1
@@ -22504,7 +22163,6 @@ concursopublico.com.br, 1
 concursos.com.br, 1
 concursosabertos.com.br, 1
 concursuri.biz, 1
-condecom.com.br, 1
 condepenalba.com, 0
 condesaelectronics.com, 1
 condit.ml, 1
@@ -22526,19 +22184,20 @@ conexiontransporte.com, 1
 conf.tn, 1
 conference-expert.eu, 1
 conference.dnsfor.me, 1
+confetayrona.org, 1
 confiancefoundation.org, 1
 confidential.network, 1
 confidentliving.gq, 1
 confidentliving.tk, 1
 config.schokokeks.org, 0
 confirmit.com.au, 1
+confirmit.de, 1
 confiscate.ga, 1
 confiwall.de, 1
 conflicting.tk, 1
 conforama.es, 1
 conforama.pt, 1
 conformal.com, 0
-conformax.com.br, 1
 conformist.jp, 1
 confrerie-rp.fr, 1
 conftree.com, 1
@@ -22550,7 +22209,6 @@ congenio.com, 1
 congenio.de, 1
 congineer.com, 1
 congobunkering.com, 0
-conhecendocosmeticos.com.br, 1
 conju.cat, 1
 conjugacao.com.br, 1
 conkret.ch, 1
@@ -22565,6 +22223,7 @@ connect.dating, 1
 connect.facebook.net, 1
 connecta.store, 1
 connectavid.com, 1
+connectedbynexus.com, 1
 connectedcare.md, 1
 connectfss.com, 1
 connectingrentals.com, 1
@@ -22589,6 +22248,7 @@ connext.de, 1
 connictro.de, 1
 conniesacademy.com, 1
 connorcordell.co.uk, 1
+connorfindlay.com, 1
 connorhatch.com, 1
 conntrack.com, 1
 connyduck.at, 1
@@ -22635,6 +22295,7 @@ consonare.de, 1
 conspiracionweb.tk, 1
 constant-rough.de, 1
 constant.ga, 1
+constelacion3d.com, 1
 constellations.ga, 1
 consteval.org, 1
 constexpr.org, 1
@@ -22706,7 +22367,6 @@ contratatupoliza.com, 1
 contratti.it, 1
 contributor.google.com, 1
 controlambientalbogota.com, 1
-controlautocom.com.br, 1
 controlbooth.com, 1
 controle.net, 1
 controleer-maar-een-ander.nl, 1
@@ -22726,6 +22386,7 @@ conversiepartners.nl, 1
 conversiones.com, 1
 conversionsciences.com, 1
 convert.zone, 1
+convert2sql.com, 1
 converter.ml, 1
 convertimg.com, 1
 convexset.org, 1
@@ -22733,6 +22394,7 @@ convierteenabudancia.com, 1
 convocatoriafundacionpepsicomexico.org, 0
 conxcon.de, 1
 coochiehacks.io, 1
+cookandgame.com, 1
 cookcountyclerkil.gov, 1
 cooker.fr, 1
 cookescastles.co.uk, 1
@@ -22853,7 +22515,7 @@ corepartners.com.ua, 1
 coresolutions.ca, 1
 coresos.com, 1
 coreum.ca, 1
-coreup.de, 0
+coreup.de, 1
 corevetconnect.co.uk, 1
 coreyjmahler.com, 1
 corgei.com, 1
@@ -22867,7 +22529,6 @@ coriolis.ch, 1
 corisu.co, 1
 corkcityfc.tk, 1
 corkedwinebar.com, 1
-corkerscrisps.co.uk, 1
 corksoncolumbus.com, 1
 corl3ss.com, 1
 corleoncatering.com, 1
@@ -22940,6 +22601,7 @@ corsomassaggi.it, 1
 corsorspp.roma.it, 1
 cortealcastello.it, 1
 cortege.cf, 1
+cortesparapelo.com, 1
 cortex-development.de, 1
 cortexitrecruitment.com, 1
 cortexx.nl, 1
@@ -22949,6 +22611,7 @@ corvax.kiev.ua, 1
 corvee.com, 1
 corvus.eu.org, 1
 coryadum.com, 1
+coryluba.com, 1
 corytyburski.com, 0
 cosasque.com, 1
 cosciamoos.com, 1
@@ -23011,6 +22674,7 @@ cotswoldflatroofing.com, 1
 cotta.dk, 1
 cottonage.tk, 1
 cotwe-ge.ch, 0
+cou.re, 1
 cougar.dating, 1
 coughlan.de, 1
 coumoul.fr, 1
@@ -23066,8 +22730,14 @@ covermytrip.com.au, 1
 covershousing.nl, 1
 covert.sh, 1
 covid-19advice.com, 1
+covid-graphs.info, 1
+covid-model.net, 1
 covid19.melbourne, 1
+covid19resilience.org, 1
 covid19responsepod.com, 1
+covid19scotland.co.uk, 0
+covid19statstracker.com, 1
+covidmodel.net, 1
 covuro.com, 1
 covve.com, 0
 covybrat.cz, 1
@@ -23088,12 +22758,14 @@ cozmoapp.com, 1
 cozmoyachts.com, 1
 cozo.me, 1
 cozumel-activities.com, 1
-cozyeggdesigns.com, 1
 cp-st-martin.be, 1
 cp014.com, 1
 cp015.com, 1
 cp017.com, 1
+cp061.com, 1
+cpad.org.pk, 1
 cpaexamguy.com, 1
+cpanels.us, 1
 cpaneltips.com, 1
 cpap.com, 1
 cpars.gov, 1
@@ -23129,6 +22801,7 @@ cps-sante.ml, 1
 cpsa.co.uk, 1
 cpsc.gov, 1
 cpsecureapp.com, 1
+cpshr.us, 1
 cpsq.fr, 1
 cpsurvey.com, 1
 cptoon.com, 1
@@ -23167,6 +22840,7 @@ craft-me-in.com, 1
 craftandbuild.de, 1
 craftcms.com, 1
 crafted.cat, 1
+crafterbase.de, 1
 crafters.co.jp, 1
 craftination.net, 1
 craftingcrow.com, 1
@@ -23216,7 +22890,6 @@ crawfordcountytcc.org, 1
 crawler.ninja, 1
 crawleybouncycastles.co.uk, 1
 crawlspaceandbasementsolutions.com, 1
-crazy-bulks.com, 1
 crazy-cat.net, 1
 crazy-coders.com, 1
 crazybear-underground.tk, 1
@@ -23256,6 +22929,7 @@ crea-shops.ch, 0
 crea-th.at, 1
 crea-that.fr, 1
 crea.bg, 1
+crea.codes, 1
 crea.me, 1
 creacioneslri.com, 1
 creadoc.fr, 1
@@ -23270,6 +22944,7 @@ creamyfox.com, 1
 creandoydesarrollando.com, 1
 creared.edu.co, 1
 creareup.com, 1
+creatapeak.com, 1
 create-ls.jp, 1
 create-website.ga, 1
 createbeing.com, 1
@@ -23290,7 +22965,7 @@ creativeangles.in, 1
 creativebites.de, 1
 creativecaptiv.es, 1
 creativecommons.gr, 1
-creativecommons.org, 1
+creativecommons.org, 0
 creativecommonscatpictures.com, 1
 creativeconceptsvernon.com, 1
 creativedigital.co.nz, 1
@@ -23308,6 +22983,7 @@ creativesectors.tk, 1
 creativesurvey.com, 1
 creativeweb.biz, 1
 creativewolf.net, 1
+creativlabor.ch, 1
 creativosonline.org, 1
 creatixx-network.de, 0
 creatleencoaching.com, 1
@@ -23318,6 +22994,7 @@ creatujoya.com, 1
 crebita.de, 1
 crecips.com, 1
 crecman.fr, 1
+credee.org, 1
 credex.bg, 1
 credigo.se, 1
 credit-10.com, 1
@@ -23366,6 +23043,7 @@ crgm.net, 1
 cribcore.com, 1
 crickey.eu, 1
 cricklewood.condos, 1
+cricoff.com, 1
 criena.com, 1
 criena.net, 0
 crime-lawyers.com, 1
@@ -23433,6 +23111,7 @@ croco.vision, 1
 crocop.tk, 1
 crocuscoaching.co.uk, 1
 croeder.net, 1
+crohnszone.org, 1
 croisedanslemetro.com, 1
 cromefire.myds.me, 1
 cromosomax.com, 1
@@ -23463,6 +23142,7 @@ crossfitblackwater.com, 1
 crossfitvenegono.it, 1
 crossformer.com, 1
 crossfunctional.com, 1
+crossfw.com, 1
 crosslifenutrition.co.uk, 0
 crosslimit.ga, 1
 crossnet.io, 1
@@ -23529,7 +23209,6 @@ cry-sys.de, 1
 cry.nu, 0
 cryoblaster.com, 1
 cryoflesh.com, 1
-cryogenix.net, 1
 cryothanasia.com, 1
 cryp.no, 1
 crypkit.com, 1
@@ -23552,7 +23231,6 @@ cryptocaseproject.com, 1
 cryptoclix.website, 1
 cryptocon.org, 1
 cryptocurrencyfare.com, 1
-cryptodigitalgroup.com, 1
 cryptoearnblog.xyz, 1
 cryptofan.org, 1
 cryptofomo.capital, 1
@@ -23570,8 +23248,10 @@ cryptolocalatm.com, 1
 cryptology.ch, 1
 cryptomail.nl, 1
 cryptomaniaks.com, 1
+cryptomize.com, 1
 cryptomkt.com, 1
 crypton.asia, 1
+cryptonewsz.com, 1
 cryptonit.cf, 1
 cryptonom.org, 1
 cryptonx.io, 1
@@ -23605,13 +23285,13 @@ crystalblockchain.com, 1
 crystalchandelierservices.com, 1
 crystalcherryonline.tk, 1
 crystalgrid.net, 1
+crystalmusic-chat.com, 1
 crystaloscillat.com, 1
 crystalroad.net, 1
 crystone.me, 1
 cryz.ru, 1
 cs-algeria.tk, 1
 cs-colorscreed-betongulve.dk, 1
-cs-dreambox.com, 1
 cs-kurnik.pl, 1
 cs.money, 1
 csa-library.org, 1
@@ -23647,10 +23327,10 @@ csgo77.com, 1
 csgomtr.com, 1
 csgoswap.com, 1
 csgotwister.com, 1
+csharp.love, 1
 csharpmarc.net, 1
 cshopify.com, 1
 cshub.nl, 1
-csi.lk, 1
 csilies.de, 1
 csinfo.us, 1
 csinterstargeneve.ch, 0
@@ -23737,8 +23417,6 @@ cube-filing.com, 1
 cube.builders, 1
 cubebot.io, 1
 cubebuilders.net, 1
-cubecart-demo.co.uk, 1
-cubecart-hosting.co.uk, 1
 cubecraft.net, 1
 cubecraftcdn.com, 1
 cubecraftstore.com, 1
@@ -23749,7 +23427,6 @@ cubeo.xyz, 1
 cubeperformancecentre.com.au, 1
 cubesugar.info, 1
 cubetech.co.jp, 1
-cubia.com, 1
 cubia.de, 1
 cubia3.com, 1
 cubia4.com, 1
@@ -23775,28 +23452,27 @@ cuddlingyaks.com, 1
 cudesa.gq, 1
 cudesyb.tk, 1
 cudoo.de, 1
-cueca.com.br, 1
-cuecasonline.com.br, 1
 cuegee.com, 1
 cuentamecomopaso.es, 1
 cuentas-gratis.ga, 1
 cuentasmutualamr.org.ar, 1
+cuestiondegustos.es, 1
 cuetoems.com, 1
 cuevafelina.tk, 1
 cuff-links.nl, 1
 cuibonobo.com, 1
 cuio.net, 1
 cuir-lipari.fr, 1
+cuisine-ultime.fr, 1
 cuisinecastle.com, 1
 cuitandokter.com, 1
-culan.dk, 1
+culan.dk, 0
 culinary.ga, 1
 culpoilu.tk, 1
 cultiv.nl, 1
 cultivo.bio, 1
 cultofd50.org, 1
 cultofperf.org.uk, 1
-cultrix.co.uk, 1
 cultura10.com, 1
 culturabrasilia.tk, 1
 culturaldiversity.tk, 1
@@ -23847,7 +23523,6 @@ curia.fi, 1
 curieux.digital, 0
 curio-shiki.com, 1
 curiosity-driven.org, 1
-curiouspeddler.com, 1
 curl.tw, 1
 curlify.com, 1
 curlybracket.co.uk, 1
@@ -23919,6 +23594,7 @@ cutimbo.ovh, 1
 cutlinks.ml, 1
 cutmylink.gq, 1
 cutner.co, 1
+cutt.pro, 1
 cuvva.co, 1
 cuvva.co.uk, 1
 cuvva.com, 1
@@ -23954,7 +23630,6 @@ cvo-group.com, 1
 cvr.dk, 1
 cvtemplatemaster.com, 1
 cvtenerife.tk, 1
-cvtshop.com.br, 1
 cvursache.com, 0
 cvutdecin.cz, 1
 cvv.cn, 1
@@ -24008,13 +23683,13 @@ cyberduck.io, 1
 cyberdyne.ie, 1
 cyberdyne.llc, 1
 cyberexplained.info, 1
-cyberfamily.network, 1
 cyberforensics.com, 1
 cyberfrancais.ro, 1
 cybergame-host.tk, 1
 cybergroup.cf, 1
 cyberguerrilla.info, 1
 cyberguerrilla.org, 1
+cyberhazard.eu, 1
 cyberhipsters.nl, 1
 cyberianhusky.com, 0
 cyberislam.tk, 1
@@ -24126,7 +23801,6 @@ cytat.tk, 1
 cytegic-update-packages.com, 1
 cythereaxxx.com, 1
 cyumus.com, 1
-cz.ma, 1
 czakey.net, 1
 czaw.org, 1
 czbix.com, 1
@@ -24134,6 +23808,7 @@ czbtm.com, 1
 czc.cz, 1
 czech.is, 1
 czechcrystals.co.uk, 1
+czechglaskralen.nl, 1
 czechvirus.cz, 1
 czerno.com, 1
 czh999.com, 1
@@ -24161,7 +23836,6 @@ d00228.com, 1
 d00d.de, 1
 d0g.cc, 1
 d0m41n.name, 1
-d0xq.com, 1
 d0xq.net, 1
 d166.net, 1
 d1qvlbepn0kduz.cloudfront.net, 1
@@ -24190,7 +23864,6 @@ d588.cc, 1
 d64.nl, 1
 d66.nl, 1
 d6729.co, 1
-d6729.com, 1
 d6957.co, 1
 d6c5yfulmsbv6.cloudfront.net, 1
 d7035.com, 1
@@ -24438,6 +24111,7 @@ dagensannonser.se, 1
 dagestan.cf, 1
 dagestanci.tk, 1
 dagestanec.tk, 1
+dagjetreinen.nl, 1
 dagmar2018.cz, 1
 dagmarhamalova.cz, 1
 dagrs.se, 1
@@ -24447,7 +24121,7 @@ dahobo.tk, 1
 dai94.com, 1
 daibetter.com, 1
 daidogei.com, 1
-daidr.me, 1
+daidr.me, 0
 daie-inc.com, 1
 daigakujuken-plus.com, 1
 daikoz.com, 1
@@ -24476,6 +24150,7 @@ dailyw88.com, 1
 dailyxenang.com, 1
 daimafengzi.com, 1
 daimonikos.com, 1
+dairikab.go.id, 1
 dairyshrine.org, 1
 daisakuikeda.org, 1
 daisidaniels.co.uk, 1
@@ -24497,7 +24172,6 @@ daknob.net, 1
 dakota-spain.tk, 1
 dakotasjoint.com, 1
 daktarisys.com, 1
-daladubbeln.se, 1
 dalaran.city, 1
 dalb.in, 1
 dalbitresb.me, 1
@@ -24562,6 +24236,7 @@ danalina.by, 1
 danalytics.com.pe, 1
 danamica.dk, 1
 danandrum.com, 1
+danangcitytours.com, 1
 danarozmarin.com, 1
 danashamsters.tk, 1
 danbaldwinart.com, 1
@@ -24573,6 +24248,7 @@ danca.com, 1
 dance-colleges.com, 1
 danceylove.net, 1
 danchen.org, 1
+danchestertonphoto.co.uk, 1
 dancingcubs.co.uk, 1
 danclassroom.com, 1
 dandan101.com, 1
@@ -24637,6 +24313,7 @@ danielluisrodriguezs.com, 1
 danielmartin.de, 1
 danielmiessler.com, 1
 danielmoch.com, 1
+danielmorales917.com, 1
 danielmorell.com, 1
 danielmostertman.com, 1
 danieln.tech, 1
@@ -24767,6 +24444,7 @@ dark-nova.tk, 1
 dark-vision.cz, 1
 dark.fail, 1
 dark.ninja, 1
+darkag.ovh, 1
 darkartstudios.tk, 1
 darkcards.xyz, 1
 darkcelebration.tk, 1
@@ -24991,7 +24669,6 @@ davecardwell.com, 1
 davedevries.nl, 1
 daveedave.de, 1
 davelage.com, 1
-davelynes.com, 1
 daveoc64.co.uk, 1
 daveops.net, 1
 davepage.me.uk, 1
@@ -25139,7 +24816,6 @@ dblcastles.co.uk, 1
 dbldub.net, 1
 dblx.io, 1
 dbmiller.org, 1
-dbmteam.com, 1
 dborcard.com, 0
 dbox.ga, 1
 dbplanview.com, 1
@@ -25166,6 +24842,7 @@ dcarou.com, 1
 dcave.net, 1
 dcbouncycastles.co.uk, 1
 dcc.cat, 1
+dcc.moe, 1
 dccwiki.com, 1
 dcdestetica.it, 1
 dcdn.lt, 1
@@ -25193,6 +24870,7 @@ dd00228.com, 1
 dd112d.net, 1
 dd118d.com, 1
 dd11d.net, 1
+dd152.ru, 1
 dd201d.com, 1
 dd202d.com, 1
 dd203d.com, 1
@@ -25246,12 +24924,12 @@ ddracepro.net, 1
 dds.mil, 1
 dds.pe, 1
 ddsmatchsouthwest.com, 1
+ddw.pw, 1
 ddy.tw, 1
 de-basiliek.tk, 1
 de-groot.it, 1
 de-gucci.com, 1
 de-kramers.nl, 1
-de-mail.info, 1
 de-medici.nl, 1
 de-mossadeq.tk, 1
 de-osopanda.com, 1
@@ -25294,7 +24972,6 @@ dealbanana.se, 1
 dealbx.com, 1
 dealcruiser.nl, 1
 dealdump.nl, 1
-dealerbrindes.com.br, 1
 dealerselectric.com, 1
 dealerwriter.com, 1
 dealinflatables.co.uk, 1
@@ -25357,7 +25034,6 @@ debostero.tk, 1
 debraydesign.com.au, 1
 debron-ot.nl, 1
 debrusoft.ch, 1
-debt.com, 1
 debtrecycling.com.au, 1
 debuemon.com, 1
 debuis.nl, 1
@@ -25406,9 +25082,7 @@ decorativeconcretewa.com.au, 1
 decorativecosmetics.tk, 1
 decorativeflooring.com, 1
 decoratore.roma.it, 1
-decoratrix.com, 1
 decorauvent.ca, 1
-decorestilo.com.br, 1
 decorincasa.com.br, 1
 decormiernissanparts.com, 1
 decorotti.com.tr, 1
@@ -25453,6 +25127,7 @@ deepaero.com, 1
 deeparamaraj.com, 1
 deepbluecrafting.co.uk, 1
 deepblueemail.com, 1
+deepclub-chat.com, 1
 deepcode.io, 1
 deepcreampie.com, 1
 deephill.com, 1
@@ -25469,6 +25144,7 @@ deepspace4.com, 1
 deepu-mathew.tk, 1
 deepumathew.tk, 1
 deepvalley.tech, 1
+deepwoodshop.com, 1
 deerfieldapartmentsstl.com, 1
 deerwoodrvpark.com, 1
 deesylab.com, 1
@@ -25559,7 +25235,6 @@ dejongonline.eu, 1
 dejting-sidor.com, 1
 dejure.org, 0
 dejvsoft.pl, 1
-dejw.cz, 1
 dekasegi-kansai.com, 1
 dekasegi-supportcenter.com, 1
 dekasiba.com, 1
@@ -25641,6 +25316,7 @@ deluxe-dubai.com, 1
 delvinoadegas.com.br, 1
 delycate.com, 1
 demand.io, 1
+demarit.fi, 1
 demarle.ch, 0
 demastglazenwasserij.nl, 1
 demedx.at, 1
@@ -25691,6 +25367,7 @@ demuzere.eu, 1
 demuzere.net, 1
 demuzere.org, 1
 den-ka.jp, 1
+den.taxi, 1
 denabot.pw, 1
 denaehula.com, 1
 denahrumah.co, 1
@@ -25727,6 +25404,7 @@ deniz.uk, 1
 denizdesign.co.uk, 1
 denkeandersblog.de, 1
 denkmalagentur.ch, 1
+denkmalsetzung.at, 1
 denkubator.de, 1
 dennhat.com, 1
 denninger.jp, 1
@@ -25783,7 +25461,9 @@ depeche.ga, 1
 depechemode-live.com, 1
 deped.io, 1
 deped.org, 1
+depedapplication.com, 1
 depedclub.ph, 1
+depedresearch.com, 1
 depedresources.ph, 1
 depedsurigaodelnorte.com, 1
 depedtambayan.net, 1
@@ -25843,10 +25523,12 @@ derf.red, 1
 derf.us, 1
 dergeilstestammderwelt.de, 1
 derhil.de, 1
+derival.co.za, 1
 derivativeshub.pro, 1
 derive.cc, 1
 derive.cf, 1
 derivedata.com, 1
+derk-jan.com, 0
 derkarl.tk, 1
 derkuki.de, 1
 dermacarecomplex.com, 1
@@ -25903,6 +25585,7 @@ designartepublicidad.com, 1
 designed-cybersecurity.com, 1
 designedbygeniuses.com, 1
 designedcybersecurity.com, 1
+designepublicidade.com.br, 1
 designer-drug.com, 1
 designera.se, 1
 designerchad.com, 1
@@ -25946,6 +25629,7 @@ destakbrasilbrindes.com.br, 1
 destech.nl, 1
 desterman.ru, 1
 destileria.net.br, 1
+destinattorneyjohngreene.com, 1
 destinfloor.com, 1
 destinyofthephoenix.me, 0
 destroysilence.cf, 1
@@ -26066,7 +25750,7 @@ developyourelement.com, 0
 develux.net, 1
 devendradox.ml, 1
 deventersysteem.nl, 1
-devh.de, 0
+devh.de, 1
 devh.net, 1
 deviajesturismo.com, 1
 deviant.email, 1
@@ -26094,6 +25778,7 @@ devmode.fm, 1
 devnet.tk, 1
 devnull.team, 1
 devnull.zone, 1
+devoc.net, 1
 devochki.ga, 1
 devolution.ws, 1
 devonsawatzky.ca, 1
@@ -26128,7 +25813,7 @@ dewaard.de, 1
 dewalch.net, 1
 dewapress.com, 1
 dewblog.ml, 1
-dewinter.com, 1
+dewinter.com, 0
 dewitteprins.nl, 1
 dewolden.nl, 0
 dex.top, 1
@@ -26143,6 +25828,7 @@ deyute.com, 1
 dez-online.de, 1
 dezeregio.nl, 1
 dezet-ev.de, 1
+dezinfekcianaruky.com, 1
 dezmembrariromania.ro, 1
 dezzoroofing.co.za, 1
 df118.me, 1
@@ -26181,7 +25867,6 @@ dg68.cc, 1
 dgangsta.net, 1
 dgblaw.com.au, 0
 dgbouncycastlehire.com, 1
-dgeex.eu, 1
 dgitup.com, 1
 dgl-24.de, 1
 dgmedia.tk, 1
@@ -26195,6 +25880,7 @@ dh9397.com, 1
 dh9721.com, 1
 dhakawebhost.com, 1
 dhamdhamaanchalikcollege.tk, 1
+dhammacitta.org, 1
 dharamkot.com, 1
 dharveydev.com, 1
 dhautefeuille.eu, 1
@@ -26268,6 +25954,7 @@ diariocibao.com, 1
 diariodearaxa.com.br, 1
 diarionoticia.pe, 1
 diariorealidad.com, 1
+diariorp.com.br, 1
 diariosurnoticias.com, 1
 diaroma.it, 1
 diarynote.jp, 1
@@ -26393,6 +26080,7 @@ diferenca.com, 1
 different.cz, 1
 differenta.ro, 1
 differentgirleveryday.ml, 1
+differmint.com, 1
 difficulty.ga, 1
 diffnow.com, 1
 diffuzehr.com.au, 1
@@ -26401,7 +26089,6 @@ diflucanonline.tk, 1
 diflucanpill.ga, 1
 difon.tk, 1
 difoosion.com, 1
-difusordeambientes.com.br, 1
 digchip.com, 1
 digchip.info, 1
 digchip.net, 1
@@ -26413,7 +26100,6 @@ dighans.com, 1
 digiarc.net, 1
 digibull.email, 1
 digibull.link, 1
-digicasso.nl, 1
 digicert-support.com, 1
 digicode.hu, 1
 digicy.cloud, 1
@@ -26426,8 +26112,11 @@ digilicious.com, 1
 digimaat.agency, 1
 digimagical.com, 1
 digimedia.cd, 0
+digino.co.uk, 1
+digino.jp, 1
+digino.us, 1
+digino.xyz, 1
 digioccumss.ddns.net, 1
-digipl.com, 1
 digipolis.gent, 1
 digipost.no, 1
 digirechnung.de, 1
@@ -26503,11 +26192,11 @@ digitalhurricane.io, 0
 digitalid-sandbox.com, 1
 digitalid.com, 1
 digitalid.com.au, 1
-digitaliguru.com, 1
 digitalkes.com, 1
 digitalliteracy.gov, 1
 digitallive24.ir, 1
 digitalmaniac.co.uk, 1
+digitalmarketerconsultant.com, 1
 digitalmarketingindallas.com, 1
 digitalninja.tk, 1
 digitalpiloten.org, 1
@@ -26550,7 +26239,6 @@ diletec.com.br, 1
 dilibel.be, 1
 dilichen.fr, 1
 diligo.ch, 0
-dillewijnzwapak.nl, 1
 dillonkorman.com, 1
 diluv.com, 0
 dimagrimentoincorso.it, 1
@@ -26558,8 +26246,8 @@ dimanet.fr, 1
 dimanss47.net, 1
 dime-staging.com, 1
 dime.io, 1
-dimeponline.com.br, 1
 dimez.ru, 1
+dimigo.codes, 1
 dimiskovska.de, 1
 dimism.eu, 1
 dimitrihomes.com, 1
@@ -26610,6 +26298,7 @@ dioesfoto.com, 1
 diogeneshoy.com, 1
 dionysos-ios.gr, 1
 dionysus.se, 1
+dioxido.com.ar, 1
 diozoid.com, 1
 dipalma.me, 1
 dipdaq.com, 1
@@ -26627,7 +26316,6 @@ dirba.io, 1
 direct-sel.com, 1
 direct.cz, 1
 direct365.es, 1
-directed.ir, 1
 directelectricalltd.co.uk, 1
 directfinance.cz, 1
 directfitnesssolutions.com, 1
@@ -26819,7 +26507,6 @@ distock.fr, 1
 distracteddriving.gov, 1
 distraction.gov, 1
 distratus.com, 1
-distribuidoracristal.com.br, 1
 distribuidoradecierres.com, 1
 distribuidoraplus.com, 1
 distribuidorveterinario.es, 1
@@ -26837,6 +26524,7 @@ ditemanggung.com, 1
 diterzafra.tk, 1
 diti.me, 1
 dities.tk, 1
+ditudo.com, 1
 div.im, 1
 diva.nl, 1
 divari.nl, 1
@@ -26871,7 +26559,6 @@ divistart.online, 1
 divisuite.com, 1
 divjak.at, 1
 divo-remont.tk, 1
-divorciosmurcia.com, 1
 divup.com, 1
 diwaligiftforyou.com, 1
 diwei.vip, 1
@@ -26898,6 +26585,7 @@ dizzyskills.tk, 1
 dizzythewizard.co.uk, 1
 dj-kupidon.gq, 1
 dj-leszwolle.nl, 1
+dj-phil.fr, 1
 dj-x.info, 1
 dj16888.com, 1
 dj16888a.com, 1
@@ -26939,7 +26627,6 @@ djl63.com, 1
 djl63001.com, 1
 djleon.net, 1
 djlinux.cz, 1
-djlive.pl, 1
 djlnetworks.co.uk, 1
 djlove.tk, 1
 djmarian.com, 1
@@ -26958,6 +26645,15 @@ djul.net, 1
 djurklinikenangelholm.se, 1
 djvintagevinyl.com, 1
 djvintagevinyl.nl, 1
+djvip1.com, 1
+djvip10.com, 1
+djvip2.com, 1
+djvip3.com, 1
+djvip4.com, 1
+djvip5.com, 1
+djvip6.com, 1
+djvip7.com, 1
+djvip9.com, 1
 djwaynepryke.com, 1
 djwilson.tk, 1
 djyoungcruse.tk, 1
@@ -26992,6 +26688,7 @@ dlld.org, 1
 dlld.us, 1
 dlmit.be, 1
 dlouwrink.nl, 1
+dlrg-cux-ohz.de, 1
 dlrsp.org, 1
 dlscomputers.com.au, 1
 dlui.xyz, 1
@@ -27010,7 +26707,6 @@ dmailshop.ro, 1
 dmarc.dk, 1
 dmarc.tech, 1
 dmarcian.com, 1
-dmaseocompany.com, 1
 dmatrix.xyz, 1
 dmclix.com, 1
 dmcw.de, 1
@@ -27047,6 +26743,7 @@ dnalounge.com, 1
 dnapizza.com, 1
 dnash.tk, 1
 dnc.org.nz, 1
+dnddobbelstenen.nl, 1
 dndtools.net, 1
 dnepropetrovck.tk, 1
 dnfc.rocks, 1
@@ -27141,6 +26838,7 @@ doctor.dating, 1
 doctor360.com.au, 1
 doctorbini.com, 1
 doctorcalefon.com, 1
+doctorebonie.com, 1
 doctorfox.co.uk, 1
 doctormahamudul.tk, 1
 doctornaima.ml, 1
@@ -27185,7 +26883,11 @@ dogcontrol.ca, 1
 dogcratereview.info, 1
 dogday.tk, 1
 doge.town, 1
-dogear.ch, 1
+dogear.ch, 0
+dogespeed.cf, 1
+dogespeed.gq, 1
+dogespeed.ml, 1
+dogespeed.tk, 1
 dogforum.de, 1
 dogfriendly.co.uk, 1
 dogft.com, 1
@@ -27206,7 +26908,6 @@ dogsdailylife.com, 1
 dogsnow.com, 1
 dogtrack.tk, 1
 dogurai.com, 1
-dogworld.com.br, 1
 dohanews.co, 1
 doi.org, 1
 doihavetoputonpants.com, 1
@@ -27326,10 +27027,10 @@ domix.fun, 1
 domizx.de, 1
 domjh.com, 1
 domlist.tk, 1
-dommascate.com.br, 1
 domob.eu, 1
 domodeco.fr, 1
 domodedovo.travel, 1
+domofon.io, 1
 domop.cc, 1
 domop.net, 1
 domop.org, 1
@@ -27383,6 +27084,7 @@ donghochinhhang.store, 1
 dongjingre.net, 1
 dongor.tk, 1
 dongxuwang.com, 1
+donia-almla3b.com, 1
 donjusto.nl, 1
 donkennedyandsons.com, 1
 donkeytrekkingkefalonia.com, 1
@@ -27408,6 +27110,7 @@ dontbeevil.com, 1
 dontbubble.me, 1
 donteaetcrayons.tk, 1
 donthedragonwilson.com, 1
+dontkeylog.me, 1
 dontpayfull.com, 1
 dontstopcoffee.com, 1
 donttrust.me, 1
@@ -27491,6 +27194,7 @@ doska.cf, 1
 doska.ru, 1
 doskapozora.tk, 1
 dosomeworks.biz, 1
+dossierweb.tk, 1
 dossplumbing.co.za, 0
 dostalsecurity.com, 1
 dostav.tk, 1
@@ -27507,7 +27211,6 @@ dosvientosoutdoorlighting.com, 1
 doswap.com, 1
 dosyaa.tk, 1
 dosyauzantisi.com, 1
-dot.ro, 1
 dot42.no, 1
 dota2free.tk, 1
 dotacni-parazit.cz, 1
@@ -27557,6 +27260,7 @@ doublestat.me, 1
 doubleup.com.au, 1
 doubly.tk, 1
 doubtaboutwill.org, 1
+douceurcarlet.com, 1
 doucheba.gs, 0
 doughseeker.com, 1
 douglas-ma.gov, 1
@@ -27584,6 +27288,7 @@ dowling.nz, 1
 down-load.dynu.net, 1
 downandouts.tk, 1
 downfreak.tk, 1
+download-audacity.org, 1
 download-image.ga, 1
 download-knigi.gq, 1
 download.dk, 1
@@ -27622,7 +27327,6 @@ doyleshamrock.com, 1
 doyo.email, 1
 doyo.tech, 1
 doyoucheck.com, 0
-doyouedc.com, 1
 doyoulyft.com, 1
 doyouspeakenglish.tk, 1
 doyoutax.com, 0
@@ -27796,6 +27500,7 @@ draugr.de, 1
 draw.uy, 1
 drawchan.org, 1
 drawesome.uy, 1
+drawguess.fun, 1
 drawing.tk, 1
 drawingcode.net, 1
 drawtwo.gg, 1
@@ -27820,6 +27525,7 @@ dreadd.org, 1
 dreadlord.tk, 1
 dream-design.tk, 1
 dream-domain.tk, 1
+dream-factory.tk, 1
 dream-pools.cf, 1
 dreamaholic.club, 1
 dreambbs.tk, 1
@@ -27888,7 +27594,6 @@ dresdner-mandelstollen.de, 1
 dresdner-stollen-von-reimann.de, 0
 dresdner-stollen.shop, 1
 dress-cons.com, 1
-dressedinwhitebridal.com, 1
 dressify.in, 1
 dressingmaternity.fr, 1
 dreumesshakira.tk, 1
@@ -27909,6 +27614,7 @@ drfrey.ch, 0
 drgeadsdavinci.com, 1
 drgerthplasticsurgery.com, 1
 drghomi.com, 1
+drgiyaseddin.com, 0
 drglassgyn.com, 1
 drgn.li, 1
 drgn.no, 1
@@ -28004,6 +27710,7 @@ droidwiki.de, 1
 dromax.hu, 1
 dromotique.com, 1
 drone-it.net, 0
+drone33.fr, 1
 dronebase.cf, 1
 dronebl.org, 1
 droneland.nl, 1
@@ -28108,6 +27815,7 @@ drymx.cn, 1
 drywallresponse.gov, 1
 drywtea.com, 1
 dryzgov.tk, 1
+ds-hostingsolutions.net, 1
 ds.lol, 1
 ds138.cc, 1
 ds168.cc, 1
@@ -28137,6 +27845,7 @@ dsh.io, 1
 dshield.org, 1
 dsi7.com, 1
 dsimons.tk, 1
+dsiteam.in, 1
 dsm5.com, 1
 dsmjs.com, 1
 dsmnet.org, 1
@@ -28155,6 +27864,7 @@ dstvinstallkemptonpark.co.za, 1
 dstvsandton.co.za, 1
 dstvsouthafrica.com, 1
 dsuinnovation.com, 1
+dsv-salesmanager.de, 1
 dt688.net, 1
 dtbouncycastles.co.uk, 1
 dtbw.eu, 1
@@ -28228,7 +27938,7 @@ duckblade.com, 1
 duckcorp.org, 1
 duckduck.horse, 1
 duckduckstart.com, 1
-duckeight.win, 0
+duckeight.win, 1
 duckfam.us, 1
 duckinc.net, 1
 ducksify.com, 1
@@ -28245,7 +27955,6 @@ duernberg.at, 1
 duesee.org, 1
 duesseldorferheineburschenschaft.tk, 1
 duesterhus.eu, 1
-dueto.store, 1
 dufort.nl, 1
 dufrei.com, 1
 dug.net.pl, 1
@@ -28313,12 +28022,13 @@ duo.com, 1
 duobus.nl, 1
 duoluodeyu.com, 1
 duonganhtuan.com, 1
+duoqichina.cn, 1
+duoqichina.com, 1
 duoquadragintien.fr, 1
 duoyin.com, 1
 dupisces.com.tw, 1
 duplicazionechiavi.it, 1
 dupree.co, 1
-dupree.pe, 1
 durabletravailler.tk, 1
 duraes.pt, 1
 durand.tf, 1
@@ -28338,6 +28048,7 @@ duria.de, 1
 duriaux-dentiste.ch, 0
 duriemas.com, 1
 durin-art.com, 1
+durkinconstruction.com.au, 1
 durmatest.com, 1
 duroterm.ro, 1
 durys.be, 1
@@ -28368,6 +28079,7 @@ dutchforkrunners.com, 1
 dutchplayers.com, 1
 dutchsailors.com, 1
 dutchwanderers.nl, 1
+dutchwaredesign.nl, 1
 dutchweballiance.nl, 1
 dutkoteam.com, 1
 dutrac.co.id, 1
@@ -28390,7 +28102,6 @@ dveri-lugansk.tk, 1
 dverisochi.ru, 1
 dvhosting.be, 1
 dvipadmin.com, 1
-dvlot.ru, 1
 dvnatura.ch, 0
 dvor.ml, 1
 dvorupotocnych.sk, 1
@@ -28398,8 +28109,8 @@ dvwc.org, 1
 dvx.cloud, 1
 dw-loewe.de, 0
 dwarf.com.tw, 1
+dwell.property, 1
 dwgf.xyz, 1
-dwhd.org, 1
 dwhightmolina.com, 1
 dwi-sued.de, 1
 dwnld.me, 1
@@ -28428,6 +28139,7 @@ dybuster.de, 1
 dybuster.es, 1
 dybuster.it, 1
 dybuster.se, 1
+dycoa.com, 1
 dyeager.org, 1
 dyktig.as, 1
 dyktig.no, 1
@@ -28543,7 +28255,6 @@ e-briancon.com, 1
 e-classroom.tk, 1
 e-coexist.com, 1
 e-colle.info, 1
-e-cottage.com.br, 1
 e-dengi.tk, 1
 e-diabolo.tk, 1
 e-diapers.tk, 1
@@ -28575,6 +28286,7 @@ e-peeling.tk, 1
 e-planshet.tk, 1
 e-polygraphy.tk, 1
 e-privat.info, 1
+e-procurement.co.mz, 1
 e-ptn.com, 1
 e-receta.cl, 1
 e-recruitment.tk, 1
@@ -28607,7 +28319,6 @@ e-worksmedia.com, 0
 e-zine.tk, 1
 e.mail.ru, 1
 e00228.com, 1
-e007.com, 1
 e1488.com, 1
 e15r.co, 1
 e2ebrindes.com.br, 1
@@ -28800,9 +28511,19 @@ eac0662.com, 1
 eac0663.com, 1
 eac0691.com, 1
 eac0692.com, 1
+eac0701.com, 1
+eac0710.com, 1
 eac0711.com, 1
 eac0712.com, 1
+eac0713.com, 1
 eac0714.com, 1
+eac0716.com, 1
+eac0717.com, 1
+eac0718.com, 1
+eac0719.com, 1
+eac0728.com, 1
+eac0730.com, 1
+eac0731.com, 1
 eac0832.com, 1
 eac0833.com, 1
 eac0834.com, 1
@@ -28988,9 +28709,7 @@ ebankingmasicuro.ch, 1
 ebas.ch, 1
 ebashim.tk, 1
 ebataw.com, 1
-ebaymotorssucks.com, 1
 ebenda.org, 1
-ebenezersbarnandgrill.com, 1
 ebenvloedaanleggen.nl, 1
 ebermannstadt.de, 0
 ebertlang.com, 1
@@ -29000,7 +28719,9 @@ ebill.pl, 1
 ebiografia.com, 1
 ebiografias.com.br, 1
 ebisi.be, 1
+ebix.dk, 1
 ebizarts.com, 1
+ebjork.se, 1
 eblog.cf, 1
 eblog.ink, 1
 eboardsolutions.com, 1
@@ -29019,6 +28740,7 @@ ebooks4all.tk, 1
 ebooksa.com, 1
 ebooksbag.com, 1
 ebooksgratuits.org, 1
+ebooksinfocus.com, 1
 ebookspy.tk, 1
 ebop.ch, 1
 eboutic.ch, 1
@@ -29028,7 +28750,6 @@ ebpglobal.com, 0
 ebrnd.de, 1
 ebrowz.com, 1
 ebstyle.co.uk, 1
-ebteam.ir, 1
 ebuha.ga, 1
 ebuku.tk, 1
 eburg.ml, 1
@@ -29036,6 +28757,7 @@ ebuyclub.com, 1
 ec-baran.de, 1
 ec-current.com, 1
 ec.mine.nu, 1
+ecaa.ee, 1
 ecarch.cf, 1
 ecard.ml, 1
 ecardoo.com, 1
@@ -29051,7 +28773,6 @@ eccux.com, 1
 ecdahls.no, 1
 ecdn.cz, 1
 ecelembrou.ovh, 1
-ecfnorte.com.br, 1
 ecfunstalls.com, 1
 echarity.ae, 1
 echarlascartas.es, 1
@@ -29083,7 +28804,6 @@ echternach-immobilien.de, 1
 echtes-hutzelbrot.de, 1
 echtgeld-casino.com, 0
 ecigfind.com, 1
-ecir.pro, 1
 ecir.ru, 1
 ecirtam.net, 1
 eciso.io, 1
@@ -29129,7 +28849,7 @@ ecohimdv.tk, 1
 ecohostingservices.uk, 1
 ecolala.my, 1
 ecole-attalens.ch, 0
-ecole-iaf.fr, 1
+ecole-iaf.fr, 0
 ecoledusabbat.org, 0
 ecolemathurincordier.com, 0
 ecolesrec.ch, 0
@@ -29161,6 +28881,7 @@ ecorp-australia.tk, 1
 ecorp.cc, 1
 ecos-ev.de, 1
 ecos.srl, 1
+ecosdanoticia.net.br, 1
 ecoshare.info, 1
 ecoskif.ru, 1
 ecosoftconsult.com, 0
@@ -29184,7 +28905,6 @@ ecr-test-partnapp.azurewebsites.net, 1
 ecrandouble.ch, 0
 ecredits-dev-app-backoffice01.azurewebsites.net, 1
 ecredits-dev-app-partner01.azurewebsites.net, 1
-ecriminalrecords.com, 1
 ecrownoffire.com, 1
 ecstaticentertainment.com, 1
 ecsupplyinc.com, 1
@@ -29209,7 +28929,6 @@ eddie.website, 1
 eddmil.es, 1
 eddokloosterman.com, 1
 eddsworld.tk, 1
-eddy-vh.com, 1
 eddyn.net, 1
 edeals.co, 1
 edeals.co.com, 1
@@ -29285,7 +29004,6 @@ edservicing.com, 1
 edshogg.co.uk, 1
 edsinet.com, 0
 edsm.net, 1
-edstem.org, 1
 edstep.com, 1
 edtech-hub.com, 1
 edtech.ee, 1
@@ -29318,6 +29036,7 @@ educators.co.nz, 1
 educatoys.com.br, 1
 educbook.ga, 1
 eductf.org, 1
+edufrog.it, 1
 edugundavetiyesi.com, 1
 eduid.se, 0
 eduif.nl, 0
@@ -29325,7 +29044,6 @@ edulinks.ml, 1
 edumaster.pro, 1
 edunaut.com.au, 1
 edunet.gq, 1
-edupool.in, 1
 eduproject.tk, 1
 eduroam.no, 1
 eduroam.uy, 1
@@ -29371,7 +29089,6 @@ ee632.com, 1
 ee651.com, 0
 ee652.com, 0
 ee6729.co, 1
-ee6729.com, 1
 ee6957.co, 1
 ee735.com, 1
 ee736.com, 1
@@ -29400,7 +29117,6 @@ eesti.xyz, 1
 eet.nu, 1
 eewna.org, 1
 eez.ee, 1
-ef-georgia.org, 1
 ef.gy, 1
 efaas.nl, 1
 efag.com, 1
@@ -29496,6 +29212,7 @@ egretail.no, 0
 egrojsoft.info, 1
 egrp365.ru, 1
 egsl.pro, 1
+egt.ee, 1
 egw-ceramica.de, 1
 egweb.tv, 1
 egypte.tk, 1
@@ -29508,8 +29225,6 @@ ehaccp.it, 1
 ehazi.hu, 1
 ehbsecuritydavy.be, 1
 ehbssl.com, 1
-ehcommerce.com, 1
-ehcommerce.org, 1
 ehealth.gov.au, 1
 eheliche-disziplin.schule, 1
 ehipaa.com, 1
@@ -29629,6 +29344,7 @@ ekrana.info, 1
 ekranos.me, 1
 ekre.club, 1
 eksisozluk.com, 1
+eksk.pl, 1
 ekspoint-mods.ru, 1
 eku.com.tr, 1
 ekvastra.in, 1
@@ -29670,7 +29386,6 @@ elcambiador.es, 1
 elchamandelaprosperidad.org, 1
 elcin.tk, 1
 elcontadorsac.com, 1
-eldapoint.co.uk, 1
 eldenelesat.com, 1
 eldercare.gov, 1
 elderjustice.gov, 1
@@ -29793,7 +29508,6 @@ electrotainment.com, 1
 electroworld.cz, 1
 electrum.org, 1
 eled.io, 1
-elefantebrasil.com.br, 1
 elefantevoador.com, 1
 elegance-sm.com, 1
 eleganceperfumes.com.br, 1
@@ -29803,7 +29517,6 @@ eleicoes2014.com.br, 1
 eleicoes2016.com.br, 1
 eleicoes2018.com, 1
 elejordemarketingconsultancy.com, 1
-eleken.jp, 1
 elekharris.com, 1
 elektrische-zahnbuerste24.de, 1
 elektro-adam.de, 1
@@ -29874,11 +29587,13 @@ eleonrp.tk, 1
 elephantia.cf, 1
 elephants.net, 1
 elephants.tk, 1
+elephantstone.net, 1
 elepover.com, 1
 eletesstilus.hu, 1
 eletminosegert.ro, 1
 eletor.com, 1
 eletor.pl, 1
+eletricista.biz, 1
 eletrochape.com.br, 1
 elettricista-roma.it, 1
 elettricista-roma.org, 1
@@ -29916,6 +29631,7 @@ elherraderoloscabos.com, 1
 elhorizontal.com, 1
 elhossari.com, 1
 elias-erdmann.tk, 1
+eliasfox.com, 1
 eliaskordelakos.com, 1
 eliasojala.me, 1
 eliasong.com, 1
@@ -29931,9 +29647,9 @@ eligibleapi.com, 1
 eligrey.com, 1
 elijahgrey.com, 1
 elikers.ml, 1
-elimer.com.ve, 1
 eliminercellulite.com, 1
 elimitecreamforsale.ga, 1
+elinahafer.de, 1
 elindependiente.co.cr, 1
 eline168.com, 1
 elinevanhaaften.nl, 1
@@ -29991,6 +29707,7 @@ ellhofen-peccioli.de, 1
 elligre.tk, 1
 ellinaras.tk, 1
 elliot.cat, 1
+elliottbernstein.com, 1
 ellipsoid.cf, 1
 elliquiy.com, 1
 ellisamusements.co.uk, 1
@@ -30026,6 +29743,7 @@ eloxt.com, 1
 elpaseadordeperros.com, 1
 elpo.net, 1
 elpoderdelespiritu.org, 1
+elpueblo.com.do, 1
 elradiobuffet.tk, 1
 elradix.be, 1
 elradix.eu, 1
@@ -30047,6 +29765,7 @@ elsuccionador.com, 1
 elsvanderlugt.nl, 1
 elsword.moe, 0
 eltair.com, 1
+eltd.com.vn, 1
 eltern-verein.ch, 1
 elternbeiratswahl.online, 1
 elternforum-birmensdorf.ch, 1
@@ -30110,6 +29829,7 @@ embassycargo.eu, 1
 embebelo.com, 1
 embellir-aroma.com, 1
 embellir-kyujin.com, 1
+embello.co.uk, 1
 emberlife.com, 1
 embodiaacademy.com, 1
 embodiaapp.com, 1
@@ -30128,15 +29848,16 @@ emdadkhodrokaraj.ir, 1
 emdrupholm.dk, 1
 emecew.com, 1
 emedos.es, 1
-emeliefalk.se, 1
 emeliemai.com, 1
 ememsei.com, 1
 emeraldcbdshop.com, 0
 emeraldcityswagger.com, 1
 emeraldcoasturgentcare.com, 1
+emeraldislerealty.com, 1
 emergency-federal-register.gov, 1
 emergencycommand.us, 1
 emergencyshutoff.com, 1
+emergenzaduepuntozero.it, 1
 emergesydney.com.au, 1
 emero.de, 1
 emersoncanada.ca, 1
@@ -30160,6 +29881,7 @@ emils-1910.de, 1
 emils-chemnitz.de, 1
 emils1910.de, 1
 emilstahl.com, 1
+emilstahl.de, 1
 emilstahl.dk, 1
 emilvarga.com, 1
 emily.moe, 1
@@ -30226,14 +29948,9 @@ employer411.com, 1
 employersupport.co.uk, 1
 employmax.co.za, 1
 employmaxetd.co.za, 1
-employment-applicant.com, 1
 employment.uk.com, 1
 employmentlawworldview.com, 1
 emporikonathenshotel.com, 1
-emporiodascalcinhas.com.br, 1
-emporiodosperfumes.com.br, 1
-emporioonline.com.br, 1
-emporiopatanegra.com.br, 1
 emporioviverbem.com.br, 0
 empower.net, 1
 empowerdb.com, 1
@@ -30261,6 +29978,7 @@ emsa-casm.ca, 1
 emsliespharmacy.com.au, 1
 emsrealfood.nl, 1
 emtradingacademy.com, 1
+emulationking.com, 1
 emulator.ml, 1
 emulovers.com, 1
 emulsifier.ga, 1
@@ -30348,7 +30066,6 @@ energy-drink-magazin.de, 1
 energy-fm.tk, 1
 energy-healings.com, 1
 energy-in-balance.eu, 1
-energy-initiative.com, 1
 energy-robotics.com, 1
 energy.gov, 1
 energyatlas.com, 1
@@ -30399,6 +30116,7 @@ engie-laadpalen.nl, 1
 engiedev.net, 1
 engima.nl, 1
 engineeringbigdata.com, 1
+engineowning.com, 1
 enginepit.com, 1
 enginsight.com, 1
 enginx.net, 1
@@ -30406,6 +30124,7 @@ engione.com, 1
 engl-server.de, 1
 engl-systems.de, 1
 englandbeach.com, 1
+english-biography.com, 1
 english-to-russian-translation.tk, 1
 english-training.tk, 1
 englishbulgaria.net, 1
@@ -30441,9 +30160,9 @@ enjinwallet.io, 1
 enjinx.cn, 1
 enjinx.io, 1
 enjoy-drive.com, 1
-enjoymondayofficial.com, 1
 enjoytech.fr, 1
 enjoytransferitalia.com, 1
+enlace.vip, 1
 enlacesgranotas.tk, 1
 enlamochiladeadri.com, 1
 enlight.no, 1
@@ -30453,7 +30172,6 @@ enlnf.link, 1
 enloestatebank.com, 1
 enlyft.com, 0
 ennea-mediation.fr, 1
-enness.co.uk, 1
 ennori.jp, 1
 enns-photography.com, 1
 enodais.gr, 1
@@ -30466,6 +30184,7 @@ enot32.ru, 1
 enotecastore.it, 1
 enotefile.com, 1
 enotovil.ru, 1
+enoxhzwh.eu, 1
 enpalmademallorca.info, 1
 enpasenerji.com.tr, 1
 enquetebeteiligung.de, 1
@@ -30478,6 +30197,7 @@ enriqueferreira.com, 1
 enriquepiraces.com, 1
 enrollapp.com, 1
 ensage.io, 1
+ensaladasvinagreta.com, 1
 enscosupply.com, 1
 ensemble-rubato.de, 1
 ensembling.com, 1
@@ -30516,6 +30236,7 @@ entrainr.com, 1
 entrecieletpierres.com, 0
 entrenossocialinfo.com, 1
 entreprenet.gq, 1
+entrezdansladanse.fr, 1
 entropia.de, 0
 entropy.su, 1
 entrup.io, 1
@@ -30538,6 +30259,7 @@ enviroli.uk, 1
 environment.ai, 1
 environmental-colleges.com, 1
 enviroprobasements.com, 1
+envisionsproperty.com, 1
 envisolarvind.tk, 1
 envman.io, 1
 envoie.moi, 1
@@ -30580,7 +30302,6 @@ epaygateway.net, 1
 epcomputacion.com.ar, 1
 epcreport.net, 1
 epdeveloperchallenge.com, 1
-eperniagaan.com, 1
 ephesusbreeze.com, 1
 epi-lichtblick.de, 1
 epi.no, 1
@@ -30601,7 +30322,6 @@ epicfail.be, 1
 epicginger.fi, 1
 epichouse.net, 0
 epicinflatables.co.uk, 1
-epickitty.co.uk, 1
 epiclub.com.au, 1
 epicmoney.tk, 1
 epicmusicradio.ml, 1
@@ -30697,9 +30417,8 @@ equinenow.com, 1
 equinetherapy.ca, 1
 equinox.io, 1
 equip-test.com, 1
-equipandoloja.net.br, 1
+equipamentosparapostos.com.br, 1
 equipedefrance.tv, 0
-equipeferramentas.com.br, 1
 equipoweb.info, 1
 equippers.de, 1
 equisecu.com, 1
@@ -30731,6 +30450,7 @@ ereader.uno, 1
 erector.tk, 1
 erektion1.gq, 1
 eremnews.com, 1
+erenvakfi.org, 1
 erethon.com, 1
 erevan-news.tk, 1
 erf-neuilly.com, 1
@@ -30741,7 +30461,6 @@ ergobyte.eu, 1
 ergobyte.gr, 1
 ergodark.com, 1
 ergoterapeutas.lt, 1
-ergovita.com.br, 1
 ergowish.com, 1
 eriador.io, 1
 eric-kolelas.tk, 1
@@ -30753,12 +30472,13 @@ ericfo.cf, 1
 erichoekstra.com, 1
 erichoekstra.nl, 1
 erichogue.ca, 1
+erichoins.com, 1
 erichorstmanshof.nl, 1
 erichware.tk, 1
 ericjohnltd.com, 1
 erick.blog, 1
 ericksonvasquez.com, 1
-ericleuthardt.com, 1
+ericlight.com, 1
 ericloud.tk, 1
 ericoc.com, 1
 erics.site, 1
@@ -30780,7 +30500,6 @@ erikkruithof.nl, 1
 eriksen.im, 1
 erikserver2.tk, 1
 erikseth.de, 1
-erikw.me, 1
 erinaceinae.com, 1
 eriner.me, 1
 eringmaguire.com, 1
@@ -30791,6 +30510,7 @@ erisys.net, 1
 erkaelderbarenaaben.dk, 1
 erkenntniswen.de, 1
 erkiss.live, 1
+erkkiaronen.fi, 1
 erlebnisarchaeologie-bayern.de, 1
 erman.ga, 1
 ermitano.cf, 1
@@ -30847,6 +30567,7 @@ erudicia.se, 1
 erudicia.uk, 1
 erudikum.cz, 1
 erudio-usluge.hr, 1
+erulezz.nl, 1
 ervaarjapan.nl, 1
 ervinthagod.xyz, 1
 ervirmaison.tk, 1
@@ -30872,6 +30593,7 @@ es9999.net, 1
 esaborit.ddns.net, 0
 esagente.com, 1
 esailinggear.com, 1
+esajokinen.net, 1
 esalesclub.com, 1
 esalesdata.com, 1
 esamievalori.com, 1
@@ -30909,6 +30631,7 @@ esb333.net, 1
 esb336.com, 1
 esb369.com, 0
 esb433.com, 1
+esb518.com, 1
 esb553.com, 1
 esb555.biz, 1
 esb555.cc, 1
@@ -30917,7 +30640,6 @@ esb556.com, 1
 esb5889.com, 1
 esb6.net, 1
 esb666.com, 1
-esb66666.com, 1
 esb677.net, 1
 esb688.com, 1
 esb68888.com, 1
@@ -31027,7 +30749,6 @@ esdiscuss.org, 1
 esea.com.br, 1
 eseances.ch, 1
 esehospitalsabanagrande.com, 1
-esemprego.com.br, 1
 eservices-greece.com, 1
 eset.ml, 1
 eseth.de, 1
@@ -31156,10 +30877,8 @@ estafallando.es, 1
 estafallando.mx, 1
 estahl.dk, 1
 estaleiro.org, 1
-estalinas.com, 1
 estallidodigital.cl, 1
 estan.cn, 1
-estaryshop.com.br, 1
 estate360.co.tz, 1
 estateczech-eu.ru, 1
 estcequejailaflemme.fr, 0
@@ -31172,12 +30891,10 @@ estela-artes.com, 1
 esteladigital.com, 1
 esteriliza-me.org, 1
 esterilizacion-perros.es, 1
-esteticanorte.com.br, 1
 estetici.com, 1
 estetista.net, 1
 esthe-zukan.com, 1
 estherlew.is, 1
-estilopack-loja.com.br, 1
 estimulantesbrasil.com, 1
 estintori.roma.it, 1
 estonia.net, 1
@@ -31254,7 +30971,6 @@ eth-services.de, 1
 eth0.nl, 0
 eth1.fi, 1
 etha.nz, 1
-ethack.org, 1
 ethaligan.fr, 1
 ethan.pm, 1
 ethanjones.me, 1
@@ -31267,6 +30983,7 @@ ethercalc.org, 1
 etherderbies.com, 1
 ethereal.games, 1
 etherium.org, 1
+ethernia.fr, 1
 ethernium.fun, 1
 etheron.com, 1
 etherpad.nl, 1
@@ -31289,6 +31006,7 @@ etienne.cc, 1
 etiennes.work, 1
 etikus-hacker.hu, 1
 etincelle.ml, 1
+etindustries.com, 1
 etiquetaunica.com.br, 1
 etkaddict.com, 1
 etkarle.de, 1
@@ -31307,8 +31025,8 @@ etrolleybizstore.com, 1
 ets2mp.de, 1
 etskinner.com, 1
 etskinner.net, 1
-etsservicios.com, 1
 ettbl.net, 1
+ettebiz.com, 1
 etudesbibliques.fr, 0
 etudesbibliques.net, 0
 etudesbibliques.org, 0
@@ -31482,6 +31200,7 @@ evdenevenakliyatankara.name.tr, 1
 eve-online-com.ru, 1
 eve-raynon.fr, 1
 eve-ua.com, 1
+eve.pub, 1
 eveco-mebel.ga, 1
 evedanjailbreak.com, 1
 eveil-et-savoirs.com, 1
@@ -31517,7 +31236,6 @@ eveonline.com, 1
 ever.sale, 1
 everain.me, 1
 everberg.tk, 1
-everettsautorepair.com, 1
 everfine.com.tw, 1
 evergarden.cn, 1
 evergladesrestoration.gov, 1
@@ -31532,7 +31250,6 @@ everling.lu, 1
 everlong.org, 1
 evermarkstudios.com, 1
 evernaut.com, 1
-everpcpc.com, 1
 everseo.tk, 1
 evertonarentwe.com, 1
 everwaking.com, 0
@@ -31560,6 +31277,7 @@ everysync.co.jp, 1
 everything-everywhere.com, 1
 everythingaccess.com, 1
 everythingbarca.com, 1
+everythingcebu.com, 1
 everythinginoneblog.gq, 1
 everythingstech.com, 1
 everythinq.com, 1
@@ -31575,7 +31293,6 @@ evhoeft.com, 1
 eviction.cf, 1
 evidence-based.review, 1
 evidencebased.net, 1
-evidenceusa.com.br, 1
 evidencija.ba, 1
 evil-empire.tk, 1
 evilbeasts.ru, 1
@@ -31623,6 +31340,7 @@ evomada.com, 1
 evomon.com, 1
 evony.eu, 1
 evoplay.gq, 1
+evosnine.xyz, 1
 evosyn.com, 1
 evote-ch.ch, 1
 evotec.pl, 1
@@ -31676,6 +31394,7 @@ exablue.de, 1
 exactlyinfinite.com, 1
 exactphilosophy.net, 1
 exadime.net, 1
+exaduosport.fr, 1
 exagoni.com.au, 1
 exagoni.com.my, 1
 exaktus.pt, 1
@@ -31713,7 +31432,6 @@ exceptionalservices.us, 1
 excerp.tech, 1
 excess-baggage.com, 1
 excessamerica.com, 1
-excesssecurity.com, 0
 exchangers.top, 1
 exchaser.com, 1
 exciters.tk, 1
@@ -31722,6 +31440,7 @@ exclusive-world.tk, 1
 exclusivebeautystudio.com.au, 1
 exclusivebouncycastles.co.uk, 1
 exclusivedesignz.com, 1
+exclusivityglobal.tech, 1
 excluzive.ml, 1
 excursionescaribe.com, 1
 exdamo.de, 1
@@ -31781,6 +31500,7 @@ expatfinancial.com.hk, 1
 expatfire.com, 1
 expatmortgage.uk, 1
 expe.voyage, 1
+expectation.management, 1
 expeditiegrensland.nl, 0
 expeditions.com, 0
 experens.com, 1
@@ -31812,7 +31532,6 @@ expiscor.solutions, 1
 explicate.org, 1
 explodie.org, 1
 explodingcamera.com, 1
-exploflex.com.br, 1
 exploit-db.com, 1
 exploit.cz, 0
 exploit.party, 1
@@ -31893,6 +31612,7 @@ exteriorlightingwestlakevillage.com, 1
 exteriorroofwindowguttercleaning.com, 1
 exteriorservices.io, 1
 externer-datenschutzbeauftragter-bochum.de, 1
+extienso.com, 1
 extinctionrebellion.de, 1
 extintormadrid.com, 1
 extirosli.ga, 1
@@ -31949,6 +31669,7 @@ eyep.me, 1
 eyes-berg.com, 0
 eyesandearsrescue.org, 1
 eyescratch.tk, 1
+eyeshield-informatique.tech, 1
 eyespecialistsofla.com, 1
 eyetooth.ga, 1
 eyktasarim.tk, 1
@@ -31998,6 +31719,7 @@ f1classement.com, 0
 f1distribution.com, 1
 f1fever.co.uk, 1
 f1fever.net, 1
+f1iran.com, 1
 f1minute.com, 1
 f1nal-lap.be, 1
 f1simulator.tk, 1
@@ -32100,18 +31822,20 @@ fabbro-roma.org, 1
 fabbro.roma.it, 1
 fabdiz.com, 1
 fabelturen.tk, 1
-faber.org.ru, 1
+faber.org.ru, 0
 fabian-fingerle.de, 1
 fabian-klose.com, 1
 fabian-klose.de, 1
 fabian-klose.net, 1
 fabian-kluge.de, 1
+fabian-zoske.de, 1
 fabian.gq, 1
 fabianackle.ch, 1
 fabianasantiago.com, 1
 fabianbeiner.com, 1
 fabianbeiner.de, 0
 fabianegli.ch, 1
+fabianfranke.de, 1
 fabiankaindl.de, 0
 fabiankoeppen.com, 1
 fabianni.tk, 1
@@ -32124,6 +31848,7 @@ fabjansisters.eu, 1
 fabled.com, 1
 fableforge.nl, 1
 fableheartmedia.com, 1
+fabricadeobsequiosimpresores.com, 1
 fabriceleroux.com, 0
 fabriciomoreira.ga, 1
 fabrika.com.br, 1
@@ -32141,8 +31866,7 @@ fac.fi, 1
 faca.gov, 1
 facai666.cc, 1
 facai888.cc, 1
-facanabota.com, 1
-facanabota.com.br, 1
+facan-godollo.hu, 1
 facarospauls.com, 1
 facchinaggio.milano.it, 1
 facchinaggio.roma.it, 1
@@ -32182,7 +31906,6 @@ fachversand-hennes.de, 1
 facialexercising.com, 1
 facialparalysisnetwork.ga, 1
 facil.services, 0
-faciledireto.com.br, 1
 facilities.fr, 1
 facilitiessurvey.org, 1
 facilitrak.com, 1
@@ -32195,6 +31918,7 @@ fackovec.cz, 1
 fackovec.eu, 1
 fackovec.sk, 1
 factbytefactbox.com, 1
+factis.com, 1
 factor.cc, 0
 factoriadifacil.com, 1
 factorio.tools, 1
@@ -32274,17 +31998,16 @@ fairyth.tk, 1
 faithcentercogop.net, 1
 faithfuladvisor.com, 1
 faithfulroad.org, 1
-faithgrowth.com, 1
 faithindemocracy.eu, 1
 faithleaks.org, 1
 faithwatch.org, 1
-faixaazul.com, 1
 faizan.net, 1
 faizan.xyz, 1
 faizanullah.com, 1
 fajode.net, 1
 fake-show.ga, 1
 fakeapple.nl, 1
+fakebusters.club, 1
 faked.org, 1
 fakeemergency.com, 1
 fakel.ga, 1
@@ -32375,10 +32098,12 @@ familyrecipe.co.uk, 1
 familytreehq.com, 1
 familyworld.gr, 1
 famion.eu, 0
+fammamtl.com, 1
 famosas.cf, 1
 famousbirthdays.com, 1
 famouscelebsurgery.net, 1
 famoushostels.com, 1
+famousit.nl, 1
 famouspdf.gq, 1
 famvangelder.nl, 1
 famvsomeren.nl, 1
@@ -32479,7 +32204,6 @@ fareast.tk, 1
 fareinternational.com, 1
 faretravel.co.uk, 1
 faretrotter.com, 1
-farfallapets.com.br, 1
 farfetchos.com, 1
 farfor.tk, 1
 fargtorget.se, 1
@@ -32514,6 +32238,7 @@ farrel-f.tk, 1
 farrelf.blog, 1
 farsil.eu, 1
 farthing.xyz, 1
+farumbedandbreakfast.dk, 1
 farwat.ru, 1
 farzli.com, 0
 fascat.com, 1
@@ -32536,20 +32261,14 @@ fashionhijabers.com, 1
 fashionlistify.tk, 1
 fashionsuits.tk, 1
 fashiontrendsetter.com, 1
-fashionunited.be, 1
 fashionunited.cl, 1
 fashionunited.com, 1
 fashionunited.com.ar, 1
-fashionunited.de, 1
 fashionunited.fi, 1
 fashionunited.hk, 1
 fashionunited.hu, 1
-fashionunited.ie, 1
 fashionunited.lu, 1
-fashionunited.mx, 1
-fashionunited.nl, 1
 fashionunited.no, 1
-fashionunited.nz, 1
 fashionunited.pl, 1
 fashionunited.se, 1
 fashionusa.gq, 1
@@ -32578,7 +32297,6 @@ fastbob.tk, 1
 fastcash.com.br, 1
 fastcast.ga, 1
 fastcomcorp.com, 1
-fastcommerce.org, 1
 fastconfirm.com, 1
 fastconv.com, 1
 fastcp.top, 1
@@ -32612,7 +32330,6 @@ fathers4equalrights.org, 1
 fatidique.com, 1
 fatiguesyndrome.com, 1
 fatihingemisi.com, 1
-fatimamoldes.com.br, 1
 fatmixx.com, 1
 fator25.com.br, 1
 fatowltees.com, 1
@@ -32625,6 +32342,7 @@ fau8.ml, 1
 faucetbox.com, 0
 fauceton.tk, 1
 faucetslist.tk, 1
+faulkner2020.com, 1
 faultlines.org, 1
 faunahotel.cl, 1
 fauvettes.be, 1
@@ -32642,6 +32360,7 @@ fayamovies.tk, 1
 faydali.org, 1
 fayettecountyoh.gov, 1
 fayntic.com, 1
+faysalabdi.fi, 1
 fazzfinancial.com, 1
 fb-feed.net, 1
 fb-lab.de, 1
@@ -32686,6 +32405,7 @@ fcic.gov, 1
 fcingolstadt.de, 1
 fcitasc.com, 1
 fcosinus.com, 1
+fcpn.org, 1
 fcprovadia.com, 1
 fcsic.gov, 1
 fdalawboston.com, 1
@@ -32706,7 +32426,6 @@ fdp-brig-glis.ch, 1
 fdpbrig.ch, 1
 fdremodelingatlanta.com, 1
 fdresearch.ca, 1
-fdsl.eu, 1
 fdworlds.com, 1
 fe-data.nl, 1
 feac.us, 1
@@ -32721,7 +32440,6 @@ feat.agency, 1
 featherweightlabs.com, 1
 featuredmen.com, 1
 feb.gov, 1
-febeditora.com.br, 1
 fed-shashek.spb.ru, 1
 fed51.com, 1
 fedbizopps.gov, 1
@@ -32766,6 +32484,7 @@ feelgood-workouts.de, 1
 feelgood.com.tw, 1
 feelgoodwatches.com, 1
 feelingmassage.nl, 0
+feelmingo.com, 1
 feelmom.com, 1
 feelnet.top, 1
 feeltennis.net, 1
@@ -32827,6 +32546,7 @@ felixqu.com, 1
 felixsanz.com, 1
 felixseele.de, 1
 felixsworld.tk, 1
+felixvelarde.com, 1
 felsenheimer.tk, 1
 felsing.net, 1
 feltons.me, 1
@@ -32893,7 +32613,6 @@ ferieservice.dk, 1
 feriespotter.dk, 1
 ferlc.org, 1
 ferm-rotterdam.nl, 1
-fermabel.com.br, 1
 fermanacuratampaparts.com, 1
 fermanaghomagh.com, 1
 fermastore.cf, 1
@@ -32925,6 +32644,7 @@ fespad.org.sv, 1
 festaprylar.se, 1
 festerculiacan.com, 1
 festesuniversitaries.tk, 1
+festicle.com, 1
 festival-tipps.com, 1
 festival-transform.com, 1
 festival-transform.fr, 1
@@ -32935,7 +32655,6 @@ festivaljapon.com, 1
 festivalpopayan.tk, 1
 festivalsalmondeoro.tk, 1
 festivalsrit.tk, 1
-festizen.com, 0
 festrentcar.pl, 1
 festx.co.za, 1
 fetawerelddans.tk, 1
@@ -33088,7 +32807,6 @@ fierykitchen.pl, 1
 fiestagenial.com, 1
 fietsenbijauke.nl, 1
 fietskr.at, 1
-fietsvierdaagsen.nl, 1
 fifacup.ga, 1
 fifastars.tk, 1
 fifautstore.com, 1
@@ -33136,6 +32854,7 @@ filedesc.com, 1
 filedoom.ml, 1
 filehash.de, 1
 filehippo.com, 1
+fileho.st, 1
 fileio.io, 1
 filejet.io, 1
 filek.ga, 1
@@ -33164,6 +32883,7 @@ filipinadating.online, 1
 filipinasdailynews.tk, 1
 filipinochinese.tk, 1
 filippo.io, 1
+filipposalvioni.com, 1
 filipsebesta.com, 1
 filleritemsindia.com, 1
 filli-it.ch, 1
@@ -33230,6 +32950,7 @@ finda.ae, 1
 findaffordablehousing.ca, 1
 findapinball.com, 1
 findautoloan.ml, 1
+findcarspecs.com, 0
 finde-kleinanzeigen.de, 1
 findelahistoria.com, 1
 findheim.at, 1
@@ -33288,7 +33009,6 @@ finlandcook.top, 1
 finlito.tk, 1
 finmarket.tk, 1
 finn-svoboda.cf, 1
-finn-thorben.me, 1
 finn.io, 1
 finnclass.cz, 1
 finneas.net, 1
@@ -33435,6 +33155,7 @@ fishtacos.blog, 1
 fishycam.com, 1
 fishygames.ml, 1
 fishyscans.tk, 1
+fishystuff.cf, 1
 fisinfomanagerdr.com, 1
 fisiobox.eu, 1
 fisioterapista.roma.it, 1
@@ -33478,7 +33199,6 @@ fix-ru.ga, 1
 fix-the-timeline.com, 1
 fix-the-timeline.org, 1
 fix.mk, 1
-fixatom.com, 1
 fixdiabetesnaturally.com, 1
 fixed.supply, 1
 fixed.tech, 1
@@ -33501,11 +33221,9 @@ fizjoterapia.uk, 1
 fizyoterapi.name.tr, 1
 fizz.buzz, 0
 fizzgi.gs, 1
-fj.je, 1
 fj.search.yahoo.com, 0
 fjchamber.org, 1
 fjco.alsace, 1
-fjdekermadec.com, 1
 fjharcu.com, 1
 fjordboge.dk, 1
 fjsb.com, 1
@@ -33523,6 +33241,8 @@ flagburningworld.com, 1
 flagfox.net, 1
 flaggorvarlden.se, 1
 flagi-panstw.pl, 1
+flagipanstw.info.pl, 1
+flagipanstw.pl, 1
 flagistrany.ru, 1
 flagpedia.asia, 1
 flagpedia.net, 1
@@ -33564,7 +33284,6 @@ flashgamedev.tk, 1
 flashgot.net, 1
 flashtek-uk.com, 1
 flass.lu, 1
-flassetlocators.com, 1
 flat.io, 1
 flatart.pl, 1
 flatbellyreview.com, 1
@@ -33614,6 +33333,7 @@ fletcherdigital.com, 1
 fletchmusic.tk, 1
 fletchto99.com, 1
 fletemaritimo.online, 1
+fletesymudanzasbaratas.com, 1
 flets-ms.com, 1
 fleurenplume.fr, 1
 fleurette.me, 1
@@ -33632,10 +33352,10 @@ flexinvesting.fi, 1
 flexport.com, 1
 flexstart.me, 1
 flextribly.xyz, 1
+flexussolucoes.com.br, 1
 flexve.com, 1
 flfl.de, 1
 fliacuello.com.ar, 1
-flibusta.appspot.com, 1
 flicerdowneh.cf, 1
 flickcritter.com, 1
 flickor.tk, 1
@@ -33669,19 +33389,16 @@ flipsidevr.com, 1
 fliptable.org, 1
 flipweb.tk, 1
 flirt-norden.de, 1
-flirtee.net, 1
 flirtfaces.de, 1
 flirtportalcheck24.de, 1
+flixcheck.de, 1
 flixcost.com, 1
 flixflex.tk, 1
 flixports.com, 1
-flixsave.com, 1
 flixstats.com, 1
-flmortgagebank.com, 1
 floaternet.com, 1
 floatifnghotel.cf, 1
 floating-holidays.co.uk, 1
-floating-journey-64892.herokuapp.com, 1
 flockbox.club, 1
 flocktofedora.org, 1
 floersheimer-openair.de, 1
@@ -33770,6 +33487,7 @@ flowreader.com, 1
 flowscale.com, 1
 flox.io, 1
 flra.gov, 1
+flubio.de, 1
 flucky.xyz, 1
 fluconazole.gq, 1
 fluffy.moe, 1
@@ -33779,6 +33497,7 @@ fluglektuere.com, 1
 flugplatz-edvc.de, 1
 flugrecht.de, 1
 flugschule-usa.de, 1
+fluidbb.co.uk, 1
 fluidmeterusa.com, 1
 fluidpicturesinc.com, 1
 fluids.ac.uk, 1
@@ -33798,13 +33517,13 @@ fluxforge.com, 1
 fluxi.fi, 1
 fluxoid.com, 1
 flvyingeagle.ga, 1
-flw365365.com, 1
 fly-en-drive.nl, 1
 fly.moe, 1
 flyadrenaline.com, 1
 flyavantar.com, 1
 flyawaybirds.ga, 1
 flyboyfpv.com, 1
+flycheaps.com, 1
 flydrivesicilie.nl, 1
 flyer.tools, 1
 flygon.pink, 1
@@ -33839,7 +33558,6 @@ fmbilder.se, 1
 fmc.gov, 1
 fmcs.gov, 1
 fmdance.cl, 1
-fmeventcentre.com, 1
 fmi.gov, 1
 fminsight.net, 1
 fmm-creative.com, 1
@@ -33894,7 +33612,6 @@ fol.tf, 1
 folar.ga, 1
 folclore.tk, 1
 folio.no, 1
-foliumbiosciences.com, 1
 foliumfinance.com, 1
 foljeton.dk, 1
 folk.as, 1
@@ -33986,6 +33703,7 @@ forcelinkamerica.com, 1
 forcelinkamerica.nl, 1
 forcerakodo.hu, 1
 forces.army, 1
+forcewaterproofing.com, 1
 forcewave.com, 1
 ford-mustang.tk, 1
 ford-shop.by, 1
@@ -34018,7 +33736,7 @@ forestcermegresik.com, 1
 forestraven.net, 1
 forever.gq, 1
 forevermuslim.in, 1
-forevermuslim.store, 1
+foreverreem.com, 1
 foreverssl.com, 1
 foreversummertime.com, 1
 foreverydream.com, 1
@@ -34069,7 +33787,6 @@ formulastudent.de, 1
 fornoreason.net.au, 1
 fornwall.net, 1
 foro.io, 0
-foroaranda.com, 1
 forodeespanol.com, 1
 forodieta.com, 0
 forojovensanfernando.tk, 1
@@ -34111,7 +33828,7 @@ fortress.sk, 1
 fortresslinux.com, 1
 fortresslinux.nl, 1
 fortresslinux.org, 1
-fortricks.in, 0
+fortricks.in, 1
 fortuna-apotheke-lahnstein.de, 1
 fortuna-loessnitz.de, 1
 fortuna-s.com, 1
@@ -34154,7 +33871,6 @@ foryourhealthybody.com, 1
 fos-apps.org, 1
 fos-games.org, 1
 fosaudit.com, 1
-foscamcanada.com, 1
 fosdem.org, 1
 foselectro.ru, 1
 fosgreece.com, 1
@@ -34178,6 +33894,7 @@ foto-janvanaefst.nl, 1
 foto-leistenschneider.de, 1
 foto-leitner.com, 1
 foto-leitner.de, 1
+foto-mario.de, 1
 foto-robitsch.at, 1
 foto-roma.ru, 1
 foto-znakomstva.ml, 1
@@ -34191,7 +33908,6 @@ fotofaerie.net, 1
 fotoflits.net, 1
 fotofon.tk, 1
 fotografechristha.nl, 1
-fotografiadellalucerossa.com, 1
 fotografiamakro.pl, 1
 fotografies.tk, 1
 fotografija.tk, 1
@@ -34201,9 +33917,11 @@ fotolectura.tk, 1
 fotoleitner.com, 1
 fotoleitner.de, 1
 fotomodel.cf, 1
+fotomodels.tk, 1
 fotonjan.com, 1
 fotonza.ru, 1
 fotopalacedigitalstudio.tk, 1
+fotopianka.pl, 1
 fotostravestisbr.com, 1
 fotostudio-leitner.com, 1
 fotostudio-leitner.de, 1
@@ -34227,6 +33945,7 @@ foundsounds.me, 1
 fourashesgolfcentre.co.uk, 1
 fourashesgolfcentre.com, 1
 fourashesgolfcentre.uk, 1
+fourcornerscb.com, 1
 fourdesignstudio.com, 1
 fourfourcrew.com, 1
 fourmies.fr, 1
@@ -34238,6 +33957,7 @@ fourwaysplumber24-7.co.za, 1
 fourxone.com, 1
 fousetmoney.tk, 1
 fowlsmurf.net, 1
+fox-zulu.de, 1
 fox.my, 0
 foxbnc.co.uk, 1
 foxbnc.uk, 1
@@ -34312,7 +34032,6 @@ franceactivetravel.cf, 1
 francepandi.fr, 1
 francesca-and-lucas.com, 1
 francescopalazzo.com, 1
-francescopandolfibalbi.it, 1
 francescoyatesfansite.com, 1
 francesfluente.cf, 1
 francetraceur.fr, 1
@@ -34321,14 +34040,12 @@ franchini.engineer, 1
 franchisehive.com, 1
 francinebelanger.network, 1
 francis.ph, 1
-franciscoviteripropiedades.com, 1
 francisli.net, 0
 francisplaza.com, 1
 franckgirard.net, 1
 francoexpeditionperu.com, 1
 francois-occasions.be, 0
 francoisbelangerboisclair.com, 1
-francoise-angelini.com, 1
 francoise-paviot.com, 1
 francoisharvey.ca, 1
 francoislepage.com, 0
@@ -34374,7 +34091,7 @@ frappant.cc, 1
 frappant.net, 1
 frasch-umzuege.de, 1
 fraselab.ru, 1
-fraserengineco.com, 1
+frasermurray.scot, 1
 frasesconemocion.com, 1
 frasesdodia.com, 1
 frasesdodia.net, 1
@@ -34403,8 +34120,8 @@ frbracch.it, 1
 frc.gov, 1
 frccsgo.tk, 1
 frdl.ch, 0
+freak-show.tk, 1
 freaksites.dk, 1
-freaksports.com.au, 0
 freakyawesome.agency, 1
 freakyawesome.art, 1
 freakyawesome.band, 1
@@ -34441,6 +34158,7 @@ frederikugarte.tk, 1
 frederikvig.com, 1
 fredhook.tk, 1
 fredloya.com, 1
+frednet.tk, 1
 fredriksslaktforskning.se, 1
 fredriksslekt.se, 1
 freds4buildings.com, 1
@@ -34480,6 +34198,7 @@ freebsdbrasil.com.br, 1
 freebus.org, 1
 freecam2cam.site, 1
 freecloud.at, 1
+freecn.xyz, 1
 freecodezilla.com, 1
 freecookies.nl, 1
 freecrypt.ga, 1
@@ -34510,6 +34229,7 @@ freefilesync.org, 1
 freefinancialhelp.net, 1
 freeform4u.de, 1
 freegame-mugen.jp, 1
+freegamesmac.com, 1
 freegovernmentcellphoneguide.com, 1
 freegutters.com, 1
 freeiconspng.com, 1
@@ -34535,7 +34255,6 @@ freelauri.com, 1
 freelifer.jp, 1
 freemagi.ga, 1
 freeman-online.tk, 1
-freemania.eu, 1
 freemania.nl, 1
 freemanlogistics.com, 1
 freemans.com, 1
@@ -34658,6 +34377,7 @@ freundinnen-ausflug.de, 1
 freundinnen-kurzurlaub.de, 1
 freundinnen-urlaub.de, 1
 freundinnenausflug.de, 1
+frfiber.com, 1
 frforms.com, 1
 friarsonbase.com, 1
 fribourgviking.net, 1
@@ -34703,6 +34423,7 @@ friezy.ru, 1
 frigi.ch, 0
 frign.de, 1
 frigolit.net, 1
+friherrsindemarit.fi, 1
 frikipedia.tk, 1
 friller.com.au, 1
 frillip.com, 1
@@ -34771,7 +34492,6 @@ frozencuisine.ga, 1
 frozendurian.club, 1
 frozenfutures.com, 1
 frozenjam.com, 1
-frozensector.com, 1
 frp-roleplay.de, 1
 frpg.gov, 1
 frprn.com, 1
@@ -34796,7 +34516,6 @@ fruition.co.jp, 1
 fruitscale.com, 1
 fruityten.co.uk, 1
 frusky.de, 1
-frusky.net, 1
 frutasyvejetales.com, 1
 fruxnux.net, 1
 fruxprivatebank.net, 1
@@ -34895,7 +34614,6 @@ fuentesdeleon.tk, 1
 fuer-gerechte-steuern.at, 1
 fuerstenfelder-immobilien.de, 1
 fuerzaazul.tk, 1
-fugioninc.com, 1
 fugle.de, 1
 fuglede.dk, 1
 fuite.ch, 0
@@ -34917,15 +34635,16 @@ fukushima-fun.com, 1
 fukushimacoffee.com, 1
 fulfilmentcrowd.com, 1
 fulgenzis.com, 1
+fulijiejie.com, 1
 fuliwang.info, 1
 fuliwang.us, 1
 full-race.com, 1
 full-stack.ninja, 1
-fullautomotivo.com.br, 1
 fullbajamode.com, 1
 fullbundle.com, 1
 fullcirclestudio.nl, 1
 fullerlife.org.uk, 1
+fullfilez.com, 1
 fullhost.com, 1
 fullhub.ru, 1
 fullmatch.net, 1
@@ -34933,6 +34652,7 @@ fullmetalconsulting.tk, 1
 fullmoondesignhouse.tk, 1
 fullsize.ml, 1
 fullstacknotes.com, 0
+fulltextarchive.com, 1
 fulltxt.ml, 1
 fully-hair.tk, 1
 fumblers.ca, 1
@@ -35032,7 +34752,6 @@ funidelia.se, 1
 funidelia.sg, 1
 funidelia.si, 1
 funidelia.sk, 1
-funinbeds.org.uk, 1
 funinfo.tk, 1
 funkazoid-radio.com, 1
 funken-networks.de, 1
@@ -35121,6 +34840,7 @@ fuseyahoken.com, 1
 fushee.com, 1
 fusionapps.com, 1
 fusionapps.net, 1
+fusionauth.io, 1
 fusionetics.plus, 1
 fusiongaming.de, 1
 fussball-xxl.de, 1
@@ -35172,7 +34892,6 @@ fwest.ovh, 1
 fwest98.nl, 1
 fwest98.ovh, 1
 fws.gov, 1
-fwz.me, 1
 fx-rating.com, 1
 fx-rk.com, 1
 fx110.com, 1
@@ -35299,7 +35018,7 @@ gabriele-kluge.de, 1
 gabriele.tips, 1
 gabrielemarino.tk, 1
 gabrielgn.com.br, 1
-gabrielkoo.com, 1
+gabrielkoo.com, 0
 gabriella.cf, 1
 gabrielsimonet.ch, 1
 gabrielsteens.nl, 1
@@ -35317,6 +35036,7 @@ gadanie.cf, 1
 gadatel.ml, 1
 gaddini.it, 1
 gadget-freak.cf, 1
+gadget-tips.com, 0
 gadgetadvisor.com, 1
 gadgetanda.com, 1
 gadgetflip.com, 1
@@ -35348,7 +35068,7 @@ gagne.tk, 1
 gagnerenfant.tk, 1
 gagnerplusdargent.info, 1
 gagniard.org, 1
-gagor.pl, 0
+gagor.pl, 1
 gagramore.cf, 1
 gagygnole.ch, 0
 gaiafood.co, 1
@@ -35392,7 +35112,6 @@ galaxymedia.tk, 1
 galaxymimi.com, 1
 galaxymusicpromo.com, 1
 galaxyplex.tk, 1
-galaxyscientific.com, 1
 galenreasoner.com, 1
 galeria42.com, 1
 galeriabunkers.tk, 1
@@ -35433,8 +35152,6 @@ gallifreypermaculture.com.au, 1
 gallmeyer-consulting.com, 1
 gallun-shop.com, 1
 galoserver.org, 1
-galpaoap.com.br, 1
-galvincdn.com, 1
 galvingao.com, 1
 gamagam.gq, 1
 gamanlu.com, 1
@@ -35647,7 +35364,6 @@ gardenstate.tech, 1
 gardikagigih.com, 1
 gardis.ua, 1
 garduri-electrice-animale.ro, 1
-garedtech.com, 0
 garethbowker.com, 1
 garethkirk.com, 1
 garethrhugh.es, 1
@@ -35674,6 +35390,7 @@ garycarmell.com, 1
 garyjones.co.uk, 1
 garyrh.com, 1
 garystallman.com, 1
+garyswine.com, 1
 garywhittington.com, 1
 gasbarkenora.com, 1
 gashalot.com, 1
@@ -35682,6 +35399,7 @@ gasnews.net, 1
 gaspapp.com, 1
 gaspard-ulliel.tk, 1
 gasscc.id, 1
+gassero.com, 1
 gassouthkenticoqa.azurewebsites.net, 1
 gassyukumenkyoguide.com, 1
 gastauftritt.net, 1
@@ -35694,6 +35412,7 @@ gastrotiger.de, 1
 gatapro.net, 0
 gate2home.com, 1
 gateaucreation.fr, 1
+gatekala.ir, 1
 gatekiller.co.uk, 1
 gatemaster.ga, 1
 gatemoves.com, 1
@@ -35755,6 +35474,7 @@ gbit.xyz, 1
 gbl.selfip.net, 1
 gboys.net, 0
 gbs-uk.com, 1
+gbsapri.it, 1
 gbthatcher.com, 1
 gc-mc.de, 1
 gc.de, 1
@@ -35836,6 +35556,7 @@ geekdama.com.br, 1
 geekedin.ga, 1
 geekeries.org, 0
 geekerstech.com, 1
+geekgirltech.com, 1
 geeklair.net, 1
 geeklan.co.uk, 1
 geekles.net, 1
@@ -35908,6 +35629,9 @@ geluk.io, 1
 gelukkigehonden.nl, 1
 geluleminceur.fr, 1
 gelvetika.cf, 1
+gem-forex.net, 1
+gem-forex.org, 1
+gem-forex.pro, 1
 gem-info.fr, 1
 gem.forex, 1
 gemax-online.de, 1
@@ -35915,6 +35639,8 @@ gemeentestein.nl, 1
 gemeinderatswahl2020.de, 1
 gemeinsam-ideen-verwirklichen.de, 1
 gemelen.net, 1
+gemforex.pro, 1
+gemforex.top, 1
 gemgroups.in, 1
 gemonite.com, 1
 gemquery.com, 1
@@ -35980,7 +35706,6 @@ genericlexaprocost.tk, 1
 genericrhinocort.ga, 1
 genericvytorin.ml, 1
 generujdata.cz, 1
-genesiselectronica.com, 1
 genesiseureka.com, 1
 genesismachina.ca, 1
 genesisplay.tk, 1
@@ -35988,13 +35713,13 @@ genesistrading.com, 1
 genesysmi.com, 1
 genetargetsolutions.com.au, 1
 genetidyne.com, 1
+genevachauffeur.com, 1
 genevacountyal.gov, 1
 geneve-naturisme.ch, 0
 geneve.guide, 1
 genevoise-entretien.ch, 1
 genfaerd.dk, 1
 genia-life.de, 1
-geniedesjouets.fr, 1
 geniofinanciero.org, 1
 genioideal.com, 1
 genioyfigura.tk, 1
@@ -36123,7 +35848,6 @@ geraintwhite.co.uk, 1
 gerald-zojer.com, 1
 geraldoazevedo.com.br, 1
 geraldsonrealty.com, 1
-gerandroid.com, 1
 gerardinden.nl, 1
 gerardozamudio.mx, 1
 gerbang-singkolo.ga, 1
@@ -36160,7 +35884,7 @@ geschenkly.de, 0
 geschichtscheck.de, 1
 geschmacksache.online, 1
 geschwinder.net, 1
-gesditel.es, 0
+gesditel.es, 1
 geseduc.cl, 1
 gesevi.com, 1
 gesica.cloud, 1
@@ -36208,7 +35932,6 @@ getcolq.com, 1
 getcookie.ml, 1
 getcreditscore.com.au, 1
 getdash.io, 1
-getdeveloper.de, 1
 getdoges.tk, 1
 getdownon.it, 1
 geteduroam.no, 1
@@ -36231,6 +35954,7 @@ getgeek.pl, 1
 getgeek.se, 1
 gethome.ru, 1
 gethttpsforfree.com, 1
+gethyas.com, 1
 geti2p.com, 1
 getidmcc.com, 1
 getimgs.com, 1
@@ -36267,6 +35991,7 @@ getresilience.org, 1
 getsecure.nl, 1
 getserum.xyz, 1
 getsetbounce.co.uk, 1
+getshifter.io, 0
 getsilknow.com, 1
 getsmartaboutdrugs.gov, 0
 getsport.mobi, 1
@@ -36318,9 +36043,13 @@ gfelite.de, 1
 gfestival.fo, 1
 gfk-kunststoff-luebben.de, 1
 gflame.de, 1
+gfmp.com.pl, 1
 gfms.ru, 1
 gfnetfun.cf, 1
 gforce.ninja, 1
+gforex.biz, 1
+gforex.pro, 1
+gforex.top, 1
 gfoss.eu, 1
 gfoss.gr, 1
 gfourmis.co, 1
@@ -36428,7 +36157,6 @@ giemall.com, 1
 gierds.de, 1
 gieschke.de, 1
 giethoorn.com, 1
-gietvloer-wand.nl, 1
 gietvloergarant.nl, 0
 giftcard.net, 1
 giftcardgranny.com, 1
@@ -36471,7 +36199,6 @@ gigsoupmusic.com, 1
 gigtroll.eu, 1
 gijsbertus.com, 1
 gijswesterman.nl, 1
-gikovatelojavirtual.com.br, 1
 gilbertosimoni.tk, 1
 gileadpac.com, 1
 gilescountytn.gov, 1
@@ -36480,6 +36207,7 @@ gilium.com, 1
 gillesmorelle.com, 0
 gillfamily.de, 1
 gillmanandsoame.co.uk, 1
+gilloteaux.be, 1
 gillyscastles.co.uk, 1
 gilme.net, 1
 gilmourluna.com, 1
@@ -36533,7 +36261,6 @@ girlsgenerationgoods.com, 1
 girlsnet.work, 1
 girlz.jp, 1
 giroskuter.ga, 1
-girsa.org, 1
 girvas.ru, 1
 gisac.org, 1
 gisauto.ru, 1
@@ -36555,6 +36282,7 @@ gite-ambleteuse.tk, 1
 gitecolombedesbois.com, 1
 gitep.org.uk, 1
 gitesdeshautescourennes.com, 1
+gitgud.eu.org, 1
 github.com, 1
 githubapp.com, 1
 githubber.com, 1
@@ -36585,11 +36313,16 @@ giveasquare.org, 1
 giveattheoffice.org, 0
 giveaways.ph, 1
 giveme.online, 1
+givemeaverse.com, 1
 givemylife.cf, 1
 givemylife.ga, 1
 givemylife.gq, 1
 givemylife.ml, 1
+given2.blog, 1
 given2.com, 1
+given2.me, 1
+given2.us, 1
+given4.it, 1
 giveoneup.org, 1
 givepenny.com, 1
 givesunlight.com, 1
@@ -36603,6 +36336,7 @@ gixtools.net, 1
 gixtools.uk, 1
 gizmo.ovh, 1
 gj-bochum.de, 1
+gjan.info, 1
 gjcampbell.co.uk, 1
 gjengset.com, 1
 gjspunk.de, 0
@@ -36621,7 +36355,6 @@ gl.search.yahoo.com, 0
 glabiatoren-kst.de, 1
 glaciernursery.com, 1
 gladdy.co.uk, 1
-gladdy.uk, 1
 gladdymedia.co.uk, 1
 gladdymedia.com, 1
 gladdymedia.uk, 1
@@ -36638,7 +36371,6 @@ glamira.de, 1
 glammybabes.com, 1
 glamour4you.de, 1
 glamourdaze.com, 1
-glamouria.com.br, 1
 glamur-video.com, 1
 glasdon.com, 1
 glasen-hardt.de, 1
@@ -36685,6 +36417,7 @@ gliihc.net, 1
 glimhome.com, 1
 glit.sh, 1
 glitchcomic.tk, 1
+glitter-graphics.com, 1
 glitzerstuecke.de, 1
 glixee.com, 1
 glloq.org, 0
@@ -36738,7 +36471,6 @@ globalonetechnology.com, 1
 globalperspectivescanada.com, 1
 globalpolarbear.com, 1
 globalpro.info, 1
-globalprojetores.com.br, 1
 globalresearchcouncil.org, 1
 globalresistancecorporation.com, 1
 globalrussia.tk, 1
@@ -36797,11 +36529,11 @@ glueckskindter.de, 1
 gluedtomusic.com, 1
 gluhov-ss.ru, 1
 gluit.de, 1
-glutenfreeandtasty.com, 1
 glutenfreehomemaker.com, 1
 glutenfreelife.co.nz, 1
 glutenfreeonashoestring.com, 1
 glutenfreevr.com, 1
+glxnet.com, 1
 glyburidemetformin.tk, 1
 glyfadacoaststudio.gr, 1
 glykofridis.nl, 1
@@ -36866,7 +36598,6 @@ gnulinux.gq, 1
 gnulinuxforum.tk, 1
 gnuplus.me, 1
 gnuworldorder.ml, 1
-gnwp.eu, 1
 gnylf.com, 1
 go-away.xyz, 1
 go-datasecurity.de, 1
@@ -36892,7 +36623,6 @@ goa8.com, 1
 goa8.xyz, 1
 goalbookapp.com, 1
 goalie1998.duckdns.org, 1
-goalongtravels.com, 1
 goanalyse.co.uk, 1
 goand.run, 1
 goarmy.eu, 1
@@ -36902,7 +36632,6 @@ goaudits.com, 1
 gobarrelroll.com, 1
 gobiernousa.gov, 1
 gobiz.com.my, 1
-goblackcat.com, 0
 goblinsatwork.com, 1
 goblintears.com, 1
 gobouncy.co.uk, 1
@@ -36931,6 +36660,7 @@ goddg.com, 1
 godesb.com, 1
 godesigner.ru, 1
 godfilm.tk, 1
+godles.pl, 1
 godmusicapp.com, 1
 godofredo.ninja, 1
 godrealms.com, 1
@@ -36960,6 +36690,7 @@ goetzinger-web.de, 1
 goffrie.com, 1
 gofigure.fr, 0
 goflo.net, 1
+gofobo.com, 1
 gofoiayourself.org, 1
 gofriends.cf, 1
 gogetssl.com, 0
@@ -37037,7 +36768,6 @@ goldwaterscholarship.gov, 1
 goldytechspecialists.com, 1
 goldzilla.eu, 1
 golearn.gov, 1
-golf18network.com, 1
 golf18staging.com, 1
 golfburn.com, 1
 golfhausmallorca.com, 1
@@ -37046,12 +36776,13 @@ golighthouse.com, 1
 golik.net.pl, 0
 golnet.hu, 1
 goloaninsurance.tk, 1
+golosinascbd.com, 1
 golosok.ml, 1
 golosovanye4you.tk, 1
 golser-schuh.at, 1
 golser.info, 1
 golsportsoccer.com, 1
-goluggo.com, 1
+golternet.com, 1
 golvlyftarna.se, 1
 gomasa.net, 1
 gomasy.jp, 1
@@ -37084,7 +36815,6 @@ goo.gl, 1
 gooch.io, 1
 good-cd.ml, 1
 good-know.gq, 1
-good-tips.pro, 1
 gooday.life, 1
 gooddomainna.me, 1
 goodenglish.ga, 1
@@ -37112,6 +36842,7 @@ goodth.ink, 1
 goodtrip.kr, 1
 goodvibesblog.com, 1
 goodyearsotn.co.uk, 1
+goofy.gr, 1
 google, 1
 google-analytics.com, 1
 google.ax, 1
@@ -37287,6 +37018,7 @@ govloans.gov, 1
 govno-site.tk, 1
 govnohosting.cf, 1
 govotecolorado.gov, 1
+govsales.gov, 1
 govtjobs.blog, 1
 govtrack.us, 1
 govype.com, 1
@@ -37299,7 +37031,6 @@ gowildrodeo.co.uk, 1
 gowin9.com, 1
 gowin9.net, 1
 gowithflo.de, 1
-gozadera.es, 1
 gpalabs.com, 1
 gpccp.cc, 1
 gpcp.org, 1
@@ -37311,7 +37042,6 @@ gpfitness.com.br, 1
 gpga.cf, 1
 gpgscoins.com, 1
 gpio.gq, 1
-gpl-elite.store, 1
 gpl25.ml, 1
 gplans.us, 1
 gplintegratedit.com, 1
@@ -37319,6 +37049,7 @@ gplvilla.com, 1
 gpm.ltd, 1
 gpna.org, 1
 gpolanco.com, 1
+gpony.fr, 1
 gppro.com, 1
 gprs.uk.com, 1
 gps-fleettracking.ga, 1
@@ -37333,7 +37064,6 @@ gpswebsoft.ml, 1
 gpu.nu, 0
 gpz500s.tk, 1
 gqjx.fun, 1
-gqmstore.com.br, 1
 gqyyy.cc, 1
 gr.search.yahoo.com, 0
 gr8engineer2b.com, 1
@@ -37345,6 +37075,7 @@ grabadolasermonterrey.com, 1
 grabatt.de, 1
 graberbooks.gq, 1
 grabi.ga, 1
+grabtech.vn, 1
 grace-wan.com, 1
 gracebaking.com, 0
 gracedays.org, 1
@@ -37394,7 +37125,6 @@ graingert.co.uk, 1
 graliv.net, 0
 grallersdegegants.tk, 1
 gramati.com.br, 1
-grammofono.gr, 1
 grammysgrid.com, 1
 grancellconsulting.com, 1
 grand-books.cf, 1
@@ -37436,7 +37166,6 @@ grantpark.org, 1
 grantplatform.com, 1
 grantsmasters.com, 1
 grantsplatform.com, 1
-graonatural.com.br, 1
 grapee.jp, 1
 grapeintentions.com, 1
 grapevine.is, 1
@@ -37470,6 +37199,7 @@ grassenberg.de, 1
 grasshoppervape.com, 1
 grasso.io, 1
 grassreinforcement.com.au, 1
+grast.jp, 1
 gratis-hosting.cf, 1
 gratis.market, 1
 gratisgamecards.nl, 1
@@ -37517,6 +37247,7 @@ greathairtransplants.com, 1
 greatislandarts.ca, 1
 greatlakeside.de, 1
 greatlifeinsurancegroup.com, 1
+greatlms.com, 1
 greatnetsolutions.com, 1
 greatrenumbering.tk, 1
 greatscholars.tk, 1
@@ -37530,6 +37261,7 @@ greek.dating, 1
 greeklish.gr, 1
 greekmusic.academy, 1
 greeknewspapers.tk, 1
+greekpistols.com, 1
 greeks.tk, 1
 greekweb.tk, 1
 green-adn.com, 1
@@ -37596,6 +37328,7 @@ greenteamtwente.nl, 1
 greenway-moving.com, 1
 greenwaylog.net, 1
 greenwithdecor.com, 1
+greenytimes.com, 1
 greer.ru, 1
 greg.red, 1
 gregbrimble.com, 1
@@ -37634,7 +37367,7 @@ grengine.ch, 1
 grenlandkiropraktor.no, 1
 grepmaste.rs, 0
 grepular.com, 1
-gresak.io, 0
+gresak.io, 1
 gresik.info, 1
 gresik.org, 1
 gressnet.id, 1
@@ -37691,6 +37424,7 @@ grinday.tk, 1
 grindgore.tk, 1
 grinnellplanes.com, 1
 grinnellplans.com, 1
+gripcoat.jp, 1
 gripencrossfit.gq, 1
 gripnijmegen.rip, 1
 grippe-impftermin.de, 0
@@ -37757,7 +37491,6 @@ groupeatrium.net, 1
 groupem6.fr, 1
 groupescr.fr, 1
 groupghistelinck-cars.be, 0
-grouphomes.com.au, 0
 groupme.com, 1
 groupramirez.com, 1
 groups.google.com, 1
@@ -37771,7 +37504,6 @@ growingallthings.co.uk, 1
 growinghumankindness.com, 1
 growingmetrics.com, 1
 growingsmiles.co.uk, 1
-growit.events, 1
 growme.gq, 1
 growth-rocket.com, 1
 growthseedconsulting.com, 1
@@ -37781,6 +37513,8 @@ grozter.se, 1
 grrmmll.com, 1
 grsecurity.net, 1
 grsknow.com, 1
+gruasiturra.cl, 1
+gruasllanos.cl, 1
 gruebebraeu.ch, 1
 gruelang.org, 1
 gruenderlehrstuhl.de, 1
@@ -37880,6 +37614,7 @@ guanyembadalona.org, 1
 guanyu.ml, 1
 guanzhong.ca, 1
 guardedbox.com, 1
+guardedbox.es, 1
 guardian-codex.tk, 1
 guardian360.nl, 1
 guardianportal.us, 1
@@ -37930,6 +37665,7 @@ guiaextra.com, 1
 guiascliente.com, 1
 guiasescapate.tk, 1
 guiaswow.com, 1
+guiaturisticanuevayork.com, 1
 guid2steamid.com, 1
 guid2steamid.pw, 1
 guide-peche-cantal.com, 0
@@ -37948,6 +37684,7 @@ guidesorbetiere.com, 1
 guidethailande.tk, 1
 guidetoiceland.is, 0
 guidopedia.ga, 1
+guilde-dissection.com, 1
 guildgearscore.cf, 0
 guildofmusicsupervisors.co.uk, 1
 guillaume-briand.fr, 1
@@ -37987,7 +37724,6 @@ gundemguncel.tk, 1
 gunerds.com.br, 1
 gunhunter.com, 1
 gunlukburc.net, 1
-gunnarhafdal.com, 1
 gunshyassassin.com, 0
 gunstatus.net, 1
 gununsesi.info, 1
@@ -37998,7 +37734,6 @@ gunworld.com.au, 1
 gunz.net, 1
 guochang.fun, 1
 guochang.xyz, 1
-guodong.net, 1
 guogetv.com, 1
 guohuageng.com, 1
 guoke.com, 1
@@ -38026,6 +37761,7 @@ gusmiller.org, 1
 gustaff.de, 1
 gustarfsberg.tk, 1
 gustavo-lima.ml, 1
+gustavovelasco.ml, 1
 gustavscelmins.tk, 1
 gustiaux.com, 0
 gustom.io, 0
@@ -38096,6 +37832,7 @@ gxmyqy.net, 1
 gxpconsultora.com, 1
 gyas.nl, 1
 gybol.com, 1
+gyengus.hu, 1
 gymagine.ch, 1
 gymbase.ml, 1
 gymbunny.de, 1
@@ -38182,7 +37919,6 @@ haaldesignpro.com, 1
 haancommunity.cf, 1
 haarigerrattenarsch.com, 1
 haarlemsesaxofoonschool.nl, 1
-haarstudiok99.nl, 1
 haasonline.tk, 1
 haavard.me, 1
 haazen.xyz, 1
@@ -38192,6 +37928,7 @@ habarovsk.ml, 1
 habbig.cc, 1
 habbixed.tk, 1
 habbplay.fr, 1
+habbstars.org, 1
 habeo.si, 1
 haberer.me, 1
 habernet.tk, 1
@@ -38200,6 +37937,7 @@ habesha.bet, 1
 habitable.ga, 1
 habitat-domotique.fr, 1
 habitatetbatiment.fr, 1
+hablemosclaro.blog, 1
 hablemosdenutricion.com, 1
 habr.com, 1
 habr.ee, 1
@@ -38214,6 +37952,8 @@ hacettepeteknokent.com.tr, 1
 hachimijiogan.info, 1
 hachre.de, 0
 hack.club, 1
+hack.fi, 1
+hackade.org, 1
 hackademix.net, 1
 hackadena.com, 1
 hackanders.com, 1
@@ -38313,9 +38053,9 @@ hagsted.dk, 1
 hagueaustralia.com.au, 1
 haha-raku.com, 1
 haha.nl, 1
-hahay.es, 1
 haibara.top, 1
 haiboxu.com, 1
+haigekassa.ee, 1
 hailstorm.nl, 1
 haim.bio, 1
 haimablog.ooo, 1
@@ -38366,6 +38106,7 @@ hakkariradyo.tk, 1
 hakkasan.com, 1
 hakkasannightclub.com, 1
 haklappar.nu, 1
+hakon.lol, 1
 hakugin.me, 1
 hal-9th.space, 1
 halacs.hu, 1
@@ -38385,7 +38126,6 @@ halihali.cc, 1
 halihali.me, 1
 halilweb.tk, 1
 halilyagcioglu.tk, 1
-halitopuroprodutos.com.br, 1
 halkidikitransfers.eu, 1
 halkirkbouncycastles.co.uk, 1
 halkyon.net, 1
@@ -38416,6 +38156,7 @@ halovanic.org, 1
 haltegame.com, 1
 halyul.com, 1
 hamacho-kyudo.com, 1
+hamada-syoji.co.jp, 1
 hamali.bg, 1
 hamamatsu-kotsu.co.jp, 1
 hamarimarriage.tk, 1
@@ -38448,6 +38189,7 @@ hanakaraku.com, 1
 hanakaru.tk, 1
 hanami-web.tokyo.jp, 1
 hanazono.tokyo, 1
+hanbin.me, 0
 hanbing.it, 1
 hancockcountyohioelections.gov, 1
 hancocklawfl.com, 1
@@ -38495,6 +38237,7 @@ hannah.link, 1
 hannahi.com, 1
 hannasecret.de, 1
 hannde.com, 1
+hannehovi.fi, 1
 hannes.paris, 1
 hannit.de, 1
 hannoluteijn.nl, 1
@@ -38525,7 +38268,6 @@ hansvaneijsden.nl, 1
 hantse.com, 1
 hanu.la, 1
 hanxv.pw, 1
-hanyibo.com, 1
 hanying6.com, 1
 hanys.xyz, 1
 hanzcollection.online, 1
@@ -38534,7 +38276,6 @@ hao-zhang.com, 1
 hao8.ag, 1
 haocq3.com, 1
 haogoodair.ca, 1
-haorenka.org, 1
 haozhang.org, 1
 haozhexie.com, 1
 haozhuanfa.com, 1
@@ -38556,6 +38297,7 @@ happyagain.de, 1
 happyagain.se, 1
 happyandrelaxeddogs.com, 1
 happyandrelaxeddogs.eu, 1
+happybaby-ec.com, 1
 happybeerdaytome.com, 1
 happybirthdaywisher.com, 1
 happybounce.co.uk, 1
@@ -38587,6 +38329,7 @@ happyteamlabs.com, 1
 happytiger.eu, 1
 happyukgo.com, 1
 happyweekend.ga, 1
+happywheels1.online, 1
 hapronailz.tk, 1
 hapsana.nl, 1
 hapsfordmill.co.uk, 1
@@ -38623,6 +38366,7 @@ hardrain980.com, 1
 hardrock.tk, 1
 hardtfrieden.de, 1
 hardtime.ru, 1
+hardware.info.pl, 1
 hardwareforum.ga, 1
 hardwarelog.in, 1
 hardwarelogin.com, 1
@@ -38656,7 +38400,6 @@ haroldsharpe.com, 1
 harp.gov, 1
 harpersvilleal.gov, 1
 harpoo.jp, 0
-harptechnologies.com, 1
 harray.tk, 1
 harrcostl.com, 1
 harriedrecords.tk, 1
@@ -38698,7 +38441,6 @@ harveysautoservice.net, 1
 harvilldesigns.com, 1
 has-no-email-set.de, 0
 has.report, 1
-has.software, 1
 has.work, 1
 hasabig.wang, 1
 hasalittle.wang, 1
@@ -38728,6 +38470,7 @@ hashtagpatriot.com, 1
 hashtagswimwear.com, 1
 hashworks.net, 1
 hashxp.org, 1
+hasilkeluaransgp.com, 1
 hasilocke.de, 1
 haskett.ca, 1
 haskovec.com, 1
@@ -38741,10 +38484,8 @@ hastyllc.com, 1
 hatachan.site, 1
 hataonline.tk, 1
 hatarisecurity.co.ke, 1
-hatcher.cloud, 1
 hate.ga, 1
 hatethe.uk, 1
-hatpakha.com, 1
 hatsuharu.tk, 1
 hatter.ink, 1
 hatul.info, 1
@@ -38867,7 +38608,6 @@ hd-outillage.com, 1
 hd2132.com, 1
 hd5132.com, 1
 hd5197.com, 0
-hd5454.com, 1
 hd6132.com, 1
 hd6729.com, 1
 hd6957.com, 1
@@ -38887,6 +38627,7 @@ hdkandsons.com, 1
 hdlooks.tk, 1
 hdm.io, 1
 hdmobilpornolar.com, 1
+hdmovies.blog, 1
 hdnastudio.com, 1
 hdpornose.com, 1
 hdrezka2018.tk, 1
@@ -38954,6 +38695,7 @@ healthybeterlife.click, 1
 healthyfitfood.com, 1
 healthylifeelite.com, 1
 healthymen.ml, 1
+healthynutritionguide.info, 1
 healthypeople.gov, 1
 healthyspirituality.org, 1
 healthystyle.tk, 1
@@ -38979,7 +38721,6 @@ heartmdinstitute.com, 1
 heartsintrueharmony.com, 1
 heartsucker.com, 0
 hearttruth.gov, 1
-heartview.com.br, 1
 heartwoodart.com, 1
 hearty.blog, 1
 hearty.edu.pl, 1
@@ -39042,6 +38783,7 @@ hedweb.com, 1
 hedweb.net, 1
 hedweb.org, 1
 hedys.de, 1
+heeftmijnwebsitehttpsnodig.nl, 1
 heeler.blue, 1
 heeler.red, 1
 heello.es, 1
@@ -39056,7 +38798,6 @@ hegen.sk, 0
 hegenshop.de, 1
 heh.ee, 1
 heha.co, 0
-hehaohan.com, 1
 hehome.xyz, 1
 heiaheia.com, 1
 heid.ws, 1
@@ -39074,6 +38815,7 @@ heijmans.pm, 1
 heijmans.xyz, 1
 heikegastmann.com, 1
 heikki-mikkola.tk, 1
+heikkileivonen.fi, 1
 heikohessenkemper.de, 1
 heikorichter.name, 1
 heiland.io, 1
@@ -39094,9 +38836,7 @@ heiraten-venedig.de, 1
 heisenberg.co, 1
 heissluft-fritteuse.com, 1
 heist-clan.tk, 1
-heistheguy.com, 1
 heitepriem.info, 1
-heitland-it.de, 1
 heiwa-valve.co.jp, 0
 hejsupport.se, 1
 heka.ai, 1
@@ -39118,6 +38858,8 @@ helenelefauconnier.com, 1
 helenkellersimulator.org, 1
 helensmithpr.co.uk, 1
 helenssjoholm.cf, 1
+heleus.it, 1
+heleus.photo, 1
 helfordriversc.co.uk, 1
 helga-fest.tk, 1
 helgaschultz.de, 1
@@ -39156,7 +38898,6 @@ hellomouse.cf, 1
 hellomouse.net, 1
 hellomouse.tk, 1
 hellomyword.tk, 1
-helloneu.com, 1
 hellonews.cf, 1
 hellorussia.ga, 1
 hellosalmon.com, 1
@@ -39181,7 +38922,6 @@ helpkoil.com, 1
 helpmij.cf, 1
 helppc.com.ua, 1
 helpscoutdocs.com, 1
-helpstarloja.com.br, 1
 helptasker.com, 1
 helptasker.net, 1
 helptasker.ru, 1
@@ -39273,6 +39013,7 @@ herberichfamily.com, 1
 herbers.tk, 1
 herbert.io, 1
 herbertjanvandinther.nl, 1
+herbhuang.com, 1
 herbolarigranvida.com, 1
 herbsupplements.co.uk, 1
 herbweb.net, 1
@@ -39306,6 +39047,8 @@ hermes.cat, 1
 herminghaus24.de, 1
 hermitant.fr, 1
 hermiu.com, 1
+hermiyanto.com, 1
+herndl.org, 1
 herni-kupony.cz, 1
 hernn.com, 1
 herocentral.de, 1
@@ -39325,6 +39068,7 @@ herranzramia.com, 0
 herrderzeit.de, 1
 herrenmuehle-wein.de, 1
 herrfirm.com, 1
+herringadvancemachine.com, 1
 herringboneeats.com, 1
 herringsresidence.be, 1
 herrkaschke.com, 1
@@ -39337,6 +39081,7 @@ hersmartchoice.com, 1
 hertsbouncycastles.com, 1
 hertz.bj, 1
 herumixer.ga, 1
+herychreality.cz, 1
 herz-und-gemuet.de, 1
 herzbotschaft.de, 1
 herzfuersoziales.at, 1
@@ -39345,6 +39090,7 @@ herzogglass.com, 1
 herzwacht.de, 1
 hes.com.cy, 1
 hesaplama.net, 1
+hesbenergie.be, 1
 hessen-liebe.de, 1
 hessenheim.tk, 1
 hesslag.com, 1
@@ -39435,12 +39181,12 @@ hgpowerglue.nl, 1
 hguandl.com, 1
 hgvnet.de, 1
 hgw168.com, 1
+hgyo.me, 1
 hgyoseo.com, 1
 hh-medic.com, 1
 hh-wolke.dedyn.io, 1
 hh5197.co, 1
 hh6729.co, 1
-hh6729.com, 1
 hh6957.co, 1
 hh9297.co, 1
 hh9728.co, 1
@@ -39458,6 +39204,7 @@ hi.team, 1
 hialatv.com, 1
 hibanaworld.com, 1
 hibari.moe, 1
+hibrid-turf.com, 1
 hiccupsandjuice.co.uk, 1
 hickorywinecellar.com, 1
 hicl.org, 1
@@ -39483,8 +39230,6 @@ hideallip.com, 1
 hidedd.com, 1
 hideouswebsite.com, 1
 hidglobal.com, 1
-hidroshop.com.br, 1
-hidroshoping.com.br, 1
 hieisuki.ga, 1
 hielscher.com, 1
 hien.cf, 1
@@ -39492,7 +39237,6 @@ hierer.com, 1
 hieu.com.au, 1
 hif88.com, 1
 hifala.de, 1
-hifdhblog.dk, 1
 hiffo.de, 1
 hifly.com.tw, 1
 hifumi.us, 1
@@ -39519,10 +39263,10 @@ highlegshop.com, 1
 highlevelwoodlands.com, 1
 highlnk.com, 1
 highnation.ml, 1
+highqappliance.com, 1
 highriskpay.com, 1
 highspeed-arnsberg.de, 1
 highspeedinternet.my, 1
-highstreethomes.com.au, 1
 hightechbasementsystems.com, 1
 hightechgadgets.net, 1
 hightechone.cf, 1
@@ -39678,7 +39422,6 @@ hitleap.com, 1
 hitmanstat.us, 1
 hitmyheart.tk, 1
 hitn.at, 1
-hitocom.net.br, 1
 hitokoto-mania.com, 1
 hitokoto.cn, 1
 hitomecha.com, 1
@@ -39709,14 +39452,14 @@ hj-mosaiques.be, 1
 hj.rs, 1
 hj111777.com, 0
 hj2375.com, 0
-hj2565.com, 0
+hj2565.com, 1
 hj3586.com, 0
 hj3639.com, 0
 hj5386.com, 0
 hj555.cc, 1
 hj556.cc, 1
 hj6298.com, 0
-hj6585.com, 0
+hj6585.com, 1
 hj6929.com, 0
 hj9379.com, 1
 hj99111.com, 1
@@ -39792,6 +39535,7 @@ hm1ch.ovh, 1
 hm773.net, 1
 hm773.org, 1
 hmcdj.cn, 1
+hmeonot.org.il, 1
 hmnd.io, 1
 hmoegirl.com, 1
 hmri.org.au, 1
@@ -39997,6 +39741,7 @@ homeoesp.org, 1
 homeofjones.net, 1
 homeogenium.com, 0
 homeopata.tv, 1
+homeostase.pt, 1
 homeownersinsurancenv.com, 1
 homepage.shiga.jp, 1
 homepal.ga, 1
@@ -40037,6 +39782,7 @@ hon-matsuba.co.jp, 1
 honda-centrum.cz, 1
 hondart.cz, 1
 hondenoppasfraneker.nl, 1
+honey-tr.xyz, 1
 honey.beer, 1
 honey.is, 1
 honeybadger.io, 0
@@ -40053,6 +39799,7 @@ honeyspot.de, 1
 honeytracks.com, 1
 hong.io, 1
 hongbomiao.com, 1
+honggian.com, 1
 hongki.tk, 1
 hongoi.com, 1
 hongorw.tk, 1
@@ -40109,6 +39856,7 @@ hopo.design, 1
 hoponmedia.de, 1
 hopps.me, 1
 hoppyx.com, 1
+hopzone.net, 1
 hor.website, 1
 horaceli.com, 1
 horaciolopez.pro, 1
@@ -40143,6 +39891,7 @@ horo.moe, 1
 horoca.net, 1
 horochx.org, 1
 horodance.dk, 1
+horos.es, 1
 horrell.ca, 1
 horrendous-servers.com, 1
 horror-forum.de, 1
@@ -40153,6 +39902,7 @@ horsehunter.co.uk, 1
 horseplanet.tk, 1
 horsky.me, 1
 horstmanshof.eu, 1
+horstmanshof.nl, 1
 horti-it.com, 1
 horton-brasses.com, 1
 horvathd.eu, 1
@@ -40160,8 +39910,6 @@ horvatia.tk, 1
 horvatnyelvkonyv.hu, 1
 hory.me, 1
 horza.org, 1
-hoshimaq.com.br, 1
-hoshimaquinas.com.br, 1
 hoshinplan.com, 1
 hoshisato.com, 1
 hosiery.tk, 1
@@ -40177,6 +39925,7 @@ host97.de, 1
 hostadvice.com, 1
 hostam.link, 1
 hostarea51.com, 1
+hostatic.com, 1
 hostcloud.ml, 1
 hostco.nl, 1
 hostcoz.com, 1
@@ -40188,7 +39937,6 @@ hostedghost.nl, 1
 hostedghost.org, 1
 hostedtalkgadget.google.com, 1
 hostelacion.com, 1
-hostelaciones.com, 1
 hosteleriauno.es, 1
 hosteons.com, 1
 hostfission.com, 1
@@ -40270,6 +40018,7 @@ hotelpalmas.com.br, 1
 hotelpostaorvieto.it, 1
 hotelpresident.co.in, 1
 hotelpromo.codes, 1
+hotelreis.com.br, 1
 hotels-insolites.com, 1
 hotels3d.com, 1
 hotels4teams.com, 1
@@ -40279,6 +40028,7 @@ hotelsfares.com, 1
 hotelsinbuxton.com, 1
 hotelsinformer.com, 1
 hotelsinncoventry.com, 1
+hotelsinroatan.com, 1
 hotelsolinebrela.com, 1
 hotelsrit.tk, 1
 hotelstanford.com.co, 1
@@ -40322,6 +40072,7 @@ houseboydesigns.com, 1
 housekeeperlondon.co.uk, 1
 houselocal.co.uk, 1
 housemates.uk.com, 1
+houseofaceonline.com, 1
 houseofherbs.gr, 1
 houseofhouston.com, 1
 houseofpertijs.com, 1
@@ -40355,6 +40106,7 @@ howellaccounts.co.uk, 1
 howesky.com, 1
 howgoodwasmysex.com, 1
 howieisawesome.com, 1
+howinsider.com, 1
 howlers.tk, 1
 howlongtobeatsteam.com, 1
 howmanymilesfrom.com, 1
@@ -40374,6 +40126,7 @@ howsyourhealth.org, 1
 howtogeek.com, 1
 howtogeekpro.com, 1
 howtogosolar.org, 1
+howtoinstall.co, 1
 howtolaser.com, 1
 howtomovetheneedle.com, 1
 howtopronounce.com, 1
@@ -40405,7 +40158,6 @@ hpepub.com, 0
 hpic.net, 1
 hpisavageforum.com, 1
 hpkp-faq.de, 1
-hplace.com.br, 1
 hps.digital, 1
 hps.hu, 1
 hpsdigital.hu, 1
@@ -40476,6 +40228,7 @@ hsn.com, 1
 hsog.tk, 1
 hspinc.ca, 1
 hsr.gov, 0
+hst.tc, 1
 hsts-preload-test.xyz, 1
 hsts.eu, 1
 hsts.me, 1
@@ -40497,6 +40250,7 @@ htcvina.com, 1
 htdcomputer.vn, 1
 hte.ovh, 1
 hti.digital, 1
+htikeagkyaw.com, 1
 htlball.at, 1
 htmanager.fr, 1
 htmdom.com, 1
@@ -40513,6 +40267,7 @@ htmlnet.tk, 1
 htmlvalidator.com, 1
 htmlweb.ml, 1
 htmlyse.com, 1
+htmtools.com, 1
 htmue.org, 1
 htp2.top, 1
 htsure.ma, 0
@@ -40546,12 +40301,10 @@ httptest.net, 1
 hu-a-u.com, 1
 hu.search.yahoo.com, 0
 hua-chuan.com.tw, 1
-hua-chuan.tw, 1
 hua-in.com, 1
 hua-in.net, 1
 hua-li88.com, 1
 hua-li88.net, 1
-huabantxt.com, 1
 huabanxs.com, 1
 huagati.com, 1
 huahinpropertylisting.com, 1
@@ -40598,6 +40351,7 @@ hubspot.de, 1
 hubspot.es, 1
 hubspot.fr, 1
 hubspot.jp, 1
+hubtrinova.com, 1
 huchet.me, 1
 hucklebucks.com, 1
 huckletree.com, 1
@@ -40613,7 +40367,6 @@ huersch.com, 1
 huertoydesamparados.tk, 1
 hues-in-lee.de, 1
 huffduffer.com, 1
-huffsinsurance.com, 1
 hugh-dancy.com, 1
 hughfitzgerald.com, 1
 hughtodd.ink, 1
@@ -40770,7 +40523,6 @@ hussam.eu.org, 1
 hustlehope.com, 1
 hustlerstate.tk, 1
 huto.ml, 1
-huuduc.xyz, 1
 huurwoordenaar.nl, 1
 huutonauru.net, 1
 huwcbjones.co.uk, 1
@@ -40784,7 +40536,6 @@ huzurmetal.net, 1
 hv-huset.no, 1
 hvdbox.de, 1
 hvenetworks.cf, 1
-hvenetworks.net, 1
 hveradistributions.com, 1
 hverdagogkink.no, 1
 hvgg.de, 1
@@ -40857,6 +40608,7 @@ hyhy85.com, 1
 hyhy89.com, 1
 hyhy98.com, 1
 hyk.me, 1
+hylemorphica.org, 1
 hylians.com, 1
 hyncice.com, 1
 hynek.me, 1
@@ -40869,6 +40621,7 @@ hyper-text.org, 1
 hyper.ai, 1
 hyper.lol, 1
 hyperalgesia.com, 1
+hyperaonline.com.br, 1
 hyperbolic-mayonnaise-interceptor.ovh, 1
 hypercompetitions.com, 1
 hyperd.sh, 1
@@ -40889,7 +40642,6 @@ hyphenpda.co.za, 1
 hypnobb.com, 1
 hypnose-hennigsdorf.de, 1
 hypnoseduction.tk, 1
-hypnosesolutionsvives.com, 1
 hypnotizedgirls.ml, 1
 hypnovir.us, 1
 hypolineweb.de, 1
@@ -40911,7 +40663,6 @@ hytzongxuan.com, 1
 hytzongxuan.top, 1
 hyundai.no, 1
 hyundaisrilanka.lk, 1
-hyvanilmankampaamo.fi, 1
 hyvinvointineuvoja.fi, 1
 hyyen.com, 1
 hztgzz.com, 1
@@ -40960,7 +40711,6 @@ i5197.co, 1
 i5y.co.uk, 1
 i5y.org, 1
 i6729.co, 1
-i6729.com, 1
 i6957.co, 1
 i7.io, 1
 i7sas.tk, 1
@@ -40970,7 +40720,6 @@ i879.com, 1
 i88i.gq, 1
 i8cp.com, 1
 i9297.co, 1
-i95.me, 1
 i9728.co, 1
 i9s.in, 1
 ia.cafe, 1
@@ -40983,6 +40732,7 @@ iaeste.no, 1
 iaeste.or.jp, 1
 iaf.gov, 1
 iahemobile.net, 1
+iain.tech, 1
 iainsimms.co.uk, 1
 iainsimms.com, 1
 iainsimms.me, 1
@@ -41062,9 +40812,7 @@ ibericarreicomsa.es, 1
 ibericartechnik.es, 1
 iberion.pl, 1
 iberiserver.es, 1
-ibestproduct.com, 1
 ibetora.com, 1
-ibex-lb.com, 1
 ibexcore.com, 1
 ibhgospel.com, 1
 ibi.mt, 1
@@ -41088,11 +40836,13 @@ ibsglobal.co.za, 1
 ibstyle.tk, 1
 ibtraining.com, 1
 ibugone.com, 1
+ibuildings.nl, 1
 ibuki.run, 1
 ibuprofens.gq, 1
 ibwc.gov, 1
 ibykos.com, 1
 ic-lighting.com.au, 1
+ic1technologies.com, 1
 ic3.gov, 1
 icafecash.com, 1
 icanhas.report, 1
@@ -41269,6 +41019,7 @@ idid.tk, 1
 idinby.dk, 1
 idiomasdelmundo.tk, 1
 idiot.trade, 1
+idioumarou.com, 1
 idkidknow.com, 1
 idleleo.com, 1
 idlethoughtsandramblings.com, 1
@@ -41296,11 +41047,13 @@ idrissi.eu, 1
 idroserviceweb.com, 1
 idrycleaningi.com, 1
 idsafe.co.za, 1
+idstudio.tk, 1
 idtechnowizard.com, 1
 idtheft.gov, 1
 idubaj.cz, 1
 idunno.org, 1
 idvl.de, 1
+idweblog.com, 1
 idxforza.com, 1
 idyl.fr, 1
 idysse.com, 1
@@ -41324,13 +41077,13 @@ ient.me, 1
 ies-italia.it, 0
 ies911.com, 1
 iesonline.co.in, 1
+iesucreipi.edu.co, 1
 ieval.ro, 1
 ievgenialehner.com, 1
 iewar.com, 1
 if-fashion.gr, 1
 if0.ru, 1
 ifacservice.be, 1
-ifamily.top, 1
 ifan.ch, 1
 ifan.ws, 1
 ifangpei.cn, 1
@@ -41350,9 +41103,11 @@ ifightsurveillance.net, 1
 ifightsurveillance.org, 1
 ifisher.xyz, 1
 ifiveglobal.com, 1
+ifleurs.com, 1
 ifly.pw, 1
 iflyi.me, 1
 ifma.edu.br, 1
+ifnet.fr, 1
 ifoa.it, 1
 ifolder.ga, 1
 iformbuilder.com, 0
@@ -41398,7 +41153,7 @@ igkabel.ga, 1
 igkabel.gq, 1
 igkabel.ml, 1
 igkabel.tk, 1
-iglobus.cz, 1
+iglobus.cz, 0
 iglosujemy.pl, 1
 igmus.org, 1
 ignace72.eu, 1
@@ -41427,7 +41182,6 @@ igrivi.com, 1
 igrodrom-kvest.tk, 1
 igrovoi-klub.tk, 1
 igsmgmt.com, 1
-iguana.com.ec, 0
 igust4u-archive.ga, 1
 igva.or.kr, 1
 ih8sn0w.com, 1
@@ -41446,6 +41200,7 @@ ihls.world, 0
 ihmphila.org, 1
 ihoey.com, 1
 ihollaback.org, 1
+ihongchao.com, 1
 ihongzu.com, 1
 ihorizon.jp, 1
 ihostup.net, 1
@@ -41459,7 +41214,6 @@ ihydra.net, 1
 ihzys.com, 1
 ii5197.co, 1
 ii6729.co, 1
-ii6729.com, 1
 ii6957.co, 1
 ii74.com, 1
 ii918.com, 1
@@ -41529,7 +41283,6 @@ ikudo.top, 1
 ikulist.me, 1
 ikumi.us, 1
 ikvts.de, 1
-ikwillhout.nl, 1
 ikx.me, 1
 ikymbo.com, 1
 ikzoekeengoedkopeauto.nl, 1
@@ -41587,6 +41340,7 @@ ilii.me, 1
 ilikepenguins.tk, 1
 ilimitar.tk, 1
 iliny.hu, 1
+iliturkey.com, 1
 iliz-kafe.fr, 1
 ilkeakyildiz.com, 0
 illaadventure.com, 1
@@ -41626,6 +41380,7 @@ ilove.fish, 1
 ilove588.com, 1
 ilove618.com, 1
 ilove918.com, 1
+ilovecheesedip.com, 1
 ilovecomputering.com, 1
 iloveherb.ru, 1
 ilovehoney.com.au, 1
@@ -41685,7 +41440,9 @@ imagr.io, 1
 imakash.gq, 1
 imanageproducts.co.uk, 1
 imanageproducts.uk, 1
+imaniprima.co.id, 1
 imanolbarba.net, 1
+imap.support, 1
 imap2imap.de, 1
 imaple.org, 1
 imarkethost.co.uk, 1
@@ -41716,9 +41473,9 @@ imeria.tk, 1
 imex-dtp.com, 1
 imforza.com, 1
 img.mg, 1
+img.ovh, 1
 img.ren, 1
 imgaa.com, 1
-imgal.vin, 1
 imgbb.com, 1
 imgbu.com, 1
 imgencrypt.com, 1
@@ -41749,7 +41506,6 @@ imkerverein-moenchswald.de, 1
 imkerverenigingzaanstreek.nl, 1
 imkindofabigdeal.com, 1
 imlec.net, 1
-imlhx.com, 1
 imlinan.cn, 1
 imlinan.com, 1
 imlinan.info, 1
@@ -41778,7 +41534,6 @@ immobilien-zirm.de, 1
 immobiliengutachter-holland.de, 1
 immobilier-nice.fr, 1
 immobilier92.net, 1
-immobiza.com, 0
 immoraldoctors.tk, 1
 immortal-it.tk, 1
 immortal-pc.info, 1
@@ -41793,7 +41548,6 @@ imolights.net, 1
 imolog.cl, 1
 imoner.com, 1
 imoner.ga, 1
-imoney.tw, 1
 imouto.my, 0
 imoveisavenda.rio.br, 1
 imoxin.net, 1
@@ -41806,6 +41560,7 @@ impactparcels.co.uk, 1
 impactparcels.com, 1
 impactpub.ch, 0
 impakho.com, 1
+impartesco.com, 1
 impas.se, 1
 impelup.com, 1
 impendulo.org, 1
@@ -41834,6 +41589,7 @@ impossible.org, 1
 impossiblechoisir.tk, 1
 impossiblefitness.com, 1
 impossiblehq.com, 1
+impossiblenutrition.com, 1
 impossiblex.com, 1
 impotsimple.ca, 1
 imppac-schmuck.de, 1
@@ -41841,6 +41597,7 @@ imppac.de, 1
 impra.com.ua, 1
 imprendo.co, 1
 imprendo.pro, 1
+imprensaglobal.com.br, 1
 impresa-di-pulizie.milano.it, 1
 impresa-di-pulizie.org, 1
 impresa-pulizie.it, 1
@@ -41868,8 +41625,8 @@ impudence.tk, 1
 impulse-clan.de, 1
 impulsionsa.com, 1
 impulsocristiano.com, 1
-impyus.com, 1
 imququ.com, 1
+imqyw.com, 1
 imreh.net, 1
 imrunner.com, 1
 imrunner.ru, 1
@@ -41896,7 +41653,6 @@ in.search.yahoo.com, 0
 in.xero.com, 0
 in1000worten.de, 1
 in10tion.com, 0
-in2-comms.com, 1
 inabox.ro, 1
 inait.ai, 1
 inalvittile.cf, 1
@@ -41948,7 +41704,7 @@ incowrimo.org, 1
 incparadise.net, 1
 increasetestosteronelevels.org, 1
 incrediblenews.tk, 1
-incrementation.net, 1
+incrementation.net, 0
 incrom.com, 1
 ind.ie, 1
 indasun.com, 1
@@ -42044,6 +41800,7 @@ industriafranchini.com, 1
 industrial-remote-control.com, 1
 industrialalpinism.tk, 1
 industrialpaintservices.com, 1
+industriascruzcentro.com, 1
 industriemeister.io, 1
 industryperspectives.com, 1
 indybay.org, 1
@@ -42300,6 +42057,7 @@ ingatlanjogaszok.hu, 1
 ingatlanneked.hu, 1
 ingber.com, 1
 inge-r.nl, 1
+ingebroer.com, 1
 ingeeibach.de, 1
 ingeni.ink, 1
 ingenias.es, 1
@@ -42454,6 +42212,7 @@ inputclub.com, 1
 inputmodes.com, 1
 inqorp.ca, 1
 inquant.de, 1
+inquisition.is, 1
 ins-kreativ.de, 1
 ins.to, 1
 ins1gn1a.com, 1
@@ -42473,12 +42232,10 @@ insertcoins.net, 1
 insertface.com, 1
 inserzioniticino.ch, 1
 insgesamt.net, 1
-inshapenutrition.com.br, 1
 inshop.hu, 1
 insiberia.tk, 1
 inside19.com, 1
 insideaudit.com, 1
-insidebeach.com.br, 1
 insidebedroom.com, 1
 insideevs.com, 1
 insideevs.fr, 1
@@ -42535,6 +42292,7 @@ instantluxe.com, 1
 instantluxe.de, 1
 instantmoron.com, 1
 instantpage.tk, 1
+instaon.io, 1
 instaquiz.ru, 1
 instasex.ch, 1
 instava.cz, 1
@@ -42552,6 +42310,7 @@ institutmaupertuis.hopto.org, 1
 institutogiuseppe.com, 1
 institutogiuseppe.com.ar, 1
 institutointersistemico.com.br, 1
+institutolancaster.com, 1
 institutomaritimocolombiano.com, 1
 instrukci.tk, 1
 instrumart.ru, 0
@@ -42580,6 +42339,7 @@ intalink.org.uk, 1
 intarweb.ca, 1
 intasky.cz, 1
 intasky.sk, 1
+intcarshow.com, 1
 intec.edu.pe, 1
 integ.jp, 1
 integralblue.com, 1
@@ -42646,7 +42406,6 @@ interesting.ac.cn, 1
 interestingfacts.gq, 1
 interferencias.tech, 1
 interfloraservices.co.uk, 1
-interflores.com.br, 1
 interfug.de, 1
 intergenx.co.uk, 1
 intergenx.com, 1
@@ -42712,6 +42471,7 @@ internetoffensive.fail, 1
 internetofinsecurethings.com, 1
 internetovehazardnihry.cz, 1
 internetpro.me, 1
+internetprofitspro.com, 1
 internetstaff.com, 1
 internetstiftelsen.se, 1
 internettoday.ga, 1
@@ -42808,6 +42568,7 @@ inversionesgalindo.com, 1
 invest-stroj.tk, 1
 investactiv.tk, 1
 investarholding.nl, 1
+investarter.nl, 1
 investcarpremium.com.br, 1
 investforum.net, 1
 investgold.ml, 1
@@ -42989,14 +42750,12 @@ iprim.ru, 1
 ipripojeni.cz, 1
 iproducemusic.com, 1
 ips-consult.nl, 1
-ips-ihre-pflege-sachsen.de, 1
+ips-ihre-pflege-sachsen.de, 0
 ips-sachsen.de, 1
 ipschool.spb.ru, 1
-ipsec.pl, 1
 ipsecurelink.com, 1
 ipso.paris, 1
 ipssl.li, 1
-ipstoragesolutions.com, 1
 ipsum.dk, 1
 ipswitch.com.tw, 1
 iptechnology.tk, 1
@@ -43004,7 +42763,7 @@ iptops.com, 1
 iptvmaxx.com, 1
 iptvzoom.xyz, 1
 ipty.de, 1
-ipura.ch, 1
+ipura.ch, 0
 ipuservicedesign.com, 1
 ipushmail.tk, 1
 ipv4.cf, 1
@@ -43013,6 +42772,7 @@ ipv4.gr, 1
 ipv4.rip, 1
 ipv6-adresse.dk, 1
 ipv6-handbuch.de, 1
+ipv6.cool, 1
 ipv6.jetzt, 0
 ipv6vpn.net, 1
 ipv6wallofshame.com, 1
@@ -43044,6 +42804,7 @@ iranonline.tk, 1
 iranophiles.com, 1
 iranophiles.net, 1
 iranophiles.org, 1
+iranpay.biz, 1
 iranpedia.tk, 1
 iranturkey.info, 1
 iranwiki.ovh, 1
@@ -43054,6 +42815,7 @@ irayo.net, 1
 irc-results.com, 1
 ircica.org, 1
 ircmett.de, 1
+ircnow.org, 1
 ircoholik.ml, 1
 ircsapiklari.tk, 1
 ird.nz, 1
@@ -43063,6 +42825,9 @@ iready.ro, 1
 ireef.tv, 1
 ireland.gq, 1
 irelandondemand.ie, 1
+irelandremembers.com, 1
+irelandremembers.ie, 1
+irelandremembers.org, 1
 iren.ch, 1
 irenekauer.com, 1
 irenelove.com, 1
@@ -43104,7 +42869,6 @@ irmag.ru, 1
 irmgard-woelfle.de, 1
 irmgardkoch.com, 1
 irmtrudjurke.de, 1
-irodorinet.com, 1
 iroise.ch, 1
 ironbelly.pro, 1
 ironcarnival.com, 1
@@ -43147,6 +42911,7 @@ isaacpartnership.co.uk, 1
 isaacphysics.org, 1
 isaaczais.com, 1
 isabelaflores.com, 1
+isabelcaviedes.com, 1
 isabellavandijk.nl, 1
 isabelle-delpech.com, 1
 isabellehogarth.co.uk, 1
@@ -43167,6 +42932,7 @@ isbengrumpy.com, 1
 iscert.org, 1
 iscontrol.com.mx, 1
 isdecolaop.nl, 1
+isdmgroup.in, 1
 isdn.jp, 1
 isdown.cz, 1
 isecrets.se, 1
@@ -43270,6 +43036,7 @@ ispanika.tk, 1
 ispaniola.ga, 1
 ispfontela.es, 1
 ispmedipv6.se, 1
+ispn.edu.ar, 1
 ispro-ng.com, 1
 ispsoft.pro, 1
 ispymissions.ga, 1
@@ -43405,21 +43172,21 @@ itcbuerobedarf.de, 1
 itchy.nl, 1
 itchybrainscentral.com, 1
 itconsulting-wolfinger.de, 1
+itcoolie.in, 1
 itcs.services, 1
 itdaan.com, 1
 itdashboard.gov, 1
 itdata.ro, 1
 itdoneproperly.com, 1
 itds-consulting.com, 1
-itds-consulting.cz, 1
 itds-consulting.eu, 1
 itdutchie.com, 1
-itechgeekology.com, 1
 itecor.net, 0
 iteecafe.hu, 1
 iteha.de, 1
 iteke.ml, 1
 iteke.tk, 1
+iteli.eu, 1
 itemcreator.tk, 1
 itemmc.com, 1
 itemorder.com, 1
@@ -43429,6 +43196,7 @@ iterror.co, 0
 itezu.ml, 1
 itfh.eu, 1
 itfix.cz, 1
+itgalaxy.com.au, 1
 itgirls.rs, 1
 itgoesup.com, 1
 itgoesupent.com, 1
@@ -43477,7 +43245,6 @@ itraffic.cf, 1
 itraffic.tk, 1
 itraveille.fr, 1
 itreallyaddsup.com, 1
-itrendyworld.com, 1
 itring.pl, 0
 itruss.com.tw, 1
 itruth.tk, 1
@@ -43553,7 +43320,6 @@ ivanovka.ga, 1
 ivanovocity.tk, 1
 ivanovolive.ru, 1
 ivanpolchenko.com, 1
-ivanteevka.org, 1
 ivaoru.org, 1
 ivendi.com, 1
 ivermectin.gq, 1
@@ -43577,6 +43343,7 @@ ivorvanhese.nl, 1
 ivoryandgrace.com, 1
 ivoryonsunset.com, 1
 ivotemahdi.com, 1
+ivoucher-kuwait.com, 1
 ivpn.net, 1
 ivre.rocks, 1
 ivsign.net, 1
@@ -43584,7 +43351,6 @@ ivusn.cz, 1
 ivvl.ru, 1
 ivxv.ee, 1
 ivy-league-colleges.com, 1
-ivy.show, 1
 ivystech.com, 0
 iwader.co.uk, 1
 iwalton.com, 1
@@ -43697,7 +43463,6 @@ j5lx.eu, 1
 j5lx.io, 1
 j605.tk, 1
 j6729.co, 1
-j6729.com, 1
 j6957.co, 1
 j70101.com, 1
 j70102.com, 1
@@ -43816,6 +43581,7 @@ jacobphono.com, 1
 jacobs-implantate.at, 1
 jacobsenarquitetura.com, 1
 jacquesdedixmude.eu, 1
+jaculus.eu, 1
 jacuzziprozone.com, 1
 jadara.info, 1
 jadchaar.me, 1
@@ -43829,6 +43595,7 @@ jaeger.link, 1
 jaegerlacke.de, 1
 jaepinformatica.com, 1
 jaetech.org, 1
+jafarmehdipor.ga, 1
 jagadhatrionline.co.in, 1
 jagbouncycastles.co.uk, 1
 jagerkin.tk, 1
@@ -43886,6 +43653,7 @@ jakub-boucek.cz, 1
 jakubarbet.eu, 1
 jakubboucek.cz, 1
 jakubklimek.com, 1
+jakubsindelar.cz, 1
 jakubtopic.cz, 1
 jakubvrba.cz, 1
 jala.co.jp, 1
@@ -43919,6 +43687,7 @@ jamesknd.uk, 0
 jamesmarsh.net, 1
 jamesmcdonald.com, 0
 jamesmilazzo.com, 1
+jamesplumbingcompanypasadenatx.com, 1
 jamesrains.com, 1
 jamesrobertson.io, 1
 jamesrobertson.sh, 1
@@ -44002,6 +43771,7 @@ janome.com.ua, 1
 janostheil.de, 1
 janschaumann.de, 1
 janssen.fm, 1
+jantari.com, 1
 janterpstra.eu, 1
 jantinaboelens.nl, 1
 janv.it, 1
@@ -44040,7 +43810,7 @@ jarl.ninja, 1
 jarmandental.com, 1
 jarmatys.pl, 1
 jarniashop.se, 1
-jarods.org, 1
+jarods.org, 0
 jaroku.com, 1
 jarondl.net, 1
 jaroslavc.eu, 1
@@ -44087,7 +43857,6 @@ javascriptlab.fr, 1
 javaweb.site, 1
 javaxxz.com, 1
 javfree.me, 1
-javhdmovies.com, 1
 javi-soleil.tk, 1
 javierbalvin.com, 1
 javierburgos.net, 1
@@ -44266,7 +44035,6 @@ jeffreyhaferman.com, 1
 jeffri.me, 1
 jeffsanders.com, 1
 jefftickle.com, 1
-jeffwebb.com, 1
 jefrydco.id, 1
 jefsweden.eu, 1
 jehelpdesk.nl, 1
@@ -44289,7 +44057,6 @@ jelleraaijmakers.nl, 1
 jelly.cz, 1
 jellybeanbooks.com.au, 1
 jellyfish.co, 1
-jellyfloral.com, 1
 jellypepper.com, 1
 jellysquid.me, 1
 jelmer.co.uk, 1
@@ -44392,7 +44159,6 @@ jessgranger.com, 1
 jessica-weller.de, 1
 jessicabarends.nl, 1
 jessicabenedictus.nl, 0
-jessicaevrard.com, 1
 jessicahrehor.com, 1
 jessicharlie.com, 1
 jessieabraham.tk, 1
@@ -44451,6 +44217,7 @@ jf-projects.de, 0
 jf886.cc, 1
 jfbst.net, 1
 jfgselbitztal.tk, 1
+jfjtransport.com, 1
 jfr.im, 1
 jfreitag.de, 0
 jftw.org, 1
@@ -44463,8 +44230,10 @@ jgoguen.ca, 1
 jgoldgroup.com, 1
 jgonzalezm.com, 1
 jgregory.co.uk, 1
+jgtrainer.com, 1
 jgwb.de, 1
 jgwb.eu, 1
+jhatpatjobs.com, 1
 jhaveri.net, 1
 jhburton.co.uk, 1
 jhcommunitysports.co.uk, 1
@@ -44472,6 +44241,7 @@ jhe.li, 1
 jhill.de, 1
 jhmrcm.com, 1
 jhollandtranslations.com, 1
+jhonmurillo.ml, 1
 jhost.gq, 1
 jhuang.me, 1
 jhw3d.com, 1
@@ -44616,6 +44386,7 @@ jlr-luxembourg.com, 0
 jltcsecuritygroup.com, 1
 jltctech.com, 1
 jm-bea.net, 1
+jmap.support, 1
 jmarciniak.it, 1
 jmb.lc, 1
 jmbeautystudio.se, 1
@@ -44664,7 +44435,6 @@ joaojunior.com, 1
 joaopenteado.com, 1
 joaosampaio.com.br, 1
 job-chocolat.jp, 1
-job-ofertas.info, 1
 job.biz.tr, 1
 jobalicious.nl, 1
 jobastudio.nl, 1
@@ -44680,7 +44450,6 @@ jobbsafari.se, 1
 jobcorpsy2y.com, 1
 jobfresh.ga, 1
 jobfury.com, 1
-jobify.in, 1
 jobindex.dk, 1
 jobit.gr, 1
 joblab.com.ua, 0
@@ -44770,6 +44539,7 @@ johanbissemattsson.se, 0
 johand.io, 1
 johanlog.com, 1
 johannaojanen.com, 1
+johannavarmala.fi, 1
 johannes-bauer.com, 1
 johannes-schaefer.de, 1
 johannes-sprink.de, 0
@@ -44821,8 +44591,6 @@ johnnybetstaging.com, 1
 johnnybsecure.com, 1
 johnnywan.net, 1
 johnopdenakker.com, 1
-johnpenny.info, 1
-johnpenny.uk, 1
 johnroach.io, 1
 johnroberts.me, 1
 johnrockefeller.net, 1
@@ -44842,6 +44610,7 @@ joinamericacorps.gov, 1
 joinhonor.com, 1
 jointotem.com, 1
 joinus-outfits.nl, 1
+jojo.sg, 1
 jojosplaycentreandcafeteria.co.uk, 1
 jokedalderup.nl, 1
 jokequebec.com, 1
@@ -44867,6 +44636,7 @@ jolokia.ch, 1
 jomagus.de, 1
 jomo.tv, 1
 jomsolat.tk, 1
+jon8rfc.homeip.net, 1
 jonahburke.com, 1
 jonahperez.com, 1
 jonale.net, 1
@@ -44924,7 +44694,6 @@ jonohewitt.com, 1
 jonola.com, 1
 jonpads.com, 1
 jonpavelich.com, 1
-jons.org, 1
 jonscaife.com, 1
 jonssheds.direct, 1
 jonstar.tk, 1
@@ -45065,7 +44834,6 @@ jp.md, 1
 jp4f.de, 1
 jpbe-network.de, 1
 jpbe.de, 1
-jpbike.cz, 0
 jpcrochetapparel.com, 1
 jpdeharenne.be, 0
 jpeg.io, 1
@@ -45076,7 +44844,6 @@ jplennard.com, 1
 jpm-inc.jp, 1
 jpmelos.com, 1
 jpmelos.com.br, 1
-jpmguitarshop.com.br, 1
 jpod.cc, 1
 jppcadvertising.com, 1
 jpph.org, 1
@@ -45099,7 +44866,6 @@ jr5proxdoug.xyz, 1
 jrabasco.me, 1
 jrc9.ca, 0
 jrchaseify.xyz, 1
-jrcmo.com, 1
 jreb.nl, 1
 jreiff.de, 1
 jreinert.com, 1
@@ -45132,6 +44898,7 @@ jscsteigerbouw.nl, 1
 jsd-cog.org, 1
 jsdelivr.com, 1
 jsdelivr.net, 1
+jsdesign.mx, 1
 jselby.net, 1
 jsfloydlaw.com, 1
 jsh918.com, 1
@@ -45146,6 +44913,7 @@ jslots.dk, 1
 jsme.cz, 1
 jsnfwlr.com, 1
 jsnfwlr.io, 1
+json2bot.chat, 1
 jsonsinc.com, 1
 jsphys.org.cn, 1
 jsproxy.tk, 0
@@ -45175,6 +44943,7 @@ juanjovega.com, 1
 juanmaguitar.com, 1
 juanmazzetti.com, 1
 juanxt.ddns.net, 1
+jub0bs.com, 1
 jubileum.online, 1
 jubileumfotograaf.nl, 1
 jubodarpan.in, 1
@@ -45201,11 +44970,15 @@ juezz.top, 1
 jugendfeuerwehr-vechta.de, 1
 jugendhackt.org, 1
 jugendsuenden.info, 1
+juggo.me, 1
 jugh.de, 1
 jugwallonie.be, 1
 juhakoho.com, 1
+juhanihakala.fi, 1
 juice.codes, 1
 juk.life, 0
+jukkakivi.fi, 1
+jukkakivimaki.fi, 1
 jukovka.tk, 1
 juku-wing.jp, 1
 jule-spil.dk, 1
@@ -45257,9 +45030,7 @@ jumbopan.net, 1
 jumeirashoes.com, 1
 jump-zone.co.uk, 1
 jump.wtf, 1
-jump4funinflatables.co.uk, 1
 jumpandbounce.co.uk, 1
-jumpandjivechildrensparties.co.uk, 1
 jumparoundbouncycastles.co.uk, 1
 jumparty.co.uk, 1
 jumpbuttonnorth.com, 1
@@ -45297,7 +45068,7 @@ junias-fenske.de, 1
 juniorhandball.com, 1
 juniorsambo.tk, 1
 juniperroots.ca, 1
-junjhome.com, 1
+junjie.pro, 1
 junjun-web.net, 1
 junkdrome.org, 1
 junkfoodcafe.com, 1
@@ -45306,6 +45077,7 @@ juno.co.uk, 1
 junoaroma.com, 1
 junodownload.com, 1
 junomessenger.cf, 1
+junta.pl, 1
 juozasveza.lt, 1
 jupiterchiropractic.com, 1
 juppy.tk, 1
@@ -45372,6 +45144,7 @@ justpaste.it, 1
 justpdf.cf, 1
 justquoteme.ga, 1
 justrighthsc.com, 1
+justsellmycar.com, 1
 justsmart.io, 1
 justsome.info, 1
 justtalk.site, 1
@@ -45384,7 +45157,6 @@ juszkiewicz.com.pl, 1
 jutella.de, 0
 jutlander-netbank.dk, 1
 jutlander.dk, 1
-juttaheitland.com, 1
 juusujanar.eu, 0
 juventusmania1897.com, 1
 juwelierstoopman.nl, 1
@@ -45396,6 +45168,7 @@ jvbouncycastlehire.co.uk, 1
 jvdham.nl, 1
 jvdz.nl, 1
 jvega.me, 1
+jvianes.ddns.net, 1
 jvlandscapingservices.com, 1
 jvlfinance.cz, 1
 jvn.com, 1
@@ -45715,7 +45488,6 @@ k87021.com, 1
 k87022.com, 1
 k87023.com, 1
 k87024.com, 1
-k87025.com, 1
 k87026.com, 1
 k87027.com, 1
 k87028.com, 1
@@ -45986,7 +45758,6 @@ k8meinv.com, 1
 k8n.de, 1
 k8r.eu, 1
 k8slot.com, 1
-k8top.com, 1
 k8v02.com, 1
 k8v03.com, 1
 k8v04.com, 1
@@ -46013,13 +45784,11 @@ k8v29.com, 1
 k8v30.com, 1
 k8vn001.com, 1
 k8vn002.com, 1
-k8vn003.com, 1
 k8vn005.com, 1
 k8vn008.com, 1
 k8vn009.com, 1
 k8vn010.com, 1
 k8vn011.com, 1
-k8vn9999.com, 1
 k9297.co, 1
 k955.vip, 1
 k966.vip, 1
@@ -46055,6 +45824,7 @@ kabinett.cz, 1
 kabinettindia.in, 1
 kabluchek.tk, 1
 kabluchok.tk, 1
+kabodo.com, 1
 kabos.art, 1
 kabu-abc.com, 1
 kabukpsikoloji.com, 1
@@ -46079,16 +45849,15 @@ kafel-ufa.tk, 1
 kaffad.site, 1
 kaffau.com, 1
 kaffeekrone.de, 1
+kaffeeringe.de, 1
 kafoom.de, 1
 kagawa-net.org, 1
 kaggle.com, 1
 kagicomb.org, 1
-kaginalycloud.com, 1
 kagitreklam.com, 1
 kagomesashi.tk, 1
 kagucho.net, 1
 kahootkings.works, 1
-kahopoon.net, 1
 kai-ratzeburg.de, 1
 kai-ruecker.tk, 1
 kai.cool, 0
@@ -46154,7 +45923,6 @@ kakacon.nz, 1
 kakao-karten.de, 1
 kakaravaara.fi, 1
 kakdolgonline.cf, 1
-kakie-gobocha.jp, 1
 kakie-kolesa.ru, 1
 kakofotmitzaim.cf, 1
 kakofotmitzaim.ga, 1
@@ -46322,6 +46090,7 @@ kapanlagi.gq, 1
 kapelya.gq, 1
 kapiorr.duckdns.org, 1
 kapital-kredit.cf, 1
+kaplan.se, 1
 kaplanco.com, 1
 kaplatzis.com, 1
 kapler.family, 0
@@ -46331,6 +46100,7 @@ kappershuis-meppel.nl, 1
 kappharn.com, 1
 kappie.xyz, 1
 kappit.dk, 1
+kapsalondigo.nl, 1
 kapsalonlinds.nl, 1
 kapseli.net, 1
 kaptadata.com, 1
@@ -46354,6 +46124,12 @@ karanlyons.com, 1
 karantholdings.ga, 1
 karantyn.pro, 1
 karaoglanis.tk, 1
+karaokerentalcalgary.com, 1
+karaokerentaledmonton.com, 1
+karaokerentalmontreal.com, 1
+karaokerentalottawa.com, 1
+karaokerentaltoronto.com, 1
+karaokerentalvancouver.com, 1
 karapuzz.tk, 1
 karasik.by, 1
 karateka.org, 1
@@ -46397,7 +46173,6 @@ karmabaker.com, 1
 karmaflux.com, 1
 karmaful.de, 1
 karmainsurance.ca, 1
-karmaplatform.com, 1
 karmaspa.se, 1
 karmatrend.cf, 1
 karn.nu, 1
@@ -46411,6 +46186,7 @@ karopc.com.pl, 1
 karopc.pl, 1
 karoverwaltung.de, 1
 karpanhellas.com, 0
+karpat.space, 1
 karr.ga, 1
 karramba.tk, 1
 karriharju.tk, 1
@@ -46423,7 +46199,6 @@ karta-baikala.ml, 1
 karta-paliwowa.pl, 1
 kartacha.com, 1
 kartar.net, 0
-kartatopia.com, 1
 kartbird.com, 1
 kartec.com, 1
 karten-verlag.de, 1
@@ -46440,6 +46215,7 @@ kas.ie, 1
 kasasaprotect.com, 1
 kaseban.com, 1
 kasei.im, 1
+kasettilamerit.fi, 1
 kashadriskill.com, 1
 kashbet.com, 1
 kashbet.net, 1
@@ -46476,7 +46252,6 @@ kasual.id, 1
 kat.al, 1
 kat.marketing, 0
 kat4at.tk, 1
-katabra.gr, 1
 katagena.com, 1
 kataiszilveszter.hu, 1
 katalog-serverov.ga, 1
@@ -46486,6 +46261,7 @@ katalogbutikker.dk, 1
 katalogharga.cf, 1
 katalogkapsli.pl, 1
 katan-stroi.tk, 1
+katapult-impuls.com, 1
 katapult.es, 1
 katarsisuib.no, 1
 katazuketai.net, 1
@@ -46570,7 +46346,6 @@ kayleen.net, 1
 kaylyn.ink, 0
 kayo.digital, 1
 kayon.cf, 1
-kayon.tj, 1
 kaypasocks.com, 1
 kayscs.com, 1
 kaysis.gov.tr, 1
@@ -46913,7 +46688,7 @@ keelove.net, 1
 keemail.me, 1
 keematdekho.com, 1
 keen.media, 1
-keengamer.com, 0
+keengamer.com, 1
 keepa.com, 1
 keepdecor.com, 1
 keeperapp.com, 1
@@ -47046,7 +46821,6 @@ keramed.gq, 1
 kerameion.com, 1
 kerebro.com, 1
 kerijacoby.com, 1
-kermadec.com, 1
 kermadec.fr, 1
 kernel-error.de, 1
 kernel-panik.me, 1
@@ -47071,6 +46845,7 @@ kescher.site, 1
 kesef.org.il, 1
 keshausconsulting.com, 1
 keskeces.com, 1
+kessawear.com, 1
 kessel-runners.com, 1
 kesslerandsons.com, 1
 kesslerwine.com, 1
@@ -47103,7 +46878,6 @@ kevindekoninck.com, 0
 kevindienst.blog, 1
 kevinfoley.cc, 1
 kevinfoley.org, 1
-kevinfumbles.com, 1
 kevingsky.com, 1
 kevinhill.nl, 1
 kevinhq.com, 1
@@ -47128,7 +46902,7 @@ keybase.io, 1
 keybored.co, 1
 keybored.me, 1
 keycdn.com, 1
-keycenter.com.br, 1
+keycdn.xyz, 1
 keycontainers.co.za, 1
 keyerror.com, 1
 keyex.com.br, 1
@@ -47147,8 +46921,9 @@ keynes.id.au, 1
 keyphotojs.cf, 1
 keypointfrancine.nl, 1
 keys.fedoraproject.org, 1
-keys247.co.uk, 1
+keyschip.com, 1
 keyserver.sexy, 0
+keysmedspa.com, 1
 keysofart.com, 1
 keysso.net, 1
 keystoneok.com, 0
@@ -47398,7 +47173,7 @@ kfzjeugd.nl, 1
 kg7.pl, 1
 kgcarpetandupholsterycleaning.com, 1
 kgm-irm.be, 1
-kgnk.ru, 1
+kgnk.ru, 0
 kgt10.ru, 1
 kha.com, 1
 khaganat.net, 1
@@ -47451,7 +47226,6 @@ kiarayoga.com, 1
 kiasarnews.tk, 1
 kiasystems.com, 1
 kibea.net, 1
-kibibit.net, 1
 kibriscicek.net, 1
 kick-in.nl, 1
 kickasscanadians.ca, 1
@@ -47510,6 +47284,7 @@ kievradio.com, 1
 kiffmarks.com, 1
 kifid.nl, 1
 kigmbh.com, 1
+kigurumi-party.ru, 1
 kii91.com, 1
 kiinteistot-lidl.fi, 1
 kiir.net, 1
@@ -47597,8 +47372,8 @@ kingcannabisshop.com, 1
 kingclass.cn, 1
 kingdomexperiments.org, 1
 kingdominnergy.com, 1
-kingdoms.gg, 1
 kingfast.eu.org, 1
+kingforex.co, 1
 kingiescastles.co.uk, 1
 kingjamesbibleonline.org, 1
 kingjamesgospel.com, 1
@@ -47632,9 +47407,7 @@ kinkcafe.net, 1
 kinkenonline.com, 1
 kinkyhookup.com, 1
 kinmunity.com, 1
-kinnettmemorial.org, 1
 kinnikinnick.com, 1
-kinniyaonlus.com, 0
 kino-boom.tk, 1
 kino-doma.tk, 1
 kino-room.ga, 1
@@ -47884,7 +47657,6 @@ klarika.com, 1
 klarmobil-empfehlen.de, 1
 klassika.tk, 1
 klauke-enterprises.com, 1
-klausbijou.com.br, 1
 klausbrinch.dk, 0
 klausen.dk, 1
 klauswissmann.com, 1
@@ -47969,18 +47741,19 @@ klop.info, 1
 klose.family, 1
 klosko.net, 1
 kloudboy.com, 1
+kls-platform.com, 1
 klssn.com, 1
 klu.io, 1
 klub-zajmov.ga, 1
 klub.tk, 1
 kluck.me, 1
 klugemedia.de, 1
-klupper.com, 1
 klusbedrijfdupau.nl, 1
 klushka.cf, 1
 klusservice-utrecht.nl, 1
 klustermedia.com, 1
 klusweb-merenwijk.nl, 1
+klute.spdns.de, 1
 klva.cz, 1
 kmashworth.co.uk, 1
 kmkz.jp, 1
@@ -48007,9 +47780,9 @@ kneli.co.il, 1
 knep.me, 1
 kneppe.me, 1
 knetterbak.nl, 1
-kngk-group.ru, 1
+kngk-group.ru, 0
 kngk-transavto.ru, 1
-kngk.org, 1
+kngk.org, 0
 kngkng.com, 1
 kniga-ru.tk, 1
 kniga.market, 0
@@ -48019,7 +47792,6 @@ knighkidoma.tk, 1
 knightsblog.de, 1
 knightsbridge.net, 1
 knightsbridgewine.com, 1
-knightsofcolumbus867.com, 1
 knightsweep.com, 1
 knighulki.cf, 1
 knigi-free.cf, 1
@@ -48134,7 +47906,6 @@ kogotok.ml, 1
 kogro.de, 1
 kogudesi.com, 1
 kohlistkool.tk, 1
-koho.fi, 1
 kohoutsautomotive.com, 1
 kohparadise.com, 1
 kohsandra.com, 0
@@ -48143,6 +47914,7 @@ koicenter-thuine.de, 1
 koifish.org, 1
 koineuno.com, 1
 koirala.email, 1
+koishi.pro, 1
 koji-tsujitani.net, 1
 kojip.com, 1
 kojipkgs.fedoraproject.org, 1
@@ -48150,7 +47922,6 @@ kojy.fr, 1
 koka-shop.de, 1
 kokensupport.com, 1
 koketteriet.se, 1
-koki.cl, 1
 kokoiroworks.com, 1
 kokomo.xyz, 1
 kokomu.com, 1
@@ -48216,6 +47987,7 @@ komment.ml, 1
 kommotiv.nl, 1
 kommunermeddnssec.se, 1
 kommunermedipv6.se, 1
+kommunikation-czw.de, 1
 kommunistienliitto.tk, 1
 kommx.de, 1
 komodo.com.tr, 1
@@ -48303,7 +48075,6 @@ kopfootdoctor.com, 1
 kopfsalat.eu, 0
 kopfschaschlik.de, 1
 kopfundseele.de, 1
-kopidingin.xyz, 1
 kopjethee.nl, 1
 koplancpa.com, 1
 koplax-online.com, 1
@@ -48344,7 +48115,6 @@ korrelzout.nl, 1
 kortarsmagyarfesto.tk, 1
 kortgebyr.dk, 1
 korund.tk, 1
-korup.com, 1
 koryfi.com, 1
 kos4all.com, 1
 kos9078.com, 1
@@ -48563,9 +48333,9 @@ krmeni.cz, 0
 kroell.net, 1
 krok.gq, 1
 krokedil.se, 1
-kromamoveis.com.br, 1
 kromax.it, 1
 kromciri.gq, 1
+krome.sg, 1
 kromonos.net, 1
 kronopolo.com, 1
 krony.de, 1
@@ -48577,6 +48347,7 @@ krossakorven.tk, 1
 krouzkyliduska.cz, 0
 krovatka.tk, 1
 kroy.io, 1
+krpaforum.org, 1
 krsaustralia.com.au, 1
 krsn.de, 1
 krsvrs.nl, 1
@@ -48599,7 +48370,6 @@ krutka.cz, 1
 kruu.de, 1
 kry.no, 1
 kry.se, 1
-kryglik.com, 1
 kryha.io, 0
 krypmonet.com, 1
 krypsys.com, 1
@@ -48732,6 +48502,7 @@ ks1908.com, 1
 ks1909.com, 1
 ks191.com, 1
 ks196.com, 1
+ks1athome.co.uk, 1
 ks2.vip, 1
 ks20.vip, 1
 ks200.vip, 1
@@ -49287,7 +49058,6 @@ kuropatina.tk, 1
 kurrende.nrw, 0
 kurschies.de, 1
 kurserne.dk, 1
-kursk-otoplenie.ru, 1
 kursk.cf, 1
 kurswahl-online.de, 1
 kursyjezykowelublin.pl, 1
@@ -49306,6 +49076,7 @@ kushner-cpa.co.il, 0
 kushtikidsparties.co.uk, 1
 kusochi.eu, 1
 kustod.io, 1
+kustom-kitchens.com, 1
 kustosija.tk, 1
 kutamo.com, 1
 kutekeiki.com, 1
@@ -49395,7 +49166,6 @@ kyj57.com, 1
 kyj577.com, 1
 kyj59.com, 1
 kyj599.com, 1
-kyj611.com, 1
 kyj622.com, 1
 kyj633.com, 1
 kyj644.com, 1
@@ -49424,7 +49194,6 @@ kyobostory-events.com, 1
 kyochon.fr, 1
 kyoko.org, 1
 kyosaku.org, 1
-kyoto-k9.com, 0
 kyoto-mic.com, 1
 kyoto-sake.net, 1
 kyoto-tomoshibi.jp, 1
@@ -49514,6 +49283,7 @@ labelfactory.nl, 1
 labequipvn.com, 1
 labiblioafronebrulepas.com, 0
 labirint.cf, 1
+lablic-beta.work, 1
 lablnet.tk, 1
 labobooks.com, 1
 laboiteanem.fr, 1
@@ -49557,7 +49327,6 @@ lacicloud.net, 1
 lackan.tk, 1
 lackierereischmitt.de, 1
 laclaque.ch, 0
-lacledeslan.com, 1
 lacledeslan.org, 1
 lacledor.ch, 0
 laclefdor.ch, 0
@@ -49600,12 +49369,13 @@ ladyofhopeparish.org, 1
 ladyofsongstv.com, 1
 ladysecrets.cf, 1
 ladysecrets.ga, 1
+laemen.com, 0
+laemen.nl, 0
 laemiliafutbol.tk, 1
 laencina.tk, 1
 laermschmiede.de, 1
 laeryn.com, 1
 laesisvefurinn.is, 1
-laestacionmontevideo.com, 1
 laextra.mx, 1
 lafansite.tk, 1
 lafantasticatravel.com, 1
@@ -49619,7 +49389,6 @@ lafka.org, 1
 laflash.com, 1
 lafr4nc3.xyz, 1
 lag-gbr.gq, 1
-lagaia.com.br, 1
 lagazzettadigitale.it, 1
 lagerauftrag.info, 1
 lagier.xyz, 1
@@ -49681,9 +49450,9 @@ lakeview.photography, 1
 lakewinnipegdatastream.ca, 1
 lakewoodcityglass.com, 1
 lakewoodcomputerservices.com, 1
+lakewylietax.com, 1
 lakiernictwo.auto.pl, 1
 lakkt.de, 1
-lakonia.com.br, 1
 lakorntoday.com, 1
 lakorona.tk, 1
 lalalab.com, 1
@@ -49747,7 +49516,6 @@ lamppostpublishing.com, 1
 lampsh.ml, 1
 lampy.pl, 1
 lamujerquesoy.com, 0
-lamunyonfoundationrepair.com, 1
 lan-divy.com, 1
 lan-divy.fr, 1
 lan.biz.tr, 1
@@ -49756,6 +49524,7 @@ lana.swedbank.se, 1
 lanahallen.com, 1
 lanbroa.eu, 1
 lancashirecca.org.uk, 1
+lancea.pl, 1
 lancejames.com, 1
 lancelafontaine.com, 1
 lancelhoff.com, 1
@@ -49808,6 +49577,7 @@ lanetix.com, 1
 lanforalla.se, 1
 lang-php.com, 1
 langadeduero.tk, 1
+langages-programmation.tk, 1
 langapi.com, 1
 langatang.com, 1
 langbein.org, 1
@@ -49817,7 +49587,6 @@ langhun.me, 1
 langjp.com, 0
 langkahteduh.com, 1
 langkawihomestay.net, 0
-langleyporter.com, 1
 langly.fr, 1
 langotie.com.br, 1
 langsam-dator.se, 1
@@ -49968,6 +49737,7 @@ lasix-medication.cf, 1
 lask.in, 1
 laskas.pl, 1
 lasmesas.tk, 1
+lasmoarquitectos.com, 1
 lasnoticias.info, 1
 lasowy.com, 1
 laspequenassemillas.com, 1
@@ -50052,6 +49822,7 @@ launchpadder2.com, 1
 launchyourcareer.com, 1
 laupv.online, 1
 lauraandwill.wedding, 0
+laurabailo.com, 1
 laurable.com, 1
 lauraenvoyage.fr, 1
 laurainnes.tk, 1
@@ -50087,13 +49858,12 @@ lauzon-hitter.com, 1
 lavabit.com, 1
 lavabit.no, 1
 lavaggista.it, 1
-lavalite.de, 1
 lavalon.tk, 1
 lavamine.tk, 1
 lavamob.com, 1
 lavanderia.roma.it, 1
 lavasing.eu.org, 1
-lavaux.lv, 1
+lavaux.lv, 0
 lavenderx.org, 1
 lavhire.tk, 1
 laviedalex.ovh, 1
@@ -50179,6 +49949,8 @@ lbgconsultores.com, 1
 lbihrhelpdesk.com, 1
 lbls.me, 0
 lbmblaasmuziek.nl, 1
+lbpc.pro, 1
+lbph.org, 1
 lbphacker.pw, 1
 lbrlh.tk, 1
 lbrli.tk, 1
@@ -50413,6 +50185,22 @@ lc8036.com, 1
 lc8038.com, 1
 lc8050.com, 1
 lc8052.com, 1
+lc80803.com, 1
+lc80804.com, 1
+lc80805.com, 1
+lc80806.com, 1
+lc80807.com, 1
+lc80808.com, 1
+lc80809.com, 1
+lc80810.com, 1
+lc80811.com, 1
+lc80812.com, 1
+lc80813.com, 1
+lc80815.com, 1
+lc80817.com, 1
+lc80818.com, 1
+lc80819.com, 1
+lc80820.com, 1
 lc818.net, 1
 lc8181.com, 1
 lc8282.com, 1
@@ -50703,8 +50491,6 @@ learnpianogreece.com, 1
 learnplayground.com, 1
 learntale.com, 1
 learnthetruth.tk, 1
-learntohack.me, 1
-learolstore.com, 1
 leaseit24.com, 1
 leaseit24.de, 1
 leaseourthings.com, 1
@@ -50764,6 +50550,7 @@ lecheng988.com, 1
 lechenietravami.cf, 1
 lechiennoir.net, 1
 lechite.ga, 1
+lechompenchaine.fr, 1
 lechucero.com, 1
 leclubnestleantillesguyane.fr, 1
 leclubnestlereunion.re, 1
@@ -50775,7 +50562,6 @@ ledburyvets.co.uk, 1
 ledcross.eu, 1
 leddeluxe.ml, 1
 leddingplasticsurgery.com, 1
-ledecologie.com.br, 1
 ledeguisement.com, 1
 ledensite.com, 1
 lederer-it.com, 1
@@ -50784,7 +50570,6 @@ ledlampor365.se, 1
 ledlight.com, 1
 ledlights.ca, 1
 lednavi.de, 1
-ledscontato.com.br, 1
 ledspadova.eu, 1
 ledspalluto.de, 1
 ledwereld.nl, 1
@@ -50798,13 +50583,12 @@ leebiblestudycentre.net, 1
 leebiblestudycentre.org, 1
 leech.ga, 1
 leeclemens.net, 0
-leedev.org, 1
 leefindlow.com, 1
 leekspin.ml, 1
 leelaylay.com, 1
 leelou.wedding, 1
-leemachinetools.com, 1
 leemankuiper.nl, 1
+leenaluhtanen.net, 1
 leendebroekertfonds.nl, 1
 leere.me, 1
 leerkotte.eu, 1
@@ -50822,6 +50606,7 @@ leeyoungaeph.tk, 1
 lefcoaching.nl, 0
 lefebvristes.com, 1
 lefebvristes.fr, 1
+lefilradio.fr, 1
 leflibustier.ru, 1
 leflox.cf, 1
 lefonddeloeil.com, 0
@@ -50878,6 +50663,7 @@ legkie-recepty.tk, 1
 legko-pohudet.cf, 1
 legland.fr, 1
 legnami24.it, 1
+legoktm.com, 1
 legoutdesplantes.be, 1
 legrandvtc.fr, 1
 legumeinfo.org, 1
@@ -50902,6 +50688,7 @@ leisure-blog.com, 1
 leisure-supplies-show.co.uk, 1
 leisurepools.com.au, 1
 leiyinan.com, 1
+lejade.fr, 1
 lejardindesmesanges.fr, 1
 leko.tk, 1
 lektier.cf, 1
@@ -51016,6 +50803,7 @@ lepenetapeti.com, 1
 leper.ga, 1
 lephilnet.tk, 1
 lepidum.jp, 1
+leporem.com.br, 1
 leppis-it.de, 1
 leprado.com, 1
 leprekon.tk, 1
@@ -51139,6 +50927,7 @@ letterbox-online.de, 1
 letterdance.de, 1
 letteringinstitute.com, 1
 lettersblogatory.com, 1
+letterzaken.nl, 1
 lettori.club, 1
 lettres-motivation.net, 1
 letturaveloce.tk, 1
@@ -51149,7 +50938,6 @@ leuenhagen.com, 1
 leulu.com, 1
 leumi-how-to.co.il, 1
 leutgeb.xyz, 1
-leuthardtfamily.com, 1
 lev103.com, 1
 levans.fr, 1
 levanscatering.com, 1
@@ -51160,6 +50948,7 @@ level-10.de, 1
 level6.me, 1
 level9hvac.com, 1
 levelaccordingly.com, 1
+levellock.com.ua, 1
 levelonetrainingandfitness.com, 1
 levels.one, 1
 levels3d.com, 1
@@ -51212,6 +51001,7 @@ lexpierce.social, 1
 lexway.pk, 1
 leybelsgarden.cf, 1
 leybold.co.id, 1
+leyendaluzrenacer.com, 1
 leymaritima.com, 1
 lezdomsm.com, 1
 lf112.net, 1
@@ -51219,6 +51009,7 @@ lfashion.eu, 1
 lfaz.org, 1
 lffweb.ga, 1
 lfgss.com, 1
+lfnaturopathie.com, 1
 lforum.tk, 1
 lfrconseil.com, 1
 lfyhokk.tk, 1
@@ -51236,7 +51027,6 @@ lgbusiness.es, 1
 lgesteticaautomotiva.com.br, 1
 lghfinancialstrategy.ch, 0
 lgnsh.fr, 1
-lgpecasoriginais.com.br, 1
 lgsg.us, 1
 lgygf.com, 1
 lhajn.cz, 1
@@ -51367,6 +51157,7 @@ libuni.eu, 1
 libyanexpert.ml, 1
 libzik.com, 1
 licence-registry.com, 1
+licensediscovery.io, 1
 liceo.cn, 1
 liceserv.com, 1
 lichess.org, 1
@@ -51433,13 +51224,13 @@ life-element.com, 1
 life-emotions.pt, 1
 life-in-hell.tk, 1
 life-tec.tk, 1
-life-time.nl, 1
 life29.com, 1
 lifeandhealthtips.tk, 1
 lifeartstudios.net, 1
 lifeasgame.tk, 1
 lifebetweenlives.com.au, 1
 lifeboxhealthcare.co.uk, 1
+lifebymargot.co.uk, 1
 lifecism.com, 1
 lifecoachkatrien.be, 1
 lifecraft.cf, 1
@@ -51458,7 +51249,6 @@ lifemstyle.com, 1
 lifenews24.tk, 1
 lifenexto.com, 1
 lifeqa.net, 1
-lifesafety.com.br, 1
 lifesavvy.com, 1
 lifesavvymedia.com, 1
 lifeset.pp.ua, 1
@@ -51480,14 +51270,15 @@ lifewithdyna.com, 1
 lifexpert.tk, 1
 lifi.digital, 1
 lifi.is, 1
-lift-wise.com, 1
 liftie.info, 1
 liftmastercloud.com, 1
 liftoff.rocks, 1
 ligadelconsorcista.org, 1
 ligadosgames.com, 1
 light-vision.com.ua, 1
+light.blue, 1
 light.mail.ru, 1
+lightbluelearning.com, 1
 lightbox.co, 1
 lightcraftmc.tk, 1
 lightdark.xyz, 1
@@ -51537,6 +51328,7 @@ lignite.com, 1
 lignoma.com, 1
 ligonier.com, 1
 lihaul.dnsalias.net, 1
+lihuenjardin.com, 1
 lije-creative.com, 1
 lijero.co, 1
 lijncoaching.nl, 1
@@ -51591,6 +51383,7 @@ liljohnsanitary.net, 1
 lille.ml, 1
 lillepuu.com, 1
 lilliputpreschool.co.nz, 1
+lillyfox.de, 1
 lilomatrixcorner.fr, 1
 lilosaludable.com, 1
 lilpwny.com, 1
@@ -51611,6 +51404,7 @@ limbo-online.tk, 1
 limbo.services, 1
 lime-host.cf, 1
 lime-host.tk, 1
+limecho.net, 1
 limehost.com, 1
 limit.xyz, 1
 limitededitioncomputers.com, 1
@@ -51629,7 +51423,7 @@ limsia.co, 1
 limsia.com, 1
 limstash.com, 1
 limstash.me, 1
-limules.ch, 1
+limules.ch, 0
 limx.win, 1
 lin.fi, 1
 lina-stores.co.uk, 1
@@ -51643,7 +51437,6 @@ lince-bonares.tk, 1
 lincnaarzorg.nl, 1
 lincoln.com.cn, 1
 lincoln.mx, 1
-lincolnboolefoundation.org, 1
 lincolncountytn.gov, 1
 lincolnfinewines.com, 1
 lincolnpedsgroup.com, 1
@@ -51675,12 +51468,10 @@ lineshop.ml, 1
 linestep.jp, 1
 linfamilygc.com, 1
 linge-ma.ro, 1
-lingerie.com.br, 1
 lingeriecollect.ga, 1
 lingeriesilhouette.com, 1
 lingolia.com, 0
 lingroove.com, 1
-lingting.vip, 1
 linguaromanica.tk, 1
 linguatrip.com, 1
 linherest.tk, 1
@@ -51796,7 +51587,6 @@ linuxarequipa.tk, 1
 linuxbabe.com, 1
 linuxbg.eu, 1
 linuxbierwanderung.com, 1
-linuxcbt.com, 1
 linuxchick.se, 1
 linuxcode.net, 1
 linuxcommand.ru, 1
@@ -51821,6 +51611,7 @@ linzgau.de, 1
 linzyjx.com, 1
 lion7.de, 1
 lionchita.tk, 1
+lionelsfarm.com, 1
 liongueststudios.com, 1
 lionhosting.nl, 1
 lionland.tk, 1
@@ -51875,6 +51666,7 @@ lishayut-prav.ga, 1
 lishayut-prav.gq, 1
 lishayut-prav.ml, 1
 lishayut-prav.tk, 1
+lishup.com, 1
 lisieuxarquitetura.com.br, 1
 lisinphotography.com, 1
 lisius.ga, 1
@@ -51945,9 +51737,9 @@ littledev.nl, 1
 littleduck.xyz, 1
 littlefamilyadventure.com, 1
 littlegreece.ae, 1
+littleireland.co.uk, 1
 littlelife.co.uk, 1
 littlelucifercafe.tk, 1
-littlelundgrenladies.com, 1
 littlemaster.tk, 1
 littlenina.nz, 0
 littlenlargeevents.co.uk, 1
@@ -52062,7 +51854,9 @@ living.video, 1
 living24.de, 1
 livingafrugallife.com, 1
 livingforreal.com, 1
+livinghealthywithchocolate.com, 1
 livinginhimalone.com, 1
+livinglifesecurely.com, 1
 livingmachines.nl, 1
 livingspace.co.nz, 1
 livingtohearsix.com, 1
@@ -52158,7 +51952,6 @@ lms-luch.ru, 1
 lmsptfy.com, 1
 lmsuitespagna.it, 1
 lmtls.me, 1
-lmtm.eu, 1
 lmtravis.com, 1
 lmvsci.gov, 1
 ln.io, 1
@@ -52244,6 +52037,9 @@ locapos.com, 1
 location-appartement-dakar.com, 1
 location-fichier-email.com, 1
 locationfontaine.fr, 1
+locationkaraokemontreal.com, 1
+locationkaraokeottawa.com, 1
+locationkaraokequebec.com, 1
 locationvoitureallemagne.com, 1
 locationvoitureangleterre.com, 1
 locationvoitureaustralie.com, 1
@@ -52271,14 +52067,10 @@ locker.plus, 1
 locker3.com, 1
 lockerroomstories.com, 1
 lockify.com, 1
-locklock.com.br, 1
-locklockbrasil.com.br, 1
 lockme.at, 1
 lockme.ch, 1
 lockme.de, 1
 lockme.pl, 1
-locknlock.com.br, 1
-locknlockbrasil.com.br, 1
 lockoutgroup.com, 1
 lockpick.nl, 1
 lockpicks.se, 1
@@ -52304,7 +52096,6 @@ locksmithfourways24-7.co.za, 1
 locksmithfriendswoodtexas.com, 1
 locksmithgarland-tx.com, 1
 locksmithgermiston24-7.co.za, 1
-locksmithgrapevinetx.com, 1
 locksmithhillcrest.co.za, 1
 locksmithhumbletx.com, 1
 locksmithindurban.co.za, 1
@@ -52332,6 +52123,9 @@ locksmithssanmarcostx.com, 1
 locksmithstaffordtx.com, 1
 locksmithswestville.com, 1
 locksmiththewoodlands.com, 1
+locksmithunit.cat, 1
+locksmithunit.com, 1
+locksmithunit.es, 1
 locksport.org.nz, 1
 lockwoodchristmastreefarm.com, 1
 locomen.me, 1
@@ -52398,6 +52192,7 @@ logitel.de, 1
 logitheque.tk, 1
 logitrack.tk, 1
 logo-vogtland.de, 1
+logodzyn.com, 1
 logoesun.com, 1
 logoglo.com, 1
 logojoes.net, 1
@@ -52411,8 +52206,6 @@ logtalk.org, 1
 logtenberg.eu, 1
 logue.be, 1
 logue.tk, 1
-logze.nl, 1
-lohanaflores.com.br, 1
 loheprobado.com, 1
 lohkoketju.fi, 1
 lohmeier.it, 1
@@ -52425,30 +52218,13 @@ loire-en-bateau.fr, 1
 loisircreatif.net, 1
 loisirsdouville.com, 1
 loja351.com, 0
-lojacriativos.com.br, 1
-lojadamimo.com.br, 1
-lojadanidrea.com.br, 1
-lojadarenda.com.br, 1
-lojadeessencia.com.br, 1
 lojadelicatojatai.com.br, 1
-lojadewhisky.com.br, 1
 lojadoanime.com, 1
-lojadoarcomprimido.com.br, 1
-lojadoprazer.com.br, 1
 lojadosomautomotivo.com.br, 1
-lojafazendoarte.com.br, 1
-lojafilipaper.com.br, 1
 lojahunamarcenaria.com.br, 1
 lojamagicalx.com, 1
-lojamascate.com.br, 1
-lojamoleco.com.br, 1
 lojapos.eu, 1
-lojaprojetoagua.com.br, 1
-lojas25online.com.br, 1
-lojastec.com.br, 1
 lojatema.com.br, 1
-lojaterrazul.com.br, 1
-lojavisamed.com.br, 1
 lojix.com, 0
 lojj.pt, 1
 lok.space, 1
@@ -52469,6 +52245,7 @@ loli.net, 1
 loli.pet, 1
 loli.today, 1
 loli.tube, 1
+loli.world, 1
 loliblogs.cf, 1
 loliblogs.ga, 1
 loliblogs.gq, 1
@@ -52495,7 +52272,6 @@ lolnames.gg, 1
 lolpatrol.de, 1
 lolpatrol.wtf, 1
 loma.ml, 1
-lomaem-nsk.ru, 1
 lomayko.ml, 1
 lombri-agro.com, 1
 lomerhouse.com, 1
@@ -52506,7 +52282,6 @@ lomza.tk, 1
 lon-so.com, 1
 lona.io, 1
 lonal.com, 1
-lonasdigital.com, 1
 lonavla.tk, 1
 lonay.me, 0
 london-mafia.tk, 1
@@ -52533,6 +52308,7 @@ lonestarlandandcommercial.com, 1
 long-6.com, 1
 long-8.com, 1
 long-9.com, 1
+long-journey.com, 1
 long008.com, 1
 long0310.com, 1
 long0311.com, 1
@@ -52555,39 +52331,28 @@ long0556.com, 1
 long0557.com, 1
 long0559.com, 1
 long0596.com, 1
-long0598.com, 1
-long0599.com, 1
 long0728.com, 1
-long0730.com, 1
 long0732.com, 1
 long0733.com, 1
 long0735.com, 1
 long0736.com, 1
 long0737.com, 1
-long0738.com, 1
 long0739.com, 1
 long0755.com, 1
 long0756.com, 1
 long0768.com, 1
-long0770.com, 1
 long0776.com, 1
 long0777.com, 1
 long0778.com, 1
-long0779.com, 1
-long0798.com, 1
-long0799.com, 1
 long08.com, 1
 long0812.com, 1
 long0816.com, 1
 long0818.com, 1
 long0833.com, 1
 long0855.com, 1
-long0856.com, 1
-long0876.com, 1
 long0877.com, 1
 long0878.com, 1
 long0886.com, 1
-long0887.com, 1
 long0888.com, 1
 long0896.com, 1
 long0897.com, 1
@@ -52658,13 +52423,6 @@ looka.photo, 1
 lookagain.co.uk, 1
 lookart.ch, 1
 lookasik.eu, 1
-lookastic.co.uk, 1
-lookastic.com, 1
-lookastic.de, 1
-lookastic.es, 1
-lookastic.fr, 1
-lookastic.mx, 1
-lookastic.ru, 1
 lookatmysco.re, 1
 lookbetweenthelines.com, 1
 looker.wang, 0
@@ -52676,7 +52434,6 @@ looneymooney.com, 1
 looneytunesdashgame.com, 1
 loony.info, 0
 loonylatke.com, 1
-loopback.kr, 1
 loopool.tk, 1
 loopower.com, 1
 loopstart.org, 1
@@ -52720,6 +52477,7 @@ loritaboegl.de, 1
 lorn.tk, 1
 lornabenes.com, 1
 los-diablos.tk, 1
+losangelesescorts.net, 1
 losangelestown.com, 1
 losaucas.tk, 1
 loschilums.tk, 1
@@ -52770,10 +52528,10 @@ lotos-ag.ch, 1
 lotro-wiki.com, 1
 lottodatabase.com, 1
 lottoland.pt, 1
+lottosonline.com, 1
 lottospielen24.org, 0
 lotusweb.tk, 1
 lotw.de, 1
-lotz.li, 1
 lou-castelet.com, 0
 lou.ist, 1
 lou.lt, 1
@@ -52845,7 +52603,6 @@ lovelive-anime.tk, 1
 lovelive.us, 1
 lovelivewiki.com, 1
 lovelivinghere.co.za, 1
-lovelocalbmore.com, 1
 lovelovenavi.jp, 1
 loveluna.com, 1
 lovelybook4u.gq, 1
@@ -52869,7 +52626,6 @@ loverngifts.com, 1
 loverussiangirls.tk, 1
 loveskin.co, 1
 lovesmagical.com, 0
-lovesove.com, 1
 lovessentials.com, 1
 lovestar.wang, 0
 lovesupremefestival.com, 1
@@ -52904,6 +52660,7 @@ loyaltyondemand.eu, 1
 loyisa.cn, 1
 lozhka-mernaya.tk, 1
 lp-support.nl, 1
+lp177.fr, 1
 lpacademy.com.br, 1
 lpbk-bethel.de, 0
 lpchemicalsolution.tk, 1
@@ -52970,7 +52727,6 @@ lty.space, 1
 lu.search.yahoo.com, 0
 lual.tk, 1
 luan.ma, 1
-luav.org, 1
 lubar.me, 1
 lubbockyounglawyers.org, 1
 lubersacr.com, 1
@@ -52978,7 +52734,7 @@ lubot.net, 1
 luc-oberson.ch, 0
 luca-steeb.com, 1
 luca.swiss, 1
-lucacastelnuovo.nl, 1
+lucacastelnuovo.nl, 0
 lucade.ddns.net, 1
 lucafontana.net, 1
 lucafrancesca.me, 1
@@ -52999,6 +52755,7 @@ lucciolachile.com, 1
 luce.life, 1
 lucentioluo.space, 1
 lucerin.ga, 1
+lucesledsbaratas.shop, 1
 luchscheider.de, 0
 luchthavenmaastricht.nl, 1
 lucia-art.cf, 1
@@ -53081,6 +52838,7 @@ luginbuehl.eu, 1
 lugros.tk, 1
 lugui.in, 1
 luisa-birkner.de, 1
+luisabreu.pt, 1
 luisanalopilatogrecia.tk, 1
 luisaviles.tk, 1
 luiscapelo.info, 1
@@ -53112,7 +52870,6 @@ lukasw.tk, 1
 lukaswiden.com, 1
 lukasztkacz.com, 1
 lukaszuk.net, 1
-lukaszuk.pl, 1
 lukaszwojcik.com, 1
 lukaszwojcik.net, 1
 luke.ch, 1
@@ -53153,6 +52910,7 @@ lumoria.eu, 1
 lumpenrock.tk, 1
 lumpy.ga, 1
 lums.se, 1
+luna-zen.fr, 1
 lunademiel.org, 1
 lunafag.ru, 1
 lunakit.org, 1
@@ -53161,6 +52919,7 @@ lunanova.moe, 1
 lunapps.com, 1
 lunar6.ch, 0
 lunares.pl, 1
+lunaretna.com, 1
 lunarflake.com, 1
 lunarhost.cf, 1
 lunarlog.com, 1
@@ -53235,6 +52994,7 @@ lux-house.tk, 1
 luxarchive.tk, 1
 luxcraft.eng.br, 1
 luxecalendar.com, 1
+luxedentalfl.com, 1
 luxemburgsite.tk, 1
 luxeturf.com.au, 1
 luxfosdecoenterprise.com, 1
@@ -53245,6 +53005,7 @@ luxstil.ga, 1
 luxur.is, 1
 luxury-inside.vn, 1
 luxurydistribution.cz, 1
+luxuryislandtrips.com, 1
 luxurynsight.net, 0
 luxuryspeed.tk, 1
 luxurytimepieces.net, 1
@@ -53266,6 +53027,8 @@ lvee.org, 1
 lvftw.com, 1
 lvguitars.com, 1
 lvmoo.com, 1
+lvna.capital, 1
+lvnacapital.com, 1
 lvrsystems.com, 1
 lvtrafficticketguy.com, 1
 lw-addons.net, 1
@@ -53288,7 +53051,9 @@ lycly.me, 1
 lydiawebfans.tk, 1
 lydudlejning.net, 1
 lyfbits.com, 1
+lyfebotanicals.com, 1
 lyftrideestimate.com, 1
+lyhathu.com, 1
 lykope.com, 1
 lymia.moe, 1
 lyna.ml, 1
@@ -53305,6 +53070,7 @@ lynsec.com, 1
 lynthium.com, 1
 lynx.nl, 1
 lynxbroker.de, 1
+lynxlab.io, 1
 lynxpro.nl, 1
 lynxriskmanager.com, 1
 lyon-interactive.com, 1
@@ -53324,8 +53090,6 @@ lysbed.com, 1
 lyscnd.com, 1
 lysergion.com, 1
 lyst.co.uk, 1
-lyteclinic.com, 1
-lytemedical.com, 1
 lyubov-sovmestimost.cf, 1
 lyuda.tk, 1
 lyukaacom.ru, 1
@@ -53429,7 +53193,6 @@ macaroons.tk, 1
 macaroonshindig.tk, 1
 macautocouture.ga, 1
 macaws.org, 1
-macbay.net, 1
 macbook.es, 1
 macc.org.my, 1
 macedonian-hotels.com.mk, 1
@@ -53483,6 +53246,7 @@ macosxfilerecovery.com, 1
 macpress.com.br, 1
 macramos.co.za, 1
 macreosolutions.com, 1
+macrofox.nl, 1
 macros.co.jp, 1
 macroseo.tk, 1
 macrostudent.com, 1
@@ -53575,8 +53339,8 @@ mafiaclan.tk, 1
 mafiaclub.ml, 1
 mafiaforum.de, 1
 mafiapenguin.club, 1
+mafiasi.de, 1
 mafworld.com, 1
-magaconnection.com, 1
 magadan.gq, 1
 magadan.ml, 1
 magaria.ml, 1
@@ -53592,7 +53356,6 @@ magazin3513.com, 1
 magazin4ik.ga, 1
 magazinecards.ga, 1
 magazinedabeleza.net, 1
-magazinedotreino.com.br, 1
 magazone.ml, 1
 magbt.net, 1
 magdeburg.directory, 1
@@ -53645,12 +53408,13 @@ magicstay.com, 1
 magictable.com, 1
 magicvodi.at, 1
 magilio.com, 1
+magisterjuris.com, 1
 magisternegi.tk, 1
 magliner.com, 1
 magnacarebroker.com, 1
 magnacumlaude.co, 1
+magnamus.it, 1
 magnate.co, 1
-magnatronic.com.br, 1
 magnes.priv.pl, 1
 magnesium-biomed.ch, 1
 magnesy-neodymowe.com.pl, 1
@@ -53777,6 +53541,7 @@ mainone.net, 1
 mainquest.org, 1
 mainston.com, 1
 maintenance-traceur-hp.fr, 1
+maintenancemtp.fr, 1
 mainzelmaennchen.net, 1
 maioresemelhores.com, 1
 mairie-sornay.fr, 1
@@ -53798,6 +53563,7 @@ maiti.info, 1
 maitrise-orthopedique.com, 1
 maitriser-son-stress.com, 1
 majahoidja.ee, 1
+majalmirasol.com, 1
 majameer.com, 1
 majaweb.cz, 1
 majemedia.com, 1
@@ -53823,6 +53589,7 @@ makedin.net, 1
 makefoodrecipes.com, 1
 makeh2o.com, 1
 makeit-so.de, 0
+makeitshort.ml, 1
 makelinks.online, 1
 makemejob.com, 1
 makemoney-plan.tk, 1
@@ -53867,6 +53634,7 @@ malahov.tk, 1
 malamutedoalasca.com.br, 1
 malardalenvvs.se, 1
 malariaadvice.gq, 1
+malariabehaviorsurvey.org, 1
 malash.me, 0
 malasuk.com, 1
 malaysia.cf, 1
@@ -53915,9 +53683,7 @@ mall.pl, 1
 mall.sk, 1
 mallach.net, 1
 mallgastronomico.com.ar, 1
-mallhonda.com, 1
 mallner.me, 1
-mallonline.com.br, 1
 mallpass.ga, 1
 malmyzh.tk, 1
 malnex.de, 1
@@ -53929,7 +53695,7 @@ malscan.org, 1
 malta-firma.com, 1
 maltasite.tk, 1
 maltaultrastifo.tk, 1
-maltegegner.de, 1
+maltegegner.de, 0
 malu.style, 1
 malufs.com.br, 1
 malvertise.xyz, 1
@@ -54060,6 +53826,7 @@ manicode.com, 1
 manicur-salon.tk, 1
 manicuradegel.com, 1
 manicuradegel.es, 1
+manilacrawl.com, 1
 manilaprinciples.org, 1
 maniorpedi.com, 1
 maniosglass.gr, 1
@@ -54078,6 +53845,7 @@ mannenzang.tk, 1
 mannheimbloggt.tk, 1
 manns-solutions.co.uk, 1
 mannschafft.ch, 1
+manoek.dynu.net, 1
 manoirdecontres.com, 1
 manojsharan.me, 1
 manonamission.de, 1
@@ -54144,6 +53912,7 @@ manyetikboya.com, 1
 manyhotfiesta.ml, 1
 manyiu.com, 1
 manylots.ru, 1
+manyproservices.com, 1
 manytubes.ga, 1
 manyue.org, 1
 maocular.org, 1
@@ -54170,6 +53939,7 @@ maplegate.info, 1
 maplehome.tk, 1
 mapletime.com, 1
 mappingfutures.org, 1
+mappingspaceperu.com, 1
 mapresidentielle.fr, 1
 mapstack.org, 1
 maquena.org, 1
@@ -54192,7 +53962,6 @@ marbree.eu, 1
 marbrerie-segur.fr, 1
 marc-beninca.fr, 1
 marc-hammer.de, 1
-marc-hoffrichter.de, 1
 marc-schlagenhauf.de, 1
 marcaixala.me, 1
 marcanhoury.com, 1
@@ -54271,6 +54040,7 @@ margays.de, 1
 margecommunication.com, 0
 margo-co.ch, 0
 margolis.gq, 1
+margotlondon.co.uk, 1
 margots.biz, 1
 margots.life, 1
 margots.tech, 1
@@ -54304,12 +54074,12 @@ marie-pettenbeck-schule.de, 1
 marie.club, 1
 mariehane.com, 1
 mariejulien.com, 1
+marielouise-oliwkiewicz.nl, 1
 marielouise.tk, 1
 mariemiramont.fr, 1
 mariendistel-tee.de, 1
 mariereichl.cz, 1
 mariescountymo.gov, 1
-marietrap.ch, 1
 marijnfidder.nl, 1
 marijuanajobscannabiscareers.com, 1
 marikafranke.de, 1
@@ -54343,6 +54113,7 @@ marioberluchi.by, 0
 mariogarcia.tk, 1
 mariogeckler.de, 0
 marioserver.ml, 1
+mariouniversalis.fr, 1
 mariposah.ch, 1
 marisamorby.com, 0
 marisasitaliankitchen.com, 1
@@ -54371,7 +54142,6 @@ markantalyamasajsalonu-bayanmasoz-cim.cf, 1
 markantoffice.com, 1
 markbiesheuvel.nl, 1
 markdain.net, 1
-markel.com.es, 1
 markepps.com, 1
 market-vanna.ru, 1
 market.android.com, 1
@@ -54383,13 +54153,13 @@ marketia.ml, 1
 marketindex.com.au, 1
 marketing-2.de, 1
 marketing-advertising.eu, 1
+marketing1-0-1.com, 1
 marketing4trends.com, 1
 marketing91.com, 1
 marketingbrandingnews.com, 1
 marketingbrandingnews.net, 1
 marketingco.nl, 1
 marketingconcafe.com, 1
-marketingconverts.com, 1
 marketingdesignu.cz, 1
 marketingforfood.com, 1
 marketingpalace.tk, 1
@@ -54406,11 +54176,13 @@ marketplace.org, 1
 marketplacestrategy.com, 1
 marketsearch.ga, 1
 marketvalue.gq, 1
+marketwau.com, 1
 marketwingsmobile.com, 1
 markf.io, 1
 markfisher.photo, 1
 markfordelegate.com, 1
-markhaehnel.de, 1
+markhaehnel.de, 0
+markhamfair.ca, 1
 markholden.guru, 1
 markhoodphoto.com, 1
 markhoodwrites.com, 1
@@ -54420,6 +54192,7 @@ markitzeroday.com, 1
 markjansen.tk, 1
 markkirkforillinois.com, 1
 markkirkforsenate.com, 1
+markkusilvennoinen.fi, 1
 marklauman.ca, 1
 markllego.com, 1
 markoglou.com.gr, 1
@@ -54443,7 +54216,7 @@ marktgorman.com, 1
 marktguru.at, 1
 marktguru.de, 1
 markup-ua.com, 1
-markus-blog.de, 0
+markus-blog.de, 1
 markus-dev.com, 1
 markus-keppeler.de, 1
 markus-musiker.de, 1
@@ -54455,6 +54228,7 @@ markusjanzen.de, 1
 markusjochim.de, 1
 markuskeppeler.de, 1
 markuskeppeler.no-ip.biz, 1
+markuslintula.fi, 1
 markusritzmann.ch, 1
 markusueberallassetmanagement.de, 1
 markusueberallconsulting.de, 1
@@ -54487,6 +54261,7 @@ marriage-shrine.jp, 1
 marriageawareness.com, 1
 marrickvilleapartments.com.au, 1
 marron-dietrecipe.com, 1
+marropax.com, 1
 mars.army, 1
 mars.navy, 1
 marsafc.tk, 1
@@ -54547,6 +54322,7 @@ martinvillalba.com.ar, 1
 martinvillalba.info, 1
 martinvillalba.net, 1
 martinvillalba.org, 1
+martinvolenec.cz, 1
 martonmihaly.hu, 1
 martonveronika.tk, 1
 martynhare.co.uk, 1
@@ -54560,6 +54336,7 @@ marvell.cat, 1
 marvelmoviemarathon.com, 1
 marvelo.cf, 1
 marvelousdesigners.com, 1
+marvelweed.ru, 1
 marvin.rocks, 1
 marvman.me, 1
 marvnet.cf, 1
@@ -54667,13 +54444,13 @@ masterdemolitioninc.com, 1
 masterdesingweb.tk, 1
 masterdigitale.com, 1
 masterdrilling.com, 1
+masterin.it, 1
 masterkitchen.com.br, 1
 mastermindcesar.com, 1
 masternetix.ga, 1
 masterofallscience.com, 1
 masterofbytes.ch, 1
 masterpassword.org, 1
-masterpc.co.uk, 1
 masterplc.com, 1
 masterplumber.coach, 1
 masters.black, 1
@@ -54717,7 +54494,6 @@ matel.org, 1
 matematikkulubu.tk, 1
 matematyka.wiki, 1
 materassi.roma.it, 1
-materiaischiquinho.com.br, 1
 material-ui.com, 1
 material-world-fuyouhin.com, 1
 materialism.com, 1
@@ -54725,6 +54501,8 @@ materialyinzynierskie.pl, 1
 materiel-grand-format.fr, 1
 maternalsafety.org, 1
 maternum.com, 1
+mateu.us, 1
+mateusmeyer.com.br, 1
 mateuszmajewski.com, 1
 mateuszpilszek.pl, 1
 matex-tokyo.co.jp, 1
@@ -54784,10 +54562,12 @@ matrimonio.com.pe, 1
 matrimonios.cl, 1
 matrimonybest.com, 1
 matriterie-sdv.ro, 1
+matrix.org, 1
 matrixglobalsms.com, 1
 matrixim.cc, 1
 matrixmedia.ro, 1
 matrixreq.com, 1
+matronal.ru, 1
 matryoshka-travel.club, 1
 matsu-semi.com, 1
 matt-brooks.com, 1
@@ -54860,6 +54640,7 @@ mattprojects.com, 1
 mattrude.com, 1
 matts.wiki, 1
 matts.world, 1
+mattshi.com, 1
 mattwservices.co.uk, 1
 matucloud.de, 1
 matuslab.net, 1
@@ -54879,6 +54660,7 @@ maurice-walker.com, 0
 mauricedb.nl, 1
 mauriceje.ga, 1
 mauricio-ochmann.tk, 1
+mauriciodulce.com, 1
 mauriciog.com.ar, 0
 mauricioghiorzi.com.ar, 0
 mauricioquadradoconsultor.com.br, 1
@@ -54907,14 +54689,14 @@ max-phone.com, 0
 max-went.pl, 1
 max.gov, 1
 max00365.com, 1
-max0365.com, 0
+max0365.com, 1
 max11365.com, 1
-max1365.com, 0
+max1365.com, 1
 max22365.com, 1
 max2365.com, 1
 max33365.com, 1
 max3365.com, 1
-max4365.com, 0
+max4365.com, 1
 max44365.com, 1
 max5365.com, 1
 max55365.com, 1
@@ -55009,11 +54791,10 @@ mayomarquees.com, 1
 mayopartyhire.com, 1
 mayorcahill.com, 1
 mayper.net, 0
-maypolevilla.co.uk, 1
 mayre-idol.tk, 1
 mayrhofer.eu.org, 0
 maysambotros.tk, 1
-maytalkhao.com, 1
+maytinhxachtay.vn, 1
 maywoodpark.com, 1
 mazartdesign.tk, 1
 mazavto.ml, 1
@@ -55065,6 +54846,7 @@ mbsr-barmstedt.de, 1
 mbsync4supply.com, 1
 mbte365.com, 0
 mbtt365.com, 0
+mburaks.com, 1
 mburns.duckdns.org, 1
 mbusi.com, 1
 mbwemmel-usedcars.be, 1
@@ -55168,7 +54950,6 @@ mcuuid.net, 1
 mcversions.net, 1
 mcvs.net, 1
 mcwrapper.com, 1
-mcynews.com, 1
 mcyukon.com, 1
 md-clinica.com.ua, 1
 md-progressistes.fr, 1
@@ -55210,6 +54991,7 @@ mdf-bis.com, 0
 mdhosting.co.uk, 1
 mdihi.com, 1
 mdinashop.com, 1
+mdinstituteplasticsurgery.com, 1
 mdinvest.nz, 1
 mdir.tk, 1
 mdiv.pl, 1
@@ -55224,6 +55006,7 @@ mdpraha.cz, 1
 mdrsp.de, 1
 mdrthmcs.io, 1
 mdsave.com, 1
+mdsconcept.fr, 1
 mdsglobal.com, 1
 mdtorelli.it, 1
 mdwftw.com, 1
@@ -55235,6 +55018,7 @@ me-center.com, 1
 me-groups.com, 1
 me-news.tk, 1
 me-soft.nl, 1
+me.com.br, 1
 me.net.nz, 1
 me.tc, 1
 me.vu, 1
@@ -55250,6 +55034,7 @@ meamod.com, 0
 meandb.net, 1
 meanevo.com, 1
 meangirl.club, 1
+meaningfulaction.org, 1
 meany.xyz, 1
 meap.xyz, 1
 meapbot.com, 1
@@ -55266,6 +55051,7 @@ mebaneattorney.com, 1
 mebanesteakhouse.com, 1
 mebel-voronezh.cf, 1
 mebelshik.tk, 1
+mec000.net, 1
 mec010.com, 1
 mec020.com, 1
 mec021.com, 1
@@ -55565,17 +55351,26 @@ mec0975.com, 1
 mec0976.com, 1
 mec0977.com, 1
 mec0991.com, 1
+mec111.net, 1
+mec222.net, 1
+mec333.net, 1
 mec444.com, 1
 mec555.com, 1
+mec555.net, 1
+mec666.net, 1
+mec777.net, 1
 mec825.com, 1
 mec888.com, 1
+mec888.net, 1
 mec999.com, 1
+mec999.net, 1
 mecanicoautomotriz.org, 1
 mecaniquemondor.com, 1
 meccano.srl, 1
 mechanics-schools.com, 1
 mechanixdirect.co.uk, 0
 mechanus.io, 1
+mechasdepelo.com, 1
 mechaspartans6648.com, 1
 mechbattlegrounds.com, 1
 mechmk1.me, 1
@@ -55607,7 +55402,6 @@ medasset.gr, 1
 medba.se, 1
 medbreaker-friends.at, 1
 medcartoon.com, 1
-medcir.com.br, 1
 medcorfu.gr, 1
 medcrowd.com, 1
 meddatix.com, 1
@@ -55622,7 +55416,6 @@ medeurope.info, 1
 medexpress.co.uk, 1
 medguide-bg.com, 1
 medhy.fr, 1
-medi.com.br, 1
 media-courses.com, 0
 media-credit.eu, 1
 media-instance.ru, 1
@@ -55645,6 +55438,7 @@ mediafamous.com, 1
 mediafart.fr, 1
 mediafly.com, 1
 mediafocus.biz, 1
+mediaforkids.org, 1
 mediagenic.ch, 0
 mediagetnews.tk, 1
 mediagold.it, 1
@@ -55682,6 +55476,7 @@ medicalauction.ga, 1
 medicalcountermeasures.gov, 1
 medicalsite.tk, 1
 medicaltools.de, 1
+medicano.site, 1
 medicare-providers.net, 1
 medicarecoveragefinder.com, 1
 medicareful.com, 1
@@ -55698,6 +55493,7 @@ medicm.jp, 1
 medicocompetente.it, 1
 medicoleads.com, 1
 medicoresponde.com.br, 1
+medicoway.ru, 1
 medicsz.co, 0
 medictools.de, 1
 medienweite.de, 1
@@ -55710,6 +55506,7 @@ medikuma.com, 1
 medinacountyohio.gov, 1
 medinc.tk, 1
 medino.com, 1
+medinorte.es, 1
 medinside.ch, 1
 medinside.li, 1
 medinsider.ch, 1
@@ -55721,12 +55518,14 @@ meditarenargentina.org, 1
 meditateinolympia.org, 1
 meditation-rennes.org, 1
 meditel.nl, 1
+meditez.ca, 1
 meditrak.ml, 1
 medium.com, 1
 mediums.cf, 1
 medivox.tk, 1
 mediweed.tk, 1
 medja.net, 1
+medklee.com, 1
 medlineplus.gov, 1
 medo64.com, 1
 medovea.ru, 1
@@ -55785,12 +55584,14 @@ medyotan.ga, 1
 medzinenews.com, 0
 meedoenhartvanwestbrabant.nl, 0
 meedoennoordkop.nl, 0
+meekhak.com, 1
 meeko.cc, 1
 meekru.com, 1
 meepbot.net, 1
 meepbot.org, 1
 meepbot.pro, 1
 meeplegamers.com, 0
+meer-der-ideen.de, 1
 meeras.ga, 1
 meereskunst.de, 1
 meerman.nl, 1
@@ -55890,6 +55691,7 @@ mehrnevesht.com, 1
 mehrwert.de, 1
 meia.ir, 1
 meidev.co, 1
+meier-stracke.de, 1
 meierhofer.net, 1
 meikampf.de, 1
 meikan.moe, 1
@@ -56015,10 +55817,9 @@ members-arbourlake.com, 1
 members-only-shopping.com, 1
 members.nearlyfreespeech.net, 0
 membersense.com, 1
-membershipnetworksite.com, 1
 membershipservices.org.uk, 1
 memberstweets.com, 1
-membrive.net, 1
+membrive.net, 0
 memdoc.org, 1
 meme.fi, 1
 meme.institute, 1
@@ -56051,6 +55852,9 @@ mendel.tk, 1
 menden.com, 1
 mendipbouncycastles.co.uk, 1
 mendozagenevieve.com, 1
+mendrala.eu, 1
+mendrala.io, 1
+mendrala.net, 1
 mendy.jp, 1
 menfis.es, 1
 menfis.info, 1
@@ -56120,7 +55924,6 @@ meran.in, 1
 meransuedtirol.com, 1
 meraseo.com, 1
 mercadohype.tk, 1
-mercadoleal.com.br, 1
 mercadolibre.cl, 1
 mercadolibre.co.cr, 1
 mercadolibre.com.ar, 1
@@ -56155,6 +55958,7 @@ merchant.agency, 1
 merchcity.com, 1
 mercici.com, 1
 mercredifiction.io, 1
+mercury.foundation, 1
 mercury.photo, 1
 mercuryamericas.com, 0
 mercurycards.com, 1
@@ -56163,6 +55967,7 @@ merdacz.pl, 1
 meremeti-online.gr, 1
 meremobil.dk, 1
 merenbach.com, 1
+mereni.cz, 1
 merenita.com, 1
 merenita.eu, 1
 merenita.net, 1
@@ -56172,7 +55977,6 @@ meridanas.me, 1
 meridianenvironmental.com, 1
 meridiangroup.ml, 1
 meridianmetals.com, 1
-meridianoshop.com.br, 1
 merikserver.tk, 1
 merimatka.fi, 1
 merite.cloud, 1
@@ -56200,7 +56004,6 @@ mes10doigts.ovh, 1
 mesa.aero, 1
 mesabi.ga, 1
 mesappros.com, 1
-mesareal.com.br, 1
 mescaline.com, 1
 mescaline.org, 1
 mesec.cz, 1
@@ -56209,6 +56012,7 @@ mesh.org.ua, 1
 meshok.info, 1
 meshok.ru, 1
 meskdeals.com, 1
+meskimonos.fr, 1
 meskiukas.tk, 1
 mesomeds.com, 1
 mesotheliomacentre.tk, 1
@@ -56279,6 +56083,7 @@ metaword.com, 1
 metaword.net, 1
 metaword.org, 1
 metayou.gq, 1
+metdijital.com.tr, 1
 metebalci.com, 0
 meteenonline.nl, 1
 meteo-parc.com, 1
@@ -56318,6 +56123,7 @@ metricmutt.com, 1
 metrika.ml, 1
 metrix-money-ptc.com, 1
 metrix.design, 0
+metro-detroit.com, 1
 metro-lawn-care.com, 1
 metro-web.net, 1
 metroairvirtual.com, 1
@@ -56343,6 +56149,7 @@ metroval.tk, 1
 metsasta.com, 1
 mettekopp.dk, 1
 mettin.org, 1
+metyweb.ga, 1
 metz-metropolitain.fr, 1
 metzgermark.com, 1
 meu-solutions.com, 0
@@ -56458,14 +56265,13 @@ micado-software.com, 1
 micah.soy, 1
 micalodeal.ch, 0
 micamisetaestampada.com, 1
-micaritafeliz.com, 1
 micbase.com, 1
-micelius.com, 1
 michadenheijer.com, 1
 michael-contento.de, 1
 michael-glaser.de, 1
 michael-rigart.be, 1
 michael-schefczyk.de, 1
+michael-schilling.de, 1
 michael-steinhauer.eu, 1
 michael.band, 1
 michaelabbas.tk, 1
@@ -56486,6 +56292,7 @@ michaeljacksonforsale.com, 1
 michaeljdennis.com, 1
 michaelklos.nl, 1
 michaelkorsgill.tk, 1
+michaelkosiba.com, 1
 michaelkuchta.me, 1
 michaelkuehn.tk, 1
 michaell.io, 1
@@ -56558,7 +56365,6 @@ microbiologist.tk, 1
 microbiote-insectes-vecteurs.group, 1
 microblading.pe, 1
 microco.sm, 1
-microcomploja.com.br, 1
 microcyber.net, 1
 microdesic.com, 1
 microdots.de, 1
@@ -56594,9 +56400,11 @@ middletonshoppingcentre.co.uk, 1
 middletowndelcopa.gov, 1
 mideo.tk, 1
 midgawash.com, 1
+midi-coquillages.com, 1
 midi-ctes.fr, 1
 midia.tk, 1
 midiaid.de, 1
+midiarioalcoholico.com, 1
 midislandrealty.com, 0
 midistop.org, 1
 midkam.ca, 1
@@ -56644,6 +56452,7 @@ migrantskillsregister.org.uk, 1
 migrations.tk, 1
 miguel-platteel.fr, 1
 miguel.pw, 1
+miguelcolmenares.com, 1
 migueldemoura.com, 1
 migueldominguez.ch, 0
 miguelgaton.es, 1
@@ -56661,11 +56470,13 @@ mihgroup.eu.org, 1
 mihgroup.net, 1
 mihnea.net, 1
 mihu233.com.cn, 1
+miisy.com, 1
+miisy.eu, 1
+miisy.me, 1
 mijam.xyz, 1
 mijcorijneveld.nl, 1
 mijn-financien.be, 1
 mijn.computer, 1
-mijnbeijesweb.nl, 1
 mijngeldcoach.nl, 1
 mijnkantoor.net, 1
 mijnkerstkaarten.be, 1
@@ -56726,6 +56537,7 @@ mikewillia.ms, 1
 mikewrites.online, 1
 mikewritesstuff.com, 1
 mikeybot.com, 1
+mikeyroxtravels.com, 1
 mikhirev.ru, 1
 mikhlevich.ru, 1
 miki-boras.de, 1
@@ -56771,6 +56583,7 @@ milavica.tk, 1
 milcahsmusings.com, 1
 milcarteles.com, 1
 milchbuchstabe.de, 1
+milchweg.com, 1
 milehighmaniac.com, 1
 mileme.com, 1
 milenaria.es, 1
@@ -56779,7 +56592,6 @@ milesdewitt.com, 1
 mileyweasel.de, 1
 milfpornograph.com, 1
 milhistwiki.tk, 1
-milhoazul.com.br, 1
 milieuland.com, 1
 militaryaviationsafety.gov, 1
 militaryconsumer.gov, 1
@@ -56798,6 +56610,7 @@ milktea.info, 0
 milkypond.org, 1
 mill.ml, 1
 millanova.wedding, 0
+millbrookbedandbreakfast.co.uk, 1
 milldyke.com, 1
 milldyke.nl, 1
 millefleurs.eu, 1
@@ -56811,6 +56624,7 @@ millersminibarns.com, 1
 millerwalker.com, 1
 millettable.com, 1
 millhousenchurch.com, 1
+milliarden-liste.de, 1
 millibitcoin.jp, 1
 millionairessecrets.com, 1
 millionen-von-sonnen.de, 1
@@ -56874,6 +56688,7 @@ mindcraft.ga, 1
 minddrive.cf, 1
 mindercasso.nl, 1
 mindfactory.de, 1
+mindfulnessjourney.ca, 1
 mindhunter.info, 1
 mindjee.tk, 1
 mindleaking.org, 1
@@ -56904,6 +56719,7 @@ minecraftforum.ovh, 1
 minecraftgoldwar.tk, 1
 minecraftjson.com, 0
 minecraftjustone.ga, 1
+minecraftrealgold.gq, 1
 minecraftrealgold.ml, 1
 minecraftruns.ml, 1
 minecrafts.gq, 1
@@ -56932,7 +56748,6 @@ minf3-games.de, 1
 minfin.gov.ua, 1
 mingky.net, 1
 mingkyaa.com, 1
-mingming.info, 1
 mingram.net, 1
 mingtreerealty.com, 1
 mingwah.ch, 0
@@ -56977,6 +56792,7 @@ mining.diamonds, 1
 miningtronics.com, 0
 minirizhi.com, 1
 miniskipper.at, 1
+minisoft4u.ir, 1
 ministeriumfuerinternet.de, 1
 ministryofinternet.eu, 1
 minitruckin.net, 1
@@ -57045,13 +56861,13 @@ miraiex.com, 0
 miramar-obgyn.com, 1
 miramar.ca, 1
 mirasmun.tk, 1
+miratechgroup.com, 1
 miravelli.ro, 1
 miraxe.cf, 1
 miraxe.ga, 1
 mirazonline.tk, 1
 mirazperu.com, 1
 mircarfinder.ru, 1
-mirch.com, 1
 mirdetaley.tk, 1
 mireiaseuba.com, 1
 mireillewendling.com.br, 1
@@ -57080,6 +56896,7 @@ mirshak.com, 0
 mirtazapine.gq, 1
 mirtes.cz, 1
 mirtouf.fr, 1
+mirumhongkong.com, 1
 mirvolgograda.ml, 1
 mirwild.cf, 1
 mirwild.gq, 1
@@ -57111,6 +56928,7 @@ missaocadastrobv.com.br, 1
 missblisshair.com.au, 1
 missdream.org, 1
 missevent.pl, 1
+missfuli.com, 1
 missguidedus.com, 1
 mission-orange.de, 1
 missionflare.com, 1
@@ -57122,9 +56940,9 @@ misskey.site, 0
 misskey.xyz, 1
 missmaid.co.uk, 1
 missmaid.com, 1
+misson.ovh, 1
 missoy.me, 1
 misspoliticsaustralia.cf, 1
-misssex.de, 1
 missthetoro.tk, 1
 misstika-bijoux.com, 1
 misstress.cf, 1
@@ -57149,7 +56967,7 @@ misuzu.moe, 1
 mit-dem-rad-zur-arbeit.de, 1
 mit-dem-rad-zur-uni.de, 1
 mit-uns.org, 1
-mitaines.ch, 1
+mitaines.ch, 0
 mitarbeitermotivation-anleitungen.de, 1
 mitchellhandymanservices.co.uk, 1
 mitchelmore.ca, 1
@@ -57165,7 +56983,6 @@ mitior.net, 1
 mitnetz-gas.de, 1
 mitnetz-strom.de, 1
 mitratech.com.br, 1
-mitrax.com.br, 1
 mitre10.com.au, 0
 mitrecaasd.org, 1
 mitremai.org, 1
@@ -57206,8 +57023,9 @@ mix-channel.ml, 1
 mix-recruit.jp, 1
 mixedreality.football, 1
 mixedrecipe.com, 1
-mixify.ga, 1
+mixify.ga, 0
 mixinglight.com, 1
+mixmastermiguel.com, 1
 mixmister.com, 1
 mixmix.tk, 1
 mixposure.com, 1
@@ -57221,13 +57039,13 @@ miyatore.com, 1
 miyoshi-kikaku.co.jp, 1
 miyoshi-kikaku.com, 0
 miyugirls.com, 1
-mizanexpert.com, 1
 mizar.im, 0
 mizik.cz, 1
 mizoey.se, 1
 mizque.ch, 1
 mizternational.com, 1
 mizu.coffee, 1
+mizuasobi.work, 1
 mizucoffee.net, 1
 mizuhobank.co.id, 1
 mizumax.me, 1
@@ -57239,6 +57057,7 @@ mjbulgaria.com, 1
 mjdmetal.com, 1
 mjec.net, 1
 mjforan.com, 1
+mjguo.com, 1
 mjjlab.com, 1
 mjmedia.co.za, 1
 mjniessen.com, 1
@@ -57262,7 +57081,6 @@ mkbouncycastles.co.uk, 1
 mkbouncyhire.co.uk, 1
 mkcert.org, 1
 mkchandler.com, 1
-mkes.com, 1
 mkfs.fr, 1
 mkg-chirurgie-bruchsal.de, 1
 mkg-scherer.de, 1
@@ -57278,6 +57096,7 @@ mklenterprises.com, 1
 mklenterprisesacademy.com, 1
 mklenterprisescoaching.com, 1
 mklpedia.de, 1
+mkm.ee, 1
 mkm.szczecin.pl, 1
 mkmedien.tk, 1
 mknclab.info, 1
@@ -57303,6 +57122,7 @@ mlathrom.com, 1
 mlcnfriends.com, 1
 mlcrosoftonlline.ml, 1
 mlfaw.com, 1
+mlfitnesscenter.com, 1
 mlii.net, 1
 mllz.com, 1
 mlmjam.com, 1
@@ -57351,6 +57171,7 @@ mmmm.mn, 1
 mmogah.com, 1
 mmoneko.com, 1
 mmonit.com, 1
+mmoveisplanejados.com.br, 1
 mmpaymentsystem.com, 1
 mmphub.com, 1
 mmprojects.nl, 1
@@ -57435,6 +57256,7 @@ mobilelooper.com, 1
 mobilemedics.com, 1
 mobilepartner.tk, 1
 mobileread.com, 1
+mobilerhandwerker.de, 1
 mobileritelushi.com, 1
 mobilesector.de, 1
 mobilesnewsworld.ga, 1
@@ -57445,6 +57267,7 @@ mobiletry.com, 1
 mobilewikiserver.com, 1
 mobilinnov.it, 1
 mobilisation-generale.org, 0
+mobilise.solutions, 1
 mobility-events.ch, 1
 mobilize.us, 1
 mobilmobil.co, 1
@@ -57482,18 +57305,17 @@ mochoko.com, 1
 mockerel.com, 1
 mocking-bird.org, 1
 mocknen.net, 1
+mockups.com.co, 1
 mococo.co.uk, 1
 mod.af, 1
 moda-donna.cf, 1
 moda-line.ml, 1
-modaexecutiva.com.br, 1
 modafo.com, 1
 modalogi.com, 1
 modalrakyat.com, 1
 modanacrho.tk, 1
 modav.org, 1
 modbom.com.tw, 1
-modcasts.video, 1
 modcover.com, 1
 modded-minecraft-server-list.com, 1
 modderday.com, 1
@@ -57557,7 +57379,6 @@ moebel-vergleichen.com, 1
 moebelschreinerei-engelhardt.de, 1
 moec.top, 1
 moechel.com, 1
-moeclue.com, 1
 moecraft.net, 1
 moefactory.com, 1
 moefi.xyz, 1
@@ -57620,7 +57441,6 @@ mojleksikon.com, 1
 mojnet.eu, 1
 mojnet.net, 1
 mojoco.co.za, 1
-mojomusic.org, 1
 mojt.net, 1
 mojtabaemadi.com, 1
 mojzis.com, 1
@@ -57632,6 +57452,7 @@ mokeedev.review, 1
 mokhan.ca, 1
 mokhtarmial.com, 1
 moki.org.pl, 1
+mokujinken.tokyo, 1
 mokum-organics.com, 0
 molb.org, 1
 moldova-online.ml, 1
@@ -57702,6 +57523,7 @@ monarchpartnersgroup.com, 1
 monarcjuexpo.ch, 1
 monays.ga, 1
 monbudget.org, 0
+moncarnetdesante.fr, 1
 moncoach.ch, 0
 monde-oriental.tk, 1
 mondechenoafrance.tk, 1
@@ -57710,6 +57532,7 @@ mondial-movers.nl, 1
 mondo-it.ch, 1
 mondocellulari.tk, 1
 mondonet.org, 0
+mondsee-psychotherapie.at, 1
 mondzorgaanzee.nl, 1
 monelephantapois.com, 1
 moneni.com, 1
@@ -57745,13 +57568,13 @@ mongolie.net, 1
 mongolieenfrance.fr, 1
 mongolito.tk, 1
 mongooselock.com.ua, 1
+monicahq.com, 1
 monicajean.photography, 1
 monicapotter.tk, 1
 monika.tk, 1
 moninformaticien.ovh, 1
 moninformaticien.shop, 1
 monique.io, 1
-moniquedekermadec.com, 1
 moniquemunhoz.com.br, 1
 monitman.com, 1
 monitman.solutions, 1
@@ -57788,6 +57611,7 @@ monolithindustries.com, 1
 monolithinteractive.com, 1
 monopoly-one.com, 1
 monorail.ga, 1
+monorthopedagogue.ca, 1
 monospazzole.roma.it, 1
 monothesis.com, 1
 monoworks.co.jp, 1
@@ -57831,7 +57655,6 @@ montrain.fr, 1
 montrealcatadoptions.com, 1
 montredeal.fr, 1
 montsaintaignan.fr, 1
-montsearias.com, 1
 montychristie.com, 1
 monwarez.ovh, 1
 monzo.com, 1
@@ -57853,6 +57676,7 @@ moonbot.io, 1
 moonboys.de, 1
 moonchart.co.uk, 1
 moondrop.org, 1
+moondsee.de, 1
 moonkin.eu, 1
 moonlabs.nl, 1
 moonlightcapital.ml, 1
@@ -57890,6 +57714,7 @@ moot-info.co.za, 1
 moovablestorage.com, 1
 moove-it.com, 1
 mooveo.co, 1
+moovhl.com, 1
 moparcraft.com, 1
 moparcraft.net, 1
 moparcraft.org, 1
@@ -57919,6 +57744,7 @@ morbiceramicindustry.com, 1
 morbitzer.de, 1
 morbius.cz, 1
 morbotron.com, 1
+morc.me, 1
 morchino.ch, 1
 morchstore.com, 1
 mordovia.tk, 1
@@ -57969,13 +57795,13 @@ morningtime.cloud, 1
 moroccanews.tk, 1
 moroccomiami.com, 1
 moroccotodaynews.ga, 1
+moromsmile.com, 1
 moron-mu.com, 1
 morox.top, 1
 morozko.gq, 1
 morozyaka.tk, 1
 morrellllc.com, 0
 morris.computer, 1
-morrisby.com, 1
 morritosfelices.com, 1
 morrowind-finland.tk, 1
 morse-ti.net, 1
@@ -58064,9 +57890,9 @@ motodb.co.uk, 1
 motodb.eu, 1
 motodb.net, 1
 motodb.uk, 1
+motoforce.lt, 1
 motogb.net, 1
 motohell.com, 1
-motojato.com.br, 1
 motoland.ml, 1
 motomorgen.com, 1
 motor-agro.com, 1
@@ -58189,6 +58015,7 @@ mpetroff.net, 1
 mpg.ovh, 1
 mpgaming.pro, 1
 mpgu.tk, 1
+mphold.ru, 1
 mphwinkel.nl, 1
 mpintaamalabanna.it, 1
 mpkrachtig.nl, 1
@@ -58214,12 +58041,12 @@ mr-anderson.org, 1
 mr-bills.com, 1
 mr-coffee.net, 1
 mr-labo.jp, 1
-mr-moulding-knives.com, 1
 mr-nachhilfe.de, 1
 mr-wolf.nl, 0
 mr3.io, 1
 mraag.xyz, 1
 mrafrohead.com, 1
+mrak.blog, 1
 mralonas.cf, 1
 mrandmrsparrot.gr, 1
 mranimal.tk, 1
@@ -58281,6 +58108,7 @@ mrschristine.com, 1
 mrsheep.win, 1
 mrsiding.net, 1
 mrsk.me, 1
+mrssclaus.ca, 1
 mrstat.co.uk, 1
 mrston.ml, 1
 mrstuudio.ee, 1
@@ -58382,6 +58210,7 @@ mtlconcerts.com, 1
 mtltransport.com, 1
 mtludlow.co.uk, 1
 mtouch.facebook.com, 0
+mtp-services.fr, 1
 mtr.md, 1
 mtravelers.net, 1
 mtrip.com, 1
@@ -58414,6 +58243,7 @@ mudastudio.com, 1
 mudbenesov.cz, 1
 mudcomplex.ga, 1
 mudcrab.us, 0
+mudey.pt, 1
 mudgezero.one, 1
 mudit.xyz, 0
 mueblesemporium.com, 1
@@ -58438,6 +58268,7 @@ muhelheim.com, 1
 muhibbulislam.tk, 1
 muhlenbergtwppa.gov, 1
 muilties.com, 1
+muir.fun, 1
 muitoalemdobolo.com.br, 1
 mujerfutura.com, 1
 muk-kobetsu.com, 1
@@ -58460,7 +58291,6 @@ muloft.com, 1
 multi-fruit.tk, 1
 multi-tool.ml, 1
 multibit.org, 1
-multibomasm.com.br, 1
 multiclinicacardio.com.br, 1
 multicomhost.com, 1
 multicore.cl, 1
@@ -58517,13 +58347,11 @@ munch.me, 1
 munchcorp.com, 1
 mundismart.com, 1
 mundo-otaku.tk, 1
-mundoarabe.com.br, 1
 mundoconejos.com, 1
 mundodapoesia.com, 1
 mundodasmensagens.com, 1
 mundofoto.tk, 1
 mundogamers.top, 1
-mundokinderland.com.br, 1
 mundolarraz.es, 1
 mundomagicotv.com, 1
 mundoperros.es, 1
@@ -58531,12 +58359,12 @@ mundosteampunk.club, 1
 mundosuiri.ml, 1
 mundotortugas.com, 1
 mundschenk.at, 1
-mundtec.com.br, 1
 munduch.cz, 1
 munduch.eu, 1
 muneni.co.za, 1
 munera.ca, 1
 munfordtn.gov, 1
+munialajuela.go.cr, 1
 munich-eventlocations.de, 1
 munirajiwa.com, 1
 munivice.gob.pe, 1
@@ -58546,7 +58374,7 @@ muntproever.nl, 1
 munwr.com, 1
 munzlocal10.org.nz, 1
 muoivancauhoivisao.com, 1
-muot.tv, 0
+muot.tv, 1
 mup-republicanos.tk, 1
 muqu.co, 1
 mur-vegetal-interieur.fr, 1
@@ -58568,8 +58396,8 @@ murmansk.cf, 1
 murmanskforum24x7.tk, 1
 murmashi.ru, 1
 murmu.re, 1
-murof.com.br, 1
 murphy-law.net.ru, 1
+murphycraftbeerfest.com, 1
 murray.xyz, 1
 murraya.cn, 1
 murraycoin.org, 1
@@ -58592,6 +58420,7 @@ musearchengine.com, 1
 museclef.com, 1
 musedash.moe, 1
 musehelix.com, 1
+museloveurania.com, 1
 museodelistmo.tk, 1
 muserver.io, 1
 muses-success.info, 1
@@ -58605,6 +58434,7 @@ mushman.tk, 1
 music-is-my-life.de, 1
 music-privilege.fr, 1
 music-project.eu, 1
+music-store-download.com, 1
 music-world.pl, 1
 music.amazon.com, 1
 musica.com, 1
@@ -58626,6 +58456,7 @@ musicindustrydb.org, 1
 musicinsiderdigest.com, 1
 musickhouseleveling.com, 1
 musiclenta.tk, 1
+musicnotesroom.com, 1
 musicompare.com, 1
 musicradio.ga, 1
 musicrainbow.tk, 1
@@ -58655,6 +58486,7 @@ musketonhaken.nl, 0
 muskokavoltz.ca, 1
 muskuratimorning.tk, 1
 muslim.singles, 1
+muslimah.boutique, 1
 muslimbanter.co.za, 1
 muslimsoul.cf, 1
 musmann.io, 1
@@ -58680,7 +58512,6 @@ mutuals.cool, 1
 mutuelle.fr, 1
 muuglu.es, 1
 muunnin.net, 1
-muurlingoogzorg.nl, 1
 muusika.fun, 1
 muwatenraqamy.org, 1
 muy.ooo, 1
@@ -58702,6 +58533,7 @@ mvbug.com, 1
 mvccp.co.za, 1
 mvisioncorp.com, 1
 mvistatic.com, 1
+mvmm.fr, 1
 mvno.io, 1
 mvorisek.com, 1
 mvorisek.cz, 1
@@ -58729,7 +58561,6 @@ mx.search.yahoo.com, 0
 mx5international.com, 1
 mxawei.cn, 1
 mxbids.com, 1
-mxcrs.com, 1
 mxdanggui.org, 1
 mxdvl.com, 1
 mxes.net, 1
@@ -58781,7 +58612,7 @@ myactivity.google.com, 1
 myadpost.com, 1
 myaggic.com, 1
 myalliancechurch.com, 1
-myamend.com, 0
+myamend.com, 1
 myamihealth.com, 1
 myamity.info, 1
 myammo.com, 1
@@ -58791,7 +58622,6 @@ myanimelist.net, 1
 myapexcard.com, 1
 myarcade.org, 1
 myartsjournal.com, 1
-mybagofcoffee.com, 1
 mybakkupakku.com, 1
 mybarcelona.tk, 1
 mybasementdoctor.com, 1
@@ -58830,6 +58660,7 @@ mycard.moe, 1
 mycareersfuture.sg, 1
 mycarinsurance123.com, 1
 mycarwashers.com, 1
+mycbils.uk, 1
 mycc.be, 1
 mychamberlain.co.nz, 1
 mychamberlain.com, 1
@@ -58846,6 +58677,9 @@ myclinicalstudybuddy.com, 1
 myclon.tk, 1
 mycloud-system.com, 1
 mycloudbits.me, 1
+mycloudhome.site, 1
+mycloudhome.top, 1
+mycloudhome.xyz, 1
 mycloudsaas.com, 1
 mycodes.com.au, 1
 mycofairtrade.com, 0
@@ -59054,7 +58888,6 @@ mymanagement.ml, 1
 mymartinbeckeropenhab.de, 1
 mymb.pm, 1
 mymedia.gotdns.com, 1
-mymedz.nl, 1
 mymerlin.co.nz, 1
 mymerlin.com.au, 1
 mymixtapez.com, 1
@@ -59082,7 +58915,6 @@ mynetworkingbuddy.com, 1
 mynewsspot.com, 1
 mynext.events, 1
 mynextmove.org, 1
-mynn.io, 1
 mynook.info, 1
 mynovus.de, 1
 myoddlittleworld.com, 1
@@ -59113,7 +58945,6 @@ myparfumerie.at, 0
 mypartnernews.com, 1
 mypartybynoelia.es, 1
 mypay.fr, 1
-mypayoffloan.com, 1
 mypcb.tk, 1
 mypenza.tk, 1
 myperfecthome.ca, 1
@@ -59210,6 +59041,7 @@ myresidence.de, 1
 myrevery.com, 1
 myreviews.ga, 1
 myrewardspoints.com, 1
+myriadlex.com.tw, 1
 myriadof.com, 1
 myrig.com, 1
 myrig.io, 1
@@ -59275,6 +59107,7 @@ mystudy.me, 1
 mystudycart.com, 1
 mystudymap.tk, 1
 mysupplements.ga, 1
+myswimmingclub.uk, 1
 myswissmailaddress.com, 0
 mytc.fr, 1
 myte.ch, 1
@@ -59306,7 +59139,6 @@ mytuleap.com, 1
 mytun.com, 1
 mytuzla.tk, 1
 mytweeps.com, 1
-myunicornshops.com, 1
 myunox.com, 1
 myupdatestar.com, 1
 myupdatestudio.com, 1
@@ -59314,7 +59146,6 @@ myupdatesystems.com, 1
 myusagepayments.com, 1
 myvacompany.com, 1
 myvalleymarketing.com, 1
-myvegan.menu, 1
 myvirtualserver.com, 1
 myvitalhealthsolutions.com.au, 1
 myvoipnews.com, 0
@@ -59333,6 +59164,7 @@ mywebpharmacy.tk, 1
 mywebserver.ml, 1
 myweddingreceptionideas.com, 1
 myweightlosstips.tk, 1
+mywestondental.com, 1
 mywetpussycams.com, 1
 mywindscreen.my, 1
 mywiwe.com.au, 1
@@ -59372,10 +59204,12 @@ n16.co, 0
 n26.com, 1
 n29.co, 0
 n2diving.net, 1
+n2ray.xyz, 1
 n30365.com, 1
 n36533.com, 1
 n36594.com, 1
 n37.co, 0
+n3oxid.fr, 1
 n3rd0rama.tk, 1
 n3twork.net, 1
 n4v.eu, 1
@@ -59466,7 +59300,6 @@ nagb.gov, 1
 nagb.org, 1
 nagel-dentaltechnik.de, 1
 nageler.org, 1
-nagelfam.com, 1
 naggie.net, 1
 nagoonline.com, 1
 nah.nz, 1
@@ -59542,7 +59375,6 @@ namaanakperempuan.net, 1
 namacindia.com, 1
 namaleaks.com, 0
 namalelaki.com, 1
-namamala.com, 1
 namaperempuan.com, 1
 namazon.org, 1
 namazvakitleri.com.tr, 1
@@ -59563,6 +59395,7 @@ nami.exchange, 1
 nami.trade, 1
 namikawatetsuji.jp, 1
 naminam.de, 1
+namisens.de, 1
 namrs.net, 1
 namskra.is, 1
 namu.games, 1
@@ -59710,6 +59543,7 @@ nasosvdom.com.ua, 1
 nasr.mobi, 1
 nasrabady.tk, 1
 nasrsolar.com, 1
+nasserver-test.de, 0
 nassi.me, 1
 nast.tk, 1
 nastrojka-pianino.spb.ru, 1
@@ -59731,6 +59565,7 @@ natariusadvokat.ga, 1
 natasa-theodoridou.tk, 1
 natasabekvalac.tk, 1
 natasasavija.tk, 1
+nataschaskraamzorg.nl, 1
 natashki.tk, 1
 natasjaversantvoort.nl, 1
 natation-nsh.com, 0
@@ -59806,6 +59641,7 @@ naturaleza.com.ar, 1
 naturalezafengshui.com, 1
 naturalfit.co.uk, 1
 naturalkitchen.co.uk, 1
+naturallyvegan.de, 1
 naturalspacesdomes.com, 1
 naturaum.de, 1
 nature-et-bio.fr, 1
@@ -59818,18 +59654,15 @@ natureshive.org, 1
 naturesorganichaven.com, 1
 naturheilpraxis-grauer.de, 1
 naturheilpraxis-oida.de, 1
-naturheilpraxis-orlowsky.de, 1
 naturheilpraxis-p-grote.de, 1
 naturliga.tk, 1
 naturline.com, 1
 naturtint.co.uk, 1
-natusvita.com.br, 1
 natuterra.com.br, 1
 natuurlijk.tk, 1
 natverkstekniker.se, 1
 naude.co, 1
 naufalpanjwani.com, 1
-naughton.ie, 1
 naughty.audio, 1
 nauris.fi, 1
 nausicaahotel.it, 1
@@ -59901,11 +59734,11 @@ nbis.gov, 1
 nbl.org.tw, 1
 nbm.gov, 1
 nbnnetwork.com, 1
-nbook.org, 1
 nbrain.de, 1
 nbrii.com, 1
 nbriresearch.com, 1
 nbrown.us, 1
+nbsgames.at, 1
 nc-beautypro.fr, 1
 nc-formation.fr, 1
 nc-network.io, 1
@@ -59914,7 +59747,6 @@ nca.ink, 1
 ncamarquee.co.uk, 1
 ncands.net, 1
 ncarmine.com, 1
-ncascade.com, 1
 ncc-efm.com, 1
 ncc-efm.org, 1
 ncc-qualityandsafety.org, 1
@@ -59971,6 +59803,8 @@ neartothesky.com, 1
 neasahourigan.com, 0
 neat-patch.de, 1
 neatlife.co.uk, 1
+neatnestsdesign.com, 1
+neatnestsorganizing.com, 1
 neatous.cz, 1
 neatous.net, 1
 neave.tv, 1
@@ -59992,11 +59826,12 @@ nebuso.com, 1
 necessaryandproportionate.net, 1
 necessaryandproportionate.org, 1
 neckbeard.xyz, 1
+necord.com, 1
 necormansir.com, 1
 necromantia.tk, 1
 necsol.ru, 1
-nectardigit.com, 1
 nectarleaf.com, 1
+nectere.ca, 1
 nectir-staging.com, 1
 nectir.co, 1
 nedcdata.org, 1
@@ -60040,8 +59875,8 @@ negai.moe, 0
 negativecurvature.net, 1
 negativeentropy.org, 1
 negativex.gq, 1
-neglecteddiseases.gov, 1
 negocios-imatore.com, 1
+negociosurbanos.net, 1
 negoya-shokai.info, 1
 negril.com, 1
 nehalem.gov, 1
@@ -60068,6 +59903,7 @@ neio.uk, 1
 nejenpneu.cz, 1
 nejlevnejsi-parapety.cz, 1
 nejmaklerka.cz, 1
+nejrecept.cz, 1
 neko-nyan-nuko.com, 1
 neko-nyan.org, 1
 neko.am, 1
@@ -60099,7 +59935,6 @@ nemagiya.tk, 1
 nemcd.com, 1
 nemecl.eu, 1
 nemez.net, 1
-nemhaisan.com, 1
 nemiroth.net, 1
 nemirow.tk, 1
 nemkoff.tk, 1
@@ -60153,7 +59988,6 @@ neowa.tk, 1
 neowin.net, 1
 neowlan.net, 1
 neoxcrf.com, 1
-neoz.com.br, 1
 nepal-evolution.org, 1
 nepal.ga, 1
 nepali-fonts.tk, 1
@@ -60280,11 +60114,9 @@ nethunter.top, 1
 netica.fr, 0
 netki.com, 1
 netkigestioncomercial.com, 1
-netlentes.com.br, 1
 netlevel.ga, 1
 netliste.com, 1
 netlocal.ru, 1
-netmagicas.com.br, 1
 netmania.tk, 1
 netmeister.org, 1
 netmouse.tk, 1
@@ -60326,6 +60158,7 @@ netsphere.cloud, 1
 netsphere.cz, 1
 netsplit.fr, 1
 netsyms.com, 1
+netsys.com.tr, 1
 netsystems.pro, 1
 nettamente.com, 1
 nette.org, 1
@@ -60370,6 +60203,7 @@ networkmidlands.uk, 1
 networkmon.net, 1
 networkofarts.com, 1
 networkposting.com, 1
+networkprosecurity.net, 1
 networksolutionsconsultant.com, 1
 networktools.tk, 1
 networkuser.de, 1
@@ -60381,7 +60215,6 @@ netzer.ml, 1
 netzfabrik.com, 1
 netzfrauen.org, 1
 netzklad.de, 1
-netzona.org, 1
 netzspielplatz.de, 0
 netzwerk-lq.com, 1
 netzwerkwerk.de, 1
@@ -60497,8 +60330,8 @@ newguidance.ch, 0
 newhamyoungbloods.co.uk, 0
 newhomedesign.tk, 1
 newhopeofindiana.org, 1
+newikis.com, 1
 newillusion.tk, 1
-newimage.io, 1
 newind.info, 1
 newinf.at, 1
 newinternet.media, 1
@@ -60507,7 +60340,6 @@ newjianzhi.com, 1
 newknd.com, 1
 newlegalsteroid.com, 1
 newlifehempoil.com, 1
-newline.online, 1
 newlovers.ga, 1
 newlovers.gq, 1
 newlynamed.com, 1
@@ -60515,7 +60347,6 @@ newlytricks.ml, 1
 newmall.org, 1
 newmanwebsolutions.com, 1
 newmarketbouncycastlehire.co.uk, 1
-newmed.com.br, 1
 newmediaone.net, 1
 newmovements.net, 1
 newmusicjackson.org, 1
@@ -60562,6 +60393,7 @@ newsforyou.cf, 1
 newsgroups.io, 1
 newsheaders.net, 1
 newshell.it, 1
+newshour.media, 1
 newsinformer.ga, 1
 newsinkansas.ml, 1
 newsinpolitics.ga, 1
@@ -60685,7 +60517,6 @@ nfls.io, 1
 nflsic.org, 1
 nfltshirt.com, 1
 nfluence.org, 1
-nfpors.gov, 1
 nframe.io, 1
 nfrost.me, 1
 nfsec.pl, 1
@@ -60724,6 +60555,7 @@ nhakhoabella.com, 0
 nhakhoangocanh.net, 1
 nhanlucnhatban.com, 1
 nhaoi.com, 1
+nhasicuibap.com, 1
 nhatrang.tk, 1
 nhbp-nsn.gov, 1
 nhccnews.org, 1
@@ -60747,6 +60579,7 @@ niagarafalls.ca, 1
 niagarafallsmuseums.ca, 1
 niagaraschoice.org, 1
 niallator.com, 1
+nianubo.net, 1
 nibb13.tech, 0
 nibletllc.com, 1
 nibo.blog, 1
@@ -60795,6 +60628,7 @@ nic.xn--q9jyb4c, 1
 nic.youtube, 1
 nic.zip, 1
 nic199.ru, 1
+nicaieri.ro, 1
 nicapollo.com, 1
 nicastrosalvatore.tk, 1
 nicat.cf, 1
@@ -60821,6 +60655,7 @@ nicht-blau.de, 1
 nichteinschalten.de, 0
 nichthelfer.de, 1
 nicic.gov, 1
+niciunde.ro, 1
 nick-slowinski.de, 1
 nickcleans.co.uk, 1
 nickcraver.com, 1
@@ -60836,8 +60671,8 @@ nickloose.de, 1
 nicklord.com, 1
 nickmandler.tk, 1
 nickmchardy.com, 1
-nickmorri.com, 1
-nickmorris.name, 1
+nickmorri.com, 0
+nickmorris.name, 0
 nickplotnek.co.uk, 1
 nickrickard.co.uk, 1
 nicks-autos.com, 1
@@ -61009,6 +60844,7 @@ nimfomanki.tk, 1
 nimidam.com, 1
 nimus.tk, 1
 nina-woerz.tk, 1
+ninaafenehjelm.com, 1
 ninaforever.com, 1
 ninaundandre.de, 1
 ninchat.com, 1
@@ -61082,6 +60918,7 @@ nitrous-networks.com, 1
 nitschinger.at, 1
 nitter.net, 1
 niumactive.it, 1
+nivalandemarit.fi, 1
 nivarussia.ml, 1
 nivelul2.ro, 1
 nivoit.cf, 1
@@ -61108,6 +60945,7 @@ nja.id.au, 1
 njast.net, 1
 njcareers.org, 1
 njguardtraining.com, 1
+njhq.org, 1
 njilc.com, 1
 njpjanssen.nl, 1
 nkapliev.org, 1
@@ -61133,12 +60971,10 @@ nlagstage.in, 1
 nlap.ca, 0
 nlc-business.com, 1
 nlc.org.au, 1
-nlegall.fr, 1
 nllboard.co.uk, 1
 nlleisure.co.uk, 1
 nlm.gov, 1
 nlpdiscovery.ro, 1
-nlt.by, 0
 nmb.gov, 1
 nmbtz.com, 1
 nmd.so, 1
@@ -61171,14 +61007,15 @@ no-terrorism.tk, 1
 no-war-on-iraq.tk, 1
 no-xice.com, 0
 no.search.yahoo.com, 0
+no9vip.com, 1
 noagendahr.org, 1
 noah-witt.com, 1
-noahenco.nl, 1
 noahjacobson.com, 1
 noahmodas.com.br, 1
 noahsaso.com, 1
 noahwitt.me, 1
 noart.tk, 1
+noatec.eu, 1
 nob.ro, 1
 nobilefoods.com, 1
 nobledust.com, 1
@@ -61224,6 +61061,9 @@ nofrillsdns.com, 1
 noga4you.de, 1
 nogerondier.eu, 1
 nogetime.com, 1
+nogfw.org, 1
+nogfw.pro, 1
+nogfwsite.com, 1
 noglobalwarrants.org, 1
 nogradhont.hu, 1
 nohats.ca, 1
@@ -61265,6 +61105,7 @@ nomadichome.com, 1
 nomadichome.org, 1
 nomadichomes.com, 1
 nomadichomes.org, 1
+nomadicrootsco.com, 1
 nomadproject.io, 0
 nomagic.software, 1
 nomaster.cc, 1
@@ -61273,6 +61114,7 @@ nomesbiblicos.com, 1
 nomial.co.uk, 1
 nomifensine.com, 1
 nomik.xyz, 1
+nomo.my, 1
 nomoondev.azurewebsites.net, 1
 nomsing.tk, 1
 nomsy.net, 1
@@ -61367,6 +61209,7 @@ normankranich.de, 1
 normansolutions.co.uk, 1
 normantobar.com, 1
 normapro.es, 1
+normco.re, 1
 norml.fr, 1
 noroshi-burger.com, 1
 norrisautomotiveinc.com, 1
@@ -61396,7 +61239,6 @@ northern-lakes.com, 1
 northerngate.net, 1
 northernhamsterclub.com, 1
 northernmuscle.ca, 1
-northernpage.com, 1
 northernpowertrain.com, 1
 northernselfstorage.co.za, 1
 northfieldyarn.com, 1
@@ -61409,6 +61251,7 @@ northpost.is, 1
 northridgeelectrical.com, 1
 northrose.net, 1
 northscottsdaleloan.com, 1
+northstate.net, 1
 northtek.tk, 1
 northtexasvasectomy.com, 1
 northumbriagames.co.uk, 1
@@ -61451,7 +61294,6 @@ not-equal.me, 1
 not4me.ga, 1
 nota-web.com, 1
 nota.moe, 1
-notablepeeps.com, 1
 notabug.org, 1
 notacooldomain.com, 1
 notadd.store, 1
@@ -61539,7 +61381,6 @@ novanetwork.ml, 1
 novascan.net, 1
 novasprint.tk, 1
 novawatch.de, 1
-novawave.ca, 1
 nove.city, 1
 noveciti.com, 1
 novecity.cloud, 1
@@ -61621,19 +61462,18 @@ noydeen.com, 1
 noyocenter.org, 1
 noypark.top, 1
 nozel.gq, 1
+nozier.com, 1
 np-edv.at, 1
 np.search.yahoo.com, 0
 np39.de, 1
 npaccel.com, 1
 npath.de, 1
 npc.org.au, 1
-npchosting.com, 1
 npcrcss.org, 1
 npdigital.com, 1
 nphrm.com, 1
 npmcdn.com, 1
 npod.me, 1
-npool.org, 1
 npregion.org, 1
 npsas.org, 1
 nptn.tk, 1
@@ -61785,8 +61625,10 @@ numero1.ch, 0
 numerologist.com, 1
 numerouno.ml, 1
 numis.tech, 1
-numismatica.info.ve, 1
+numismatica.info.ve, 0
 numismed-seniorcare.de, 1
+numista.com, 1
+numit.com.au, 1
 numo.co, 1
 numwave.nl, 1
 nunesgh.com, 1
@@ -61817,7 +61659,6 @@ nursemom.ca, 1
 nurseregistry.com, 1
 nurses.dating, 1
 nursingschool.network, 1
-nuryahan.com.br, 1
 nusaceningan.io, 1
 nusantaratv.com, 1
 nusatrip-api.com, 1
@@ -61833,7 +61674,6 @@ nutleyef.org, 1
 nutpanda.com, 1
 nutra-creations.com, 1
 nutradian.com, 1
-nutrafitsuplementos.com.br, 1
 nutralivbio.com, 1
 nutrashop.fr, 1
 nutri-spec.me, 1
@@ -61851,7 +61691,6 @@ nutritious.cf, 1
 nutrizionista.roma.it, 1
 nuva.hu, 1
 nuvechtdal.nl, 1
-nuverabusiness.com, 1
 nuveratechtrends.com, 1
 nuvini.com, 1
 nuxer.fr, 1
@@ -61899,6 +61738,7 @@ nya.as, 1
 nyaa.am, 1
 nyadora.com, 1
 nyadora.moe, 1
+nyamulab.net, 1
 nyan.it, 1
 nyan.kim, 1
 nyan.stream, 1
@@ -62026,11 +61866,9 @@ oakshield.nl, 1
 oakslighting.co.uk, 1
 oaktree-realtors.com, 1
 oakwood-park.tk, 1
-oanalista.com.br, 1
 oasiristorantebagno.it, 1
 oasis-conference.org.nz, 0
 oasis9.net, 1
-oasisdabeleza.com.br, 1
 oasisim.net, 0
 oasisorthodontics.com.au, 1
 oatmealdome.me, 1
@@ -62083,9 +61921,7 @@ obocat.tk, 1
 oboeta.com, 1
 obomne.tk, 1
 obozrevatel.tk, 1
-obra.com.br, 1
 obrabotka-zakazow.tk, 1
-obrienswine.ie, 1
 obrobka-zdjec.pl, 1
 obs.group, 1
 obscur.us, 1
@@ -62216,8 +62052,10 @@ odhosc.ca, 1
 odinraz.ga, 1
 odinseye.net, 1
 odnostranichnik.tk, 1
+odo-pro.ru, 1
 odolbeau.fr, 1
 odontologia-online.com, 1
+odontologiawilliampizarro.com, 1
 odoo.co.th, 1
 odosblog.de, 1
 odpikedoslike.com, 1
@@ -62228,6 +62066,7 @@ odyssey44.com, 1
 odysseyofthemind.eu, 1
 odysseytraining.com.au, 1
 odzyskaniedomeny.pl, 1
+odzywianie.info.pl, 1
 oe-boston.com, 1
 oe0fcdncxjpdd05b.myfritz.net, 1
 oe2018.gov.pt, 1
@@ -62248,7 +62087,7 @@ oemwolf.com, 1
 oenings.eu, 1
 oepsbanaan.nl, 1
 oessi.eu, 1
-of2m.fr, 1
+oetzies-quiz.com, 1
 ofcampuslausanne.ch, 0
 ofda.gov, 1
 ofertasadsl.com, 1
@@ -62306,7 +62145,7 @@ ofggolf.com, 1
 ofileo.fr, 1
 ofisescort.tk, 1
 oflow.me, 1
-ofo.moe, 1
+ofo.moe, 0
 oformit-zajm-kruglosutochno.ga, 1
 oformlaj.ga, 1
 ofrion.lu, 1
@@ -62325,6 +62164,7 @@ oglen.ca, 1
 ognemet.net, 1
 ognyan.tk, 1
 ogo-knigi.ml, 1
+ogocare.com, 1
 ogogo-knigi.ml, 1
 ogorod-money.tk, 1
 ogretmenimsanat.com, 1
@@ -62389,9 +62229,7 @@ oisd.nl, 1
 oiseaux-mania.com, 1
 oita-homes.com, 1
 ojaioliveoil.com, 1
-ojdip.net, 1
 ojeremy.com, 1
-ojojz.com, 1
 ojomovies.com, 1
 ojp.gov, 1
 ok-ex.io, 1
@@ -62417,7 +62255,6 @@ okburrito.com, 1
 okcasino.ga, 1
 okchousebuyer.com, 1
 okeeferanch.ca, 1
-okewp.com, 1
 okhanvatansever.tk, 1
 okhrana.agency, 1
 okib.ca, 1
@@ -62462,6 +62299,7 @@ okusiassociates.com, 1
 okviz.com, 1
 okweb.mx, 1
 okwu.cz, 1
+ola-xyma.com, 1
 olafnorge.de, 1
 olafvantol.nl, 1
 olafwalther.de, 1
@@ -62513,10 +62351,11 @@ olegon.ru, 1
 olegrpg.in.ua, 1
 olegs.be, 1
 oleksii.name, 1
+olenergie.com, 1
 olenergie.fr, 1
 olenergies.eu, 1
 olenergies.fr, 1
-oleodecopayba.com.br, 1
+oleron.fr, 1
 oles-hundehaus.de, 1
 olesaindustrial.cat, 1
 olesaradio.tk, 1
@@ -62639,8 +62478,9 @@ omniaclubs.com, 1
 omniasig.ro, 1
 omniasl.com, 1
 omniatv.com, 1
-omnibnk.cl, 1
+omniballot.us, 1
 omnibot.tv, 1
+omnicourt.jp, 1
 omnienviro.com, 0
 omnienviro.com.au, 0
 omnifurgone.it, 1
@@ -62649,7 +62489,7 @@ omnigon.network, 1
 omnimoto.it, 1
 omniscimus.net, 0
 omnisiens.se, 1
-omnisinal.pt, 1
+omnisinal.pt, 0
 omniteck.com, 1
 omniverse.ru, 1
 omny.info, 1
@@ -62665,6 +62505,8 @@ omsknews.tk, 1
 omskrock.com, 1
 omskweb.tk, 1
 omtleden.nl, 1
+omveda.org, 1
+on-air.today, 1
 on-targettrainingcourses.com, 1
 on-tech.co.uk, 1
 on-the-wave.com, 1
@@ -62837,7 +62679,6 @@ onlinedivorce.com, 1
 onlinefashion.it, 1
 onlinegamesforgirls.tk, 1
 onlinehaircuts.com, 1
-onlinehashfollow.com, 1
 onlineinfographic.com, 1
 onlinekmc.com, 1
 onlineknighki.ga, 1
@@ -62884,6 +62725,7 @@ onlylibya.com, 1
 onlylithiumhere.gq, 1
 onlylovastatin.gq, 1
 onlysim.nl, 1
+onlyssd.com, 1
 onlyveg.tk, 1
 onmaps.de, 1
 onmarketbookbuilds.com, 1
@@ -62912,7 +62754,6 @@ ontariocountyny.gov, 1
 ontdekhetzelf.nu, 1
 onthe.network, 1
 ontheballbuilding.com.au, 1
-onthebriteside.com, 1
 onthecheap.store, 1
 onthegosystems.com, 1
 onthehook.ru, 1
@@ -63022,6 +62863,7 @@ openclub24.ru, 1
 opencluster.at, 1
 openconf.uk, 1
 openconnect.com.au, 1
+opencovidpledge.org, 1
 opencpes.com, 1
 opencpes.info, 1
 opencpes.io, 1
@@ -63081,7 +62923,6 @@ opensourcex.tk, 1
 openspa.webhop.info, 1
 openssl.org, 1
 openstackid.org, 1
-openstakes.com, 1
 openstandia.jp, 1
 openstem.com.au, 1
 openstreetmap.is, 1
@@ -63182,6 +63023,7 @@ optimisedlabs.co.uk, 1
 optimisedlabs.info, 1
 optimisedlabs.net, 1
 optimisedlabs.uk, 1
+optimism.ru, 1
 optimist.bg, 1
 optimize-jpg.com, 1
 optimizedlabs.co.uk, 1
@@ -63189,6 +63031,7 @@ optimizedlabs.info, 1
 optimizedlabs.net, 1
 optimizedlabs.uk, 1
 optimo.com.tr, 1
+optimumterapia.pl, 1
 optimumwebdesigns.com, 1
 optimus.io, 1
 optimuscrime.net, 1
@@ -63231,6 +63074,7 @@ orangtua.tk, 1
 orangutan-appeal.org.uk, 1
 orangutan.org, 1
 oranjee.net, 0
+orano.vn, 1
 oratto.co.uk, 1
 orbeimaginario.com, 1
 orbisbi.com, 1
@@ -63359,6 +63203,7 @@ orthodoxy.lt, 0
 orthograph.ch, 1
 orthopedic-shoes.tk, 1
 orthopedicsalon.tk, 1
+orthosportiv.de, 1
 orthotictransfers.com, 1
 ortizmario.com, 1
 ortlepp.eu, 1
@@ -63462,7 +63307,6 @@ oswbouncycastles.co.uk, 1
 oszri.hu, 1
 ot-vinta.tk, 1
 ota365.com, 1
-otakubox.de, 1
 otakuie.tk, 1
 otakunopaw.net, 1
 otakurepublic.com, 1
@@ -63479,13 +63323,13 @@ otg-drives.tk, 1
 other98.com, 1
 otherkinforum.com, 1
 otherlandlabs.com, 1
-oticasaopaulo.com.br, 1
 oticasvisao.net.br, 1
 otinane.eu, 1
 otisko.com, 1
 otiumtech.com, 1
 otixz.com, 1
 otocenterfelix.com.br, 1
+otokirala.com, 1
 otokiralama.name.tr, 1
 otoma.tk, 1
 otomania.tk, 1
@@ -63522,7 +63366,7 @@ ouattara.ch, 1
 ouestfrance-auto.pro, 1
 ouestsolutions.com, 1
 ouglor.com, 1
-ouin.land, 1
+ouin.land, 0
 oulunjujutsu.com, 1
 ounage.de, 1
 ouowo.gq, 1
@@ -63550,12 +63394,14 @@ ourmemoriesonline.com, 1
 ournewsindia.ga, 1
 ourocg.cn, 1
 ouruglyfood.com, 1
+ourwits.com, 1
 ourworldindata.org, 1
 ourworldspeaks.com, 1
 oussoren-vinetomatoes.com, 1
 out-of-england.cf, 1
 out-of-scope.de, 1
 outdoorfurniture.ie, 1
+outdoorhaber.com, 1
 outdoorimagingportal.com, 1
 outdoorlightingagoura.com, 1
 outdoorlightingagourahills.com, 1
@@ -63601,6 +63447,7 @@ outstack.vote, 1
 outstandingpromotion.com, 1
 outurnate.com, 0
 outwesthunts.com, 1
+ouvindo.com.br, 1
 ouwerling.tk, 1
 ouxiang.me, 1
 ovabastecedoraindustrial.com, 1
@@ -63730,6 +63577,7 @@ p-s-b.com, 1
 p-soc.com.br, 1
 p-store.net, 1
 p-t.io, 1
+p10.ru, 1
 p1979.com, 1
 p1984.nl, 0
 p1cn.com, 1
@@ -63857,6 +63705,7 @@ paardenhulp.nl, 1
 paardenpro.nl, 1
 paardensportbak.nl, 1
 paas-inf.net, 1
+paaspasst.de, 1
 paass.net, 1
 paazmaya.fi, 1
 pablikado.cz, 1
@@ -63992,7 +63841,6 @@ pahealthbilling.com, 1
 pahira.gq, 1
 pahlawanpulsa.com, 1
 pahom.gq, 1
-pahub.io, 1
 paichai.space, 0
 paidikasymeon.gr, 1
 paiementdp.com, 1
@@ -64070,6 +63918,8 @@ palladium46.com, 1
 palletflow.com, 1
 palli.ch, 0
 palmaprop.com, 1
+palmavile.us, 1
+palmaville.com, 1
 palmbeachcuisine.com, 1
 palmbeachwebsitehosting.com, 1
 palmen-apotheke.de, 1
@@ -64077,12 +63927,15 @@ palmiye.tk, 1
 palner.eu, 1
 palomalopez.tk, 1
 palomardisplays.com, 1
+palucamoveis.com.br, 1
+pama.fun, 1
 pamaniqu.nl, 1
 pamc.tk, 1
 pamm.tk, 1
 pamsorel.co.za, 1
 pan-lleveme.com, 1
 pan.digital, 1
+panamacascoviejo.com, 1
 panamateakforestry.com, 1
 panamatravel.tk, 1
 panamatrippin.com, 1
@@ -64243,6 +64096,7 @@ paradependentesquimicos.com.br, 1
 paradies-baar.ch, 1
 paradiesgirls.ch, 1
 paradigma-med.ru, 1
+paradiscapacitados.site, 1
 paradise-engineer.com, 1
 paradise-engineering.com, 1
 paradise-engineers.com, 1
@@ -64290,6 +64144,7 @@ parcoursup-nouvelle-caledonie.fr, 1
 parcoursup.fr, 1
 pardnoy.com, 1
 pareachat.com, 1
+pareaki.com, 1
 paredesdecoura.pt, 0
 paremvasi.net, 1
 parentelement.com, 1
@@ -64298,6 +64153,7 @@ parentinterview.com, 1
 parentmail.co.uk, 1
 parentsandzebrasunited.com, 1
 parentsintouch.co.uk, 1
+parenttv.com, 1
 parfum-best.ml, 1
 parfum-selbermachen.de, 1
 parfumer.tk, 1
@@ -64448,6 +64304,7 @@ pascovotes.gov, 1
 pascualberniz.tk, 1
 pascualinmuebles.com, 1
 pasearch.nl, 1
+paseelite.co, 1
 pashminacachemire.com, 1
 pasito.se, 1
 pasnederland.tk, 1
@@ -64548,6 +64405,7 @@ patechmasters.com, 1
 patentados.com, 1
 patentchallenges.com, 1
 patentfamily.de, 1
+patentmanufaktur.com, 1
 pathagoras.com, 1
 pathsha.re, 1
 pathwaytofaith.com, 1
@@ -64584,7 +64442,6 @@ patriksima.cz, 1
 patriksimek.cz, 1
 patrikzk.eu, 1
 patriquefashion.tk, 1
-patrocinio.com.br, 1
 patrycjamichera.com, 1
 patryk.cf, 1
 patrz.eu, 1
@@ -64606,7 +64463,6 @@ paul-online.tech, 0
 paul-sitarz.com, 1
 paul.reviews, 1
 pauladamsmith.com, 1
-paulalutz.com, 0
 paulandmadge.com, 1
 paulbdelaat.nl, 1
 paulborza.com, 1
@@ -64705,7 +64561,6 @@ payments.google.com, 1
 paymerang.com, 1
 paymill.de, 1
 paymon.tj, 1
-paymongo.com, 1
 paymongo.help, 1
 paymyphysician.com, 1
 paynet.com.co, 1
@@ -64863,6 +64718,7 @@ peawo.com, 1
 pebbleparents.com, 0
 pebblepointapartmentsstl.com, 1
 pebbles.net.in, 1
+pebkac.gr, 1
 pebmarketing.nl, 1
 pebook.tk, 1
 pecheneg.tk, 1
@@ -64884,9 +64740,9 @@ pedicureduiven.nl, 1
 pedigreetechnologies.com, 1
 pedikura-vitu.cz, 1
 pedimanie.cz, 1
-pedimoda.com.br, 1
 pedro.com.es, 1
 pedrobotias.tk, 1
+pedrolamas.com, 1
 pedromunoz.tk, 1
 pedrosaurus.com, 1
 pedrosillo-delosaires.tk, 1
@@ -64897,7 +64753,6 @@ peelland-fm.tk, 1
 peen.ch, 1
 peenor.xyz, 1
 peep.gq, 1
-peepsfoundation.org, 0
 peer.travel, 1
 peerbanking.com.au, 1
 peercraft.at, 1
@@ -65036,13 +64891,13 @@ penza-today.tk, 1
 penzaonline.cf, 1
 penzionvzahrade.cz, 1
 peoplelikemeapp.com, 1
+peopleorders.xyz, 1
 peoplescu.com, 1
 peoplesdecade.org, 1
 peoplesguardian.org, 1
 peoplesliberationfront.tk, 1
 pepeelektro.sk, 1
 pepegym.cz, 1
-pepemodelismo.com.br, 1
 peperstraat.online, 1
 pepfar.gov, 0
 pepgrid.net, 1
@@ -65058,6 +64913,7 @@ per-olsson.se, 1
 peraavcilar.com, 1
 perakampus.com, 1
 perala.me, 1
+perali.com, 1
 perantiguru.com, 1
 peraparker.cz, 1
 perceptivemeded.com, 1
@@ -65082,6 +64938,7 @@ perevedut.cf, 1
 perewall.tk, 1
 perez-marrero.com, 1
 perezdecastro.org, 1
+perezplumbinginc.com, 1
 perf1.com, 1
 perfect-carstyle.de, 1
 perfect-dream.tk, 1
@@ -65110,7 +64967,6 @@ performancepiers.com, 1
 performetric.net, 1
 performing-art-schools.com, 1
 performio.co, 1
-perfumes.com.br, 1
 perfumestudio.in, 1
 pericsope.gq, 1
 perini.com.au, 1
@@ -65190,7 +65046,6 @@ pervomaysk-city.ml, 1
 perzeidi.hr, 1
 pescadorcomunicacao.com, 1
 pescanetworks.tk, 1
-pescco.com.br, 1
 pesnik.tk, 1
 pesnitut.ga, 1
 pestcontrol.co.uk, 1
@@ -65292,7 +65147,6 @@ petscams.com, 1
 petschnighof.at, 1
 petsnews.ga, 1
 petspark.tk, 1
-petstok.com.br, 1
 petstoredog.com, 1
 petto.com.co, 1
 peturnashes.ga, 1
@@ -65338,7 +65192,7 @@ pfotentour-berlin.de, 1
 pfrost.me, 1
 pfteprofessionals.com, 1
 pfudor.tk, 1
-pg-forum.de, 1
+pg-forum.de, 0
 pg-mana.net, 1
 pgazette.tk, 1
 pgh-art.com, 1
@@ -65363,7 +65217,6 @@ phantastikon.de, 1
 phantomfund.ml, 1
 phantomphans.tk, 1
 pharma-display.com, 1
-pharmaabsoluta.com.br, 1
 pharmaboard.de, 1
 pharmaboard.org, 1
 pharmaceuticalcannabis.org, 1
@@ -65384,7 +65237,6 @@ pharynx.nl, 1
 phasme-2016.com, 1
 phattea.tk, 1
 phaux.uno, 1
-phbits.com, 1
 phc-sa.com, 1
 phcimages.com, 1
 phcnetworks.net, 0
@@ -65400,7 +65252,6 @@ phenixairsoft.com, 1
 phenonline.com, 1
 phenq.com, 1
 pheramoan.com, 1
-pheramoans.com, 1
 phero.com, 1
 pheroforce.com, 1
 pherologie.com, 1
@@ -65448,6 +65299,7 @@ philippe-metayer-platrier.fr, 1
 philippe-mignotte.fr, 1
 philippebonnard.fr, 1
 philippegoffin.be, 1
+philippehannes.fr, 1
 philippekhau.tk, 1
 philipperoose.be, 0
 philippestudiopro.com, 1
@@ -65530,7 +65382,6 @@ photo-travel.tk, 1
 photoancestry.com, 1
 photoartelle.com, 1
 photobooth-romania.ro, 1
-photobooth.id, 1
 photobosco.tk, 1
 photochka.tk, 1
 photocode.co.rs, 1
@@ -65635,9 +65486,6 @@ pianyigou.com, 1
 piaohong.tk, 1
 piasto.com.cy, 1
 piata.com.br, 1
-piataborrachas.com.br, 1
-piatabrasil.com.br, 1
-piatatem.com.br, 1
 piatenko.ml, 1
 piatika.com, 1
 piazzafrancesco.com, 1
@@ -65698,6 +65546,7 @@ pieces-or.com, 0
 piechart.ga, 1
 piedrahita.tk, 1
 piedrasblancas.gov, 1
+piedroshop.nl, 1
 piekacz.co.uk, 1
 piekacz.eu.org, 1
 piekacz.net, 1
@@ -65711,7 +65560,6 @@ piepermail.nl, 1
 pieq.eu, 1
 pieq.eu.org, 1
 pier1url.com, 1
-pier23.org, 1
 pier28.com, 1
 piercing.hu, 1
 piercraft.com, 1
@@ -65738,6 +65586,7 @@ pietermaene.be, 0
 pietron.name, 1
 pietrosoft.tk, 1
 pietz.uk, 1
+piezus.ru, 1
 pif.email, 1
 piferdal.pt, 1
 piffer.ind.br, 1
@@ -65772,11 +65621,11 @@ pillowfort.pub, 1
 pilot-colleges.com, 1
 pilot.co, 0
 pilotgrowth.com, 1
+pilotpov.com, 1
 pilvi.pw, 1
 pilvi.space, 1
 pilvin.pl, 1
 pimanta.com, 1
-pimg136.com, 1
 pimhaarsma.nl, 1
 pimhaarsmamedia.nl, 1
 pimichi.com, 1
@@ -65878,6 +65727,7 @@ piratebay.ml, 1
 piratebayproxy.tf, 1
 piraten-basel.ch, 1
 piraten-bv-nord.de, 1
+piraten-kleinbasel.ch, 1
 pirateparty.org.uk, 1
 piratepay.io, 0
 piratepcs.com, 1
@@ -66017,9 +65867,6 @@ pj21499.com, 1
 pj21566.com, 1
 pj21599.com, 1
 pj21866.com, 1
-pj21886.com, 1
-pj21887.com, 1
-pj21899.com, 1
 pj21990.com, 1
 pj21992.com, 1
 pj21aa.com, 1
@@ -66050,6 +65897,7 @@ pj539999.com, 1
 pj5588.cc, 1
 pj83.duckdns.org, 1
 pjax.xyz, 1
+pjdigitalmarketing.com, 1
 pjentertainments.co.uk, 1
 pjleisure.co.uk, 1
 pjo.no, 1
@@ -66082,7 +65930,6 @@ pkwebsolutions.cf, 1
 pl-cours.ch, 0
 pl-trans.tk, 1
 pl.search.yahoo.com, 0
-placasonline.com.br, 1
 placedaffiliate.com, 1
 placedapps.com, 1
 placedsupport.com, 1
@@ -66126,7 +65973,6 @@ planetadeti.org, 1
 planetanim.fr, 1
 planetarian.moe, 1
 planetarydesign.com, 1
-planetasuboficial.com.br, 1
 planetau2.com, 1
 planetbreath.ch, 0
 planetchiropracticga.com, 1
@@ -66159,6 +66005,7 @@ planning.ga, 1
 plano.gq, 1
 planolowcarb.com, 1
 planosylicencias.de, 1
+planovivofibra.com.br, 1
 planrow.com, 1
 planshetnik.tk, 1
 plansight.com, 1
@@ -66195,6 +66042,7 @@ plastiflex.it, 1
 plastischechirurgie-linz.at, 1
 plastovelehatko.cz, 1
 plateformecandidature.com, 1
+platform-med.org, 1
 platform.ltd.uk, 1
 platform161.com, 1
 platformadmin.com, 1
@@ -66228,11 +66076,8 @@ playelephant.com, 1
 playerdb.co, 1
 playerhunter.com, 0
 playface.ml, 1
-playfinder.com, 1
-playform.cloud, 0
 playfrank.com, 1
 playhappywheelsunblocked.com, 1
-playinfinity.com, 1
 playinfinityvr.com, 1
 playit.rs, 1
 playlisten.radio.br, 1
@@ -66243,6 +66088,7 @@ playnation.io, 1
 playnow.com, 1
 playnuganug.com, 1
 playocean.net, 1
+playorigin.com, 1
 playpirates.com, 1
 playreal.city, 1
 playsawdust.com, 1
@@ -66251,6 +66097,7 @@ playsoftware.tk, 1
 playsprout.industries, 1
 playstation-network.ga, 1
 playstation.com, 1
+playstationplus.es, 1
 playstationtrophies.org, 1
 playtictactoe.org, 1
 playtimebouncycastles.co.uk, 1
@@ -66319,7 +66166,6 @@ plugcubed.net, 0
 plugin-planet.com, 1
 pluginfactory.io, 1
 plugins-telechargement.com, 1
-pluginsetemaswp.com, 1
 pluginsloaded.com, 1
 pluimveeplanner.nl, 1
 plumbalot.co.za, 1
@@ -66349,6 +66195,7 @@ plus.sandbox.google.com, 1
 plus15.ml, 1
 plus1s.site, 1
 plus1s.tk, 1
+plus36.hu, 1
 plusbot.tk, 1
 pluslink.co.jp, 1
 plusmobile.fr, 1
@@ -66397,7 +66244,6 @@ pmg-offshore-company.com, 1
 pmg-p4p.de, 1
 pmg-purchase.com, 1
 pmg-purchase.net, 1
-pmi.gov, 1
 pmk.ddns.net, 0
 pmklaassen.com, 1
 pmnaish.co.uk, 1
@@ -66547,7 +66393,6 @@ pocketfruity.com, 1
 pocketinsure.com, 1
 pocketpasta.com, 1
 pocobelli.ch, 0
-pocqipai.com, 1
 pocze.ch, 1
 podari.tk, 1
 podarki-deda-moroza.tk, 1
@@ -66591,8 +66436,8 @@ pogotowiekomputeroweolsztyn.pl, 1
 pogrebisky.net, 1
 pogs.us, 1
 pohatta.com, 1
-pohlednice-tap.cz, 1
 pohlmann.io, 1
+poi-radary.eu, 1
 poiema.com.sg, 0
 poimel.ga, 1
 poinsot.info, 1
@@ -66778,6 +66623,7 @@ pontodogame.com.br, 1
 ponxel.com, 1
 pony-cl.co.jp, 1
 pony.tf, 1
+ponyar.net, 1
 ponychan.net, 1
 ponycyclepals.co.uk, 1
 ponydesignclub.nl, 1
@@ -66808,6 +66654,7 @@ pop-corn.ro, 1
 pop-culture.tk, 1
 pop.dk, 1
 pop3.jp, 0
+pop3.support, 1
 popcat.ru, 1
 popcorncult.ru, 1
 popcornpalacefundraising.com, 1
@@ -66821,6 +66668,7 @@ popkins.cf, 1
 popkins.ga, 1
 popkins.gq, 1
 popkins.tk, 1
+popkultura.info.pl, 1
 poplavok77.tk, 1
 popmagz.com, 1
 popmundoforum.tk, 1
@@ -66866,7 +66714,9 @@ pornfacefinder.com, 0
 pornflare.net, 1
 pornforwomentube.com, 1
 porngay.co, 1
+pornhib.xyz, 1
 pornhubhd.biz, 1
+pornhun.xyz, 1
 pornimg.net, 1
 porniwi.com, 1
 pornjunkiesxxx.com, 1
@@ -67023,6 +66873,7 @@ postoyanstvo.cf, 1
 postpot.co.kr, 1
 postsubmeta.net, 1
 posttigo.com, 1
+posukovskaschola.cz, 1
 posutochno.ml, 1
 posyperfume.com, 1
 potatiz.com, 1
@@ -67037,7 +66888,6 @@ potature.rimini.it, 1
 potature.roma.it, 1
 potbar.com, 1
 potentialproject.com, 0
-poterepersonale.it, 1
 potgrowersunion.com, 1
 pothe.com, 1
 pothe.de, 1
@@ -67267,6 +67117,7 @@ precisiondigital-llc.com, 1
 precisionhealthpilot.org, 1
 precisionhockey.net, 1
 precisionicerinks.com, 1
+precisionlender.com, 1
 precisionmachineservice.com, 1
 precisionvaccinations.com, 1
 precode.eu, 1
@@ -67422,7 +67273,6 @@ previousmagazine.com, 1
 previsora.gov.co, 0
 prexxorvita.com, 1
 prgrmmr.nl, 1
-priboutiquedasflores.com.br, 1
 price.bond, 1
 pricegg.com, 1
 priceholic.com, 1
@@ -67431,7 +67281,6 @@ priceofdollar.com, 1
 priceremoval.net, 1
 pricesim.com, 1
 pricesniffer.co, 1
-pricope-stefan.com, 1
 prideindomination.com, 1
 pridnestrovye.gq, 1
 prielwurmjaeger.de, 1
@@ -67475,7 +67324,6 @@ princetonradiationoncology.com, 1
 princezna.club, 1
 principalsexam.com, 1
 principalship.net, 1
-principalstest.com, 1
 principaltoolbox.com, 1
 principia-journal.de, 1
 principia-magazin.de, 1
@@ -67487,6 +67335,7 @@ print-street.tk, 1
 printeknologies.com, 1
 printerinktoutlet.nl, 1
 printerleasing.be, 1
+printerpoint.co.in, 1
 printertonerkopen.nl, 1
 printexpress.cloud, 1
 printfn.com, 0
@@ -67530,6 +67379,7 @@ prismacloud.xyz, 1
 prismapixel.studio, 1
 prisminfosys.com, 1
 prismintl.org, 1
+prisonerresource.com, 1
 pristal.eu, 1
 prisync.com, 1
 pritalk.com, 1
@@ -67546,7 +67396,7 @@ privacychick.com, 1
 privacychick.io, 1
 privacyforjournalists.org.au, 1
 privacyget.tk, 1
-privacyinternational.org, 1
+privacyinsights.nl, 1
 privacymanatee.com, 1
 privacynow.eu, 1
 privacyscore.org, 1
@@ -67564,12 +67414,10 @@ private-mail-for.me, 1
 privatebanks.uk, 1
 privatebin.info, 1
 privatecapsecurity.org, 1
-privatecollection.ae, 1
 privateger.me, 1
 privategiant.com, 1
 privateideas.de, 1
 privateimarketing.com, 1
-privatemediaserver.tech, 1
 privatenebula.eu, 1
 privatepokertour.com, 1
 privatepropertymallorca.com, 1
@@ -67604,6 +67452,7 @@ pro-ben.sk, 1
 pro-bike.ro, 1
 pro-clean.org, 1
 pro-co.at, 1
+pro-dog.ru, 1
 pro-esb.com, 1
 pro-esb.net, 1
 pro-ing.com, 0
@@ -67623,7 +67472,6 @@ pro-taucher.de, 1
 pro-wiert.pl, 1
 pro100blogger.com, 1
 pro100systems.com.ua, 1
-pro3ozonio.com.br, 1
 proact-it.co.uk, 1
 proactive.run, 1
 proactivenews.ml, 1
@@ -67642,7 +67490,7 @@ probooks.gq, 1
 procar-rheinland.de, 1
 procarservices.com, 1
 procarswoking.com, 1
-procens.us, 1
+procens.us, 0
 procensus.com, 1
 procert.ch, 0
 procesadorafenix.com.mx, 1
@@ -67689,7 +67537,6 @@ productionscime.com, 1
 productlondon.com, 1
 productosfitness.com, 1
 productpeo.pl, 1
-products88.com, 1
 productsblockbuster.com, 1
 productsbrandleader.com, 1
 productscastle.com, 1
@@ -67720,6 +67567,8 @@ professionallawyer.tk, 1
 professions.org.ru, 1
 professors.ee, 1
 professorwidget.tk, 1
+proficiodigital.com, 1
+proficiodigital.sk, 1
 profidea.cz, 1
 profielektrik.tk, 1
 profile.tf, 1
@@ -67767,6 +67616,7 @@ program-and.work, 1
 programador-web-freelance.es, 1
 programadorwp.com, 1
 programarya.com, 1
+programer21.com, 1
 programistka.com, 1
 programlama.tk, 1
 programmaticmagic.com, 1
@@ -67794,14 +67644,15 @@ prohost24.tk, 1
 prohrcloud.com, 1
 proibidoler.com, 1
 proimpact.it, 1
+proitsecurity.cl, 1
 proj.org.cn, 1
 proj3ct.me, 1
+proj6.site, 1
 project-novis.org, 1
 project-rune.tech, 1
 project-splash.com, 0
 project-stats.com, 1
 project86fashion.com, 1
-projectarmy.net, 0
 projectbenson.com, 0
 projectborealisgitlab.site, 1
 projectbotticelli.com, 1
@@ -67905,7 +67756,6 @@ properticons.com, 1
 property-catalogue.eu, 1
 property-tax.cf, 1
 property-tax.ga, 1
-propertyauctionaction.co.uk, 1
 propertycrawl.com, 1
 propertyfindercdn.com, 1
 propertyflare.com, 1
@@ -67973,11 +67823,13 @@ prosurveillancegear.com, 1
 protanki.ml, 1
 protanki.tk, 1
 protapnews.tk, 1
-protech.ge, 1
+protech.ge, 0
 proteco.sk, 1
 protectedpayments.net, 1
 protectedreport.com, 1
 protectem.de, 1
+protection-plexi.com, 1
+protection-plexi.fr, 1
 protection.ga, 1
 protectionformula.com.ua, 1
 protectoraanimalesalicante.org, 1
@@ -68060,6 +67912,7 @@ proxybay.bet, 1
 proxybay.bz, 1
 proxybay.cc, 1
 proxybay.co, 1
+proxybay.info, 1
 proxybay.ist, 1
 proxybay.la, 1
 proxybay.lat, 1
@@ -68069,13 +67922,11 @@ proxybay.onl, 1
 proxybay.red, 1
 proxybay.tv, 1
 proxybay.uno, 1
-proxyportal.org, 1
 proxytool.cf, 1
 proyectafengshui.com, 1
 proyecto13.com, 1
 proyectosinelec.com, 1
 proyectostep.tk, 1
-proyectosx.net, 1
 prozac20mg.cf, 1
 prozorlivec.tk, 1
 prpferrara.it, 1
@@ -68088,7 +67939,6 @@ prtpe.com, 1
 prtscloud.ddns.net, 1
 pru.com.hk, 1
 pru.hk, 1
-pruebapg.cl, 1
 pruikshop.nl, 1
 pruma.com.br, 1
 pruna.org, 1
@@ -68103,7 +67953,6 @@ prylarprylar.se, 1
 prynhawn.com, 1
 prynhawn.net, 1
 prynhawn.org, 1
-prytkov.com, 1
 przemas.pl, 1
 przerabianiezdjec.pl, 1
 ps-provider.co.jp, 1
@@ -68145,6 +67994,7 @@ psicologajanainapresotto.com.br, 1
 psicologasandrabernal.es, 1
 psicologo-especialista-barcelona.com, 1
 psicologo-infantil-barcelona.com, 1
+psicologomogidascruzes.com.br, 1
 psicometricas.mx, 1
 psihologonline.tk, 1
 psihology.gq, 1
@@ -68174,6 +68024,8 @@ pssgcsim.org, 1
 pst.moe, 1
 pstrozniak.com, 1
 psu.je, 1
+psucompare.com, 1
+psv-herford-badminton.de, 1
 psw-consulting.de, 1
 psw-group.de, 1
 psw-training.de, 1
@@ -68197,6 +68049,7 @@ psychologbruksela.be, 1
 psychologi.cf, 1
 psychologic.tk, 1
 psychologie-hofner.at, 1
+psychologue-grenoble.org, 1
 psychologytests.tk, 1
 psychometrictest.ca, 1
 psychometrictest.co.il, 1
@@ -68232,6 +68085,7 @@ pszinfo.hu, 1
 pt-d.ru, 1
 pt-server.de, 1
 pt.im, 1
+pta-security.nl, 1
 pta.world, 1
 ptab2pt.ga, 1
 ptal.eu, 1
@@ -68239,6 +68093,7 @@ ptasiepodroze.eu, 1
 ptbi.org.pl, 1
 ptboys.tk, 1
 ptcbooks.gq, 1
+ptcmonitoring.ir, 1
 pteceng.com, 1
 pterodactyl.org.cn, 1
 pterodactylus.cz, 1
@@ -68274,7 +68129,6 @@ public-measures.com, 1
 public-projects.com, 1
 public-projects.de, 1
 public-vocals.de, 1
-publicard.es, 1
 publiccarauctionscalifornia.com, 1
 publicholidays.im, 1
 publicintegrity.org, 1
@@ -68291,6 +68145,7 @@ publivate.ca, 1
 publixphere.net, 1
 pubmire.com, 0
 pubreview.com.au, 1
+pubsasiedzi.pl, 1
 pubsavoy.tk, 1
 pucogid.ga, 1
 pucsr.tech, 1
@@ -68347,6 +68202,8 @@ pungatv.ml, 1
 punikonta.de, 1
 punishment.institute, 1
 punitsheth.com, 1
+punjabdirectory.in, 1
+punjabitube.xyz, 1
 punjabprime.com, 1
 punkapoule.fr, 1
 punkart.tk, 1
@@ -68359,7 +68216,6 @@ puntacananetwork.com, 1
 puntacanatransporte.com, 1
 puntaprop.com, 1
 puntcunts.com, 1
-punte-juwelier.nl, 1
 puntoestadodemexico.com, 1
 puntonium.hu, 1
 puntoseguro.com, 0
@@ -68367,7 +68223,7 @@ pupboss.com, 1
 pupok.cf, 1
 pupok.gq, 1
 puppet.pl, 1
-puppo.space, 0
+puppo.space, 1
 pupset.net, 1
 pupsikstudio.com, 1
 puq.moe, 1
@@ -68451,7 +68307,6 @@ putman-it.nl, 1
 putnamcollision.com, 1
 putney.io, 1
 putnik.tk, 1
-putomani.rs, 1
 putrock.be, 1
 puttymonos.club, 1
 puxlit.net, 1
@@ -68473,6 +68328,7 @@ pvmotorco.com, 1
 pvpagario.tk, 1
 pvpcraft.ca, 1
 pvpctutorials.de, 1
+pvpheroes.gg, 1
 pvpheroes.no, 1
 pvphs98.com, 1
 pvplist.ml, 1
@@ -68545,6 +68401,7 @@ q1q2q3.tk, 1
 q1z.net, 1
 q30365.com, 1
 q36594.com, 1
+q3jlzwq.com, 1
 q5118.com, 1
 q5197.co, 1
 q6729.co, 1
@@ -68567,6 +68424,7 @@ qadmium.com, 1
 qadmium.tk, 1
 qalab.tk, 1
 qambarraza.com, 1
+qanatnews.tk, 1
 qandavision.com, 0
 qani.me, 1
 qaq.cloud, 1
@@ -68578,9 +68436,9 @@ qatartimes.tk, 1
 qaz.cloud, 1
 qaz.link, 1
 qb928.com.tw, 1
+qbacano.com, 1
 qbasicsite.tk, 1
 qbd.eu, 1
-qbiju.com.br, 1
 qbiltrade.com, 1
 qbtechs.com, 1
 qc.immo, 1
@@ -68641,6 +68499,7 @@ qivonline.pt, 1
 qiwi.be, 1
 qixi.biz, 1
 qiyan.email, 1
+qjg.com.br, 1
 qkek.tk, 1
 qkka.org, 1
 qklshequ.com, 1
@@ -68673,7 +68532,6 @@ qosmoschools.edu.my, 1
 qotw.net, 1
 qp666d.com, 1
 qpaypro.com, 1
-qpcna.org, 1
 qponverzum.hu, 1
 qpsinc.com, 1
 qq5197.co, 1
@@ -68741,7 +68599,6 @@ qualith.tk, 1
 quality-life.gr, 1
 qualityconcreteraising.com, 1
 qualitydns.net, 1
-qualityfactory.com, 1
 qualityhomesystems.com, 1
 qualityhvacservices.com, 1
 qualityofcourse.com, 0
@@ -68760,7 +68617,6 @@ quantolytic.de, 1
 quantomaisconsorcios.com.br, 1
 quantoras.com, 1
 quantrix.com, 1
-quanttydesignweb.com.br, 1
 quantum-evolution.jp, 1
 quantum-lviv.pp.ua, 1
 quantum-mechanics.com, 1
@@ -68781,11 +68637,11 @@ quartz.im, 1
 quartzclinical.com, 1
 quarus.net, 1
 quasarelectronics.co.uk, 1
+quasetio.ml, 1
 quasiproxy.com, 1
 quasseldroid.info, 1
 quatermass.tk, 1
 quatrefoiscent.fr, 1
-quatulo.net, 1
 quaxio.com, 1
 quay.net, 1
 qubes-os.org, 1
@@ -68814,6 +68670,7 @@ queercinema.ch, 1
 queextensiones.com, 1
 queirozmiotto.adv.br, 1
 queirozmiotto.com.br, 1
+quel-dj.com, 1
 quelle-catalog.tk, 1
 quelle.at, 1
 quelle.ch, 1
@@ -68826,10 +68683,10 @@ quenecesitopara.com, 1
 quenotejodan.cl, 1
 quentar.tk, 1
 quentin-sauvetre.fr, 1
+quentinaurat.com, 1
 quentinchevre.ch, 1
 quera.ir, 1
 querenciavirtual.com.br, 1
-queropescar.net, 1
 query-massage.com, 0
 queryquinton.com, 1
 quest-medica.com, 1
@@ -68914,6 +68771,7 @@ quiz4math.gr, 1
 quizandmoney.com, 1
 quizhub.co, 1
 quizhub.ml, 1
+quizinn.live, 1
 quizogames.com, 1
 quizstore.net, 1
 quizz.biz, 1
@@ -68980,7 +68838,6 @@ r1ch.net, 1
 r1h3.nl, 1
 r2d2pc.com, 1
 r30365.com, 1
-r33.space, 1
 r36533.com, 1
 r36594.com, 1
 r3bl.blog, 1
@@ -69010,6 +68867,7 @@ raadgiverborsen.com, 1
 raadvanstate.nl, 1
 raah.co, 1
 raailto.com, 1
+raamattuopisto.fi, 1
 raaynk.com, 1
 raballder.tk, 1
 rabatcity.tk, 1
@@ -69019,6 +68877,7 @@ rabbit.wales, 0
 rabbitcallcenter.com, 1
 rabbitfinance.com, 1
 rabbitinternet.com, 1
+rabec.com.sa, 1
 rabica.de, 1
 rabinson2005.tk, 1
 rabis.co, 1
@@ -69047,12 +68906,11 @@ racheldiensthuette.de, 1
 rachelmoorelaw.com, 1
 rachelreagan.com, 1
 rachelsbouncycastles.co.uk, 1
-rachida-dati.eu, 1
 rachnacollege.tk, 1
 racing-planet.cz, 1
 racingfanclub.tk, 1
 rackblue.com, 1
-rackerlab.com, 1
+rackerlab.com, 0
 raclet.co.uk, 1
 raconconsulting.co.uk, 1
 racoo.net, 1
@@ -69067,7 +68925,6 @@ radarcupao.pt, 1
 radarcupom.com.br, 1
 radarcupon.com.mx, 1
 radarcupon.es, 1
-radarequation.com, 1
 radarnext.com, 1
 radartatska.se, 1
 radartek.com, 1
@@ -69085,7 +68942,6 @@ radicaldream.tk, 1
 radicalepil-haguenau.fr, 1
 radicalfuture.tk, 1
 radicaloptimism.org, 1
-radicalsub.com.br, 1
 radicalwebdesign.co.uk, 1
 radio-az.tk, 1
 radio-bandit.ml, 1
@@ -69101,7 +68957,7 @@ radioactivenetwork.xyz, 1
 radioafibra.com.br, 1
 radioaltamar.tk, 1
 radioborges.tk, 1
-radiobox.net, 1
+radiobox.net, 0
 radiocappissima.tk, 1
 radiocartel.tk, 1
 radiocommande-industrielle.fr, 1
@@ -69158,9 +69014,9 @@ radiozetta.tk, 1
 radis-adopt.com, 1
 radiumcode.com, 1
 radiumone.io, 1
-radiumtree.com, 1
 radixsalon.tk, 1
 radlina.com, 1
+radnas.com, 1
 radnickapartija.tk, 1
 radomir-online.ru, 1
 radon.tk, 1
@@ -69199,6 +69055,7 @@ raghughphotography.tk, 1
 raghuspeaks.com, 1
 raginggaming.ga, 1
 ragingserenity.com, 1
+ragnarokhpg.com, 1
 ragnaroktop.com.br, 1
 ragu.co.uk, 1
 rahayi.tk, 1
@@ -69327,6 +69184,7 @@ ramatola.uk, 0
 rambedjeans.com, 1
 ramblingrf.tech, 1
 rambo.codes, 1
+ramdigital.xyz, 1
 rametrix.com, 1
 ramiabusalah.tk, 1
 ramieres.cf, 1
@@ -69338,7 +69196,6 @@ rammstein-portugal.com, 1
 rammsteinzone.tk, 1
 rampestyuma.com, 1
 ramrecha.com, 0
-ramsaver.com.br, 1
 ramsdensforcash.co.uk, 1
 ramsdensplc.com, 1
 ramsor-gaming.de, 1
@@ -69420,6 +69277,7 @@ rapidoo.com.br, 1
 rapidshit.net, 1
 rapidstone.com, 1
 rapidsurvival.com, 1
+rapidxray.biz, 1
 raportdnia.pl, 1
 rapport.link, 1
 rapportdecoracoes.com.br, 1
@@ -69447,7 +69305,6 @@ rashbogota.tk, 1
 rasheed-nuss.tk, 1
 raskruti.ml, 1
 raskrutka.cf, 1
-raspberid.com.es, 1
 raspii.tech, 1
 raspitec.ddns.net, 1
 rassadacvetov.com, 1
@@ -69494,6 +69351,8 @@ ravenrockrp.com, 1
 ravensbuch.de, 1
 ravenx.me, 1
 ravhaaglanden.org, 1
+ravihotel.com, 1
+ravijuhend.ee, 1
 ravik.tk, 1
 ravindran.me, 1
 raviparekh.co.uk, 1
@@ -69602,6 +69461,7 @@ rcraigmurphy.com, 1
 rcraigmurphy.net, 1
 rcsda.net, 1
 rcsolutions.nl, 1
+rcsscontractors.com, 1
 rct.sk, 1
 rct.uk, 1
 rctalk.com, 1
@@ -69775,6 +69635,7 @@ rebellecare.com, 1
 rebellion.global, 1
 rebelonline.nl, 1
 rebelrebel.com.au, 1
+rebelsewerservices.com, 1
 rebelz.se, 1
 rebeportillo.com, 1
 rebirthia.me, 1
@@ -69792,6 +69653,7 @@ recebersms.com, 1
 receitasdebacalhau.pt, 1
 receptionpoint.com, 1
 receptionsbook.com, 1
+recepty-s-foto.ru, 1
 recessmonkeyz.tk, 1
 recetin.com, 1
 recettemedievale.fr, 1
@@ -69829,6 +69691,7 @@ reconexion.life, 1
 recordmeeting.jp, 1
 recordmeeting.net, 1
 recordstudio.tk, 1
+recoveringfromfaith.com, 1
 recoveringircaddicts.org, 1
 recoveringspirit.com, 1
 recoveryohio.gov, 1
@@ -69870,7 +69733,6 @@ redable.nl, 1
 redacted.life, 1
 redactedmedia.org, 1
 redactieco.nl, 1
-redback.tech, 1
 redballoonsecurity.com, 1
 redburn.com, 1
 redcabbage.tk, 1
@@ -69910,6 +69772,7 @@ rede-reim.de, 1
 rede-t.com, 1
 redecsirt.pt, 1
 redeemingbeautyminerals.com, 1
+redelectrical.co.uk, 0
 redeshoprural.com.br, 1
 redessantaluzia.com.br, 1
 redeyeguatemala.tk, 1
@@ -69968,7 +69831,6 @@ redrafting.ga, 1
 redray.org, 1
 redrichindia.com, 1
 redrowcareers.co.uk, 1
-redscan.com, 1
 redsequence.com, 1
 redshiftcybersecurity.co.za, 1
 redshoeswalking.net, 1
@@ -70012,6 +69874,7 @@ reeson.org, 1
 reevaappliances.co.uk, 1
 reeves-family.com, 1
 refaaygroup.com, 1
+refansta.com, 1
 refer.codes, 1
 referat.club, 1
 referat.me, 1
@@ -70037,7 +69900,6 @@ reformatreality.com, 1
 refreshcartridges.co.uk, 1
 refreshingserum.com, 1
 refreshliving.us, 1
-refrigeracionpeinado.com.mx, 1
 refu.net, 1
 refundo.cz, 1
 refundo.sk, 1
@@ -70117,14 +69979,13 @@ reichel-steinmetz.de, 1
 reichelt-cloud.de, 1
 reichl-online.net, 1
 reiciunas.lt, 1
-reidasbombas.com, 1
-reidope.com.br, 1
 reifr.net, 1
 reignoftroy.com, 1
 reignsphere.net, 1
 reiki-coaching.nl, 0
 reiki-france.fr, 1
 reikicentrumdelft.nl, 1
+reikimontreal.org, 1
 reilly.io, 1
 reimaginebelonging.de, 1
 reimaginebelonging.org, 1
@@ -70150,7 +70011,7 @@ reinout.nu, 1
 reinouthoornweg.nl, 1
 reintjens.de, 1
 reinventetoi.com, 0
-reinventfit.ro, 1
+reinventfit.ro, 0
 reirei.cc, 1
 reisenbauer.ee, 1
 reiseversicherung-werner-hahn.de, 1
@@ -70200,6 +70061,7 @@ relaybox.io, 1
 release-monitoring.org, 1
 releasepoint.com, 1
 releasetimes.io, 1
+reliabledegree.com, 1
 reliablemaids.co.uk, 1
 reliableremovals-blackpool.co.uk, 1
 reliablesigningsllccrm.com, 1
@@ -70285,6 +70147,7 @@ rene-eizenhoefer.de, 1
 rene-schwarz.com, 1
 rene-stolp.de, 1
 renearends.nl, 1
+renedekoeijer.com, 1
 renee.today, 1
 renefloresphotography.com, 1
 renehsz.com, 1
@@ -70404,7 +70267,6 @@ republicmo.gov, 1
 republictelecom.net, 1
 republik-sombora.tk, 1
 republique.org, 1
-repuestosmedellin.com, 1
 repugnant-conclusion.com, 1
 repugnantconclusion.com, 1
 reputationweaver.com, 1
@@ -70419,6 +70281,7 @@ reroboto.org, 1
 resama.eu, 1
 resanebartar.tk, 1
 resc.la, 1
+resch.io, 1
 rescms-secure.com, 1
 rescuer.gq, 1
 research-panel.jp, 1
@@ -70427,6 +70290,7 @@ research.md, 1
 researchchempro.nl, 1
 researchgate.net, 1
 researchstory.com, 1
+reseau-protestant.ch, 1
 reseau.io, 1
 reseausyndic.ca, 1
 resepimok.com, 1
@@ -70508,6 +70372,7 @@ restauriedili.roma.it, 1
 rester-a-domicile.ch, 1
 rester-autonome-chez-soi.ch, 1
 restioson.me, 1
+restock.ninja, 1
 restoran-radovce.me, 1
 restoran.cf, 1
 restorethegulf.gov, 1
@@ -70560,7 +70425,7 @@ retraitebysaulsplace.nl, 1
 retro-game.org, 1
 retro.camp, 1
 retro.rocks, 1
-retro.sx, 1
+retro.sx, 0
 retroarms.com, 1
 retroarms.cz, 1
 retrocdn.net, 1
@@ -70572,8 +70437,7 @@ retropack.org, 1
 retroride.cz, 1
 retroroundup.com, 1
 retroslave.ga, 1
-retrotown.ws, 1
-retrotracks.net, 1
+retrotracks.net, 0
 retrovideospiele.com, 1
 rets.org.br, 0
 rettig.xyz, 0
@@ -70764,7 +70628,6 @@ riceadvice.info, 1
 richadams.me, 1
 richardbloomfield.blog, 1
 richardcrosby.co.uk, 1
-richardfaber.nl, 1
 richardharpur.com, 1
 richardinesrolltop.com, 1
 richardjgreen.net, 1
@@ -70824,6 +70687,7 @@ rico.ovh, 1
 ricobaldegger.ch, 1
 ricochet.im, 1
 ricomp.com.br, 1
+ricor.cl, 1
 ricordisiciliani.it, 1
 ricoydesign.com, 1
 ricozienke.de, 1
@@ -70837,7 +70701,6 @@ rident-estetic.ro, 1
 riders.ga, 1
 rides-japan.jp, 1
 rideyourdamn.bike, 1
-ridgarou.no-ip.org, 1
 ridhaan.co, 1
 ridingboutique.de, 1
 ridingoklahoma.com, 1
@@ -70892,6 +70755,7 @@ riku.pw, 1
 rikunori.com.tw, 1
 rikuras.cl, 1
 rile5.com, 1
+riley.love, 1
 rileyevans.co.uk, 1
 rileyskains.com, 1
 rilish.cf, 1
@@ -70913,6 +70777,7 @@ ringtune.ir, 1
 rinkhill.com, 1
 rinprom.com, 1
 rinsepimp.com, 1
+rinton.ru, 1
 rinvex.com, 1
 rinzler.io, 1
 rio-weimar.de, 1
@@ -71002,7 +70867,6 @@ rivoflor.it, 1
 rivus.net, 1
 riweco.ga, 1
 riwick.com, 0
-rixter.com, 0
 rixzz.ovh, 1
 riyadbankacademy.com, 1
 riyono.com, 1
@@ -71011,7 +70875,6 @@ rizoma.tech, 1
 rizospastis.gr, 1
 rj-onderneemt.nl, 1
 rjan.nl, 1
-rjcrafts.com, 1
 rjrplay.com, 1
 rk-links.ml, 1
 rk.mk, 1
@@ -71034,12 +70897,12 @@ rmb.li, 1
 rmc.edu, 1
 rmcbs.de, 1
 rmdb.tk, 1
-rmdscreen.com, 1
 rmeuropean.com, 1
 rmf.io, 1
 rmit.me, 1
 rmm-i.com, 1
 rmmanfredi.com, 1
+rmp-gebaeudedienste.de, 1
 rmrig.org, 1
 rms.sexy, 1
 rmshg.com, 1
@@ -71104,11 +70967,14 @@ robertoullan.tk, 1
 robertreiser.photography, 1
 robertrijnders.nl, 1
 robertsmits.be, 0
+robeschinoises.fr, 1
 robgorman.ie, 1
 robhorstmanshof.nl, 1
+robi-aesch.ch, 1
 robi-net.it, 1
 robicue.com, 1
 robigalia.org, 0
+robin-kusch.de, 1
 robin-novotny.com, 1
 robin.co.kr, 1
 robin.info, 1
@@ -71142,6 +71008,7 @@ robotkvarnen.se, 1
 robototes.com, 1
 robots-ju.ch, 1
 robotsbigdata.com, 1
+robotstxt.com, 1
 robottip.com, 0
 robpol86.com, 1
 robspc.repair, 1
@@ -71198,7 +71065,7 @@ rodab.party, 1
 rodafe.sk, 1
 rodarion.pl, 1
 rodchapman.com, 1
-roddis.net, 0
+roddis.net, 1
 rodehutskors.net, 1
 rodelstein.eu, 1
 rodeobull.biz, 1
@@ -71213,7 +71080,6 @@ rodinka.tk, 1
 rodinnebyvanie.eu, 1
 rodinneodpoledne2018.cz, 1
 roditely.cf, 1
-rodkidesings.com, 1
 rodolfo.gs, 1
 rodolphe-lebrun.fr, 1
 rodomonte.org, 1
@@ -71247,6 +71113,7 @@ rogell.tk, 1
 rogerdat.ovh, 1
 rogerdeflor.tk, 1
 rogerhub.com, 1
+rogeriosantos.pt, 1
 rogerkunz.ch, 1
 rogerriendeau.ca, 1
 rogersaam.ch, 0
@@ -71255,6 +71122,7 @@ rogersremovals.co.uk, 1
 rogersvilleumc.org, 1
 rogiershikes.tk, 1
 rognhaugen.no, 1
+rogo.cz, 1
 rogoff.xyz, 1
 rogue-e.xyz, 1
 roguefortgame.com, 1
@@ -71265,13 +71133,11 @@ roguesignal.net, 1
 roguetechhub.org, 1
 roh.one, 1
 rohanbassett.com, 1
-rohanisuhadi.xyz, 1
 rohansingh.cf, 1
 rohde.de, 1
 rohedaten.de, 1
 rohitagr.com, 1
 rohlik.cz, 1
-roi.ovh, 1
 roiblozyxfswe.ga, 1
 roidsstore.com, 1
 rointe.online, 1
@@ -71297,6 +71163,7 @@ roldeco.nl, 1
 rolecontj.com, 1
 roleplaybdsm.com, 1
 roleplayhome.com, 1
+rolibo.com, 1
 roligh.cf, 1
 roligt.tk, 1
 roliki.ml, 1
@@ -71345,6 +71212,7 @@ romastantra.com, 1
 romatours.pt, 1
 romatrip.it, 1
 rome.dating, 1
+romeing.it, 1
 rommelhuntermusic.tk, 1
 rommelmark.nl, 1
 rommelwood.de, 1
@@ -71452,7 +71320,6 @@ rosabellas.co.uk, 1
 rosabrasiv.ga, 1
 rosahijab.com, 1
 rosakkreditatsiya-forum.ru, 1
-rosalindgreenllc.com, 1
 rosalindturner.co.uk, 1
 rosalopezcortes.tk, 1
 rosamystica.tk, 1
@@ -71554,7 +71421,6 @@ roundtoprealestate.com, 1
 roussos.cc, 1
 roussosmanos.gr, 1
 rout0r.org, 1
-route-wird-berechnet.de, 1
 routerclub.ru, 1
 routeto.com, 1
 routetracker.co, 1
@@ -71645,8 +71511,6 @@ royalpainters.co, 1
 royalpalacenogent.fr, 1
 royalpratapniwas.com, 1
 royalrace.tk, 1
-royalrangers.fi, 1
-royalstylefit.com, 1
 royaltube.net, 1
 royalty-market.com, 1
 royalvortex.co, 1
@@ -71675,13 +71539,13 @@ rpadovani.com, 0
 rpasafrica.com, 1
 rpattisonroofing.co.uk, 1
 rpauto.ru, 1
-rpgcampaign.website, 1
 rpgchan.cf, 1
 rpgmaker.es, 1
 rpguru.com, 1
 rpherbig.com, 1
 rphl.net, 1
 rphyncice.cz, 1
+rpi-pihole-mon.ddns.net, 1
 rpine.net, 1
 rpmdrivingschool.com.au, 1
 rpoplus.nl, 1
@@ -71717,7 +71581,6 @@ rs-maschinenverleih.de, 1
 rs.wiki, 1
 rs200.org, 1
 rs2ap33.com, 1
-rsa-erp.com, 1
 rsa-services.com, 1
 rsanahuano.com, 1
 rsap.ca, 1
@@ -71741,6 +71604,7 @@ rsmmail.com, 1
 rsp-blogs.de, 1
 rsquare.nl, 1
 rsridentassist.com, 1
+rsrnd.org, 1
 rss.sh, 0
 rssfeedblast.com, 1
 rssfeedonline.tk, 1
@@ -71828,7 +71692,6 @@ rubenpeeters.ml, 1
 rubenroy.com, 1
 rubenruiz.org, 1
 rubens.cloud, 1
-rubenschulz.nl, 1
 rubia.ca, 1
 rubiales.tk, 1
 rubidium.ml, 1
@@ -71867,6 +71730,7 @@ rudrastyh.com, 1
 rudy.ga, 1
 rudymendoza.tk, 1
 rue-de-la-vieille.fr, 1
+rueckgr.at, 1
 rueder.com, 1
 ruediger-voigt.eu, 1
 ruedigervoigt.de, 1
@@ -71883,6 +71747,7 @@ ruffbeatz.com, 1
 ruffinstorage.com, 1
 ruffnecks.tk, 1
 ruflay.ru, 1
+rugbugecoflooring.com, 1
 rugby.tk, 1
 rugby.video, 1
 rugcleaninglondon.co.uk, 1
@@ -71898,8 +71763,10 @@ ruhproject.kz, 1
 ruhrmobil-e.de, 1
 ruhrnalist.de, 1
 ruicore.cn, 1
+ruifu.tech, 1
 ruika.ru, 1
 ruimarques.xyz, 1
+ruiming.me, 0
 ruimoreira.co.uk, 1
 ruin.one, 1
 ruinme.tk, 1
@@ -71938,6 +71805,8 @@ runbo-nz.ga, 1
 runboaustralia.ga, 1
 runcarina.com, 1
 rundesign.it, 1
+rundh-audio.de, 1
+rundh.de, 1
 rundumcolumn.xyz, 1
 runebet.com, 1
 runefake.com, 1
@@ -71960,6 +71829,7 @@ runners.yoga, 1
 running.org, 1
 runningfast.cf, 1
 runningrabb.it, 1
+runningshoeshq.com, 1
 runreport.fr, 1
 runrocknroll.com, 1
 runschrauger.com, 1
@@ -72023,6 +71893,7 @@ russian-knights.ru, 1
 russian-page.tk, 1
 russianbearsmotorsport.tk, 1
 russianbristol.tk, 1
+russianescortsmumbai.com, 0
 russianews.cf, 1
 russianpunkrock.tk, 1
 russianrandom.ru, 1
@@ -72055,6 +71926,7 @@ rutiger.com, 1
 rutika.ru, 1
 rutracker.appspot.com, 1
 rutten.me, 0
+ruttenadvocaat.be, 1
 ruudkoot.nl, 1
 ruurdboomsma.nl, 1
 ruwhof.net, 1
@@ -72114,7 +71986,6 @@ rybox.info, 1
 rychlikoderi.cz, 0
 ryejuice.sytes.net, 1
 ryland.consulting, 1
-rylandgoldman.com, 1
 rylore.com, 1
 rymanow.tk, 1
 rymergames.tk, 1
@@ -72136,6 +72007,7 @@ s-a.xyz, 1
 s-c.se, 1
 s-cubed.net, 1
 s-culture.co.kr, 1
+s-geiser.de, 1
 s-gong.com, 1
 s-huset.dk, 1
 s-ip-media.de, 1
@@ -72162,7 +72034,6 @@ s30365.com, 1
 s36533.com, 1
 s36594.com, 1
 s3cur3.it, 1
-s3dservices.io, 1
 s3gfault.com, 1
 s3n.se, 1
 s3robertomarini.it, 1
@@ -72188,6 +72059,7 @@ s5g8.com, 1
 s64.cz, 1
 s6729.co, 1
 s6957.co, 1
+s6academy.com, 1
 s6jl.com, 1
 s6o.de, 1
 s81365.com, 1
@@ -72202,6 +72074,7 @@ s9297.co, 1
 s95.de, 1
 s9728.co, 1
 sa-blog.net, 1
+sa-hc.com, 1
 sa-mp.me, 1
 sa-mp.ro, 1
 sa.net, 1
@@ -72231,9 +72104,6 @@ sabineforschbach.de, 1
 sabkappers.nl, 1
 sable.gq, 1
 saborcaribe.tk, 1
-sabrinajoias.com.br, 1
-sabrinajoiasprontaentrega.com.br, 1
-sabrinajoiasvarejo.com.br, 1
 sabrine.tk, 1
 sabworldtricks.tk, 1
 sac.moe, 1
@@ -72249,7 +72119,7 @@ sacians.tk, 1
 sacibo.ga, 1
 sackmesser.ch, 1
 saclier.at, 1
-saco-ceso.com, 1
+sacodecuentos.com, 1
 sacprincesse.com, 1
 sacramentocounty.gov, 1
 sacramentum.tk, 1
@@ -72257,7 +72127,6 @@ sacred-knights.net, 1
 sacredheart-cliftonheights.net, 1
 sacrome.com, 1
 sacrosanctus.tk, 1
-sad-berezka.ru, 1
 sadbox.es, 1
 sadbox.org, 1
 sadbox.xyz, 1
@@ -72400,7 +72269,6 @@ saint-petersburg.ml, 1
 saintaardvarkthecarpeted.com, 1
 saintanne.net, 1
 saintanthonylakin.org, 1
-saintanthonyscorner.com, 1
 saintaugustineschool.tk, 1
 saintereso.tk, 1
 sainteugenechurch.net, 1
@@ -72460,7 +72328,6 @@ saksonski-szlak-parowozow.pl, 1
 sakura-paris.org, 1
 sakura.zone, 1
 sakuracdn.com, 1
-sakuracommunity.com, 1
 sakuradata.com, 1
 sakurapalace.tk, 1
 sakuraplay.com, 1
@@ -72537,6 +72404,7 @@ saltstack.cz, 1
 saltsugarlove.de, 1
 saltydogpaddle.org, 1
 saltyfish.tech, 1
+salud-paratodos.com, 1
 salud.top, 0
 saluddecalidad.com, 1
 saludmas.site, 1
@@ -72544,9 +72412,9 @@ saludnutrivida.com, 1
 saluels.servemp3.com, 1
 salukinet.tk, 1
 salut-butovo.cf, 1
+salutenaturale.com.br, 1
 salutethefish.com, 1
 salutethegrains.com, 1
-salutethepig.com, 1
 salva.re, 1
 salvaalocombia.com, 1
 salvadoralevin.tk, 1
@@ -72571,6 +72439,7 @@ samappleton.com, 1
 samar-leyte.tk, 1
 samara-avia.ru, 1
 samara-hosting.tk, 1
+samaresane.com, 1
 samaritainsmeyrin.ch, 0
 samaritan.tech, 1
 samatva-yogalaya.com, 1
@@ -72612,7 +72481,6 @@ sammamish--locksmith.com, 1
 sammyjohnson.com, 1
 sammyservers.com, 1
 sammyservers.net, 1
-samodding.com, 1
 samodel.tk, 1
 samogonka.tk, 1
 samokhin.cf, 1
@@ -72635,6 +72503,7 @@ samui-samui.de, 0
 samuidiving.net, 1
 samuirehabcenter.com, 1
 samuraicafeauc.com, 1
+samuraiskye.com, 1
 samusil.org, 1
 samvanderkris.com, 1
 samvanderkris.xyz, 1
@@ -72659,6 +72528,7 @@ sanatori-elochka.tk, 1
 sanatori-teterev.tk, 1
 sanatorii-sverdlovskoy-oblasti.ru, 1
 sanatorionosti.com.ar, 1
+sanatstore.ir, 1
 sanbornteam.com, 1
 sancaktepehaber.tk, 1
 sanchez.adv.br, 0
@@ -72689,7 +72559,6 @@ sandervankasteel.nl, 0
 sandgatebaysidedental.com.au, 1
 sandhaufen.tk, 1
 sandiegoluxuryhomes.org, 1
-sandiegoopticas.com, 1
 sandiegotown.com, 1
 sandiuno.ml, 1
 sandmanintel.com, 1
@@ -72821,7 +72690,7 @@ sarah-brown.tk, 1
 sarah-harding.tk, 1
 sarah-jane.nl, 1
 sarahbeckettharpist.com, 1
-sarahjanecreates.co.uk, 1
+sarahjaneethan.co.uk, 1
 sarahlicity.co.uk, 1
 sarahlicity.me.uk, 1
 sarahplusdrei.de, 1
@@ -72835,7 +72704,6 @@ saraleebread.com, 0
 sarariman.com, 1
 sarasotadentistry.com, 1
 sarasotaroboticurology.com, 1
-sarasturdivant.com, 1
 saratov24.tk, 1
 saratovlive.tk, 1
 saratovnews.ml, 1
@@ -72855,7 +72723,6 @@ sarindia.com, 1
 sarink.eu, 1
 sarjakuvakauppa.fi, 1
 sarkisianbuilders.com, 1
-sarkoziadam.hu, 1
 sarmpel.tk, 1
 sarndipity.com, 1
 sarny.at, 1
@@ -72863,11 +72730,13 @@ saro.me, 1
 sarogiw.tk, 1
 saronikos.guide, 1
 saropa.com, 1
+sarouel.fr, 1
 sarpsb.org, 1
 sartoria.roma.it, 1
 sarumtechnologies.com, 1
 sas-snowboarding.sk, 1
 sasakala.tk, 1
+sascha-brockel.de, 1
 sascha.io, 1
 sascha.is, 1
 saschaeggenberger.ch, 1
@@ -72881,7 +72750,6 @@ sashka.com.ua, 1
 sashleighaust.com, 1
 sasioglu.co.uk, 1
 saskadoodle.com, 1
-sasquatt.com.br, 1
 sasrobotics.xyz, 1
 sasroli.tk, 1
 sassandbelle.co.uk, 1
@@ -72905,7 +72773,6 @@ satinn.pl, 1
 satisfaction.su, 1
 satisperfectacollections.com, 1
 sativatunja.com, 1
-satmali.az, 1
 satmd.de, 1
 satoshilabs.com, 1
 satoshinumbers.com, 1
@@ -72926,6 +72793,7 @@ saudeealimentos.com, 1
 saudeintimadamulher.com.br, 1
 saudenoclique.com.br, 1
 sauenytt.no, 1
+sauer-systems.net, 1
 sauerbrey.eu, 1
 sauerland-rundflug.de, 1
 sauerland-schnittgruen.de, 1
@@ -72955,6 +72823,7 @@ savbus.com, 1
 savbus.net, 1
 savbus.ws, 1
 save-me-aachen.de, 1
+save-me-koeln.de, 1
 savebees.org, 1
 savebt.net, 1
 savecrypto.org, 1
@@ -72979,6 +72848,7 @@ savoir.fr, 1
 savorvip.ir, 1
 sawiday.at, 1
 sawiday.be, 1
+sawiday.com, 1
 sawiday.cz, 1
 sawiday.de, 1
 sawiday.es, 1
@@ -73031,6 +72901,7 @@ sbir.gov, 1
 sbirecruitment.co.in, 1
 sbit.com.br, 1
 sbivc.jp, 1
+sbl250.com, 1
 sbm.cloud, 1
 sbmsitelist.tk, 1
 sbo-dresden.de, 1
@@ -73067,6 +72938,7 @@ scallywagsbouncycastles.co.uk, 1
 scallywagskids.co.uk, 1
 scalpel.com, 1
 scamblockplus.org, 1
+scambusters.club, 1
 scan.co.uk, 1
 scanamed.tk, 1
 scanbetting.ga, 1
@@ -73081,6 +72953,7 @@ scanmailx.com, 1
 scanpay.dk, 1
 scapdoors.ca, 1
 scarabcoder.com, 1
+scaracloud.ddns.net, 1
 scarafaggio.it, 1
 scarinex.tk, 1
 scatsbouncingcastles.ie, 1
@@ -73180,10 +73053,11 @@ schmidtplasticsurgery.com, 1
 schmiggywibblits.net, 1
 schmitt-etienne.fr, 1
 schmitt-max.com, 1
-schmitt.ws, 1
+schmitt.ws, 0
 schmitz.link, 1
 schmuggelware.de, 0
 schnapke.name, 1
+schnaube.de, 1
 schneckenhilfe.de, 0
 schnegg.name, 0
 schneidr.de, 1
@@ -73237,6 +73111,7 @@ school16-tob.tk, 1
 school173.tk, 1
 school43.tk, 1
 schoolantwoorden.tk, 1
+schoolbuddy.ch, 1
 schoolcafe.com, 1
 schooli.io, 1
 schoolofphilosophy.org.au, 1
@@ -73303,6 +73178,7 @@ schutzwerk.com, 1
 schwabenhaus-ka.de, 1
 schwalliers.com, 1
 schwanke.in, 0
+schwano-dent.at, 1
 schwarz-gelbe-fuechse.de, 1
 schwarzegar.de, 1
 schwarzenberg.tk, 1
@@ -73340,7 +73216,6 @@ scienceweb.tk, 1
 sciencex.com, 1
 scientia.ga, 1
 scientific-socialism.cf, 1
-scientific.boston, 1
 scigov.xyz, 1
 sciguyryan.com, 1
 scijinks.gov, 1
@@ -73394,13 +73269,12 @@ scouting-kontiki.nl, 1
 scouting-wageningen.nl, 1
 scoutingkontiki.nl, 1
 scoutingridderkerk.nl, 1
-scoutingtheworld.co.uk, 1
 scoutingtungelroy.nl, 1
 scoutnet.de, 1
 scoutreinosa.tk, 1
 scoutsanbartolome.tk, 1
 scoutsanpieropatti.tk, 1
-scoutsberg.be, 1
+scoutsberg.be, 0
 scouttrails.com, 1
 scp-079.org, 1
 scp-trens.notaires.fr, 1
@@ -73484,6 +73358,7 @@ scurtam.tk, 1
 scuters.club, 1
 scvoet.me, 1
 scw.nz, 1
+scwildflours.com, 1
 scwilliams.co.uk, 1
 scwilliams.uk, 1
 sd.af, 1
@@ -73595,6 +73470,7 @@ sebarin.tk, 1
 sebastiaandouma.co.uk, 1
 sebastiaandouma.com, 1
 sebastiaanwijnimport.nl, 1
+sebastian-bravo.com, 1
 sebastian-janich.de, 1
 sebastian-kraus.me, 1
 sebastian-kuhnert.de, 1
@@ -73668,6 +73544,7 @@ secretosbolivia.tk, 1
 secretpanties.com, 1
 secretpigeon.com, 1
 secretsanta.fr, 0
+secretsauceangel.com, 1
 secretsdujeu.com, 1
 secretserveronline.com, 1
 secretstomartialarts.tk, 1
@@ -73676,6 +73553,7 @@ secretworld.ml, 1
 secrium.io, 1
 secs.london, 1
 secta.cf, 1
+secteer.com, 1
 sectelligence.nl, 1
 sectember.com, 1
 sectember.events, 1
@@ -73715,7 +73593,6 @@ securegovernment.us, 1
 secureheaders.com, 1
 securehugs.com, 1
 secureim.de, 1
-secureindia.co, 1
 securejabber.me, 1
 securelect-inspection.com, 1
 securelogin.nu, 1
@@ -73817,6 +73694,7 @@ seekfirstthekingdom.ca, 1
 seeks.ru, 1
 seeksupply.ga, 1
 seekthe.net, 1
+seeme.ai, 1
 seemeagain.com, 1
 seemomclick.com, 1
 seemyreality.tk, 1
@@ -73853,7 +73731,6 @@ seguridadsistem.tech, 1
 seguridadsistemtienda.tech, 1
 seguridadysaludeneltrabajo.com.co, 1
 seguros-de-salud-y-vida.com, 1
-segurosbalboa.com.ec, 0
 segurosmaurobracchieri.com, 1
 segurosocial.gov, 0
 seguroviagem.srv.br, 0
@@ -73961,7 +73838,6 @@ semantica.cz, 0
 semao.org, 1
 semaphore-studios.com, 1
 sembosihosting.tk, 1
-sembrando-amor.com, 1
 sembyotic.com, 1
 semen3325.xyz, 0
 semenov.ml, 1
@@ -74002,7 +73878,6 @@ sendc.at, 1
 sendcat.com, 1
 sender.services, 1
 senderismoinfantil.tk, 1
-sendfile.online, 1
 sendingbee.com, 1
 sendmeback.de, 0
 sendonce.io, 1
@@ -74051,7 +73926,6 @@ sentandsecure.com, 1
 sentencing.net, 1
 sentenza.tk, 1
 senterada.tk, 1
-sentic.info, 1
 sentidosdelatierra.org, 1
 sentiments.io, 1
 sentinel.gov, 1
@@ -74106,16 +73980,19 @@ seolib.org, 1
 seoline.cf, 1
 seolister.cf, 1
 seolisting.cf, 1
+seolotsen.de, 1
 seomag.tk, 1
 seomarketing.bg, 1
 seomaton.com, 1
 seomaton.org, 1
 seomen.biz, 1
 seon.me, 1
+seondigo.com, 1
 seonoco.com, 1
 seoonline.cf, 1
 seoonlinejaipur.tk, 1
 seopiar.tk, 1
+seoprnews.cf, 1
 seopromotion.tk, 1
 seoquake.com, 1
 seoranker.tk, 1
@@ -74134,6 +74011,7 @@ seostrit.cf, 1
 seoteam.tk, 1
 seotoolset.tk, 1
 seoul.dating, 1
+seounlock.com, 1
 seovision.se, 1
 seovisits.tk, 1
 seoviziti50.tk, 1
@@ -74210,11 +74088,11 @@ seroquelonline.tk, 1
 serpenteq.com, 1
 serphost.ml, 1
 serpic.photo, 1
+serptoolsuite.com, 1
 serrande.roma.it, 1
 serrano-chris.ch, 0
 serrature.roma.it, 1
 serruriersarcelles.org, 1
-sertaobom.eco.br, 1
 seru.eu, 1
 servcom.net.au, 1
 serve-a.com.au, 1
@@ -74249,6 +74127,7 @@ serveroffline.net, 0
 serverpedia.de, 1
 serversfrom.space, 1
 serversftw.com, 1
+serverstatus.tk, 1
 serverstuff.info, 1
 serversuit.com, 1
 servertastic.com, 1
@@ -74302,7 +74181,9 @@ servtraqazure.com, 1
 servx.org, 1
 serw.org, 1
 serwetki-papierowe.pl, 1
+serwis-telewizorow.pl, 1
 serwis-wroclaw.pl, 1
+serwistomy.pl, 1
 seryovpn.com, 1
 seryox.com, 1
 ses.hu, 1
@@ -74350,6 +74231,7 @@ seva.fashion, 1
 sevastopol.tk, 1
 sevathian.com, 1
 seven-purple.com, 1
+sevenartzpublicidad.com, 1
 sevenhillsapartments.com.au, 1
 sevenicealimentos.com.br, 1
 sevenmatches.com, 1
@@ -74365,7 +74247,7 @@ sevsey.ru, 1
 sevwebdesign.com, 1
 sewa.nu, 1
 sewafineseam.com, 1
-sewamobilperdana.com, 1
+sewamobilperdana.com, 0
 sewatec.com, 1
 sewavillamurah.tk, 1
 sewfarsewgood.co.uk, 1
@@ -74377,7 +74259,6 @@ sewoo.co.uk, 1
 seworld.ml, 1
 sex-education.com, 1
 sex-sex-cam.com, 1
-sex5.com, 1
 sexaki.com, 1
 sexar.info, 1
 sexara.co, 1
@@ -74399,14 +74280,15 @@ sexshopnet.com.br, 1
 sextacy.tk, 1
 sextop.net, 1
 sextop1.me, 1
-sextop1.pro, 1
 sexvideos.tel, 1
 sexvirtualspace.com, 1
 sexwork.net, 1
 sexy-store.nl, 1
 sexyblonds.net, 1
+sexychatakides.com, 1
 sexyfish.com, 1
 sexyfotosvandep.nl, 1
+sexymassageoil.com, 1
 sexytagram.com, 1
 seyfarth.de, 1
 seyhanlar.com, 1
@@ -74426,6 +74308,7 @@ sfg-net.net, 1
 sfg-net.org, 1
 sfg-nordholz.de, 1
 sfi.sh, 0
+sfiane.com, 1
 sfil.fr, 1
 sfile.eu, 1
 sfirat-haomer.com, 1
@@ -74510,7 +74393,6 @@ shadowsocks.se, 1
 shadowsocks.software, 1
 shadowsocks.to, 1
 shadowvolt.net, 1
-shadsupershop.com, 1
 shadwe.com, 1
 shadynook.net, 1
 shadypark.tk, 1
@@ -74546,7 +74428,7 @@ shalott.org, 1
 shalyapin.by, 1
 sham-group.fr, 1
 shamans.ga, 1
-shamara.info, 1
+shamara.info, 0
 shamariki.ru, 0
 shambala.cf, 1
 shambhu.info, 1
@@ -74566,6 +74448,7 @@ shanhay.tk, 1
 shanju.tk, 1
 shankangke.com, 1
 shannapeeples.com, 1
+shanoviyam.com, 1
 shanoviyam.in, 1
 shansen-online.de, 1
 shanshushu.com, 1
@@ -74581,6 +74464,7 @@ shapin.tv, 1
 sharanyamunsi.net, 1
 shard.vc, 1
 share-io.com, 1
+share.gy, 1
 sharealo.org, 1
 shareasale-analytics.com, 1
 sharebot.ga, 1
@@ -74620,6 +74504,7 @@ sharisharpe.com, 1
 shark-host.tk, 1
 shark.cat, 1
 shark5060.net, 1
+sharkeyscuba.com, 1
 sharking.gq, 1
 sharmafamily.tk, 1
 sharpe-practice.co.uk, 1
@@ -74639,6 +74524,8 @@ shavegazette.com, 1
 shavingks.com, 1
 shavit.space, 1
 shawcentral.ca, 0
+shawclan.id.au, 1
+shawfamily.id.au, 1
 shawiah.tk, 1
 shawnalucey.com, 1
 shawngvs.com, 1
@@ -74798,6 +74685,7 @@ shipmonk.com, 1
 shippercenter.info, 1
 shipping-trade.ga, 1
 shipping24h.com, 0
+shippingbo.com, 1
 shippinglabel.de, 1
 shiqi.ca, 1
 shiqi.lol, 1
@@ -74815,6 +74703,7 @@ shiresvets.com, 1
 shirevirtual.tk, 1
 shirhashirim.org.il, 1
 shiriforum.tk, 1
+shirlygilad.com, 1
 shiroanime.es, 1
 shiroki-k.net, 1
 shiropaev.tk, 1
@@ -74825,7 +74714,6 @@ shishamania.de, 1
 shishkabobnc.com, 1
 shishkin.us, 1
 shishlik.net, 1
-shit.software, 1
 shitagi-shop.com, 1
 shitbeast.institute, 1
 shitcountries.org, 1
@@ -74952,7 +74840,6 @@ shortcutable.com, 1
 shortdiary.me, 1
 shorten.ninja, 1
 shortr.li, 1
-shortwave.fun, 1
 shoshin-aikido.de, 1
 shoshin.technology, 1
 shossain.tk, 1
@@ -75056,7 +74943,6 @@ siamericas.com, 1
 siamojo.com, 1
 siamrehab.com, 1
 siamsnus.com, 1
-sianbryn.co.uk, 1
 sianjhon.com, 1
 siava.ru, 1
 sibekoaircons.co.za, 1
@@ -75075,7 +74961,6 @@ siccardisport.it, 1
 sice-si.org, 1
 sich-fight.club, 1
 siciliadisinfestazioni.it, 1
-siciliamconsulting.com, 1
 sicilianbalm.com, 1
 siciliapulizie.it, 1
 sicken.eu, 1
@@ -75111,6 +74996,7 @@ siebeve.be, 1
 siecledigital.fr, 1
 siegemund-frankfurt.de, 1
 siegprod.tk, 1
+sieh.es, 1
 sieiro.tk, 1
 siel.nl, 1
 sielsystems.nl, 1
@@ -75140,8 +75026,17 @@ sigint.pw, 1
 sigismonda.ch, 0
 sigma-signalisation.com, 1
 sigma957.net, 1
+sigmalux.ca, 1
+sigmalux.co.nz, 1
+sigmalux.co.uk, 1
+sigmalux.com.au, 1
+sigmalux.es, 1
+sigmalux.fr, 1
 sigmalux.ltd, 1
+sigmalux.lu, 1
+sigmalux.nz, 1
 sigmalux.sarl, 1
+sigmalux.uk, 1
 sigmapramuka.com, 1
 sigmasensors.com.br, 1
 sigmateca.tk, 1
@@ -75197,6 +75092,7 @@ silashes.ru, 1
 silaslova-ekb.ru, 1
 sildenafilcitrate.cf, 1
 sildenafilcitrate100mg.ga, 1
+silensky.com, 1
 silent-clean.de, 1
 silent-yachts.com, 1
 silentexplosion.de, 1
@@ -75214,7 +75110,6 @@ silicon-vision.com, 1
 silina.tk, 1
 silkebaekken.no, 1
 silken-madame.tk, 1
-silkon.net, 1
 silkproducts.tk, 1
 sillisalaatti.fi, 1
 sillysnapz.co.uk, 1
@@ -75360,6 +75255,7 @@ simmonshome.cloud, 1
 simmtronic.com, 1
 simnovo.net, 1
 simoesgoulart.com.br, 1
+simokala.ir, 0
 simon-agozzino.fr, 1
 simon-hofmann.org, 1
 simon-mueller.de, 1
@@ -75382,7 +75278,6 @@ simonmanuel.com, 1
 simonreich.de, 1
 simonreynoldsfavesunfaves.cf, 1
 simonschmitt.ch, 1
-simonsmh.cc, 1
 simonspeich.ch, 1
 simonsreich.de, 1
 simonssh.ddns.net, 1
@@ -75454,16 +75349,15 @@ simplyfixit.co.uk, 1
 simplyheadwear.com.au, 1
 simplyhelen.de, 1
 simplyml.com, 1
-simplymozzo.se, 1
 simplyowners.net, 1
 simplypromo.com.au, 1
 simplyregister.net, 1
 simplysmartgardening.com, 1
 simplytiles.com, 1
 simplyuniforms.com.au, 1
-simpte.com, 1
 simrail.nl, 1
 sims4hub.ga, 1
+simsalafresh.de, 1
 simsimi.ml, 1
 simsnieuws.nl, 1
 simstarstyle.tk, 1
@@ -75543,7 +75437,6 @@ sintas.lt, 1
 sintaxis.org, 1
 sinterama.biz, 1
 sinuate.gq, 1
-sinuelovirtual.com.br, 1
 sinusbot.online, 1
 sinusinfectionhelp.org, 1
 sinusitis-bronchitis.ch, 1
@@ -75669,6 +75562,7 @@ siusto.com, 1
 sivale.mx, 1
 sivaru.tk, 1
 sivers.org, 1
+sivizius.eu, 1
 sivyerge.com, 1
 siw64.com, 1
 siwek.xyz, 1
@@ -75800,7 +75694,6 @@ sklepwielobranzowymd.com, 1
 sklisen.tk, 1
 sklotechnik.cz, 1
 skmedia.ga, 1
-sknasirali.com, 1
 sknclinics.co.uk, 1
 skoda-im-dialog.de, 1
 skol.bzh, 1
@@ -75821,7 +75714,6 @@ skoroff.com, 1
 skoropolnolunie.gq, 1
 skorovsud.ru, 1
 skorpil.cz, 1
-skortekaas.nl, 0
 skory.us, 1
 skotobaza.tk, 1
 skotty.io, 1
@@ -75875,6 +75767,7 @@ skyfone.cz, 1
 skyfpicture.tk, 1
 skyger.cz, 1
 skyhigh-mizell.tk, 1
+skyhighescaperoom.nl, 1
 skyhooks.tk, 1
 skyla.tk, 1
 skylander.cf, 1
@@ -75965,6 +75858,7 @@ sldev.ovh, 1
 sldlcdn.com, 1
 sleeker.es, 1
 sleeklounge.com, 0
+sleep-go.info, 1
 sleep-tight.cf, 1
 sleepawaycampseries.tk, 1
 sleepet.tw, 1
@@ -76027,6 +75921,7 @@ slotfara.com, 1
 slotfara.net, 1
 slothless.com, 1
 sloths.org, 1
+slothy.cloud, 1
 slotlist.info, 1
 slotmad.com, 1
 slouching.ga, 1
@@ -76158,7 +76053,6 @@ smartlogtower.com, 1
 smartlybuy.com, 1
 smartmachine.com, 1
 smartmail24.de, 1
-smartmeal.ru, 1
 smartmessages.net, 1
 smartminibushire.co.uk, 0
 smartmomsmartideas.com, 1
@@ -76193,7 +76087,6 @@ smartvideo.io, 1
 smartviewing.com, 1
 smartwank.com, 1
 smartweb.ge, 1
-smartwelve.com, 1
 smartwoodczech.cz, 1
 smartwritingservice.com, 1
 smartwurk.nl, 0
@@ -76305,12 +76198,12 @@ smspujcka24.eu, 1
 smszone.tk, 1
 smtenants.cn, 1
 smtouseef.com, 1
-smtp.in.th, 1
 smtparish.org, 1
 smtpdev.com, 1
 smuhelper.cn, 1
 smuncensored.com, 1
 smuns.ch, 1
+smurffi.net, 1
 smutek.net, 1
 smvcm.com, 1
 smx.net.br, 1
@@ -76325,6 +76218,7 @@ snabbit-support.nu, 1
 snabbit-support.se, 1
 snabblim.tk, 1
 snackbesteld.nl, 1
+snafarms.com, 1
 snafu.cz, 1
 snakafya.com, 1
 snakeanarchy.tk, 1
@@ -76343,6 +76237,7 @@ snargol.com, 1
 snatch-note.tk, 1
 snatch.com.ua, 1
 snatti.com, 1
+snazel.co.uk, 1
 snazzie.nl, 1
 sncdn.com, 1
 sndbouncycastles.co.uk, 1
@@ -76426,12 +76321,10 @@ snowpaws.de, 1
 snowplane.net, 1
 snowraven.de, 1
 snowreport.io, 1
-snowrippers.ro, 0
 snowsubs.moe, 1
 snowvictoria.ga, 1
 snowy.ink, 1
 snowy.land, 1
-snowyluma.com, 1
 snowyluma.me, 1
 snp-media.de, 1
 snperformance.gr, 1
@@ -76485,7 +76378,6 @@ socialblaze.com.au, 1
 socialclimb.com, 1
 socialdevelop.biz, 0
 socialhams.net, 1
-socialief.com, 1
 socialistyouth.tk, 1
 socializam.com, 1
 socializator.tk, 1
@@ -76559,14 +76451,13 @@ sofpedia.ro, 0
 soft-key.tk, 1
 soft-office.tk, 1
 soft41.ru, 1
-soft64.me, 1
 softandbouncy.co.uk, 1
 softanka.com, 1
 softbit.pt, 1
 softblinds.co.uk, 1
 softchin.ir, 1
 softcreatr.com, 1
-softcreatr.de, 0
+softcreatr.de, 1
 softfay.com, 1
 softlan.com.py, 1
 softly.sk, 1
@@ -76598,12 +76489,12 @@ softwerk-edv.de, 1
 softwing.de, 1
 softwsabri.be, 1
 sogola.com, 1
-sogravatas.com.br, 1
 sogravatas.net.br, 1
 sogutma.com.tr, 1
 sohamroy.me, 1
 sohanakhan.tk, 1
 soia.ca, 1
+soilegustafsson.fi, 1
 sointelcom.com.co, 1
 soinvett.com, 1
 sojournsaffairs.com, 1
@@ -76622,7 +76513,6 @@ sol24.net, 1
 solacyre.ch, 0
 solana-active.tk, 1
 solanum-games.com, 1
-solar-aydinlatma.com, 1
 solar-ec.com, 1
 solar-floodlight.ca, 1
 solar-systems.ca, 1
@@ -76702,8 +76592,10 @@ solomo.pt, 1
 solomonsklash.io, 1
 solonotizie24.it, 1
 soloparati.cf, 1
+soloroboto.com, 1
 solos.im, 1
 solovey.su, 1
+solovyovalawfirm.com, 1
 solsi.ga, 1
 solsocog.de, 1
 solucionesihd.com, 1
@@ -76731,7 +76623,6 @@ somali-derp.com, 1
 somaliagenda.com, 1
 somaliaonline.com, 1
 somalilandtalk.tk, 1
-somanao.com, 1
 sombemerchant.com, 1
 somecrazy.com, 1
 somefe.pt, 1
@@ -76777,6 +76668,7 @@ sonesisonesi.tk, 1
 sonesonesisi.tk, 1
 songdew.com, 1
 songesdeplumes.fr, 1
+songlifty.com, 1
 songsmp3.co, 1
 songsmp3.com, 1
 songsmp3.cool, 1
@@ -76826,6 +76718,7 @@ soohealthy.nl, 1
 soolid.tech, 1
 soomee.be, 1
 soomee1.be, 1
+soon.lk, 0
 soontm.de, 1
 soontm.net, 1
 soopure.nl, 1
@@ -76836,19 +76729,17 @@ soph.jp, 1
 soph.tk, 1
 soph.us, 1
 sopheos.com, 0
+sophi.online, 1
 sophiaandmatt.co.uk, 1
 sophiahatstudio.com, 1
 sophiakligys.com, 1
 sophiebbeauty.co.uk, 1
 sopo.me, 1
 sopra.tk, 1
-soprabalao.com.br, 1
 soquee.net, 1
-sor.so, 1
 soraharu.com, 1
 soraiaschneider.com.br, 1
 sorakumo.jp, 1
-sorblack.com, 1
 sorcix.com, 1
 sorellecollection.com.au, 1
 soren.xyz, 1
@@ -76904,10 +76795,10 @@ soufastnet.com.br, 1
 sougou.com, 1
 souked.com, 1
 souki.cz, 1
+soukka-seura.fi, 1
 soukodou.jp, 1
 soul-source.co.uk, 1
 soulc.ml, 1
-soulcasa.com.br, 1
 soulcrazy.org, 1
 soulema.com, 1
 souletter.com, 1
@@ -76967,6 +76858,7 @@ sourceway.de, 1
 sourcitec.com, 0
 sourdough.vc, 1
 souris.ch, 0
+sourmatt.xyz, 1
 sous-surveillance.net, 0
 souspind.com.br, 1
 southafrican.dating, 1
@@ -77007,7 +76899,7 @@ sovendus.com, 1
 sovendus.de, 1
 sovereignartfoundation.com, 1
 sovereignpcs.com, 1
-soverin.net, 0
+soverin.net, 1
 sovhoz.tk, 1
 sovmestimost-goroskop.cf, 1
 sovmestimost-goroskop.ga, 1
@@ -77028,6 +76920,7 @@ soyuznik.ml, 1
 soyvigilante.com, 1
 sozai-good.com, 1
 sozdanie-krana.ml, 1
+sozialabstand.de, 1
 soziale.email, 1
 sozialstation-ritterhude.de, 1
 sozialy.com, 1
@@ -77122,8 +77015,10 @@ sparkwood.org, 1
 sparkz.no, 1
 sparmedo.de, 1
 sparprofi.at, 1
+sparqmedia.nl, 1
 sparta-en.org, 1
 sparta-szczekociny.tk, 1
+spartac.be, 1
 spartacuslife.com, 1
 spartaermelo.nl, 1
 spartamet.tk, 1
@@ -77136,16 +77031,14 @@ spasicilia.it, 1
 spatzenwerkstatt.de, 1
 spawn.cz, 1
 spaysy.com, 1
-spaziobenedetti.com.br, 1
-spaziopervoi.com.br, 1
 spazturtle.co.uk, 1
 spazzacamino.roma.it, 1
 spbet99.com, 1
 spd-porta-westfalica.eu, 1
-spdepartamentos.com.br, 1
 spdf.net, 1
 spdillini.com, 1
 spe.org.co, 1
+speac.jp, 1
 speak-polish.com, 1
 speaker-animateur.com, 1
 speakersbusiness.com, 1
@@ -77203,11 +77096,11 @@ spegeltankar.tk, 1
 speich.net, 1
 speights-law.com, 1
 spek.tech, 1
-speletrodomesticos.com.br, 1
 spellcheck24.net, 1
 spellchecker.net, 1
 spellic.com, 1
 speme-design.com, 1
+spendleex.com, 1
 spendwise.com.au, 1
 spenglerei-shop.de, 1
 spenny.tf, 1
@@ -77266,7 +77159,7 @@ spinalien.net, 0
 spindle.com.ph, 1
 spingenie.com, 1
 spinner.dnshome.de, 1
-spinor.im, 1
+spinpay.com.br, 1
 spins.fedoraproject.org, 1
 spira.kiev.ua, 1
 spirella-shop.ch, 1
@@ -77361,7 +77254,6 @@ sports-online.cf, 1
 sports-sites.ml, 1
 sports-wear.tk, 1
 sports.dating, 1
-sportsdrobe.com, 1
 sportsjaw.com, 1
 sportsmanadvisor.com, 0
 sportsmansblog.com, 1
@@ -77376,7 +77268,6 @@ sportugalia.ru, 1
 sportvereine.online, 1
 sportverzorging.tk, 1
 sportvoedingspecialist.nl, 1
-sportwette.eu, 0
 sportwetten-anbieter.de, 1
 sportxt.ru, 1
 spot-cleaner.tk, 1
@@ -77442,7 +77333,6 @@ spteam.net, 1
 sptk.org, 1
 spuffin.com, 1
 spufpowered.com, 1
-spur.com.br, 1
 spurghi.roma.it, 1
 sputnik1net.org, 1
 spyclub.tk, 1
@@ -77565,9 +77455,11 @@ srizer.com, 0
 srkarra.com, 1
 srkb.net, 1
 sro.center, 1
+sro.fi, 1
 srochno-pohudeti.tk, 1
 srochnozaim.gq, 1
 srochnyj-zajm.ga, 1
+sros.fi, 1
 sroturkey.tk, 1
 srpx.de, 1
 srqpedals.com, 1
@@ -77604,7 +77496,7 @@ ss9721.com, 0
 ss9728.co, 1
 ssa.gov, 0
 ssbgportal.net, 1
-ssbkk.ru, 1
+ssbkk.ru, 0
 ssbrm.ch, 1
 ssc.vg, 1
 ssc8689.com, 1
@@ -77618,13 +77510,14 @@ ssenberg.nl, 1
 ssfbank.no, 1
 ssh-vault.com, 1
 sshbox.tk, 1
+sshcrack.com, 1
 sshd.site, 1
 sshool.at, 1
 sshx.top, 1
+ssk.ovh, 1
 ssky.cn, 1
 ssl-zertifikate.de, 1
 ssl.do, 1
-ssl.doctor, 1
 ssl.google-analytics.com, 1
 ssl.md, 1
 ssl24.pl, 1
@@ -77640,6 +77533,7 @@ sslcheck.nl, 1
 ssldecoder.org, 1
 ssldev.net, 1
 sslmate.com, 1
+sslmonkey.net, 1
 sslok.com, 0
 sslping.com, 1
 sslpoint.com, 1
@@ -77647,7 +77541,6 @@ ssls.cz, 1
 sslsurvey.de, 1
 ssmato.me, 1
 ssmca.com, 1
-ssmic.com, 1
 ssmm88.cc, 1
 ssmpuc.com, 1
 ssmut.be, 1
@@ -77664,6 +77557,7 @@ ssrfq.com, 1
 ssrvpn.tech, 1
 sssldurban.co.za, 1
 sssljohannesburg.co.za, 1
+sssnet.xyz, 1
 sssppp.gq, 1
 sstaging.com, 1
 sstr5.ch, 1
@@ -77672,6 +77566,7 @@ ssuiteoffice.com, 1
 ssuitesoft.com, 1
 st-bede.org, 1
 st-innovationcup.com, 1
+st-jitsi.com, 1
 st-kilian-markt-erlbach.de, 1
 st-li.com, 1
 st-news.de, 1
@@ -77694,6 +77589,8 @@ stackhub.cc, 1
 stacklasvegas.com, 1
 stackpath.com, 1
 stackptr.com, 1
+stackstartup.com, 1
+stackstartup.tech, 1
 stacktile.io, 0
 stacktrace.sh, 1
 stackunderflow.com, 1
@@ -77783,6 +77680,7 @@ standard.co.uk, 1
 standardequipment.com, 1
 standards.gov, 1
 standartgost.ru, 1
+standdownofnorthjersey.org, 1
 standheizung-shop.de, 1
 standoff-magic.ru, 1
 standoffdrop.ru, 1
@@ -77845,6 +77743,7 @@ starlim.org, 1
 starlux.cz, 1
 starmtech.fr, 1
 starmyworld.ga, 1
+staroch.name, 1
 starorusing.com, 1
 starover.tk, 1
 starpeak.org, 1
@@ -77858,7 +77757,6 @@ starryvoid.com, 1
 starsam80.net, 1
 starsandmanifolds.xyz, 1
 starsbattle.net, 1
-starsdream.win, 1
 starsguru.com, 1
 starsing.bid, 1
 starskim.cn, 1
@@ -77882,14 +77780,27 @@ startpage.com, 1
 startpage.info, 1
 startplats.tk, 1
 startrek.in, 1
+startstack.tech, 1
 startstunter.com, 1
 starttls-everywhere.org, 1
 starttraffic.uk, 1
+startup-stack.com, 1
+startup-stack.tech, 1
 startup.melbourne, 1
 startupisland.tw, 1
 startuplevel.com, 1
+startupstack.llc, 1
+startupstack.net, 1
+startupstack.online, 1
+startupstack.pro, 1
+startupstack.services, 1
+startupstack.site, 1
+startupstack.software, 1
 startupstack.tech, 1
+startupstack.technology, 1
+startupstacktech.com, 1
 startupswitzerland.com, 1
+startuptechstack.com, 1
 startupum.ru, 1
 startupyourmind.com, 1
 startw.cf, 1
@@ -77948,7 +77859,6 @@ stavropol-news.ga, 1
 stavros.ovh, 1
 staxflax.tk, 1
 stay-curious.at, 1
-stay.black, 1
 staycurrent.eu, 1
 staycurrent.nl, 1
 stayme.cz, 1
@@ -78043,6 +77953,7 @@ steffentreeservice.com, 1
 steffi-in-australien.com, 1
 steffi-knorn.de, 1
 stefpastoor.nl, 1
+steggemachine.com, 1
 stehlik.co.uk, 1
 stehlik.sk, 1
 steidlewirt.de, 1
@@ -78180,7 +78091,7 @@ stevengoodpaster.com, 1
 stevengrech.com, 1
 stevenkendypierre.com, 1
 stevenpilger.com, 1
-stevenroddis.com, 0
+stevenroddis.com, 1
 stevensautotopsandupholstery.com, 1
 stevenselectricllc.com, 1
 stevenski.com, 0
@@ -78194,6 +78105,7 @@ stevenz.science, 1
 stevenz.xyz, 1
 stevepacheco.com, 1
 stevereedmp.co.uk, 1
+stevesbriefmovierecommendations.com, 1
 stevesdrivingschooltyneside.com, 1
 stevezheng.cf, 1
 stevezheng.tk, 1
@@ -78298,6 +78210,7 @@ stjude-ettekkar.tk, 1
 stjustin.org, 1
 stkevin-stbenedict.org, 1
 stkildaosteopathy.com.au, 1
+stl.news, 1
 stleonardmn.org, 1
 stln.ml, 1
 stlouisinsuranceco.com, 1
@@ -78335,6 +78248,7 @@ stockportpyramid.co.uk, 1
 stockslam.ga, 1
 stocksnews.tk, 1
 stockstuck.com, 1
+stocktonengineering.co.uk, 1
 stocktout.info, 1
 stocktrader.com, 1
 stockway.tk, 1
@@ -78434,6 +78348,7 @@ stormylegions.tk, 1
 stortiservices.com, 1
 storvann.net, 1
 storvann.no, 1
+storybuilder.me, 1
 storycollective.film, 1
 storycollective.nl, 1
 storycycle.tk, 1
@@ -78481,6 +78396,7 @@ strandbyfysio.dk, 1
 strandedinotter.space, 1
 strandhaus-claassen.de, 1
 strandhaus-hinter-der-duene.de, 1
+strandkorb-jentzsch.de, 1
 strandom.ru, 1
 strandschnuppern.de, 1
 strange.ga, 1
@@ -78519,6 +78435,7 @@ strauser.com, 1
 stravers.shoes, 1
 strawberries.tk, 1
 strawberry-laser.gr, 1
+straydio.co.uk, 1
 straylight.tk, 1
 strd.co, 1
 stream-box.tk, 1
@@ -78528,7 +78445,6 @@ streamchan.org, 1
 streamelements.com, 1
 streaming-download.net, 1
 streaminginternacional.com, 1
-streaminginternacional.net, 1
 streamkit.gg, 1
 streamlineaudio.co.za, 1
 streampanel.net, 1
@@ -78542,6 +78458,7 @@ street-hoops.tk, 1
 street-legal.tk, 1
 street-medics.fr, 1
 street-tek.com, 1
+streetboards.lt, 1
 streetdancecenter.com, 1
 streetlightdata.com, 1
 streetmarket.ru, 1
@@ -78549,7 +78466,6 @@ streets.mn, 1
 streetshirts.co.uk, 1
 streetspotr.com, 1
 streetstunters.tk, 1
-streetview.wien, 1
 strefapi.com, 1
 strefapi.pl, 1
 strehl.tk, 1
@@ -78571,6 +78487,7 @@ strictlyguitar.de, 1
 strictlynormal.com, 1
 strijkshop.be, 1
 strikeout.ga, 1
+strily.com, 1
 strings.cf, 1
 stringtoolbox.com, 1
 stringvox.com, 0
@@ -78585,7 +78502,6 @@ strivephysmed.com, 0
 strl-tunis.tk, 1
 strm.hu, 1
 strm.pl, 1
-strming.com, 1
 strobe.cool, 1
 strobeltobias.de, 1
 strobeto.de, 1
@@ -78703,7 +78619,6 @@ studioadevents.com, 1
 studioandrew.tk, 1
 studioavvocato.roma.it, 1
 studioavvocato24.it, 1
-studiobergaminloja.com.br, 1
 studiobrandano.com, 1
 studiodelbenessere.com, 1
 studiodentisticomasi.com, 1
@@ -78724,7 +78639,6 @@ studiomarcella.com, 1
 studiomko.com, 1
 studionowystyl.pl, 1
 studiopirrate.com, 1
-studiopop.com.br, 1
 studioproapp.com, 1
 studioriehl.com, 1
 studioscherp.nl, 1
@@ -78747,6 +78661,7 @@ studium.cz, 1
 studius.gq, 1
 studport.rv.ua, 1
 studsovet.cf, 1
+studujdigital.cz, 1
 studwebs.ml, 1
 study-support-beans.com, 1
 studyin.jp, 1
@@ -78812,6 +78727,7 @@ stylewish.me, 1
 stylingstudio.ga, 1
 stylle.me, 1
 styloeart.com, 1
+styloplumeblog.fr, 1
 styplon.cf, 1
 stypr.com, 1
 stzur.com, 1
@@ -78942,6 +78858,7 @@ sulkmen.tk, 1
 sultangroup.ru, 1
 suluvir.com, 1
 sulytics-tool.com, 1
+sumareaguas.com.br, 1
 sumatphoto.com, 1
 sumatrabarat.ml, 1
 sumatraselatan.ml, 1
@@ -78959,6 +78876,7 @@ sumitchahal.com, 1
 summa.eu, 0
 summarized.gq, 1
 summer.ga, 1
+summer.today, 1
 summerbo.at, 1
 summercampthailand.com, 1
 summermc.cc, 1
@@ -78973,6 +78891,7 @@ summitlighthousela.org, 1
 summusglobal.com, 1
 sumochki.tk, 1
 sumthing.com, 1
+sumutoday.com, 1
 sun-beach.com.ua, 1
 sun-host.ml, 1
 sun-wellness-online.com.vn, 1
@@ -79051,6 +78970,7 @@ sunshinesf.org, 1
 sunsong.org, 1
 sunsquare.cz, 1
 sunstar.bg, 1
+suntzuparadirectivos.com, 1
 sunwolf.studio, 1
 suomenkielisetnettikasinot.com, 1
 suomika.pl, 1
@@ -79087,6 +79007,7 @@ supercentenarian.com, 1
 supercharged.co.uk, 1
 supercinebattle.fr, 1
 supercombinata.by, 1
+supercours.net, 1
 supercreepsvideo.com, 0
 superdaddy.club, 1
 superdolly.cf, 1
@@ -79130,7 +79051,6 @@ superpase.com, 1
 superpi.noip.me, 1
 supersahnetorten.de, 1
 supersandro.de, 1
-supersec.es, 1
 superservers.ml, 1
 supersisi.cf, 1
 supersisi.ml, 1
@@ -79138,6 +79058,7 @@ superskidki.cf, 1
 supersonnig-festival.de, 1
 supersonnigfestival.de, 1
 superspeller.ng, 1
+supersprowtz.com, 1
 superstargossip.com, 1
 superstarhost.tk, 1
 superstart.tk, 1
@@ -79163,6 +79084,7 @@ supplies24.es, 1
 supplynation.org.au, 1
 support-ticino.ch, 1
 support.mayfirst.org, 0
+support96.ru, 1
 supportdesk.nu, 1
 supportericking.org, 1
 supportfan.gov, 1
@@ -79174,7 +79096,6 @@ suprem.biz, 0
 suprem.ch, 0
 supreme-court.tk, 1
 supremestandards.com, 1
-supriville.com.br, 1
 sur-v.com, 1
 suranganet.tk, 1
 surasak.io, 1
@@ -79242,6 +79163,8 @@ sustainabilityknowledgegroup.com, 1
 sustainabilitysociety.hk, 1
 sustainoss.org, 1
 sustc.ac.cn, 1
+sustcarchive.org, 1
+suste.ch, 0
 susthx.com, 1
 sustsol.com, 1
 sutabi.tk, 1
@@ -79274,6 +79197,7 @@ svantner.sk, 1
 svarka22.ml, 1
 svarnyjunak.cz, 1
 svarovani.tk, 1
+svarta.cz, 1
 svartx.com, 1
 svatbamisiaviti.tk, 1
 svatyjur.tk, 1
@@ -79344,6 +79268,7 @@ swallowgateway.com, 1
 swallsoft.co.uk, 1
 swallsoft.com, 1
 swampcoolerservice.com, 1
+swanbitcoin.com, 1
 swansdoor.org, 1
 swap.gg, 1
 swapfin.com, 1
@@ -79356,6 +79281,7 @@ swatee.com, 1
 swattransport.ae, 1
 sway-cdn.com, 1
 sway.com, 1
+swayampaaka.com, 1
 swc-cfc.gc.ca, 1
 swcloud.io, 1
 swd.agency, 1
@@ -79388,6 +79314,7 @@ sweethorses.tk, 1
 sweetintrigue.tk, 1
 sweetlegs.jp, 1
 sweetll.me, 0
+sweetologist.co, 1
 sweetparis.cf, 1
 sweets-mimatsu.com, 1
 sweetspot.co.kr, 1
@@ -79414,14 +79341,12 @@ swiftirc.net, 1
 swiftpak.co.uk, 1
 swiftqueue.com, 1
 swilly.org, 1
-swimminglessons.com.sg, 1
 swimmingpoolaccidentattorney.net, 1
 swimmingpoolpumpsbassonia.co.za, 1
 swimready.net, 1
 swimturk.com.tr, 1
 swimwear365.co.uk, 1
 swindontennisclub.azurewebsites.net, 1
-swindontennisclub.org, 1
 swineson.me, 1
 swing-belleville.de, 1
 swingerclub.in, 1
@@ -79431,6 +79356,7 @@ swingtimeinthegardens.com, 1
 swingular.com, 1
 swipedon.com, 1
 swipetv.ie, 1
+swish-ict.com, 1
 swiss-apartments.com, 1
 swiss-connection.net, 0
 swiss-cyber-experts.ch, 1
@@ -79445,7 +79371,6 @@ swisservers.com, 1
 swissfreshaircan.ch, 0
 swissfreshaircan.com, 0
 swissid.ch, 1
-swissinternationalva.com, 1
 swissj.com, 1
 swisslifestyletips.ch, 1
 swisslinux.org, 1
@@ -79465,7 +79390,6 @@ switcheo.exchange, 1
 switcheo.rocks, 1
 switchur.com, 1
 swivells.com, 1
-swj.red, 1
 swkdevserver.tk, 1
 swktestserver.tk, 1
 swmcfcu.org, 1
@@ -79567,7 +79491,6 @@ synergisticsoccer.com, 1
 synergy-logistics.tk, 1
 synergyfitness.com.au, 1
 synergyflare.com, 1
-synergyworkingdogclub.com, 1
 synergyzone.tk, 1
 synerionagile.com, 1
 synfin.org, 1
@@ -79631,12 +79554,12 @@ systemblog.tk, 1
 systemchile.com, 1
 systemd.ch, 0
 systemd.eu.org, 1
+systemd.info, 1
 systemeprod.fr, 0
 systemerr.tk, 1
 systemintegra.ru, 1
 systemisbusy.info, 1
 systemli.org, 1
-systemnik.store, 1
 systemonthego.com, 1
 systemspace.link, 1
 systemtoto.ml, 1
@@ -79645,11 +79568,11 @@ systemweb.no, 1
 systemzeit.info, 1
 systime.dk, 1
 systoolbox.net, 1
+sysv-consult.de, 1
 syswiki.org, 1
 sysystems.cz, 1
 syt3.net, 1
 syuez.com, 1
-syuez.org, 1
 syunpay.cn, 1
 sywnthkrawft.tk, 1
 syy.hk, 0
@@ -79664,13 +79587,13 @@ szasz.me, 1
 szaszm.tk, 0
 szc.me, 1
 szclsya.me, 1
-szczurek-zelazko.pl, 1
 szechenyi2020.hu, 1
 szentistvanpt.sk, 1
 szepsegbennedrejlik.hu, 1
 szeptylasu.eu, 1
 szerbnyelvkonyv.hu, 1
 szerelem.love, 1
+szerver1.ml, 1
 szetowah.org.hk, 1
 szlovaknyelv.hu, 1
 szlovennyelv.hu, 1
@@ -79795,12 +79718,13 @@ t9297.co, 1
 t9728.co, 1
 t9i.in, 1
 ta-65.com, 1
-ta-nuth.nl, 1
+ta-nuth.nl, 0
 ta-soest.nl, 0
 ta65.com, 1
 taabe.net, 1
 taalcursusvolgen.nl, 1
 taalmeisje.nl, 1
+taaltaal.nl, 1
 taanishsaifu.gq, 1
 taartbesteld.nl, 1
 taartenvanthea.nl, 1
@@ -79857,7 +79781,6 @@ tadu.de, 1
 tadzkitchen.com, 1
 taekwondo-berlin.tk, 1
 taffe-elec.com, 1
-tag-coin.com, 1
 tagabrand.co.uk, 1
 tagana-anindustrialpark.tk, 1
 tagderinspiration.ch, 1
@@ -79897,11 +79820,11 @@ taiklus.lt, 1
 taikodom.tk, 1
 tail.id.lv, 1
 tail.ml, 1
+taildb.com, 1
 tailpuff.net, 0
 tails.boum.org, 1
 tailwag.party, 1
 taim.io, 1
-taimane.com, 1
 taipak-krasnoyar.tk, 1
 taipei-101.tk, 1
 taiphanmem.net, 1
@@ -79996,6 +79919,7 @@ talsi.eu, 1
 talun.de, 1
 talusan.tk, 1
 talxis.com, 1
+talyllyn.co.uk, 1
 tam-moon.com, 1
 tam-safe.com, 1
 tam7t.com, 0
@@ -80048,7 +79972,6 @@ tandem-trade.ru, 0
 tandemexhibits.com, 1
 tandempartnerships.com, 1
 tandemwise.net, 1
-tandk.com.vn, 1
 tandoanh.vn, 1
 tandzorg.link, 1
 tangel.me, 1
@@ -80105,6 +80028,7 @@ taoofbeauty.tk, 1
 taotic.eu, 1
 taowa.ca, 1
 taoyingchang.tk, 1
+tapbutdao.com, 1
 tapchiphaidep.info, 1
 tapestries.tk, 1
 tapissier-schall.fr, 1
@@ -80134,6 +80058,7 @@ tarasevich.by, 1
 tarba-schluesseldienst-duesseldorf.de, 1
 tarchive.xyz, 1
 tardics.com, 1
+tardics.net, 1
 tardis.io, 1
 tarek.link, 1
 tarek.wtf, 1
@@ -80156,7 +80081,6 @@ tarotsgratuits.com, 1
 tarsan.cz, 1
 tarsashaz-biztositas.hu, 1
 tartaneagle.org.uk, 1
-tartanhamedshop.com.br, 1
 tartu.ee, 1
 taruntarun.net, 0
 tarzanka.ml, 1
@@ -80196,6 +80120,7 @@ tatary.cf, 1
 tatary.tk, 1
 tate.com, 1
 tateishi-ip.com, 1
+tathanhson.com, 0
 tatiana-kpb.tk, 1
 tatildekirala.com, 1
 tatler.com, 1
@@ -80216,6 +80141,7 @@ tauflight.com, 1
 taunusstein.net, 1
 tauran.net, 1
 tauriscia.tk, 1
+tauschen.info, 1
 taustyle.ru, 1
 tavolaquadrada.com.br, 1
 tavsys.net, 1
@@ -80238,9 +80164,9 @@ taxi-puck.pl, 1
 taxi-zakaz.ml, 1
 taxi24.ml, 1
 taxicab4you.com, 1
-taxichic.com, 1
 taxicollectif.ch, 0
 taxid-k.be, 1
+taxiindenbosch.nl, 1
 taximinvody.ml, 1
 taxis-collectifs.ch, 0
 taxisaeropuertomadrid.com, 1
@@ -80263,6 +80189,7 @@ tazamobile.ga, 1
 tazarelax.es, 1
 tazemama.biz, 1
 tazendaforever.tk, 1
+tazj.in, 1
 tb-bolshevik.tk, 1
 tb-devel.de, 1
 tb-itf.de, 1
@@ -80326,7 +80253,6 @@ tdelmas.ovh, 1
 tdfbfoundation.org, 1
 tdolar.com, 1
 tdr.today, 1
-tdrcartuchos.com.br, 1
 tdro.cf, 1
 tdrs.info, 1
 tds-forum.tk, 1
@@ -80338,7 +80264,6 @@ tdstoragebay.com, 1
 tdude.co, 1
 tdvg.nl, 1
 tdyx-china.com.cn, 1
-tea-empire.co.uk, 1
 tea.in.th, 1
 teabagdesign.co.uk, 1
 teach.gq, 1
@@ -80391,7 +80316,6 @@ teamrevolution.tk, 1
 teams.microsoft.com, 1
 teams.microsoft.us, 1
 teamsimplythebest.com, 1
-teamspeak-serverlist.xyz, 1
 teamsuccess.io, 1
 teamsudan.cf, 1
 teamtouring.net, 1
@@ -80448,7 +80372,6 @@ techaulogy.com, 1
 techbelife.com, 1
 techbrawl.org, 1
 techbrown.com, 1
-techbymemo.com, 1
 techcentral.ml, 1
 techcentral.my, 0
 techcenturion.com, 1
@@ -80477,6 +80400,7 @@ techgadgetry.in, 1
 techgo.re, 1
 techhappy.ca, 1
 techie-show.com, 1
+techiecomputers.com, 1
 techiehall.com, 1
 techiesmart.tk, 1
 techindo.cf, 1
@@ -80494,6 +80418,7 @@ techmanstan.com, 1
 techmasters.io, 1
 techmoviles.com, 1
 techmunchies.net, 1
+technews360.in, 1
 technewsetc.tk, 1
 techni-grav.com, 1
 technic3000.com, 1
@@ -80513,6 +80438,7 @@ technicwaladost.com, 1
 techniekutrecht.nl, 1
 technifocal.com, 1
 technik-boeckmann.de, 1
+techno-iptv.com, 1
 technochat.in, 1
 technofirstonline.com, 1
 technogps.com, 1
@@ -80534,6 +80460,8 @@ technoscoots.com, 1
 technosorcery.net, 1
 technospeakco.com, 1
 technoswag.ca, 1
+technoteers.com, 1
+technotronikcanada.ca, 0
 technoweb.ga, 1
 technowise.tk, 1
 techold.ru, 0
@@ -80552,7 +80480,6 @@ techshift.eu, 1
 techshift.nl, 1
 techshift.se, 1
 techsmartstore.com, 1
-techsna.com, 1
 techsocial.nl, 1
 techsolvency.com, 1
 techsys.cz, 1
@@ -80565,7 +80492,6 @@ techtrader.io, 1
 techunit.org, 1
 techusers.de, 1
 techvalue.gr, 1
-techvhow.com, 1
 techview.link, 1
 techviewforum.com, 1
 techvrse.com, 1
@@ -80591,7 +80517,6 @@ tecnikan.com.ar, 1
 tecnipuntoseguridad.com, 1
 tecnoarea.com.ar, 1
 tecnoblog.net, 1
-tecnobrasilloja.com.br, 1
 tecnocomp-systems.com, 1
 tecnodritte.it, 1
 tecnogaming.com, 1
@@ -80655,6 +80580,7 @@ teknemodus.com.au, 1
 teknik.io, 1
 teknikaldomain.me, 1
 tekniksnack.se, 1
+teknisetdemarit.fi, 1
 tekniskakustik.se, 1
 tekno.de, 1
 teknoforums.com, 1
@@ -80671,7 +80597,6 @@ telamon.eu, 1
 telangananews.ml, 1
 telco.at, 1
 telcodb.net, 1
-telcotronics.com, 1
 teldak.pt, 1
 tele-alarme.ch, 1
 tele-assistance.ch, 1
@@ -80723,6 +80648,7 @@ teleradio.tk, 1
 teleshop.be, 1
 teleskell.org, 1
 telesoftware.tk, 1
+telesonicengineering.com.my, 1
 telestepina.ru, 1
 telesto.online, 1
 teletaxe.fr, 1
@@ -80734,7 +80660,6 @@ televizeseznam.cz, 1
 televotia.ch, 1
 telework.gov, 1
 telford.codes, 1
-telhabrasil.com.br, 1
 telling.xyz, 1
 tellingua.com, 0
 tellthemachines.com, 1
@@ -80839,6 +80764,7 @@ teplomash24.ru, 1
 teplotehnik.tk, 1
 teppich-frisch.de, 1
 teppichfrisch.de, 1
+tepui.io, 1
 teq-automotive.com, 1
 teqip-pms.gov.in, 1
 tequilazor.com, 1
@@ -80863,7 +80789,6 @@ termee.com, 1
 termeh-store.com, 1
 termin-online.com, 1
 terminalhrd.com, 1
-terminalvelocity.co.nz, 1
 termino.eu, 1
 terminsrakning.se, 1
 termitinitus.org, 1
@@ -80879,6 +80804,7 @@ terra-x.net, 1
 terra.by, 0
 terrab.de, 0
 terracloud.de, 0
+terraco.ga, 1
 terracom.gr, 1
 terraelectronica.ru, 1
 terrafinanz.de, 1
@@ -80902,7 +80828,7 @@ territory.cf, 1
 terrorbilly.com, 1
 terrorblast.tk, 1
 terrty.net, 1
-terrybutler.co.uk, 1
+terrybutler.co.uk, 0
 terryjohnsononline.com, 1
 ters.ga, 1
 terudon.com, 1
@@ -80922,7 +80848,7 @@ tespent.cn, 1
 tessai.ga, 1
 tesseractinitiative.org, 1
 tessierashpool.de, 1
-test-greavesindia.pantheonsite.io, 1
+test-dns.eu, 1
 test-iq.gq, 1
 test-my.tk, 1
 test-online.tk, 1
@@ -80962,6 +80888,7 @@ testoon.com, 1
 testosterone-complex.com, 1
 testosteronedetective.com, 1
 testovaci.ml, 1
+testowapianka.pl, 1
 testpool.gq, 1
 testpornsite.com, 1
 testpsicotecnicos.com.es, 1
@@ -80981,6 +80908,7 @@ teto.nu, 1
 tetrabyte.tk, 1
 tetracycline500mg.ga, 1
 tetraetc.com, 1
+tetragir.com, 0
 tetraktus.org, 1
 tetrarch.co, 1
 tetsai.net, 1
@@ -81010,10 +80938,12 @@ texasurodoc.com, 1
 texasvolunteerattorneys.org, 1
 texaswinetrail.com, 1
 texby.com, 1
+texcolors.com.co, 1
 texel.es, 1
 texhnolyze.net, 1
 texiafinishing.com, 1
 texier.mx, 1
+texnogu.ru, 1
 texosmotr.tk, 1
 text-shirt.com, 0
 textbrawlers.com, 1
@@ -81038,6 +80968,7 @@ texy.info, 1
 teysens.com, 1
 tezcam.tk, 1
 tezwifi.com, 1
+tf-network.de, 1
 tf2b.com, 1
 tf2calculator.com, 1
 tf7879.com, 1
@@ -81049,7 +80980,7 @@ tfk.fr, 1
 tfle.xyz, 1
 tflite.com, 1
 tfnapps.de, 1
-tfq.me, 1
+tfq.me, 0
 tfreeman.org, 1
 tfrei.de, 1
 tft-cheat-sheet.com, 1
@@ -81082,12 +81013,12 @@ tgoaa.com, 1
 tgoall.com, 1
 tgoasia.com, 1
 tgod.co, 1
-tgtv.tn, 1
 tgtw.cc, 1
 tgui.eu, 1
 tgui.net, 1
 tgw.com, 1
 tgwork.com, 1
+th-nuernberg.de, 1
 th.search.yahoo.com, 0
 thablubb.de, 1
 thackbarth.net, 1
@@ -81143,6 +81074,7 @@ thca.ca, 1
 thcdev.de, 1
 thconsulting.co.uk, 1
 thcpbees.co.uk, 1
+thddns.net, 1
 the-alan-parsons-project.com, 1
 the-allmighty-mike.tk, 1
 the-archimedeans.org.uk, 1
@@ -81154,7 +81086,6 @@ the-body-shop.hu, 0
 the-busbys.com, 1
 the-digitale.com, 0
 the-earth-yui.net, 0
-the-fermenter.com, 1
 the-finance-blog.com, 1
 the-forgotten.net, 1
 the-gist.io, 1
@@ -81170,6 +81101,7 @@ the-pack.nl, 1
 the-pcca.org, 1
 the-race.com, 1
 the-red.pp.ua, 1
+the-spellcaster.com, 1
 the-spoonfeed.club, 1
 the-train.de, 1
 the-trophy-company.com, 1
@@ -81245,6 +81177,7 @@ thebimhub.com, 1
 thebinarys.com, 1
 thebirchwoods.com, 1
 thebirthdaysite.co.uk, 1
+thebismarckmarathon.com, 1
 thebit.link, 1
 theblackboard.gr, 1
 theblackknightsings.com, 1
@@ -81277,6 +81210,7 @@ thebridalcollection.com, 1
 thebrightons.co.uk, 1
 thebrightons.uk, 1
 thebroadcastknowledge.com, 1
+thebrookeb.com, 1
 thebss.tk, 1
 thebte.com, 1
 thebucknetwork.com, 1
@@ -81289,7 +81223,6 @@ thecameradivision.com, 1
 thecandidforum.com, 1
 thecarolingconnection.com, 1
 thecarpenters.tk, 1
-thecavalries.com, 1
 thecellulitediet.com, 1
 thechallenge.fit, 1
 thechandigarhcity.com, 1
@@ -81303,6 +81236,7 @@ theclonker.de, 1
 thecloudshelter.com, 1
 thecluster.xyz, 1
 thecoffeecamp.com, 1
+thecomfortcollection.com, 1
 thecompany.pl, 1
 thecomparativist.com, 1
 theconcordbridge.azurewebsites.net, 1
@@ -81312,6 +81246,7 @@ theconsultingpeople.tk, 1
 theconverter.net, 1
 thecorianderkitchen.com, 1
 thecowquerie.tk, 1
+thecr3ative.com, 1
 thecr3ative.tk, 1
 thecraftingstrider.net, 1
 thecrazybrains.tk, 1
@@ -81384,7 +81319,6 @@ thefashionpolos.com, 1
 thefasterweb.com, 1
 thefastmode.com, 1
 thefbstalker.com, 1
-thefengshuioffice.com, 1
 theferrarista.com, 0
 thefestivals.uk, 1
 thefishshop.ga, 1
@@ -81416,6 +81350,7 @@ thefusion.net.in, 1
 thefussyeater.ie, 1
 thegadgetsuperstore.com, 1
 thegarrowcompany.com, 1
+thegatewaytoanewworld.com, 1
 thegatheringocala.com, 1
 thegaucompany.healthcare, 1
 thegeekdiary.com, 1
@@ -81447,6 +81382,7 @@ thehairstandard.com, 1
 thehamiltoncoblog.com, 1
 thehappyxwife.ga, 1
 thehardylawfirm.com, 1
+thehasanyildirim.tk, 1
 thehassanmusic.tk, 1
 thehasty.com, 1
 thehaxbys.co.uk, 1
@@ -81454,12 +81390,10 @@ theheadplug.tk, 1
 theheatingoilclub.co.uk, 1
 thehiddenbay.cc, 0
 thehiltonfirm.tk, 1
-thehimachal.com, 1
 thehivedesign.org, 1
 thehobincompany.com, 1
 thehoff.ddnss.de, 1
 theholloways.tk, 1
-thehomeicreate.com, 1
 thehonorguard.org, 1
 thehookup.be, 1
 thehopefuture.com, 1
@@ -81499,6 +81433,7 @@ thekev.in, 1
 thekeymusic.com, 1
 thekeytobusiness.co.uk, 1
 thekiddz.com, 1
+thekidszone.in, 1
 thekingofhate.com, 0
 theknockout.tk, 1
 thekodester.ca, 1
@@ -81514,8 +81449,8 @@ thelearningenterprise.co.uk, 1
 thelegionshirley.co.uk, 1
 thelencystore.com, 1
 thelevelman.com, 1
-thelicagency.com, 1
 thelifeofmala.com, 1
+thelimitededition.in, 1
 thelinuxspace.com, 1
 thelinuxtree.net, 1
 thelittlejewel.com, 1
@@ -81541,6 +81476,7 @@ themattresswarehouse.co.za, 1
 thematyper.tk, 1
 themeaudit.com, 1
 themecraft.studio, 1
+themedicalmedia.com, 1
 themegteam.com, 1
 themenzentrisch.de, 1
 themerchandiser.net, 0
@@ -81549,7 +81485,6 @@ themesurgeons.net, 1
 themiddle.co, 1
 themigraineinstitute.com, 1
 themilanlife.com, 1
-themimitoof.fr, 0
 theminiacs.com, 1
 themist.cz, 1
 themodernreviewer.ga, 1
@@ -81563,6 +81498,7 @@ themusicinnoise.net, 1
 themusthaves.de, 1
 themusthaves.nl, 1
 thenanfang.com, 1
+thenational.academy, 1
 theneatgadgets.com, 1
 thenerdic.com, 1
 thenest.se, 1
@@ -81587,20 +81523,20 @@ theocharis.org, 1
 theocjournal.tk, 1
 theocratic.cf, 1
 theodeboer.nl, 1
-theodorahome.co, 1
-theodorahome.com.br, 1
 theofleck.com, 0
 theojellis.com, 1
 theojones.name, 1
 theokouzelis.com, 1
 theoldbrewhouse.info, 1
 theoldmill.tk, 1
+theoldsewingfactory.com, 1
 theolivetreerestaurants.com, 1
 theolodewijk.nl, 1
 theologyz.com, 1
 theomg.co, 1
 theonegroup.co.uk, 1
 theonethaimassage.de, 1
+theonlinecentre.com, 1
 theoosmetalart.nl, 1
 theophil.tk, 1
 theoptechnation.com, 1
@@ -81636,6 +81572,7 @@ thephp.cc, 1
 thepieslicer.com, 1
 thepillclub.com, 1
 thepilotwoman.cf, 1
+thepinfluencers.com, 1
 thepiratebay.cf, 1
 thepiratesociety.org, 1
 theplasticsurgerycenterofnashville.com, 1
@@ -81656,6 +81593,7 @@ thepromisemusic.com, 1
 theptclist.tk, 1
 theptpractitioner.com.au, 1
 thepurplemaids.com, 1
+thequalitycleaning.com, 1
 thequillmagazine.org, 1
 theralino.de, 1
 theramo.re, 1
@@ -81715,7 +81653,6 @@ therworth.net, 1
 therworth.org, 1
 thesacreds.com, 1
 thesalonthing.com, 0
-thesandboxchicago.com, 1
 thesanta.biz, 1
 thesarogroup.com, 1
 thesassynut.com, 1
@@ -81777,6 +81714,7 @@ thestralbot.com, 1
 thestrangenessofthings.tk, 1
 thestrategyagency.com.au, 1
 thestreamable.com, 1
+thestreet.cz, 1
 thestylebouquet.com, 1
 thesunshinecoasttourcompany.com.au, 1
 thesuppercircle.com, 1
@@ -81805,6 +81743,7 @@ thetorrentfunk.com, 1
 thetotalemaildelivery.com, 1
 thetradinghall.com, 0
 thetradingletter.com, 1
+thetrafficgeek.com, 1
 thetravelczar.com, 1
 thetravelhack.com, 1
 thetree.ro, 1
@@ -81826,6 +81765,7 @@ thevanishedvoyager.ml, 1
 theveils.net, 1
 thevenueofhollywood.com, 1
 thevenuevr.com, 1
+thevern.co.za, 1
 theverybusyoffice.co.uk, 1
 thevgg.com, 0
 theviewat55th.com, 1
@@ -81858,7 +81798,6 @@ thewindow.com, 1
 thewinedelivery.ga, 1
 thewizardsmanse.com, 1
 thewoodkid.com.au, 1
-thewoosh.me, 1
 theworkingeye.nl, 1
 theworld.tk, 1
 theworldexchange.com, 1
@@ -81894,6 +81833,7 @@ thierrymazue.fr, 1
 thietbithoathiem.net, 1
 thietkegianhangtttm.com, 1
 thietkenoithatshop.com, 1
+thijmen.xyz, 1
 thijmenmathijs.nl, 1
 thijs.amsterdam, 1
 thijs.fr, 1
@@ -82002,10 +81942,8 @@ thomasvochten.com, 1
 thomaswoo.com, 0
 thomien.de, 1
 thompsonfamily.cloud, 1
-thomsons.com, 1
 thomsonscleaning.co.uk, 1
 thomspooren.nl, 1
-thomwiggers.nl, 1
 thooka.com, 1
 thor.edu, 1
 thor.re, 1
@@ -82021,6 +81959,7 @@ thoughtlessleaders.online, 1
 thoughtsynth.com, 1
 thoughtsynth.net, 1
 thoughtsynth.org, 1
+thoughtworthy.info, 1
 thouni.de, 1
 thouqi.com, 1
 thousandoakselectrical.com, 1
@@ -82094,11 +82033,13 @@ thycotic.ru, 1
 thyngster.com, 1
 thynx.io, 1
 thyrex.fr, 1
+thzone.net, 1
 ti-js.com, 1
 ti-pla.net, 1
 ti-planet.org, 1
 ti615.com, 1
 ti780.com, 1
+tiagoealine.com.br, 1
 tiagoneves.tk, 1
 tiagonunes.pt, 1
 tiagosimao.com, 1
@@ -82135,7 +82076,6 @@ ticketcity.com, 1
 ticketdriver.com, 1
 ticketpro.ca, 0
 ticketrunway.com, 1
-ticketscol.com, 1
 ticketslover.com, 1
 ticketsmate.com, 1
 ticketsource.co.uk, 1
@@ -82153,6 +82093,7 @@ tidton.com, 1
 tidy.chat, 1
 tidych.at, 1
 tiekoetter.com, 1
+tiempoalegria.com, 1
 tiendadolca.com, 1
 tiendaengeneral.com, 1
 tiendafetichista.com, 1
@@ -82161,7 +82102,6 @@ tiener-herentals.be, 1
 tienerdienst-johanneskapel.tk, 1
 tiens-ib.cz, 1
 tierarzt-karlsruhe-durlach.de, 1
-tierarztpraxis-bogenhausen.de, 1
 tierarztpraxis-illerwinkel.de, 1
 tierarztpraxis-weinert.de, 1
 tiergear.com.au, 1
@@ -82169,7 +82109,6 @@ tiernanx.com, 1
 tieronegraphics.com, 1
 tierra-indomables.tk, 1
 tierradeayala.com, 1
-tierraprohibida.net, 1
 tierschutz-niederrhein.de, 1
 ties.com, 1
 tiew.pl, 1
@@ -82285,11 +82224,11 @@ timespowerofprint.com, 1
 timestamp.uk, 1
 timetab.org, 1
 timetastic.co.uk, 1
-timetech.io, 1
 timetotrade.com, 1
 timetrade.com, 1
 timewasters.nl, 1
 timewk.cn, 1
+timeworld.su, 1
 timfiedler.net, 1
 timgame.tk, 1
 timhbw.com, 1
@@ -82297,7 +82236,6 @@ timhieuthuoc.com, 1
 timi-matik.hu, 1
 timich.ga, 1
 timilion.tk, 1
-timing.com.br, 1
 timjk.de, 0
 timklefisch.de, 1
 timmersgems.com, 1
@@ -82425,11 +82363,11 @@ tis.ph, 1
 tischlerei-geher.at, 1
 tischlerei-klettke.de, 1
 tisgroup.com.my, 1
-tishopsv.com, 1
 tism.in, 1
 tisparking.com, 1
 tissot-mayenfisch.com, 0
 tissus-paris.com, 1
+tisvapo.it, 1
 tit-cdn.de, 1
 tit-dev.de, 1
 tit-dns.de, 1
@@ -82473,7 +82411,6 @@ tkacz.pro, 1
 tkanemoto.com, 0
 tkat.ch, 1
 tkbuilders.net, 1
-tkcafe.net, 1
 tkeycoin.com, 0
 tkgpm.com, 1
 tkhirianov.tk, 1
@@ -82498,6 +82435,7 @@ tldtattoo.com, 1
 tlehseasyads.com, 1
 tleng.de, 1
 tlo.xyz, 1
+tloschinski.de, 1
 tloxygen.com, 1
 tls-proxy.de, 1
 tls.builders, 1
@@ -82527,6 +82465,7 @@ tmc.com.mt, 1
 tmcjobs.com, 1
 tmcreationweb.com, 1
 tmdb.biz, 1
+tmf.ru, 1
 tmf22.ru, 1
 tmhanoi.com, 1
 tmheatingcooling.com, 1
@@ -82560,6 +82499,7 @@ tnwioa.gov, 1
 tny.link, 0
 to-med.ru, 1
 to-riktari.gr, 1
+to.gt, 1
 to.md, 1
 to2mbn.org, 1
 toad.ga, 1
@@ -82585,6 +82525,7 @@ tobias-bauer.net, 1
 tobias-haenel.de, 1
 tobias-kleinmann.de, 1
 tobias-kluge.com, 1
+tobias-kluge.de, 1
 tobias-picha.de, 1
 tobias-weidhase.de, 1
 tobias.gr, 1
@@ -82614,6 +82555,7 @@ tobis.cloud, 1
 tobischo.de, 1
 tobisworld.ch, 1
 tobtennis.tk, 1
+toby.website, 1
 tobyalden.com, 1
 tobyschrapel.com, 0
 tobyx.cc, 1
@@ -82716,7 +82658,6 @@ tokyo-onkyo.jp, 1
 tokyo-powerstation.com, 1
 tokyo.dating, 1
 tokyoadultguide.com, 1
-tokyobarbershop.com, 1
 tokyomakino.com, 1
 tokyotimeline.com, 1
 tokyovipper.com, 1
@@ -82869,6 +82810,7 @@ tonermaus.de, 1
 tonermonster.de, 1
 tonex.de, 1
 tonex.nl, 1
+tongli.eu.org, 1
 tonguetechnology.com, 1
 toni-dis.ch, 0
 tonifarres.net, 1
@@ -82892,10 +82834,9 @@ tonymanning.com, 1
 tonymaster21.me, 1
 tonytan.cn, 1
 tonytan.io, 1
-tonytron.com.br, 1
 tonyw.xyz, 1
 tonywebster.com, 1
-too.gy, 1
+tonyzhao.xyz, 1
 toobug.net, 1
 tool.lu, 1
 toolbox-bodensee.de, 1
@@ -82922,7 +82863,6 @@ toool.nyc, 1
 toool.org, 1
 toopopular.ga, 1
 toorfor.com, 1
-toorl.com, 1
 toot.center, 1
 tootbitco.ml, 1
 toothdoc.ca, 1
@@ -82949,6 +82889,7 @@ top10antivirus.review, 1
 top10media.tk, 1
 top10mountainbikes.info, 1
 top2servers.tv, 1
+top4c.com, 1
 top4shop.de, 1
 top6casinos.com, 1
 top9.fr, 1
@@ -82959,7 +82900,6 @@ toparkinfo.hu, 1
 topas.tk, 1
 topaxi.ch, 1
 topaxi.codes, 1
-topbdnews.xyz, 1
 topbigdeals.com, 1
 topbookmarking.cf, 1
 topbouncycastles.co.uk, 1
@@ -83017,9 +82957,7 @@ topotom.tk, 1
 toppercan.es, 1
 toppointrea.com, 1
 topprice.ua, 1
-topproductidea.com, 1
 topproductsanalysis.com, 1
-toppsychiatristkolkata.com, 1
 topradiosbrasil.tk, 1
 toprci.com.br, 1
 toprelatos.com, 1
@@ -83063,7 +83001,6 @@ toretame.jp, 1
 toretfaction.net, 1
 torfbahn.de, 1
 torg-room.ru, 1
-torisamaahirusama.com, 1
 torkware.com, 1
 torlinnhe.com, 1
 torlock.com, 1
@@ -83126,12 +83063,10 @@ tortillas-duras.cf, 1
 tortocan.com, 1
 tortoises-turtles.com, 1
 tortuga.ga, 1
-tortugan.com.br, 1
 torwart-jugend.de, 1
 tosainu.com.br, 1
 tosatopsicologabologna.com, 1
 toscer.me, 0
-toschool.com.br, 1
 toshen.com, 1
 toshkov.com, 1
 tosolini.info, 1
@@ -83141,7 +83076,6 @@ tostu.de, 1
 totaku.ru, 0
 total-destruction.tk, 1
 totalaccessnicaragua.co, 1
-totalbike.com.br, 1
 totalcarcheck.co.uk, 1
 totalchecklist.com, 1
 totalclean.co.uk, 1
@@ -83157,6 +83091,7 @@ totalforcegym.com, 0
 totalhomecareinc.com, 1
 totalhost.gq, 1
 totalityservices.co.uk, 1
+totalleedee.com, 1
 totallemaiildelivery.com, 1
 totallemaildelivery.com, 1
 totally-dakota.tk, 1
@@ -83296,6 +83231,7 @@ toysperiod.com, 1
 toysplace.ml, 1
 toystory3.ga, 1
 tozdev.com, 1
+tozein.com, 1
 tp-iryuubun.com, 1
 tp-kabushiki.com, 1
 tp-kyouyufudousan.com, 1
@@ -83348,7 +83284,6 @@ trackeye.dk, 1
 trackify.tk, 1
 tracking-app.tk, 1
 tracking.best, 1
-trackingstream.com, 1
 trackrecordpro.co.uk, 1
 tracksa.com.ar, 1
 trackulo.us, 1
@@ -83386,6 +83321,7 @@ trading-analytics.com, 1
 tradinghelper.be, 1
 tradingview.com, 1
 tradingyourownway.com, 1
+traditionalturk.com, 1
 traditions.nl, 1
 traditionskapperscollege.nl, 1
 traditionsvivantesenimages.ch, 1
@@ -83489,6 +83425,7 @@ trangcongnghe.com, 1
 trangell.com, 1
 tranhsondau.net, 0
 tranquillity.se, 1
+trans-pel.com, 1
 transacid.de, 1
 transappealrights.com, 1
 transcend.org, 1
@@ -83543,7 +83480,6 @@ transmisjeonline.pl, 1
 transmithe.net, 1
 transmitit.pl, 1
 transmutatie.nl, 1
-transmute.review, 1
 transnexus.com, 1
 transoil.co.uk, 1
 transpak-cn.com, 1
@@ -83559,11 +83495,13 @@ transsexualpantyhose.com, 1
 transsrit.tk, 1
 transumption.com, 1
 transwank.com, 1
+trantuanminh.com, 1
 tranzron.ga, 1
 trapkitchen.ml, 1
 trappednerve.org, 1
 trasandino.tk, 1
 trash2treasurecreations.co.za, 1
+trashexpert.ru, 1
 trashnothing.com, 1
 trashwagon.club, 1
 trashylingerie.ga, 1
@@ -83572,7 +83510,6 @@ traslocare.roma.it, 1
 traslocatore.roma.it, 1
 traslochi-trasporti-facchinaggio.it, 1
 trasloco.milano.it, 1
-trastornoevitacion.com, 1
 trastornolimite.com, 1
 tratamentoparacelulite.net, 1
 tratamientodelvitiligo.es, 1
@@ -83686,6 +83623,7 @@ treeschat.com, 1
 treestarmarketing.com, 1
 treestumpgrindingnearme.com, 1
 treeworkbyjtec.com, 1
+treezone.net, 1
 trefcon.cz, 1
 trefle.io, 1
 trefpuntdemeent.nl, 1
@@ -83731,7 +83669,7 @@ tresredatores.tk, 1
 tretail.net, 1
 tretkowski.de, 1
 treurtransport.tk, 1
-trevo-lotofacil.com.br, 1
+trevo-lotofacil.com.br, 0
 trevormarron.co.uk, 1
 trevorng.vision, 1
 trevsanders.co.uk, 1
@@ -83750,6 +83688,8 @@ trialbyfire.tk, 1
 trialcentralnet.com, 1
 trialmock.com, 1
 trials.tk, 1
+triangela.com, 1
+triangela.se, 1
 triangle-energie.com, 1
 trianglecastles.co.uk, 1
 trianglelawngames.com, 1
@@ -83820,8 +83760,8 @@ trinnes.net, 1
 trio.online, 1
 triop.se, 1
 triozon.hu, 1
+tripartie.com, 1
 triphop.com, 1
-triplecrownoutfitters.com, 1
 triplejprints.com, 1
 triplekeys.net, 1
 triplethreatband.tk, 1
@@ -84016,7 +83956,6 @@ tryti.me, 1
 tryupdates.com, 1
 trywesayyes.com, 1
 trz.cz, 1
-trzepak.pl, 1
 ts-folienmontage.de, 1
 ts-public.tk, 1
 ts-publishers.com, 1
@@ -84166,6 +84105,7 @@ tuffmail.com, 1
 tuffmail.net, 1
 tuffsruffs.se, 1
 tufilo.com, 1
+tugafm.eu.org, 1
 tugesha.com, 1
 tuimprenta.com.ar, 1
 tuingereedschappen.net, 0
@@ -84176,6 +84116,7 @@ tukdesigns.com, 1
 tula-city.tk, 1
 tula-news.ga, 1
 tulenceria.es, 1
+tulevaisuusdemarit.fi, 1
 tuliha.ga, 1
 tulikajain.cf, 1
 tuller.tk, 1
@@ -84221,12 +84162,14 @@ tuoicay.vn, 1
 tuotteet.org, 1
 tuou.xyz, 0
 tupa-germania.ru, 1
+tupahost.net.br, 1
 tupass.pw, 1
 tupatane.gq, 1
 tupeuxpastest.ch, 0
 tupianku.com, 1
 tupizm.com, 1
 tuppenceworth.ie, 1
+tupperwaresalamanca.com, 1
 turadionline.cf, 1
 turalt.com, 1
 turbaza.tk, 1
@@ -84286,18 +84229,19 @@ turpinpesage.fr, 1
 tursiae.org, 1
 turteka.com, 1
 turtlearmy.net, 1
+turtledigital.co.uk, 1
 turtleduckstudios.com, 1
 turtlehead.tk, 1
 turtlepay.io, 1
 turtles.ga, 1
 turtunis.ml, 1
 turul.tk, 1
-turuncu-sepet.com, 1
 turunculevye.com, 1
 turystyczny-system.pl, 1
 tus-kikishinkyo.jp, 1
 tusar.ga, 1
 tuscanyleather.it, 1
+tusconsultorex.com, 1
 tuseodigital.com, 1
 tusharwalaskar.com, 1
 tusi.co, 1
@@ -84326,13 +84270,13 @@ tutorio.ga, 1
 tutorme.com, 1
 tuts4you.com, 1
 tuttimundi.org, 0
-tuttopappagalli.net, 1
 tutu.green, 1
 tutu.ro, 1
 tuversionplus.com, 1
 tuwaner.com, 1
 tuxcloud.net, 1
 tuxflow.de, 0
+tuxforums.com, 1
 tuxgeo.com, 0
 tuxhound.org, 1
 tuxie.com, 1
@@ -84431,7 +84375,6 @@ twinkseason.com, 1
 twinztech.com, 1
 twiri.net, 1
 twisata.com, 1
-twist.com, 1
 twistdevelopment.co.uk, 1
 twisted-brains.org, 1
 twistedwave.com, 1
@@ -84466,7 +84409,6 @@ twojfaktum.pl, 1
 twolinesmedia.eu, 1
 tworaz.net, 1
 twotube.ie, 1
-twtimmy.com, 1
 twtr.email, 1
 twtremind.com, 1
 twun.io, 1
@@ -84481,6 +84423,7 @@ txlrs.org, 1
 txm.pl, 1
 txpi.nsupdate.info, 1
 txtd.io, 1
+txtdb.com, 1
 txtdirect.com, 1
 txtdirect.dev, 1
 txtdirect.io, 1
@@ -84664,6 +84607,7 @@ uat-activesg.com, 1
 uat-mypfp.co.uk, 1
 uateach.tk, 1
 uatgootax.ru, 0
+uatx.mx, 1
 uawoptout.com, 1
 ub3rk1tten.com, 0
 ub889.com, 1
@@ -84847,6 +84791,7 @@ ullah.se, 1
 ulli.ml, 1
 ulmer-schneesport.de, 1
 ulovelc88.com, 1
+ulrichracing.com, 1
 ulrichs.ch, 1
 ulrik.moe, 1
 ulsters.cf, 1
@@ -84865,7 +84810,6 @@ ultimatemapping.tk, 1
 ultimatepaleoguide.com, 1
 ultortech.com, 1
 ultra-pro.ga, 1
-ultra.group, 1
 ultrabeautycream.com, 1
 ultracentr.ml, 1
 ultrafine.cf, 1
@@ -84875,7 +84819,6 @@ ultramax.biz, 1
 ultramookie.com, 1
 ultraonline.ml, 1
 ultraporn.biz, 1
-ultrasdesign.co.uk, 1
 ultraseopro.com, 1
 ultrasite.tk, 1
 ultrasocial.ml, 1
@@ -84924,9 +84867,9 @@ unaffectedsound.tk, 1
 unai-yus.tk, 1
 unapp.me, 1
 unasim.gq, 1
+unataly.gq, 1
 unataz.tk, 1
 unatco.noip.me, 1
-unausa.com.br, 1
 unbelievableplaces.de, 1
 unblock-zh.org, 1
 unblockall.xyz, 1
@@ -84956,10 +84899,12 @@ unblocked.sh, 1
 unblocked.uno, 1
 unblocked.vc, 1
 unblocked.vet, 1
+unblocked.vip, 1
 unblocked.win, 1
 unblockit.bid, 1
 unblockit.biz, 1
 unblockit.ca, 1
+unblockit.one, 1
 unblockit.pro, 1
 unblockit.red, 1
 unblockweb.co, 1
@@ -85003,6 +84948,7 @@ unearaigneeauplafond.fr, 1
 unece-deta.eu, 1
 unefleur.be, 1
 unefuite.ch, 0
+unepierrepourlui.fr, 1
 unerosesurlalune.fr, 0
 unescoclub.tk, 1
 unetyr.gq, 1
@@ -85044,7 +84990,6 @@ unicefkepeslapok.hu, 1
 unicefvoscilnice.si, 1
 unicioushop.com, 1
 unicode.gq, 1
-unicode.website, 1
 unicolabo.jp, 1
 unicool.tk, 1
 unicorn-systems.net, 1
@@ -85066,7 +85011,6 @@ unidevgroup.ru, 1
 unidostransportes.com.br, 1
 unidrogas.com, 0
 unieducar.org.br, 1
-uniekglas.nl, 1
 unifashion.ro, 1
 unifestal.com, 1
 unifiednetwork.me, 1
@@ -85087,6 +85031,7 @@ unionplat.ru, 1
 unionreports.gov, 1
 unionstreetskateboards.com, 1
 uniontestprep.com, 1
+unionvilleheating.com, 1
 unipart.digital, 0
 unipass.ga, 1
 unipig.de, 1
@@ -85118,6 +85063,7 @@ unitedfitness.com.au, 1
 unitedkingdoms-guild.com, 1
 unitedprovinces.nl, 1
 unitedpsychological.com, 1
+unitehelivy.be, 1
 uniteinhealth.com, 1
 unitel2000.de, 1
 unitencup.tk, 1
@@ -85207,6 +85153,8 @@ unpause.io, 1
 unpkg.com, 1
 unpleasant.tk, 1
 unpluggedjuice.dk, 1
+unplugstore.it, 1
+unpoditalia.se, 1
 unpossible.xyz, 1
 unpr.dk, 1
 unprovided.cf, 1
@@ -85223,7 +85171,6 @@ unstable.network, 1
 unstamps.org, 1
 unstockd.org, 1
 unstoppable.money, 1
-unstoppableever.com.br, 1
 unstoppableunits.com, 1
 unsuspicious.click, 1
 unterhaltungsbox.com, 1
@@ -85239,6 +85186,7 @@ unusedrooms.com, 1
 unusualhatclub.com, 1
 unusualworldd.com, 1
 unveiledgnosis.com, 1
+unvoyageenvelo.com, 1
 unwa.tk, 1
 unworthy.ml, 1
 unx.dk, 1
@@ -85293,7 +85241,6 @@ upholsterycleanerslondon.co.uk, 1
 upholsterydesign.com.au, 1
 uphuntingland.com, 1
 upitnik.rs, 1
-uplaqui.com.br, 1
 uplead.com, 1
 uplinkgame.tk, 1
 uplinklabs.net, 1
@@ -85327,11 +85274,11 @@ upscope.io, 1
 upsdelperu.com.pe, 1
 upsettunnel.com, 1
 upsihologa.com.ua, 1
+upsilonsigmaphi.us, 1
 upskilllearning.ml, 1
 upskirtmania.tk, 1
 upstaa.com, 1
 upstart.com, 1
-uptechbrasil.com.br, 1
 uptimed.com, 1
 uptional.gq, 1
 uptodateinteriors.com, 1
@@ -85371,7 +85318,6 @@ uraniumhost.ga, 1
 uranius.eu, 1
 uranmoney.ml, 1
 uranus.cf, 1
-urb-budex.pl, 1
 urbackups.com, 1
 urbalex.ch, 0
 urban-culture.fr, 1
@@ -85380,6 +85326,7 @@ urban.melbourne, 1
 urbanagriculturesummit.cf, 1
 urbanbikeweamr.ga, 1
 urbanbooks.tk, 1
+urbancoffee.com.mx, 1
 urbancreators.dk, 1
 urbanemc.net, 1
 urbanesecurity.com, 1
@@ -85470,7 +85417,6 @@ usa.gov, 1
 usa250.gov, 1
 usaa.com, 0
 usaautoaz.com, 1
-usabackground.com, 1
 usability.com.gr, 1
 usability.gov, 1
 usadba.net.ru, 1
@@ -85488,7 +85434,6 @@ usamultimeters.com, 1
 usanewsposts.ga, 1
 usanewstrends.ga, 1
 usap.gov, 0
-usapublicrecords.com, 1
 usarp.org, 1
 usaseanconnect.gov, 1
 usashopex.com, 1
@@ -85538,9 +85483,9 @@ uskaria.com, 1
 usleep.net, 1
 usleravnekrog.dk, 1
 uslugi-advokata.ga, 1
+uslugi-online.pl, 1
 uslugi-voronezh.tk, 1
 usmammy.com.tw, 1
-usmiddleclass.net, 1
 usmint.gov, 1
 usninosnikrcni.eu, 1
 usnti.com, 1
@@ -85557,7 +85502,6 @@ ussm.gov, 0
 ussm.tk, 1
 ussst.org, 1
 ussuka.com, 0
-ustaywell.com, 1
 ustensiles-cuisine.boutique, 1
 ustr.gov, 0
 ustugov.kiev.ua, 1
@@ -85607,7 +85551,6 @@ utopianrealms.org, 1
 utopicestudios.com, 1
 utopique.net, 1
 utorg.com.ua, 1
-utox.io, 1
 utrace.me, 1
 utrantor.org, 1
 utterberry.io, 1
@@ -85688,7 +85631,6 @@ uzemobility.org, 1
 uzhas-uzhasny.ml, 1
 uzsvm.cz, 1
 uztop.ml, 1
-uzzamari.com, 1
 v-bank.com, 1
 v-bokhorst.eu, 1
 v-d-p.net, 1
@@ -85731,13 +85673,13 @@ v1sit0r.ru, 1
 v2bet365.com, 1
 v2bv.net, 1
 v2bv.win, 1
-v2cn.win, 1
 v2ex.com, 1
 v2mcdev.com, 1
 v2ray6.com, 1
 v2ray66.com, 1
 v2ray666.com, 1
 v2x.sk, 1
+v2xxoo.com, 1
 v3025.com, 1
 v30365.com, 1
 v33v33.com, 1
@@ -85809,7 +85751,6 @@ v88522.com, 1
 v88559.com, 1
 v88656.com, 1
 v88799.com, 1
-v8abc.com.br, 1
 v8bet365.com, 1
 v9037.com, 1
 v9285.com, 0
@@ -85844,6 +85785,7 @@ vaclan.tk, 1
 vaclavambroz.eu, 1
 vacontractortraining.com, 1
 vacuumpump.co.id, 1
+vadasztanyabuk.hu, 1
 vademekum.com, 1
 vadennissanofhiltonheadparts.com, 1
 vadiar-angola.tk, 1
@@ -85918,11 +85860,14 @@ validatis.com, 1
 validator.nu, 1
 validbrands.com, 1
 validius.fi, 1
+validius.net, 1
 valika.ee, 1
 valimised.ee, 1
 valioncolonialcompany.com, 1
 valkohalla.dk, 1
 valkohattu.fi, 1
+valkoi-konyvtar.hu, 1
+valkoi-ksk.tk, 1
 valkova.net, 1
 valledeleresma.tk, 1
 vallei-veluwe.nl, 1
@@ -85936,7 +85881,6 @@ valleyshop.ca, 1
 valleystories.ga, 1
 valleywidetvrepair.ml, 1
 vallutaja.eu, 1
-valokuva-albumi.fi, 1
 valopv.be, 1
 valor-host.ml, 1
 valordolarblue.com.ar, 1
@@ -85970,6 +85914,7 @@ valueofblog.com, 1
 valueseed.net, 1
 valuesetters.com, 1
 valunet.co.za, 1
+valuskills.co.za, 1
 valutienda.com, 1
 valuuttamuunnin.com, 1
 valx.jp, 1
@@ -85981,6 +85926,7 @@ vampire-studios.tk, 1
 vampire142.fr, 1
 vampyrium.com, 0
 vampyrium.net, 0
+van-assen.com, 1
 van-brandevoort.tk, 1
 van11y.net, 1
 vanbinnenuit.nl, 1
@@ -86002,6 +85948,7 @@ vanderkroon.nl, 1
 vandermeer.frl, 1
 vanderrijt.nl, 0
 vanderstraeten.dynv6.net, 1
+vanderziel.org, 1
 vandeth.net, 1
 vandijkmaatwerk.nl, 1
 vandommelenart.com, 1
@@ -86052,7 +85999,9 @@ vapehour.com, 1
 vapeking.co.za, 1
 vapekingusa.com, 1
 vapemania.eu, 1
+vapemate.co.uk, 1
 vapensiero.co.uk, 1
+vaperion.me, 1
 vaperolles.ch, 0
 vapesense.co.uk, 1
 vapetaclope.cf, 1
@@ -86074,10 +86023,9 @@ varghese.de, 1
 variable.agency, 0
 variable.dk, 1
 variablyconstant.com, 1
-variag-group.ru, 1
-variag-montazh.ru, 1
+variag-group.ru, 0
+variag-montazh.ru, 0
 varied.ga, 1
-variedades.store, 1
 varimedoma.com, 1
 variomedia.de, 1
 varizh.by, 1
@@ -86126,6 +86074,7 @@ vat-eu.com, 1
 vat.direct, 1
 vatav.tk, 1
 vatikantour.tk, 1
+vatitsolutions.com, 1
 vato.nl, 1
 vats.im, 1
 vattulainen.fi, 1
@@ -86133,7 +86082,6 @@ vauceri.hr, 1
 vaugarnier.fr, 1
 vaughanrisher.com, 1
 vault.investments, 1
-vault21.net, 1
 vault647.com, 1
 vault81.de, 1
 vaultproject.io, 0
@@ -86154,7 +86102,6 @@ vazue.com, 1
 vb.media, 1
 vbazile.com, 1
 vbelgorode.tk, 1
-vbestproduct.com, 1
 vbezhenar.com, 1
 vbql.me, 1
 vbsoft.cz, 1
@@ -86238,6 +86185,7 @@ vegangaymer.blog, 1
 veganism.co.uk, 1
 veganism.com, 1
 veganmasterrace.com, 1
+veganoos.com, 1
 veganrecipereviews.com, 1
 vegasluxuryestates.com, 1
 vegavio.com, 1
@@ -86245,7 +86193,6 @@ vegculinary.com, 1
 vege-tables.fr, 1
 vegekoszyk.pl, 1
 vegepa.com, 1
-vegetalvalley.org, 1
 vegetariantokyo.net, 1
 vegetarier-sind-moerder.tk, 1
 vegetus.ua, 1
@@ -86260,6 +86207,7 @@ vehicletax.service.gov.uk, 1
 vehicletransportservices.co, 1
 veiergangvermut.dk, 1
 veii.de, 1
+veikkosimpanen.fi, 1
 veil-framework.com, 1
 veilofsecurity.com, 1
 veincenterbrintonlake.com, 1
@@ -86379,7 +86327,6 @@ verifiny.com, 1
 verifpal.com, 1
 verifyos.com, 1
 verifyyourip.com, 1
-veriny.tf, 1
 veriomed.com, 1
 veritafineviolins.com, 1
 veritalife.com, 1
@@ -86503,7 +86450,7 @@ vetsmarketing.co.za, 1
 vettenburg.eu, 1
 vetustainversion.com, 1
 vetwebsuccess.com, 1
-vev.com.vn, 1
+vev.com.vn, 0
 veverusak.cz, 1
 vextraz.co, 1
 vezirecenzii.ro, 1
@@ -86539,7 +86486,6 @@ viagusto.pl, 1
 viajandoporelmundo.com.ar, 1
 viajaramsterdam.com, 1
 viaje-a-china.com, 1
-vialibido.com.br, 1
 viaprinto.de, 1
 viasinc.com, 0
 viasun.ru, 1
@@ -86552,10 +86498,10 @@ vibrant-america.com, 1
 vibrato1-kutikomi.com, 1
 vicarious.cf, 1
 vicenage.com, 1
+vicenez.agency, 1
 vicentediaz.mx, 1
 vicentee.com, 1
 vicentejr.com.br, 1
-viceversa2013.org, 1
 vichama.pe, 1
 vichiya.com, 1
 vician.cz, 1
@@ -86608,7 +86554,6 @@ victusrp.gq, 1
 vicugna.nl, 1
 vicyu.com, 1
 vid.me, 0
-vida.es, 1
 vidadu.com, 1
 vidady.com, 1
 vidaforanea.com.mx, 1
@@ -86691,6 +86636,7 @@ vietnamguide.co.kr, 1
 vietnamhost.vn, 0
 vietnamluxurytravelagency.com, 1
 vietnamphotoblog.com, 0
+vietnamtravelmart.com.vn, 1
 vietnamwomenveterans.org, 1
 vieux.pro, 1
 vievolution.tk, 1
@@ -86703,6 +86649,7 @@ viewey.com, 1
 viewflix.win, 1
 viewing.nyc, 1
 viewmythoughts.com, 1
+vifranco.cl, 1
 vifsoft.com, 1
 viga.me, 1
 vigilanciatotal.com, 1
@@ -86712,6 +86659,7 @@ vigilantnow.com, 1
 vigira.com.ar, 1
 vigliano.com, 1
 vignaud.fr, 1
+vigneshkumar.com, 1
 vignoblesdeletat.ch, 1
 vigo-krankenversicherung.de, 1
 vigo-tarife.de, 1
@@ -86761,29 +86709,29 @@ villacarralon.tk, 1
 villach.at, 1
 villadelprado.tk, 1
 villaespanola.tk, 1
-villafiore.com.br, 1
 villagebridalbyomnibus.com, 1
 villagecardshop.co.uk, 1
 villagecenterpediatrics.com, 1
 villagemagazines.co.uk, 1
 villagenscamuria.it, 1
 villagephysicians.com, 0
-villageunique.com.br, 1
 villagockel.de, 1
 villainsclothing.com.au, 1
+villakarma.at, 1
 villalmanzo.tk, 1
 villamariaamalfi.it, 1
 villanew.tk, 1
 villasenor.online, 1
-villasfinistere.fr, 1
 villasforsale-bali.com, 1
 villasoasissanur.com, 1
 villaumbrales.tk, 1
 villavaltava.fi, 1
+villavasco.ovh, 1
 villaville.com, 1
 villawirz.it, 1
 ville-aime.fr, 1
 villehardouin.fr, 1
+villek.fi, 1
 villekaaria.eu, 1
 villenavedornon.fr, 1
 villenvinkit.com, 1
@@ -86820,11 +86768,11 @@ vineta.tk, 1
 vinetalk.net, 1
 vinetech.co.nz, 1
 vingt.me, 1
-vinhodragao.com.br, 1
 vinicius.sl, 1
 vinifriuli.sk, 1
 vinigas.com, 1
 vinilosdecorativos.net, 1
+vinisol.com.co, 1
 vinistas.com, 1
 vinit.tk, 1
 vinktwebdesign.nl, 0
@@ -86964,6 +86912,7 @@ virala.tk, 1
 viralboombox.xyz, 1
 viralcreate.com, 1
 viraljobs.ga, 1
+viralme.in, 1
 viraloffer.ga, 1
 viralpop.it, 0
 viralsv.com, 1
@@ -86988,6 +86937,7 @@ virtualcitehuallaga.com, 1
 virtualcloud.ddns.net, 1
 virtualcommodities.org, 1
 virtualcomputer.ml, 1
+virtualdawgs.com, 1
 virtualdesignmedia.com, 1
 virtuality4d.com, 1
 virtuallifestyle.nl, 1
@@ -87010,6 +86960,7 @@ viruscare.info, 1
 virvum.ch, 1
 visa-master.tk, 1
 visadaifu.com, 1
+visadoparausa.com, 1
 visalist.io, 1
 visalogy.com, 1
 visaop.com, 1
@@ -87019,11 +86970,11 @@ visatitans.ae, 1
 visatitans.ca, 1
 visatitans.com, 1
 visaya.com.co, 1
-viscoelastico.com.br, 1
 viscopic.com, 1
 viserproject.com, 0
 viseum.co.uk, 1
 vishenka.tk, 1
+vishwashantiyoga.com, 1
 visibleone.com, 1
 visibox.nl, 1
 visikom.de, 1
@@ -87031,7 +86982,6 @@ vision-painting.com, 0
 visionarymedia.nl, 1
 visiondetails.ru, 1
 visiondigitalsog.com, 1
-visiondirectionaldrilling.com, 1
 visionduweb.fr, 1
 visionexpresscareers.com, 1
 visiongamestudios.com, 1
@@ -87073,6 +87023,7 @@ visualdrone.co, 1
 visualgnome.com, 1
 visualgrafix.com.mx, 1
 visualideas.org, 1
+visualiti.co, 1
 visualizing.info, 1
 visualmarketingdeals.com, 1
 visualmasters.nl, 1
@@ -87180,13 +87131,13 @@ vizit-obmen.tk, 1
 vizitfree.ml, 1
 vizitnik.tk, 1
 vizualbits.com, 1
-vizzboard.com, 1
 vjeff.com, 1
 vjeff.net, 1
 vjhfoundation.org, 1
 vjpatel.me, 1
 vk-k.com, 1
 vk-random.ml, 1
+vk1fj.net, 1
 vkarpaty.tk, 1
 vkavkaz.tk, 1
 vkb-remont.ru, 1
@@ -87314,7 +87265,6 @@ vocab.guru, 1
 vocaloid.my, 1
 vocalviews.com, 1
 vocationnetwork.org, 1
-voceempaz.com, 1
 vocescruzadasbcs.mx, 1
 vocus.aero, 1
 vocustest.aero, 1
@@ -87348,10 +87298,10 @@ voicesoflabor.com, 1
 voicesofspirit.at, 1
 voicr.nl, 1
 voicu.ch, 0
-voidancerecords.com, 1
 voidbot.ai, 1
 voidbot.tk, 1
 voidcore.org, 1
+voidge.cf, 1
 voidi.ca, 1
 voidma.in, 1
 voidnya.com, 1
@@ -87438,6 +87388,7 @@ voodoochile.at, 1
 voodoocomedy.com, 1
 voodooshaman.com, 1
 voolik.pw, 1
+voom.live, 1
 vooreenveiligthuis.nl, 0
 voorjou.com, 1
 vop.li, 1
@@ -87574,7 +87525,6 @@ vroedvrouwella.be, 1
 vrostove.tk, 1
 vrpornmovies.net, 1
 vrsgames.com.mx, 0
-vrsystem.com.br, 1
 vrtouring.org, 1
 vrzl.pro, 1
 vs106.com, 1
@@ -87638,7 +87588,6 @@ vsx.ch, 1
 vtanki.tk, 1
 vtaxi.se, 1
 vtbs.moe, 1
-vthebest9.com, 1
 vtt-hautsdefrance.fr, 1
 vttnordisere.fr, 1
 vtuber-schedule.info, 1
@@ -87647,7 +87596,6 @@ vtuber.land, 1
 vtul.io, 1
 vtupro.com, 1
 vuakhuyenmai.vn, 1
-vuasinhly.com, 1
 vubey.yt, 1
 vucdn.com, 1
 vuelacaruru.com, 1
@@ -87671,6 +87619,7 @@ vultrhxl.com, 1
 vulyk-medu.com.ua, 1
 vunn.com, 1
 vuotila.eu, 1
+vutumusic.com, 1
 vuvanhon.com, 1
 vux.li, 1
 vuzi.fr, 1
@@ -87705,6 +87654,7 @@ vwt-event.nl, 1
 vww-8522.com, 1
 vx.hn, 1
 vxapps.com, 1
+vxl.sh, 1
 vxz.me, 1
 vybavzahradu.cz, 1
 vybeministry.org, 1
@@ -87777,6 +87727,7 @@ w365.vip, 0
 w36533.com, 1
 w36594.com, 1
 w3app.nl, 1
+w3ctag.com, 1
 w3ctag.org, 1
 w3d.io, 1
 w3n.org, 1
@@ -88099,6 +88050,7 @@ wannaridecostarica.com, 1
 wantocode.com, 1
 wanybug.cf, 1
 wanybug.cn, 1
+wanybug.com, 1
 wanybug.ga, 1
 wanybug.gq, 1
 wanybug.tk, 1
@@ -88125,6 +88077,7 @@ warbox.ga, 1
 warcraftjournal.org, 1
 wardonat.tk, 1
 wardow.com, 1
+wardpieters.nl, 1
 wardslager.com, 1
 warebouncycastles.co.uk, 1
 warehost.de, 0
@@ -88144,7 +88097,6 @@ warmestwishes.ca, 1
 warmlyyours.com, 1
 warmservers.com, 1
 warmtepomp.express, 1
-warmteshop.com, 1
 waroengkoe-shop.com, 1
 waroengkopigazebo.net, 1
 warofelements.de, 1
@@ -88200,6 +88152,7 @@ wastrel.ch, 1
 watashi.bid, 1
 watboeithet.nl, 1
 watch-wiki.org, 1
+watchco.com, 1
 watchcom.org.za, 1
 watchcow.org, 0
 watchdogs.tk, 1
@@ -88247,7 +88200,6 @@ watgroeitwaar.org, 1
 watoo.tech, 1
 watthasawang.com, 1
 wattmaedchen.de, 1
-wattnow.io, 1
 watvindtnederland.com, 1
 watzijnmijnkerntalenten.nl, 1
 waukeect.com, 1
@@ -88344,6 +88296,7 @@ wearandcare.net, 1
 weare1inspirit.com, 1
 wearebase.com, 1
 wearebfi.co.uk, 1
+wearedevs.net, 1
 wearefrantic.com, 1
 wearegenki.com, 1
 wearehackerone.com, 1
@@ -88351,6 +88304,7 @@ weareincognito.org, 1
 wearepapermill.co, 1
 wearepapermill.com, 1
 wearethreebears.co.uk, 1
+wearetravellers.nl, 1
 wearetuzag.com, 1
 wearewithyou.org, 1
 wearvintage.ml, 1
@@ -88391,9 +88345,12 @@ web-town.tk, 1
 web-wakakusa.jp, 1
 web-warrior.de, 1
 web-wave.jp, 1
+web-worker.cn, 1
 web.bzh, 1
 web.cc, 0
 web.de, 1
+web.hr, 1
+web1n.com, 1
 web2033.com, 1
 web2ldap.de, 1
 web2screen.tv, 1
@@ -88504,6 +88461,7 @@ webhostplan.info, 1
 webhotelli.website, 1
 webhotels.tk, 1
 webhotelsoversigt.dk, 1
+webhr.co, 1
 webia.in.th, 1
 webies.ro, 1
 webinator.tk, 1
@@ -88551,6 +88509,7 @@ webminders.it, 1
 webmining.gq, 1
 webmotelli.fi, 1
 webmr.de, 1
+webmyhealth.com, 1
 webnames.ca, 1
 webnetforce.net, 1
 webnetmail4u.com, 1
@@ -88635,7 +88594,6 @@ webssupport.ga, 1
 webstaff.xyz, 1
 webstart.nl, 1
 webstats.tk, 1
-webstellung.com, 1
 webstijlen.nl, 1
 webstore.be, 0
 webstu.be, 1
@@ -88647,6 +88605,7 @@ websuccess.co.za, 1
 websvetaines.lt, 1
 webtasarim.pw, 1
 webtaxi.cf, 1
+webteammate.com, 1
 webtek.nu, 1
 webtex.limited, 1
 webtheapp.com, 1
@@ -88736,6 +88695,7 @@ wegethitched.co.uk, 1
 weggeweest.nl, 1
 wegiveloans.com, 1
 wegner.no, 1
+wego.ca, 1
 wegonnagetsued.org, 1
 wegotcookies.com, 1
 wegrzynek.org, 1
@@ -88782,11 +88742,11 @@ weitergedacht.eu, 1
 weitsolutions.nl, 1
 weixiaojun.org, 0
 weizenke.im, 1
-wejdmark.com, 1
 wekibe.de, 1
 weknowhowtodoit.com, 1
 welches-kinderfahrrad.de, 1
 welcome-tahiti.com, 0
+welcome-to-the.wedding, 1
 welcome-werkstatt.com, 1
 welcome26.ch, 0
 welcomehelp.de, 1
@@ -88816,6 +88776,7 @@ wellnessever.com, 1
 wellnesshotel-weimar.de, 1
 wellreachlogistics.com, 1
 wellsolveit.com, 0
+wellsplasticsurgery.com, 1
 wellspringsga.com, 1
 wellsprung.net, 1
 welltycoon.com, 1
@@ -88890,7 +88851,6 @@ wereldplanner.nl, 1
 wereoutthere.nl, 1
 werhatunsverraten.eu, 1
 werk-34.de, 1
-werkemotion.com, 1
 werken-bij-inwork.nl, 1
 werkenbijdfzs.nl, 1
 werkenbijsanitairwinkel.be, 1
@@ -88970,7 +88930,6 @@ wetofu.top, 1
 wetpussylipsex.com, 1
 wetravel.company, 1
 wetrepublic.com, 1
-wettbonus.eu, 0
 wetter.de, 1
 wetthost.com, 1
 wevenues.com, 1
@@ -89019,6 +88978,7 @@ wgec-fegc.gc.ca, 1
 wgom.org, 0
 wgplatform.co.uk, 1
 wgraphics.ru, 1
+wgrfoods.co.uk, 1
 wgsuyi.cf, 1
 wgtrm.com, 1
 wh-guide.de, 1
@@ -89066,6 +89026,7 @@ whatsthisword.com, 1
 whatsupgold.com.tw, 1
 whatsupoutdoor.com, 0
 whatthefile.info, 1
+whatthefoxhat.com, 1
 whatthingsweigh.com, 1
 whattodo.com, 1
 whattominingrigrentals.com, 1
@@ -89171,7 +89132,7 @@ whm.gc.ca, 1
 whmcs.hosting, 1
 whnpa.org, 1
 who-calledme.com, 1
-who.pm, 1
+who.pm, 0
 whoami.io, 1
 whocalld.com, 1
 whocalled.us, 1
@@ -89199,6 +89160,7 @@ whowherewhen.net, 1
 whqqq.com, 1
 whqtravel.org, 0
 whs-music.org, 1
+wht.one, 1
 whta.eu, 1
 whta.se, 1
 whtcsj.com, 1
@@ -89215,6 +89177,7 @@ whytls.com, 1
 whyworldhot.com, 1
 whyy.eu.org, 1
 whyz1722.tk, 1
+wiadomosci-lodz.pl, 1
 wiagencies.com, 1
 wiapply.com, 1
 wibbe.link, 1
@@ -89240,6 +89203,7 @@ widely.io, 1
 widemann.de, 1
 widememory.com, 1
 widenews.org, 0
+wideworks.agency, 1
 widgetmaker.co.uk, 1
 widmer.bz, 1
 widoj.gov, 1
@@ -89372,7 +89336,7 @@ wildmine.su, 1
 wildnisfamilie.net, 1
 wildrideproject.tk, 1
 wildsafety.com, 1
-wildtrip.blog, 1
+wildtrip.blog, 0
 wildwildtravel.com, 1
 wildwind.world, 1
 wildzoopark.co.uk, 1
@@ -89401,7 +89365,7 @@ williamboundsltd.com, 1
 williamfeely.info, 1
 williamgoldberg.cf, 1
 williamjohngauthier.net, 1
-williamk.ga, 1
+williamk.ga, 0
 williamle.com, 1
 williampuckering.com, 1
 williamscomposer.com, 1
@@ -89485,6 +89449,8 @@ winepress.org, 1
 wineworksonline.com, 1
 winfieldchen.me, 1
 winfilestorage.tk, 1
+winfuture.de, 1
+winfuture.mobi, 1
 wing-tsun.ga, 1
 wing-tsun.gq, 1
 wingchunboxtribe.com, 1
@@ -89523,6 +89489,7 @@ wintermeyer.de, 1
 winteromeo.tk, 1
 winterschoen.nl, 1
 wintersportscompany.com, 1
+winterstyle.com, 1
 winterzine.cf, 1
 wintodoor.com, 1
 winwares.com, 1
@@ -89596,6 +89563,7 @@ wisweb.no, 1
 wit-creations.fr, 1
 wit.ai, 1
 witae.com, 1
+witch-anastasia.com, 1
 witch-spells.com, 1
 witchthicktits.tk, 1
 with-environment.com, 1
@@ -89714,7 +89682,6 @@ wofford-ecs.org, 0
 woffs.de, 1
 wofox.com, 1
 wogo.org, 1
-wohao.ga, 1
 woheni.de, 1
 wohlgemuth.rocks, 1
 wohlpa.de, 1
@@ -89773,7 +89740,6 @@ womenfashionshirt.tk, 1
 womens-suits.tk, 1
 womensalespros.com, 1
 womensbiz.tk, 1
-womenshairlossproject.com, 1
 womensmedassoc.com, 1
 womenswellnessobgyn.com, 1
 woms.top, 1
@@ -89843,7 +89809,6 @@ woorocket.com, 1
 wootkit.tk, 1
 wootware.co.za, 1
 wopplan.de, 1
-wopr.network, 1
 wops.cc, 1
 worca.de, 1
 worcade.com, 1
@@ -89880,6 +89845,7 @@ work-at-home.ga, 1
 work-at-home.gq, 1
 work-in-progress.website, 1
 workahealthic.de, 1
+workaround.run, 1
 workathomenoscams.com, 1
 workcelerator.com, 1
 workcheck.bz, 1
@@ -89887,6 +89853,7 @@ workcloud.jp, 1
 workcost.me, 1
 workemy.com, 1
 worker.gov, 1
+workeria-personal.de, 1
 workerselforganisation.cf, 1
 workfromhomebusinessopportunities.cf, 1
 workfromhomelegitjob.com, 1
@@ -89917,7 +89884,6 @@ workupapp.com, 1
 workwithgo.com, 0
 world-documentary.ml, 1
 world-education-association.org, 1
-world-in-my-eyes.com, 1
 world-lolo.com, 1
 world-of-tes.tk, 1
 world-politics.tk, 1
@@ -89928,7 +89894,6 @@ worldcarding.tk, 1
 worldcareers.dk, 1
 worldcharteronline.ga, 1
 worldchess.london, 1
-worldcigars.com.br, 1
 worldcubeassociation.org, 1
 worldessays.com, 1
 worldeventscalendars.com, 1
@@ -90042,6 +90007,7 @@ wpac.de, 0
 wpandup.org, 1
 wpbeter.nl, 1
 wpboot.com, 1
+wpbox.cc, 1
 wpcanban.com, 0
 wpcc.io, 1
 wpccu-cdn.org, 1
@@ -90049,6 +90015,7 @@ wpcdn.bid, 1
 wpcheck.io, 1
 wpcs.pro, 1
 wpdivitheme.nl, 1
+wpdo.it, 1
 wpdublin.com, 1
 wpexplorer.com, 1
 wpformation.com, 1
@@ -90096,6 +90063,7 @@ wqaw3.tk, 1
 wr.su, 1
 wrap.in.ua, 1
 wrapit.hu, 1
+wrara.org, 1
 wrathofgeek.com, 1
 wrbunderwriting.com, 0
 wrc-results.com, 1
@@ -90129,6 +90097,7 @@ writingcities.net, 1
 writingtoserve.net, 1
 writtenworld.bg, 1
 writtit.com, 1
+wrkflowmedia.de, 1
 wrmea.org, 1
 wrong.wang, 1
 wrongware.cz, 1
@@ -90210,9 +90179,7 @@ wuppertal-2018.de, 0
 wuppertaler-kurrende.de, 1
 wuwuwu.me, 1
 wuxiaohen.com, 1
-wuyiwa.net, 1
 wuyue.photo, 1
-wuz.it, 1
 wuzigackl.de, 0
 wv-n.de, 1
 wvg.myds.me, 1
@@ -90236,7 +90203,6 @@ wweichen.com.cn, 1
 wwgc2011.se, 1
 wwin818.com, 1
 wwjd.dynu.net, 1
-wwtext.com, 1
 wwv-8522.com, 1
 wwv-8722.com, 1
 wwvip88.com, 1
@@ -90269,6 +90235,7 @@ www.amazon.es, 1
 www.amazon.fr, 1
 www.amazon.it, 1
 www.amazon.nl, 1
+www.apollo-auto.com, 0
 www.banking.co.at, 0
 www.braintreepayments.com, 0
 www.capitainetrain.com, 0
@@ -90310,7 +90277,7 @@ www.org.gg, 1
 www.paypal.com, 0
 www.python.org, 1
 www.re, 1
-www.rememberthemilk.com, 1
+www.rememberthemilk.com, 0
 www.sb, 1
 www.simbolo.co.uk, 0
 www.simple.com, 0
@@ -90405,9 +90372,9 @@ x00738.com, 1
 x00776.com, 1
 x00786.com, 1
 x0r.be, 1
-x10006.com, 1
-x10007.com, 1
-x10008.com, 1
+x10006.com, 0
+x10007.com, 0
+x10008.com, 0
 x13.com, 1
 x1616.tk, 1
 x17.cafe, 1
@@ -90470,7 +90437,7 @@ x6729.co, 1
 x69.biz, 1
 x6957.co, 1
 x6r3p2yjg1g6x7iu.myfritz.net, 1
-x7008.com, 1
+x7008.com, 0
 x7713.com, 1
 x7718.com, 1
 x7719.com, 1
@@ -90526,12 +90493,12 @@ x81xx.com, 1
 x81yy.com, 1
 x81zz.com, 1
 x82365.com, 1
-x9015.com, 1
+x9015.com, 0
 x9016.com, 1
-x9017.com, 1
+x9017.com, 0
 x9297.co, 1
-x9701.com, 1
-x9718.com, 1
+x9701.com, 0
+x9718.com, 0
 x9728.co, 1
 x98d.com, 1
 x98e.com, 1
@@ -90570,6 +90537,7 @@ xab789.com, 1
 xab799.com, 1
 xab899.com, 1
 xaba.tk, 1
+xabifk.com, 1
 xacker.tk, 1
 xaffit.com, 1
 xahbspl.com, 1
@@ -90697,14 +90665,10 @@ xbdmov.com, 1
 xbertschy.com, 1
 xbjt11.com, 1
 xbjt2.com, 1
-xbjt22.com, 1
 xbjt3.com, 1
 xbjt33.com, 1
-xbjt5.com, 1
-xbjt55.com, 1
 xbjt66.com, 1
 xbjt666.com, 1
-xbjt7.com, 1
 xbjt77.com, 1
 xblau.com, 1
 xbots.tk, 1
@@ -90858,7 +90822,7 @@ xiamuzi.com, 1
 xiangblog.com, 1
 xianguocy.com, 1
 xiangweiqing.co.uk, 1
-xiangwenquan.me, 1
+xiangwenquan.me, 0
 xianjianruishiyouyiyuan.com, 1
 xiao-sheng.gq, 1
 xiaocg.xyz, 1
@@ -91120,6 +91084,7 @@ xn--3lqp21gwna.cn, 1
 xn--3st814ec8r.cn, 1
 xn--3stv82k.hk, 1
 xn--3stv82k.tw, 1
+xn--43-6kc4be0fbz.xn--p1ai, 1
 xn--48jwg508p.net, 1
 xn--4brt03c.xn--io0a7i, 1
 xn--4kro7fswi.xn--6qq986b3xl, 1
@@ -91318,7 +91283,6 @@ xn--keditr-0xa.biz, 1
 xn--kkcon-fwab.nz, 1
 xn--kl-oja.is, 1
 xn--klmek-0sa.com, 1
-xn--krpto-lva.de, 1
 xn--ktha-kamrater-pfba.se, 1
 xn--kuerbiskernl-fjb.de, 1
 xn--l8js6h476m.xn--q9jyb4c, 1
@@ -91357,6 +91321,7 @@ xn--n8j7dygrbu0c31a5861bq8qb.com, 1
 xn--n8jp5083dnzs.net, 1
 xn--n8jtcugp92n4wc738f.net, 1
 xn--nda.fit, 1
+xn--nicieri-b4a.ro, 1
 xn--nidar-tib.org, 1
 xn--nide-loa.ee, 1
 xn--nordlicht-hrnum-jtb.de, 1
@@ -91457,6 +91422,7 @@ xn--zr9h.cf, 1
 xn--zr9h.ga, 1
 xn--zr9h.ml, 1
 xn--zr9h.tk, 1
+xn--zsr042b.fun, 1
 xn5.de, 1
 xnaas.info, 1
 xnativi.pl, 1
@@ -91464,7 +91430,7 @@ xnet-x.net, 1
 xnetwork.ml, 1
 xninja.xyz, 1
 xnix.tk, 1
-xnode.org, 1
+xnode.org, 0
 xntrik.wtf, 1
 xnu.kr, 1
 xo.tc, 1
@@ -91500,7 +91466,6 @@ xpertairctx.com, 1
 xpertairtx.com, 1
 xpertairwaco.com, 1
 xpertcube.com, 1
-xpiuat.global, 1
 xpj000444.com, 1
 xpj000555.com, 1
 xpj000666.com, 1
@@ -91579,6 +91544,7 @@ xstreamable.com, 1
 xsuper.net, 1
 xtaboo3d.com, 1
 xtarget.ru, 1
+xtensio.com, 1
 xtips.us, 1
 xtom.africa, 1
 xtom.al, 1
@@ -91648,7 +91614,6 @@ xtremealaskainsulation.com, 1
 xtremebouncepartyhire.com.au, 1
 xtremecoatingtechnologies.com, 1
 xtremegaming.it, 1
-xtrememidlife.nl, 1
 xtronics.com, 1
 xts.bike, 1
 xts3636.net, 1
@@ -91720,6 +91685,7 @@ xy7272.com, 1
 xy7373.com, 1
 xybabyshop.com, 1
 xybnb.com, 1
+xyconsultoresasociados.com, 1
 xyenon.bid, 1
 xyfun.net, 0
 xyj22.com, 1
@@ -91728,6 +91694,7 @@ xyloefarmoges.gr, 1
 xyndrac.net, 0
 xynta.ch, 1
 xyrexwolf-sebastien-izambard.tk, 1
+xyuya.com, 1
 xywing.com, 1
 xyzulu.hosting, 1
 xyzyz.xyz, 1
@@ -91737,7 +91704,6 @@ xzclip.cn, 1
 xzibits.com, 1
 xztech.co, 1
 xzy.es, 0
-y.gy, 1
 y09a.com, 0
 y09app.com, 0
 y09app.vip, 0
@@ -91948,7 +91914,7 @@ yalcinkaya.ninja, 0
 yalecleaners.com, 1
 yallamotor.com, 1
 yalook.com, 1
-yama.su, 1
+yama.su, 0
 yamadaya.tv, 1
 yamal-online.ml, 1
 yamal159263.ml, 1
@@ -91980,11 +91946,13 @@ yangmaodang.org, 1
 yangmi.blog, 1
 yangruixin.com, 1
 yanik.info, 1
+yanjicg.com, 1
 yann.tw, 1
 yanngraf.ch, 0
 yannic.world, 0
 yannick.cloud, 1
 yannickb.de, 1
+yannickkordel.eu, 1
 yannickvdvelde.tk, 1
 yanniclandsmann.de, 1
 yannik-buerkle.de, 1
@@ -91998,6 +91966,7 @@ yans.io, 1
 yanservices.be, 1
 yantox.com, 1
 yantrasthal.com, 1
+yanwo.com.tw, 1
 yao-in.com, 1
 yao-in.net, 1
 yao28.com, 1
@@ -92193,6 +92162,7 @@ yeyi.site, 1
 yezishurb.site, 1
 yf128.cc, 1
 yfengs.moe, 1
+yg-crew.eu, 1
 ygets.com, 1
 yggdar.ga, 1
 ygm.org.uk, 1
@@ -92257,7 +92227,6 @@ yjsoft.me, 1
 yjsp.tv, 1
 yjsp07.com, 1
 yjsp333.com, 1
-yjsp45.com, 1
 yjst.cn, 1
 yjsw.sh.cn, 1
 ykhut.com, 1
@@ -92300,6 +92269,7 @@ yoba.co.uk, 1
 yobai-grouprec.jp, 1
 yobasystems.co.uk, 1
 yobbelwobbel.de, 0
+yobda.tk, 1
 yobniyulyu.tk, 1
 yobst.tk, 0
 yocto.xyz, 1
@@ -92310,7 +92280,6 @@ yoga-bad-toelz.de, 1
 yoga-in-aying.de, 1
 yoga-prive.de, 1
 yoga-school.xyz, 1
-yoga-schwerin.de, 1
 yoga-zentrum-narayani.de, 1
 yoga.is-an-engineer.com, 1
 yogacentric.co.uk, 1
@@ -92332,11 +92301,13 @@ yogshrihealing.com, 1
 yohanesmario.com, 1
 yoitoko.city, 1
 yoitsu.moe, 1
+yojanahub.com, 1
 yojnaa.com, 1
 yokoda.okinawa, 1
 yokohama-legaloffice.jp, 1
 yokone3-kutikomi.com, 1
 yolandgao.me, 1
+yolifestylenow.online, 1
 yolo-csgo.com, 1
 yolo.jetzt, 1
 yolobert.de, 1
@@ -92347,6 +92318,7 @@ yolops.net, 1
 yoloyolo.top, 1
 yombo.net, 1
 yomena.in, 1
+yomi.moe, 1
 yon.co.il, 1
 yonema.com, 1
 yongbin.org, 1
@@ -92381,8 +92353,8 @@ yoticonnections.com, 1
 yotilabs.com, 1
 yotta-zetta.com, 1
 yotubaiotona.net, 1
-you.com.br, 1
 you2you.fr, 1
+youbehero.com, 1
 youber.cz, 1
 youc.ir, 1
 youcanfinance.com.au, 1
@@ -92418,6 +92390,7 @@ youngauthentic.cf, 1
 youngdogs.org, 1
 youngmodelsagency.tk, 1
 youngpeopleunited.co.uk, 1
+youngsigncompany.com, 1
 youngsoad.com, 1
 youngsook.com, 1
 youngsook.org, 1
@@ -92455,7 +92428,6 @@ yourconscious.life, 1
 yourcopywriter.it, 1
 yourdailyalerts.net, 1
 yourdemowebsite.ml, 1
-yourdomain.host, 0
 yourdrive.tk, 1
 youreallyneedthis.co, 1
 youregeeks.com, 1
@@ -92539,7 +92511,6 @@ yspa.tv, 1
 ystream.tv, 1
 ysun.xyz, 1
 ysuna.xyz, 1
-yt220.com, 1
 yt605.com, 1
 yt606.com, 1
 yt629.com, 1
@@ -92703,6 +92674,7 @@ yuxiangyuan.com, 1
 yuxuan.org, 1
 yuy.info, 1
 yuyantang.club, 1
+yuyiyang.eu.org, 1
 yuyo.com, 1
 yuzei.tk, 1
 yuzu-tee.de, 1
@@ -92714,6 +92686,7 @@ yveslegendre.fr, 0
 yvesx.com, 1
 yvonnehaeusser.de, 1
 yvonnethomet.ch, 1
+ywyz.cc, 1
 ywyz.tech, 1
 yxt521.com, 1
 yxzero.xyz, 1
@@ -92757,7 +92730,6 @@ z00228.com, 1
 z0rro.net, 1
 z1h.de, 1
 z2a4.com, 1
-z30365.com, 1
 z36533.com, 1
 z36594.com, 1
 z3u5.net, 1
@@ -93040,6 +93012,7 @@ zadroweb.com, 1
 zaem.tv, 1
 zaferaniehearing.com, 1
 zaffke.co, 1
+zagainov.com, 1
 zaghyr.org, 1
 zagruz.tk, 1
 zahe.me, 1
@@ -93066,6 +93039,7 @@ zaimexpress.cf, 1
 zaimi.ml, 1
 zaimin.ga, 1
 zaimlime.ga, 1
+zaimponuj.pl, 1
 zaimvkredit2.gq, 1
 zaimvkredit3.ga, 1
 zaimvkredit3.gq, 1
@@ -93123,7 +93097,6 @@ zambranopublicidadvideo.com, 1
 zamenim.tk, 1
 zamok-love.tk, 1
 zamok.cf, 1
-zamor.com.br, 1
 zamow.co, 1
 zandcell.com, 1
 zander.dk, 1
@@ -93171,7 +93144,6 @@ zaufanatrzeciastrona.pl, 1
 zavarkin.tk, 1
 zavec.com.ec, 0
 zavedu.org, 1
-zavetaji.lv, 1
 zawo-electric.de, 1
 zayats.tk, 1
 zaym.tk, 1
@@ -93442,7 +93414,6 @@ zenlogic.com, 1
 zenluxuryliving.com, 1
 zenmail.ga, 1
 zenmate.com.tr, 1
-zenmod.in.rs, 1
 zeno-dev.com, 1
 zenofa.co.id, 1
 zenrtal-online-russia.ml, 1
@@ -93497,6 +93468,7 @@ zerozero.gq, 1
 zertif.info, 1
 zertitude.com, 1
 zeryn.net, 1
+zesgoes.nl, 1
 zespia.tw, 1
 zestadionu.pl, 1
 zestylemon.co.uk, 1
@@ -93516,10 +93488,8 @@ zevelev.net, 1
 zevenbergenbos.tk, 1
 zewtie.com, 1
 zf1898.com, 1
-zfast.com.br, 1
 zfg.li, 1
 zfj.hk, 1
-zfj.la, 1
 zfly.me, 1
 zfo.gg, 0
 zfree.co.nz, 1
@@ -93647,6 +93617,7 @@ zillertaleralpen.net, 1
 zilon.com.co, 1
 zilore.com, 1
 zilsen.com, 1
+zilsoft.net, 1
 zilv.life, 1
 zima.io, 1
 zimaoxy.com, 1
@@ -93662,7 +93633,7 @@ zingarastore.com, 1
 zingjerijk.nl, 1
 zinglix.xyz, 1
 zings.eu, 1
-zinniamay.com, 1
+zinniamay.com, 0
 zinniazorgverlening.nl, 1
 zinnowitzer-ferienwohnung.de, 1
 zinoui.com, 1
@@ -93674,6 +93645,7 @@ zipextractor.com, 1
 zipfworks.com, 1
 zipkey.de, 1
 ziqijiang.com, 0
+zir-online.com, 1
 zircode.com, 1
 zirka24.net, 1
 ziroh.be, 1
@@ -93954,6 +93926,7 @@ zombmage.tk, 1
 zomerschoen.nl, 1
 zomiac.pp.ua, 1
 zona-bellepop.tk, 1
+zonaairsoft.com, 1
 zonadigital.co, 1
 zonaperu.tk, 1
 zonatelevision.tk, 1
@@ -93975,6 +93948,7 @@ zoogbook.ml, 1
 zoohaus.de, 1
 zooish.net, 1
 zook.systems, 1
+zook.tk, 1
 zoola.io, 1
 zoological-gardens.eu, 1
 zoom.earth, 1
@@ -94013,6 +93987,7 @@ zovirax-cream.ml, 1
 zowe.ru, 1
 zowedo.com, 1
 zoyride.com, 1
+zoznamrealit.sk, 1
 zozzle.co.uk, 1
 zp.do, 1
 zp25.ninja, 1
@@ -94066,6 +94041,7 @@ zukix.com, 1
 zula.africa, 1
 zulaoyun.ml, 1
 zulu.ro, 1
+zuluconnect.net, 1
 zum-baur.de, 1
 zum-ziegenhainer.de, 1
 zumba.com, 1
@@ -94077,7 +94053,6 @@ zundapp.one, 1
 zundapp529.nl, 1
 zundappachterhoek.nl, 1
 zunlong0.com, 1
-zunlong918.net, 1
 zuolan.me, 0
 zup.me, 1
 zupago.pe, 1
diff --git a/security/manager/ssl/tests/unit/test_osreauthenticator.js b/security/manager/ssl/tests/unit/test_osreauthenticator.js
index 5bcde2afc6a9..01784a5fef7e 100644
--- a/security/manager/ssl/tests/unit/test_osreauthenticator.js
+++ b/security/manager/ssl/tests/unit/test_osreauthenticator.js
@@ -4,20 +4,24 @@
 "use strict";
 
 // Tests nsIOSReauthenticator.asyncReauthenticateUser().
-// Currently this always resolves to false on all platforms. As this gets implemented on various
-// platforms, running this rest will result in a prompt from the OS. Consequently, we won't be able
+// As this gets implemented on various platforms, running this test
+// will result in a prompt from the OS. Consequently, we won't be able
 // to run this in automation, but it will help in testing locally.
 add_task(async function test_asyncReauthenticateUser() {
   const reauthenticator = Cc[
     "@mozilla.org/security/osreauthenticator;1"
   ].getService(Ci.nsIOSReauthenticator);
   ok(reauthenticator, "nsIOSReauthenticator should be available");
+  const EXPECTED = false; // Change this variable to suit your needs while testing.
   ok(
-    !(await reauthenticator.asyncReauthenticateUser(
-      "this is the prompt string",
-      "this is the caption string",
-      null
-    )),
-    "nsIOSReauthenticator.asyncReauthenticateUser always resolves to false for now"
+    (
+      await reauthenticator.asyncReauthenticateUser(
+        "this is the prompt string",
+        "this is the caption string",
+        null
+      )
+    )[0] == EXPECTED,
+    "nsIOSReauthenticator.asyncReauthenticateUser should return a boolean array with the first item being the authentication result of: " +
+      EXPECTED
   );
 });
diff --git a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
index db80f007bf38..40501bff581f 100644
--- a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
+++ b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
@@ -32,6 +32,10 @@
 #include "sandbox/win/src/security_level.h"
 #include "WinUtils.h"
 
+#if defined(MOZ_LAUNCHER_PROCESS)
+#  include "mozilla/LauncherRegistryInfo.h"
+#endif  // defined(MOZ_LAUNCHER_PROCESS)
+
 namespace mozilla {
 
 sandbox::BrokerServices* SandboxBroker::sBrokerService = nullptr;
@@ -300,6 +304,16 @@ bool SandboxBroker::LaunchApp(const wchar_t* aPath, const wchar_t* aArguments,
       TerminateProcess(targetInfo.hProcess, 1);
       CloseHandle(targetInfo.hThread);
       CloseHandle(targetInfo.hProcess);
+
+#if defined(MOZ_LAUNCHER_PROCESS)
+      // The launcher process had started the browser process successfully, but
+      // the browser process failed start to a content process.  We're entering
+      // into a situation where the browser is opened without content processes.
+      // To stop it next time, we disable the launcher process.
+      LauncherRegistryInfo regInfo;
+      Unused << regInfo.DisableDueToFailure();
+#endif  // defined(MOZ_LAUNCHER_PROCESS)
+
       return false;
     }
   } else {
diff --git a/services/settings/dumps/blocklists/addons.json b/services/settings/dumps/blocklists/addons.json
index 3520bf72b9cf..bc1eb62cedbd 100644
--- a/services/settings/dumps/blocklists/addons.json
+++ b/services/settings/dumps/blocklists/addons.json
@@ -1 +1 @@
-{"data":[{"guid":"{171cdcfa-d6d3-4bc2-8e5d-dfcbb67c7695}","prefs":[],"schema":1585597291445,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625509","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Sushkom AV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a51c888f-234f-4f0b-a76c-c0a036bfa6ca","last_modified":1585730548574},{"guid":"{b7410e57-0452-47d5-a7cf-a1a91e7fd0b7}","prefs":[],"schema":1585424490920,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625922","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa5e3c2-1be6-4eb9-9357-f2d0686448be","last_modified":1585575900465},{"guid":"/^((\\{e2e34cff-c7d2-4c87-8195-d206ac928969\\})|(\\{aea3f9d0-909d-4c39-9282-25b11aa29d61\\})|(\\{ec5c4eed-0275-4148-a7f0-b21c05121703\\}))$/","prefs":[],"schema":1585158977245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625025","why":"This add-on violates Mozilla's add-on policies by using a deceptive name or collecting ancillary user data.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"034951cb-7614-4202-af35-18123476eb03","last_modified":1585238797372},{"guid":"/^((\\{927f6d6a-104f-4e69-b99a-e62e856899d9\\})|(\\{edf2d18c-ba07-4f30-bd59-85520b7259d8\\})|(\\{2128e9bc-aa97-4f9e-9327-bdce611538fb\\})|(\\{41a71134-b81e-49c5-be44-154c1b981153\\})|(\\{e00696fa-7731-40c6-81f1-5507d0435347\\})|(\\{f6dee727-c6cf-4d4a-b108-d59c3d9723ce\\})|(\\{48935666-26c5-484a-ade3-1660eca6a219\\})|(\\{06b9fcaa-45df-4fb3-a8fa-775d68690f5b\\})|(jid1-4P0kohSJxU1qGa@jetpack)|(jid1-93WyvptyvzGATw@jetpack)|(addon@ytdownloader1\\.info)|(\\{f4817c52-46ac-4b98-b682-f900701c5778\\}))$/","prefs":[],"schema":1585177209604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625186","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abcf90de-7322-4232-a59c-06e4b3a33c68","last_modified":1585238797365},{"guid":"/^ext@bettersurfplus$/","prefs":[],"schema":1585140126652,"blockID":"i506","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-10T15:10:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b4da06d2-a0fd-09b6-aadb-7e3b29c3be3a","last_modified":1585158976536},{"guid":"/^((\\{7aeae561-714b-45f6-ace3-4a8aed6e227b\\})|(\\{01e86e69-a2f8-48a0-b068-83869bdba3d0\\})|(\\{77f5fe49-12e3-4cf5-abb4-d993a0164d9e\\}))$/","prefs":[],"schema":1585140060946,"blockID":"i436","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891606","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, changing Firefox default settings and not reverting them on uninstall. If you want to continue using this add-on, it can be enabled in the Add-ons Manager.","name":"Visual Bee","created":"2013-08-09T15:04:44Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad6dc811-ab95-46fa-4bff-42186c149980","last_modified":1585158976531},{"guid":"/^((\\{0b24cf69-02b8-407d-83db-e7af04fc1f3e\\})|(\\{6feed48d-41d4-49b8-b7d6-ef78cc7a7cd7\\})|(\\{8a0699a0-09c3-4cf1-b38d-fec25441650c\\}))$/","prefs":[],"schema":1585138327934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434759","why":"These add-ons use remote scripts to alter popular sites like Google or Amazon.","name":"Malicious remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ffc62d-40c4-43ac-aa3f-7240978d0ad0","last_modified":1585158976522},{"guid":"/^(({41c14ab8-9958-44bf-b74e-af54c1f169a6})|({78054cb2-e3e8-4070-a8ad-3fd69c8e4707})|({0089b179-8f3d-44d9-bb18-582843b0757a})|({f44ddcb4-4cc0-4866-92fa-eefda60c6720})|({1893d673-7953-4870-8069-baac49ce3335})|({fb28cac0-c2aa-4e0c-a614-cf3641196237})|({d7dee150-da14-45ba-afca-02c7a79ad805})|(RandomNameTest@RandomNameTest\\.com)|(corpsearchengine@mail\\.ru)|(support@work\\.org))$/","prefs":[],"schema":1585145454357,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a123214-b4b6-410c-a061-bbaf0d168d31","last_modified":1585158976514},{"guid":"/^((@mixclouddownloader)|(all-down@james\\.burrow)|(d\\.lehr@chello\\.at)|(easy-video-downloader@addonsmash)|(easy-youtube-mp3@james\\.burrow)|(gid@addonsmash)|(gmail_panel@addon_clone)|(idm@addonsmash)|(image-picka@addonsmash)|(instant-idm@addon\\.host)|(jdm@awesome\\.addons)|(open-in-idm@addonsmash)|(open-in-idm@james\\.burrow)|(open-in-vlc@awesome\\.addons)|(saveimage@addonsmash)|(thundercross@addonsmash)|(vk-download@addon\\.host)|(vk-music-downloader@addonsmash)|(whatsapp_popup@addons\\.clone)|(ytb-down@james\\.burrow)|(ytb-mp3-downloader@james\\.burrow)|(\\{0df8d631-7d88-401e-ba7e-af1425dded8a\\})|(\\{3c74e141-1993-4c04-b755-a66dd491bb47\\})|(\\{5cdd95c7-5d92-40c5-8e2a-8c52c90191d9\\})|(\\{40efedc0-8e48-404a-a779-f4016b25c0e6\\})|(\\{53d605ce-599b-4352-8a06-5e594b3d1822\\})|(\\{3697c1e8-27d7-4c63-a27e-ac16191a1545\\})|(\\{170503FA-3349-4F17-BC86-001888A5C8E2\\})|(\\{649558df-9461-4824-ad18-f2d4d4845ac8\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{6e7624fa-7f70-4417-93db-1ec29c023275\\})|(\\{b1aea1f1-6bed-41ef-9679-1dfbd7b2554f\\})|(\\{b9acc029-d62b-4d23-b921-8e7aea34266a\\})|(\\{b9b59e13-4ac5-4eff-8dbe-c345b7619b3c\\})|(\\{b0186d2d-3126-4537-9186-a6f198547901\\})|(\\{b3e8fde8-6d97-4ac3-95e0-57b797f4c56b\\})|(\\{e6a9a96e-4a08-4719-b9bd-0e91c35aaabc\\})|(\\{e69a36e6-ee12-4fe6-87ca-66b77fc0ffbf\\})|(\\{ee3601f1-78ab-48bf-89ae-0cfe4aed1f2e\\})|(\\{f4ce48b3-ad14-4900-86cb-4604474c5b08\\})|(\\{f5c1262d-b1e8-44a4-b820-a834f0f6d605\\}))$/","prefs":[],"schema":1585149409880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476020","why":"Add-ons repeatedly violated several of review policies.","name":"Several youtube downloading add-ons and others"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"ae8ae617-590d-430b-86d4-16364372b67f","last_modified":1585158976511},{"guid":"/^(({a4d84dae-7906-4064-911b-3ad2b1ec178b})|({d7e388c5-1cd0-4aa6-8888-9172f90951fb})|({a67f4004-855f-4e6f-8ef0-2ac735614967})|({25230eb3-db35-4613-8c03-e9a3912b7004})|({37384122-9046-4ff9-a31f-963767d9fe33})|({f1479b0b-0762-4ba2-97fc-010ea9dd4e73})|({53804e15-69e5-4b24-8883-c8f68bd98cf6})|({0f2aec80-aade-46b8-838c-54eeb595aa96})|({b65d6378-6840-4da6-b30e-dee113f680aa})|({e8fc3f33-14b7-41aa-88a1-d0d7b5641a50})|({c49ee246-d3d2-4e88-bfdb-4a3b4de9f974}))$/","prefs":[],"schema":1585138540335,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1484536","why":"Add-ons that don't respect user choice by overriding search.","name":"Search hijacking add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01c22882-868b-43e1-bb23-29d5dc7bc11b","last_modified":1585158976508},{"guid":"/^((\\{0b47ef96-f7c9-4017-97b6-51c1280eaf6e\\})|(\\{2c65ed54-5215-4f10-a7bd-39445a6450fd\\})|(\\{80dbc30a-168b-4a18-bd5b-51f9b1807d7f\\})|(\\{93a106e3-e70b-48af-9282-30e3d6c87af9\\})|(\\{2120dc72-6040-45ed-9655-aaabed57fc93\\})|(\\{c3c9f1ee-4192-4d5a-b753-a62c19b16c98\\})|(\\{d0fc8cf9-66aa-4f08-8c96-3f882c2e9c9b\\})|(\\{da69b9e2-c2d1-4b90-93be-4cc3976e452d\\})|(\\{eb70585e-76bb-4eae-9f06-7fc5efbc877e\\})|(fairshare-unlock@burstworks-test\\.com)|(fairshare-unlock@burstworks\\.com)|(freevideodownloader-hosted@funnerapps\\.com)|(freevideodownloader-test-hosted@funnerapps\\.com)|(gmo-panel@ddmr\\.com)|(helper-sig@savefrom\\.net)|(ihmgiclibbndffejedjimfjmfoabpcke@chrome-store-foxified--?\\d+)|(ihmgiclibbndffejedjimfjmfoabpcke@chromeStoreFoxified--?\\d+)|(panel-branded@ddmr\\.com)|(panel-canadaTalkNow@ddmr\\.com)|(panel-community@ddmr\\.com)|(panel-digaYgane@ddmr\\.com)|(panel-ecglobal@ddmr\\.com)|(panel-fusionCash@ddmr\\.com)|(panel-grindaBuck@ddmr\\.com)|(panel-measurement@ddmr\\.com)|(panel-mysoapbox@ddmr\\.com)|(panel-ofernation@ddmr\\.com)|(panel-rewarding@ddmr\\.com)|(panel-superpay@ddmr\\.com)|(panel-zippy@ddmr\\.com)|(test_fairshare-unlock@burstworks\\.com)|(test-fairshare-unlock@burstworks\\.com)|(vindale@ddmr\\.com))$/","prefs":[],"schema":1585151995695,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562965","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04c27082-2b78-4005-a6c5-8e0a13f83288","last_modified":1585158976505},{"guid":"/^((\\{3c8970fa-1340-45ad-82fe-81f3beccfbdc\\})|(\\{4ab99b95-4d05-438c-8a3e-adb1b3fe8d81\\})|(\\{7f87a05d-dba7-448e-9af2-ee0f4a294c01\\})|(\\{59a219a8-45cd-458d-9b3e-8d86c19dfc31\\})|(\\{79f4bfc7-b1da-4dc4-85cc-ecbcc5dd152e\\})|(\\{484dc5ad-4d6a-4ee4-91b7-b5b8166e6b3d\\})|(\\{2643d75f-9d64-47ef-9c23-78f0f055c7b8\\})|(\\{76399bf2-8354-4b11-bf43-6c863b195b1d\\})|(\\{110791c0-2883-4301-8214-90be7549df43\\})|(\\{a33e004d-2ac0-4d77-8e14-50780bc231a3\\})|(\\{aaaa5840-6b3b-49d8-92c2-9696798c4e2a\\})|(\\{bfc55377-7210-4e7a-828f-6fdb9df02847\\})|(\\{c6c78b9a-370d-49c5-b9c6-96d7e38861c5\\})|(\\{c115eb3a-4746-472b-8f1f-d8596c49b3b6\\})|(\\{deaa22e5-33ed-440f-a734-c3175e6228a7\\})|(\\{e34d5840-6b3b-49d8-92c2-9696798c4e2a\\})|(aapbdbdomjkkjkaonfhkkikfgjllcleb@[cC]hrome-?[sS]tore-?[fF]oxified--?((\\d+)|(unsigned)))|(babelfox_client@rami)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--?\\d+)|(bridge-translate-app@chrome-store-foxified--?\\d+)|(dephbpajmknbniclommefdlnflkfnpgh@chrome-store-foxified--?\\d+)|(extension@newtab\\.biz)|(generated-74o6bact7xu7y32fvfju4s@chrome-store-foxified--?\\d+)|(generated-axbwzwbksnnig1ug9v5dly@chrome-store-foxified--?\\d+)|(googletranslateelement@developer\\.org)|(icdahkkjdchifpnbebileaelbcgipepe@chrome-store-foxified--?\\d+)|(ifgljfjnflaadalpmkkgdailepedeehd@chrome-store-foxified--?\\d+)|(knpgbkpddpcepnloiijojmgbdhihkjkl@chrome-store-foxified--?\\d+)|(translate-4@chrome-store-foxified--?\\d+))$/","prefs":[],"schema":1585157952678,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1593243","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"11fd123a-e67d-44ab-909f-b776ea2e8d0a","last_modified":1585158976501},{"guid":"/^((graph-helper@thegraph\\.co)|(lab@uneg\\.edu\\.ve)|(ponyhoofbeta@ponyhoof\\.little\\.my)|(\\{75080f0e-3dbe-455d-a1d1-33850f36e2ff\\})|(\\{27883109-b35d-4b6b-9e5b-89b26496fb5e\\})|(\\{cf407827-6739-4514-ad2e-8af25c0e1d97\\})|(\\{c9efb61c-f0bb-42a2-a3e5-ca75da67007c\\})|(\\{c671463f-7bd2-4a35-839c-2097aa52b1d2\\})|(\\{83d16411-a3d6-4268-a95f-1e9abcbdd521\\})|(\\{3835f36e-a8a8-4247-a731-6e1ed7d52c5f\\})|(\\{8d13fb0d-e6b6-4301-9865-3c438a1a347f\\})|(\\{21262c5a-3c8e-46a1-b504-7d16ccddf656\\})|(\\{3e1f3207-8b6c-493b-91f3-0eb43326e273\\})|(\\{9fe1f0bb-c24d-4eab-90f5-9471905132f6\\})|(\\{8b189632-155f-4478-bf51-285c3a54de8c\\})|(\\{3854ac9e-7c1c-4d2a-84f7-edc8656ac7ae\\})|(\\{ec82c419-3cc7-4789-bad0-a069ef80211e\\})|(\\{C0D03FFD-391A-41CE-ACA2-64557D9440CC\\})|(\\{D4A86045-8722-4289-93C4-7C80970F0E7D\\})|(\\{5f23a0d5-ff0e-4e18-8afc-cf50c468ea1d\\})|(\\{6b67941f-2544-468d-b371-ad5c2d99687b\\})|(\\{d6a07a0c-cad7-4e08-987a-099c1add5fc4\\})|(web-signer@softplan\\.com\\.br)|(\\{251eec9f-108a-4864-960f-e07cee35a991\\})|(\\{9cd44027-9d26-4cbd-bfd9-da7eaa495261\\})|(\\{4244357f-568b-477b-802a-db9d6551a719\\})|(\\{1ed0819f-e210-4089-8e24-af2dba6451bb\\})|(\\{e02dba27-b975-4dcb-9adb-ea74ed6cd632\\})|(\\{1240d113-0410-418b-b99f-047aad6ddae3\\})|(\\{115d13bd-f95d-4a61-9dd7-fb3ab816a8dd\\})|(mydesires@mydesires\\.com)|(mesenvies@mesenvies\\.fr)|(\\{0f250607-4465-49bb-a56c-12c8514a3e7d\\})|(\\{12a290cc-2b60-4efb-96f0-dde41f27769d\\})|(\\{9ac03a7d-f80f-4868-8b95-35074f8cdf62\\})|(\\{ce1da0e5-133b-4828-8cbb-66c5ea97e78e\\})|(\\{0da8fe99-30f7-462c-85d0-db66f4f70a97\\})|(\\{9aca9f23-d9aa-4680-9dcb-837291ff6854\\})|(\\{d86d1438-56ef-4294-ab9b-ac1f2c6420e6\\})|(\\{6280d3e5-a444-4823-be7d-317090d3b175\\})|(\\{faccc7b3-b0c7-4fcc-9d4d-b12721ea7f0d\\})|(\\{b84f4632-26f1-4fb5-9082-1f2ca7685afa\\})|(\\{a543f841-3613-4a52-bce8-58bd6e7eb100\\})|(\\{5b1c9b32-9dd3-461c-85c6-bbac4ef2af19\\})|(\\{0207f077-7f95-47ba-b0f9-b356d456f914\\})|(teste@addon\\.com)|(\\{6da58723-1757-42a4-a2db-849f6159c880\\})|(\\{4a122670-da9d-4257-b2bc-27440af385af\\})|(\\{f39035e7-e7f6-4dc1-b13b-04d7a365ab41\\})|(\\{3b3201ca-d7a1-48ab-a89b-ad97cd688590\\})|(\\{bb0179bf-3435-4924-8ae5-19f35e7f1a7f\\})|(\\{d2f6e317-3957-4931-b9b1-6b3ebef25aab\\})|(luckypdf@luckypdfconverter\\.com)|(\\{755ae77a-2901-4177-99aa-ac3fe15974e0\\})|(\\{6e5cab8f-78da-45fe-90af-4cfaf3d95d0e\\})|(\\{cd0c26ad-5150-42cb-bec1-2da0db715a90\\})|(\\{357d3c5d-5c68-4943-b49e-df20c6ff931e\\})|(\\{8b5d6a2c-d18c-47b6-9b13-cebab7425838\\})|(\\{d26b38f2-1ec0-43d8-8d05-8e14a09955bc\\})|(\\{d3b4d997-cf97-4ffe-9401-3efcbc816fd9\\})|(\\{506848ee-e612-4d2f-8645-70c26e577efd\\})|(\\{c0272d15-248c-4f93-80cd-684c0f360da1\\})|(\\{7a478659-43ba-4054-8d67-9ad75f66f0f6\\})|(\\{351b37fb-6d84-4820-8dbe-a517d8f856ce\\})|(\\{f0031513-5b7e-4cc6-9a16-616c82e79d48\\})|(\\{adf2ee6b-ef1c-4350-b35f-369e6b0dc64a\\})|(\\{06a6425d-0e31-4703-a0e2-72d4a552477c\\})|(\\{6f8a85a2-d83b-4a2c-ac38-d06bf3fb1b92\\})|(\\{9d96147e-9418-4493-bedb-380bf065f8b0\\})|(\\{3055992b-3fda-44bf-9065-8514ea2c2acb\\})|(\\{602ade61-49fc-4a40-9287-53949c8f0462\\})|(\\{c28dd807-0b3f-4bc4-984c-ff9578202712\\})|(\\{495e077c-0015-4e70-80f3-4b1b71e9c866\\})|(\\{19ebc477-304c-4d75-990b-6d47c230c19d\\})|(\\{08df44a4-ef6a-4828-9ebe-a730dd47ee5e\\})|(allsigningoffline@nextsense\\.com)|(\\{cc304579-73e2-4fa7-9863-f1cda545e542\\})|(\\{bf0d9dc8-ca00-4bba-88a0-535e20b089ea\\})|(\\{00dd06ff-7392-449b-9e87-8a39c5f5cb05\\})|(\\{c8882c78-ee4f-4c9c-8380-ab8f1d333e0d\\})|(\\{1bf5b2e0-14aa-49a4-9642-d2f28bb44730\\})|(\\{8afde9a0-bd2d-48f4-939c-8e7ec4210085\\})|(\\{8bd4cf33-e9c2-4a9c-84f5-ef0f3a512c53\\})|(\\{390d4afb-83c3-4a8c-93a0-587f9c52eb10\\})|(\\{3624218a-2799-478f-84bf-8f6ddd4fe8f5\\})|(\\{5303ae90-10ef-4c9c-bc51-d7062883b9a1\\})|(vivoinforma@tutanota\\.com)|(\\{8e638a74-6131-40b9-b64e-4341cf67d491\\})|(\\{f9295774-e455-4986-832c-cc4863769e66\\})|(thisisummsstrikethroughhighlighting@example\\.com)|(frigate@loranrendel)|(\\{ff4dc908-b851-42b7-adee-d9a5bb1e6813\\})|(\\{3ec50eaf-e36b-4b26-b255-0d75abe112b9\\})|(@LmXEarthZoomToolOneShot)|(\\{91be62bd-8752-45bf-a20a-b6b2d4abf87e\\})|(cloud-support@wildfire\\.ai)|(YoutubeUploader@ArcAvalon\\.com)|(\\{2e3be1f1-fb5c-40fb-b578-d2c9184ce470\\}))$/","prefs":[],"schema":1585146642510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92ac1ebd-7dcd-4446-a7b3-7e359ad1c4b5","last_modified":1585158976498},{"guid":"/^((Smart_Search_voIhxkbgGH@www\\.convertmyfile\\.co)|(Smart_Search_vRIICPGhwx@www\\.job-portal\\.co)|(Smart_Search_wsRtgwiOcH@www\\.search-smart\\.live)|(Smart_Search_xCropjfsuc@www\\.searchsmart\\.live)|(Smart_Search_yCAOHFcvfi@www\\.smart-search\\.live)|(Smart_Search_yDaEiIzkQK@www\\.smartsearch\\.live)|(Smart_Search_yhCKmmAXWz@www\\.searchsmart\\.online)|(Smart_Search_yrwXRZHXLh@www\\.search-smart\\.online)|(Smart_Search_YXySavVGVt@www\\.search-smart\\.work)|(SMART_SEARCH_YZaevPNtHc@www\\.localweathertoday\\.net)|(Smart_Search_ZsEjqVBHGd@www\\.convertthefile\\.net)|(Smart_Searches_FuCzQWfGWa@www\\.smartsearches\\.co)|(SMART-SEARCH_sHhQFGpFhV@www\\.coupondealer\\.co)|(Smart-Search_UasOSUTNhv@www\\.map-buddy\\.net)|(Smart\\.Search_631e8da2146d6187149c9206fac1a89e@www\\.convertthepdf\\.co)|(Smart\\.Search_IfzjxIabfy@www\\.convertthepdf\\.co)|(SmartSearch_clone_DyqkuEZPRF@www\\.search-smart\\.co)|(SmartSearch_DSuyKfIhTM@www\\.convertmypdf\\.online)|(SmartSearch_gkOEsQztVd@www\\.search-smart\\.co)|(SmartSearch_ohUbxjDpNV@www\\.search-smart\\.co)|(Speed_Check_01c5dfe0109bc6cb0e711840b239846c@www\\.checkmyspeed\\.co)|(Speed_Check_07449674bdae85845b4fc92e2695caf3@www\\.checkmyspeednow\\.com)|(Speed_Check_2098fea3a2c7a807bdeb61111c2de48f@www\\.checkmyspeed\\.co)|(Speed_Check_2305caaa9793a7577aa6283a89da7971@www\\.checkmyspeednow\\.com)|(Speed_Check_25ae2975d89f06e814b2e421109be7ef@www\\.checkmyspeednow\\.com)|(Speed_Check_55750cbafa724e361805677e2c1a0ea7@www\\.checkmyspeednow\\.com)|(Speed_Check_56ad7958c2981e0f1cad6d4de2abcb4b@www\\.checkmyspeed\\.co)|(Speed_Check_616286717d187249f5d29d2bc8771294@www\\.checkmyspeednow\\.com)|(Speed_Check_87ec83e10e18545948a0d739589fa6c0@www\\.checkmyspeed\\.co)|(Speed_Check_917a4c229b30f0ac1bca0aa5a43f8f2e@www\\.checkmyspeednow\\.disabled\\.com)|(Speed_Check_94cbe40b6d2b11c86b07bbb606fe11e2@www\\.checkmyspeednow\\.com)|(Speed_Check_a4d8b86ff6fa408ee87b70d65c41d1dd@www\\.checkmyspeed\\.co)|(Speed_Check_cdeb8d6f1f2426379a89eac745d5853a@www\\.checkmyspeed\\.co)|(Speed_Check_clone_aqksrBHRvi@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_CrMqWRFYTl@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_ec2c77c7b610b83c9f6bef2573e4d3a1@www\\.checkmyspeed\\.co)|(Speed_Check_clone_IchkKEIlVC@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_nmRPlvUEJv@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_OczJkeuXDq@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_QlPnYtcPGo@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_RjaZbJQbEk@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_WPgSSdchao@www\\.checkmyspeed\\.co)|(Speed_Check_ed30669ac9901d20415ead7770db761a@www\\.speedchecktool\\.com)|(Speed_Check_FZSVtPegfX@www\\.checkmyspeed\\.co)|(Speed_Check_iQueDNOXmF@www\\.checkmyspeed\\.co)|(Speed_Check_LUlQBGtuOE@www\\.checkmyspeednow\\.com)|(Speed_Check_MNeDWiZeoo@www\\.checkmyspeed\\.co)|(Speed_Check_XckNwcWvNE@www\\.checkmyspeed\\.co)|(Speed_Check_xSObhPOTMw@www\\.checkmyspeed\\.co)|(Speed_Checker_Pro_260678188808c41791fdd9d9ed445802@www\\.speedcheckerpro\\.com)|(Speed_Checker_Pro_esgyoKewQa@www\\.speedcheckerpro\\.com)|(Speed_Test_Ace_0e5d46c255d8ceec71018d460c702e40@www\\.speedtestace\\.com)|(Speed_Test_Ace_b81323c0334e1c3f409c1dd14aa60f61@www\\.speedtestace\\.co)|(Speed_Test_Ace_clone_DKdXeTMeZx@www\\.speedtestace\\.co)|(Speed_Test_Ace_kcEikItaOC@www\\.speedtestace\\.co)|(Speed_Test_Ace_ppoJbdaucW@www\\.speedtestace\\.co)|(Speed_Test_Now_ZDIRLnXzms@speedtestnow\\.co)|(Speed_Test_OoJkZnYICK@www\\.speed-test\\.live)|(Speed_Test_uJpXMlaztD@www\\.testyourspeed\\.co)|(sportsbulletin@www\\.sportsupdates\\.co)|(sportseveryday@www\\.sportseveryday\\.co)|(sportseverydayco@www\\.sportseveryday\\.co)|(sportsupdates\\.website_SdCnLxLIxY@www\\.sportsupdates\\.website)|(Spot_Flight_Now_6b388ff946e79dc3fd82eec51958d550@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eb4c54758e45589d6039415632c1e319@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eTPyUPJmtK@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_UZIlZeQYAb@www\\.spotflightnow\\.com)|(Spot_Flight_Now_EtIsXJyXXm@www\\.spotflightnow\\.com)|(Spot_Flight_Now_f268f21c4c60f3e78601d20b97453943@www\\.spotflightnow\\.com)|(staging\\.checknetspeed\\.co_nREaqypDrX@staging\\.checknetspeed\\.co)|(Start_A_Career_RXEBmchKFm@www\\.jobs\\.startacareer\\.co)|(Stream_TV_Live_KrYxWrtCtv@www\\.streamtvlive\\.co))$/","prefs":[],"schema":1585146841367,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae4b574-f195-4f18-8bc0-c3b712e4316b","last_modified":1585158976495},{"guid":"/^((Easy_Doc_Converter_b4ab66ebed6d4f9148bd9024b5b45266@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_egpEGOXPkz@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_f5e570a648be4d82f02fa2106a21a43f@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_IteaxXKJex@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_jJGqUHYgCN@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KPOmYhpWMq@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KyppGVLzlw@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_PuJVSyMdMn@www\\.easydocconverter\\.com)|(Easy_Email_Center_clone_LWcJzWsabx@www\\.easyemailcenter\\.com)|(Easy_Email_Center_clone_WroHXxYaWe@www\\.easyemailcenter\\.com)|(Easy_Email_Center_fhZhWrvhNZ@www\\.easyemailcenter\\.com)|(Easy_Email_Checker_54b7a48dd3773a01313275df62afd4cf@www\\.easyemailchecker\\.net)|(Easy_Email_Plus_GqrjVlzgJP@www\\.easyemailplus\\.com)|(Easy_Forms_Finder_gmYexjlshO@www\\.easyformsfinder\\.com)|(Easy_Inbox_Access_clone_BHQcoGwBXJ@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_pXyLNbavvp@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_yVECZMgzTG@www\\.easyinboxaccess\\.com)|(Easy_Mail_Login_FRPUoJrXUl@www\\.easymail-login\\.co)|(Easy_Mail_Logins_AGDDyUpIjb@www\\.easymaillogin\\.co)|(Easy_Map_Finder_a811a7fb227baf4b89b3ed4d017fcfc4@www\\.easymapsfinder\\.com)|(Easy_Map_Tab_44b8d948ebfb6010e7fe17ad02606c6e@www\\.easymaptab\\.com)|(Easy_Map_Tab_rfqbzWtygp@www\\.easymaptab\\.com)|(Easy_Maps_VsjiCqbVfo@www\\.mapdirectionspront\\.co)|(Easy_Online_Recipe_IzyMoUNAGs@www\\.easyonlinerecipe\\.co)|(Easy_Online_Recipe_oEqObvsniN@www\\.easyonlinerecipe\\.net)|(Easy_Recipes_277ea1aa5aaed20cbb145291ebf0cdc1@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_35f61f2bee1a01e94edbbb868bbb66ca@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_5d97b38952cbd818b53669ee377f4a4e@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_JkInlZZXKJ@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_qwPPMUMPbm@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_VZjydpXYuD@www\\.dailyrecipesearch\\.net)|(Easy_Search_3ce2d360291c0435253c279a003f4bee@www\\.easy-search\\.co)|(Easy_Search_9259a3968f7a7a407cf8a9c5b5aac8b5@www\\.easy-search\\.co)|(Easy_Search_Access_41cd311e7ebb5abe48a68600a41b6a6e@www\\.easysearchaccess\\.com)|(Easy_Search_Access_zBaMiEnnEw@www\\.easysearchaccess\\.com)|(Easy_Search_bJrePoApTo@www\\.easy-search\\.co)|(Easy_Search_gFyxFnsAsY@www\\.easy-search\\.co)|(Easy_Search_Online_8d5692e3bf9af4e8d0fcb27b753b4bb0@www\\.easysearchonline\\.co)|(Easy_Search_Online_YJpastaXEE@www\\.easysearchonline\\.co)|(Easy_Search_Pro_edc3f4614998d63f6bddb8cddf1eca75@www\\.easysearchpro\\.co)|(Easy_Search_Pro_JDFkWEUATn@www\\.easysearchpro\\.co)|(Easy_Weather_Checker_b96bc45b78e94fcc92bbf66eabb4c7e0@www\\.easyweatherchecker\\.com)|(Easy_Weather_Checker_OZbmtCpDgx@www\\.easyweatherchecker\\.com)|(Easy_Weather_Forecast_6b2ee7704b4f8f93b4e4c42c707dadc1@www\\.easyweatherforecast\\.com)|(Easy_Weather_Forecast_pNIPnyHOJG@www\\.easyweatherforecast\\.com)|(EasyMailLogin\\.net_usETGyzdRX@www\\.easymaillogin\\.net)|(EasyOnlineRecipe\\.co_CVOjgBfTWs@www\\.easyonlinerecipe\\.co)|(EasyOnlineRecipe\\.net_icOMrzwKiN@www\\.easyonlinerecipe\\.net)|(EasySearchGo_JMJgGKKsKw@www\\.easysearchgo\\.com)|(Email_Access_7ad642481026e05b4ff4a7da92468bdb@www\\.accessmymails\\.co)|(Email_Access_JVuQrQxsXR@www\\.accessmymails\\.co)|(Email_Checker_MguwpDKJMd@www\\.easyemailchecker\\.net)|(Email_Inbox_Now_OVfDpBfbuk@www\\.emailinboxnow\\.com)|(Email_Login_CofCwMXmYY@www\\.easymaillogin\\.net)|(Email_Login_eVRzKHiywW@www\\.easymaillogin\\.net)|(Email_Login_KABgNaGQJZ@www\\.easymaillogin\\.net)|(Email_Login_Pro_80b99340e1bcedf5f0a1f4d1345538e1@www\\.emailloginpro\\.com)|(Email_Login_Pro_SHHHqfDSTO@www\\.emailloginpro\\.com)|(Email_Login_Pro_xvgHLfPbBB@www\\.loginemailpro\\.net)|(Email_Tab_13d31aa17a541c3018f2625a09486686@www\\.emailtab\\.co)|(Email_Tab_ZdbwsMpyuq@www\\.emailtab\\.co)|(Everyday_Astro_clone_bOSsysyaan@www\\.everydayastro\\.co)|(Everyday_Astro_CMqmHgpSTg@www\\.everydayastro\\.co)|(Everyday_Astro_dVNMgQmXws@www\\.everydayastro\\.online)|(Everyday_Astro_NHOKASspnT@www\\.everydayastro\\.online)|(Everyday_Astro_sDIIbCNITP@www\\.everydayastro\\.online)|(Everyday_Astro_xiJdwxnNom@www\\.everydayastro\\.online)|(Everyday_Astro_YGSUqIslKW@www\\.everyday-astro\\.com))$/","prefs":[],"schema":1585145745119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21ecfbe4-1255-4f86-b78c-c4fd06a6f197","last_modified":1585158976491},{"guid":"/^((\\{441a1a1f-ba4f-4f2e-ade8-88c2950323a6\\})|(\\{81faa316-ef9f-4fc9-9db8-af17eabc776b\\})|(\\{e2ee901b-44cb-430f-be5e-23ab0291d8f4\\})|(\\{d1e6ace8-9623-4a5d-a94f-81fd289fe834\\})|(\\{0de5c9e4-4488-489a-a130-0e192cc6bb08\\}))$/","prefs":[],"schema":1584906090910,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1624545","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user disclosure or consent.","name":"Add-ons redirecting requests"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9b936d20-0a13-42de-b735-11409c3e4881","last_modified":1585130632165},{"guid":"/^((\\{9263519f-ca57-4178-b743-2553a40a4bf1\\})|(\\{d97223b8-44e5-46c7-8ab5-e1d8986daf44\\})|(\\{0111c475-01e6-42ea-a9b4-27bed9eb6092\\})|(\\{36a4269e-4eef-4538-baea-9dafbf6a8e2f\\})|(\\{2cac0be1-10a2-4a0d-b8c5-787837ea5955\\})|(\\{6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4\\})|(\\{2134e327-8060-441c-ba68-b167b82ff5bc\\})|(\\{a3fbc8be-dac2-4971-b76a-908464cfa0e0\\})|(\\{de3b1909-d4da-45e9-8da5-7d36a30e2fc6\\})|(\\{02328ee7-a82b-4983-a5f7-d0fc353698f0\\})|(\\{28044ca8-8e90-435e-bc63-a757af2fb6be\\})|(\\{63df223d-51cf-4f76-aad8-bbc94c895ed2\\})|(\\{3f4191fa-8f16-47d2-9414-36bfc9e0c2bf\\})|(\\{a0c54bd8-7817-4a40-b657-6dc7d59bd961\\})|(\\{f0b809eb-be22-432f-b26f-b1cadd1755b9\\})|(\\{919fed43-3961-48d9-b0ef-893054f4f6f1\\})|(\\{cd28aa38-d2f1-45a3-96c3-6cfd4702ef51\\})|(\\{829827cd-03be-4fed-af96-dd5997806fb4\\})|(\\{7d932012-b4dd-42cc-8a78-b15ca82d0e61\\})|(\\{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de\\})|(\\{a0ab16af-3384-4dbe-8722-476ce3947873\\})|(\\{23c65153-c21e-430a-a2dc-0793410a870d\\})|(\\{31680d42-c80d-4f8a-86d3-cd4930620369\\})|(\\{f4262989-6de0-4604-918f-663b85fad605\\})|(\\{e341ed12-a703-47fe-b8dd-5948c38070e4\\})|(\\{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\})|(\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{72c1ca96-c05d-46a7-bce1-c507ec3db4ea\\})|(\\{869b5825-e344-4375-839b-085d3c09ab9f\\})|(\\{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\})|(\\{df09f268-3c92-49db-8c31-6a25a6643896\\})|(\\{5f4e63e4-351f-4a21-a8e5-e50dc72b5566\\})|(\\{4479446e-40f3-48af-ab85-7e3bb4468227\\})|(\\{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\})|(\\{be37931c-af60-4337-8708-63889f36445d\\})|(\\{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\})|(\\{0432b92a-bfcf-41b9-b5f0-df9629feece1\\})|(\\{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\})|(\\{01166e60-d740-440c-b640-6bf964504b3c\\})|(\\{76ce213c-8e57-4a14-b60a-67a5519bd7a7\\})|(\\{226b0fe6-f80f-48f1-9d8d-0b7a1a04e537\\})|(\\{be981b5e-1d9d-40dc-bd4f-47a7a027611c\\})|(\\{37f8e483-c782-40ed-82e9-36f101b9e41f\\})|(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\})|(\\{7d5e24a1-7bef-4d09-a952-b9519ec00d20\\})|(\\{408a506b-2336-4671-a490-83a1094b4097\\})|(\\{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})|(\\{cf9d96ff-5997-439a-b32b-98214c621eee\\})|(\\{302ef84b-2feb-460e-85ca-f5397a77aa6a\\})|(\\{0c9970a2-6874-483b-a486-2296cfe251c2\\})|(\\{e5bc3951-c837-4c98-9643-3c113fc8cf5e\\})|(\\{93017064-dfd4-425e-a700-353f332ede37\\})|(\\{28092fa3-9c52-4a41-996d-c43e249c5f08\\})|(\\{a893296e-5f54-43f9-a849-f12dcdee2c98\\})|(\\{fc0d55bd-3c50-4139-9409-7df7c1114a9d\\})|(\\{c661c2dc-00f9-4dc1-a9f6-bb2b7e1a4f8d\\})|(\\{419be4e9-c981-478e-baa0-937cf1eea1e8\\})|(\\{449e185a-dd91-4f7b-a23a-bbf6c1ca9435\\})|(\\{1c981c7c-30e0-4ed2-955d-6b370e0a9d19\\})|(\\{9ce2a636-0e49-4b8e-ad17-d0c156c963b0\\})|(\\{a2de96bc-e77f-4805-92c0-95c9a2023c6a\\})|(\\{a42e5d48-6175-49e3-9e40-0188cde9c5c6\\})|(\\{86d98522-5d42-41d5-83c2-fc57f260a3d9\\})|(\\{05a21129-af2a-464c-809f-f2df4addf209\\})|(\\{446122cd-cd92-4d0c-9426-4ee0d28f6dca\\})|(\\{bfd92dfd-b293-4828-90c1-66af2ac688e6\\})|(\\{f9e1ad25-5961-4cc5-8d66-5496c438a125\\})|(\\{8a61507d-dc2f-4507-a9b7-7e33b8cbc31b\\})|(\\{84406197-6d37-437c-8d82-ae624b857355\\})|(\\{11df9391-dba5-4fe2-bd48-37a9182b796d\\})|(\\{e9ccb1f2-a8ba-4346-b43b-0d5582bce414\\})|(\\{79db6c96-d65a-4a64-a892-3d26bd02d2d9\\})|(\\{214cb48a-ce31-4e48-82cf-a55061f1b766\\})|(\\{4c140bc5-c2ad-41c3-a407-749473530904\\})|(\\{c5cf4d08-0a33-4aa3-a40d-d4911bcc1da7\\})|(\\{591d1b73-5eae-47f4-a41f-8081d58d49bf\\})|(\\{f1bce8e4-9936-495b-bf48-52850c7250ab\\})|(\\{7c1df23b-1fd8-42b9-8752-71fff2b979de\\})|(\\{3c27c34f-8775-491a-a1c9-fcb15beb26d3\\})|(\\{ddae89bd-6793-45d8-8ec9-7f4fb7212378\\})|(\\{c488a8f5-ea3d-408d-809e-44e82c06ad9d\\})|(\\{2f8aade6-8717-4277-b8b1-55172d364903\\})|(\\{2eb66f6c-94b3-44f5-9de2-22371236ec99\\})|(\\{216e0bcc-8a23-4069-8b63-d9528b437258\\})|(\\{d14acee6-f32b-4aa3-a802-6616003fc6a8\\})|(\\{b26bf964-7aa6-44f4-a2a9-d55af4b4eec0\\})|(\\{e2139287-2b0d-4f54-b3b1-c9a06c597223\\})|(\\{3f4dea3e-dbfc-428f-a88b-36908c459e20\\})|(\\{92111c8d-0850-4606-904a-783d273a2059\\})|(\\{2aa275f8-fabc-4766-95b2-ecfc73db310b\\})|(\\{f01c3add-dc6d-4f35-a498-6b4279aa2ffa\\}))$/","prefs":[],"schema":1585040894048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439702","why":"This malicious add-on claims to be a Firefox \"helper\" or \"updater\" or similar.","name":"FF updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"48b14881-5f6b-4e48-afc5-3d9a7fae26a3","last_modified":1585130632161},{"guid":"/^((__TEMPLATE__APPLICATION__@ruta-mapa\\.com)|(application-3@findizer\\.fr)|(application2@allo-pages\\.fr)|(application2@bilan-imc\\.fr)|(application2@lettres\\.net)|(application2@search-maps-finder\\.com)|(application-imcpeso@imc-peso\\.com)|(application-meuimc@meu-imc\\.com)|(application-us2@factorlove)|(application-us@misterdirections)|(application-us@yummmi\\.es)|(application@amiouze\\.fr)|(application@astrolignes\\.com)|(application@blotyn\\.com)|(application@bmi-result\\.com)|(application@bmi-tw\\.com)|(application@calcolo-bmi\\.com)|(application@cartes-itineraires\\.com)|(application@convertisseur\\.pro)|(application@de-findizer\\.fr)|(application@de-super-rezepte\\.com)|(application@dermabeauty\\.fr)|(application@dev\\.squel\\.v2)|(application@eu-my-drivingdirections\\.com)|(application@fr-allo-pages\\.fr)|(application@fr-catizz\\.com)|(application@fr-mr-traduction\\.com)|(application@good-recettes\\.com)|(application@horaires\\.voyage)|(application@imc-calcular\\.com)|(application@imc-peso\\.com)|(application@it-mio-percorso\\.com)|(application@iti-maps\\.fr)|(application@itineraire\\.info)|(application@lbc-search\\.com)|(application@les-pages\\.com)|(application@lovincalculator\\.com)|(application@lovintest\\.com)|(application@masowe\\.com)|(application@matchs\\.direct)|(application@mein-bmi\\.com)|(application@mes-resultats\\.com)|(application@mestaf\\.com)|(application@meu-imc\\.com)|(application@mon-calcul-imc\\.fr)|(application@mon-juste-poids\\.com)|(application@mon-trajet\\.com)|(application@my-drivingdirections\\.com)|(application@people-show\\.com)|(application@plans-reduc\\.fr)|(application@point-meteo\\.fr)|(application@poulixo\\.com)|(application@quipage\\.fr)|(application@quizdeamor\\.com)|(application@quizdoamor\\.com)|(application@quotient-retraite\\.fr)|(application@recettes\\.net)|(application@routenplaner-karten\\.com)|(application@ruta-mapa\\.com)|(application@satellite\\.dev\\.squel\\.v2)|(application@search-bilan-imc\\.fr)|(application@search-maps-finder\\.com)|(application@slimness\\.fr)|(application@start-bmi\\.com)|(application@tests-moi\\.com)|(application@tousmesjeux\\.fr)|(application@toutlannuaire\\.fr)|(application@tuto-diy\\.com)|(application@ubersetzung-app\\.com)|(application@uk-cookyummy\\.com)|(application@uk-howlogin\\.me)|(application@uk-myloap\\.com)|(application@voyagevoyage\\.co)|(application@wikimot\\.fr)|(application@www\\.plans-reduc\\.fr)|(application@yummmi\\.es)|(application@yummmies\\.be)|(application@yummmies\\.ch)|(application@yummmies\\.fr)|(application@yummmies\\.lu)|(application@zikplay\\.fr)|(applicationY@search-maps-finder\\.com)|(cmesapps@findizer\\.fr)|(findizer-shopping@jetpack)|(\\{8aaebb36-1488-4022-b7ec-29b790d12c17\\}))$/","prefs":[],"schema":1585060581210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1452648","why":"Those add-ons do not provide a real functionality for users, other than silently tracking browsing behavior.","name":"Tracking Add-ons (harmful)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36f97298-8bef-4372-a548-eb829413bee9","last_modified":1585130632157},{"guid":"firefox@browser-addon.xyz","prefs":[],"schema":1584609109987,"details":{"bug":"https://bugzilla.mozilla.org/","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Adblock Premium"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eafece33-b993-443e-b944-8bcefb4389ec","last_modified":1584737928024},{"guid":"/^((\\{bb5254c6-92a2-4361-b000-816bc4d34c55\\})|(\\{2fb3aa6a-4ab8-4071-a0f9-379100ac95a2\\})|(\\{0cd3acae-0589-41e3-9525-61786e493188\\})|(\\{3f259f0b-ad11-48c5-a7c4-a5a0897a6d1c\\})|(\\{02b6b8e0-f3b6-4f0a-8055-2baf79c606c1\\})|(\\{9419fd2e-894c-4aa8-aa14-18b5982c5889\\})|(\\{7d0d82e8-308b-4039-b3df-577b41483946\\}))$/","prefs":[],"schema":1584447915622,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623342","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-os collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b107267-ee8d-4ecf-b7d5-64966911681d","last_modified":1584609109587},{"guid":"/^((\\{e3d1040d-ea1e-4337-b51b-9f353817184f\\})|(\\{205c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{08ac7dd2-8595-4966-a00b-1ef6a5bdb6f3\\})|(\\{8e937b56-4242-4cb5-b92a-f64452da816e\\})|(\\{9a1ded7e-5fe2-43ad-90a6-3732ceae3d08\\})|(\\{b384b75c-c978-4c4d-b3cf-62a82d8f8fff\\})|(\\{6133a4ea-818f-4e22-bbde-0437d80142bf\\})|(\\{aaf2b501-9d4f-4966-be95-0334bd16b291\\}))$/","prefs":[],"schema":1584542165088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623343","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dd9652a-c6cf-4cb0-b6f7-7bea8990b4fb","last_modified":1584609109583},{"guid":"/^((\\{cde82615-f0be-9aff-872d-31da1bc93923\\})|(\\{85a8a08c-52a8-7d1d-5b80-f1b5cd4751bf\\})|(\\{3d1468f8-abbd-4a7a-95f1-fa5a1201adb4\\})|(\\{386056fc-2697-4a54-bd35-02de8d62fe1b\\})|(\\{1ae2bde0-f2ea-4bf1-a075-08853f9fcf31\\})|(\\{382056fc-2627-2a54-bd25-02de1d62fe1b\\})|(\\{926abf23-d2b0-4142-9aaa-5338b33a0000\\})|(\\{ffedd9c9-45b9-4e11-bbf0-a1408fa0975d\\})|(\\{b35ef07a-7c1b-4b6a-b7aa-de1e918396cb\\}))$/","prefs":[],"schema":1584542307136,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623345","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c8fccf9-b1bb-41f0-bdc3-3a5790fdd4be","last_modified":1584609109580},{"guid":"{4e820bcf-688e-4b4e-8773-3861dad6a7e0}","prefs":[],"schema":1584387693606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623047","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d65d4593-d2bb-41ab-b485-9818bc6f285f","last_modified":1584447915216},{"guid":"/^((\\{c89232c3-39bb-41e5-a197-7f4412b45fe6\\})|(oniria@valid-install\\.com))$/","prefs":[],"schema":1583964274652,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621940","why":"This add-on violates Mozilla's add-on policies by collecting search data going to a third party provider or collecting search data without user disclosure or consent.","name":"Add-ons violating policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6d431a97-5d54-4de7-a012-5b030c5324eb","last_modified":1584054334501},{"guid":"/^((\\{93475144-dae7-452c-a9e4-ef9da092517d\\})|(\\{cfc5bfc9-3dc0-483d-8dc8-27d05f6cff30\\})|(\\{498bc33d-979f-4d5d-93e4-ba608752ad10\\}))$/","prefs":[],"schema":1583875388267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621571","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"965435ff-2bb1-4b17-9e0b-b157d5c53a91","last_modified":1583964274232},{"guid":"/^((\\{eb5bd821-bb2c-4968-bf17-8e9336fbdfc4\\})|(\\{84be56c9-16ae-4bde-a556-0b9f7946c1be\\}))$/","prefs":[],"schema":1583914825954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621578","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dc0fc5f1-511f-4fc3-9558-fc7d9fa61e75","last_modified":1583964274228},{"guid":"{dcfd7c5e-ca9e-461f-a748-74f187332e5f}","prefs":[],"schema":1583788354663,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621247","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Emoji Library (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"320f94ad-5e02-4209-a066-22f415100d06","last_modified":1583875387847},{"guid":"/^((\\{d8e66734-06c1-44f4-968e-9af179ca3fcb\\})|(\\{3e836ac4-d85f-4e8b-8647-6e922b3b2b2a\\})|(\\{71d690cd-dff7-4d28-9cfb-d92bd6522d1f\\})|(\\{f20a4998-3973-4094-b61b-cbaeff99ff84\\}))$/","prefs":[],"schema":1583757249813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620356","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d10ec091-688b-4906-9ed1-42aedc998e1e","last_modified":1583788354268},{"guid":"/^((\\{8890a066-99e3-417d-96b6-f71db4f5fec0\\})|(\\{49f9bb4f-f470-48e7-a04e-25baa35209d4\\})|(\\{38799169-e35a-4034-8e62-8d82ae8b8a85\\})|(\\{a67a2dc1-081e-4efb-aa62-5dc7f499fe86\\}))$/","prefs":[],"schema":1583759516487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620970","why":"This add-on violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"Add-ons using remote new tab pages"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4568b40-4efd-4cca-9680-ba50dea36ec9","last_modified":1583788354265},{"guid":"/^((\\{16004b4c-8fcd-43e8-8867-233023c6fdeb\\})|(\\{79fa9c23-e61f-4434-8b27-0bd44c37edff\\})|(\\{15d5bc6f-15f8-4d0d-9483-7dbbcf722c56\\}))$/","prefs":[],"schema":1583759652565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620971","why":"This add-on violates Mozilla's add.on policies by collecting searches to 3rd party providers.","name":"Add-ons collecting search terms"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1caad16-4ec4-43ca-a145-04fbd5fd81c9","last_modified":1583788354262},{"guid":"/^((test@WhatsMySpeed)|(ext@630e3b49-decc-4d5e-8a9e-242df04e8ba1)|(ext@6bbf8f72-c54d-4731-b455-e164685c5914)|(sp@FindingFormsPro)|(sp@EmailAccessHere)|(sp@WatchTelevision)|(sp@WatchTVOnline)|(sp@QuickEmailAccess)|(sp@QuickNEasyRecipes)|(sp@MyFlightFinder)|(sp@BreakingNewsPlus)|(sp@WeatherDiscover)|(sp@MyRecipeFinder)|(sp@AppDiscoveryTools)|(sp@FileConversionNow)|(sp@TemplatesHere)|(sp@SpeedCheckerPlus)|(sp@MapsNDirectionHub)|(sp@FormsHere)|(sp@ConvertPDFHub)|(sp@ProPDFConverters)|(sp@DLOfficeTools)|(sp@MapNDirectionHub)|(sp@GamerHubPro)|(sp@MyLoginHub)|(sp@LocalForecast)|(sp@GoGamesHub)|(sp@LiveRadioPro)|(sp@MyOnlineCoupons)|(sp@TrackYourPackages)|(sp@MapsProHub)|(sp@ShipmentTrackers)|(sp@ConvertPDFTo)|(sp@EmailProHub)|(sp@FreeConverterHub)|(sp@AccessFreeTemplates)|(sp@ViewOnlineRecipes)|(sp@MySweeps)|(sp@SatelliteandEarthMaps)|(sp@SatelliteandEarthMap)|(sp@PackageTrackingOnline)|(sp@DirectionsandMapsNow)|(sp@ClassifiedsListApp)|(sp@MyHoroscope)|(sp@meinemailzentrum)|(web@meinemailzentrum)|(web@meinemailzentrum\\.com)|(sp@MyVideoConverter)|(sp@EasyClassifieds)|(sp@WatchSportsHere))$/","prefs":[],"schema":1583766889752,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618984","why":"The add-ons violate our no surprises policy","name":"Various add-ons violating no surprises"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"076d3556-68cb-4a5d-83cc-e4cca29d3f48","last_modified":1583788354259},{"guid":"/^((\\{deb55b0e-7064-4552-955c-15ba6a46ad79\\})|(\\{15d967ca-cb54-444c-a7ad-b0dad1dbb723\\})|(\\{7953fef3-37b3-4954-a0e0-806cbec35a63\\})|(\\{2deadd5b-1edc-4634-b342-4e20ad03fd2d\\})|(\\{f74e5fe2-4f8a-489a-8f75-f965a9d4a98d\\})|(\\{0df2d5d8-b197-4022-ad3f-c24a44e9d23f\\})|(\\{e972a079-8e0f-4426-91e9-2c1cf9c8b89e\\})|(\\{d9ce0e4f-e41e-4160-b58e-b99300fa5d83\\})|(\\{43473acc-f92a-445c-9ce3-efc297fb62d0\\})|(\\{5b86a98e-5ce8-4664-9051-3d8f7127d1c5\\})|(\\{5f1e99d2-147f-48bc-aa87-41ed02d65965\\})|(\\{ffd007b3-c085-4bcb-9629-19a528f346ba\\})|(\\{df4e0189-a17d-41aa-af86-b6de65952842\\})|(\\{06880fd6-ffaa-4c77-a5bb-97dcd0ce554b\\})|(\\{f4e654cc-7ee1-401d-ac52-ced86f38e575\\})|(\\{d207c7e2-8a92-4f8e-807d-027fa2eed42b\\})|(\\{8d9fbceb-756f-417a-a691-de9a2c1c5648\\})|(\\{3602c279-d63c-4f81-b832-ef82fda60514\\})|(\\{2f27430f-99b9-4594-83ae-60a4df917e38\\})|(\\{be81f239-4a22-4b02-8878-358a3dcd6539\\})|(\\{e7c3277a-c312-4072-837a-4417aae7269a\\})|(\\{d5783778-d85e-4768-9b91-16b9068df780\\})|(\\{8c6f409e-f740-4807-9a28-c898266c518c\\})|(\\{9b1a4630-5873-4b3c-bcf2-4b4d59cc9739\\})|(\\{8522aad0-47c1-47e6-afbc-1e53a113bb2d\\})|(\\{d0e1738e-e2ce-4e75-bcdf-fdef4c0b7403\\})|(\\{4ac16c6e-ff72-45b2-b641-bf92144e1118\\})|(\\{e9c99267-487c-4fcc-9585-4a8e08d4342d\\})|(\\{0fdf70d2-0dbd-4ead-b746-9cbf4cacac6c\\})|(\\{0393ecde-cfd9-4a72-aa9d-6b64949b890c\\})|(\\{e80bc052-25fe-40ea-813a-dc98dffc2a77\\})|(\\{bfbe94d8-3389-4e4b-8cad-67eedd3bfa08\\})|(9\\.1\\.2\\.1@qamypersonalzodiac\\.xyz)|(9\\.1\\.2\\.1@qafungamesnetwork\\.xyz)|(9\\.1\\.3\\.1@qafungamesnetwork\\.xyz)|(\\{1985b6a7-5f69-484d-b462-667392e9ceae\\})|(\\{0d802f03-a2bf-433b-8124-7a2126bc53d9\\})|(\\{4c7d34ec-3bae-40ab-8300-38136f1bbcaf\\})|(\\{f0a11d18-866f-475d-8804-93d16729e59b\\}))$/","prefs":[],"schema":1583769750285,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621039","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3a700b8-0177-4b11-bf7a-ae7c97e5115b","last_modified":1583788354256},{"guid":"{2abaf8da-5ca6-4896-8bf4-33cced7d1eec}","prefs":[],"schema":1583770759014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621043","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pluto TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b7c877c-cf5b-478c-bc1a-d1a4f17f5599","last_modified":1583788354253},{"guid":"/^((\\{cf7362f7-d34e-423d-ade0-ff408145d75d\\})|(\\{225a2fd0-2266-4bbf-b1db-b4cd7ee3b774\\})|(\\{89ac12b3-2da6-423f-afdd-a755925070d9\\})|(\\{3c56ddf2-a46b-4338-9dc4-bf79a6947838\\})|(\\{4aec95dd-4720-4b7b-9032-c53c71c69531\\})|(\\{19efb4dd-72e6-4e76-9814-9185f0cebe1a\\})|(\\{a73d9f4d-dff4-47ff-ad33-1747dc74faf8\\})|(\\{58c16ee9-4ac8-466c-b8ac-5d8b019945f3\\})|(\\{a88f8f80-e2f4-4357-9f85-d49fcc22662e\\})|(\\{a623f590-df10-4f74-a281-27457212e744\\})|(\\{14df2d69-1ca8-4e68-8289-23816420eebe\\})|(\\{7789cecb-ccd2-4a7f-a75b-8d0243ab68b8\\})|(\\{0e2b182e-05c6-4830-9d20-b402c5598e55\\})|(\\{fd03573a-9361-4f90-9c60-be6013ebfb8e\\})|(\\{5ae01022-7989-4620-b46e-7ba5859e20d3\\})|(\\{d3ced839-59e1-4389-8631-a9f153187990\\})|(\\{07d66467-bc14-433c-84d7-905e8d2f550f\\})|(\\{3019ef01-bffd-45cf-8cd1-46f6c56cdda4\\})|(\\{1f0c9873-0598-4132-b20a-f0ab42c5c8a3\\})|(\\{b955bec7-392d-4074-bac8-60c6d1f402f5\\})|(\\{9f45dcf0-549e-4f15-a0ad-99ac2821fd8d\\})|(\\{16d5d1cf-0aef-4adf-99ce-214eb32d38fa\\})|(\\{b38602ca-4ac6-40b1-b20c-55828f514b3d\\})|(\\{55318007-10db-4d47-b4df-3946ed3653af\\})|(\\{cd2d96b3-e8ec-4ef9-95ba-72ee0dae011a\\})|(\\{b8250196-9419-4b06-9634-48f6c3570b53\\})|(\\{2a738b9e-5147-4441-91cd-e40a1ef50a27\\})|(\\{777580ee-50ee-4c37-98a9-844111149404\\})|(\\{a44f69d9-9c70-4b33-9502-b19e79399e3c\\})|(\\{2e6daca8-d5b4-4611-bd81-b964ab97bee8\\})|(\\{6fda5ac5-a41f-4905-a5c0-860313ab535b\\})|(\\{d51b14e2-4c5f-4601-b2b6-af8b572171cc\\})|(\\{dc5b9553-f925-43c5-936a-fd9ff0e56e47\\})|(\\{b0d8908e-ac38-473b-b20f-3a8d775c23f9\\})|(\\{d96abf04-438b-45a6-b6ec-3036124b5458\\})|(\\{469003fe-c00d-45db-82b7-c04635c227e9\\})|(\\{7d04eb8b-023a-4966-b6b9-06c706081d74\\})|(\\{41987721-6948-46f5-9e68-bcaf776e35ea\\})|(\\{127f13e3-f58a-44f6-bff8-955dd3688448\\})|(\\{09c02fc4-4a23-43c4-b1ad-854a3e1e6a29\\})|(\\{d061e0a3-7554-4a78-b7cf-e3f57df09b00\\})|(\\{28e445aa-892e-42e3-a0f1-30ab0ebba44c\\})|(\\{bc158e4c-6514-4b0e-9da4-6018326fe634\\})|(\\{fde60598-cfe6-4e9c-9f7a-28ea348a7f09\\})|(\\{a7addae9-82ab-4d91-a2b9-be373207bd9b\\})|(\\{71cc8c13-7aab-49d4-a419-b6e2880daaf0\\})|(\\{9a43f082-11c5-4062-bbad-04b63e6ed433\\})|(\\{19cdad5d-2a97-46b4-ba28-3a191d18b174\\})|(\\{99ee7e8c-61c2-4ffc-8f7a-c70c0bd4f1f9\\})|(\\{47706cc2-917e-4a2d-aba1-ee5c05613e0d\\})|(\\{a1a40297-cfac-455a-ad94-ef20eda2672a\\})|(\\{d807c94c-fbd3-48b7-9c07-a54336ace9f3\\})|(\\{0645230a-9e65-4a9d-ae90-97416f33f29d\\})|(\\{064d021b-9424-4700-b550-80c7a983c240\\})|(\\{59722380-31f0-4588-ac19-670f021cd67b\\})|(\\{0f504621-b4e1-4d5b-89dc-b57399b10c29\\})|(\\{ba135229-de15-41d9-8a35-fd198698fda4\\})|(\\{2117ec43-2df6-4bf2-a468-f067ea721432\\})|(\\{fd3fa8d5-be30-4e57-ba9e-ad11d0f70c41\\})|(\\{cb8e0410-17e0-4866-8075-b3224d52ea6b\\})|(\\{dff54861-9936-440e-94a0-92d39794be5c\\})|(\\{72c03815-0ef1-427f-b577-9c73bd19a7ca\\})|(\\{f13a447c-857b-4d93-a5cd-cb2578ede3d9\\})|(\\{8717ef97-76f5-4729-8a94-1ce396c0d2e9\\})|(\\{5e192df0-d31d-42b7-b866-155068118d2a\\})|(\\{d9238c4c-4259-4c0a-92c5-d03006959c1b\\})|(\\{95716b5d-ce17-4a97-9691-40f62291649e\\})|(\\{a0f9afee-bc26-4fa9-a1df-c705ad21cc94\\})|(\\{8f02a7c1-c6a1-4d3c-923a-59bd7e373205\\})|(\\{2452d750-d1dd-4cef-be51-3cc75f7a62d7\\})|(\\{e077a5e8-62c9-41a6-8427-10445a3d7818\\})|(\\{1685d632-1737-4bae-83a4-b0df6541f187\\}))$/","prefs":[],"schema":1583005290759,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618688","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons violating multiple policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41a53d4b-120a-4ab0-9dbc-8a8d3802b734","last_modified":1583233056644},{"guid":"/^((jid1-h7qSFwT2a1FJOp@jetpack)|(jid1-w4wG5nJhx4LJZr@jetpack)|(\\{74b0af75-8791-44e2-95a6-7f0ab94143ec\\}))$/","prefs":[],"schema":1582980182934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1619067","why":"This add-on violates Mozilla's add-on policies by adding abusive content to websites.","name":"Add-ons including abusive functionality"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"0.1.7","minVersion":"0.1.6"}],"id":"c4c0b595-6481-42a6-9e94-998b808dd143","last_modified":1582981347968},{"guid":"monstercropper@gmail","prefs":[],"schema":1582726441204,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618273","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Extensions Manager (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c706648-260d-42c3-8461-3ddcf9db11f9","last_modified":1582916527189},{"guid":"{df73c71d-e4b6-46e1-a853-9831ad860a7b}","prefs":[],"schema":1582752497018,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618518","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Dark Theme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59f951ab-6183-4ae8-9ed0-99b667fa2a86","last_modified":1582916527186},{"guid":"/^((\\{fa59fb58-b15e-4dec-a9e4-145fbdaa2f03\\})|(somethingadguard@ok)|(somethingsmartadblock@ok)|(somethingublockorigin@ok)|(somethingadblockpro@ok)|(somethingadblocker@ok)|(somethingadblockerforyoutube@ok)|(somethingadblockerlite@ok)|(somethingfacebookadblock@ok)|(somethinghostadblocker@ok)|(somethingnanoadblocker@ok)|(somethingublockmobile@ok)|(somethingurbanfreeadblocker@ok)|(somethingwebmailadblocker@ok)|(somethingyoutubeadblock@ok)|(somethingyoutubeadscleaner@ok)|(somethingyoutubevideoadblocker@ok)|(\\{d3360051-c575-4f6e-938e-ac3bd4598573\\})|(\\{e16f9fba-1ccc-4b59-b52b-69c452bddfd1\\})|(somethingadblockforfirefox@ok)|(\\{b707de34-1ebb-40e3-b44c-d46a2d10443f\\})|(somethingadblockforyoutubeyoutubeadblocker@ok)|(somethingadblockplus@ok)|(\\{4fead186-a35f-41b4-b794-6c90e6f8886b\\})|(somethingadblockerultimate@ok)|(somethingadblockerx@ok)|(somethingfacebookadblocker@ok)|(somethinggmailadblock@ok)|(somethingpandaadblock@ok)|(somethingyoutubeadblocker@ok)|(somethingmublock@ok)|(\\{b49fea32-c666-4259-98bc-50348f3909c5\\})|(somethingdudenmentortextprufung@ok)|(somethingemaillanguageproofreadingandgrammar@ok)|(somethinggrammalectefr@ok)|(somethinggrammarandspellcheckerlanguagetool@ok)|(somethinggrammarcom@ok)|(somethinggrammarlyforfirefox@ok)|(somethinggrammarlytomarkdown@ok)|(somethinggrammarnazimkd@ok)|(somethingjacindaspellchecker@ok)|(somethinglinguixcom@ok)|(somethingmaxigramar@ok)|(somethingngspellingandgrammarchecker@ok)|(somethingpruuf@ok)|(somethingspellcheckanywhere@ok)|(somethingthaispellchecker@ok)|(somethingwordeepproofreading@ok)|(somethingwordy@ok)|(\\{8097be72-4409-4b72-809c-062d67ec1a9e\\})|(something1passwordx@ok)|(somethingapricofreepasswordmanager@ok)|(somethingavirapasswordmanager@ok)|(somethingbitwarden@ok)|(somethingbondarpass@ok)|(somethingbrowserpass@ok)|(somethingclearlogin@ok)|(somethingcpmautofill@ok)|(somethingcyclonis@ok)|(somethingdatavault@ok)|(somethingelpass@ok)|(somethingethernom@ok)|(somethinggpass@ok)|(somethinghakopasswordmanager@ok)|(somethingheroauth@ok)|(somethingid50@ok)|(somethingikeyvaultdev@ok)|(somethingintuitivepassword@ok)|(somethingkeepasswordmanager@ok)|(somethingkeepasstuskpasswordaccess@ok)|(somethingkeepasshelperpasswordmanager@ok)|(somethingkeepasshttpconnector@ok)|(somethingkeepassxcbrowser@ok)|(somethingkeeperpassword@ok)|(somethingkeycatopensource@ok)|(somethingkeydepot@ok)|(somethingkeywi@ok)|(somethinglastpass@ok)|(somethinglesspass@ok)|(somethingmanageengine@ok)|(somethingmasterpassword@ok)|(somethingmaxaccessmanagement@ok)|(somethingmonapassword@ok)|(somethingmyki@ok)|(somethingnextcloudpasswordsclient@ok)|(somethingnordpasspasswordmanager@ok)|(somethingnortonpassword@ok)|(somethingonetouchprotect@ok)|(somethingpassb@ok)|(somethingpassbolt@ok)|(somethingpasscamp@ok)|(somethingpasscell@ok)|(somethingpasscodepro@ok)|(somethingpassff@ok)|(somethingpassfort@ok)|(somethingpassman@ok)|(somethingpasswordcrypt@ok)|(somethingpassworddepotaddon@ok)|(somethingpasswordconfidential@ok)|(somethingpasswordstate@ok)|(somethingpersipass@ok)|(somethingpersonaforfirefox@ok)|(somethingpfppainfreepasswords@ok)|(somethingphashword@ok)|(somethingpsonofree@ok)|(somethingpwdmgr@ok)|(somethingroboformpasswordmanager@ok)|(somethingsafeincloudpasswordmanager@ok)|(somethingsafelypasswordmanager@ok)|(somethingsavemypassword@ok)|(somethingsecurden@ok)|(somethingsteganospasswordmanager@ok)|(somethingstickypasswordmanager@ok)|(somethingsubsfreepasswordmanager@ok)|(somethingmteasierpass@ok)|(somethingtrustloginidaas@ok)|(somethingtweakpassfreepasswordmanager@ok)|(somethinguniqkeysecurepasswordmanager@ok)|(somethingvivokeyvault@ok)|(somethingwebsphinx@ok)|(somethingwebvault@ok)|(somethingxtambroker@ok)|(somethingxton@ok)|(somethingyotipasswordmanager@ok)|(somethingzohovault@ok))$/","prefs":[],"schema":1582832492598,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618810","why":"This add-on violates Mozilla's add-on policies by using a deceptive name and/or injecting remote code.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c21543e2-3f39-4ac9-b39e-6a2a18249351","last_modified":1582916527183},{"guid":"/^((\\{0aa583da-e323-42f2-b4d2-0bc61b493171\\})|(\\{20a15a74-371f-5098-a362-bd127db4f8bc\\})|(\\{c11016db-e96e-4eb7-bc19-7121d96d0e2f\\})|(\\{0fadbf07-bb25-4737-9800-b879a6e1c417\\})|(\\{e7fefcf3-b39c-4f17-5215-ebfe120a7031\\})|(\\{f85238e5-862b-45aa-9d66-0ab56a032375\\})|(\\{ea3f3dc3-6fbc-450d-9120-07b3b03cd9ec\\})|(\\{aa909324-7520-4dcd-9eb0-9f0a9ec3c003\\})|(\\{807833d9-8ea7-42f8-a8a4-46ff7519dd8b\\})|(\\{92047279-0910-4abb-beb7-a7f2cd6cf04b\\})|(\\{94036cd5-1829-4480-ab0b-e2455deafb9c\\})|(\\{05d0e324-7d90-3e2d-2eb0-6f1a9ec3c003\\})|(\\{abd0e324-7120-3dcd-3eb0-9f1a9ec3c003\\})|(\\{578e48b0-7c9b-4890-91ff-f6ce3e958edb\\})|(\\{0aa583da-e323-42f2-b4d2-0bc61b493183\\})|(\\{72d08da8-8277-47f0-8bee-ba5ad40dda6c\\})|(\\{9fd0e085-1545-13de-a831-ab9a05dcf253\\})|(\\{ced9def2-2d86-4a1b-a9eb-29e2f3c9eb48\\})|(\\{364f2138-c271-47a3-9ddc-466c4a27feef\\}))$/","prefs":[],"schema":1582891948231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618814","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae0ffe5f-a7a2-48ec-9b01-2c0c9d3eb2e8","last_modified":1582916527180},{"guid":"/^((o-o-0-o-o@codobir)|(o-o-0-o-oSearchBar@codobir)|(o-o-0-o-oAdBlocker@codobir)|(\\{93e2581c-ec13-4be8-bb22-d2544356fca7\\})|(\\{7582f270-d0ea-4f78-a1fe-851def5d06d0\\})|(\\{089fbef0-49fc-4237-ba6c-2604af7a6e18\\})|(\\{7f897f01-98aa-4e5b-b40d-dbdd7c968b8b\\})|(\\{5f6ae810-5186-466b-b7d6-29ab4355e3dc\\})|(\\{02dc7465-0eaf-44ef-999f-9dad3f9502ed\\})|(\\{0135039f-a362-4296-9c30-e8626bb484d4\\})|(\\{8775e445-b777-451b-8d4a-dd10985bf95c\\})|(\\{a244077a-0017-472a-b1af-8f0b4a167a3a\\})|(\\{ebcf3de2-902e-4690-a35a-d6160175639d\\})|(\\{209a92d8-da4f-4342-81b7-ed2b92863cbe\\})|(\\{a2cd102f-34e4-4ef8-87e9-b1d642b6716d\\})|(\\{6382c930-913c-4bfb-a82d-f098cf3e84e8\\})|(\\{323aca10-65de-4392-8ea2-591642470c58\\})|(\\{70508e0e-9f91-4bad-853f-cd76764a5a5a\\})|(\\{b673c390-83d1-43d7-b0e3-a7a2c79b23a4\\})|(\\{b74e188a-c975-4725-a6a7-53fe0645d424\\})|(\\{46ed97fb-8411-4e04-9332-0c89ea8cfbfd\\})|(\\{2b484d2d-5b4b-411d-b8bb-bc3e7d9672bc\\})|(\\{6e707a00-b889-4b91-8cf9-19674f09d849\\})|(\\{f24e3561-ecb6-4539-b9cb-95af4624811d\\})|(\\{46f41d8d-4bb0-4549-86e7-34c09c65b5fd\\})|(\\{99a15fc0-dcf0-4669-a895-664f286c6a88\\})|(\\{0585f5cb-8f50-4e76-82e2-75a0cf852d35\\})|(\\{783f9072-d29c-4567-93f9-ca424cd71fcb\\})|(\\{05d62c84-a9f1-401c-85f8-a657e6a85940\\})|(\\{8c44b1c4-364a-431c-98ec-9c7a88b8fef1\\})|(\\{44da520a-6bd8-40bd-8992-87ab3f866cad\\})|(\\{4dc3d7a3-58bc-4ace-ac3e-2776377595e1\\})|(\\{5cd1ffd4-2899-4b2c-a226-453c85d957c1\\})|(\\{74c7755a-16dd-4cf8-b407-20c47cb4b78e\\})|(\\{865fc230-1a34-4c95-a718-a53276d77a02\\})|(\\{a233e339-2ae5-4d5a-ad1e-d82db722a85d\\})|(\\{23e06ed5-bb15-4cd9-828f-df483e65e1f5\\})|(\\{840e5e73-880e-45dd-a2d0-fbefd09f368f\\})|(\\{dcc9f6a8-5306-4662-a2d5-9da72e9e6641\\})|(\\{a7714acb-7a85-472c-97e7-3310eb47fbc2\\})|(\\{88aeeecb-1924-4c1f-aa22-9d43e8757004\\})|(\\{55295427-ab86-40e0-a56e-f913aba2ae8d\\})|(\\{b80386b3-c4ae-426a-b755-e38999447aff\\})|(\\{71a36a35-73cf-4d33-8f9e-3e1b1f838f2a\\})|(\\{504212ab-b2e3-4157-a36a-b02bca78e727\\})|(\\{c4a86ea8-34d1-4a72-aeff-8b227a52f562\\})|(\\{c1413369-3202-4ec7-873a-23dc5715e180\\})|(\\{97ea8e7f-a2f9-4009-95bc-d9f8be5405dc\\})|(\\{76c146d0-ad1a-4457-979a-a0b84a7ca86d\\})|(\\{ea6a2984-78b8-473f-9850-f3406a8c2b79\\})|(\\{b005573e-35ca-4c55-a87a-25cb53ff526e\\})|(\\{00a73039-4695-4559-820e-e17b5fb5ccac\\})|(\\{fc05507e-2482-4928-b943-a7a6ad59d166\\})|(\\{e8cb2def-d6ab-435c-b2f0-af701a40350a\\})|(\\{524b9704-5aca-4283-aadb-fba6eead9b92\\})|(\\{7d629677-6ad7-43f1-b182-8734474c3fc7\\})|(\\{0edbf5ac-c258-4c65-af7e-8dffbdf847f5\\})|(\\{c5c906de-c84e-4b48-a738-e8e32546f496\\})|(\\{3a9abaab-8451-4909-978a-bf1d4e716137\\})|(\\{1195cc1e-0cc5-4e48-8b08-7160bdab5511\\})|(\\{3e3217ad-344f-4a2b-97ba-d4380a6d4f91\\})|(\\{ee4a70aa-687c-4176-9392-7e47b5c09afe\\})|(\\{7d1d1676-b23a-4249-9c01-f7f1dbcb18bf\\})|(\\{51e9d221-2349-4764-a4a4-00552369c210\\})|(\\{30b40c71-198b-4b3e-8ff1-569860189be4\\})|(\\{beef68e8-c078-45c0-a593-64a9bfb4b2bc\\})|(\\{6ce76b14-1c76-4774-919d-7a3c820a4d56\\})|(\\{522b149a-3a6f-4bc3-ab7d-1bf41e4c29cb\\})|(\\{17a2d3ca-1505-46aa-836a-85ea62b5b617\\})|(\\{d7b81889-d34f-467a-a690-9507b5d72647\\})|(\\{66463498-8185-4874-9fdf-be281b08df26\\})|(\\{5a144fd3-9e6b-4b3a-ba29-bba7fa187e40\\})|(\\{bb405e27-949e-41e2-9930-26cb8360dc19\\})|(\\{f7a40a38-b3e4-4852-9981-8078ae99374a\\})|(\\{8675dfc9-9953-474f-8b2c-16b1307f66ee\\})|(\\{62d44bdc-60ea-4a78-a738-e59dd50589bc\\})|(\\{a7875dff-b031-4588-9d4a-1f989704ebe5\\})|(\\{3cfd3ce1-f358-48a5-a30b-5cc144d14f38\\})|(\\{9ce2677c-ede7-45be-b281-2e0c9d24fff3\\})|(\\{d13d4d9d-e9ec-4833-948f-a8e2c4bb1ec1\\})|(\\{87d402fc-7bbe-4b48-8c1a-38984a9dff7e\\})|(\\{69b186c0-e619-46b9-a978-b6ac97abd26b\\})|(\\{408bfadf-6f2b-428e-aca7-e4b95037bd72\\})|(\\{2a047ecb-a3cf-4ef5-8420-d45ea9cb246b\\})|(\\{c171fea9-aa8e-4348-8b9a-1b371f4821ea\\})|(\\{4f24b616-1f23-4c60-aadb-2386900b690d\\})|(\\{766d6d39-6592-4f47-bd1f-84639a2e5ad9\\})|(\\{b7caa882-3108-487e-9f69-3f43168789ac\\})|(\\{e96c08ad-1eff-4687-94ed-a14a76c7152c\\})|(\\{cfddeb9b-5339-4df3-af2e-88e26987cb8a\\})|(\\{d558cc36-a306-4288-9888-a68c419b2cf7\\})|(\\{0765615e-cc53-4ed8-9501-8e33b627db77\\})|(\\{0de24de8-5130-43bd-b041-2d284a26b9f0\\})|(\\{114a7625-4642-4013-bf25-9d8c8a1e428c\\})|(\\{d2554ad1-d14c-43b1-9f3f-84ae454748be\\})|(\\{374319ec-ad46-450b-928c-feff04666d58\\})|(\\{f8a572d2-a614-45aa-a8a3-3cb6bdec3388\\})|(\\{d55d0631-bd77-42b3-8ca3-ff5889d69e4d\\})|(\\{4bf71a8f-3f21-4de0-8cc6-12a53df60922\\})|(\\{5787258d-5a12-4153-bd9c-5825c53786a0\\}))$/","prefs":[],"schema":1582892445504,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c948a9b-2340-4886-b8fc-29ca66c1790f","last_modified":1582916527177},{"guid":"/^((\\{e78b3b45-89ad-4210-9a6b-3150506851e1\\})|(\\{c5874e9e-f46f-4220-b356-476122247a0b\\})|(\\{941c102c-7b8d-40af-9f49-a0496d89b486\\})|(\\{97c53a72-d50f-4e1c-8d26-f0aa8578a4aa\\})|(\\{65d9977d-e895-490e-ac9e-83031d46551f\\})|(\\{6e27edd2-f950-4b69-9a4a-f4941f2b0621\\})|(\\{af4d7096-c51a-4cb6-a30d-d2790fd66325\\})|(\\{b666da6b-b171-465d-ac69-20ea2a8a9971\\})|(\\{8e83ab0b-d34a-49ce-9d64-6394637cd9e4\\})|(\\{763aa5bc-8faf-4103-bad2-d15aab97146d\\})|(\\{40613d6c-a8f9-4a8f-a048-72ca8f1206a5\\})|(\\{865cf362-afee-472d-b2ae-6186e59f8e3c\\})|(\\{6778c1de-8ab3-4ee8-9e3d-788b17060ffa\\})|(\\{a501a160-de33-4c20-96a8-b660fd18db01\\})|(\\{b27d330c-3ac1-4421-9c96-1a5781ee9bff\\})|(\\{3997ee99-bd51-4f18-95b1-3b8a887ea014\\})|(\\{ffb40ecd-2ef3-4dfa-8c69-9a847c853b0e\\})|(\\{061c317b-b050-46a9-a7a5-2f9dfc0ef3c7\\})|(\\{e30d3343-fc0f-4526-8b9a-eebd6b7b1af2\\}))$/","prefs":[],"schema":1582898093853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7548e625-f059-4976-ab43-de78a1124dd2","last_modified":1582916527173},{"guid":"/^((jid1-C96jkOWH1jEZ5A@jetpack)|(@pdfit)|(@youtube_downloader)|(\\{503b5ae9-dcb1-41c4-9cf8-0c70a5c2bc70\\})|(\\{a9de7157-1c27-45bf-ab59-bedcbf57cff9\\})|(\\{908c4278-9f44-4b59-ad6f-91e2aabc8682\\}))$/","prefs":[],"schema":1582659695507,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618172","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98dbf563-0a8e-4796-ac48-1be0e4520610","last_modified":1582726440807},{"guid":"{6059d268-eb5b-491c-9879-964e1c67c854}","prefs":[],"schema":1582723099417,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618174","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Second Tab Search (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e15a83e1-60c6-475d-977c-83e180646e6a","last_modified":1582726440804},{"guid":"@searchencrypt","prefs":[],"schema":1582723268591,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618185","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search Encrypt"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3c782d96-5d25-45d3-8f07-016a791e316c","last_modified":1582726440801},{"guid":"/^((\\{374c327c-fbd0-4769-a378-1cb0fef54b1c\\})|(\\{11d9b7d9-acea-4a66-94ff-3fbbcca15abc\\})|(\\{e9e3ac53-8384-4f2a-a451-78af21417b13\\})|(\\{61539a14-2728-448f-a071-45043287cf10\\})|(\\{9ca7082d-0e18-465e-8588-8d3990c5b9ae\\})|(\\{0444bcb0-66d3-49b1-ac1f-b79f7f682f15\\}))$/","prefs":[],"schema":1582486893083,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617571","why":"This add-on violates Mozilla's add-on policies by intercepting page loads with affiliate urls.","name":"Affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8ce5794-a1db-4a63-af32-1750de36a383","last_modified":1582562264396},{"guid":"/^((bazaarhero@jetpack)|(boingdeals@jetpack)|(boingdeals-1@jetpack)|(boingdeals-200@jetpack)|(\\{e9edde2d-5dda-46b5-b6ca-f732d96d941a\\})|(\\{29c11376-f72c-489b-a9eb-8fe309b1623e\\}))$/","prefs":[],"schema":1582548114995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617577","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1406ee6a-4eab-441d-ad1f-ce09b650ce2d","last_modified":1582562264393},{"guid":"{6ac0938d-7ca6-43ac-9c26-653d37820440}","prefs":[],"schema":1582549126839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617578","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"414cf401-fbc9-4218-85fe-5880068e8452","last_modified":1582562264389},{"guid":"/^((\\{d551e6af-55af-4295-92f0-ba0e3d15bb00\\})|(\\{36858137-f125-47fc-8e0c-499f161abaf0\\})|(\\{7edb2ea5-61a9-4447-87b2-d37ed4198d1c\\})|(\\{0ea11f50-96b6-4a8b-92f4-1eb6ca77acac\\})|(\\{1449de8a-cdb8-4f65-b909-c6391e49615f\\})|(\\{e7cdc797-edcb-46a0-a66e-f5dab3c808d6\\})|(\\{d57b5f9f-b35d-4879-84a3-3547d44249ec\\})|(\\{d4e41bc4-cb00-42d0-b756-ed8deb827cbc\\})|(\\{083acfab-6228-439a-b796-62647803b216\\})|(\\{ed2df6fc-df45-43ac-a923-bd3fbc3534c2\\})|(\\{ebc63925-e43d-4cc1-b234-4c8b6abc331c\\})|(\\{231652e4-ad9a-4dd7-89b1-d79876c0dca7\\})|(\\{2cb0bdaf-5789-415b-a92d-2adbc695cb63\\})|(\\{429a08cf-84c4-4eae-9ecf-fc6c3a07249c\\})|(\\{ec4fb55e-d94d-4196-9ee6-a6f19e3c9405\\})|(\\{bd55549f-9853-427c-a45d-6aba2b4776d2\\})|(\\{bbfa0b1d-c75b-4483-8331-b5b01c82fe5d\\}))$/","prefs":[],"schema":1582237690303,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617192","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Lusha"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b12eaf8d-77ff-4bd6-8b9f-797af110f86c","last_modified":1582301451440},{"guid":"beeline@beelinereader.com","prefs":[],"schema":1582298543556,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617198","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Beeline Reader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.10.1","minVersion":"0"}],"id":"42642ca5-9342-4e51-a2ec-b5eed799468f","last_modified":1582301451437},{"guid":"/^((\\{e046e345-918c-4fe8-89a2-0987c5d12636\\})|(adi@fmt-tools\\.com)|(\\{90e41842-755d-40e0-9136-8129df55a64b\\}))$/","prefs":[],"schema":1582296975853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605160","why":"These add-ons violate Mozilla's add-on policies by making use of obfuscated code.","name":"Add-ons with obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b96957ff-ca4e-4ec4-97f7-3dbb4ddbc479","last_modified":1582301451434},{"guid":"jid0-G6461UajDjhNAwSukoedlkhD0XA@jetpack","prefs":[],"schema":1582141291510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616735","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control and by collecting ancillary user data against our policies.","name":"Ratings Preview for YouTube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dca3181b-35a3-4dd0-9efb-8e7a19fab4d5","last_modified":1582237689888},{"guid":"{e0a905db-294f-4e91-be75-8b5c7c5df90a}","prefs":[],"schema":1582103702651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614333","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Gladiatus Time Saver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.2.7","minVersion":"0"}],"id":"a98992d1-8a30-406f-944d-c0161d0aaa21","last_modified":1582237689885},{"guid":"bookmark-this@page.xpi","prefs":[],"schema":1581968493407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616217","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24b4f43e-106f-44a6-a992-7d07634bb5eb","last_modified":1582103702173},{"guid":"/^((addon@faster\\.com)|(\\{09bfa06b-5e73-4daa-96bd-88092fe71c52\\})|(\\{eb4d44d6-4ad4-4b77-9509-8e6eadaef074\\})|(Blockfbunseenads@addon\\.com)|(Blockfbunseenads0@addon\\.com)|(\\{a8180cdc-19f4-4299-9bb5-5b6b2f2c2de6\\})|(\\{2454bb7d-4cf7-40f3-a5da-40e6889d83fa\\})|(\\{cd6999f9-c84e-47b4-a355-d54bedfe9c17\\})|(\\{53d5a956-eecc-456b-a6ce-b137c511a04d\\})|(\\{9b2dba6e-c179-47ca-bbd8-6b7033c4f2fc\\})|(\\{d77d7463-a323-4b3a-9b96-69b31e4d488e\\}))$/","prefs":[],"schema":1582023416031,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616233","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9119771-cb28-4853-8aae-72aedfe27b2f","last_modified":1582103702167},{"guid":"/^((\\{6fb37444-4339-4a36-9e4f-c4c47b550c4e\\})|(\\{430b4bcb-4487-471e-82b8-a3056ae137ba\\})|(\\{394990b1-4ede-4bdd-a3fe-58506591f00b\\})|(\\{3ca06113-1cea-4e7a-b775-19666a9c77a2\\})|(\\{deebf5b9-62b8-4b5c-8e1b-8f8d83939441\\})|(\\{15c41cbc-18a2-4756-80a9-418ba03f533d\\}))$/","prefs":[],"schema":1582027274373,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616234","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc8e1b77-eab1-42d7-9625-bf4153547903","last_modified":1582103702162},{"guid":"/^((\\{9664bedb-6f24-4672-8b72-2565e0b3fc21\\})|(alex\\.todor@gmail\\.com)|(alex1233\\.todor@gmail\\.com)|(alex123333\\.todor@gmail\\.com)|(alex131\\.todor@gmail\\.com)|(alex13\\.todor@gmail\\.com)|(alex12223\\.todor@gmail\\.com)|(alex1214122223\\.todor@gmail\\.com)|(alex1222214123\\.todor@gmail\\.com)|(alex1222214fawfaw123\\.todor@gmail\\.com)|(a\\.todor@gmail\\.com)|(abvcaasgawgaw\\.todor@gmail\\.com)|(abvcaasgawgaw122141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwaaaafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw12aa2fwaaaafaw141\\.todor@gmail\\.com)|(abvc\\.todor@gmail\\.com)|(ateststn@example\\.com)|(abvc1\\.todor@gmail\\.com)|(test@gmail\\.com)|(test1112@gmail\\.com)|(as@test\\.com)|(stagod@test\\.com)|(stagod_qa@test\\.com)|(stagod_as@test\\.com)|(fop@test\\.com)|(\\{e83eb1bf-7847-4253-8108-4c1ec0601757\\})|(\\{3cfa4fd4-a747-4666-b97e-2262f6255eeb\\}))$/","prefs":[],"schema":1582038056642,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616286","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ebf2f0-a321-48fd-a5a4-94a4980f4697","last_modified":1582103702156},{"guid":"/^((\\{04871291-3f6e-4969-a991-4183decfacef\\})|(\\{9493fc95-5a66-445e-9200-c9b617942c05\\})|(\\{a89d4fea-98ea-42bf-aeb7-e14059e809a2\\})|(\\{aabe1376-bc1f-440d-a275-284d026f3058\\})|(\\{b6aefc39-259d-4485-b8fa-c9b2ea77223e\\})|(\\{5ce16faf-66ca-401c-bf43-7c75cf75487e\\})|(\\{dfdf383a-eff4-4ae4-a8b8-97640748e795\\})|(\\{6a563873-967b-4644-afb1-bc3e9da68128\\}))$/","prefs":[],"schema":1581545094971,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615250","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1c5195a4-afb7-47ef-83c6-7c3c6f5d0ed1","last_modified":1581702872026},{"guid":"/^((something@ok)|(\\{4eefc8e1-086b-43a3-bb21-17c05f43cd3a\\})|(adv@blocker)|(adv\\.3\\.2\\.8@blocker)|(\\{f56e22e4-f6f9-48ca-aca3-480d9b293a16\\})|(\\{b26aabf7-6b17-424f-a71d-e8ca37ccb672\\}))$/","prefs":[],"schema":1581687835975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615601","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d5259975-b1c3-4f50-861b-d7b4c082b58a","last_modified":1581702872020},{"guid":"/^((\\{6e27c586-e50c-49b1-9925-5427f3e9f028\\})|(\\{ae6dcbb6-d0a6-494b-bdfc-ea9d7b8f7667\\})|(\\{14aec2a8-0289-43f3-85fb-5d52491a0538\\})|(\\{b541ce5d-e99a-4629-9167-e71ac65bf32f\\}))$/","prefs":[],"schema":1581450092560,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614884","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ba0f5f7c-8998-49f1-89a8-7f3a15c41cc8","last_modified":1581545094556},{"guid":"/^((\\{0bbf5ce8-0bfb-4589-a4e8-4f1e435389d2\\})|(\\{820847ac-fb62-47a4-a6be-00d863584c76\\})|(\\{703d2caf-edff-4198-baa3-615135f97890\\})|(\\{f459049d-939d-432e-83c7-07ced47e629a\\})|(\\{0d56e009-957a-4575-a984-ecd22ccf3120\\})|(\\{88386103-f99d-4aab-83c2-64106a77748e\\})|(\\{29e30d06-1030-4a82-8e29-25706012da97\\})|(\\{c0d5c1cb-e676-4ff7-8189-793efc86fa2f\\})|(\\{aade33ec-2184-4759-8de5-5d61f1e29e72\\})|(\\{72dc5fd5-179b-40b6-9218-e88434939ed8\\})|(\\{8c9ec486-bd7b-40dd-ab49-1ca3ff452484\\})|(\\{67c0ce2e-2359-44e7-b9d9-1061a3c4a041\\})|(\\{149c0e63-b3f6-4f8d-bb1d-94b7e36d8aea\\})|(\\{c3a1e646-c155-4a40-b5bf-ac9252e6b632\\})|(\\{6876f3d2-97d6-46d6-b9bf-aa46264f6c3c\\})|(\\{330a08b1-d93e-48a2-9081-e93e25190eec\\})|(\\{443305ec-55d7-411c-bb4a-96e83b4e631e\\})|(\\{945964bd-5c29-48e3-9dd6-26741626c1ba\\})|(\\{ec8513c5-2bcc-45b0-ae77-da6685cfafd9\\})|(\\{57703f70-e1b7-462d-bf7e-657bac5eb30c\\})|(\\{8c1d6a6c-3745-429e-8ec5-2a374320e703\\})|(\\{2ff583b8-72a9-40bd-877b-b355ad33ce44\\})|(\\{f2ed910e-ab21-4ad3-a70a-8adca5e683f6\\})|(\\{4ae1f921-575e-4599-8b77-e8e7ab337860\\})|(\\{cfe7c709-6df6-4d54-9f4c-6fc3967904ce\\})|(\\{4e0cceff-558b-4902-9870-55ecb16f78a6\\})|(\\{093726f6-5907-480b-81fc-fafe4f04b5e8\\})|(\\{4a2650e6-fb1b-4e83-b0ad-4e991c9ac01e\\})|(\\{2dcd1f94-6a18-47c3-826a-d8f1044b3ade\\})|(\\{90e61a54-35d6-44c8-bb33-88623e6a03ae\\})|(\\{61389b8e-55eb-43ad-a68d-bebefe7476ad\\})|(\\{f8890846-fcc1-479f-a90b-dce3e486b0ba\\}))$/","prefs":[],"schema":1581438380344,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614707","why":"This add-on violates Mozilla's add-on policies by collecting search terms or intecepting searches that are going to a third-party search provider.","name":"Add-ons collecting search information"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d33858b8-d192-4be2-a844-b151f0f287ca","last_modified":1581441570691},{"guid":"/^((\\{312951c4-a455-4886-a2f1-e4fb05b9fee7\\})|(traderibis@gmail\\.com))$/","prefs":[],"schema":1581429986729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613706","why":"The add-on injects remote HTML code not compliant with our policies.","name":"TraderBiS"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52b9033d-de65-48ad-9062-7c340835feb0","last_modified":1581438379932},{"guid":"/^((\\{ebba9c65-d04c-4c02-afd1-476d7c06fc2f\\})|(\\{117f05e4-3403-4cbe-a041-30fa60054e9f\\})|(\\{03417bad-eb5b-4bd4-89f8-f10d78fce082\\})|(\\{42f0a4e1-710d-4154-b34a-731dbbe2097b\\})|(\\{6a0a9103-3482-4717-aca8-f22ee2228d25\\})|(\\{23d5c4a6-1231-4f87-ebf9-e5800eae221b\\})|(\\{99a32eb1-5da4-4a35-beb6-7c3b5222ce04\\}))$/","prefs":[],"schema":1581277291027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614308","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39473bb3-638d-4b7e-a847-f197e6320564","last_modified":1581340917940},{"guid":"/^((\\{0E64F71A-6B21-4324-A5D9-69231DE8C20C\\})|(\\{747e7f5b-c9Fa-4e4f-b466-639b88c8998f\\})|(\\{8693cb76-1caf-4115-9bd7-6bab02330326\\})|(\\{cf8452e1-0ddb-44d2-95eb-4cb8e7a35707\\})|(\\{79bbada5-9050-4d8c-9367-0aad8185cd90\\})|(\\{C7928956-827D-4649-A234-BB758377C005\\})|(\\{512d597b-9bbb-47cf-b0e6-526456ee6d26\\})|(\\{fd591fc9-480d-4f04-8ae5-0be02121b425\\})|(\\{e3258209-0248-4092-bc59-3032565d2f0a\\})|(\\{725fc0a6-1f6b-4cf9-ae17-748d111dc16d\\})|(\\{3e30848f-3b39-425b-8538-d85da166cb19\\})|(\\{9e27a3ff-0131-4aed-bc7c-2364bd89d7c9\\})|(\\{74e039b8-a2db-4a41-9155-4ccfc2c86682\\})|(\\{cfd9177e-c8c6-4d94-b5e9-d87850e2c8aa\\})|(\\{e21459c1-5604-4324-a3a0-8d23800725ec\\})|(\\{a563f3c0-d631-442f-ae27-1467cd47f1f4\\})|(\\{cbb3237c-ed1f-4735-a364-1849c0907b3b\\})|(\\{5c88311a-c457-4d3a-961c-3dc0cf01e6f9\\})|(\\{0bdf29c1-0c18-40cf-b3a2-c938b5cfdabc\\})|(\\{56e0ce0d-ffff-46a4-b2cf-1260d6898b94\\})|(\\{673d181c-5a1f-42c9-a8a2-f2f5af4a2a2a\\})|(\\{63dc2763-30bb-45fc-90ce-0d2a5c07a46a\\})|(\\{2751af61-65b3-4e7b-b098-497d6d6d7629\\})|(\\{5ce7c96e-2e99-4a6d-8f5e-cbcd68fd64b6\\})|(\\{e7e1a9ef-2755-445f-a639-d9bbf5e1982f\\})|(\\{ef5483ba-d634-468b-93d0-1bed3f09306b\\})|(\\{10367a10-912e-47c8-ab86-9a752230e097\\})|(\\{bf13ca91-6471-45c9-999a-e6176ffa9681\\})|(\\{7b8ddd2d-c2cc-428c-8Ede-604995d8B4da\\})|(\\{d05d4f3c-74ba-40bf-afa0-ad944df067ae\\})|(\\{fed8f5bc-0324-4007-8e90-84709e0c57c8\\})|(\\{9ef981d5-0b21-41fd-9412-008633de79f2\\})|(\\{1569b001-9f51-46a2-a4ed-f2122c475799\\})|(\\{340eab9c-f3c6-4a6c-9439-79733e12df5d\\})|(\\{1ab78f66-5390-4db2-8d1e-c759599ef2a4\\})|(\\{ce00b27c-1a7d-40f9-be61-57ae046ebe1a\\})|(\\{9fc1abcd-3044-4bbb-b04f-c233f1d20bfc\\})|(\\{78255a39-463e-4fce-9a2a-acca442414f3\\})|(\\{159bf803-5c0e-4863-bfb1-7a036174bef5\\})|(\\{7828da87-6bf1-4799-91cd-6e9167511fa5\\})|(\\{9aa7920f-677b-4904-9ea3-cae4c4320d15\\})|(\\{3e78b05f-90aa-496c-ac3f-cbc92a738fa1\\})|(\\{cd9d2474-fff2-4f19-8452-0ec2f4422117\\})|(\\{c7722662-0964-4341-9232-0fdebb37811e\\})|(\\{fdb0fb76-f05d-4732-9348-6f8765673e14\\})|(\\{05abc1ee-f871-4ce6-a51d-6011cdf545ba\\})|(\\{300e263c-aed7-4df7-b197-82d5122ccf6a\\})|(\\{14775497-c7c4-4209-9d6b-a8a40c0aed1a\\})|(\\{10f8343f-0f77-4cb4-8266-e06dde15e8ca\\})|(\\{d2a58c6b-be02-4ea5-9e7e-6982454e9ef3\\})|(\\{0f27c13a-5921-4e7c-86c0-b43ad63a4bea\\})|(\\{f1922123-3aad-41cb-8ab5-281ec8cbe351\\})|(\\{be0f8a88-522f-43a3-8146-5b2ad0985987\\})|(\\{44056c1f-6259-4ec2-8e60-b1c65f9b1039\\})|(\\{1e4c4a84-ea2a-45c0-935e-59cc375575ee\\})|(\\{62a11f62-84b9-425f-b506-93c3711b73e7\\})|(\\{bcb5539d-0913-4d90-94a0-e3144ab239ac\\})|(\\{e4dd1b2b-dcd2-494e-b69f-8c76e89a6234\\})|(\\{48eeddb6-f7f9-415d-9835-b859e37ed024\\})|(\\{ddf2a2fa-a5ed-4765-a44c-4b56077cd588\\})|(\\{2a208cb8-5297-47b4-91a7-0e66475218d8\\})|(\\{7ec57eac-456d-442a-85f2-477cb20c3dde\\})|(\\{20aa1960-d5c2-48fb-ae09-fa6261381537\\})|(\\{b4ebedae-d18f-46d6-8b87-679d1fd27f3d\\})|(\\{67fa631f-29fe-4001-892c-1dfdd56e5ed3\\})|(\\{ae92cb39-b2a6-4865-a125-1b273ffb4a1c\\})|(\\{5b2245da-f41b-4fb3-88b3-5e9a097e06c7\\})|(\\{69272cbc-110d-4b5c-b903-16bd118ddf45\\})|(\\{d4d22de7-54af-40a1-99f7-c2b0f2d86a23\\})|(\\{e1445f3b-92ee-4085-a57f-380e96ed8316\\})|(\\{f9830d93-3782-44e9-b199-d2355f61b98f\\})|(\\{218769cc-3b47-4978-ac59-8a9447bcb193\\})|(\\{f472ddca-60dd-4d6b-90c7-244a84d0a487\\})|(\\{8af6985d-1eef-47be-8213-bd6e25dad273\\})|(\\{da95491a-1812-442a-bde4-7a29f69044d4\\})|(\\{f8d10888-29b8-48d3-8e5f-e02e41fb642e\\})|(\\{e9091337-2af8-440e-a318-ca9e0f053fc0\\})|(\\{3ba1e00c-8339-4ae3-a87e-f4af9f1ee33f\\})|(\\{b40e5bcd-5966-424f-8a15-6ecc3dba050a\\})|(\\{c376e851-c30c-48a1-9f59-d528d34560b8\\})|(\\{8ad33b1d-31a7-47e6-bb46-6c91bc1daea3\\})|(\\{dac8f2fe-662b-4017-bf62-5052d0b23af9\\})|(\\{c27b6b15-fd63-458e-91b8-5974a7b2242b\\})|(\\{b222e127-a52c-4884-8a0a-065342b0c74d\\})|(\\{f53f1857-3f7f-4cf2-9e4e-2533f2c253ee\\})|(\\{eb260b8d-f7d3-48d8-a29a-c2b07e1ed36e\\})|(\\{49f6227b-4803-46aa-b189-466869e8dc5d\\})|(\\{a8694ce8-04ee-49c6-81cf-cf005e7009b4\\})|(\\{c53aa3f1-3385-4e2d-9d38-daf09b0db7bd\\})|(\\{9b230441-bb88-4060-bcc9-637cc5a54639\\})|(\\{895ac4f5-bd07-41c9-bbe1-cdb4d2be9975\\})|(\\{6886d657-954f-427b-b52f-9ddb1b52da62\\})|(\\{d1bc06d5-8470-4120-a2af-8e05b252ccca\\})|(\\{2aad1b2d-c29f-4623-83ac-6291c169c4d5\\})|(\\{e54137a1-794f-482d-93b6-13e2dddf7bf7\\})|(\\{773b7d0b-dc32-4125-83b4-a74887588698\\})|(\\{dd8a0577-a2ef-4719-b138-8aae7cf05add\\})|(\\{9b0dc71f-13e1-42f7-9e64-518cf228c079\\}))$/","prefs":[],"schema":1581005656992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8b5feaac-be07-4612-a090-4714b80191f0","last_modified":1581082030075},{"guid":"/^((\\{7b931d6c-4721-482d-8fcb-8c789bafc9a4\\})|(\\{03ea1c25-7fae-4ca7-9e9a-4b161936232a\\})|(\\{06580af3-ba0f-4e49-966d-932b19f6914d\\})|(\\{7f2afade-1aa3-4acd-8161-4a7d111535c4\\})|(\\{45fc7dea-37bf-46ca-9ccd-4b156778ed55\\})|(\\{b8f12b3f-ebe5-4599-9c51-1414ba5783be\\})|(\\{6440c999-2444-49d0-b8b4-188503a14a32\\})|(\\{0741d175-fd06-414e-91ad-095d6484b8e9\\})|(\\{db88d1a7-fc18-46b5-b015-bd9599966cad\\})|(\\{4f3df885-1268-43ce-9e2a-45668ce523c3\\})|(\\{938ec54b-e728-4e04-9a05-108b2246cf51\\})|(\\{bd474d1d-02ad-40a4-9237-4cd64d16de55\\})|(\\{622b8278-44d4-4f9a-ad96-1363247ae6c6\\})|(\\{9fd1d710-ebe9-4da5-a488-d51eb1e88ac7\\})|(\\{ee4314d4-00a2-48ce-bd11-4364496faa8c\\})|(\\{a06cfa87-55e7-4c65-a71c-a5e984c38e94\\})|(\\{1e36e1a3-6756-4ecc-9138-6939b23ed54c\\})|(\\{219cb4e4-5e4a-484a-844f-fee741dc65fc\\})|(\\{057669e1-0925-4d28-bd20-0fb643ad290e\\})|(\\{466bf5d6-c235-4731-9539-ebf90346f096\\})|(\\{a96faf19-5035-4149-9664-773abbc0881b\\})|(\\{656b685b-a458-4651-bb39-66242c67dd6d\\})|(\\{1acdd00a-744a-4875-be39-5a136aa20d7d\\})|(\\{58873ce7-60eb-46b9-a4af-ae62095b3fb1\\})|(\\{387033d3-4292-486e-80f4-44e531349a54\\})|(\\{5b8b07d1-4e0a-4c96-aad5-672a00c1358e\\})|(\\{15a8fac7-2bf1-4536-b4a3-7f51c9b7fa1a\\})|(\\{668952b1-4609-453e-9972-e9557192070a\\})|(\\{5f017950-0824-4806-9cda-e17d454f1b18\\})|(\\{008db332-feb7-447c-8359-829c2e5fc374\\})|(\\{3d412505-479b-47c0-b330-3599533e783a\\})|(\\{117a7b8a-6c7e-4fff-8d48-e12b02871b91\\})|(\\{8753c4a4-e083-49db-872c-eef47d1d58ab\\})|(\\{f439338b-3af7-4afe-bd48-77ee1039077e\\})|(\\{32588122-b871-43fa-b845-60b548a30235\\})|(\\{89a92c73-87b1-48b1-bc68-b814d1348d1d\\})|(\\{dbb477cc-8be4-44f4-9cc2-845632a7e433\\})|(\\{da48acfb-08ed-484d-90b3-0e63c759a4f4\\})|(\\{af40910c-c446-4a65-843e-5c39b6ef38f7\\})|(\\{0121e1fe-e88a-452f-ba88-7c330f87c137\\})|(\\{9cc2b320-5edf-4b20-be94-108583cc9b66\\})|(\\{babab679-6c9b-40c2-b62b-e21a3b4b5734\\})|(\\{5e4d38a3-eefd-4fb6-bbe6-5eb69295f37e\\})|(\\{ffb5e280-9fb1-42c8-bfbc-ac2db8232d9c\\})|(\\{50198f5f-f09b-4d09-96e7-ca94e327ce7b\\})|(\\{eee19d83-6edb-4b9d-b483-1070d60595a7\\})|(\\{7c5e2b18-56ad-4249-8390-03dd99aa5b09\\})|(\\{61af5d39-dd37-46fb-8ead-c7756764458c\\})|(\\{fb0dabc2-2a3d-45b2-8ed4-dc22b74f0ab4\\})|(\\{e3eb4df8-0cfb-4380-a7c0-856d4deda887\\})|(\\{180a38cb-115e-4794-a039-696446dc6b4a\\})|(\\{91dc3cb5-ab77-4e1c-af09-d827a0df9e08\\})|(\\{c4fec1da-703f-49fa-bd3a-5d7f939d2ae0\\})|(\\{a75f51d6-8d4b-4a28-b706-300403b82859\\})|(\\{d79394db-944c-4820-a90c-a2f48ab5fff1\\})|(\\{d6f11f95-a27b-47cd-bbcf-a9b5f2dd2a36\\})|(\\{3e64646d-9618-44ca-bf27-e424e76bd622\\})|(\\{43b57421-3ba8-4116-82c8-afd142c05674\\})|(\\{30935b8f-9a74-4e49-b6f5-8bb95d3ab3a7\\})|(\\{1ec5af15-c738-492d-bdcf-c14fd5be5e13\\})|(\\{feff2b30-7349-4e7b-9a9c-541f97dbc9e5\\})|(\\{48dbfb68-13d3-4372-820d-d52ea58ebdfd\\})|(\\{1a3a904a-3daa-4d1a-8260-c20b44fec6e3\\})|(\\{3794f3f1-6a11-48fb-a7c9-b33344ee82ca\\})|(\\{e3587df7-7358-4a36-aeff-944db7ab30ff\\})|(\\{43a526a3-28ea-409f-933c-2ef3d9a0629b\\})|(\\{2d3e88ab-b4af-47d4-b79b-a0becf1437b2\\})|(\\{0e02d0ec-97b5-4b46-b42e-d4179b067478\\})|(\\{dc7083b2-64f5-4ec0-a84b-3e5fdd552f11\\})|(\\{69d07419-67e5-4465-ad46-b969d5e5c3f8\\})|(\\{f31bdeec-878f-4465-b9f5-e844b45eb9a2\\})|(\\{9b63b79e-32c8-425b-ad18-753b58b73cbe\\})|(\\{8caf71a8-6c65-4cd4-95c6-9913dd169278\\})|(\\{e1f6fe90-e0fe-418d-9ff6-566cdd5b60e9\\})|(\\{e34bd75e-5e7e-48e6-a84e-1d18e5fcfb2d\\})|(\\{087940d8-dc20-4e9e-829b-7bd96c37b02d\\})|(\\{48defe55-de7a-4051-a5cf-ac6a649e66bc\\})|(\\{8bd54503-66cb-49dc-81ec-9fa0e9c42fe3\\})|(\\{ed9f9df1-9f6c-4e4a-a4ac-5d422a7c2a5c\\})|(\\{13261711-0eeb-457e-9035-7c415e286830\\})|(\\{E3F6115C-B027-11E8-AD5B-6E4CAE35F1A2\\})|(\\{93654046-f548-4d3e-9370-cc2244406725\\})|(\\{943ba377-5410-47cb-a025-30d55960622c\\})|(\\{426123a8-3e04-4887-a4a7-18931eaa428e\\})|(\\{4c50cefd-8f14-41ab-b719-8606b116d1c2\\})|(\\{ab2d09e4-07c0-461b-94f3-b2ea2a6773b9\\})|(\\{3f20ebf2-5869-431e-a73d-53d435176b04\\})|(\\{5b845034-25ed-4b92-bfac-ed7b305a3e13\\})|(\\{24c45b33-30e2-4d41-adb1-2a1bd9942ca6\\})|(\\{46f426fa-dc37-4b1f-ae63-11370ec65b39\\})|(\\{d678f055-e538-4c58-8a61-746166ac5063\\})|(\\{f852266a-7f88-47d8-b610-6ca130d9774c\\})|(\\{dce62517-e86a-40e0-9361-64c2e61f011a\\})|(\\{f7883a1d-0f04-4f8b-85ec-f339b791335a\\})|(\\{204f251f-feba-487a-9bbc-ca8b22b222af\\})|(\\{59c8031e-40de-485b-9988-69a4f4f51e52\\})|(\\{a5207f0f-109a-406f-8d86-3a2c806c9c7b\\})|(\\{3b66b98a-8782-4f16-a2f6-33175f9b0101\\}))$/","prefs":[],"schema":1581076280856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0e546e4e-6d89-41a0-92fb-987b98efea6f","last_modified":1581082030072},{"guid":"/^((\\{0970b6b2-6702-443d-84fa-90f5b5cf7c10\\})|(\\{9ba7732f-7e77-4dae-9885-a9cb91930b0b\\})|(\\{dd43f6d2-30c7-43df-bce6-6edc46c84d9d\\})|(\\{72207416-61e9-4960-9cb2-87d2df8486fa\\})|(\\{d53274cb-43e2-4cbc-b1f4-5463cc026ab0\\})|(\\{e1faa92b-b124-463e-b247-2609d534733c\\})|(\\{654068ac-aa86-4f05-aab3-f9dbea380021\\})|(\\{58d9fc43-39c7-41be-96a6-a27b1e179191\\})|(\\{f5469e0b-d4cc-4c30-9922-f0c82f1e04e2\\})|(\\{2ebc9fc9-8642-4f97-935a-6885e66ed6db\\})|(\\{b7d87fb6-afc7-4544-b798-7fcc1c8114f0\\})|(\\{d36916ad-9b5b-4390-b302-321c43d85753\\})|(\\{1e67d5ab-aff2-4540-a2e7-cd19ee112ab7\\})|(\\{82f9d6fb-cbbb-4862-8c18-c0876aa00c3a\\})|(\\{2a78a205-7363-4d76-9eea-a862be445724\\})|(\\{bb65aeb0-db01-4f8b-893a-634d2977269f\\})|(\\{5cac0db7-8b8d-44e1-8932-687b152feb8b\\})|(\\{6cade252-0973-49b2-acda-36960804c0f3\\})|(\\{61e466b4-00e9-4ed2-94bc-dbfade21f066\\})|(\\{316b549c-841f-4f2e-9e91-5a8cf5c22808\\})|(\\{73571d19-5073-4b32-915a-a2350e814cf1\\})|(\\{2e5d7ab6-cdea-4a23-8bb5-3245ccec2c5f\\})|(\\{fbf35eb0-14de-483f-90aa-3f8c4ea773f0\\})|(\\{4a9619bf-edd4-4f6c-a787-c919cd4b1d17\\})|(\\{167fc8e3-1bcf-4f46-a8f1-1722db81c4a0\\})|(\\{b861c901-a92c-475a-9efd-805d01a1c6bf\\})|(\\{6800f73d-3133-4697-a368-16c1f6e63894\\}))$/","prefs":[],"schema":1581076281891,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dbaa501-a6b0-439b-9871-79f081f4afdd","last_modified":1581082030069},{"guid":"/^((Search_Secure_clone_oRrmYYtiAX@www\\.searchsecurepro\\.co)|(Search_Secure_clone_rHXTjLgNGR@www\\.searchsecureprime\\.co)|(Search_Safe_pHUandPyRQ@www\\.searchsafe\\.site)|(SearchSafe_IEHxXeEbnC@www\\.searchsafe\\.site)|(Search_Secure_ByKsqSMauFtest@www\\.testsearchsecurepro\\.co)|(Search_Secure_GyQyTTzqnYtest@www\\.searchsecuretest\\.co)|(Search_Secure_NhrEwtJEhM@www\\.searchsecurenow\\.com)|(Search_Cipher_bBzgbIQyiC@www\\.searchcipher\\.co)|(Protect_My_Search_Online_clone_jtypmmXRwz@www\\.protectmysearchonline\\.com)|(MyAstroFinder_LTEnkWRkmt@www\\.myastrofinder\\.co)|(Live_Weather_Check_PZjCbwpxyH@www\\.liveweathercheck\\.com)|(Travel_Deals_Center_clone_GvEXeOfSMc@www\\.traveldealscenter\\.co)|(Dictionary_Pro_ARbsoVmMdl@www\\.dictionarypro\\.co))$/","prefs":[],"schema":1580931692537,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613657","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e480bd4d-7ff0-425c-9c1d-4153fa55ea81","last_modified":1581005656617},{"guid":"/^((\\{0fc22c4c-93ed-48ea-ad12-dc8039cf3795\\})|(\\{0A2C2098-F04D-11E5-A933-5334BC8E7F8B\\})|(\\{8504399b-e635-40fe-8943-977a58521db3\\})|(\\{347d4451-8da5-4d67-96b2-a2e8a6de8e09\\})|(\\{176c8b66-7fc3-4af5-a86b-d0207c456b14\\})|(\\{8692b95e-1a13-4118-b5b9-be8f3d2fc9b7\\})|(\\{b3e1e418-986b-4231-8579-0fc754574d9c\\})|(\\{88619e16-f0f3-4606-837f-a4496d11c0b4\\})|(\\{b4229471-001b-4960-bea9-795d91cb943e\\})|(\\{16390554-6fc5-4dfe-b7bb-809e378df660\\})|(\\{5fa01132-d07b-40e1-b958-e7825b878422\\})|(\\{07ebc943-2c8a-44a9-8d4d-5bbb78b2d2e5\\})|(\\{02405c0b-a202-483f-ba02-b09bab55cebd\\})|(\\{094f9b39-0561-4cb4-8b51-cb8ee5bd5b90\\})|(\\{a66e7db5-fc74-42c8-8e8c-d7a401a577d2\\})|(\\{58f9a1bb-0635-4b79-bb41-166c3e810329\\})|(\\{9da80afe-bcd4-4271-8f70-f986370d954c\\})|(\\{2671041f-f659-43b1-a400-0f7a3b852f74\\})|(\\{d9c98668-f0a1-43d7-800d-0c6d11321663\\})|(\\{1d6f99a8-d100-446e-8cc5-85231e7ab7fa\\})|(\\{ae170991-a8c8-4caf-b6cc-a3cc994abe83\\})|(\\{bfdd7357-3692-4d5b-86c5-4d86cd5e39e3\\})|(\\{aa5e865e-1e21-4ed9-b80a-f374be86b5cc\\})|(\\{26c58d0d-8514-42d5-87fd-701fd53ce3b8\\})|(\\{c934c41a-5de5-4086-b2da-1afc7d744162\\})|(\\{e87de7b9-5994-4b91-9c1a-a1d4d12a3969\\})|(\\{0eeab47a-73f3-48e7-977f-08815b4ee5ad\\})|(\\{1df850c2-38cb-46f1-87a5-308af6409c14\\})|(\\{1f481c59-fe50-4148-83d1-ff551f6dddf9\\})|(\\{70cfab72-ee99-428a-b5fb-26d924be3acb\\})|(\\{b156eeb6-cf37-48d8-b15b-bb863c431ba1\\})|(\\{a81f7ce6-0cc3-41fe-a33a-eb856636c887\\})|(\\{3949b4a3-bbb6-4119-9fa0-249fdff22c45\\})|(\\{abe2755c-a3b3-4714-a354-51eb5b8129fe\\})|(\\{547f048f-4fbd-40ef-9365-3d54559eae61\\})|(\\{e3e293e3-f18a-42f1-98bf-71d8166aef54\\})|(\\{ca742d81-6e6d-473e-ab68-f757d480e159\\})|(\\{6ac89db3-5ee1-43d8-a12b-a1b6e0ceafe0\\})|(\\{4eac966b-28db-477f-a471-a3bf74621110\\})|(\\{2c413992-ba94-4917-bd57-57eef39b4f8a\\})|(\\{6935560b-a856-42be-baa8-a06459785ed7\\})|(\\{503d9872-3db8-4f05-9c9c-b8bcd6d08ae3\\})|(\\{2055799b-b1ed-44ab-9200-4190467a3c59\\})|(\\{fe27a89e-a1b6-408e-b0b3-b2ccc0cbdf3c\\})|(\\{3fab2a05-1bfa-458d-93f8-16c523d72804\\})|(\\{32939492-d835-4540-9c03-1af0b715268d\\})|(\\{e9c96255-4eed-49fa-9740-54ef684b8197\\})|(\\{45fc39ef-f2c8-449a-b533-77e4d6202777\\})|(\\{d3ce94d3-a9ee-49e2-9290-031e56a4a5d0\\})|(\\{6b8a371e-ce42-4355-b4bc-ad4c83d5f932\\})|(\\{cfacd4cc-9f18-40f2-8711-795e738d51be\\})|(\\{d41f259b-c827-46d9-891a-33b6caf2370c\\})|(\\{3e90457a-815b-4b0a-812d-f02a43c23951\\})|(\\{063de0bf-2da4-48c6-bed2-ed11ecb3bfb8\\})|(\\{cd253156-e140-433a-a0fc-ccab28bf069b\\})|(\\{9a6f884b-3b8a-4925-8f7e-a975e2f6ec20\\})|(\\{5986d98c-b75c-46d8-9c5a-0fef03cddd5b\\})|(\\{8d586a4b-f00f-4a5b-940b-2fe00dc2905c\\})|(\\{ab0f5841-11f0-4c92-9bf8-b885f4431253\\})|(\\{eb1bafab-7f4d-43a6-8f78-fb0dbb099cff\\})|(\\{e6b152f0-5457-44ab-a6cc-d7869dc694a4\\})|(\\{942fe5ef-e9a6-4791-b840-a2e74baaeb4a\\})|(\\{d1c67270-c2af-47af-a4bc-2c020df200c5\\})|(\\{8a934de2-3238-4c24-aa29-52e1fafc64d4\\})|(\\{c65f3bbe-684e-43d6-b030-615118b38e54\\})|(\\{286f65d2-6b01-4f04-871e-2cef4095065f\\})|(\\{2FF4B97E-A47A-11E7-B621-7403A54193D8\\})|(\\{da482f08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{3a961d08-8ca9-45af-9c30-2ba4d673e10f\\})|(\\{e87de7b9-59a4-4b91-9c1a-a1d4d12a3969\\})|(\\{942fe5ef-e9a6-4a91-b840-a2e74baaeb4a\\})|(\\{b15a65af-8dbe-46ac-9537-f91fb1640809\\})|(\\{da48af08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{ce2c3653-8d63-4cd0-ad8a-31f03703820a\\})|(\\{5d987ae9-c201-4352-a219-a34ee28a6f9e\\})|(\\{b15ac5af-8dbe-46ac-9537-f91fb1612309\\})|(\\{3fa556a3-3bfd-4e4b-b403-072938701c66\\})|(\\{57baae18-26fa-4ec0-9fe8-a0e197c1a220\\})|(\\{4de7b432-e5e2-45d3-95cc-df3e913b68d4\\})|(\\{a15a65af-89be-4fac-9127-f91fb16c0809\\})|(\\{c2c8b504-f5bb-489e-858f-38ca5224d033\\})|(\\{7f458bd6-4841-4373-97a4-a3d140b02552\\})|(\\{e20bc238-0831-4d4b-9386-d2fa5abe804a\\})|(\\{e51fa7b7-4c3f-4f66-8bc7-e864a413b790\\})|(\\{f9c04a94-59d8-47f7-a97d-980ff99f81cf\\})|(\\{d6ea5103-78ff-4736-b2e0-c0ce94bee77e\\})|(\\{f8fd0172-1b1a-4084-b440-4119996ab2c9\\})|(\\{a52e4eea-9923-443b-98a6-942eb27ba324\\})|(\\{a1fcb660-c2cd-49b7-a327-88e887afb43d\\})|(\\{cea42340-da28-4c95-89c4-0a66d69050d4\\})|(\\{c2f47878-f9d3-4c89-be58-a69dd9d1484a\\})|(\\{7ddf85d3-7014-4fdb-836a-fbbe4385347f\\})|(\\{36f452d0-6154-4be8-a388-174fc98d9333\\})|(\\{c69d7a2e-ad00-4e9f-80d7-fa0604ac3954\\})|(\\{8d40db57-9287-473d-b398-259d702d92f1\\})|(\\{bf51b8cc-a07d-475a-9013-91e2c089ae60\\})|(\\{32030663-2a21-4d20-a2e6-ed3d4a51b704\\})|(\\{1204abf0-0409-4934-ab58-1f5424134bc1\\}))$/","prefs":[],"schema":1580758890801,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c6f59bf-90a6-4fdb-a12d-f1b4a1446331","last_modified":1580842055124},{"guid":"/^((\\{a88e625f-b840-43b2-9feb-99c259b6751e\\})|(\\{0cc6c564-63c6-481d-9dbb-ddfd40ced202\\})|(\\{329e1c15-fcee-4063-83bc-59c894861cbc\\})|(\\{98e2e7ef-e544-4426-a182-621e8b85c15d\\})|(\\{d8869a56-bccc-4011-9b86-2962a57d7377\\})|(\\{255138e4-d9f7-4779-8713-e5970090ab67\\})|(\\{ee5907df-603f-4684-8f2a-425742ed37cb\\})|(\\{0e725b0e-9f26-4bb5-b9b1-738df2692e19\\})|(\\{2bf69cca-c4cc-4200-ab56-1d27fef48e03\\})|(\\{4edc1ea7-7037-4b54-8a64-a43339545710\\})|(\\{6edff7c6-97a8-4355-a074-e191b0a9a4ff\\})|(\\{79c5d05b-a6ba-470b-b06d-d33fe04418e5\\})|(\\{a1ebe305-b540-4dc5-91a2-8a2a0d646efa\\})|(\\{1211b4db-1ed4-4630-82e6-cdf69d58f035\\})|(\\{4d4e8ee2-78aa-42f5-a30a-c3727241cb96\\})|(\\{b6178891-7400-4b86-8a96-d57b1b7eee20\\})|(\\{3cfcb0bb-f7fc-440b-bae9-1050a966013b\\})|(\\{747931c3-bf5f-49d0-a4d2-615847200653\\})|(\\{989fcf36-da63-4d83-a036-b996788e7a4c\\})|(\\{a0dc99d3-7b9c-4fa2-8d42-39179b1e1e5a\\})|(\\{d4ce8b88-6b17-4ed8-b695-29da839dfb41\\})|(\\{cb2af2e8-ca55-4545-864f-96686760b59e\\})|(\\{3961b434-016c-4598-9ab2-38425197f32e\\})|(\\{b4e25be7-a4a7-408b-8759-8b185b4421f7\\})|(\\{0cb56fc3-e3f8-4ea3-aba7-4a2d351f82be\\})|(\\{b3e9621c-3194-4cf8-8b28-4ad32a988d5a\\})|(\\{241b64a7-7b2e-475b-b195-b1cfeb099745\\})|(\\{b727f9fe-9345-4ce4-8797-f65f85dfad7d\\})|(\\{a90d260f-7c39-4539-9948-8f3ee4406a9e\\})|(\\{35a57c90-ce66-42f6-ad0f-52b92690f4c2\\})|(\\{83048c90-baca-477c-8774-054f80eca4e6\\})|(\\{91c1e004-2e1a-4103-89c2-2f585c2d306d\\})|(\\{a5701591-3a6d-43b1-b74b-c47a1b7aa5b7\\})|(\\{641eef82-a96a-4702-b3fb-f50f8d7cdc85\\})|(\\{b436362d-94e9-4209-a3e5-26dc7d1ec86a\\})|(\\{70dc19f1-1312-402f-a370-cd8a1e231116\\})|(\\{c9a68220-ad02-4b09-9456-12ed03121344\\})|(\\{dc0d8992-0c9e-4473-b8c4-72240fc7be39\\})|(\\{1c3ca6ca-1427-4b6e-85be-315e18f81135\\})|(\\{96309a2c-339e-4c3e-84ff-ef7dac131a18\\})|(\\{95d07270-fb53-40c3-9b9f-46ed78658a1a\\})|(\\{15700ca0-8d4b-40d3-99aa-bff59aa48676\\})|(\\{5d308759-368c-4b5a-804c-acb6e18c6436\\})|(\\{b47ace66-3443-4d26-a858-7bbcfe1c18b6\\})|(\\{10dc172a-38b3-441b-a2d4-52b4ce8e4b7b\\})|(\\{73a47b20-be2c-43e4-a728-c46d33612ccb\\})|(\\{5f3f1314-618c-4c3d-ac4d-f83ae6d247ac\\})|(\\{bb81241e-b093-4c55-8c3e-7dca2250ada6\\})|(\\{4d8be4aa-4790-4807-add9-af62132e675d\\})|(\\{4295e30f-80bc-4d48-b794-c609de6f2dc0\\})|(\\{057c6b57-46f3-43b4-9576-438afdd3b3ca\\})|(\\{60a58bf1-08ae-46d7-9010-5cfe8eb5f282\\})|(\\{bffd69a1-5a8a-4b0d-ae14-f8744adb92b2\\})|(\\{b5c0b80e-dbc6-4701-98c2-3b0b8e182404\\})|(\\{48306d77-a699-4cbe-9ed3-b3162dfff00b\\})|(\\{f1f285dd-4a5c-48ad-81bd-78fe204ed582\\})|(\\{da0b9335-8edc-4429-8889-c5872ad02417\\})|(\\{6e834570-8580-44c2-91b2-d30f687aeb07\\})|(\\{9ea1bae9-5dca-4a1f-9fcf-a325a39b85c1\\})|(\\{69149c7f-92c7-4d41-b88f-e68c237d1d63\\})|(\\{985e1bca-d152-4fc3-89a0-cba2c0ac44bb\\})|(\\{746c7167-56bf-48b1-bd6c-08b05b48a863\\})|(\\{4bc87632-de6e-4c23-8192-f561f185a823\\})|(\\{1d21ed2a-94c9-4bae-983e-5c1e5094060a\\})|(\\{148df2dd-451b-42eb-952b-f608f26cfb6f\\})|(\\{2c6d6dea-438c-442a-ae11-a943804d90b4\\})|(\\{2c7e143c-9f4d-412b-b552-17033d4992c6\\})|(\\{e2309514-8386-413c-856e-21b54ebc3d9c\\})|(\\{4b417a17-ff90-4f16-bb8b-fb1e0d9ca824\\})|(\\{7c68360c-d03c-4c26-bbfa-2f9c9064701f\\})|(\\{eefb2906-cb27-4801-9ae8-67b49807b151\\})|(\\{b7c790c9-aaf6-46f2-9462-812d3e129ce7\\})|(\\{aac68138-e60d-48e2-92dc-d28577e553d9\\})|(\\{5959fff0-d04a-4147-8d4d-aaa7bb314a00\\})|(\\{40bf9b7a-9c36-40a8-8e68-91b79eb3bd44\\})|(\\{96429801-73cc-403b-be68-fb8a992f9307\\})|(\\{218e967f-59b5-41f6-a22f-7fe3c1580956\\})|(\\{ba51f209-a2f6-42a1-9608-536058540d0c\\})|(\\{d993e7df-00f9-445f-9082-294017eeec36\\})|(\\{f1990255-00e8-4d34-91d5-11d09066e4f3\\})|(\\{dbb78ed6-8449-475f-a152-0148596539eb\\})|(\\{ac798a99-00f0-421c-a3c9-a13bea8ef728\\})|(\\{e486268f-9299-422e-91df-9706ea220c46\\})|(\\{ecf1e24d-cfeb-4fa1-9953-202c3e62a820\\})|(\\{caf7fac5-0784-4701-a50d-2d0c27074b9a\\})|(\\{8f85f7d7-7182-4a53-a18a-bf83f0bfd1b4\\})|(\\{be556a9a-df8f-45b9-87aa-ae0eaf50a2b4\\})|(\\{9f80406a-ba8a-4548-bb0e-e987fb1d7921\\})|(\\{d0386a6e-e364-4e67-b340-782492bdb3ee\\})|(\\{cb0d2b3a-929c-42f1-8874-07a0650d0298\\})|(\\{cd9f2f81-3674-4d3e-a1b3-824fd3e5e906\\})|(\\{58366e2d-3a39-4fea-b631-521e3e73162b\\})|(\\{d854ae81-f759-48a9-8732-2371664fe2fe\\})|(\\{4747285e-3ec6-4d8f-9d1d-d0430297f182\\})|(\\{2f1919a8-4ca8-4a80-9175-c2da3a98490b\\})|(\\{32b30902-43a3-4f37-8e86-860ea525e923\\})|(\\{60376450-fe48-4d30-b551-b35535df6e96\\})|(\\{22456782-c5e4-437f-9369-5b23b875cd6a\\}))$/","prefs":[],"schema":1580814638830,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3ee1de-0c37-4883-a22f-822c8d6f8991","last_modified":1580842055121},{"guid":"/^((\\{35417623-1a2c-4e75-846f-e2a7b95b3b24\\})|(\\{d6dfebf0-51d4-490b-b03d-a17bf7fe4a6d\\})|(\\{50c7fb39-c03e-4d82-a071-fac7eaf960b7\\})|(\\{28999f9d-6e83-4c52-bb2b-5d2c46b7ef58\\})|(\\{9409fdd1-d78d-4df8-bb5e-f178f42702f6\\})|(\\{4c356115-33da-49e5-877b-090c64d76a66\\})|(\\{cf674a88-861f-4357-aea7-37f09e534552\\})|(\\{43238f2d-ddba-4604-803f-889bfaa22ebf\\})|(\\{36405669-81af-44c0-83cc-32ae8f901db0\\})|(\\{2ca5cfff-58dc-47d4-b56c-c206d281a9cf\\})|(\\{b22df1a7-f312-41a8-8fd7-cdd160ba7be2\\})|(\\{cf019c95-1c49-438a-9398-3863642fb606\\})|(\\{c7a9d852-c30d-4e6d-b040-a445551bee61\\})|(\\{379932ed-2938-4ccb-b57e-2dc44c3b5121\\})|(\\{d2395ba4-96e4-4ffb-a4da-608f27328c9f\\})|(\\{7ffbda76-3f9f-403b-a5e1-559c4f18c1f3\\})|(\\{361db730-4c11-49e8-b189-fa461f738786\\})|(\\{677456f1-2716-4a23-9a74-f3867e860dbf\\})|(\\{46c19d03-16ce-45f2-82ce-d8ccaeb3ceea\\})|(\\{6339b6ff-da02-4821-b5a0-48490a54b14e\\})|(\\{7d4d815d-798c-4cc0-9561-2f84b4598f94\\})|(\\{40fc3311-9612-4cb7-b337-fd581dead5f2\\})|(\\{9e639048-d366-4db0-a15a-f1953130fc8e\\})|(\\{ce2d009a-47af-4e94-94aa-23bd8973addf\\})|(\\{41984c46-3ec2-4684-99db-a5c4356f7ba0\\})|(\\{a63f9261-e05c-45f8-8b43-f987eaf5b27e\\})|(\\{37e06cae-3367-43e2-bdb2-0c087f2603c6\\})|(\\{f9d80e53-acb1-4483-bf3c-f58920551ded\\})|(\\{1672a22a-f6cc-4318-9616-22e1e3b3049d\\})|(\\{1cc6cbe4-38ad-44c4-a462-a2a222bab5be\\})|(\\{0255dcf8-ac71-4403-ab5a-c8f7abf66a39\\})|(\\{564f7511-ba68-48a0-9a85-636a100ce3d1\\})|(\\{4ebf29d7-102f-497c-bc8d-696dd66ecde6\\})|(\\{4c4139ca-ffbc-4f10-a534-22dd4c787944\\})|(\\{a12c1827-a5fa-4c11-8403-e02e9520f0ec\\})|(\\{2178817b-1d32-4068-9675-8fffe11a88f8\\})|(\\{b779151f-7a4c-46b2-83e4-3dbad231a9b9\\})|(\\{fe8a8186-80ef-4112-a41f-7d00ffceb63e\\})|(\\{0ee72846-9a34-422e-b202-382aa19bc0bb\\})|(\\{c92d2fba-d002-426d-acc4-0891fa40040f\\})|(\\{e3bdfd08-fa29-4a56-9851-f6d0b965004f\\})|(\\{0017666d-27b7-4347-bbbf-6d389b4430dc\\})|(\\{c9db55d0-61e4-4515-a9a7-24e3783bf106\\})|(\\{fbf87239-ec23-4907-bb6c-93daa5015ea3\\})|(\\{44801e5e-a635-455e-b08f-f3da88b06bed\\})|(\\{59517a31-ea51-44cd-ac7c-02d952ecf04e\\})|(\\{ee075bcc-2101-4c9e-8f04-7e7281ca5c74\\})|(\\{fd073c3a-d7d8-43f6-9d1c-1865bc0ff940\\})|(\\{a15f4275-8f19-4508-b548-a88597092bbd\\})|(\\{568ad6c6-0b91-46bd-9093-bc394a84c257\\})|(\\{11f798d4-003b-41a8-aa65-1f566ff53f06\\})|(\\{a02f26f3-49f7-4e95-a69f-78b1ce2d3471\\})|(\\{ed48226c-94b9-4878-86ba-de38851290d7\\})|(\\{97e5276c-a627-4c62-8659-4772a81203c0\\})|(\\{4cb19fea-1568-4f0b-809a-0763fbb36888\\})|(\\{599cff19-2ba7-4bf3-93a9-87f7f277cadc\\})|(\\{f0564e7e-f154-4612-b50e-e0d11c47b359\\})|(\\{3cc8efd6-4808-428a-9e0c-ef6fa45d17b4\\})|(\\{3842feba-bb44-49f6-9511-de1a1b78d348\\})|(\\{ebc3de57-de6d-43ee-b76b-676893dd7035\\})|(\\{a5f552f7-7279-49e5-92cc-70f952534726\\})|(\\{3ece0c93-9723-4280-8356-d1eb2025e2d5\\})|(\\{8579047e-a427-4ac8-87b9-ee9651c1f856\\})|(\\{c9bfdfd9-4617-4749-afd1-265f0b7158cf\\})|(\\{0c570e22-54e7-4d93-86f2-36e19707018a\\})|(\\{cfc0fa6e-0d6a-4fcb-9dc2-58b220307293\\})|(\\{8640eaec-8d51-4d6c-b01b-a671f4aac012\\})|(\\{a0ca05be-c6f2-4c18-993f-de55abca7000\\})|(\\{de066e14-6527-4be4-9751-e53ea16fd60f\\})|(\\{5a8f8da1-3994-43da-98be-3a58ed4d2ec6\\})|(\\{bcd8524a-8f39-4eba-a795-aabdd95305b4\\})|(\\{7d76001d-fda5-4abf-93f6-a947dd3cca24\\})|(\\{d18219fc-b632-47dc-bea1-73451164d187\\})|(\\{e97fbca9-d513-4fa7-9524-576620470399\\})|(\\{069b10e7-f7ef-40df-87bb-95783401a54a\\})|(\\{12a978dd-a7b9-42c2-b431-65aaa56c2a77\\})|(\\{66ba2e20-9378-493b-837f-4b3a028ab5d9\\})|(\\{9ad5b1e9-a19c-4a65-be1b-8b888da7cf58\\})|(\\{87ce9b48-e659-4b14-ab54-c80ffbeaa77f\\})|(\\{4da94d09-4730-4277-a544-f3b7890b6666\\})|(\\{30e6c020-4ec6-4b18-8f29-3dc294fbbb44\\})|(\\{5bfbdd70-ce54-4686-9351-0d90a7dd011f\\})|(\\{17eb23ec-f059-4857-a405-9d06242e99b5\\})|(\\{b4170b6a-0af2-45b1-9214-3665e870ab3a\\})|(\\{bc20b5b7-46c3-4af6-942f-f0323445b576\\})|(\\{44edc268-9242-461f-9d8a-fb59337101b0\\})|(\\{301321f7-e0a2-4cc2-9cc6-7ee1390ea895\\})|(\\{b57a503c-6370-4ed1-90ed-1b6444ca1e52\\})|(\\{c4707969-efc7-46ce-845d-28a46c78fda6\\})|(\\{22714afe-0f06-496d-9897-31e52e83a12e\\})|(\\{a07fb8cb-91fa-4799-9ff5-115e8a88b57f\\})|(\\{f539ec45-16dd-47a3-a9d5-8643b021d4c9\\})|(\\{b9348282-9380-4e55-9939-e4c10254a496\\}))$/","prefs":[],"schema":1580814639945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae074a33-05f8-4721-a9ff-7111502291c2","last_modified":1580842055117},{"guid":"antimalware@titansurfer.com","prefs":[],"schema":1580240491748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611797","why":"This add-on contains deceptive code that is not in line with our data collection policies.","name":"Titan Surfer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c703b7fd-4b40-44f8-9de6-786b66ef8e1b","last_modified":1580742890204},{"guid":"app@OnlineFilesConverter","prefs":[],"schema":1580380822975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612169","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Online Files Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bcb1821a-25e6-4b9b-a54c-bf4543f895c0","last_modified":1580742890201},{"guid":"{f83128d7-ef15-47a2-a99a-70d181413b81}","prefs":[],"schema":1580381170095,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612294","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake banking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1ca7b6ce-30d5-4290-b46f-9fad59b65f9c","last_modified":1580742890197},{"guid":"{d281b854-0c99-4e4b-b647-32038ae53c27}","prefs":[],"schema":1580727235989,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612868","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SApp+ (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93cceac3-803b-412a-b413-fdb1b0689626","last_modified":1580742890194},{"guid":"/^((\\{236a5a66-132c-4d7b-a62f-66f1a76bb7b7\\})|(\\{0fadbf07-bb25-4737-9800-b879a6f1c417\\})|(\\{c8ec696d-935c-45d0-a604-180244e839e3\\}))$/","prefs":[],"schema":1580740785659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612869","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"183a1de1-2625-44d6-90df-cbdbee9d23bd","last_modified":1580742890191},{"guid":"/^((mozilla_cc4@internetdownloadmanager\\.com)|(\\{4509d977-32a4-480a-ab95-6ddb5bfc6616\\}))$/","prefs":[],"schema":1580741006002,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612871","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad2f927a-eb67-4360-92e0-87f567608c1a","last_modified":1580742890188},{"guid":"/^((\\{f2431eaf-2b0d-4f0b-8148-3188db294d73\\})|(\\{c43e5363-2c61-4c3d-afa4-9cbe06e767d0\\})|(\\{bb8eab9f-4611-496b-bd31-a1b2ee66d8f9\\})|(\\{5f61d055-ae45-4ecd-9570-555609f66f5a\\})|(\\{532d8a77-86b6-4a7a-87a4-d973dc0cf9d0\\})|(\\{bfd10065-670d-4477-98dd-8bb4285040d5\\})|(\\{79f33a52-631a-406b-afcf-9be8b4bb480a\\})|(\\{fd994367-ecfe-44dc-a595-cb155110492d\\})|(\\{9a01416a-758c-4fd7-8e56-998acc588f9b\\})|(\\{517a72f3-e9cb-4e9f-8a2a-9639f4daed76\\})|(\\{4fda7f17-eaa0-44d1-91e5-7d8305a2de0e\\})|(\\{695bd646-ba09-4a3d-9616-191b355aec33\\})|(\\{6893ed50-b006-430c-bbfe-5f049e57470b\\})|(\\{7a2f84c6-d1ef-4902-bae7-b6c7807cb32f\\})|(\\{afde1624-c4a4-4494-9ed5-1ad15799dbd4\\})|(\\{e05b53dc-910d-47ce-9c9d-5195e8e8f3e5\\})|(\\{11b0ec0d-ae49-4ce8-a13c-198affdb4d9e\\}))$/","prefs":[],"schema":1580741081005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612872","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd36267c-dbd3-4df1-bc01-5f566ba56de0","last_modified":1580742890185},{"guid":"/^((\\{6b7df170-e6fa-4b9b-bd76-d6b866a5bc6c\\})|(\\{7e1c1f98-4c89-4668-b9ea-e258e7c9e22b\\})|(\\{1f2128cd-bcaa-4e60-b555-0713054df0f9\\})|(\\{9043971c-ce88-400b-b56f-7a9e3853eb32\\})|(\\{afcbdf71-be6d-46cf-b5ff-6a6b9ec7f920\\}))$/","prefs":[],"schema":1580067691094,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611725","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4a4d34-1341-49ea-8b53-96a1ecfac49e","last_modified":1580207330647},{"guid":"/^((\\{0ded4ebe-965f-4de0-89d2-91ed13ae15ee\\})|(\\{5c143da2-6a9e-4afe-9ca2-b758aebe6e64\\})|(\\{c6566b12-297b-41fb-8189-f32a7d1c1b87\\}))$/","prefs":[],"schema":1580078568605,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611806","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70af2927-6552-4eae-a91a-89e4cdd61b88","last_modified":1580207330645},{"guid":"/^((\\{9237d0ab-aaf0-41a2-b873-c0f131b09ce4\\})|(\\{18b14b7d-e228-416a-bab8-37acf6d6dfca\\})|(rwkaddon@racewarkingdoms\\.com)|(\\{2e2d6d72-2634-496c-a8db-db869b639a21\\}))$/","prefs":[],"schema":1580137101921,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611807","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"303a149e-8262-4d16-b24b-348b84d5051e","last_modified":1580207330642},{"guid":"{c6ce41ee-a4e3-4fd7-ab6a-988b6916d66a}","prefs":[],"schema":1580137557625,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611810","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Qwicky Advertisements (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18581952-6448-4728-9fd4-2860b3e6534e","last_modified":1580207330639},{"guid":"djuvt@czgnp","prefs":[],"schema":1579817517633,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611297","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Update De (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad789bcb-4c12-401d-b6fe-202a5b6697b6","last_modified":1579987441268},{"guid":"/^((zdphb@swlguy)|(czgnp@hhjl)|(mjrxg@zdphb)|(fuevm@czkvq)|(bgufa@djuvt)|(czkvq@bgufa)|(axvij@fuevm)|(swlguy@axvij))$/","prefs":[],"schema":1579863493098,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611403","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"83d7f7c0-8a56-4feb-9e66-b77af6343430","last_modified":1579987441264},{"guid":"/^((\\{50fc0c97-b405-4f63-9c10-465cab131ec7\\})|(\\{e08f09a1-e8e4-421c-a460-ada7b13077c1\\})|(\\{887c8e31-c11d-4b67-8bbc-e5b5e8fea9dc\\})|(\\{d67b6e83-976d-458f-aece-0af986c16db7\\})|(\\{d0c0679f-9fa1-448c-a78b-f8fa1591597b\\})|(\\{23747ea4-fb31-4349-9954-2728f1d4bda2\\})|(\\{5d492e1a-7e3a-48ca-9745-784a5b61980a\\})|(\\{bec8dea7-eed3-464a-b99e-92cab1e10373\\})|(\\{48d63231-1796-4b26-a3f7-1aa7f5bed1f4\\})|(\\{fdc94eff-5212-416e-b2e4-d67c088c4907\\})|(\\{ffd2c868-9f15-48f1-a77b-c5a1842a2e41\\})|(\\{9b0e5b96-2b47-4ee4-b511-7402c05ab43a\\})|(\\{f01f803c-fb6a-4c0f-9dfa-d8f6173b3b17\\})|(\\{b2ed387a-02c8-4bff-bf6f-00ce6b5f067f\\})|(\\{7222c5ee-8154-4e47-8521-1dafcd00d902\\})|(\\{c085ea8c-57cf-41c5-a41e-38dd6288e808\\})|(\\{2cc9608c-dc69-4bc0-8d3b-95852face3ac\\})|(\\{5977f159-e17c-48d4-8e2a-8b48962a57cd\\})|(\\{10e4d201-689d-4864-a04e-f21186f3d4e2\\})|(\\{79119982-95ef-4cfd-9fe2-b193018503ee\\})|(\\{520dd821-08e0-4821-abf8-347474c78f72\\})|(\\{6ff93655-17b6-4bab-bb0e-40abfcd5a853\\})|(\\{af670583-4dde-4e1f-b169-efc5aec481f0\\})|(\\{b053d2ab-0c28-41a6-99c4-4d276af55169\\})|(\\{4b70886d-6215-492d-8330-c220b714a216\\})|(\\{21855045-7800-4467-923b-096efe6ded40\\})|(\\{6c1f8c3a-47dc-480f-8007-3204db00a8c2\\})|(\\{2dc676a9-bc76-405c-9252-b76c60cc172d\\})|(\\{d464e0a4-8798-4356-8cb1-b1b819d80d2d\\})|(\\{b4cc995f-aca5-43dc-bde2-dc5b5de620ba\\})|(\\{448b1043-fc5e-471a-8a10-5ec74fb16054\\})|(\\{becb255d-985e-4f59-9e7b-a3f678bb53ba\\})|(\\{f200084c-a7cc-46a1-a84e-289a8c033124\\})|(\\{c6b5b880-ae5e-4cad-8eaf-fce059892c0b\\})|(\\{0ea7199a-707d-457c-95d3-cc84436c5634\\})|(\\{dc702775-072a-42c4-8a7f-0e02b202a48f\\})|(\\{4a1c6922-5b77-4f07-84f7-47e504ec5249\\})|(\\{145fa75f-ba31-4f91-8664-c2559887a664\\})|(\\{b9d3f331-5a3c-494e-a0dd-5b7dc1b949b3\\})|(\\{f7801e2a-e119-434d-83c5-e87eedffecf2\\})|(\\{1b88498d-c70e-41ab-98ef-4239582e77d6\\})|(\\{b0162d70-142b-43f2-8414-30414a2b1ea0\\})|(\\{1f7166b4-c765-4129-b727-ef077814e0af\\})|(\\{ee2cd2a1-b4f8-4ef1-9fe8-db89e8844e47\\})|(\\{569c8641-f0f7-4eda-afd2-4ca6f6fc8bc9\\})|(\\{85c5a731-0b8b-4d91-bbad-07790b7a0165\\})|(\\{02197da2-c4b2-4a55-b323-f56aba8d3ed2\\})|(\\{d5250fb9-6db6-4eb3-bfe7-b8d3bf326c6e\\})|(\\{947c328f-b462-4618-bc4a-a967d1d7bc77\\})|(\\{c04bf263-7edd-481f-a3b1-0ea9d2aff14b\\})|(\\{f69637b8-b48a-46b5-b1ad-132afc1dcaa0\\})|(\\{8f2b4de9-599f-452e-9fe5-a3ea7ee2d633\\})|(\\{ebc34c54-8004-4281-8321-84145bda54ec\\})|(\\{c3f94bd2-0391-44c0-89a1-212ca3844abe\\}))$/","prefs":[],"schema":1579863851954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611277","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2af6cf76-8f55-405b-8f5b-d784616768ba","last_modified":1579987441261},{"guid":"/^((zddx9wbjta9g23vk5ejo@zddx9wbjta9g23vk5ejo\\.com)|(\\{0629026f-e941-4a98-8975-b8cdcc20fbdc\\}))$/","prefs":[],"schema":1579796394954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611198","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or showing malicious behavior on third-party websites.","name":"Browser Kompatibilit\u00e4t (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94be063-b34b-4ec1-bb02-59bc343029a4","last_modified":1579817517239},{"guid":"{c77fdf50-1880-4914-b553-6e3500f43f2e}","prefs":[],"schema":1579617431416,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610552","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pdfviewer - tools (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cb6be8a0-0600-439e-85f1-512cc1d0e48f","last_modified":1579796394592},{"guid":"{669207af-aef4-42e5-b1fa-675995be9cf9}","prefs":[],"schema":1579604778159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610480","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54396dc1-f469-4a88-b0f8-352985a85b13","last_modified":1579609877650},{"guid":"/^((crisstehn@ffmust)|(jjwalter@junior)|(qlobthedark@ggmay)|(ficlever@roentgen)|(nzclever@roentgen)|(ukkinda@rottaai)|(GOEORG_RF_ANA_N@BDOFsKOKK)|(ioadjf9340joif024rf@ioadjf9340joif024rf\\.com)|(f1a1cz46o6rzl335xcrg@f1a1cz46o6rzl335xcrg\\.com)|(03t4joaijlcvjja@03t4joaijlcvjja\\.com)|(bdojfkobidjfo9e@bdojfkobidjfo9e\\.com)|(0iwtjvpvfhqyv2go1237@0iwtjvpvfhqyv2go1237\\.com)|(g68xhmxwozq8xtp4emty@g68xhmxwozq8xtp4emty\\.com)|(idyzvr0haermejvwfaqm@idyzvr0haermejvwfaqm\\.com)|(czaoyj52ki5owo07318z@czaoyj52ki5owo07318z\\.com)|(4sgly4c7s5pca7o220g0@4sgly4c7s5pca7o220g0\\.com)|(8sd351lwavakull4dcqd@8sd351lwavakull4dcqd\\.com)|(ukkindaa@rottaai)|(besth@lgimm)|(canaddxd@ptrx)|(nlextt@awes)|(bestseg@bbcd)|(swlguy@swlg)|(germctr@prx)|(pro@socialsmonetization\\.com)|(nicejohnus@lg)|(beta@lvvtqmq4qrhgmjb2zd7o\\.com)|(beta@b96mupkh82zywdrmxecz\\.com)|(dvhi19naabzond6ikvl6@dvhi19naabzond6ikvl6\\.com)|(approver@vdmqsgm5nyfiirwh8ryy\\.com))$/","prefs":[],"schema":1579603732879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610462","why":"This add-on is violating Mozilla's add-on policies by showing malicious behavior on third-party websites.","name":"Malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"448ff9b0-94eb-4d24-af8e-b56141824c80","last_modified":1579604777796},{"guid":"/^((f53pabhktayw2qusajt8@f53pabhktayw2qusajt8\\.com)|(weatherpool@bwv9ggnrvitryck9k8tf\\.com))$/","prefs":[],"schema":1579549290940,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610359","why":"These add-ons collect ancillary user data or take action on behalf of the user without consent.","name":"WeatherPool and Your Social"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30ab36b8-c080-4ded-8531-07259112779c","last_modified":1579603732509},{"guid":"/^((\\{293476ee-263e-4cad-8dc4-2fe03209adc7\\})|(\\{622303be-705e-4247-bc2e-9016d8867e3d\\})|(\\{6ac09a19-8de3-418f-a4e1-1ee3e8810990\\}))$/","prefs":[],"schema":1579601336651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610456","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Fake premium products"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3db3364a-0e20-4635-bc63-f2bba4a10415","last_modified":1579603732505},{"guid":"/^((\\{525f4b51-8ea1-4db8-bc81-829cf10a14a0\\})|(\\{2411143d-8afe-41ea-874d-ea4a8dc8b1c7\\}))$/","prefs":[],"schema":1579250266121,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610061","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b6f17555-93b5-4721-a92d-53500d1fe0fe","last_modified":1579530103133},{"guid":"/^((\\{5335fd1c-3baf-4578-b339-516dbdcec832\\})|(\\{1bf381aa-a819-4067-a537-eadb0d6538ba\\})|(\\{0e3703a0-46ae-4d18-bd04-8f8f570fdb77\\})|(\\{b350dc7e-cfcc-4ffe-9225-9feefe922bdb\\})|(\\{eeb3bf29-f1db-4f75-a6cb-8675ace58390\\})|(\\{9a216bb4-d664-4535-baef-ee1f4db012d2\\}))$/","prefs":[],"schema":1579191500704,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609718","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Tamo Junto Caixa"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d845bc55-9b05-4dc7-ba4a-57462a51be39","last_modified":1579250265716},{"guid":"/^((_65Members_1202@download\\.fromdoctopdf\\.com)|(_65Members_1202test@download\\.fromdoctopdf\\.com))$/","prefs":[],"schema":1579193594086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609721","why":"This ad-don violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"FromDocToPDF"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ebca1ceb-555d-4ce0-8c06-5b1475f08d45","last_modified":1579250265714},{"guid":"/^((\\{61e9b862-ef9b-4cc1-9dc2-ec00e437118c\\})|(\\{29828604-0f21-4ce2-8df7-b840aa53d713\\})|(\\{9430316a-f94c-40b6-9cea-8ac0df5c6638\\})|(\\{87ad96b4-86e8-4d94-aee1-7b607d02effb\\})|(\\{26f61847-2e07-4b10-a030-267eea1bf3b7\\})|(\\{450eb888-9bba-4de7-8821-4bb806ff82bc\\}))$/","prefs":[],"schema":1579193819569,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609365","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e5aad13-e8ee-43bc-91fc-4805c8195f3e","last_modified":1579250265710},{"guid":"{f6766565-1c5d-4eff-bda7-20f00aaedd11}","prefs":[],"schema":1579101106448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609550","why":"This add-on violates our policies by attempting to install other malware","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21b59bc5-57db-4f31-9e18-614c03858e5c","last_modified":1579191500334},{"guid":"/^((\\{15ebdf9b-c3d7-4aee-9568-b42a11a7b071\\})|(\\{a3d09db2-d3ac-4403-9bfa-878de450fbb4\\}))$/","prefs":[],"schema":1579039175200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609265","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake anti-malware add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e3a3e97-c35a-4ec8-abce-a95c17d96f27","last_modified":1579039687654},{"guid":"/^((\\{976ef2b7-3bae-470e-84d9-3212d9200733\\})|(\\{d8fa8e34-e84c-4554-bfd7-16fd023b1c71\\})|(\\{d1ad5122-5caa-4986-a639-ce19bd1bc582\\})|(\\{599fb5a5-a334-4547-8a42-afccc1ddb347\\})|(\\{4bff9999-2ede-4b60-8572-a2915411abbf\\})|(\\{3a9a4c90-d87d-48e9-a799-072a7aa5be64\\})|(\\{822d29f8-9376-4da8-a7a0-4fa2eb5964c7\\})|(\\{c4926e5b-5b37-4781-87a2-28ce0b522d6b\\})|(\\{e36ea66b-30c3-481c-9e00-057b364c1c4a\\}))$/","prefs":[],"schema":1578927737593,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608886","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"361f3333-3cdf-43cd-b99e-78b666ec33ae","last_modified":1579039174816},{"guid":"{b7037d81-2c5c-4747-99e4-f4fc1c888b85}","prefs":[],"schema":1578938241613,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608887","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"RoliTrade"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd9c30ab-d112-4f58-be0d-0e213350b6e7","last_modified":1579039174813},{"guid":"{5cc1b399-c98f-483e-9799-be29c6627246}","prefs":[],"schema":1578656865603,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608432","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Rolimons Plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"05061ed7-378d-45a0-b105-3216c256b486","last_modified":1578927737176},{"guid":"/^((hddenobdjekcmnkgfpkodhohcjghiijm@chrome-store-foxified-1800284493)|(\\{90e41842-755d-40e0-9136-8129dd44a65c\\})|(\\{edf47ed5-7efe-4725-85d9-5e7a30d42998\\}))$/","prefs":[],"schema":1578665901864,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608433","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6975177c-1dc8-4fad-94f0-7a43ed397977","last_modified":1578927737173},{"guid":"/^((\\{3acb1e80-e126-4024-840f-3297659f9448\\})|(\\{44e3f210-6036-4364-90b9-3e8bb6fb3d98\\})|(\\{51e7e0fa-69e1-43f8-9578-d8372c2885b7\\})|(\\{1c2393b0-f2f7-497d-a34e-399dc6002d26\\})|(\\{a6a02c49-fafc-45d0-bb60-9f940a64c99a\\})|(\\{02a0090d-026a-4d02-a530-1b4d96e80c14\\})|(\\{9a988579-6773-48c2-91ab-8e917b20ab90\\})|(\\{22dfee7d-aa7c-4765-95e6-e81513cc7d37\\})|(\\{8c6d03f8-db65-4d5c-8431-ff66365847c4\\})|(\\{168b7acd-43d3-46d5-b76a-de3139dd9570\\})|(\\{abc95bbf-2548-4bf3-a0b9-9cb028496277\\})|(\\{d1282b8a-c467-4b02-9c11-e63e614ee8a8\\})|(\\{338422e6-bcf6-4171-9541-1c0f8c3dc3db\\})|(\\{10d5b345-535a-472b-8e8f-4f1a1cec9f2b\\})|(\\{64813672-8b55-4ac3-8dd2-c1da80132b77\\})|(\\{00e7df6e-7a0f-44d1-9fc1-0ddbdb473f4e\\})|(\\{564c2b95-b70b-4243-84dd-21fead791642\\})|(\\{71deda20-495f-4061-9c90-f46d1f7dfedd\\})|(\\{054d7610-9edb-47a7-af57-aed4be023015\\})|(\\{2b3f6877-99b0-4d35-8b85-9f75dd53ac92\\})|(\\{299f2568-3330-4466-8b47-4240643f8200\\})|(\\{077ead0f-8e84-4d6e-8fb1-a22126f9bf4f\\})|(\\{8ae52853-efd8-4d3d-b8f4-f70b048a389c\\})|(\\{36321783-e1c3-4f95-859a-d1c88eb75327\\})|(\\{7f878add-6b95-4b57-ab16-d8688819373a\\})|(\\{10148e15-b7f7-43bd-89c0-01957aad8188\\})|(\\{65e3540e-c3d9-4831-9dbf-598f2ef38d7f\\})|(\\{6fe77565-de36-4d06-ae30-59e3c98fc974\\})|(\\{7c79599d-ddde-4f62-9561-3c7aaea788a6\\})|(\\{d2fb1b99-98c4-48ea-ac43-8d729a1a8963\\})|(\\{38387674-fcc2-4292-a20b-08931ea0936e\\})|(\\{f00678a9-4b60-4a24-bdb0-4ce6c960cd28\\})|(\\{15d08bce-4f8a-451f-bdb5-5d1f720dde7d\\})|(\\{3a1da641-0fcc-4c06-b4b9-21d8d5dd3720\\})|(\\{6b7a8c7d-3956-4ac3-8c98-423a0bed1d75\\})|(\\{28f786b3-64a1-4152-9629-efabdede0b4c\\})|(\\{b1535617-e25a-48fe-b47d-c57affc65d5a\\})|(\\{255f303c-d5ce-47af-a925-1ad2c84c710f\\})|(\\{0ab25c60-4750-45f1-85f2-913440d6c6fc\\})|(\\{6cf0ef3e-d911-44c0-8b58-7abcb99d0243\\})|(\\{991c3933-0b3b-49f5-b3a3-1a60bf62f269\\})|(\\{bc5e31d7-42da-49c2-9624-1b4d5707b5ec\\})|(\\{8d8320f0-df3c-48f1-8839-f6969cbd3c17\\})|(\\{35f35aaa-506e-41d4-8468-3c4f4a56b434\\})|(\\{f1f6e2bb-32d1-4d79-8e5a-659e5af15b78\\})|(\\{1109f231-559f-44dd-bd84-85fac05f845b\\})|(\\{b6111372-b58f-4130-a6ae-a1445a196d85\\})|(\\{b21099c0-e496-443b-8d43-610a9aae60fb\\})|(\\{d8a40da5-bbca-417e-9ea5-e77332739366\\})|(\\{5dcaea9a-e152-4667-a4d5-b29f5afe9e61\\})|(\\{98b95d2a-1de8-4234-a73f-568531785850\\})|(\\{b11ad72d-2f64-4494-9f5e-6ad2e36bfc16\\})|(\\{3503a09e-76e5-4fba-8d65-d8bbb198b2c1\\})|(\\{f45fac5e-f3b0-4932-8c8b-254c6dcd3219\\})|(\\{4210d4ec-9e2a-40d1-83de-53a9728c01d5\\})|(\\{10691e9c-7399-4fb2-b824-256ed6c8c08e\\})|(\\{148338c2-ee0d-4659-baed-5b9aca28407f\\})|(\\{f3a2a32b-ec49-4fc5-bb46-f00f86d4cbff\\})|(\\{425bd894-b282-4a58-a2d0-3054fe3fd856\\})|(\\{7ccc3a62-7f92-4a1e-8e32-af734721a136\\})|(\\{91c939ae-00db-400d-a814-a964dc85fcf8\\})|(\\{83fdf43f-c064-4ae0-ac5f-6668fca576b0\\})|(\\{824f975f-a740-47d5-b4c8-0868fdcb154f\\})|(\\{2404f236-28ae-4852-b50d-50e66312f69f\\})|(\\{3f307709-bdf8-4dc5-afd7-4aaeb2a85176\\})|(\\{24f3c174-f09b-41fe-8c26-dfc051b2f352\\})|(\\{ecb81864-05bd-45f9-a1a3-5f56ad62c1c0\\})|(\\{fecad0e5-5f8c-4539-8893-9a4c9e4ab567\\})|(\\{03badfb9-bba5-4a3b-ae1e-0bde1bef38f3\\})|(\\{1f2defb6-af80-4822-b1d2-816c0575dd8b\\})|(\\{195450ff-844e-4ec7-b111-166c28e54b6b\\})|(\\{abd20b0f-3f79-4cdd-b2f7-6ed4f9a3e546\\})|(\\{b1a2d328-e1bc-46b5-b6d3-d4c5366a6262\\})|(\\{49d113aa-c37c-4a49-b73e-69eaaaec519d\\})|(\\{f9fe81b9-29be-4e30-ba7e-821e96b74c00\\})|(\\{c47a57e5-9486-4b58-b4e9-2e49e02c39df\\})|(\\{48aecb91-709c-4660-b0f8-681c177628bb\\})|(\\{0033af2c-0017-4237-821d-24e1ce20ed20\\})|(\\{d95d2ab6-2728-4d89-b4f2-74fc3abcfe26\\})|(\\{813bec70-cac2-497b-9117-8873b5e33cbc\\})|(\\{b613e7fc-3274-4874-b59c-b2afaaba60b5\\})|(\\{f88e19b5-9434-455a-a2bf-de13250a642b\\})|(\\{562fec92-ba72-4461-a73b-48b0cc87c943\\})|(\\{c8d2d52a-5617-420e-9568-983c0c7a6982\\})|(\\{7e32bebe-f9ef-4328-a4f8-7a86afdb9568\\})|(\\{b95fa449-7f1d-44dd-84c7-65565334d1e1\\})|(\\{788d6386-606f-45fb-83a6-af4956d9aa11\\})|(\\{00a646ad-3d34-4ca9-9633-9ea96be7a225\\})|(\\{a745c5df-b386-4906-80ba-ec9b6aa6b37a\\})|(\\{a3b508d5-864d-43c5-a4ec-9d5523cd01a6\\})|(\\{4e945e2a-b553-45e6-8dcb-495c60a663a0\\})|(\\{1a6ea1a0-1a2a-4a57-91c8-07cb629588ce\\})|(\\{20ef853f-2c16-496c-bcd2-5109a7a1be59\\})|(\\{cb5604d4-d166-4060-978e-1c7ddfda4a94\\})|(\\{9207a89d-db88-4ef1-bf2e-a89c12d882fa\\})|(\\{f561afa7-165c-45c5-beef-754e16b40794\\})|(\\{09021ead-28e3-415a-8f9d-ed250954147c\\})|(\\{1d6ef53c-0407-4eb6-aa80-b672788f9d0a\\}))$/","prefs":[],"schema":1578858092043,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1491ea56-7723-431d-be05-5808a3101bf5","last_modified":1578927737169},{"guid":"/^((\\{2b046d1e-b392-4073-ad8d-bb882b073be0\\})|(\\{69a8db6c-b55c-4560-bfa7-edf21ed9f265\\})|(\\{d41d46ca-a557-48df-a951-e968a1168137\\})|(\\{845d89e8-e3c0-4447-ad36-9fcba4d3d28c\\})|(\\{da572bae-f959-4f9d-aade-afda00b83e2b\\})|(\\{fe334432-8ba6-4444-8cf9-1bb59c308aa0\\})|(\\{b8242421-8cd0-4064-a6e8-bbfdd62d67fa\\})|(\\{7d863da3-4f8f-4b2c-87cf-5bc7a03b24c8\\})|(\\{fc53c14b-9bdf-4a0b-9f07-421109bcab31\\})|(\\{7771103f-bf4a-4757-b679-2ec30eae8cfb\\})|(\\{66196147-9b28-4050-a46c-c9bf668511d2\\})|(\\{a41db617-17b7-429d-b135-5fd5d54b9ad6\\})|(\\{aa0e1b27-728c-4e45-9b7e-7731e8d6451f\\})|(\\{6e12cb13-d166-47e9-b1a6-ce980e1489bb\\})|(\\{3b3e3db5-2710-4bfd-bce8-bf3a1b5e0bc0\\})|(\\{3e4763fc-2175-4a69-9854-f437774da824\\})|(\\{63708597-3f14-494c-981c-bbecb10fddcc\\})|(\\{ec2c5f61-37e6-49dd-a430-6f0060f6e152\\})|(\\{8eb7ade7-96d3-4be9-b20e-f321fe07c9ec\\})|(\\{b9b60c96-b158-495b-87ab-db97fe2aecac\\})|(\\{5d885234-3fff-4c81-bfe0-7e01ca9701f1\\})|(\\{79cb8cb6-a0fe-434f-a6d6-2af167fbb069\\})|(\\{ec41b4cb-5c60-471f-a68a-d52e91f54292\\})|(\\{fc64c6fc-4356-42e4-8253-75facb478836\\})|(\\{d68b6b30-81e6-450b-aa7d-b0e3f1b11e2e\\})|(\\{6E01B689-3E52-44B7-A33A-197C48498C0D\\})|(\\{D4EE626F-0BE2-4CE3-B635-11498D2EAF24\\})|(\\{bea54a21-f8e6-4a47-a739-84aa5a03a391\\})|(\\{57FE0157-8BDB-4C11-BCD6-6654E0C1AE3D\\})|(\\{8B8E2B7E-7DBE-4EDD-ADA1-8AA93098E3F3\\})|(\\{66c281ce-2682-4182-91da-6d3742ce9a9a\\}))$/","prefs":[],"schema":1578922331209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d8ef0aae-2659-4076-be2a-ef0cf0388c49","last_modified":1578927737166},{"guid":"/^((\\{d26e41d8-8dfa-4a08-ad90-6df0240c8290\\})|(\\{9ee44d55-47d9-45bb-b56c-79ab2fecd93e\\}))$/","prefs":[],"schema":1578582285426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608291","why":"This add-on violates Mozilla's add-on policies by executing remote code and/or collecting user data without disclosure or consent.","name":"Converto Wiz Ads Search & PDF Converter HD Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c502c85-3f2d-4a3b-9abf-249eff0968f0","last_modified":1578656865193},{"guid":"/^((browser-safety@browser-safety\\.org)|(facebook-bookmark-manager@fbtools\\.io)|(facebook-video-downloader@fbtools\\.io)|(extensiondist@browser-safety\\.org)|(selfdestroyingcookies@dirtylittlehelpers\\.com)|(googlenotrackpro@dirtylittlehelpers\\.com)|(youtubemp3@yttools\\.io)|(youtubeadblockerpro@yttools\\.io)|(videodownloaderpro@dirtylittlehelpers\\.com)|(simplysearchpro@dirtylittlehelpers\\.com))$/","prefs":[],"schema":1578653962604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608387","why":"This add-on has been blocked by Mozilla.","name":"Several add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6368943f-3d77-491c-82bc-f29591e170d6","last_modified":1578656865190},{"guid":"/^((\\{1c1a344c-b8d3-4783-ac5b-9a9d241c29b6\\})|(\\{a4fccc0e-a372-4127-983e-c0f607427a89\\})|(\\{275f2631-9a1b-4ab3-8c6a-4529ecd8512b\\})|(\\{0b1104bc-8ec5-437e-9d81-2cc641cbe8c6\\})|(\\{4e373c31-1942-4c9d-93b3-38b0ad701f27\\})|(\\{7f1af5f0-b450-44f2-aa5f-bc4c793553db\\})|(\\{68c84054-b43a-4a78-bb35-27ec06974d1d\\})|(\\{f959a2e9-f211-424b-b0cd-ea7ecf269753\\})|(\\{fef99996-e542-45b6-b383-86132e67a93f\\})|(\\{c1bd56b2-4b48-4366-8d04-16a0f69f7b4b\\})|(\\{17456fc3-4777-484a-b177-9b82752a738e\\})|(\\{9c746226-1a87-49e2-a083-725c5fc10885\\})|(\\{3056ec65-736e-4a77-abf7-9d0b44ba0b74\\})|(support@seovpn\\.net)|(\\{fbb6a675-8923-40da-86cc-a547eae63594\\})|(\\{bf9abe9d-4589-41f2-acd4-e5dd9d4a4595\\})|(\\{d012bf08-e9b1-43a2-b6b4-b60c0fdd6fb7\\})|(\\{0cc696dc-6214-406f-8831-1d0ae14c2eed\\})|(\\{39ef127b-a7c5-4cf6-8383-333ce2300707\\})|(\\{77af48b1-2786-430a-a2f8-f0e666ecdb86\\})|(\\{9807c7c0-0d7b-4ee9-b39e-4a2b10f74b74\\})|(\\{21ceb717-4e26-4843-9229-b0a55c629c6b\\})|(\\{ba87282f-fb6a-464b-b2b4-18ab718a6b9e\\})|(\\{f844e48e-929c-4dc7-8224-c829b67d453f\\})|(\\{2af80abc-e031-42c6-b800-02dd4dade3bc\\})|(\\{849583eb-dd9d-424e-af82-d64205b79bb2\\})|(\\{8d8963e3-810b-4e72-85d9-d6e8affbe8e1\\})|(\\{aa385b5c-14b4-4d2a-ad81-db3cd054efe6\\})|(\\{c30a6fea-44b9-4f3e-945a-401485d7e152\\})|(\\{327735cb-5842-4296-a8c9-660118c9dbe8\\})|(\\{2809097a-41e3-468b-9c33-2ce449bc18f9\\})|(\\{91b36c25-1dd4-4a1c-a722-a1868deed9a1\\})|(\\{3b61770f-a22e-4704-be5b-310a729e6652\\})|(\\{b1741149-382d-447a-b8fe-bd2dbf03b252\\})|(\\{8a5d399d-3716-4627-ad97-750cd10783e6\\})|(\\{a1bb458d-6a71-4efb-a032-04f44f638a0d\\})|(\\{8a86326c-5b59-4c87-af77-becea91bdc7f\\})|(\\{21b022a6-b739-4787-a071-268f45bd4f0f\\})|(\\{59e225c1-5a78-40b4-bb6a-9cd783eea9fd\\})|(\\{d0ba8c04-3d8d-4c87-8eec-355d3c1dbc57\\})|(\\{d0b408ae-c1b4-45b1-8d0f-5a9135dab115\\})|(\\{c802afcc-8fb2-410c-a50b-0dfc4e502364\\})|(\\{8ef92c49-fe9b-4354-b943-8fbce6156ab5\\})|(\\{40d41864-a14a-45e9-bc75-ff95189975cc\\})|(\\{b5f5f423-85e5-4641-8517-2549ef2597ff\\})|(\\{bd4e3180-94a8-4d2a-9186-b15ccbca2abb\\})|(\\{1099ff05-78d0-4a0f-a348-0e60d8e627f3\\})|(\\{9d7450f3-9f39-4dda-820b-ac50797229a5\\})|(\\{9762a546-d483-4d82-9e97-e8293b67ab3b\\})|(\\{233e675a-f2e9-494e-a62a-56a8e75440d1\\})|(\\{44b31737-7370-41ad-9a16-7e92f993d651\\})|(\\{5e8c48e7-43a3-4f5c-8f61-018e994ed581\\})|(\\{cabb5a82-b018-40eb-b551-08b7c6b28d25\\})|(\\{19c2d564-4774-4b52-b175-0d9a674a1ee7\\})|(\\{4d6bc7a3-8d17-44d9-a1c9-34b6c72d2a82\\})|(lin\\.Vin@userx\\.com)|(\\{a74a99d0-f5ac-4775-8af5-ad48341865de\\})|(\\{b8331308-eaa2-40ca-94e3-d5184b9555ab\\})|(\\{43a11cab-4d48-468d-88ac-6632c2b90f0a\\})|(\\{13fde54f-87aa-4966-801b-189946617b03\\})|(\\{051e900e-73a7-42e9-bf92-54a05b592814\\})|(\\{389a79d4-7af9-4c22-8e3f-0a424a9d16a6\\})|(\\{d80ce712-fad0-470f-bb42-7f0f5d10ac66\\})|(\\{b08e2ddf-304e-4336-b7b8-15698239be1a\\})|(\\{5bdae4dc-1859-4766-97c6-5d4b7d5ccb68\\})|(\\{a8b80325-5125-4d50-95b8-e3548eca99f9\\})|(\\{16f5bfef-6792-48da-9458-c15a904a3202\\})|(\\{821251e6-48aa-4eee-aca2-d2003047eba7\\})|(\\{e4d3e60e-2980-4899-aaa5-aa2c8571e8af\\})|(\\{00bde975-f669-4fef-aca4-de3335e5e629\\})|(\\{815e064e-df14-440a-a9c7-6191d47f302d\\})|(\\{12267241-c4e5-49b7-afc0-1ba02cd86146\\})|(\\{1461d5d5-0180-4e5c-870c-1648fd13eb3d\\})|(\\{09f52a46-5e5e-4bb7-92e4-5a802ba2dc65\\})|(\\{89fd7bd0-b6cf-49cb-981d-6eaa3515e09e\\})|(\\{309cf23f-2ca7-4308-9c31-03ef0cf0e8df\\})|(\\{604184f4-c000-4071-8b27-ae7c191dd575\\})|(\\{45c9a869-b55f-4792-aefd-e353229b48f1\\})|(\\{1b7f62a2-5dfb-4a7c-8613-a2333ae83337\\})|(\\{6e7e98a6-d7e7-4319-92bf-283cdcbf06b0\\})|(\\{2e60f9f6-f57f-46e5-9876-b50f84154a04\\})|(ali_nasiri@mefa\\.com)|(\\{d7909c43-9b01-44e8-aec2-d569a3461183\\})|(\\{d64d110d-2783-4663-b533-036338b0fabc\\})|(\\{8c5a0a9e-480c-4571-acb3-602cb081f9b9\\})|(\\{1efb16f1-34cb-4179-b27b-301f1a8d023a\\})|(ali@mefa\\.com)|(nasiri@mefa\\.com)|(nasiri_ali@mefa\\.com)|(\\{de57334f-24fb-4b0d-9087-d2945212ba76\\})|(\\{e45a208c-582f-4549-8c39-3e3b6c3f503d\\})|(\\{7cf37c0c-5cf2-4945-8c82-ffd5a1206abb\\})|(\\{aea2f3bb-b278-4ab3-a2b1-370b74a2795d\\})|(\\{c0d80342-fa84-4366-90d5-0d2c965a6c71\\})|(\\{e7953669-b2cb-49bf-8f53-9b2cedbe4df7\\})|(\\{0f5248f4-bb0b-41ee-9162-397ac92538c8\\})|(\\{f2a73021-b834-410c-95c9-6e9e826c5523\\})|(\\{ac9759e0-3657-40c0-8da8-aa83b2df14e1\\})|(\\{AABB3453-4EAC-421A-34FA-4789107489AE\\})|(\\{e471c14f-775a-474c-afde-e2562f35a1ee\\})|(\\{8a420af6-7de8-4d13-bc74-1b90e3a7c45e\\}))$/","prefs":[],"schema":1578325482610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87a59976-a41c-48e0-a05f-b00ceddc3990","last_modified":1578409770946},{"guid":"/^((\\{29e8ec68-5717-4d25-8465-c8ad11c2493e\\})|(\\{1807ab11-ce49-47e8-b29f-2c7f3b27957c\\})|(\\{d497ce7b-9308-4a00-81c8-f1e20769d9f4\\})|(\\{3e2a7fe2-d800-4300-adbc-85d45101ccbb\\})|(\\{41a6db99-eb5a-436f-add8-6655030cd3c4\\})|(\\{d0041bb0-914b-4105-8335-f19dfe4000c5\\})|(\\{16c0318f-441f-4996-9420-9582cd8dc4a8\\})|(\\{11560f98-1a72-428e-901d-19eee028703d\\})|(\\{200fc207-8d2d-491f-a14d-898c2af6005c\\})|(\\{6098201e-19fe-4930-8235-507abc271c92\\})|(\\{47247604-b3df-42ef-a7d6-e6f54f3ed34d\\})|(\\{d9e45250-0a78-4fad-bda9-435289e1117d\\})|(\\{7897756a-f527-42fc-8327-23afa5a73037\\})|(\\{ebb45fe8-b626-4d4a-9b51-4c61be7d8ec8\\})|(\\{17a3a525-b5e9-4bdf-9f2f-0a6b82489261\\})|(\\{7d5e14ab-7973-45ee-9b5e-fb2af9105a58\\})|(\\{3db27392-c030-4b1d-a461-df246030e8ed\\})|(\\{687dbc1c-4640-420e-b5e0-69ffbff851a4\\})|(\\{99f71699-61a0-407e-9a1e-4f7f2b24032e\\})|(\\{9608a917-807d-426d-8b3d-4bd8e6669d3c\\})|(\\{6d0d1145-1b99-4c1b-9112-a0698ce1ad93\\})|(\\{02373fa8-bfe0-4f6d-bf65-cf843ae16ca9\\})|(\\{76e05242-0ea0-47dc-99ab-85a5768d24ee\\})|(\\{b2671579-9ae7-4e10-9aad-e484189f2599\\})|(\\{f8574a50-a306-455d-96b3-9a95590e3351\\})|(\\{d2a79680-fab2-40d5-93c7-3842a3c7a170\\})|(\\{6d3d4ff6-42b4-4ae6-8273-e55309e194ef\\})|(\\{e26d666b-5437-4b51-9a35-6a32ef2ebc93\\})|(\\{1d1e0112-694e-499e-9a6f-fd4fdd8a0400\\})|(\\{8fef18c6-29cc-44db-a373-2476eaa98d07\\})|(\\{bca08103-f769-42c1-9e83-c3dac1d073e5\\})|(\\{9be3ea2f-3def-4ace-a4ca-a36bd350ebe3\\})|(\\{e4a7d768-fe07-4b2d-8722-782ecd2d857d\\})|(\\{ed0bae9a-6c29-4615-b7b0-8134008f866d\\})|(\\{6a230256-13ad-4912-88fb-35dfe6fc8405\\})|(\\{f33c98b2-f1fb-4e82-a472-b27aa763b697\\})|(\\{692d8158-fc1a-43b9-901c-9211c5f00129\\})|(\\{f43b5702-0a0d-4f50-a012-a9fa25d19ac4\\})|(\\{e5d75e88-cd31-492b-a63c-ab6759658d4f\\})|(\\{706dac82-d1ce-43b6-81fd-77652fad15a9\\})|(\\{8c403e0e-104d-46ec-8355-5b7d57d35e6b\\})|(\\{c5a32b03-4044-4085-91d8-af1d688c0c66\\})|(\\{76e7835b-8600-473e-870f-aa1e9ac922de\\})|(amz@userx\\.com)|(\\{d2b50060-69cd-422b-bc5a-77590580adfa\\})|(\\{e9d1c5e0-e297-439d-a536-efd94b0baa06\\})|(\\{80816d1d-664a-4710-915a-99c298970b38\\})|(\\{3cf55a2e-ab5b-4a2a-8b5a-0760f46ffcc1\\})|(\\{be762a22-7fcf-4c67-a8e4-7f2b085a9f50\\})|(\\{2df2d33c-e1fb-4eeb-b276-a84bd3338e0f\\})|(\\{133ce0f4-83f3-4fec-b672-0067748ccf1f\\})|(\\{b575f7f6-5afe-40f8-8bb3-92c0ca24371f\\})|(\\{d514a041-1260-4512-9759-55c30b63bc20\\})|(\\{4129ed8c-e3ad-4e88-832e-66314cf44268\\})|(\\{9e97ac90-9eb9-429f-99f5-d61f60052068\\})|(\\{3366bcb1-8b0d-4451-9c1b-cf8aeb8e5df0\\})|(\\{3d06b84f-0b8b-4a7b-9a55-22c226c85a55\\})|(\\{e2f8e0bc-62bf-40f4-9dcd-3379a64db2bf\\})|(\\{3e998c2a-c05c-4445-9567-7a1948077970\\})|(\\{51cefcff-f7a1-4c57-b6bc-bad9fc9f275d\\})|(\\{84d6d305-ccc0-4879-b80f-708318ebcaa6\\})|(\\{05a2137a-9dde-476d-a63e-d80400d6bf36\\})|(\\{c2627d22-c3cc-4c5a-a69a-eca6cfe9ac90\\})|(\\{3cfe4756-4994-4c92-a97b-adc57243a277\\})|(\\{5a05e509-59a9-4358-b994-a062d97a7d0f\\})|(\\{791bc86d-dae4-45d5-957c-fe56843770f3\\})|(\\{8976df61-4480-4d4d-bfd1-2e9d0635eaa8\\})|(\\{f4ee4889-fed0-4598-a8b2-c3e224250d82\\})|(\\{e26b2735-47b6-4239-a3d2-0e4ca4293076\\})|(\\{ae9589dd-3141-47d1-9449-8e719044ff92\\})|(\\{ff18147b-3853-4938-b15f-241d99f4e590\\})|(\\{758126c6-d156-4eed-8870-477eefb17281\\})|(ella@fmt-tools\\.com)|(\\{e4df007c-60db-418b-97f3-d7896c441515\\})|(\\{90e41842-755d-40e0-9136-8129df55a65c\\})|(\\{faeee13b-39fb-49dd-82c5-47604a2e2e9a\\})|(\\{c3583bcf-271e-4b41-8207-32bd3db491a0\\})|(\\{cbe6f8d9-bd60-4f27-acd1-388a976e3749\\})|(\\{18be83e0-4bc9-469a-bde5-cc671acb022b\\})|(\\{97152370-246f-4059-999d-92f26f358e71\\})|(\\{8a975636-e12e-4532-ad35-9d9e691a246d\\})|(\\{3eb5ea84-a445-4dab-8074-d29dbf4e66f0\\})|(\\{f19cf85e-47ea-446b-808d-38f4010594b3\\})|(\\{b28a1358-5cdc-442e-b851-613bdf118320\\})|(\\{90f0ad05-0267-4ea6-9809-1098ec724905\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d4\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d5\\})|(\\{4625fcb8-6b60-49e7-9447-31cb1e2a2d59\\})|(\\{7dc2d526-d11b-4e6f-9301-a4bc620f5838\\})|(\\{d763ea47-6889-4e23-9b6c-ac56087c96a7\\})|(\\{3c7f00c4-4e4a-411b-960a-4ce782ece6c9\\})|(\\{8c1db2e7-c550-4d76-8009-ad9fca9c0813\\})|(\\{0b23f4db-0f49-44b7-9d27-b424ba9f6d62\\})|(\\{d798f753-a0e4-4d8b-866b-3b817b7b6d25\\})|(\\{e3d7ec01-ada7-4330-899b-bce60c64471b\\})|(\\{3a210e15-601e-4204-8690-cb05ed14019d\\})|(\\{51226db3-500d-45d1-bbc3-a9bf560caf39\\})|(\\{0aa6f915-ed71-4de8-aaeb-63f799d83af7\\})|(\\{3d46809c-6c20-469c-a608-3ece3121da4a\\}))$/","prefs":[],"schema":1578335483666,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0bb0f9b4-6807-4642-9199-026411426eb2","last_modified":1578409770942},{"guid":"/^((\\{af51d321-202e-49af-9a3c-78a5ebb22b63\\})|(\\{749b293a-1e19-494b-8a3a-cb79d5464226\\})|(\\{fbe6ff3f-2675-466a-916e-352080c27adb\\})|(\\{ad0378a7-5153-4e6d-999c-6c8e49868293\\})|(\\{2f7de182-3427-4386-a880-c601050580ab\\})|(\\{99bad30d-3792-4a03-ab9d-8e88f5f1cccf\\})|(\\{475b8326-3218-492c-b4c3-32307053c21a\\})|(\\{18571b27-500b-4604-a4ea-e0e7d8b61ce6\\})|(\\{fad11a52-2f9a-4d89-b712-f61184d756e7\\})|(\\{113c9d19-e80a-4c72-9a23-58f7b08144cf\\})|(\\{a0b384d9-c275-4670-a4be-8b0be45d562e\\})|(\\{19bac525-be97-4470-b76a-c24168d5e6e8\\})|(\\{2a40afd4-e56b-425b-bff2-62f190d80fac\\})|(\\{cbc65b60-2350-4b7f-8c83-1b9182a56430\\})|(\\{6adb7178-1105-46e6-9a4d-1824385cef5d\\})|(\\{6d46665c-4708-495d-a929-096ea137a08d\\})|(\\{fd6273bc-3b55-4bf0-872c-146b3feb73f9\\})|(\\{707783a0-6669-4e1f-8036-53f5c936304b\\})|(\\{7086907a-f6fd-46f4-b51c-a7dd2b10509c\\})|(\\{0ed69e4f-6cec-4bfa-9004-076ebd0be34f\\})|(\\{d051ddb8-1de2-403c-84d2-afd96a3f4550\\})|(\\{52699f66-62fe-4970-83eb-5ad82bf72497\\})|(\\{6c32d68b-4866-4277-b454-d824a3a3209c\\})|(\\{d608864f-5573-47eb-a2d7-46d158ee3fa7\\})|(\\{38c59c7e-bc02-4e7f-89ea-c4d9555362c6\\})|(\\{981a212a-52b0-4413-976c-a4730f1df128\\})|(\\{06e004dc-40a8-4123-addc-c6b6eb5234c7\\})|(\\{c87d86f9-d5df-4a24-9fe0-dd39232e4d88\\})|(\\{86baf51d-21b6-456e-889b-c7d96ba2fd63\\})|(\\{db83a6c1-efb7-45a1-b074-8e3e5a53793e\\})|(\\{70c00ae0-5b15-4ee8-99f9-23d85c63c07e\\})|(\\{ff72e707-d6e2-446f-a760-6ff187f107c9\\})|(\\{6f65c53b-596f-4238-afa2-347150b3ada3\\})|(\\{95da423e-90ec-43d9-b5c8-e195bff7b432\\})|(\\{4a792129-a244-4a39-a416-ce4f7743918f\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e16\\})|(\\{49242aa4-83ba-4e25-a827-4d1ec86972a8\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e19\\})|(\\{3505b15c-533a-4c2e-9065-6d7b2381a7f9\\})|(\\{07daa733-944d-4b0b-9bce-01638b9d9b42\\})|(\\{ebb69cbc-b69f-4d3d-a676-83811a061baa\\})|(\\{f9327eb7-2532-4e45-a551-a9f8233e4ef7\\})|(\\{4fcb9938-6716-46ce-8107-73f3cc7b3900\\})|(\\{cee1ccee-5508-4927-a939-9a557e63bbc8\\})|(\\{c6973149-51bd-443a-898c-e4b26d4ee44b\\})|(@mouselessjj)|(\\{39772968-f7e5-4a84-87d2-adcd2d032c69\\})|(\\{3ba568f0-bb3a-4744-b64f-46c428f3bd99\\})|(benalio@gmail\\.com)|(\\{70c50468-54be-4d7c-b1b4-b7378d0ff45d\\})|(\\{f77c3471-806a-40d6-9fdc-7df832f7ae74\\})|(\\{cf660d66-4aac-461b-a05f-b71b62f549c6\\})|(\\{1c58ca6f-91ad-4423-b8bd-f5323df92eb3\\})|(\\{1a393581-d6ce-454f-a503-8a321ba0f022\\}))$/","prefs":[],"schema":1578339693692,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607422","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18cdf7c5-6650-46d5-a536-364ce9dcfa92","last_modified":1578409770937},{"guid":"/^((pro@affiliatebrowserguard\\.com)|(beta@affiliatebrowserguard\\.com))$/","prefs":[],"schema":1578394762485,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607211","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user consent or control.","name":"Affiliate Browser Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c8aa2f43-2c48-4628-af4f-0987125d0441","last_modified":1578409770930},{"guid":"/^((@adultdownloader)|(\\{6391a084-dd1c-41b8-aefb-ce207da8bf21\\})|(\\{19e997bc-8449-4ab3-b4f2-f24db1053fa9\\})|(\\{e65a0802-7bbd-4c83-9bec-50ec16dadcdf\\})|(\\{6928cfc2-eda9-4971-8d8c-de26747c27ea\\})|(\\{93c15410-f7c9-41a7-a13d-28dba750f15e\\})|(\\{d7c369d6-74e2-4da7-8eef-dc134914facb\\})|(\\{e3109828-453d-4fc1-8019-488f891720d5\\})|(\\{d825dcfa-4340-4330-b4e7-b208439ee961\\})|(\\{8e7d2b8c-6167-496d-8e4c-45d9040a4a7a\\})|(\\{62935c48-c7bb-4a6c-a1b0-449fdc8737c0\\}))$/","prefs":[],"schema":1578166891954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605959","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c086bfd7-15ff-41eb-ac43-d84e95606eec","last_modified":1578325482223},{"guid":"/^((\\{943773bb-c8a8-4576-bf3a-7cacca534887\\})|(\\{0afab6d1-c267-4ff6-9289-4a2b2ad78f33\\})|(\\{4278c56e-7b67-43ab-8c87-f68a6a883df6\\})|(\\{f146cde8-6dcf-4ebf-9d67-b7eccc9bc8a6\\})|(\\{d0e43d96-0e73-48d7-9a60-b235022f4330\\})|(\\{a94ed9b8-24a6-4719-97af-08eaac91a42b\\})|(\\{d62ca114-0f4e-4d25-813e-292d0c682e05\\})|(\\{908b1c05-3766-45e1-b56b-f0b4457c6451\\})|(\\{068054b5-46c0-47c2-be37-dd015fb1c050\\})|(\\{1c1cde54-c8e9-4c61-a2be-30411888ac8a\\})|(\\{b06648df-3c80-49e8-9d9e-71741ba28c72\\})|(\\{a085da90-cc10-4c26-954e-ae4eb773c6d7\\})|(\\{1d53aa0d-eca3-4bb1-947c-aebfdd0770fd\\})|(\\{83ebd575-b66b-4b02-a628-d2764194d0a6\\})|(\\{fd5f7e74-2e60-454b-b702-05e9d66b334b\\})|(\\{fdd2f5a3-9061-4fc8-87d2-cf7f7668d336\\})|(\\{f890d432-ce0b-4857-b030-dc36fc791423\\})|(\\{d5b4e84c-7991-4be5-9c26-c3e92ba0901a\\})|(\\{8d54459a-34cb-461f-b1fe-2266484cc098\\})|(\\{67b21df3-a1da-48ee-aee8-18ae8ad7fe21\\})|(\\{18feff20-5892-43cd-8606-83e8e7c33ebd\\})|(\\{554e901f-5476-4fad-8714-a08b8249068b\\})|(\\{248c9c9f-404d-4284-bd12-2fa988edb0ad\\})|(\\{9c347568-2528-4dea-8a0d-6e9fa7f88512\\})|(\\{0447e445-abb9-450b-b12c-de16fa40e176\\})|(\\{3015019d-1c2f-4310-adf1-1b33c4566d9e\\})|(\\{a3aca1ed-74b4-46d4-9c73-ca9ba8c91ac6\\})|(\\{7b2aabfa-673f-4afb-9cba-7a9329a24d79\\}))$/","prefs":[],"schema":1578083875760,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606925","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"de533f3a-d0e3-4704-916e-fd2a297cee93","last_modified":1578084466436},{"guid":"/^((\\{a91c41b7-4196-4867-84b4-d417a1b10da2\\})|(\\{e3d3ea5c-c8c0-4c9e-89c6-f6b5677186cc\\})|(\\{fa3b6777-4f64-476c-9ace-a79709ccd0a6\\})|(\\{6251b844-0c54-44bc-8c5e-891e3ba86c2e\\})|(\\{8e588566-afb2-4612-a420-3e3bd18693e7\\})|(\\{a0bf35ec-76cc-4d86-875b-09d46e8790c2\\})|(\\{fd257beb-d772-4333-9901-dc5913aee499\\})|(\\{a9acb248-93fb-4081-9d88-92468f229842\\})|(\\{7e1b62bc-3ab4-4c4d-8182-b095a492eab4\\}))$/","prefs":[],"schema":1577994095119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606132","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or executing remote code.","name":"CodeScript and WorldScript"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d3f2971-9764-4b6d-94ef-2a0b97da7619","last_modified":1578066343576},{"guid":"@mendeleyimporter","prefs":[],"schema":1576845976756,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600910","why":"The add-on does not comply with Mozilla's requests to provide reviewable source code and is suspected to violate Mozilla's add-on policies by collecting data without disclosure or consent.","name":"Mendeley Importer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e028ecb3-be1e-48fb-9681-9c04ff7fad3d","last_modified":1576881756956},{"guid":"s3firefox@translator","prefs":[],"schema":1576845555478,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605007","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3.Translator \u2013 s3firefox@translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"31a14241-2af8-4ec8-b597-d5c3ebedc30c","last_modified":1576845976374},{"guid":"/^((\\{cee1ccee-5503-4927-a923-9a557e63bbc8\\})|(\\{8a84b40d-84a4-40d6-96de-c504a4fcd114\\}))$/","prefs":[],"schema":1576784492013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605289","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d940ce81-7ac8-4741-9fc8-2699cb92d4ef","last_modified":1576845555097},{"guid":"/^((therill@mozilla\\.com)|(Updates@mozilla\\.com))$/","prefs":[],"schema":1576756361317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e235a161-aaa1-4afd-8e9b-61ab2aeaf82e","last_modified":1576771657205},{"guid":"/^((\\{5620c992-8683-4ce1-b19d-3633b4c28bd0\\})|(\\{cbc29a75-5858-4b7b-98e4-c813a4e6a085\\})|(\\{4cf619a8-2de2-41cb-bf23-dfa52e4e7d5a\\})|(\\{3b013e48-d683-45ed-8715-a6ece06f0753\\})|(\\{9834ff7f-e3ea-485a-b861-801a2e33f822\\}))$/","prefs":[],"schema":1576756618517,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c324513-5792-495d-a389-d7527a0433b2","last_modified":1576771657202},{"guid":"/^((\\{ab70d6ee-9d0a-4349-919f-2e3c9aa77927\\})|(\\{fe94f94a-75ff-48a9-9cab-03e626e30352\\})|(\\{085590fa-c340-423d-9b45-d8e963349513\\})|(\\{c06005f4-a53f-4503-b631-9c6fbea45e9e\\})|(\\{a1904bba-73b5-4fab-8556-95fdf0200c19\\})|(\\{4548ed4c-964e-4a53-acec-b24f5b9ea6a6\\})|(\\{99d68c16-4f64-463a-ad09-470a5ac07981\\})|(\\{14338345-a844-4c6e-9fca-d200a93f1d9b\\})|(\\{2bc78397-6bd3-4a2f-a737-dbc639ee9940\\}))$/","prefs":[],"schema":1576756684025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92cedc61-c6c7-485e-98b0-a03c71eb2c5a","last_modified":1576771657198},{"guid":"/^((application@uk-manulap\\.com)|(application@uk-misafou\\.com)|(application@uk-nedmaf\\.com)|(application@uk-optalme\\.com)|(application@uk-plifacil\\.com)|(application@uk-poulilax\\.com)|(application@uk-rastafroc\\.com)|(application@uk-ruflec\\.com)|(application@uk-sabrelpt\\.com)|(application@uk-sqadipt\\.com)|(application@uk-tetsop\\.com)|(application@uk-ustif\\.com)|(application@uk-vomesq\\.com)|(application@uk-vrinotd\\.com)|(application@us-estuky\\.com)|(application@us-lesgsyo\\.com)|(applicationY@search-lesgsyo\\.com)|(\\{88069ce6-2762-4e02-a994-004b48bd83c1\\}))$/","prefs":[],"schema":1576756765926,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"42d1f27b-9cbf-4a3e-a18a-5c4418c2f5b6","last_modified":1576771657195},{"guid":"/^((\\{d1b87087-09c5-4e58-b01d-a49d714da2a2\\})|(\\{d14adc78-36bf-4cf0-9679-439e8371d090\\})|(\\{d64c923e-8819-488c-947f-716473d381b2\\})|(\\{d734e7e3-1b8e-42a7-a9b3-11b16c362790\\})|(\\{d147e8c6-c36e-46b1-b567-63a492390f07\\})|(\\{db1a103d-d1bb-4224-a5e1-8d0ec37cff70\\})|(\\{dec15b3e-1d12-4442-930e-3364e206c3c2\\})|(\\{dfa4b2e3-9e07-45a4-a152-cde1e790511d\\})|(\\{dfcda377-b965-4622-a89b-1a243c1cbcaf\\})|(\\{e4c5d262-8ee4-47d3-b096-42b8b04f590d\\})|(\\{e82c0f73-e42c-41dd-a686-0eb4b65b411c\\})|(\\{e60616a9-9b50-49d8-b1e9-cecc10a8f927\\})|(\\{e517649a-ffd7-4b49-81e0-872431898712\\})|(\\{e771e094-3b67-4c33-8647-7b20c87c2183\\})|(\\{eff5951b-b6d4-48f5-94c3-1b0e178dcca5\\})|(\\{f26a8da3-8634-4086-872e-e589cbf03375\\})|(\\{f992ac88-79d3-4960-870e-92c342ed3491\\})|(\\{f4e4fc03-be50-4257-ae99-5cd0bd4ce6d5\\})|(\\{f73636fb-c322-40e1-82fb-e3d7d06d9606\\})|(\\{f5128739-78d5-4ad7-bac7-bd1af1cfb6d1\\})|(\\{fc11e7f0-1c31-4214-a88f-6497c27b6be9\\})|(\\{feedf4f8-08c1-451f-a717-f08233a64ec9\\}))$/","prefs":[],"schema":1576756852767,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0896a86b-a211-4c64-968c-8671a21b2b5a","last_modified":1576771657191},{"guid":"/^((\\{2926cc6a-5f5d-4ef7-9cd0-0417408e8809\\})|(\\{569a3468-ebdc-4d95-84ef-0b6cbbcb2119\\})|(\\{6ef88cf3-c31c-4a9b-973b-765c21bc6f81\\})|(\\{a36b6921-0b70-4fad-b39b-786b23716b74\\})|(\\{fcc6a194-c627-4bf1-b185-e9611dc8d56d\\})|(\\{ddc71014-7997-421d-bb86-3b70b2ab24d5\\})|(\\{453638fc-e7f1-4a3d-acfb-724a0c750686\\})|(\\{0283d25d-25e6-4710-845f-b112fb264d3f\\})|(\\{071b1860-ff82-46d0-816c-a458382beaa7\\})|(\\{f0f6892f-6d0d-4146-9de5-21cc7eb3672a\\})|(\\{845c7444-bd97-4200-8144-c95ce77c07be\\})|(\\{8bc84806-edbd-4713-8a53-19a8c345fdfb\\})|(\\{959dfd6a-fbc5-49f0-8284-34e8606c7fd2\\})|(\\{9f90e1c8-a63e-43a9-8cd5-ad1d6fdf0f3a\\})|(\\{6b7cde7b-a79d-4012-b36c-86719ebcc308\\})|(\\{57f57692-7ef1-473a-adf7-7507e0e31c7d\\})|(\\{34bc568b-4243-4001-b528-118df3310667\\})|(\\{521e44f0-374e-466a-8829-2a98af75104b\\})|(\\{a4de65f7-33ae-4622-bb17-15053f0383f2\\})|(\\{f5ca8ea6-e854-4163-bc55-1a6f4086c1b2\\})|(\\{45765127-988a-4f3e-807d-f7784d76ecd0\\})|(\\{dc95db1e-68c5-44f4-a924-daac966373d2\\})|(\\{4119a8f1-508c-490d-87d4-203e93bbc5fb\\})|(\\{85997b97-ae1f-49e2-b42b-60f9c78c2d03\\})|(\\{a39c31c3-a57a-4c26-8454-267414494eed\\})|(\\{fa47c7ee-e855-41b0-9d3d-3c1d46d98a19\\})|(\\{6255931b-744a-49a2-bf6d-69ba35556760\\})|(\\{54112e17-779d-4275-9a04-81760931d356\\})|(\\{cea0dfab-286c-44c5-b41e-79d8ca5d097e\\})|(\\{fd6b2837-7828-4ad8-9bfe-361336aba33e\\})|(\\{0a56d404-ece2-441d-8d0b-e276ae1a07c2\\})|(\\{be54a202-b6e0-485d-b60b-f77f117ae602\\})|(\\{ff927da8-a634-4b4f-9010-2e76e3a6db2d\\})|(\\{a91f82ce-675b-4940-b58f-96095eb004af\\})|(\\{885c70f6-e286-433e-8f42-d7f319321d9d\\})|(\\{3e52fa7b-34c5-48e3-9cc2-3e33464db303\\})|(\\{ca94cd4e-3aec-41af-aa3c-1a8ddba9b9be\\})|(\\{0971aa7e-3a32-418a-acca-fdb5dacfca2f\\})|(\\{4d16cfea-bbe5-4254-b98b-70267cf2a2bc\\})|(\\{5cb20af8-1a98-43b0-9f09-0ee6d494ce65\\}))$/","prefs":[],"schema":1576756919670,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c81cb302-2519-4997-84de-75aa01f2dee9","last_modified":1576771657188},{"guid":"/^((jabcajffpafebcdcaddoegpenicdipdk@chrome-store-foxified-1110252619)|(jpegcert@freeverify\\.org)|(kmrfree@yahoo\\.com)|(lets-kingw@empotrm\\.com)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-29039950)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-77744803)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-357866719)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-447115206)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-549146896)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1084455972)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1602969934)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2271560562)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2595595173)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3103352300)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3116340547)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3959272483)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4076222235)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4090031097)|(media-certificates@auth0\\.io)|(mingle-cash-extension@minglecash\\.com)|(MiningBlocker@MiningBlockerAddOn\\.com)|(multimedia@certifications\\.us)|(nominer-block-coin-miners@tubedownload\\.org)|(open-in-idm@tubedownload\\.org)|(sabqo@yolla\\.net)|(search-by-image@addonsmash)|(selfdestructingcookies@addonsmash)|(streaming-certficate@mdn\\.org)|(swt@gobck\\.com)|(tabs-re-open@gtk\\.cc)|(user-agent-rewriter@a\\.org)|(vba@vba\\.com)|(verification@bexp\\.co)|(vidcert@certs\\.org)|(xplayer@gobck\\.com)|(youtube_download_express@free-downloader\\.online)|(youtube_downloader@downloaders\\.xyz)|(youtube_grabber@utubegrabber\\.co)|(youtube-lyrics-by-rob-w@awesome\\.addons)|(youtube-mp4-downloader@tubedownload\\.org)|(ytdownloader@ytdownloader\\.org)|(yttools\\.download@youtube\\.com))$/","prefs":[],"schema":1576757015029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa146be-e47f-4c20-bdbd-c8046a929100","last_modified":1576771657184},{"guid":"/^((\\{ed4c3ce2-5372-429c-ae20-fa5b1f540fd7\\})|(\\{cd11da28-330d-4f09-a21f-fae7509f1b60\\})|(\\{74bc7a66-d4e6-4f1c-a0ef-1b65baa41cbf\\})|(\\{8069effc-45bb-4caf-8b27-a135431cd6b9\\})|(\\{577fc233-25bf-4e43-a164-aa75eb9d053a\\})|(\\{f5626996-f5cd-4d00-bcea-20dda6d9edd6\\})|(\\{9bb810ef-716e-4dc5-9f03-491a2c59384e\\})|(\\{02634a24-04d0-439f-9faf-a323ab4a1bac\\})|(\\{b73f7a43-a43a-47f5-8b1f-1ef7caa7857d\\})|(\\{3b5bf07b-5964-408a-8e43-e0239219c524\\})|(\\{73d3a404-150f-4594-ac2c-24f9beec78b1\\})|(\\{ef6a2133-5ed9-4dbc-a735-6ffe8490062e\\})|(\\{76b61321-01a1-4a17-850f-b064a0366b57\\})|(\\{bc41ca18-9209-4500-a847-4e514fea2536\\})|(\\{32c4c845-9bd7-4b20-97fa-a7616e7802ef\\})|(\\{410d9002-b517-471f-956e-30129e307af3\\})|(\\{43366e90-e4be-4ba6-bec0-3fb149128480\\})|(\\{8ebc90a4-f7a1-420a-8380-f85545403f80\\})|(\\{6d3fa41f-e896-4f85-ba59-321f4b26f380\\})|(\\{05c811f2-f828-4d3e-ad02-7386373e9a28\\})|(\\{e10a0ee6-8083-42a7-bed1-35400b029bf2\\})|(\\{c925be5a-ae0e-4958-be36-44dc2e64d4f7\\})|(\\{3803ed37-c101-4b21-a678-762f51b7eabf\\})|(\\{08a15cc0-d6cb-43c5-9a40-27443554b455\\})|(\\{d0953283-5970-4ebe-b270-940c6befdbb7\\})|(\\{7c983689-80c7-46dd-b9d2-4d2db1cf94a6\\})|(\\{8f320a17-868c-43dc-94fb-9d1ab7f4fe73\\})|(\\{843b406a-9593-49bf-9365-684fe8cb2f5a\\})|(\\{42cd0cbd-248d-4a44-88b6-1a3680d159ac\\})|(\\{23efa05d-99b1-49e0-a67d-5378f2afc20d\\})|(\\{f91c606c-dd33-42a4-9219-824187730f59\\})|(\\{9e233d16-18ae-4519-a83c-2806f4fee321\\})|(\\{a93cdf30-75da-463b-865b-f49cc7fd2697\\})|(\\{dcacb62c-9096-482d-845d-10413199a89b\\})|(\\{9d5da26f-c366-46b2-b3e7-5c8e3e0b9788\\})|(\\{dd176d1f-8cd5-4b5b-8b06-839449e87b5e\\})|(\\{9ada3b66-4412-427d-8696-ac0fe0ac891e\\})|(\\{9695495e-cb65-4cd6-8a93-52c9e2b8d767\\})|(\\{e9d1a027-a84c-4e90-b602-66ffe22a0ad6\\})|(\\{f71bda5e-c591-44aa-8f84-2f04989f7e7a\\})|(\\{e6e67c6f-c010-406d-8575-1835341ec4cf\\})|(\\{22fbf524-38be-4ead-b6ce-e55cb23ed74b\\})|(\\{866dafe9-1c49-47d7-a46c-1cb50ca52461\\})|(\\{3479fadc-41b1-492e-bb16-d8f9e514d488\\})|(\\{8c02daf2-79ed-4650-89ca-1e099d28c5e7\\})|(\\{65e6b805-7f0c-455f-b1b4-c34621056b46\\})|(\\{78de7006-944c-4c18-a33a-d6931619f2b0\\})|(\\{16c8051b-2c16-4641-bf29-2daee7883fd0\\})|(\\{19263ccc-a97f-49f4-867a-b49351c42c0c\\})|(\\{bfe416d8-e8c3-469c-908e-6926770152f0\\})|(\\{a29a4a96-2fcd-48f8-bfe1-a1d1df46e73d\\})|(\\{2d651636-a0fa-45b7-a97e-ebc85959ff23\\})|(\\{ac8a3af8-e264-4a0b-b813-d7fab03ae3fe\\})|(\\{4719ad8b-354b-443d-b1e6-4d60b851c465\\})|(\\{7679a9f9-29d8-4979-86e7-a5b5cf0e2fd3\\})|(\\{099e1648-58e7-492e-8019-3418263b9265\\})|(\\{9a83d154-4ea3-45f9-ae21-28f3c1f86773\\})|(\\{475b88fd-574c-4881-98e0-0184a03593cb\\})|(\\{d7b586f8-a22d-4986-9dfb-67d49ba46a68\\})|(\\{50b79e30-a649-4477-8612-7085c0ee3ad4\\})|(\\{e9b2d453-9a98-41e4-9837-c0d68ff1aeac\\})|(\\{b1814ce5-0d9f-495f-b260-a7e1e5538263\\})|(\\{9b06d35e-2eb0-4653-886f-a3f4cdcbb754\\})|(\\{e7d6a360-69d4-4f8c-a96f-fd63388995b2\\})|(\\{68a50af6-ddad-4750-a9a7-a71c55e019b7\\})|(\\{8286a0e0-ba89-48b3-871b-8c9acff32023\\})|(\\{b3c79903-9bc5-4ddf-aeeb-7d91989ae819\\})|(\\{7c5cc4ec-9637-428c-bcf7-28bba279cf84\\})|(\\{93d460ee-879f-4d8f-8599-a1c69ed59ec2\\})|(\\{207c95d5-2bb9-4760-b3a4-8c58ea173bff\\})|(\\{b3482681-1abf-4dfa-bace-dc7b51e6a150\\})|(\\{d3516cf6-d531-434a-b80a-df72c7166744\\})|(\\{da01a2aa-0cbb-4f57-a395-2256d142c519\\}))$/","prefs":[],"schema":1576757089378,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71f2c72f-b4d7-4ea9-bb8f-70d4d86eb184","last_modified":1576771657180},{"guid":"/^((\\{84a9ae69-5c01-4a73-80d3-c2201410d8c1\\})|(\\{852c68da-c573-42f8-85f8-9dcf57684f87\\})|(\\{85a31d9e-063f-421f-9d3f-649a393e94ec\\})|(\\{876778c8-5329-461d-882e-d4983ae6062a\\})|(\\{8913da4a-46fb-461c-9e60-3e257ef2c0e6\\})|(\\{8aa0118c-998e-40ac-84e9-12c936e5d70e\\})|(\\{8b4a6441-811f-4461-b136-7ebf3aebe3dc\\})|(\\{8bc41c3b-e052-4fd8-8de3-970ef5224bd9\\})|(\\{8e03b200-aad9-434b-9a99-e7aae7493a5f\\})|(\\{8fe94d0d-4746-401c-ad05-e0e1be97ea0e\\})|(\\{900f3c9c-b327-4608-950b-9765119c2e7a\\})|(\\{915080f5-97a3-4584-861f-70cd91f56474\\})|(\\{91d034a6-1765-4a59-85e5-9ddeb371ed9b\\})|(\\{9207dfae-06fc-4545-9fa6-6466b7ed2559\\})|(\\{926b2440-8443-4de3-9025-9a448cf3b838\\})|(\\{952bfd34-d195-4b10-8a3c-b103786cf090\\})|(\\{95315ff2-427b-427c-a433-236fb3b5eda4\\})|(\\{971db1e5-a5cb-46f9-91f9-9b687f4e5832\\})|(\\{982e11b3-e092-4713-81d4-5da1eadd278e\\})|(\\{98a2b9a7-13fa-49ff-aaa4-83786fad7862\\})|(\\{99f52d4d-1cd2-4e17-8f57-fa2493848f3f\\})|(\\{9a467b2c-be87-4d55-80d9-998dc6243e8b\\})|(\\{9abfecfa-d53e-4aea-bb6c-4fe47367f61e\\})|(\\{9b0243a5-92fb-43a4-adcc-3161f0ec030c\\})|(\\{9c7bb0bf-1534-4805-b9fa-a91004bd7e30\\})|(\\{a00e65f6-bf34-4ef9-a0e5-b63002c823e9\\})|(\\{a0dce648-f703-4867-9f3f-9bfa7601d1b1\\})|(\\{a16a700a-35ff-4ed1-ab81-164e3c823342\\})|(\\{a1f14b23-0c36-44e8-8f0d-9c732acbb550\\})|(\\{a4ea8038-65ae-4d7c-92e2-dd95caf007f4\\})|(\\{a55cd5be-89e4-40ba-8c3b-0023a1f41c8e\\})|(\\{a57ec9eb-cbab-4ddb-bafd-80cf5fd38891\\})|(\\{a5aa1d1e-dec7-4e25-bead-0861099f9628\\})|(\\{a604a85d-ba8f-4e8f-8ca1-867ca8d13a13\\})|(\\{a7a33aad-9e17-4db3-a127-d185e31607ae\\})|(\\{a9404f9f-6ac9-4366-bfcf-50d0d3bdeac3\\})|(\\{aaf2dd6b-5ca9-47aa-b41f-5b00c5c82d2e\\})|(\\{abf10dee-7cc9-4b79-ad5b-1e4300ab24a7\\})|(\\{ac97e702-b2e2-4a91-ae3e-bf0856300737\\})|(\\{ae03577f-2d20-4775-8286-685cdbee76e4\\})|(\\{aef2e959-90c0-44cf-bbb5-e0789af93efe\\})|(\\{af0d8090-d04f-4e9a-a3fb-1c9ac89e9f68\\})|(\\{b0da2032-0da5-4cff-b91b-e0efda4d6b36\\})|(\\{b2777372-311f-4a15-81e5-c84dd845c93d\\})|(\\{b44ac98d-6101-467d-a959-d6ada2259f01\\})|(\\{b50daf26-3983-4516-836f-0b8777bc44ab\\})|(\\{b5ca55b9-d06a-4538-be4a-38b29f3a4359\\})|(\\{b783327e-a675-40c2-95c7-59eb3f00b75d\\})|(\\{b91f2cd5-4051-4e13-8848-8e92afb99217\\})|(\\{ba32ffe1-dabb-41d6-a45f-f4d3e1304ff1\\})|(\\{bb80ea9f-8263-4183-a52d-e5d45ca6e0fe\\})|(\\{c0ba2c3c-55a6-4d28-bb27-67f71de78feb\\})|(\\{c0ecc589-04de-4243-9279-100b781f7443\\})|(\\{c2f6447c-e2db-43d1-8c53-fec7c29b22bb\\})|(\\{c4492fc0-70ed-4d36-8904-61ccb663eaac\\})|(\\{c58e10ce-d69e-478d-8270-0d73599a8cfc\\})|(\\{c72781ce-8377-41ae-984e-ed5755af28de\\})|(\\{c7f51f89-f47c-45e6-aa57-177deba406a0\\})|(\\{c859eaff-3dde-4d83-9703-0a6cf9e95308\\})|(\\{ca51951b-5c9e-4c26-bca3-ed6e754ae5c0\\})|(\\{ce9f05c7-6246-4918-8505-fdc455bc0aab\\})|(\\{cf0ec4e1-5d0d-4846-aa97-380806e72e46\\})|(\\{cfa73be4-9e64-4aea-bb0a-2ab0defb27b3\\})|(\\{d12c5edd-1182-4bf7-bdb1-f2662b7ce1be\\})|(\\{d2343e30-0253-4556-9dd8-cb6cb461801d\\})|(\\{d7a1fad5-eb70-4f7f-a24d-98c3bb9a7aa4\\})|(\\{d7a7e3d1-e6f2-45e3-957a-4b2cde1b413b\\})|(\\{d946d1e8-38bd-41f4-8dc7-a255802046a8\\})|(\\{da7e77cd-4a7c-4282-a597-0694ada485b4\\})|(\\{dc905949-378e-4b8c-aacc-cff56b04370d\\})|(\\{dca4c8f5-5ef9-40fb-bd76-dcb4ec98c495\\})|(\\{dd275beb-f7dd-4ff6-8fec-23e8c0422b68\\})|(\\{de88be71-25f9-48d0-adc9-3d9a542cf303\\})|(\\{df148b39-f7c2-480d-ad8b-91b700e6642b\\})|(\\{df55df20-2e99-49fd-90bc-b548b833e2db\\})|(\\{e1348bc8-b378-45a3-95bb-4915b8910c1e\\})|(\\{e72aab9f-77f1-4e03-a4b7-9ea4b066fe50\\})|(\\{e8372510-9f1b-4b11-8e2f-dfc1d5d1a4a1\\})|(\\{eae5c7b6-8b67-4645-a1c1-a543e63ceda5\\})|(\\{eb1ed544-82e6-4785-b693-1e0799f7cffa\\})|(\\{ec37edc4-e1a6-4073-9cd4-7a5315c921e3\\})|(\\{ed240b54-8600-496b-a034-d9a153359906\\})|(\\{ee6e56cf-b963-4efb-b64e-cf6117dc9a5b\\})|(\\{f3337e21-4fbd-411c-b1fc-d0543052b499\\})|(\\{f5a4fafb-2f75-4acc-9dad-324ca00a1b84\\})|(\\{f9b00c32-2f31-436b-8cb1-720b12502cb6\\})|(\\{fdfd1815-cf54-4210-8883-a4154668b866\\})|(adobeflashplayer@flashplayeradobedeveloper\\.com)|(adobeflashplayer@flashplayeradobedevelopper\\.com)|(afplayer@firefox\\.pl)|(afplayerx@firefox\\.pl)|(aktualizacjaalamusowjeac@wp\\.pl)|(aktualizacjalamusowjeac@wp\\.pl)|(andrzej-ff@wp\\.pl)|(andrzej@gmail\\.com)|(au_addx@geckoaddon\\.org)|(au9c1660@auge\\.site)|(birghun@firefox\\.pl)|(birghuxxn@firefox\\.pl)|(btxyhuh@firefox\\.pl)|(elsee@geckoaddon\\.org)|(elseeau@geckoaddon\\.org)|(extensioner@firefox\\.pl)|(fr@ffget\\.xyz)|(fr9c1660@frge\\.site))$/","prefs":[],"schema":1576757184838,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81f88c43-22e7-4602-8928-3a0b0f50689e","last_modified":1576771657176},{"guid":"/^((fruxuc@flashc\\.com)|(it_addx@geckoaddon\\.org)|(it9c1660@tige\\.site)|(marlenex@firefox\\.pl)|(nads@firefox\\.pl)|(newtabextension@newtabextensiond\\.com)|(pl@k4n\\.pl)|(playerro1@firefox\\.pl)|(socketextensionws1@geckoaddon\\.org)|(soxmuc@firefox\\.pl))$/","prefs":[],"schema":1576757189399,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7e85b5b-7e0a-40c9-a900-99de7ba2a131","last_modified":1576771657173},{"guid":"/^((_hwMembers_@free\\.mapfinderz\\.com)|(_hxMembers_@free\\.mergedocsnow\\.com)|(_hyMembers_@free\\.formfetcherpro\\.com)|(_hzMembers_@free\\.televisionace\\.com)|(_i2Members_@free\\.streamlineddiy\\.com)|(_i4Members_@free\\.fileconvertonline\\.com)|(_i5Members_@free\\.mydiygenie\\.com)|(_i6Members_@free\\.dailyproductivitytools\\.com)|(_i7Members_@free\\.digismirkz\\.com)|(_i9Members_@free\\.cinematicfanatic\\.com)|(_iaMembers_@free\\.liveradiosweeper\\.com)|(_ijMembers_@www\\.freedirectionsonline\\.com)|(_isMembers_@free\\.mydigitalcalendar\\.com)|(_itMembers_@free\\.mycalendarplanner\\.com)|(_iuMembers_@free\\.productmanualsfinder\\.com)|(_ivMembers_@free\\.simplepictureedit\\.com)|(_iwMembers_@free\\.allinonedocs\\.com)|(_j1Members_@free\\.onlineworksuite\\.com)|(_j4Members_@free\\.createdocsonline\\.com)|(_j5Members_@ext\\.ask\\.com)|(_j6Members_@www\\.freemanualsindex\\.com)|(_j7Members_@www\\.convertdocsonline\\.com)|(_j8Members_@www\\.discoverliveradio\\.com)|(_j9Members_@www\\.internetspeedradar\\.com)|(_jaMembers_@www\\.testonlinespeed\\.com)|(_jbMembers_@www\\.onlinemapsearch\\.com)|(_jcMembers_@www\\.quickweathertracker\\.com)|(_jhMembers_@www\\.getcouponsfast\\.com)|(_jiMembers_@www\\.searchformsonline\\.com)|(_jjMembers_@www\\.onlineroutefinder\\.com)|(_jmMembers_@www\\.supercouponpro\\.com)|(_jnMembers_@www\\.pdfconverttools\\.com)|(_joMembers_@www\\.onlineformfinder\\.com)|(_jpMembers_@www\\.directionswhiz\\.com)|(_jqMembers_@www\\.convertpdfsnow\\.com)|(_jvMembers_@free\\.notehomepage\\.com)|(_k8Members_@www\\.mymapsexpress\\.com)|(_k9Members_@www\\.mytransitmapper\\.com)|(_kbMembers_@www\\.convertersnow\\.com)|(_kjMembers_@www\\.easydirectionsfinder\\.com)|(_knMembers_@www\\.getfamilyhistory\\.com)|(_koMembers_@www\\.quickpdfmerger\\.com)|(_kpMembers_@www\\.easytransithelper\\.com)|(_kqMembers_@www\\.easypackagefinder\\.com)|(_krMembers_@www\\.easyemailsuite\\.com)|(_ksMembers_@www\\.quickcouponfinder\\.com)|(_ktMembers_@www\\.easypackagetracker\\.com)|(_kvMembers_@www\\.radiofinder\\.com)|(_kwMembers_@www\\.productmanualspro\\.com)|(_kxMembers_@www\\.smarteasymaps\\.com)|(_kyMembers_@www\\.quickflighttracker\\.com)|(_kzMembers_@www\\.productmanualsguide\\.com)|(_l0Members_@www\\.getformshere\\.com)|(_l1Members_@www\\.videoconverterhd\\.com)|(_l3Members_@www\\.watchmytvshows\\.com)|(_l4Members_@www\\.quicktemplatefinder\\.com)|(_l5Members_@www\\.strictlyradio\\.com)|(_l6Members_@www\\.propdfconverter\\.com)|(_l7Members_@free\\.gifables\\.com)|(_laMembers_@free\\.gifsgalore\\.com)|(_lbMembers_@free\\.worldofnotes\\.com)|(_ohMembers_@chrome\\.google\\.com)|(_onMembers_@www\\.4thofjulypictureedit\\.com)|(_oxMembers_@free\\.anytimeastrology\\.com)|(_oyMembers_@free\\.getfreegifs\\.com)|(_ozMembers_@free\\.newnotecenter\\.com)|(_paMembers_@www\\.filmfanatic\\.com)|(_pbMembers_@www\\.holidayphotoedit\\.com)|(_pcMembers_@free\\.astrologysearcher\\.com)|(_pdMembers_@free\\.horoscopebuddy\\.com)|(_peMembers_@free\\.lovemyhoroscopes\\.com)|(_pjMembers_@free\\.gifapalooza\\.com)|(_pkMembers_@free\\.giffysocial\\.com)|(_pnMembers_@free\\.myeasylotto\\.com)|(_pqMembers_@www\\.freepdfcombiner\\.com)|(_psMembers_@www\\.freetemplatefinder\\.com)|(_ptMembers_@www\\.simplepackagefinder\\.com)|(_pvMembers_@www\\.mapmywayfree\\.com)|(_pxMembers_@www\\.simpleflighttracker\\.com)|(_pyMembers_@www\\.filesendfree\\.com)|(_pzMembers_@free\\.babynameready\\.com)|(_q0Members_@free\\.mywaynotes\\.com)|(_q1Members_@free\\.everydaymemo\\.com)|(_q7Members_@www\\.getflightupdates\\.com)|(_q8Members_@www\\.getformsfree\\.com)|(_qfMembers_@www\\.formfinderfree\\.com)|(_qhMembers_@free\\.presidentialbuzz\\.com)|(_qjMembers_@free\\.taxcenternow\\.com)|(_qlMembers_@free\\.cryptopricesearch\\.com)|(_qmMembers_@free\\.ontargetyoga\\.com)|(_qoMembers_@free\\.taxinfohelp\\.com)|(_qpMembers_@free\\.getpoliticalnews\\.com)|(_qqMembers_@free\\.thepresidentsays\\.com)|(_qtMembers_@www\\.formfinderhq\\.com)|(_quMembers_@free\\.myquicklotto\\.com)|(_qwMembers_@free\\.shoppingdealslive\\.com)|(_r0Members_@free\\.bitcoinpricesearch\\.com)|(_r1Members_@free\\.projectbabyname\\.com)|(_r2Members_@free\\.yogaposeonline\\.com)|(_r5Members_@www\\.quickdocsonline\\.com)|(_r6Members_@free\\.ezpdfconvert\\.com)|(_r7Members_@free\\.onlineformsdirect\\.com)|(_r8Members_@free\\.mapsboss\\.com)|(_raMembers_@www\\.fileconverterfree\\.com)|(_rcMembers_@extsb\\.searchbetter\\.com))$/","prefs":[],"schema":1576757318717,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e87028d0-b5c8-4a76-9105-0229bafb5040","last_modified":1576771657169},{"guid":"/^((_rdMembers_@www\\.freeshoppingtool\\.com)|(_reMembers_@www\\.simpleholidayrecipes\\.com)|(_rfMembers_@www\\.myguidetoislam\\.com)|(_rgMembers_@free\\.entertainmentnewsnow\\.com)|(_rhMembers_@free\\.politicalnewscenter\\.com)|(_riMembers_@www\\.myfashiontab\\.com)|(_rjMembers_@www\\.mychristianportal\\.com)|(_rkMembers_@www\\.globaljewishworld\\.com)|(_rlMembers_@www\\.myvedictab\\.com)|(_rnMembers_@free\\.learnthelyrics\\.com)|(_roMembers_@free\\.dailyfunnyworld\\.com)|(_rpMembers_@free\\.myprivacymanager\\.com)|(_rqMembers_@free\\.getseniorresources\\.com)|(_rrMembers_@free\\.webtopdfprint\\.com)|(_rsMembers_@www\\.freeauctionfinder\\.com)|(_rwMembers_@free\\.getlyricsonline\\.com)|(_rzMembers_@free\\.pagesummarizer\\.com)|(_s0Members_@free\\.funnyjokesnow\\.com)|(_s2Members_@free\\.mybabyboomerhub\\.com)|(_s6Members_@free\\.celebgossiponline\\.com)|(_saMembers_@free\\.onlineprivacymanager\\.com)|(_scMembers_@free\\.freearticleskimmer\\.com)|(_sdMembers_@www\\.easywebpageprint\\.com)|(_swMembers_@www\\.homehelpguide\\.com)|(_szMembers_@www\\.mydocshere\\.com)|(_v4Members_@www\\.dictionaryboss\\.com))$/","prefs":[],"schema":1576757323000,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"49cb7c72-e90e-4dc3-adda-d63083c83a7c","last_modified":1576771657165},{"guid":"/^(({23c65153-c21e-430a-a2dc-0793410a870d})|({29c69b12-8208-457e-92f4-e663b00a1f10})|({30a8d6f1-0401-4327-8c46-2e1ab45dfe77})|({30d63f93-1446-43b3-8219-deefec9c81ce})|({32cb52f8-c78a-423d-b378-0abec72304a6})|({35bfa8c0-68c1-41f8-a5dd-7f3b3c956da9})|({36a4269e-4eef-4538-baea-9dafbf6a8e2f})|({37f8e483-c782-40ed-82e9-36f101b9e41f})|({42a512a8-37e0-4e07-a1db-5b4651d75048})|({43ae5745-c40a-45ab-9c11-74316c0e9fd2})|({53fa8e1c-112b-4013-b582-0d9e8c51ca75})|({56effac7-3ae9-41e3-9b46-51469f67b3b2})|({61a486c0-ce3d-4bf1-b4f2-e186a2adecf1})|({62b55928-80cc-49f7-8a4b-ec06030d6601})|({63df223d-51cf-4f76-aad8-bbc94c895ed2})|({064d8320-e0f3-411f-9ed1-8c1349279d20})|({071b9878-a7d3-4ae3-8ef0-2eaee1923403})|({72c1ca96-c05d-46a7-bce1-c507ec3db4ea})|({76ce213c-8e57-4a14-b60a-67a5519bd7a7})|({78c2f6a0-3b54-4a21-bf25-a3348278c327})|({0079b71b-89c9-4d82-aea3-120ee12d9890})|({81ac42f3-3d17-4cff-85af-8b7f89c8826b})|({81dc4f0e-9dab-4bd2-ab9d-d9365fbf676f})|({82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a})|({83d6f65c-7fc0-47d0-9864-a488bfcaa376})|({83d38ac3-121b-4f28-bf9c-1220bd3c643b})|({84b9121e-55c9-409a-9b28-c588b5096222})|({87ba49bd-daba-4071-aedf-4f32a7e63dbe})|({87c552f9-7dbb-421b-8deb-571d4a2d7a21})|({87dcb9bf-3a3e-4b93-9c85-ba750a55831a})|({89a4f24d-37d5-46e7-9d30-ba4778da1aaa})|({93c524c4-2e92-4dd7-8b37-31a69bc579e8})|({94df38fc-2dbe-4056-9b35-d9858d0264d3})|({95c7ae97-c87e-4827-a2b7-7b9934d7d642})|({95d58338-ba6a-40c8-93fd-05a34731dc0e})|({97c436a9-7232-4495-bf34-17e782d6232c})|({97fca2cd-545f-42ef-ae93-dc13b046bd3b})|({0111c475-01e6-42ea-a9b4-27bed9eb6092})|({115a8321-4414-4f4c-aee6-9f812121b446})|({158a5a56-aca0-418f-bec0-5b3bda6e9d4c})|({243a0246-cbab-4b46-93fb-249039f68d84})|({283d4f2a-bab1-43ce-90be-5129741ac988})|({408a506b-2336-4671-a490-83a1094b4097})|({0432b92a-bfcf-41b9-b5f0-df9629feece1})|({484e0ba4-a20b-4404-bb1b-b93473782ae0})|({486ecaf1-1080-48c1-8973-549bc731ccf9})|({495a84bd-5a0c-4c74-8a50-88a4ba9d74ba})|({520f2c78-7804-4f59-ae74-a192476055ed})|({543f7503-3620-4f41-8f9e-c258fdff07e9})|({0573bea9-7368-49cd-ba10-600be3535a0b})|({605a0c42-86af-40c4-bf39-f14060f316aa})|({618baeb9-e694-4c7b-9328-69f35b6a8839})|({640c40e5-a881-4d16-a4d0-6aa788399dd2})|({713d4902-ae7b-4a9a-bcf5-47f39a73aed0})|({767d394a-aa77-40c9-9365-c1916b4a2f84})|({832ffcf9-55e9-4fd1-b2eb-f19e1fac5089})|({866a0745-8b91-4199-820a-ec17de52b5f2})|({869b5825-e344-4375-839b-085d3c09ab9f})|({919fed43-3961-48d9-b0ef-893054f4f6f1})|({971d6ef0-a085-4a04-83d8-6e489907d926})|({1855d130-4893-4c79-b4aa-cbdf6fee86d3})|({02328ee7-a82b-4983-a5f7-d0fc353698f0})|({2897c767-03aa-4c2f-910a-6d0c0b9b9315})|({3908d078-e1db-40bf-9567-5845aa77b833})|({04150f98-2d7c-4ae2-8979-f5baa198a577})|({4253db7f-5136-42c3-b09d-cf38344d1e16})|({4414af84-1e1f-449b-ac85-b79f812eb69b})|({4739f233-57c1-4466-ad51-224558cf375d})|({5066a3b2-f848-4a59-a297-f268bc3a08b6})|({6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4})|({7854ee87-079f-4a25-8e57-050d131404fe})|({07953f60-447e-4f53-a5ef-ed060487f616})|({8886a262-1c25-490b-b797-2e750dd9f36b})|({12473a49-06df-4770-9c47-a871e1f63aea})|({15508c91-aa0a-4b75-81a2-13055c96281d})|({18868c3a-a209-41a6-855d-f99f782d1606})|({24997a0a-9d9b-4c87-a076-766d44e1f6fd})|({27380afd-f42a-4c25-b57d-b9012e0d5d48})|({28044ca8-8e90-435e-bc63-a757af2fb6be})|({30972e0a-f613-4c46-8c87-2e59878e7180})|({31680d42-c80d-4f8a-86d3-cd4930620369})|({44685ba6-68b3-4895-879e-4efa29dfb578})|({046258c9-75c5-429d-8d5b-386cfbadc39d})|({47352fbf-80d9-4b70-9398-fb7bffa3da53})|({56316a2b-ef89-4366-b4aa-9121a2bb6dea})|({65072bef-041f-492e-8a51-acca2aaeac70})|({677e2d00-264c-4f62-a4e8-2d971349c440})|({72056a58-91a5-4de5-b831-a1fa51f0411a})|({85349ea6-2b5d-496a-9379-d4be82c2c13d})|({98363f8b-d070-47b6-acc6-65b80acac4f3})|({179710ba-0561-4551-8e8d-1809422cb09f})|({207435d0-201d-43f9-bb0f-381efe97501d})|({313e3aef-bdc9-4768-8f1f-b3beb175d781})|({387092cb-d2dc-4da5-9389-4a766c604ec2})|({0599211f-6314-4bf9-854b-84cb18da97f8})|({829827cd-03be-4fed-af96-dd5997806fb4})|({856862a5-8109-47eb-b815-a94059570888})|({1e6f5a54-2c4f-4597-aa9e-3e278c617d38})|({1490068c-d8b7-4bd2-9621-a648942b312c})|({18e5e07b-0cfa-4990-a67b-4512ecbae04b})|({3584581e-c01a-4f53-aec8-ca3293bb550d})|({5280684d-f769-43c9-8eaa-fb04f7de9199})|({5766852a-b384-4276-ad06-70c2283b4792}))$/","prefs":[],"schema":1576757432447,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3139834-609b-4726-8bfa-a28659ba14fc","last_modified":1576771657161},{"guid":"/^(({34364255-2a81-4d6e-9760-85fe616abe80})|({45621564-b408-4c29-8515-4cf1f26e4bc3})|({62237447-e365-487e-8fc3-64ddf37bdaed})|({7e7aa524-a8af-4880-8106-102a35cfbf42})|({71639610-9cc3-47e0-86ed-d5b99eaa41d5})|({78550476-29ff-4b7e-b437-195024e7e54e})|({85064550-57a8-4d06-bd4b-66f9c6925bf5})|({93070807-c5cd-4bde-a699-1319140a3a9c})|({11e7b9b3-a769-4d7f-b200-17cffa4f9291})|({22632e5e-95b9-4f05-b4b7-79033d50467f})|({03e10db6-b6a7-466a-a2b3-862e98960a85})|({23775e7d-dfcf-42b1-aaad-8017aa88fc59})|({85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33})|({9e32ca65-4670-41e3-b6bb-8773e6b9bba8})|({6e43af8e-a78e-4beb-991f-7b015234eacc})|({57e61dc7-db04-4cf8-bbd3-62a15fc74138})|({01166e60-d740-440c-b640-6bf964504b3c})|({52e137bc-a330-4c25-a981-6c1ab9feb806})|({488e190b-d1f6-4de8-bffb-0c90cc805b62})|({5e257c96-bfed-457d-b57e-18f31f08d7bb})|({2134e327-8060-441c-ba68-b167b82ff5bc})|({1e68848a-2bb7-425c-81a2-524ab93763eb})|({8e888a6a-ec19-4f06-a77c-6800219c6daf})|({7e907a15-0a4c-4ff4-b64f-5eeb8f841349})|({a0ab16af-3384-4dbe-8722-476ce3947873})|({a0c54bd8-7817-4a40-b657-6dc7d59bd961})|({a0ce2605-b5fc-4265-aa65-863354e85058})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})|({a3fbc8be-dac2-4971-b76a-908464cfa0e0})|({a5a84c10-f12c-496e-80df-33386b7a1463})|({a5f90823-0a50-414f-ad34-de0f6f26f78e})|({a6b83c45-3f24-4913-a1f7-6f42411bbb54})|({a9eb2583-75e0-435a-bb6c-69d5d9b20e27})|({a32ebb9b-8649-493e-a9e9-f091f6ac1217})|({a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4})|({a506c5af-0f95-4107-86f8-3de05e2794c9})|({a02001ae-b7ed-45d7-baf2-c07f0a7b6f87})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({a18087bb-4980-4349-898c-ca1b7a0e59cd})|({a345865c-44b9-4197-b418-934f191ce555})|({a7487703-02d8-4a82-a7d0-2859de96edb4})|({a2427e23-d349-4b25-b5b8-46960b218079})|({a015e172-2465-40fc-a6ce-d5a59992c56a})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({abec23c3-478f-4a5b-8a38-68ccd500ec42})|({ac06c6b2-3fd6-45ee-9237-6235aa347215})|({ac037ad5-2b22-46c7-a2dc-052b799b22b5})|({ac296b47-7c03-486f-a1d6-c48b24419749})|({acbff78b-9765-4b55-84a8-1c6673560c08})|({acfe4807-8c3f-4ecc-85d1-aa804e971e91})|({ada56fe6-f6df-4517-9ed0-b301686a34cc})|({af44c8b4-4fd8-42c3-a18e-c5eb5bd822e2})|({b5a35d05-fa28-41b5-ae22-db1665f93f6b})|({b7b0948c-d050-4c4c-b588-b9d54f014c4d})|({b7f366fa-6c66-46bf-8df2-797c5e52859f})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({b12cfdc7-3c69-43cb-a3fb-38981b68a087})|({b019c485-2a48-4f5b-be13-a7af94bc1a3e})|({b91fcda4-88b0-4a10-9015-9365e5340563})|({b30591d6-ec24-4fae-9df6-2f3fe676c232})|({b99847d6-c932-4b52-9650-af83c9dae649})|({bbe79d30-e023-4e82-b35e-0bfdfe608672})|({bc3c2caf-2710-4246-bd22-b8dc5241693a})|({bc3c7922-e425-47e2-a2dd-0dbb71aa8423})|({bc763c41-09ca-459a-9b22-cf4474f51ebc})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({be981b5e-1d9d-40dc-bd4f-47a7a027611c})|({be37931c-af60-4337-8708-63889f36445d})|({bea8866f-01f8-49e9-92cd-61e96c05d288})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c3a2b953-025b-425d-9e6e-f1a26ee8d4c2})|({c3b71705-c3a6-4e32-bd5f-eb814d0e0f53})|({c5d359ff-ae01-4f67-a4f7-bf234b5afd6e})|({c6c8ea62-e0b1-4820-9b7f-827bc5b709f4})|({c8c8e8de-2989-4028-bbf2-d372e219ba71})|({c34f47d1-2302-4200-80d4-4f26e47b2980})|({c178b310-6ed5-4e04-9e71-76518dd5fb3e})|({c2341a34-a3a0-4234-90cf-74df1db0aa49})|({c8399f02-02f4-48e3-baea-586564311f95})|({c41807db-69a1-4c35-86c1-bc63044e4fcb})|({c383716f-b23f-47b2-b6bb-d7c1a7c218af})|({c3447081-f790-45cb-ae03-0d7f1764c88c})|({c445e470-9e5a-4521-8649-93c8848df377})|({c8e14311-4b2d-4eb0-9a6b-062c6912f50e})|({ca4fdfdb-e831-4e6e-aa8b-0f2e84f4ed07})|({ca6cb8b2-a223-496d-b0f6-35c31bc7ca2b})|({cba7ce11-952b-4dcb-ba85-a5b618c92420})|({cc6b2dc7-7d6f-470f-bccc-6a42907162d1})|({cc689da4-203f-4a0c-a7a6-a00a5abe74c5})|({ccb7b5d6-a567-40a2-9686-a097a8b583dd})|({cd28aa38-d2f1-45a3-96c3-6cfd4702ef51})|({cd89045b-2e06-46bb-9e34-48e8799e5ef2})|({cdda1813-51d6-4b1f-8a2f-8f9a74a28e14})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({ce93dcc7-f911-4098-8238-7f023dcdfd0d})|({cf9d96ff-5997-439a-b32b-98214c621eee})|({cfa458f9-b49b-4e09-8cb2-5e50bd8937cc})|({cfb50cdf-e371-4d6b-9ef2-fcfe6726db02})|({d1ab5ebd-9505-481d-a6cd-6b9db8d65977})|({d03b6b0f-4d44-4666-a6d6-f16ad9483593})|({d9d8cfc1-7112-40cc-a1e9-0c7b899aae98})|({d47ebc8a-c1ea-4a42-9ca3-f723fff034bd}))$/","prefs":[],"schema":1576757481582,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4885bfb1-7859-4ebc-b42f-2545125a5522","last_modified":1576771657157},{"guid":"/^(({d72d260f-c965-4641-bf49-af4135fc46cb})|({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({d461cc1b-8a36-4ff0-b330-1824c148f326})|({d97223b8-44e5-46c7-8ab5-e1d8986daf44})|({d42328e1-9749-46ba-b35c-cce85ddd4ace})|({da7d00bf-f3c8-4c66-8b54-351947c1ef68})|({db84feec-2e1f-48f0-9511-645fe4784feb})|({dc6256cc-b6d0-44ca-b42f-4091f11a9d29})|({dd1cb0ec-be2a-432b-9c90-d64c824ac371})|({dd95dd08-75d1-4f06-a75b-51979cbab247})|({ddae89bd-6793-45d8-8ec9-7f4fb7212378})|({de3b1909-d4da-45e9-8da5-7d36a30e2fc6})|({df09f268-3c92-49db-8c31-6a25a6643896})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({e7b978ae-ffc2-4998-a99d-0f4e2f24da82})|({e7fb6f2f-52b6-4b02-b410-2937940f5049})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})|({e9c47315-2a2b-4583-88f3-43d196fa11af})|({e341ed12-a703-47fe-b8dd-5948c38070e4})|({e804fa4c-08e0-4dae-a237-8680074eba07})|({e8982fbd-1bc2-4726-ad8d-10be90f660bd})|({e40673cd-9027-4f61-956c-2097c03ae2be})|({e72172d1-39c9-4f41-829d-a1b8d845d1ca})|({e73854da-9503-423b-ab27-fafea2fbf443})|({e81e7246-e697-4811-b336-72298d930857})|({ea618d26-780e-4f0f-91fd-2a6911064204})|({ea523075-66cd-4c03-ab04-5219b8dda753})|({eb3ebb14-6ced-4f60-9800-85c3de3680a4})|({ec8c5fee-0a49-44f5-bf55-f763c52889a6})|({eccd286a-5b1d-494d-82b0-92a12213d95a})|({ed352072-ddf0-4cb4-9cb6-d8aa3741c2de})|({edb476af-0505-42af-a7fd-ec9f454804c0})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206})|({f0b809eb-be22-432f-b26f-b1cadd1755b9})|({f5ffa269-fbca-4598-bbd8-a8aa9479e0b3})|({f6c543bf-2222-4230-8ecb-f5446095b63d})|({f6df4ef7-14bd-43b5-90c9-7bd02943789c})|({f6f98e6b-f67d-4c53-8b76-0b5b6df79218})|({f38b61f3-3fed-4249-bb3d-e6c8625c7afb})|({f50e0a8f-8c32-4880-bcef-ca978ccd1d83})|({f59c2d3d-58da-4f74-b8c9-faf829f60180})|({f82b3ad5-e590-4286-891f-05adf5028d2f})|({f92c1155-97b3-40f4-9d5b-7efa897524bb})|({f95a3826-5c8e-4f82-b353-21b6c0ca3c58})|({f5758afc-9faf-42bb-9543-a4cfb0bfce9d})|({f447670d-64f5-418f-9b4a-5352d6c8e127})|({f4262989-6de0-4604-918f-663b85fad605})|({fa8bd609-0e06-4ba9-8e2e-5989f0b2e197})|({fa0808f6-25ab-4a8b-bd17-3b275c55ff09})|({fac5816b-fd0f-4db2-a16e-52394b6db41d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|({fce89242-66d3-4946-9ed0-e66078f172fc})|({fcf72e24-5831-439e-bb07-fd53a9e87a30})|({fdc0601f-1fbb-40a5-84e1-8bbe96b22502})|({feb3c734-4529-4d69-9f3a-2dae18f1d896}))$/","prefs":[],"schema":1576757513203,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"672db55e-49ce-4b00-88ab-46cc24277800","last_modified":1576771657153},{"guid":"/^((\\{666ff753-69f8-49da-8adf-8aa770d3e383\\})|(\\{51536072-b64d-4a34-bee0-49b8e8175bc1\\})|(addon@filestopdf\\.com)|(info@icdst\\.ir)|(\\{d22f9fb6-1488-4969-aa49-e3322d622b6a\\})|(\\{b9db7ded-77d6-489b-bc0e-570df3f3e527\\})|(\\{62d89bd6-0042-4342-a15f-fa0a8addfca9\\})|(\\{4d8dfb84-624e-48df-8eeb-60443b2afeee\\})|(\\{2b3ac8fa-f84c-4e8f-83b6-438735fb1406\\})|(\\{40999239-996a-48ee-835c-8a11f71e53eb\\})|(\\{6a670f43-0093-4f2c-a265-02754d9fcb42\\})|(\\{f8de8278-97b5-4da1-b810-658f5909cb3b\\})|(MiniSearch@Context)|(arksignermozillafirefoxextension@example\\.org)|(\\{8f073b13-8b8b-4fe1-bee3-ee7573420ddd\\})|(\\{dab4ccbf-7cc0-4611-9a49-e7975b4e35d4\\})|(\\{564f1733-6bfc-4a03-b7a7-4ddc79b4ec00\\})|(\\{4aa733fc-44b5-439a-b928-a90f0698ccd9\\})|(\\{1e5da97f-f7e6-4eff-9f59-5e933320929c\\})|(\\{c3acee78-2e6b-408a-a62b-3fd5765b5518\\})|(\\{d7ba7080-7f1d-466a-8c4f-6f12d2c31284\\})|(\\{42979ad6-680d-4bc6-84be-2c94eb3ce586\\})|(\\{9cb8385f-8f1d-40c3-b78c-d05e4f949ecc\\})|(\\{2e58d47d-b3e6-499a-83c4-536e3f8a9903\\})|(\\{8a554f9d-90fa-4fbd-aa53-8d03f3939baf\\})|(\\{267495e1-9990-4d67-bde6-f1774188c307\\})|(\\{eb4c0a5d-48e2-4984-ad4a-141b313a58d0\\})|(\\{ffbef674-f098-4406-be3f-e96987be1701\\})|(\\{cf0578ea-3b45-45f1-b8ff-5898106ded49\\})|(\\{5fbbbebd-ebb3-499a-b091-0d82ec5eff02\\})|(\\{f4065411-1929-4970-8516-bf875525e2a0\\})|(\\{40f2f6f9-e58d-47fa-bdb3-9fa0ff71ad03\\})|(\\{42f4554c-3e5f-4d21-98cf-3a3f5c968fa7\\})|(\\{c5ec86f0-ef3e-42c8-8537-bd111af62dd3\\})|(\\{fa20692f-ae7a-42c3-a98d-2e092679d455\\})|(\\{b4f5e691-5146-4a64-bf45-25126e673f72\\})|(\\{3c5c9a50-c00d-4a3c-9e6f-2785d3419cc0\\})|(\\{fb246a17-c9ff-4771-b9fb-9fc79477fc0b\\})|(\\{80409c03-07bf-4b33-b6c5-e6ef260478da\\})|(\\{196c766b-29e5-4de8-a35b-96a4c40a28c7\\})|(\\{d6f9a86d-bb00-4877-af5a-12ad3dba76b9\\})|(\\{73660d5e-451a-450c-8a6d-bb023252cf51\\})|(\\{70e7455b-6e99-49d1-97d5-0147c48af7d7\\})|(\\{f84d6912-ff8f-4e96-b3f4-72ba33e29584\\})|(\\{e9dc2e41-d607-4938-be21-a9f1faed2acc\\})|(\\{5c6da614-27de-4d9e-9c39-0e2517a8d31b\\})|(\\{3a379d30-7c89-4251-8158-8b7584ec7317\\})|(\\{fc32234f-df43-4afa-a2f0-be0e2753daba\\})|(\\{c7f39b82-24d0-4428-9348-afe7a2f88a45\\})|(\\{2b9c2d2c-a3bd-4837-b613-ce2bb5aefbe8\\})|(\\{7d0e4c77-d013-47f0-808c-028c98e3b10e\\})|(\\{f0eec3eb-367c-4ff1-9963-c211afad69ef\\})|(\\{bf2b8075-2aac-45e3-9351-0b3ad3dd708e\\})|(\\{632d24c3-7423-4384-a665-0bbd060c93c2\\})|(\\{bd4a9564-fe81-400f-817f-34ba2a8260b2\\})|(\\{810e482d-b665-47e2-b379-ec3467c20885\\})|(\\{ab4a0a76-c868-4d09-9c2a-eeb97cf9d619\\})|(\\{96af6f96-61e2-43a1-947c-6b64ae1ce4cc\\})|(\\{04506315-3a1e-438f-907e-911752779c4e\\})|(\\{84d60f20-bff3-4e8b-8f04-03772be12178\\})|(\\{b56e4968-96b5-4682-b5a2-0811d22de46a\\})|(\\{e231b78c-557a-4f25-8ebe-0e18b8250cd9\\})|(\\{ed8f73c8-837a-4f33-99e0-a732cd64b760\\})|(\\{d1e681c5-4a4a-48b6-9abc-94a7fef3ced0\\})|(\\{494316a8-ee80-4b55-bc54-7e8588c91ee0\\})|(\\{87ca6636-e805-4c4f-a18f-9ea116d7c54d\\})|(\\{13cbb51f-509a-4a48-91b4-a9d83dedacc8\\})|(cryptogenius@geniusvibez\\.org)|(\\{f6c2064a-4977-4a4b-bc5a-352e00a1f458\\})|(\\{3ead5ed5-287c-4e2e-b62f-c657fefb7535\\})|(\\{6b8288d6-ae78-4593-8867-def79fe67a0f\\})|(\\{0ddda455-fadc-43d5-91d1-d1ed196ad5c7\\})|(\\{532c54ab-68f0-4e14-9f5f-382c6528e094\\})|(\\{7b990d1b-6515-4b8d-b0b1-400263c66155\\})|(\\{aadc7d87-c1b9-4399-9de5-d72ecaff0979\\})|(epiplex500suite@gmail\\.com)|(afp\\.testmaster@orbium\\.com)|(\\{1d1fe9b8-775e-4e9b-99a0-6adcbf1fbe10\\})|(\\{4aee20b8-7deb-42d6-8444-a7b51ab9eabb\\})|(\\{8790c850-f399-4b6b-8a43-85c10c5cdbe3\\})|(\\{55488e07-6e49-4d3b-aec4-ee2e520a5ed4\\})|(\\{1608692a-88e8-4717-a776-7be334de6767\\})|(\\{8f137ffe-8aa6-4358-a1a8-210fa87e7e22\\})|(\\{0866afdf-a997-453d-91a9-7094f617cd65\\})|(\\{b1ffc188-73f6-4e92-95d0-a579164fbc6c\\})|(\\{3d776d4c-44f4-4924-97f0-e47429e384d3\\})|(\\{9d2cadf8-68e0-43db-b763-390969d86976\\})|(\\{a0b5a5aa-423d-4115-962e-768136b0fd14\\})|(\\{0d625dd9-5d09-49ce-a811-5ed9ae5ef12f\\})|(\\{7273612b-2c57-4058-a09f-e576e8921829\\})|(\\{70529e5c-b73d-4585-9573-6e21bd6e64de\\})|(\\{e7626ba4-02a1-40b5-8186-b49da9d46c8a\\})|(\\{81425682-f86d-42a7-a46e-f31d80ea32ce\\})|(\\{5349a75b-df13-45ac-b4d5-1384d3446288\\})|(\\{2ea5ae79-9f90-4b7a-bdc6-5a9c4ddf7e59\\})|(\\{c496f3dc-56db-41a8-a6d9-d9225231528c\\})|(\\{dd13f534-b713-4d14-a55f-b2e9a4946b1b\\})|(\\{26f3910e-2cff-4cf6-94ee-69169f9cae9e\\})|(web\\.testmaster@orbium\\.com)|(Linguify@LinguaNext\\.net)|(jmendez\\.developer@gmail\\.com))$/","prefs":[],"schema":1576757626491,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96cd4440-6535-4d3a-a653-ae78abe6c312","last_modified":1576771657149},{"guid":"/^((\\{9c9cee47-6017-49ae-a8f5-36dacedfd9f5\\})|(inventoryspy@rebelsoftwarellc\\.com)|(\\{d5eb06b6-4f8c-4e98-9a46-180489db4bfb\\})|(\\{f539f4d9-5517-45a6-820e-91fd4d97ff24\\})|(\\{121701b4-d1f7-4328-80e7-34d7ce8d0d35\\})|(\\{af38d921-d151-4c46-a1f4-35f334bd5c2f\\})|(tvgitial@chmyway\\.com)|(\\{0b155b79-fa2d-453e-9a73-04b84a5f41db\\})|(\\{3833fb94-3b74-4ced-82d9-6e93cdcd073e\\})|(\\{9c3bbb7a-7c34-4073-9be9-241a3b10d521\\})|(\\{f06cfeac-c9d7-422d-b935-2e3cf7960a16\\})|(\\{9832fbba-ad56-41ad-9ef6-f91571fe0282\\})|(\\{887e6f78-084c-49da-9efe-410c6327dcfd\\})|(\\{48b31a31-0a1f-496c-8422-79991ec5f0d6\\})|(\\{32e7af7d-e621-4c6e-9fb5-ef31277a92b1\\})|(\\{29e731e0-47eb-40d3-a108-e3ba637ebd99\\})|(\\{265b0b17-caba-4eea-9822-fb669b603eee\\})|(\\{af6ecd70-5458-433c-a471-ca3221172ba2\\})|(\\{d9ac7759-d00e-4464-b110-362bcabf81d3\\})|(\\{4fb65352-528b-4f89-b66e-7fb6c4bd0a66\\})|(\\{588f4204-1a98-4ba0-b0d9-f48fe9a8c505\\})|(\\{5f553bb5-2139-4148-8cb6-a64f0664a148\\})|(\\{8d246dd2-72dc-4c84-aac2-c270a4beaae7\\})|(vk-downloader@addoncrop\\.com)|(privpow@gmail\\.com)|(home@bestools\\.net)|(themerapp11@gmail\\.com)|(privacysrched13@gmail\\.com)|(\\{1b9ad43b-33c7-49a1-91e3-de51de6392a7\\})|(\\{c92f123f-5300-4ca2-8e4b-2bdda8b60fd1\\})|(\\{5296e254-0b4e-4424-a044-9dbaa155e461\\})|(\\{ba633e33-46f7-402d-a98d-b6414baca4c8\\})|(\\{0e7f1d32-a30e-4be0-ad95-4433938d1aec\\})|(\\{1bc8ed9b-589a-45b8-90de-e372a98f7374\\})|(support@seogb\\.net)|(\\{9eeb49a7-2307-4eca-9ddc-946f29094497\\})|(\\{d8e7b5a5-6255-43b5-b371-8d76795705fd\\})|(\\{aa54cbfb-60a4-4aa0-a571-3594e718e9cf\\})|(\\{120023d0-20a4-4748-ad26-3de4a02452e7\\})|(\\{7472868d-16d8-45f8-bddd-6e32b5aac916\\})|(\\{177f7dc2-f9dc-4a79-bd4b-e6928bb86c82\\})|(\\{95313ed3-c9bf-46e0-baba-89e78b31709a\\})|(\\{54a9afac-8c97-4d7a-89a1-5f35858c2c5e\\})|(\\{914859e8-d803-4386-bd7b-10fc45586c3a\\})|(\\{8c965153-3a54-4b59-8b49-d89b1a46256b\\})|(\\{74eee9fc-da0e-4da1-8345-5a9b0be4012d\\})|(\\{6269bb9a-167f-4488-85b6-d3644bc5959e\\})|(\\{a0204e2a-ecf9-432c-a586-861172f77038\\})|(supportv8@seovpn\\.net)|(\\{52adc630-673b-44bb-9417-ab1ce1924465\\})|(version7@private\\.pitorr\\.com)|(version7\\.0@private\\.pitorr\\.com)|(version7\\.2@private\\.pitorr\\.com)|(version7\\.3@private\\.pitorr\\.com)|(\\{417a74a1-0d88-4240-8eab-53d1791f2bc0\\})|(\\{d7fe8027-22ef-4655-9c58-abcfb5b664fe\\})|(\\{9e666ac6-61f3-4e6f-bfe4-65162e35530e\\})|(\\{c6aed3ca-9da5-47fc-a828-9f5fa9aefe8c\\})|(\\{9f24dccf-d8b1-4316-90c9-3f516de2d2ef\\})|(\\{9d894603-93e5-4032-bc5e-3da1a50552d4\\})|(\\{00ca785e-6f23-4ca4-ab70-095a77a5de9e\\})|(\\{e233bed6-db39-40c4-b7f4-445e3239976c\\})|(\\{736a1e9c-8661-4f1c-9c93-396733caec96\\})|(\\{7ee265d9-0002-4f49-963b-93ccc9b0600d\\})|(addon@google\\.com)|(\\{a5bf6735-48b3-47bd-9258-e2d9dfe51467\\})|(\\{c6344599-1b07-444f-922b-7da1b12e086c\\})|(\\{e10cc63d-6a1d-4079-be47-ae0f6da9d821\\})|(\\{dc08bc05-97b7-4743-b433-fa5f85d3cf9f\\})|(\\{9eb8c864-3074-4469-8dbd-a0b212cbf8a5\\})|(\\{b43ab2ab-ca39-493c-b619-d93ddfc06440\\})|(\\{fab4cffc-c147-4bf0-8ba3-890609d47801\\})|(\\{45b8bc88-8c38-4447-9260-e0b2463cdcc6\\})|(\\{1938d918-a139-4881-8894-da9c8aff8ff0\\})|(\\{654b97fe-5daa-4314-a23c-2683ca5febb1\\})|(\\{e0b91972-8a76-4de0-bdaa-94418110552a\\})|(\\{8771d5d1-b560-41d0-8e0f-513238bc0153\\})|(\\{c49e5fd6-c3ea-47b6-85a8-d4d7cd4ac0d2\\})|(\\{7d7baa33-41c1-4001-b092-49a2d3ccdd16\\})|(\\{bb410263-f989-4bb3-a35d-fe96c07bc3be\\})|(\\{2e2d4e6a-e416-4e4c-9003-937e2c8016b1\\})|(\\{de458959-00f8-4f60-8d61-3fab157047e6\\})|(\\{9be4f97d-c6a1-42dd-a1c6-15adad9c2741\\})|(\\{59a3cf6c-584a-405a-b82d-c868f91d87e7\\})|(\\{7de1ff31-cf17-45b8-a55a-0e1608ac0627\\})|(\\{90375b4e-d778-442f-8113-212f3dbe9807\\})|(\\{8f3bf9d3-673a-421b-a326-9d8d6bcc4511\\})|(\\{8f250e7b-ea2a-4f86-ba1a-1bfef8ced945\\})|(\\{efca6935-6abb-4c28-acee-8f3ef1272640\\})|(\\{513bda76-dc3e-43f5-9f12-b9e85ac1006e\\})|(\\{9c5ea91f-d350-4521-b6d3-097d11fac75a\\})|(\\{302564ab-b478-4a60-a2a1-3aa79e3d4fa5\\})|(admin@fmt-tools\\.com)|(\\{efc8bdda-29d3-4212-8a61-6935da123d27\\})|(\\{5b3a9105-1845-4769-a64d-3c104fd07cae\\})|(\\{85b82e36-9da8-4c63-805f-5c6b994cd079\\})|(\\{d42fc5f0-9975-4955-887a-efb1d416762a\\})|(privacysecure@mybestprivacy\\.com)|(\\{205cd703-9bdc-49b6-a54b-b998de75a1fc\\})|(\\{8bcfc643-82ed-4cc0-89cb-3ed4bea284af\\})|(\\{1e2fbe56-fa52-4083-b128-91ecbdce727c\\})|(\\{b438893c-5d1d-48ee-87b0-6c9aa56d5689\\})|(\\{0f4c6635-5e84-44fd-afde-2755e2b920cf\\})|(\\{c6630e49-5bc9-4244-b70a-7a64db71228a\\}))$/","prefs":[],"schema":1576757655712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"463ffae2-9ecf-483a-957a-9e57ed056b63","last_modified":1576771657145},{"guid":"/^((youtube-mp3-converter@addoncrop\\.com)|(\\{3c8a6237-d40f-4aa0-bc66-cb6dc0ded2d3\\})|(info@example\\.com)|(youtube-downloader@addon\\.partners)|(\\{9e8611a8-c441-4d6b-881f-d1d62c4f90a4\\})|(adb@stellarwind-android\\.de)|(\\{5364615d-4d6c-45cb-aee6-2db1b76006f7\\})|(\\{1bedde37-78d6-43e4-b3ab-54336f293345\\})|(\\{7853bd47-92eb-4734-8371-dad645895f23\\})|(\\{a878339f-334e-433d-b0ac-9c799c8a6df3\\})|(\\{5dd737e5-c9f4-4b1b-86f1-5a3aefecbe26\\})|(\\{5165c342-3181-49d1-bf23-2be2d8d8cd5f\\})|(\\{e94887d3-558f-415f-83d3-4500d0604e4e\\})|(\\{80f26b45-b5db-45df-b92b-dfedfccfe2d1\\})|(\\{ebaf3af1-cd42-44b0-8a0a-5adc22dbb152\\})|(\\{bce1fb2f-1bcd-4a25-a9cd-29cc3fe21dc4\\})|(\\{fc528fa4-3528-4575-93a0-f07428654105\\})|(\\{432a4cf4-8f0c-4ab5-b3e8-e78c17d4b9f8\\})|(\\{260bf76c-b563-41d1-8a7c-0f669306a9f0\\})|(\\{7346a6e5-aec7-43d1-9135-a3b99f538bf3\\})|(\\{22af4413-6bc5-47f4-824e-ab4f15452d02\\})|(\\{8f02443a-3e5e-4160-8eda-04e104dcd804\\})|(\\{b2580f2b-bd01-4f3d-af4c-89b8bf0d2d92\\})|(\\{9e5da5b0-02d9-45f0-869b-05014c2e70cd\\})|(\\{df8a06b4-e785-46d7-87c9-a32ac5700696\\})|(\\{6eeccf3d-479f-47ab-8b9e-3f8e98d6b1de\\})|(\\{d9f5995c-0f9f-4f61-99d3-bde3676f2fa6\\})|(\\{d7f04f66-50b5-47eb-9394-597e3f712c2f\\})|(blablatina@mailnesia\\.com)|(blablatinaa@mailnesia\\.com)|(mykibetesting@gmail\\.com)|(\\{c115630b-bf15-46d5-a5ae-b053e8a99ba9\\})|(mykibetesting@ghghgh\\.com)|(mykibetesting@testmyki\\.com)|(mykibetesting46\\.2@mykitext\\.com)|(\\{9917e548-009a-42bf-bfc7-54206e036ec7\\})|(\\{46e67e2e-236c-4ab9-82ad-12b412fa787f\\})|(\\{a1676ab3-281f-40d6-a636-ce19f7f5f859\\})|(\\{d43dfd69-7730-441d-937d-c437a6c437e6\\})|(\\{1fd94b47-2148-4b97-a4b5-623168904694\\})|(\\{a41a3038-1cc8-49ca-8390-a82f913e1b03\\})|(\\{8f554d4a-54b3-48e8-b2b9-883d80627758\\})|(\\{5d61791a-b908-44a2-9066-8ecd2f70a5bf\\})|(\\{5eaafeba-bb8b-487d-8a52-45862d820f4d\\})|(\\{a3cce15f-afbb-4a03-9ca9-60981827a93e\\})|(\\{dd1031d0-40ba-49f5-97e5-82f371d93ee7\\})|(\\{9f9e1012-2b04-4a3f-a4f9-bb841bc7a1be\\})|(\\{f0c68322-bd46-4993-a526-7791f702f086\\})|(\\{98a9898c-f2aa-4833-bc38-b3625647e49f\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b4\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b5\\})|(\\{dbc0aede-945c-4a9a-bc92-585c0e2835fd\\})|(\\{42d93019-2dd9-49a4-b386-af5d13dbb14c\\})|(\\{fd15bd74-4a8e-43e3-a5a6-8f7bfc316bfe\\})|(\\{9b7226b7-8a21-4dad-9766-7c94a06d69ae\\})|(nancyseopro@gmail\\.com)|(\\{b3ef58d1-d4eb-4e48-9eba-d17600bd2ce8\\})|(\\{9b99b90a-52e3-4e7b-a1e0-5c905bf86ca6\\})|(\\{ed754bf5-b0d0-4ae4-b19b-f240e591c213\\})|(\\{2800be5f-6e20-4b21-9a3c-eb5e94205d9f\\})|(\\{4321d5f9-9a06-4972-9480-6d32d0e9ed12\\})|(\\{2774d25b-053e-44a1-b903-4e86b5bbd2f8\\})|(\\{e155420f-e615-44bc-8d7e-bc73bd0e7ecc\\})|(\\{4e4ef05f-a637-4c4e-bd22-5533e0060ef9\\})|(\\{306f60e4-ef19-4037-9c82-c2898ff17432\\})|(\\{b9374b95-4938-46fa-9507-ef877582c0d2\\})|(\\{dc395849-97bb-4456-9b79-c263a83b40e0\\})|(\\{04ae852b-bbb5-475f-8b25-3da4b15893ba\\})|(\\{91f96cf6-7bde-474b-a0b1-dbfc60db6bdb\\})|(\\{b8aac9a1-08b9-47be-97a4-7e4e0462bdfa\\})|(\\{6db30b4c-0e2d-47d0-abe6-66b778818b42\\})|(\\{4e0ea2d4-786c-4c20-9f1f-12c3734de966\\})|(\\{98ec3e35-c63a-43db-aeb7-050b350f3036\\})|(\\{a6acb773-94f9-4440-9e48-393f50989f5f\\})|(\\{363faa67-80da-4378-a20f-d32492eaab78\\})|(\\{76d55e31-5870-45f3-8862-a7006951cedc\\})|(\\{a2ff5043-dc7b-4c20-b924-135349641b95\\})|(\\{a6cc4862-ac6d-41e9-b208-cf5b280aa41c\\})|(\\{88bfe254-1837-426c-8f48-15235d69663d\\})|(\\{0cffb3be-d34c-4e38-88cc-9e4c68aa5456\\})|(\\{543b980f-e6a4-4077-b633-64ba72cae82a\\})|(\\{d2f2d8e1-7809-44fa-8309-1d41fc09db31\\})|(cht@cobraro\\.com)|(\\{40aac576-c1cc-4ef4-9ff4-90016bf5b54e\\})|(mykibetesting46\\.18@mykitext\\.com)|(\\{afb010de-7961-41d0-ad72-6c6beb05e34c\\})|(\\{25d0b02c-3c47-11e9-8f6b-9be053c51313\\})|(\\{8a146307-6862-474c-b113-8ecf993f1cfd\\})|(\\{4c0f9c72-a81f-49bb-a921-ae24cca16d70\\})|(\\{bd3b1f37-4e61-46cd-b521-925eb3ad3c25\\})|(\\{8d0b1c60-ebb7-4b7b-ae63-c40cf90e68df\\})|(\\{80690353-afb7-455f-b93b-78c7acc19962\\})|(\\{ca593a7a-bd77-4abf-8014-d1fa89006c64\\})|(\\{850be3a2-ca5f-47ad-838c-fe39b006e0d1\\})|(\\{b865704b-ca40-4939-81f1-89ef3b4eca3b\\})|(\\{7ecf61aa-e961-4704-88ac-4d8547ac35e8\\})|(\\{c63d3200-dce7-4090-b383-140a906f9aa2\\})|(\\{14d487f8-6eaa-4bae-9cb4-f604a8e4ac89\\})|(\\{86131ede-587a-4900-8c8c-4779570bff3b\\})|(\\{02229a36-d71c-4999-a319-7a072017dd5c\\})|(\\{e31ad00a-45d1-4397-8b11-9eb0e160787f\\})|(\\{1491c081-4e0a-483f-bdc4-96f5a248438c\\}))$/","prefs":[],"schema":1576757686245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e2dd31e1-4dfd-4dcc-ad4b-6d9ca4b7ed20","last_modified":1576771657140},{"guid":"/^((\\{df59cc82-3d49-4d2c-8069-70a7d71d387a\\})|(\\{ef78ae03-b232-46c0-8715-d562db1ace23\\})|(\\{4d12d613-99d9-4160-ae6c-5153e5ab0f3c\\})|(\\{41efa652-3fca-4f95-b828-8ed1fba66a84\\})|(\\{4c52e311-8d5b-4a10-95bc-b1b1e029c8d5\\})|(\\{cd627ef1-1059-4ed9-9217-1971806a9ed3\\})|(\\{c01e7fb9-2a24-4cf0-8562-896d53cd5a59\\})|(\\{83d91178-0a1e-4270-a901-b8e83aec3d0b\\})|(blabla@reallyimportantthing\\.com)|(\\{be2309ea-6113-4a99-bd3b-3b88c95cd41d\\})|(\\{02a5f8bb-9ffb-43c3-86d6-072d7316ff6d\\})|(\\{7e874309-fbf3-463b-8690-6ead9efccea0\\})|(\\{7420132f-055f-4f37-a962-3bf9ce42d798\\})|(\\{22c0c5ea-c554-498d-8a66-4c5b4be2f5e8\\})|(\\{ff95833e-5a0a-43cc-910a-e2859bc99ade\\})|(\\{92495a3e-062b-40e7-91e3-6b415c694c57\\})|(mykibetesting47\\.1@mykitext\\.com)|(\\{96cde09b-2d70-41ee-acf6-548728846d48\\})|(mykibetesting47\\.1000@mykitext\\.com)|(\\{98f556db-837c-489e-9c45-a06a6997492c\\})|(\\{bb19d814-d035-4f5d-b291-9b26e4a7fd37\\})|(\\{56a1e8d2-312d-4222-aca5-eee58e0f1234\\})|(\\{9cc56d18-c8fb-436a-861a-128cf2fc580c\\})|(\\{27eebcd1-7ef4-4de3-9d5e-db9e2348c990\\})|(\\{71d3ba6e-e461-44fa-8f27-02c6dbd9b653\\})|(connect@seovpn\\.net)|(\\{859bf655-0266-4f21-9c52-3bd156896259\\})|(\\{adc5c6d8-ac87-4b5f-b885-1adfd00265a7\\})|(\\{d826e099-f797-401f-b363-c03f29a8f9b7\\})|(\\{5621e792-bba7-4e66-a63b-56a9e145c089\\})|(\\{c3e4070e-7845-41fd-8996-8817bbc28790\\})|(\\{eb256992-3498-4262-9c7e-ac82f93aeaca\\})|(\\{da9d1606-dfde-429c-bb6a-63ebe5f8412c\\})|(\\{41e29257-1089-42c8-9d59-add5a0003ffa\\})|(seovpnv5@seovpn\\.net)|(direct-apk-s@eladkarako\\.com)|(\\{376063b4-f6b8-43e9-928f-437ad0ec5333\\})|(\\{b78bf75a-3cea-436b-b081-c9857f295618\\})|(\\{9b8ec882-b5dc-4df2-b9eb-097ba4dcb4b0\\})|(\\{8c0f6ff5-8ea2-4da0-be7b-e588baa02a03\\})|(\\{88295bde-3fc2-4bf9-8090-872d223f2f92\\})|(\\{67582ce8-8c5e-4207-9694-5b0ecc77887b\\})|(\\{db443bc5-4f91-4c82-a14a-298575ff6aba\\})|(\\{d7709ac2-bcde-4d15-a1a7-c459fe592d8e\\})|(\\{40fbe322-ca79-4472-9ac9-0d493f2623da\\})|(\\{77ca86a6-2042-4519-9cd5-4f5fd036d0eb\\})|(youtube-video-downloader@addoncrop\\.com)|(youtube-video-downloader-ff@addoncrop\\.com)|(\\{ed48a832-c064-4d79-bf2e-3c5b21242b3c\\})|(\\{1ce93624-96e6-449d-b038-3380db21cc48\\})|(\\{8957639f-8577-4df9-a1a7-f6d5a9fc9fcd\\})|(\\{c07d8367-6c2d-4a7d-a9ab-207b3104359f\\})|(\\{c4d3f949-60fd-45d5-9cc0-2501319bb60c\\})|(\\{b23bc17b-9fba-4a49-9afe-a1e9cd49c73b\\})|(\\{9f814c7c-0161-4cd4-9d19-50e203f5160c\\})|(\\{0a04ea15-85b4-40ac-a1d1-a6fb5967fb3b\\})|(\\{7bd5a0e9-e8c0-4e64-bda5-7b5310629777\\})|(unlazy@eladkarako\\.com)|(unsecure@eladkarako\\.com)|(xda@eladkarako\\.com)|(direct-filehippo@eladkarako\\.com)|(real-url@eladkarako\\.com)|(\\{63fcde93-baf6-40b5-892c-29cc34365b57\\})|(\\{2913327e-bd0b-4962-adce-2f44407fb521\\})|(\\{88f2e8f9-a7e1-4d68-901d-e5a9c805f4fa\\})|(\\{fd4fcb6a-cad2-43ab-b1c5-efd4d2102de8\\})|(youtube-mp3-converter-ff@addoncrop\\.com)|(\\{0a90b652-0de6-421a-bfee-1d2c5c3ee8fe\\})|(dropeextool@gmail\\.com)|(add_archive@ext\\.xpi)|(\\{47aa471f-3cf1-4a22-9c99-ab5baf326a60\\})|(\\{ac01f6a8-7c30-450b-9979-98d0c7795e11\\})|(\\{2c09761e-2c89-4537-b335-2bd30a7136c2\\})|(\\{c55ddee5-baab-4c90-9948-ca47033a82ce\\})|(\\{5cdb4845-56a8-45df-936b-de8279f2587d\\})|(\\{ea68dd52-2470-4d7c-b563-9a4c6d0e7eab\\})|(\\{01d33686-cab1-4f3b-b2ad-83bc1c35c60a\\})|(\\{fcb61a95-e861-4cf1-801b-f91c75c4714a\\})|(mg3a2mzdsug6fou4k8yk@mg3a2mzdsug6fou4k8yk\\.com)|(wh70nimqtlpwt951i12a@wh70nimqtlpwt951i12a\\.com)|(\\{b64109f0-5d2a-4c86-a38c-886589cb2703\\})|(legacy@context_search\\.com)|(\\{7b49d8bd-1e29-4887-9165-a272f553a154\\})|(\\{a49d6fa5-1967-43ed-b8bd-586f206326cd\\})|(\\{8b14f730-34fa-41e7-9590-d44df583a57f\\})|(\\{01dda21f-3b94-4297-b302-d92535b2e880\\})|(\\{6a33fb2c-3d3a-401f-be54-342ef4d57d1f\\})|(\\{887a4a9a-63ed-4af8-b82b-b68e9c23d39b\\})|(\\{6cae6de5-ff67-4682-a72b-39a1747fc682\\})|(\\{c5b5ac10-8592-4ee9-ad7b-003bb9706f87\\})|(\\{2fb3dc77-de0c-4e34-be3b-13a92bffe898\\})|(\\{82a92837-91de-4282-95d2-bda6d4ac682f\\})|(\\{dae5d3cf-42ba-40ad-85d9-482e25d4682c\\})|(\\{2328a4ad-9d5c-47fa-b580-c7d488bd7a7a\\})|(\\{deb5ba3b-3cf9-4333-99e3-ae2651a5297d\\})|(gespindola@unisuam\\.edu\\.br)|(\\{4518dbc6-fc51-4292-8d85-6eba66959dcb\\})|(\\{7864e12a-8628-415e-8ae8-5ac25edaa420\\})|(\\{b56e7db0-5504-4dd2-8c21-7fb645adae38\\})|(\\{c78ac5a8-0005-4cfb-8a01-5d116a225377\\})|(\\{468301ed-b30f-44f9-85aa-d5ff4c840008\\})|(\\{ae45b0a5-a02e-41df-8a2e-f745d7a7ede3\\})|(\\{f42b032c-3017-44d5-99a1-129524d02494\\}))$/","prefs":[],"schema":1576757713908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f3e4d6d-9b1c-4fe1-940a-2871943bac88","last_modified":1576771657136},{"guid":"/^((\\{7e81d973-d606-4f4b-a61f-9c37612c3947\\})|(\\{651d950b-9db7-445f-8263-2dd18265ed3b\\})|(\\{d408b96a-203d-462a-9577-84afb08aa951\\})|(\\{e1fc8acf-65d6-48a2-89d9-410a32bd86da\\})|(\\{1e9302af-a3e1-4c7c-8416-f814dd796cb9\\})|(\\{c4aba9b0-df06-4fc5-8e64-37f99df5e9e9\\})|(\\{24399e9e-50ef-47c3-a728-ebf3af91a0c6\\})|(\\{bdf866a5-ebdd-4e7d-b624-49b53be98a4b\\})|(\\{9ab09f29-f294-4bdd-a58a-c3abea54f032\\})|(\\{b678ee0d-0e1f-433d-8ce8-93e1b51b8834\\})|(\\{6ed0906f-7926-4fc2-ab60-1577631641b2\\})|(\\{0bed1847-54e3-40ac-9cee-0ffd6e4acf1f\\})|(\\{09041dc2-0caa-4955-bf87-de874a0c6b7b\\})|(\\{035ff918-be13-4906-bba3-25153c30b8c4\\})|(\\{e81cbba6-39d5-4f33-a6be-3b99545b54b1\\})|(\\{67d8820b-3078-4835-ab7a-11befb521d33\\})|(\\{c5ad3a58-824c-4db4-8f2c-33b91565417f\\})|(\\{6e289bc1-ab94-44be-adf7-deb1a85cf809\\})|(\\{f6a3d54b-bf6f-4878-881e-a521065412c4\\})|(latest-extension@surviv\\.io)|(\\{3ee8d899-be15-45e4-8c09-a1c10febfb4d\\})|(\\{7ccf5eca-d275-4967-939a-7b9b91d9e0f2\\})|(\\{cd8542c3-3c8e-4fa1-8463-4c5ea7aa25ce\\})|(\\{2994abd2-02a5-4c66-9fd2-38ad8d911324\\})|(\\{10a69518-499c-4339-a733-8ac27166a400\\})|(apzsqkoq0oxjal69l9zr@apzsqkoq0oxjal69l9zr\\.com)|(mbanzzhnky54hoe6jq62@mbanzzhnky54hoe6jq62\\.com)|(\\{ce926acf-d6ab-48b0-8e5d-82257de14011\\})|(\\{c42394d0-1c76-4e5e-8a94-f7c4a2de2ada\\})|(7eylx2qcpshoiehzcl2y@7eylx2qcpshoiehzcl2y\\.com))$/","prefs":[],"schema":1576757777185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8f82683f-a1c2-4f61-bf9b-8f279d35f746","last_modified":1576771657132},{"guid":"/^((Astro_Connect_BHZNbNOGmL@www\\.astro-connect\\.com)|(Astro_Connect_HRMdSrojBR@www\\.astro-connect\\.com)|(Astro_Connect_lAOPFWMnqc@www\\.astro-connect\\.com)|(Astro_Connect_vMYMzqvERv@www\\.astro-connect\\.com)|(Astro_Daily_Online_1090c71e5da3cd9ab2d6af4985b43f5c@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_b82a3c2703d37e513b428067a34655d8@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_hqNzpeWZrm@www\\.astrodailyonline\\.com)|(Astro_Daily_Online_GzIzTViMnE@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_a7f59cbf31536249d41b97278115b17a@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_VqZjYRsphH@www\\.astrodailyonline\\.com)|(Bible_Quotes_97910bef6e96a7d0569f5fb44b2c607c@www\\.bible-quote\\.co)|(Bible_Quotes_clone_9699f1b771e162467f078c076eb9b695@www\\.bible-quote\\.co)|(Bible_Quotes_clone_wYibuualSr@www\\.bible-quote\\.co)|(Bible_Quotes_PHMyuAzCPa@www\\.bible-quote\\.co)|(blackfridaystoresco@www\\.blackfridaystores\\.co)|(Browse_Manuals_3ff31012f87f9a4c01e1ef723f48eff1@www\\.browsemanuals\\.co)|(Browse_Manuals_ca51c107572ab179fc1e8d4b652b19e1@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_2dbeb0fd48d84ff3a5d3e3a7b5fc3756@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_biPZDTWfln@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_ksNBKBSmge@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_lcMJgmivkD@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_UaWIZDqLBJ@www\\.browsemanuals\\.co)|(Calculate_Fast_uWtHrQKgWv@www\\.nowcalculatefast\\.com)|(cheapflightfaresco@www\\.cheapflightfares\\.co)|(Check_Astro_Today_wkptBasvVf@www\\.checkastrotoday\\.com)|(Check_Astro_Today_YgMcUMJFVL@www\\.checkastrotoday\\.com)|(Check_Astrology_GGZGReDTnd@www\\.checkastrology\\.co)|(Check_Directions_RmiiKOUYTf@www\\.checkdirection\\.com)|(Check_Mails_clone_tdpeulgItk@www\\.check-mail\\.co)|(Check_Mails_iLVZDNXtnY@www\\.checkmailsnow\\.link)|(Check_Mails_ITnrNsNpcj@www\\.checkmailsnow\\.today)|(Check_Mails_Now_clone_oOzxmNgfQn@www\\.checkmailsnow\\.net)|(Check_Mails_Now_clone_vVWZzkqahk@www\\.checkmailsnow\\.net)|(Check_Mails_Now_ePyetjMzel@www\\.checkmailsnow\\.link)|(Check_Mails_Now_IfFzRcCuJa@www\\.checkmailsnow\\.online)|(Check_Mails_Now_OqRkgMLHGo@www\\.checkmailsnow\\.live)|(Check_Mails_Now_pHoBMgvLtK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_QMsZiFhjjH@www\\.checkmailsnow\\.online)|(Check_Mails_Now_qOSRXKCsHK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_vnjdpXGSWk@www\\.checkmailsnow\\.net)|(Check_Mails_vNOoNISpGM@www\\.check-mail\\.co)|(Check_Maps_3ec1ffc98971e67fa854369f9e3486d0@www\\.check-maps\\.co)|(Check_Maps_BezZcNfeab@www\\.check-maps\\.link)|(Check_Maps_bKaiUcBTpN@www\\.check-maps\\.net)|(Check_Maps_clone_RUjCUUeRwF@www\\.checkmaps\\.co)|(Check_Maps_KzXAqTbRZi@www\\.check-maps\\.co)|(Check_Maps_ogQkeJhGuf@www\\.checkmaps\\.net)|(Check_Maps_SwGvtYCSWM@www\\.check-maps\\.org)|(Check_Maps_uYfjFOesyI@www\\.check-maps\\.org)|(Check_My_Mails_iAClnrnvyj@www\\.checkmymails\\.online)|(Check_My_Mails_TYlXbVPRXn@www\\.checkmymails\\.info)|(Check_My_Mails_XvyJVrZWQX@www\\.checkmymails\\.info)|(Check_My_Mails_ZAVfjZCgnv@www\\.checkmymails\\.co)|(Check_My_Speed_Now_OsGaqlODan@www\\.checkmyspeednow\\.com)|(Check_My_Speed_PQiWezZbqs@www\\.checkmyspeed\\.co)|(Check_My_Speed_qvklQhzugJ@www\\.checkmyspeed\\.co)|(Check_Net_Speed_aAaAYSEawi@www\\.checknetspeed\\.online)|(Check_Net_Speed_EKnEHmaiYm@www\\.checknet-speed\\.today)|(Check_Net_Speed_IcfzRgdvIx@www\\.checknet-speed\\.today)|(Check_Net_Speed_rqJpoOAXqE@www\\.checknet-speed\\.today)|(Check_Net_Speed_SoVZYFExRY@www\\.checknetspeed\\.today)|(Check_Net_Speed_sXCrVEDGiO@www\\.checknet-speed\\.today)|(Check_Net_Speed_VQGJrJvlIm@www\\.checknet-speed\\.today)|(Check_Net_Speed_wCexanRKNz@www\\.checknetspeed\\.link)|(Check_Net_Speed_yTZgqCpFPi@www\\.checknet-speed\\.today)|(Check_Net_Speed_zCCNoLFHOF@www\\.checknetspeed\\.online)|(Check_News_clone_qPYbwwKpgF@www\\.checknews\\.co)|(Check_News_dGPwUXsQpF@www\\.checknews\\.co)|(Check_Speed_Test_KohJtFpgLB@www\\.checkspeedtest\\.co)|(Check_Speed_Test_XcYMLbMdlh@www\\.checkspeedtest\\.co)|(Check_Weather_clone_FJgKgEEkzT@www\\.checkweather\\.co)|(Check_Weather_clone_TwXCcjNBdE@www\\.checkweather\\.co)|(Check_Weather_Daily_65ec7723f6fbbe7786d60bd4e2643b1c@www\\.checkweatherdaily\\.com)|(Check_Weather_Daily_YxdeQsIzIP@www\\.checkweatherdaily\\.com))$/","prefs":[],"schema":1576757846784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff5d3b75-f26c-47cd-85df-32c193a8d002","last_modified":1576771657128},{"guid":"/^((Check_Weather_Details_26e944ef07a6d60d7e6e109df96aadc6@www\\.checkweatherdetails\\.co)|(Check_Weather_NkuDUpBOfy@www\\.checkweathertoday\\.com)|(Check_Weather_Today_1b92f68f44010297e79e167abdbbad90@www\\.checkweathertoday\\.com)|(Check_Weather_Today_2b5b41fcbe35242dced42efd82346b62@www\\.checkweathertoday\\.com)|(Check_Weather_Today_37f90d6081f0f87dde0eca340268dd06@www\\.checkweathertoday\\.com)|(Check_Weather_Today_421f2bbc2e93713f42200c4cf4184b2f@www\\.checkweathertoday\\.com)|(Check_Weather_Today_647dda58dab18a066b5edcd1bf82f244@www\\.checkweathertoday\\.com)|(Check_Weather_Today_8d106128d380304fbf7cf760284ed189@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a6606d84c174672bdc97a40ae26a7329@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a7ec7b0d21c0b719949374759fa27f9e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_AGSeXIfuyC@www\\.checkweathertoday\\.com)|(Check_Weather_Today_c72d09cea0b53ffdd1a496e376b22696@www\\.checkweathertoday\\.com)|(Check_Weather_Today_cbc523bdd189c28af1505f104443a1cf@www\\.checkweathertoday\\.com)|(Check_Weather_Today_e448585b8ce80f90b04ad34b57c00d6e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_ed0f6099cd2a8e05500657b43f897afc@www\\.checkweathertoday\\.com)|(Check_Weather_Today_EppkRAhhSW@www\\.checkweathertoday\\.com)|(Check_Weather_Today_f06201395c0dc5e1aa9fd68e2059dc18@www\\.checkweathertoday\\.com)|(Check_Weather_Today_fd6b11d8d8cad6bb654cf46a0e100cbe@www\\.checkweathertoday\\.com)|(Check_Weather_Today_FdVgvyMTJo@www\\.checkweathertoday\\.com)|(Check_Weather_Today_leAPNcsALh@www\\.checkweathertoday\\.com)|(Check_Weather_Today_LFHBoYhhIu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_MJoPqcUdAA@www\\.checkweathertoday\\.com)|(Check_Weather_Today_neiEtvLsDn@www\\.checkweathertoday\\.com)|(Check_Weather_Today_NvAaeiHaWs@www\\.checkweathertoday\\.com)|(Check_Weather_Today_OGjNKxAeXE@www\\.checkweathertoday\\.com)|(Check_Weather_Today_uABqfeATcz@www\\.checkweathertoday\\.com)|(Check_Weather_Today_WKqJGOJnJg@www\\.checkweathertoday\\.com)|(Check_Weather_Today_xCOMPlhuXu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_XmOwlHQNSl@www\\.checkweathertoday\\.com)|(Check_Weather_wktudKPpvh@www\\.checkweather\\.co)|(Check_Your_Mail_5697289aed4cf7b184d93e5c53117e07@www\\.check-yourmail\\.co)|(Check_Your_Mail_BZSHAsKTzJ@www\\.check-yourmail\\.co)|(CheckMailPro\\.net_CheZLENbVx@checkmailpro\\.net)|(checkmaps@www\\.check-maps\\.co)|(CheckNetSpeed\\.co_tkZoSRvsPg@www\\.checknetspeed\\.co)|(checknetspeedco@www\\.checknetspeed\\.co)|(Convert_Doc_Online_ptdllbDbTd@www\\.convertdoconline\\.com)|(Convert_File_JHjKeEFAkZ@www\\.convert-file\\.net)|(Convert_File_ocNpurmujk@www\\.myfileconverter\\.org)|(Convert_File_Online_JfGXnualjV@www\\.convertfileonline\\.net)|(Convert_Files_Now_8390db80d295eac08ca91cc1687ebf6d@www\\.convertfilesnow\\.co)|(Convert_Files_Now_afb77fba2ab7b055f10896e538ebd2f6@www\\.convertfilesnow\\.online)|(Convert_Files_Now_fzusJnJyIU@www\\.convertfilesnow\\.co)|(Convert_Files_Now_YEHBPCVZfb@www\\.convertfilesnow\\.online)|(Convert_Files_Online_cf2d8484b67f12d038789a618bae5465@www\\.convertfilesonline\\.co)|(Convert_Files_Online_RptGXHLRjE@www\\.convertfilesonline\\.co)|(Convert_My_Doc_771b3d45ecf0ab980ab0dfdcb9dc1c16@www\\.convertmydoconline\\.com)|(Convert_My_Doc_ofLnqzQpvZ@www\\.convertmydoconline\\.com)|(Convert_My_Document_ynCvryXblL@www\\.convertmypdf\\.online)|(Convert_My_File_0e081da9309e2ee8cbe6e5e1ca3373d1@www\\.convertmyfile\\.co)|(Convert_My_File_2451d924787cf4b696596f09fde42c2f@www\\.convertmyfiles\\.net)|(Convert_My_File_35bbde2206c3bb498f5033610ab82af6@disable\\.convertthefiles\\.online)|(Convert_My_File_68884222b56f8d972093a20f7d5fcf94@www\\.convertmyfile\\.co)|(Convert_My_File_e4a4b99e91c46c64d75d2795ac8e8d58@www\\.convertthefiles\\.online)|(Convert_My_File_GHurKBBhRg@www\\.convertmyfile\\.co)|(Convert_My_File_HlOKyXsynN@www\\.convertmyfile\\.co)|(Convert_My_File_sdaXbdSqCR@www\\.convertmyfiles\\.net)|(Convert_My_File_SiQYEMQoEO@www\\.convertthefiles\\.online)|(Convert_My_File_SJjGzfwuEU@www\\.convertthefiles\\.online)|(Convert_My_File_SzhPQAPUZF@www\\.convertmyfile\\.co)|(Convert_My_File_zOqNatevtM@www\\.convertmyfiles\\.net)|(Convert_My_Files_41f090cd741517aacdcc2c939b5ba94e@disable\\.convertmyfiles\\.net)|(Convert_My_Files_AcwjJWzydY@www\\.convertmyfiles\\.co))$/","prefs":[],"schema":1576757889686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92d2dcba-9f62-4b16-8472-843bc53efef5","last_modified":1576771657124},{"guid":"/^((Convert_My_Files_clone_AtaaUykZUt@www\\.convertthefiles\\.co)|(Convert_My_Files_clone_iipeyamXvF@www\\.convert-myfiles\\.link)|(Convert_My_Files_GcaMuSvchr@www\\.convertmyfiles\\.co)|(Convert_My_Files_ITTiqkJdem@www\\.convertmyfiles\\.link)|(Convert_My_Files_mOqWpDqFfS@www\\.convertmy-files\\.link)|(Convert_My_Files_ObjwXXGRmQ@www\\.convertmyfiles\\.net)|(Convert_My_Files_OdEReOXPeW@www\\.convertmyfiles\\.link)|(Convert_My_Files_WdZEfGNUyl@www\\.convertmyfiles\\.link)|(Convert_My_Files_ZSVwsGAvMB@www\\.convert-myfiles\\.link)|(Convert_The_File_ajAXskmxxC@www\\.convertthefile\\.co)|(Convert_The_File_decdQgcxcJ@www\\.convertthefile\\.co)|(Convert_The_File_lfLaRLbLCX@www\\.convertthefile\\.online)|(Convert_The_File_pVtEvdXWNp@www\\.convertthefile\\.co)|(Convert_The_File_YeFOCclGsc@www\\.convertthefile\\.co)|(Convert_The_File_yfsuYhYdaU@www\\.convertthefile\\.net)|(Convert_The_PDF_clone_52933220d40bf58153ba067b1c9c2a0c@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_929829a88637d12dbf08fd4f782a93b8@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_WZNDVMgflh@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_xmrWNxzVTQ@www\\.convertthepdf\\.com)|(Convert_The_PDF_e8cd3270f4b0eec8bd7ec39dfe2b411c@www\\.convertthepdf\\.com)|(Convert_Your_Files_546ea793afdb11f0c3cb3866dcb02379@www\\.convertyourfiles\\.co)|(convertfilestopdfcom@www\\.convertfilestopdf\\.com)|(convertmypdfco@www\\.convertmypdf\\.co)|(convertmypdfonline@www\\.convertmypdf\\.online)|(convertthepdfco@www\\.convertthepdf\\.co)|(convertthepdfcom@www\\.convertthepdf\\.com)|(Cook_With_Me_oYyEsUWTmq@www\\.cookwithme\\.co)|(Coupon_Club_App_20ef9a3e126b1c339a97a60672528026@www\\.couponclubapp\\.co)|(Coupon_Club_App_295813467b3bbbd03ed2574a3a379041@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_dMsjQwVamC@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_pahxCWSfWG@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_tLIovhcRov@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_UKQIyoDcSk@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_wgpiIAHAQx@www\\.couponclubapp\\.co)|(Coupon_Club_App_imfeKPFBRv@www\\.couponclubapp\\.co)|(Coupon_Club_App_vqwFoUyfpL@www\\.couponclubapp\\.co)|(Coupon_Daily_DGaEVQJCVN@www\\.coupondaily\\.today)|(Coupon_Dealer_rRkzTRGEcA@www\\.coupondealer\\.co)|(Coupon_Finder_Hub_8f0b12e405b7568785bcc785d6be30d2@www\\.couponfinderhub\\.com)|(Coupon_Saver_Plus_ffb1e922e2994e938b8f9aeff598c90d@www\\.couponsaverplus\\.co)|(Coupon_Saver_Plus_GTTzegkxqL@www\\.couponsaverplus\\.co)|(Coupon_Store_MlfSWWimyu@www\\.mycouponstore\\.co)|(Coupon_Store_Search_clone_AbsQujloBm@www\\.thecouponstore\\.co)|(Coupons_Flash_clone_TCfVLxCpbB@www\\.couponsflash\\.co)|(Coupons_Flash_fYMZkaoiDb@www\\.couponsflash\\.co)|(Coupons_Flash_WRjXiQAOwJ@www\\.couponsflash\\.co)|(Coupons_Magic_AuVOPUiczY@www\\.couponsmagic\\.co)|(Coupons_Magic_MaDWggNxen@www\\.couponsmagic\\.co)|(Coupons_Magic_ZebFYzkzoN@www\\.couponsmagic\\.co)|(Coupons_Tab_9a56fd9df10d162f000ef7dac2689e8e@www\\.couponstab\\.co)|(Coupons_Tab_sFSnaAFdDP@www\\.couponstab\\.co)|(Coupons_Test_uyywuEAPjT@www\\.couponstab\\.co)|(couponstore@www\\.coupon-store\\.co)|(CutePuppyWallapers\\.com_nicLwcUsfw@www\\.cutepuppywallapers\\.com)|(Daily_Astrology_fPoifgshwY@www\\.daily-astrology\\.online)|(Daily_Astrology_WPGvllFIRz@www\\.my-dailyastrology\\.net)|(Daily_Coupon_Finder_XefkJELubc@www\\.dailycouponfinder\\.co)|(Daily_Coupon_Store_cdowGuTgIr@dailycouponstore\\.co)|(Daily_Coupons_Tab_2c96becddbca0072a93db91266fbfefa@www\\.recipeboardplus\\.com)|(Daily_Coupons_Tab_HRcyzwBTWg@www\\.dailycouponstab\\.com)|(Daily_Deals_Club_yIvuSLfnXr@www\\.dailydealsclub\\.co)|(Daily_Easy_Recipe_OlMvwdldaK@www\\.dailyeasyrecipe\\.com)|(Daily_Easy_Search_95c6b38eb0f04a21212c678a43291d12@www\\.dailyeasysearch\\.com)|(Daily_Easy_Search_MVXtvNQzSj@dailyeasysearch\\.com)|(Daily_File_Converter_23db4a874fc066754c187eef894ccbe7@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_25b0c49fa35ba08d5b33edd7b48f2c92@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_9d4c9a6f7a5c796c84a594619c1e6993@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_b4b0ea08aa61314c75baffd0246b9bcf@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_clone_RDUYhKAKFi@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_clone_yuTWwUVfoL@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_cVmGYeldAg@www\\.dailyfileconverter\\.co))$/","prefs":[],"schema":1576757965088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6944f445-4df8-4331-93da-1b32fc130849","last_modified":1576771657120},{"guid":"/^((Daily_File_Converter_ooPlASGwFM@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_QMxMSpDXIk@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_UufmFacjfR@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_vaLEkEAYJg@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_VhHvpeSnpU@www\\.dailyfileconverter\\.com)|(Daily_Game_Search_EaLACFoFKS@www\\.daily-gamesearch\\.today)|(Daily_Game_Search_muvQxhbZNu@www\\.dailygamesearch\\.today)|(Daily_Game_Search_VSZsYHVLcK@www\\.dailygame-search\\.today)|(Daily_Game_Search_XpyakjSRnr@www\\.dailygamesearch\\.co)|(Daily_Games_40e88a4d6ecfd9f9af84e1e6c7d76ffe@www\\.gamesdaily\\.online)|(Daily_Games_53113db02f9dd623b086f331ade6d2a6@www\\.game-quest\\.co)|(Daily_Games_a3083ae69e261df3b7d43f5282b250d0@www\\.daily-games\\.co)|(Daily_Games_adebc8294b5d311f8d3b5abd659e09f6@disable\\.daily-games\\.co)|(Daily_Games_b0819ccb9f64203af68bb05e00f36c2a@www\\.dailygame\\.online)|(Daily_Games_BhJRTCwnnH@www\\.game-quest\\.co)|(Daily_Games_BYlaCwrbCa@www\\.dailygame\\.online)|(Daily_Games_c342718e3fb89df8a20b77f635ea0e0f@www\\.dailygame\\.online)|(Daily_Games_caf0a82b928c12c5d67d2e0d142acbcc@www\\.daily-games\\.online)|(Daily_Games_clone_MHxxZxsjgz@www\\.gamesdaily\\.co)|(Daily_Games_d859afcc6f811f0938e06c8b75ac15fc@www\\.gamesdaily\\.online)|(Daily_Games_e6da5a8f129fc23530fc715fd2f7b993@www\\.daily-games\\.today)|(Daily_Games_e858f8f836f17ab5e1c3b269639bc434@www\\.daily-games\\.co)|(Daily_Games_FHAIlDwdZF@www\\.gamesdaily\\.co)|(Daily_Games_IgqcabXnnH@www\\.dailygame\\.online)|(Daily_Games_NOgqDldYjE@www\\.daily-games\\.co)|(Daily_Games_qEgzrEJBZi@www\\.daily-games\\.co)|(Daily_Games_qFMKBgNfOc@www\\.gamesdaily\\.online)|(Daily_Games_vfGCbwKDjq@www\\.daily-games\\.online)|(Daily_Games_VoOHRAgAxg@www\\.daily-games\\.today)|(Daily_Games_vwRTUFvSbP@www\\.gamesdaily\\.online)|(Daily_Games_YoUYAafVuL@www\\.daily-games\\.co)|(Daily_Horoscope_Finder_f4f7f24d489880fa4779c5a4aff5278d@www\\.dailyhoroscopefinder\\.com)|(Daily_Local_Weather_RTvDyyEuxy@www\\.dailylocalweather\\.net)|(Daily_Mail_Tab_AMkImujKsG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_BWhcKvnbJG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_jkCRhwZjtG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_xMqjhKMBPX@www\\.dailymailtab\\.com)|(Daily_Net_Speed_gcVjCfMtcE@www\\.dailynetspeed\\.com)|(Daily_News_Reports_707e3c94519dc4f338e25415097fc409@disable\\.dailynewsreports\\.co)|(Daily_News_Reports_bc4cc8745c5c9113add6bbcc7a4e891d@www\\.dailynewsreports\\.co)|(Daily_News_Reports_MgfPHeboNM@www\\.dailynewsreports\\.co)|(Daily_News_Reports_RhfPUMZyKi@www\\.dailynewsreports\\.co)|(Daily_Package_Tracker_qJQSJblDIk@www\\.dailypackagetracker\\.com)|(Daily_PDF_Converter_cAlFsFtCmX@www\\.dailypdfconverter\\.com)|(Daily_Radio_Hub_4b6408c6028360c91e55070e8a8b6c07@www\\.dailyradiohub\\.com)|(Daily_Radio_Hub_CEgdHfrHfk@www\\.dailyradiohub\\.com)|(Daily_Recipe_Finder_LpHSZIWYdz@www\\.dailyrecipefinder\\.com)|(Daily_Recipe_Ideas_clone_xqrPqfTBif@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Ideas_dyhmXRtGGY@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Now_IXRimkpfYA@www\\.dailyrecipenow\\.com)|(Daily_Recipe_Search_wHQTXcltvc@www\\.dailyrecipesearch\\.co)|(Daily_Search_3e2f26bf46061e1fb6386bb2bc9fb3b1@www\\.dailysearch\\.co)|(Daily_Search_clone_RAfKSlJEDD@www\\.dailysearch\\.co)|(Daily_Search_Plus_b60c5575e4d5158e20036cb104c00bba@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_f693ecbe1af3da784c31114acc402ec4@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_oldtAgRAUL@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_xCxtAmrZoI@www\\.dailysearchplus\\.com)|(Daily_Search_Web_f70aa46e9caf1e58a04aad7917c8d0aa@www\\.dailysearchweb\\.com)|(Daily_Search_Web_PvsRmlCiKL@www\\.dailysearchweb\\.com)|(Daily_Speed_Check_475174e16d0d170b447b7002797efade@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Check_uqFEhmPbDE@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Checker_1c6d34e9410cb2652228c18bed9eaf67@www\\.dailyspeedchecker\\.com)|(Daily_Speed_Checker_wcntWZhyvr@www\\.dailyspeedchecker\\.com)|(Daily_Transit_Guide_a4b1896ed15535c97cf0c19cb3960680@www\\.dailytransitguide\\.com)|(Daily_Transit_Guide_rOdLEeRGxw@www\\.dailytransitguide\\.com)|(Daily_Weather_Finder_94b59c3b4bf2e42f392be55572d25ac2@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Finder_QhhPAMLPai@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Forecast_cgMvSNkeBN@www\\.dailyweatherforecast\\.net))$/","prefs":[],"schema":1576757992072,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4acfb151-a1d2-4468-9794-5816fadef1b7","last_modified":1576771657116},{"guid":"/^((Daily_Weather_Forecast_clone_CSwGEuwNKr@www\\.dailyweatherforecast\\.co)|(Daily_Weather_Forecast_f7824fa0dfff1fdbe9f36ad33ecfa4b4@www\\.dailyweatherforecast\\.net)|(Daily_Weather_Forecast_kclkQdSlIO@www\\.dailyweatherforecast\\.co)|(DailyCoupons\\.store_zWkmEkoPgk@www\\.dailycoupons\\.store)|(DailyJobSearch\\.co_EKJtPSSMhB@www\\.dailyjobsearch\\.co)|(DailyJobsSearch\\.net_a2ba2cb41169ec0e7e1e381ae8cec363@www\\.dailyjobssearch\\.net)|(dailyjobssearch@www\\.dailyjobssearch\\.co)|(dailyjobssearchnet@www\\.dailyjobssearch\\.net)|(DailyLocalWeather\\.net_clone_jVyHpUvXAl@www\\.dailylocalweather\\.net)|(DailyLocalWeather\\.net_vzkDkoQoVN@www\\.dailylocalweather\\.net)|(DailyNetSpeedtest\\.co_HWGHkbkKGm@dailynetspeedtest\\.com)|(dailynewsupdatesinnet@www\\.dailynewsupdates\\.in\\.net)|(dailynewsupdatesonline@www\\.dailynewsupdates\\.online)|(DailyRecipeOnline\\.net_bVwwSbDKSk@www\\.dailyrecipeonline\\.net)|(DailyRecipeSearch\\.co_zXrOSYpFeH@www\\.dailyrecipesearch\\.co)|(DailyRecipeSearch\\.info_VJInpLJmig@www\\.dailyrecipesearch\\.info)|(Dictionary_Pro_App_HbjmnxLIZN@www\\.dictionaryproapp\\.com)|(Dictionary_Pro_PquztTZbLu@www\\.dictionarypro\\.co)|(Dictionary_Xpress_QeRWOLUqwj@www\\.mywordscribent\\.com)|(Directions_Finder_190cb6038fd06edbc48ea5423cc43227@www\\.finddirections\\.co)|(Directions_Finder_1e30de3303446cde1d03ee219a13f572@www\\.finddirection\\.online)|(Directions_Finder_868daddf032f443da0515e9c976159c9@www\\.finddirections\\.co)|(Directions_Finder_86fa782f7bd705c2e644aa07f6218661@www\\.finddirections\\.co)|(Directions_Finder_AcrlxGosjE@www\\.finddirections\\.co)|(Directions_Finder_BZDovhcQyV@www\\.findroutes\\.co)|(Directions_Finder_c005f28d896373d557e03e80f4b57d37@www\\.findroutes\\.co)|(Directions_Finder_e183b060f3f35940a9291cd2ed4791e3@www\\.finddirections\\.co)|(Directions_Finder_lHmoDZAZNo@www\\.finddirections\\.co)|(Directions_Finder_LKGiGUhRDf@www\\.finddirections\\.co)|(Directions_Finder_Now_NMzpPonhyb@www\\.directionsfindernow\\.com)|(Directions_Finder_QTCjmhKxhD@www\\.finddirection\\.online)|(Directions_Finder_V1_0c00deff96164188875cce59cb27ebb1@www\\.finddirections\\.co)|(Directions_Finder_V1_4668ec661e1b94a2474a1c1675158eb2@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeD@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeDic@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_lkSfnVsTUN@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_mPiHTaJZJi@www\\.finddirections\\.co)|(Directions_Finder_V1_de58f7b93a8d173bc071b3730806cf8c@www\\.finddirections\\.co)|(Directions_Finder_V1_ffc19350a43c8bf4db65930f95663016@www\\.finddirections\\.co)|(Directions_Finder_V1_xivwbBBnLX@www\\.finddirections\\.co)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_2@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_23@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef@www\\.directionsfound\\.com)|(Directions_Found_clone_hbtpEmPzTJ@www\\.directionsfound\\.com)|(Directions_Found_clone_hdjMdQYTvN@www\\.directionsfoundnt\\.com)|(Directions_Found_GLuiPTQCww@www\\.directionsfound\\.com)|(Directions_Found_mVBuOLkFzz@www\\.directionsfoundnt\\.com)|(Directions_Found_XmorLjjHtu@www\\.directionsfound\\.com)|(Directions_Quest_clone_qQtdSaDtmD@www\\.directionsquest\\.co)|(Directions_Quest_DuwqkuyNfU@www\\.directionsquest\\.co)|(Directions_Quest_FwNcHagZgz@www\\.directionsquest\\.co)|(Directions_Quest_XQDqehhuWR@www\\.directionsquest\\.co)|(Doc_Converter_0a0ede466240dc417f4f6d8594acd9a5@www\\.convertthepdf\\.co)|(Doc_Converter_Hub_sTIWsdHRFE@www\\.docconverterhub\\.com)|(Document_Converter_CZmoJDQssK@www\\.convertpdfnow\\.co)|(Driving_Directions_App_mUxSdxsgni@www\\.drivingdirectionsappn\\.org)|(Driving_Maps_Online_clone_jtpQCXsDzM@www\\.drivingmapsonline\\.com)|(Driving_Maps_Online_evmZdmROJS@www\\.drivingmapsonline\\.com)|(Easy_Directions_Now_a9718312f4e22a699b573a1cf508ccc9@www\\.easydirectionsnow\\.com)|(Easy_Directions_Now_TBmyGrTUZj@www\\.easydirectionsnow\\.com)|(Easy_Doc_Converter_393a2418db4856b1ec2d790e9b30ffc2@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_5a92e4df39328183b24ce0103f3dea19@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_79478769a5477116f6efd505f3b0cf15@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_a1be8989ddea6e7543bea0b843c6a2ba@www\\.easydocconverter\\.com))$/","prefs":[],"schema":1576758021535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"125bc0c5-76dc-4426-b682-1c321843d645","last_modified":1576771657110},{"guid":"/^((Everyday_Astro_YjPsaMBBWj@www\\.everydayastro\\.online)|(Everyday_File_Converter_ed35274eecd2df2822fa50636b6d9c2c@www\\.everydayfileconverter\\.com)|(Everyday_File_Converter_NldTeZANPx@everydayfileconverter\\.com)|(Everyday_Horoscope_App_zsZEtFjPki@www\\.everydayhoroscopeapp\\.com)|(Everyday_News_Tab_eebc4520552865e4fa1472681eeb5a3d@www\\.everydaynewstab\\.com)|(Everyday_News_Tab_zARNxTxEiu@www\\.everydaynewstab\\.com)|(Everyday_Radio_1f1b997a2d674af1b684dd5457ae5356@www\\.myeverydayradio\\.com)|(Everyday_Radio_mTDVrswpBm@www\\.myeverydayradio\\.com)|(Everyday_Recipe_Guide_566183664fdda4ba4e650fa5115c6cfe@www\\.recipeboardplus\\.com)|(Everyday_Recipe_Guide_tiorNZIoRi@www\\.everydayrecipeguide\\.com)|(Everyday_Weather_Forecast_2a934b9a097e1f619a7066c2530ef60f@www\\.everydayweatherforecast\\.com)|(Everyday_Weather_Forecast_sPyCkYArmT@www\\.everydayweatherforecast\\.com)|(EverydayAstro\\.net_kTOmUMbUtk@www\\.everydayastro\\.net)|(ext_11637@www\\.map-buddy\\.net)|(extensionid@www\\.dailynewsupdates\\.in\\.net)|(extensionid@www\\.moviequest\\.co)|(Fast_Mail_Tab_BfwMzfJAdm@www\\.fastmailtab\\.com)|(Fast_Mail_Tab_clone_LPzCObgNLo@www\\.fastmailtab\\.com)|(Fast_Map_Finder_ae4f5334a91035cf082f4c9e0983fc15@www\\.fastmapfinder\\.com)|(Fast_Map_Finder_YxRYGsJekN@www\\.fastmapfinder\\.com)|(Federal_Forms_clone_NgrjNsxcUN@www\\.easyformsfinder\\.com)|(Federal_Forms_EBqDdPvCFF@www\\.easyformsfinder\\.com)|(File_Convert_Plus_clone_juAtPozquc@www\\.fileconvertplus\\.com)|(File_Convert_Plus_JfRqzQtMeK@www\\.fileconvertplus\\.com)|(File_Convert_Pro_hOblzzFvJL@www\\.fileconvertpro\\.co)|(File_Converter_37ced8ee9475a347afab0d20660cef63@www\\.pdf-convertn\\.co)|(File_Converter_clone_aWSjJQAWwa@www\\.pdf-convertn\\.co)|(File_Converter_Hub_wnuDyqJFOe@www\\.fileconverterhub\\.com)|(File_Converter_Live_hWXrCtYfna@www\\.fileconverterlive\\.com)|(File_Converter_Tab_63009c33f9d202492393146d23df95d0@www\\.fileconvertertab\\.com)|(File_Converter_Tab_bEfXMQovol@info\\.fileconvertertab\\.com)|(File_Converter_Tab_bHaEkegUAR@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_8d6f907bab9ab53a83b5d8a4505433f4@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_cCZhwgyHDr@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_gNPUWukwdG@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_pweczfyyvv@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_qygWFXkHri@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_XpUyfDDJsm@info\\.fileconvertertab\\.com)|(File_Converter_Tab_dd756ad1b37f999650834591ffd21464@www\\.fileconvertertab\\.com)|(File_Converter_Tab_deb5d97364d6e9ba4d04089f90afa043@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_8fe7b393ec2d293e54abf1aada3bcb94@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_clone_DrmwsZhTkw@www\\.fileconvertertab\\.com)|(File_Converter_Tab_XHmAqSTCbP@www\\.fileconvertertab\\.com)|(File_Converter_xdbvCaJxrb@www\\.myfileconverter\\.co)|(FileConvertPro_clone_gDJuPpeLjD@www\\.fileconvertpro\\.co)|(FileConvertPro_mLscTidBER@www\\.fileconvertpro\\.co)|(Find_Coupons_Daily_dxJFJCQcpS@www\\.finddaily-coupons\\.today)|(Find_Coupons_Daily_lIKYSwDOhr@www\\.findcouponsdaily\\.co)|(Find_Coupons_Daily_RjrQWQzreq@www\\.findcoupons-daily\\.today)|(Find_Coupons_Daily_UhahUhrtxP@www\\.find-couponsdaily\\.today)|(Find_Coupons_Daily_wUpPOFfkzc@www\\.findcouponsdaily\\.today)|(Find_Coupons_OWfYsAQras@www\\.findcoupons\\.live)|(Find_Daily_Coupons_6ea44d6d01a700e213070c692343e03d@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_71b6faf57612a3de273a55a228ec1703@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_a4c3252d270bd03507cfe77d8397e8b6@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_cf887ce0c30cf483939356fd9dc4753a@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_clone_sCMBPIejep@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_dBVmCxAeYJ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_gSKACLrhGQ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_sVYmYFumfX@www\\.finddailycoupons\\.com)|(Find_Daily_Games_gZnVxpnfzi@www\\.finddailygames\\.com)|(Find_Daily_Games_JHwXAakSOO@www\\.finddailygames\\.com)|(Find_Daily_Games_osIGANaBXk@www\\.finddailygames\\.com)|(Find_Daily_Games_rcRvgxUzAu@www\\.finddailygames\\.net)|(Find_Directions_euMftZJtWV@www\\.finddirections\\.co)|(Find_Easy_Directions_2252eb9a9264ef1685d45b8fe13f6a43@www\\.findeasydirections\\.com))$/","prefs":[],"schema":1576758100930,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a69a7be4-4f76-4c00-aa17-d1bbe66fd2db","last_modified":1576771657102},{"guid":"/^((Find_Easy_Directions_541d5ace0c28764eb8e88d98d0e28740@www\\.findeasydirections\\.com)|(Find_Easy_Directions_90d67b798ba3070d90d32d74ff70d1c8@www\\.findeasydirections\\.com)|(Find_Easy_Directions_gbailzSvPb@www\\.findeasydirections\\.com)|(Find_Easy_Directions_YiGOrfTNFT@www\\.findeasydirections\\.com)|(Find_Easy_Directions_zcYSFoeMgF@www\\.findeasydirections\\.com)|(Find_Jobs_Daily_clone_ZryioBAtLo@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_FpBesVkFoN@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_TxUobqrfTu@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_ZLJpRXDhXK@www\\.findjobsdaily\\.co)|(Find_Recipes_Online_kSjCdoBAFX@www\\.findrecipesonline\\.co)|(Find_Templates_Quick_LyRzafuNXE@www\\.findtemplatesquick\\.com)|(FindJobsDaily\\.net_ilHEYezmJM@www\\.findjobsdaily\\.net)|(FlirtyWallPapers\\.online_IEZjVbwbSl@www\\.flirtywallpapers\\.online)|(Forbes_Search_aOPKgBmHyw@forbes\\.dailynewsupdates\\.online)|(Free_Directions_Finder_KEDDaoHBQl@www\\.freedirectionsfinder\\.com)|(Free_Manuals_KkQAhLuDkf@www\\.browsemanuals\\.co)|(Game_Buddy_632c7a501a256d43af845a6c03d36c65@www\\.game-buddy\\.co)|(Game_Buddy_ef910a8045b370e3df14a73fb05c0ee1@www\\.game-buddy\\.co)|(Game_Buddy_emPnaqsxzR@www\\.game-buddy\\.co)|(Game_Buddy_ISrmuaRAHN@www\\.game-buddy\\.co)|(Game_Quest_3c4a7895681b0a9d0860d5397036f146@www\\.game-quest\\.co)|(Game_Quest_bd98408b6a98a0b19825f9ff5023f0e7@www\\.game-quest\\.co)|(Game_Quest_bTqWKJtOPG@www\\.games-quest\\.co)|(Game_Quest_clone_40442f8034b58a60951b7a3cdf5fe97a@www\\.game-quest\\.co)|(Game_Quest_clone_rajfrvipoU@www\\.game-quest\\.co)|(Game_Quest_GHFSWLkdAO@game-quest\\.com)|(Game_Quest_hMqLrbOzmC@www\\.game-quest\\.co)|(Game_Quest_NDifumcXqQ@www\\.games-quest\\.org)|(Game_Quest_nilKwpfZen@www\\.game-quest\\.co)|(Game_Quest_rXONqXzsZj@www\\.games-quest\\.org)|(Game_Search_BbtNWEfPKy@www\\.daily-gamesearch\\.today)|(Game_Search_eOUjptBQzk@www\\.gamessearch\\.live)|(Game_Search_eymrhMPxLu@www\\.dailygame-search\\.today)|(Game_Search_kZDJlntNQs@www\\.gamesearch\\.link)|(Game_Search_MdsPFfXaXl@www\\.game-search\\.link)|(Game_Search_mgkCKPquHh@www\\.dailygamesearch\\.co)|(Game_Search_mvoOwLJOeY@www\\.games-search\\.link)|(Game_Search_nKMbWrakmm@www\\.dailygamesearch\\.today)|(Game_Search_PDKlEPjhDw@www\\.games-search\\.link)|(Game_Tab_BoRsmjioSA@www\\.gametab\\.co)|(Game-Quest_WhVgUeMwZI@www\\.game-quest\\.co)|(GameQuest\\.website_IwplUMSUhd@www\\.gamequest\\.website)|(GameQuest\\.website_ZGhTUTKRhi@www\\.gamequest\\.website)|(Games_Daily_clone_UAnrFPWGxF@www\\.games-daily\\.net)|(Games_Daily_EVSeZYmPYK@www\\.games-daily\\.today)|(Games_Daily_nRQyywoJPm@www\\.games-daily\\.net)|(Games_Daily_SPRlOvPjlj_clone@www\\.games-daily\\.co)|(Games_Daily_SPRlOvPjlj@www\\.games-daily\\.co)|(Games_Daily_WnvPyaqCdX@www\\.games-daily\\.today)|(Games_Finder_Online_98e08661ac2ba2826d702b9de87c3fbc@www\\.gamesfinderonline\\.com)|(Games_Finder_Online_YCDTopLIiv@www\\.gamesfinderonline\\.com)|(Games_Quest_antJJCJcBk@www\\.games-quest\\.website)|(Games_Quest_clone_aTlPJPmJEm@www\\.games-quest\\.today)|(Games_Quest_OxdmpwtACa@www\\.games-quest\\.today)|(Games_Quest_qmlUmTihvS@www\\.gamesquest\\.today)|(Games_Quest_vnzuqLPUQQ@www\\.gamesquest\\.today)|(Games_Quest_WEpNvcmerl@www\\.games-quest\\.today)|(Games_Quest_wKWBKbLjpl@www\\.games-quest\\.today)|(Games_Quest_Zafeeizthl@www\\.games-quest\\.today)|(Games_Quest_ZVRwioHOnh@www\\.games-quest\\.online)|(Games_Search_FPDqSSnSlY@www\\.game-search\\.today)|(Games_Search_HAfeXALvGY@www\\.gamesquest\\.online)|(Games_Search_LSrSMudgNL@www\\.gamessearch\\.co)|(Games_Search_mDdAwBVasx@www\\.gamesearch\\.today)|(Games_Search_RgMSPqlluj@www\\.gamessearch\\.xyz)|(Games_Search_sfZySehUmo@www\\.gamessearch\\.online)|(Games_Search_shZkWBHwut@www\\.gamessearch\\.online)|(Games_Search_USoWCKOlGq@www\\.finddailygames\\.com)|(Games_Search_uXqDhnPDBw@www\\.gamesearch\\.today)|(Games_Search_vCVYFXcOnV@www\\.gamessearch\\.org)|(Games-Daily\\.net_NainTzjpve@www\\.games-daily\\.net)|(Get_Coupons_awAkTqqCxd@www\\.getcoupons\\.live)|(Get_Coupons_RGWEhnHIbr@www\\.getcoupons\\.live)|(Get_Directions_07d014a7ed5bba404eb7f2b1058ad2cb@www\\.getdirectionsmapsn\\.com)|(Get_Directions_CBakCNUUbo@www\\.map-finder\\.link)|(Get_Directions_clone_kxIvsTsDgE@www\\.getdirectionsmapsn\\.com)|(Get_Directions_HlEHEMFRkj@www\\.getdirectionsmapsn\\.com))$/","prefs":[],"schema":1576758133784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f6c1160a-fa98-4541-bb03-cd6d02b825e3","last_modified":1576771657097},{"guid":"/^((Get_Directions_Quick_89a733fca5e8b5436c95fcec40ca5573@www\\.getdirectionsquickn\\.online)|(Get_Easy_Directions_b3f03018f3d77ab1327550851c2a2f94@www\\.geteasydirections\\.com)|(Get_Easy_Directions_FeEnVDLKMP@www\\.geteasydirections\\.com)|(Get_Easy_Maps_a92ae443f4d44fdbcf507f73934c5bff@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_RsVkJokaAq@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_TgEXtwRoQx@www\\.geteasymaps\\.co)|(Get_Easy_Maps_e66ef79b1701806812d764c8b2e87673@www\\.geteasymaps\\.co)|(Get_Easy_Maps_eUfwfdzBJN@www\\.geteasymaps\\.co)|(Get_Easy_Maps_f9341eebd729ecc7e5389769a7ac8c27@www\\.geteasymaps\\.com)|(Get_Easy_Maps_NoApMGqlhQ@www\\.geteasymaps\\.com)|(Get_Easy_Maps_PiUUlEtxCz@www\\.geteasymaps\\.co)|(Get_Easy_Maps_uopDIWsrOB@www\\.geteasymaps\\.co)|(Get_Easy_Maps_VZVoDVzTZP@www\\.geteasymaps\\.co)|(Get_Easy_Search_5a1bd32b3bb3d079d253b6fe048c6d4e@www\\.geteasysearch\\.com)|(Get_Easy_Search_b1272ab7a446984d2e1ddbf0b94016d0@www\\.geteasysearch\\.com)|(Get_Easy_Search_zjvfbWwXrA@www\\.geteasysearch\\.com)|(Get_Forms_Today_HmKpwNqqgw@www\\.getformstoday\\.com)|(Get_Local_Forecast_KSKPskMcZy@www\\.getlocalforecastn\\.com)|(Get_Map_Finder_clone_AVJpxOfDmZ@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_BGAfKOwTad@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_hwWbfqrHDh@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_YUnreTXyJo@www\\.getmapfinder\\.link)|(Get_Map_Finder_RDbuumWRlP@www\\.getmapfinder\\.link)|(Get_Map_Finder_vJqBDvfVEi@www\\.getmapfinder\\.link)|(Get_Map_Finder_zORQiNFbOh@www\\.getmapfinder\\.co)|(Get_Online_Converter_AbNmflhxCb@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_255e60767a18e291b0b8b3cabd6f382c@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_oCShEwyADp@www\\.getonlineconverter\\.com)|(Get_Online_Maps_clone_hGHOrvKQpE@www\\.getonlinemapsnow\\.com)|(Get_Package_Tracker_5a92260cd5155c5f26b16207532e9c5e@www\\.getpackagetracker\\.com)|(Get_Package_Tracker_clone_CztbvYsSLz@www\\.getpackagetracker\\.com)|(Get_Speed_Checker_CdqYfmDnVO@www\\.getspeedchecker\\.com)|(Get_Speed_Test_Ace_efd65663a0f689684ed5b60337c519ac@www\\.getspeedtestace\\.com)|(Get_Speed_Test_Ace_uNUzxBsIBO@www\\.getspeedtestace\\.com)|(GetOnlineConverter_62dc3ed61ba55b471bc5952d64f22e34@www\\.getonlineconverter\\.com)|(GetOnlineConverter_clone_hmwBWihZaf@www\\.getonlineconverter\\.com)|(Global_Weather_2abbd1bfe1f92474dc556a6abd23c97e@www\\.global-weathern\\.online)|(Global_Weather_qPjJvKHHjn@www\\.global-weathern\\.online)|(Go_Package_Tracker_CDyUCsNhYI@www\\.gopackagetracker\\.com)|(Go_Search_Easy_3b073071b9f9727f2a3c22961bc6aae7@www\\.gosearcheasy\\.com)|(Go_Search_Easy_fCSPxmpWqN@www\\.gosearcheasy\\.com)|(Go_Search_Easy_MTOfbhqqMt@www\\.gosearcheasy\\.com)|(Go_Video_Converter_clone_AtpxxXDpvq@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_b78d64ef3f6d32d836cb9cb45f64f3d4@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_ENqGVUhAYo@www\\.govideoconverter\\.com)|(Go_Video_Converter_cXhEAmNOBA@www\\.govideoconverter\\.com)|(Go_Video_Converter_daef20a38c38415e2819357035444fa2@www\\.govideoconverter\\.com)|(Go_Video_Converter_YLdugTFiBs@www\\.govideoconverter\\.com)|(holidaygiftingco@www\\.holidaygifting\\.co)|(Holy_Bible_daily_22c0372905eb878bf90eb726cf1c4cd7@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_36d9839f134dba7393dcd1ce19e35114@www\\.holybibledaily\\.com)|(Holy_Bible_daily_clone_BwGilqVxow@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_clone_TdHKbGqxyp@www\\.holybibledaily\\.com)|(Holy_Bible_daily_WRzbIpWLfR@www\\.holybibledaily\\.com)|(Horoscope_Finder_CQAkIhPhib@www\\.horoscopefinder\\.co)|(Hunt_New_Jobs_MQlcPgVQSY@www\\.huntnewjobs\\.com)|(Hunt_New_Jobs_TeypdaDdsy@www\\.huntnewjobs\\.com)|(Inbox_Tab_1549897502@www\\.inboxtab\\.com)|(Inbox_Tab_LTnzVZlfKv@www\\.inboxtab\\.com)|(Inbox_Tab_rOksOtIddG@www\\.inboxtab\\.com)|(Instant_Doc_Converter_1264fb8b31af7c6c3f56c4c33b825dab@www\\.instantdocconverter\\.com\\.removed)|(Instant_Doc_Converter_clone_LWgHiMFzyN@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_clone_OeEmGVRjdr@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_fe41778b25f65137ed606033eea89902@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_hMMLIeTKQH@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_UJTpBaxVPV@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_vZPKbExySk@www\\.instantdocconverter\\.com))$/","prefs":[],"schema":1576758169317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9acbbf4c-ef5c-46d4-bc1d-f520b8ced595","last_modified":1576771657093},{"guid":"/^((Instant_Email_Login_3fff03c5bbd668d2f7093d5491f66518@www\\.instantemaillogin\\.com)|(Instant_Email_Login_WRGGywlQTy@www\\.instantemaillogin\\.com)|(Instant_Email_Plus_KAZiCvZFWB@www\\.instantemailplus\\.com)|(Instant_Inbox_clone_QKZmbMSVkA@www\\.instantinbox\\.co)|(Instant_Inbox_clone_QmVdpyuWwT@www\\.instantinbox\\.co)|(Instant_Inbox_clone_VlVOmivYUN@www\\.instantinbox\\.co)|(Instant_Inbox_clone_XLjUGcrTgI@www\\.instantinbox\\.co)|(Instant_Inbox_clone_YxmUgAsOrZ@www\\.instantinbox\\.co)|(Instant_Inbox_pzclglfDGq@www\\.instantinbox\\.co)|(Instant_Inbox_qnRYsobGem@www\\.instantinbox\\.co)|(Instant_Maps_clone_clone_zqdkjyMgdQ@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD_test@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD@www\\.checkmaps\\.co)|(Instant_Net_Speed_7291e707ced30428e6ed71611c3071ed@www\\.instantnetspeed\\.com)|(Instant_Net_Speed_iEjKvJreAi@www\\.instantnetspeed\\.com)|(Internet_Speed_Test_cf6c9b84dd607bc049898130dd8aa403@www\\.fastinternetspeedtestn\\.com)|(Internet_Speed_Test_RCgVciwcSD@www\\.fastinternetspeedtestn\\.com)|(Job_Search_Online_53e3be5488ce961c12d4341c2e3c830d@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_20bb80efe94b528ef6fa06730d560cbb@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_fUDgRmLxrl@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_jxgyVIROvt@www\\.jobssearchonline\\.co)|(Job_Search_Online_qNOPIVBSge@www\\.jobssearchonline\\.co)|(Job-Portal_dPNxZEZiQF@www\\.job-portal\\.co)|(Jobs_Now_jkAqvfwqNy@jobsnow\\.com)|(Just_Search_Easy_PJxNIOGbZS@www\\.justsearcheasy\\.com)|(justlovepetsonline@www\\.justlovepets\\.online)|(KC_Recipe_Finder_f8541026d8d56f16ba1db6664ac76ed8@www\\.testextension\\.online)|(LifeLock_Safe_Search_LDKQZxofGQ@searchsafe\\.lifelock\\.com)|(Live_Email_4cacc77ba79f2e88d808404b1487e27d@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH_ach@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH@www\\.liveemail\\.co)|(Live_Inbox_clone_HSqMlnurhx@www\\.liveinbox\\.co)|(Live_Inbox_ITUElbGJyq@www\\.liveinbox\\.co)|(Live_News_90155c3a670c030b75d27b2b060bab76@www\\.get-news\\.co)|(Live_News_ab96451cfc686d1903b9bd5bbefc58df@www\\.get-news\\.co)|(Live_News_Daily_coRwlwVUtL@www\\.livenewsdaily\\.net)|(Live_News_RoTkoRyzKW@www\\.get-news\\.co)|(Live_News_sQHxsfPWHn@www\\.get-news\\.co)|(Live_News_UPeYgtCNWH@www\\.get-news\\.co)|(liveemail@www\\.liveemail\\.co)|(LiveNewsDaily\\.co_Qrkavccepk@www\\.livenewsdaily\\.co)|(Local_Weather_Now_clone_CGdqWGvDuk@www\\.localweathernow\\.co)|(Local_Weather_Now_clone_PsfbncWCpz@www\\.localweathernow\\.co)|(Local_Weather_Today_af62b67de6656cd77ec1232ce28b0847@www\\.localweathertoday\\.co)|(Local_Weather_Today_b6bdb9471dfdbbe166ebba101bf87987@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_25d0f678c3de41078bfebfedb36f3e5e@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_ozBsMkxlfM@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_QFZOuAbpBy@www\\.localweathertoday\\.co)|(Local_Weather_Today_MoAsKEYZyC@www\\.localweathertoday\\.co)|(localweathertodayco@www\\.localweathertoday\\.co)|(localweathertodaynet@www\\.localweathertoday\\.net)|(Locate_Packages_JIjwUKeces@www\\.locatepackages\\.com)|(loginpro_bTqvLMpNXn@www\\.easy-maillogin\\.link)|(loginpro@www\\.loginemailpro\\.com)|(manifestdata_Check_clone_AraOARfaeL@hjm)|(manifestdata_Check_HFkEdcMQtX@hjm)|(manifestname@www\\.wallpaperonlinepro\\.com)|(Map_Buddy_svMNjHoVFQ@www\\.map-buddy\\.net)|(Map_Directions_Pro_hFzkEkDBXw@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_JAlSTUeoZW@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_vnuUbjddlF@www\\.mapdirectionspro\\.co)|(Map_Finder_GaEdNdyQoi@www\\.mapfinder\\.live)|(Map_Finder_Online_clone_HAzjiKHVFr@www\\.mapfinderonline\\.com)|(Map_Finder_Online_clone_vxRStAVXsj@www\\.mapfinderonline\\.com)|(Map_Finder_Online_DWFqZBeElh@www\\.mapfinderonline\\.com)|(Map_Finder_RIBbQLtJhY@www\\.map-finder\\.link)|(Map_Finder_ubFbNkPLbu@www\\.map-finder\\.co)|(Map_My_Journey_clone_dbZghybkTf@www\\.mapmyjourney\\.co)|(Map_My_Journey_gWimMkbjcf@www\\.mapmyjourney\\.co)|(Map_My_Journey_hwaFtGeeRF@www\\.mapmyjourney\\.co)|(Map_My_Journey_lOKajIjWRX@www\\.mapmyjourney\\.co)|(Map_My_Travel_3d7340d4339df15d23c823030d0b3dd4@www\\.mapmytravel1\\.co)|(Map_My_Travel_4c1060a52cb966087a862f50c66cff76@www\\.mapmytravel1\\.co)|(Map_My_Travel_66a1df798c97eecbcbc5ce97f5bb58ce@www\\.mapmytravel\\.co))$/","prefs":[],"schema":1576758213475,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f0cac174-d15f-427f-b310-9409e69a2ca6","last_modified":1576771657088},{"guid":"/^((Map_My_Travel_77440f39b0fc3ac74a9e894ff2e26617@www\\.mapmytravel\\.co)|(Map_My_Travel_ac398c1a8442efc53c141095c6e386f1@www\\.mapmytravel1\\.co)|(Map_My_Travel_b47128735efb1ae5232811bf674a5598@www\\.mapmytravel1\\.co)|(Map_My_Travel_c520fe83319115df915325944097f2d7@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_906668a067200f92f67c8a1d4934ca53@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_agEGcivVyr@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_AojrINyqec@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_CaXjHVvzvR@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_CmwkGssriz@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_KUUHhqDlkF@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_xjdUmTvEZE@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_ZJilbRDhlx@www\\.mapmytravel1\\.co)|(Map_My_Travel_ea415ecadf91d96c596c61d748dfab3a@www\\.mapmytravel\\.co)|(Map_My_Travel_FGYxkNvlYu@www\\.mapmytravel1\\.com)|(Map_My_Travel_GnhWycuRWw@www\\.mapmytravel\\.co)|(Map_My_Travel_KoRBtjTOaQ@www\\.mapmytravel\\.co)|(Map_My_Travel_V2_1136cc214788f6e2c4fbd748c875f289@www\\.mapmytravel1\\.co)|(Map_Your_Way_dba6e11787a9a4c0ff802d30e2d84655@www\\.mapyourway\\.online)|(Map_Your_Way_RRrntXMhmV@www\\.mapyourway\\.online)|(Map-Buddy\\.net_YDYeEFqMMB@www\\.map-buddy\\.net)|(MapAssistant\\.net_IxpgMrxoal@www\\.mapassistant\\.net)|(Maps_Finder_clone_lXfNOQsASa@www\\.getmapfinder\\.com)|(Maps_Finder_clone_OHRJTSZWsp@www\\.getmapfinder\\.com)|(Maps_Finder_clone_qjbEfuxypy@www\\.getmapfinder\\.com)|(Maps_Finder_clone_sVixvNGfvq@www\\.getmapfinder\\.com)|(Maps_Finder_clone_XiwisRQHED@www\\.mapsfinder\\.co)|(Maps_Finder_cxamiyXEhG@www\\.maps-finder\\.co)|(Maps_Finder_ikDztWsXOS@www\\.mapsfinder\\.co)|(Maps_Finder_ISFXVmdcMZ@www\\.getmapfinder\\.com)|(Maps_Finder_NEJbQoRTxu@www\\.mymapfinder\\.co)|(Maps_Finder_OAXSzUFBAz@www\\.getmapfinder\\.com)|(Maps_Finder_Online_cb9ff9fa82db81028ec8b5a9c738c3d0@www\\.mymapsfinderonline\\.com)|(Maps_Finder_Online_fa0d46585631975dfefb9653fbdc5ae5@www\\.mapsfinderonline\\.com)|(Maps_Finder_Online_VBUnFyZArH@www\\.mapsfinderonline\\.com)|(Maps_Finder_OyeiUXSYyC@www\\.mymap-buddy\\.com)|(Maps_Finder_yiomudinei@www\\.mapsfinder\\.co)|(Maps_Now_1a47fbf8546a43d949f229efca9a2f34@www\\.mapsnow\\.co)|(Maps_Now_23f9f3cd0b483c22be85bb2568a2df4f@www\\.mapsnow\\.co)|(Maps_Now_85bb8ec9ca1c2baab2dc307af81964c2@www\\.mapsnow\\.co)|(Maps_Now_cbd62915225f7f059c5d15daa3a59cad@www\\.mapsnow\\.co)|(Maps_Now_clone_daDccVKFiR@www\\.mapsnow\\.co)|(Maps_Now_clone_eaIVjwJWMX@www\\.mapsnow\\.co)|(Maps_Now_clone_HmcRPOcjzE@www\\.mapsnow\\.co)|(Maps_Now_clone_QnqJIECgrq@www\\.mapsnow\\.co)|(Maps_Now_clone_VNlrSBkTlM@www\\.mapsnow\\.co)|(Maps_Now_clone_yDfyuWvMMp@www\\.mapsnow\\.co)|(Maps_Now_clone_YDpyMtVaLW@www\\.mapsnow\\.co)|(Maps_Now_clone_ZyNlPAcxdc@www\\.mapsnow\\.co)|(Maps_Now_tmnjrLnmFO@www\\.mapsnow\\.co)|(Maps_Now_uwqucqWEGq@www\\.mapsnow\\.co)|(Maps_Now_XSqhhyPFiH@www\\.mapsnow\\.co)|(Maps_Today_UoKEAlMYFh@www\\.mapmyjourneynt\\.co)|(mapsfinder@www\\.mapsfinder\\.co)|(Metric_Converter_Pro_437e424a1d8a287713fd991b4babb241@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_48e7e1cd7ea7a150ce498c7f4c1a8525@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_c1043f9d35c4300be27a136d2956b8bd@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_b151705ba46c35bf8530f6fcccad39ff@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_HoBPpUTrbw@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_KaiswSnKUV@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_SzGHQnHNkN@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_WchvzpVULZ@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_rEvcfmsuJW@www\\.metricconverterpro\\.com)|(Movie_Delight_LVlUUJCTfd@www\\.movie-delight\\.com)|(Movie_Delight_xWRWlvWNGj@www\\.movie-delight\\.com)|(Movie_Hunt_GzAuVRhAph@www\\.moviequest\\.online)|(Movie_Hunt_ioLSsIUbVX@www\\.themoviesearch\\.org)|(Movie_Hunt_jbuqRPUUVt@www\\.moviehunt\\.today)|(Movie_Hunt_jHPrIKUDZi@www\\.moviehunt\\.today)|(Movie_Hunt_Online_jJicoNDurf@www\\.moviehunt\\.online)|(Movie_Maniac_2462069208dfe0b3d754ec0d11bf7b40@www\\.themoviemaniac\\.co)|(Movie_Maniac_a84cd1cd277e4886cbd535cafddb9248@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_4b2e8fc1efa469664fbfe3b1cfd600ce@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_bbe030355b07de5cd10dee52a60db3e3@www\\.themoviemaniac\\.co))$/","prefs":[],"schema":1576758242842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b009e1d2-ed9c-42b3-b795-b63d15b15deb","last_modified":1576771657084},{"guid":"/^((Movie_Maniac_clone_FhKByuyzfD@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_OzkDkQoxcV@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_pNBsVugeLv@www\\.themoviemaniac\\.co)|(Movie_Maniac_qNRzbWPyVh@www\\.themoviemaniac\\.co)|(Movie_Quest_DgloGEcqoQ@www\\.movie-quest\\.online)|(Movie_Quest_DHlTecEnbH@www\\.moviequest\\.online)|(Movie_Quest_lSUIfjeATU@www\\.movie-quest\\.org)|(Movie_Quest_ogkgHKpiCu@www\\.movie-quest\\.org)|(Movie_Quest_oIbDMPkLHN@www\\.the-moviequest\\.today)|(Movie_Quest_OYXdMYNGlQ@www\\.moviequest\\.online)|(Movie_Quest_WwjFqvwace@www\\.moviequest\\.online)|(Movie_Search_4634ea60272d58007cb594bddf4c2d14@www\\.moviesearchtoday\\.com)|(Movie_Search_5adb28a06e6a557580f892b00df54fe9@www\\.moviesearchtoday\\.com)|(Movie_Search_5e2468caef8b002ec4af47d33347d946@www\\.moviesearchtoday\\.com)|(Movie_Search_6a2835fbcfa21f071a72cf4b1d768ee1@www\\.moviesearchtoday\\.com)|(Movie_Search_82956306d33016e1612f6b93238abb8c@www\\.movie-searchtoday\\.com)|(Movie_Search_amo_hosting_clone_cdvWgyZchs@staging\\.themovie-portal\\.com)|(Movie_Search_clone_BPUjteCIKH@www\\.moviesearchtoday\\.com)|(Movie_Search_clone_hOjSGlUSJc@www\\.themovie-portal\\.com)|(Movie_Search_clone_tUhUWKFWEy@staging\\.themovie-portal\\.com)|(Movie_Search_clone_yNPQCvYjiE@www\\.search-movie\\.today)|(Movie_Search_fce3642a62f1d43d671b9cc1edae2248@www\\.moviesearchtoday\\.com)|(Movie_Search_GnuaPoCHyn@www\\.moviesearchtoday\\.com)|(Movie_Search_HQkuRtYSBi@www\\.movie-search\\.today)|(Movie_Search_JsPzrSgfUw@www\\.moviesearchtoday\\.com)|(Movie_Search_ldxwfXRmwB@www\\.movie-search\\.live)|(Movie_Search_LyOzXmENOz@www\\.movie-search\\.today)|(Movie_Search_OoYYDEappx@www\\.moviesearch\\.today)|(Movie_Search_qQXnYBWtZL@www\\.movie-searchtoday\\.com)|(Movie_Search_qSoQoWSxLl@www\\.movie-hunt\\.co)|(Movie_Search_ryfmFVsOyx@www\\.movie-search\\.today)|(Movie_Search_usVRdBSJFC@www\\.moviesearchtoday\\.com)|(Movie_Search_VbiTYRjDIi@www\\.themoviesearch\\.co)|(Movie_Search_wEfUXCokzy@www\\.moviesearch\\.today)|(Movie_Search_wGdgcYcPQb@www\\.moviesearchtoday\\.com)|(Movie-Hub\\.info_OmWUKRcKuS@www\\.movie-hub\\.info)|(Movie-Quest_KJpvmWXXVL@www\\.movie-quest\\.co)|(Movie-Quest\\.info_eUjlCfSYnv@www\\.movie-quest\\.info)|(Movie-Quest\\.info_kdhRhuajuC@www\\.movie-quest\\.info)|(movie-quest\\.today_ftrItBjuLQ@www\\.movie-quest\\.today)|(MovieQuest_jyRMkNmSGC@www\\.moviequest\\.co)|(moviequest\\.today_JlDnGylmbG@www\\.moviequest\\.today)|(moviequest@www\\.moviequest\\.co)|(MusicQuest_IuWBQBhiuw@www\\.music-quest\\.co)|(mvquest@www\\.moviequest\\.co)|(My_Astro_Tab_8e89559e65a469daf6766bb75d4376ab@www\\.myastrotab\\.com)|(My_Astro_Tab_KaAEnbwPUx@www\\.myastrotab\\.com)|(My_Coupon_Store_ylKTlAUXbo@www\\.mycouponstore\\.co)|(My_Daily_Astrology_MqfKduyqcg@www\\.my-dailyastrology\\.net)|(My_Daily_Utilities_4ebdffa571404d80516d8d0f530af9a6@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_4d4f3e4318db94478d9302c598ef468c@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_TQYRFwiprp@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_wsrcjEDqNR@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_iwpgTQIUFx@www\\.mydailyutilities\\.co)|(My_Directions_Finder_c406a6ac6a2b0638fcb489f1b776b903@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_alDWaOiCNo@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_iIYkMlrcwN@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_mBlfabAHtF@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_oIFvReYNwJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_TUeunTaGWJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_ejopyTsDPc@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_RIUfITHqsm@www\\.mydirectionsfinder\\.com)|(My_Doc_Converter_a70620b85cb93c122c397d5a0d6d6c17@www\\.mydocconverter\\.net)|(My_Doc_Converter_hTuhuUWAbu@www\\.mydocconverter\\.net)|(My_File_Converter_InJpDFniec@www\\.myfileconverter\\.net)|(My_File_Converter_MOLroWzmvk@www\\.myfileconverter\\.net)|(My_File_Converter_uJJIGUseRO@www\\.myfileconverter\\.org)|(My_Mail_Center_clone_AOBAQIlpph@www\\.mymailcenter\\.co)|(My_Mail_Center_clone_JJSlJDujLf@www\\.mymailcenter\\.co)|(My_Mail_Center_StbPlXiGzU@www\\.mymailcenter\\.co)|(My_Map_Buddy_AHxkFzHUSq@www\\.mymap-buddy\\.com)|(My_Map_Buddy_aJhRltItzB@www\\.mymap-buddy\\.co)|(My_Map_Buddy_dzzNGYdgEy@www\\.mymapbuddy\\.link)|(My_Map_Buddy_lCpBZhZcug@www\\.mymap-buddy\\.co))$/","prefs":[],"schema":1576758270991,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c264de14-d096-45d7-afd6-4e03f3f0874e","last_modified":1576771657080},{"guid":"/^((My_Map_Buddy_LlytpwAxzJ@www\\.my-mapbuddy\\.link)|(My_Map_Buddy_omjWWfWnZV@www\\.checkmaps\\.live)|(My_Map_Buddy_QniENdnZwH@www\\.mymapbuddy\\.co)|(My_Map_Buddy_qwjuFaLDiS@www\\.my-mapbuddy\\.link)|(My_Map_Finder_216cea355b90081b2fa2b35228afa8cd@www\\.mymapfinder\\.net)|(My_Map_Finder_FQhLxNAhOb@www\\.mymapfinder\\.net)|(My_Map_Finder_HIAdZUsdqP@www\\.easymapsfinder\\.com)|(My_Map_Key_bfebaaffd5e89eb58d8eede5550b7657@www\\.mymapkey\\.com)|(My_Map_Key_PNKwkyDcSv@www\\.mymapkey\\.com)|(My_Map_Quest_amtyvbVOvw@www\\.mymapquest\\.co)|(My_Map_Tab_e4256b0cd83dd5dc7ffd2d6fa89bb3ca@www\\.mymaptab\\.co)|(My_Map_Tab_fQPfsnZVRi@www\\.mymaptab\\.co)|(My_Maps_Daily_2216a0fb9fa410e585f75583c84bb1fc@www\\.mymapsdaily\\.com)|(My_Maps_Daily_HTtwoSgSmO@www\\.mymapsdaily\\.com)|(My_Maps_Finder_mlqpWnYOjs@www\\.mymapsfinderonline\\.com)|(My_Maps_Now_wouVnzxahG@www\\.mymapsnow\\.co)|(My_Metric_Converter_AZzUIIKwJY@www\\.mymetricconverter\\.com)|(My_Net_Speed_clone_LEPCOrGXJt@www\\.my-netspeed\\.co)|(My_Net_Speed_dIUrWuilrC@www\\.my-netspeed\\.co)|(My_Net_Speed_hQVahLtcSK@www\\.mynet-speed\\.com)|(My_Net_Speed_keJWBLUIYD@www\\.mynet-speed\\.com)|(My_Net_Speed_XhDnHJmvAF_1@www\\.mynetspeed\\.co)|(My_Net_Speed_XhDnHJmvAF@www\\.mynetspeed\\.co)|(My_Net_Speed_YGdxRAMaly@www\\.mynetspeed\\.link)|(My_Quick_Directions_384f670ee31df7278a1df86a202697c2@www\\.myquickdirections\\.com)|(My_Quick_Directions_IoipCjCqHK@www\\.myquickdirections\\.com)|(My_Quick_Search_HHmoLNFNZK@www\\.myquicksearch\\.co)|(My_Radio_Plus_clone_xijbeLEKut@www\\.myradioplus\\.co)|(My_Radio_Plus_clone_yLODfWIUzo@www\\.myradioplus\\.co)|(My_Radio_Plus_huJGcbKJdz@www\\.myradioplus\\.co)|(My_Recipe_Digest_806bc9c3d627874ac6f6c953e1174d41@www\\.myrecipedigest\\.com)|(My_Recipe_Digest_TQhDINXjet@www\\.myrecipedigest\\.com)|(My_Recipe_Guide_4bc8a248146602106b25349ec50b7395@www\\.myrecipeguideonline\\.com)|(My_Recipe_Guide_ZlrLqLHAKb@myrecipeguideonline\\.com)|(My_Route_Planner_6bb055b2be5912b90cec3a2788636830@www\\.myrouteplanner\\.co)|(My_Route_Planner_ccdd62d844c1769d5bf4db308b3bc9c9@www\\.myrouteplanner\\.co)|(My_Route_Planner_clone_AFCMlCneMs@www\\.myrouteplanner\\.co)|(My_Search_Plus_91de35f6bc26e7f423a701dc4a7d9e6b@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_7d6359f4c55d1f5c5a9af0304e7dcf34@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_ejVWzjJsWF@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@_123456www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_zHyeSWPlyQ@www\\.mysearchplus\\.co)|(My_Search_Plus_zasNrdaCMb@www\\.mysearchplus\\.co)|(My_Search_Wizard_7f2979e35d2bd7dd61433bbca4e930bf@www\\.mysearchwizard\\.co)|(My_Search_Wizard_887bc211e6c12bcd4c59204553e75ed5@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_CuEYdreCCG@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_MfzUjTpTSj@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_PhkuhYznxq@www\\.mysearchwizard\\.co)|(My_Smart_Search\\.co_uUlxGOYDUP@www\\.mysmartsearch\\.co)|(My_Smart-Search\\.co_moHloXmlvd@www\\.mysmart-search\\.co)|(My_Smart-Search\\.co_nVQpezjwFN@www\\.mysmart-search\\.co)|(My_Weather_Services_MTCOGCZgEo@myweatherservicesn\\.org)|(My_Weather_Tab_cdb3a5fdbcc268762efb7f1b9088a935@www\\.myweathertab\\.co)|(My_Word_Scribe_6ac6fa9173610517a627c5298a38891a@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_RZEMcCVoIU@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_TAZVHOvofp@www\\.mywordscribe\\.com)|(My_Word_Scribe_GlqExrIfvA@www\\.mywordscribe\\.com)|(My_Word_Scribe_wRguUlbptJ@www\\.mywordscribe\\.com)|(MyAstroFinder_clone_meuCieSJGq@www\\.myastrofinder\\.co)|(MyAstroFinder_QqSSwnxQpy@www\\.myastrofinder\\.co)|(MyCareer-Search\\.co_IcpqItVxAi@www\\.mycareer-search\\.co)|(MyCoupon-Finder\\.co_DatSgecXGq@www\\.mycoupon-finder\\.co)|(MyCouponFinder\\.co_ZMMzlIEann@www\\.mycouponfinder\\.co)|(mydailyastrologyco@www\\.mydailyastrology\\.co)|(mydailyastrologyonline@www\\.mydailyastrology\\.online)|(mydailynewsonline@www\\.mydailynews\\.online)|(MyMapBuddy\\.net_oVKQZzxNzk@www\\.mymapbuddy\\.net)|(MyMusicSearch\\.co_zsqyyUdIfE@www\\.mymusicsearch\\.co)|(mynetspeedco@www\\.mynetspeed\\.co)|(MySearchTab\\.co_QXqKBErWIz@www\\.mysearchtab\\.co)|(Net_Speed_bfa1870197a5380d1f00708341444fe4@www\\.testnetspeed\\.co)|(Net_Speed_f61989f67aeb3c5ed6180f49b2160ea1@www\\.net-speed\\.co)|(Net_Speed_imtTaleZMk@www\\.net-speed\\.co))$/","prefs":[],"schema":1576758309063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3e1bff4-2e6a-4a7f-a1e3-f7eff451655b","last_modified":1576771657076},{"guid":"/^((Net_Speed_Ninja_rJSmpzPQRq@www\\.netspeedninja\\.co)|(Net_Speed_nYAhXCpaOF@www\\.testnetspeed\\.co)|(Net_Speed_Plus_MnPDDtnfZh@www\\.checkmyspeednownt\\.com)|(Net_Speed_Test_b419d25436f7b7cb3458407498bae21f@www\\.netspeedtesthub\\.com)|(Net_Speed_Test_Hub_OOlSMbcwOe@netspeedtesthub\\.com)|(Net_Speedtest_8e202a4f66675f188c265a8ef11e47fa@www\\.netspeedtest\\.co)|(Net_Speedtest_clone_ikAadlLvLs@www\\.netspeedtest\\.co)|(Net_Speedtest_ysCFtRLxZn@www\\.netspeedtest\\.co)|(NetSpeedCalculator\\.net_mzMnaouenc@www\\.netspeedcalculator\\.net)|(netspeedproco@www\\.netspeedpro\\.co)|(New_Jobs_Quest_8f6247b00ffc5b1bb2f3f30fc73a9de5@www\\.newjobsquest\\.co)|(News__Precinct_75018cea70cf57e0ab66d312ef3a769d@www\\.newsprecinct\\.com)|(News__Precinct_sggnBoSvRu@www\\.newsprecinct\\.com)|(News_Daily_UBtJmysrDA@www\\.newstrackrnt\\.co)|(News_Headlines_bKwUmAeFcG@www\\.newsheadlinespro\\.com)|(News_Headlines_f70874554c3c22b5fec6f98e845d9b4d@www\\.newsheadlinespro\\.com)|(News_Headlines_SfZxlPzEgN@www\\.newsheadlinespro\\.com)|(News_Precinct_05544a082b3c01a286c66f7cf4251700@www\\.newsprecinct\\.com)|(News_Precinct_clone_5cd166a363627a7f453b1b69769f436d@www\\.newsprecinct\\.com)|(News_Precinct_clone_NeRHwQGodq@www\\.newsprecinct\\.com)|(News_Precinct_clone_PTdBCNrWPD@www\\.newsprecinct\\.com)|(News_Precinct_dLqSikAjQC@www\\.newsprecinct\\.com)|(News_Precinct_gzVnHZnzOy@www\\.newsprecinct\\.com)|(NewStackr_uNFYKFwAWP@www\\.NewsTackR\\.com)|(NewsTrackr_clone_qKtwLAHfjm@www\\.newstrackr\\.co)|(NewsTrackr_clone_vJczLpOPSO@www\\.newstrackr\\.co)|(NewsTrackr_e1032761f4eb1beb126fdface070fb37@www\\.newstrackr\\.co)|(NewsTrackr_iDEHLRYWqj@www\\.newstrackr\\.co)|(NewsTrackr_ZtEQVEonqX@www\\.newstrackr\\.co)|(newsupdatesinnet@www\\.newsupdates\\.in\\.net)|(no_EzdEKVkeZk@www\\.test10\\.com)|(Online_Coupon_Finder_njhVhBdgcg@onlinecoupon-finder\\.co)|(Online_Coupon_Finder_QuNkIQQUVz@www\\.onlinecouponfinder\\.net)|(Online_Coupon_Finder_SZuYIubYMN@www\\.onlinecouponfinder\\.net)|(Online_Doc_Converter_7d7d0b74adad02f39590d705822a70e2@www\\.onlinedocconverter\\.com)|(Online_Doc_Converter_qpIkrHZegO@www\\.onlinedocconverter\\.com)|(Online_Document_Converter_clone_xZguXlOjJE@www\\.convertmypdf\\.co)|(Online_Package_Tracker_TNAcobvKgm@onlinepackagetracker\\.co)|(Online_PDF_Converter_aJsvvVEBaO@www\\.myonlinepdfconverter\\.net)|(Online_PDF_Converter_kxVNqagGZG@myonlinepdfconverter\\.com)|(Online_Recipe_RURMecAQzt@www\\.onlinerecipe\\.co)|(Online_Recipe_VNtLUGYjpI@www\\.onlinerecipe\\.co)|(Online_Speed_Radar_clone_YlZLvnSGjM@www\\.onlinespeedradar\\.com)|(Online_Web_Search_clone_WjoqJJklvS@www\\.onlinewebsearch\\.co)|(Online_Web_Search_d1b9b3e703905b67931858f6f5aecdca@www\\.onlinewebsearch\\.co)|(OnlineRecipeSearch\\.info_pEdBAUaqCR@www\\.onlinerecipesearch\\.info)|(Package_Trace_JOGQGobPMj@www\\.trackpackagequicknt\\.com)|(Package_Tracker_02a37a57871ec5b57a0555403157dcf8@www\\.package-tracker\\.co)|(Package_Tracker_07a2a700968a7da88eb77b9c46279b1c@www\\.dailypackagetracker\\.com)|(Package_Tracker_3ce363c30f45ee0016862ac499be7ff5@www\\.packagetrackeronline\\.com)|(Package_Tracker_698579ac9c231e14ca69e1894f353396@www\\.dailypackagetracker\\.com\\.disabled)|(Package_Tracker_75a19df973eae7cf6e19c396c3973451@www\\.package-tracker\\.co)|(Package_Tracker_clone_FNZBehhrfr@www\\.package-tracker\\.co)|(Package_Tracker_EOXBmHOBkZ@www\\.package-tracker\\.co)|(Package_Tracker_Express_clone_cbOTQhTNgs@www\\.packagetrackerexpress\\.com)|(Package_Tracker_Express_ZxaTHkYQxF@www\\.packagetrackerexpress\\.com)|(Package_Tracker_fd87086da3f36037204f4b0bf23f1ea1@www\\.package-tracker\\.co)|(Package_Tracker_HaMksfdhUi@www\\.dailypackagetracker\\.com)|(Package_Tracker_Hub_clone_cfdJxpAmIT@www\\.packagetrackerhub\\.com)|(Package_Tracker_Hub_EreNcpVUoK@www\\.packagetrackerhub\\.com)|(Package_Tracker_kaiHEFsqvp@www\\.ThePackageTrack\\.com)|(Package_Tracker_KwwfXjTWsn@www\\.package-tracker\\.co)|(Package_Tracker_OHnRIWuvmH@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_b49f3fc69d90679955379dab26b2a6fa@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_cleZBgkKxj@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_EmvHhroAmG@www\\.packagetrackeronline\\.com)|(Package_Tracker_QYmRTqNSxY@www\\.getpackagetracker\\.com)|(Package_Tracker_Tab_50fa581c36cad6995f117782f5105636@www\\.packagetrackertab\\.com))$/","prefs":[],"schema":1576758357512,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bc321ad-e23b-4ed3-86bf-a1a3a38fbf75","last_modified":1576771657072},{"guid":"/^((Package_Tracker_yJbpZEQECr@www\\.package-tracker\\.co)|(packagefollowercom@www\\.packagefollower\\.com)|(PDF_Converter_AQpxoneXlZ@www\\.pdf-convertn\\.co)|(PDF_Converter_Plus_ZgLTNbAZUb@www\\.pdfconverterplus\\.com)|(PDF_Pro_Converter_eTqIXytHWq@www\\.pdfproconverter\\.com)|(Pets_Wallpapers_SKWDasMHYY@petswallpapers\\.net)|(phototab@www\\.wallpaperonlinepro\\.com)|(Premier_Search_clone_CcAEnLGkmK@www\\.premiersearch\\.co)|(Premier_Search_clone_wfigyWtsdL@www\\.premiersearch\\.co)|(Privacy-Search\\.biz_cXHpGjbGct@www\\.privacy-search\\.biz)|(Privacy-Search\\.club_fNwUjmGvkM@www\\.privacy-search\\.club)|(Privacy-Search\\.company_gzqnuNM@www\\.privacy-search\\.company)|(Privacy-Search\\.in\\.net_UdIeydXEbw@www\\.privacy-search\\.in\\.net)|(Privacy-Search\\.info_BzTWanpKDM@www\\.privacy-search\\.info)|(Privacy-Search\\.link_DATRCktqwk@www\\.privacy-search\\.link)|(Privacy-Search\\.one_NPLmbtQaBI@www\\.privacy-search\\.one\\.disabled\\.com)|(Privacy-Search\\.online_PwQLiKaWGq@www\\.privacy-search\\.online)|(Privacy-Search\\.site_zYtZQgkEtf@www\\.privacy-search\\.site)|(Privacy-Search\\.space_AjqewVnBVW@www\\.privacy-search\\.space)|(Privacy-Search\\.store_vNAqbjRGGn@www\\.privacy-search\\.store)|(Privacy-Search\\.today_NRVdCCeOIa@www\\.privacy-search\\.today)|(Privacy-Search\\.website_JwizWmtjPu@www\\.privacy-search\\.website)|(Privacy-Search\\.xyz_clone_juEABfQNOl@www\\.privacy-search\\.xyz)|(Privacy-Search\\.xyz_elSDqUATPt@www\\.privacy-search\\.xyz\\.disabled\\.com)|(Privacy-Search\\.xyz_oIkblTLPSN@www\\.privacy-search\\.xyz)|(PrivacySearch\\.biz_bAwIbiJVAP@www\\.privacysearch\\.biz)|(PrivacySearch\\.club_MRWkilEqOZ@www\\.privacysearch\\.club)|(PrivacySearch\\.company_hOwSWgQKdn@www\\.privacysearch\\.company\\.disabled\\.com)|(PrivacySearch\\.company_NAKTVsEmEC@www\\.privacysearch\\.company)|(PrivacySearch\\.in\\.net_NxaHlhdTlz@www\\.privacysearch\\.in\\.net)|(PrivacySearch\\.link_EOhtykDnGr@www\\.privacysearch\\.link)|(PrivacySearch\\.me_QSSIQcOMtH@www\\.privacysearch\\.me)|(PrivacySearch\\.one_WUIHjcIjXh@www\\.privacysearch\\.one)|(PrivacySearch\\.one_zOkggTAokc@www\\.privacy-search\\.one)|(PrivacySearch\\.online_CYiUatShgl@www\\.privacysearch\\.online)|(PrivacySearch\\.space_YagHPcSikB@www\\.privacysearch\\.space)|(PrivacySearch\\.store_pJBFyyaDRx@www\\.privacysearch\\.store)|(PrivacySearch\\.website_cGZdtKrFao@www\\.privacysearch\\.website)|(PrivacySearch\\.xyz_ZEUMZLHcqv@www\\.privacysearch\\.xyz)|(privacysearchco_xXdgBRl@info\\.privacysearch\\.co)|(privacysearchco@info\\.privacysearch\\.co)|(PrivateSearchOnline\\.com_IhKdmYiVeK@info\\.privatesearchonline\\.com)|(Pro_Games_Online_HVwluXulrt@www\\.progamesonline\\.co)|(Puppies_World_trFanlsdqu@www\\.puppiesworld\\.info)|(Puppy_Wallpapers_ZOWpJDLXFj@www\\.puppywallpapers\\.net)|(Quick_Career_Search_WDeLsGajVb@www\\.quickcareersearch\\.co)|(Quick_Daily_Mail_SKeVfXlhFp@www\\.quickdailymail\\.com)|(Quick_Email_App_EFITirXRRs@www\\.quickemailapp\\.com)|(Quick_Email_Checker_7796dc8c3c9cde3502870b6054bb34db@www\\.quickmailchecker\\.com)|(Quick_Email_Checker_BQerPmohdb@www\\.quickmailchecker\\.com)|(Quick_Map_Tab_98eb6af566aadaea6dae58aa6d841a70@www\\.quickmaptab\\.com)|(Quick_Map_Tab_IJTJmbzNOx@www\\.quickmaptab\\.com)|(Quick_Maps_clone_hIZNOOMdWQ@www\\.getquickmaps\\.com)|(Quick_Maps_clone_xRcOZiPvYl@www\\.getquickmaps\\.com)|(Quick_Maps_Online_7bcf0c280d92934d11d0b449980a1937@www\\.quickmapsonline\\.com)|(Quick_Maps_Online_QKDpNHmDpD@www\\.quickmapsonline\\.com)|(Quick_Maps_pjWqGYHPRE@www\\.getquickmaps\\.com)|(Quick_Online_Directions_0364feaec027aaab80a920e79ac1800c@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_8cfe33dcf14406257fca53f436aad1ff@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_bFKYEkYGUO@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_JcSWuSfSrw@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_qswqvmCxux@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_d922039a0497633824e490148707ca71@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_eddee69bb3984d22264d57b63e6f0115@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_OFYSSUWMOH@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_Test_gbFqFQwwaZ@www\\.quickonlinedirections\\.com)|(Quick_Recipe_Search_QumKWdGMdB@www\\.quickrecipesearch\\.today)|(Quick_Search_Tab_Cbzrnmuqub@www\\.quicksearchtab\\.co))$/","prefs":[],"schema":1576758405945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"402be073-072f-44d7-a557-7c98914dc0da","last_modified":1576771657067},{"guid":"/^((Quick_Speed_Checker_09b7f7d1acd76f23f1d887e60ddcc474@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_3db2cd8f8f3e192f57ca83da50451660@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_bhRDSCySFq@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_sqZXXzzpsT@www\\.quickspeedchecker\\.com)|(Quick_Weather_Forecast_IHOnRApsey@www\\.quickweatherforecast\\.com)|(Quick_Weather_Updates_6277aeb2d83428ca469904f0886e0938@www\\.quickweatherupdates\\.com)|(Quick_Weather_Updates_yieimwNJEx@www\\.quickweatherupdates\\.com)|(QuickNews\\.co_vZLHaiMlVV@www\\.quicknews\\.co)|(QuickRecipeSearch\\.co_hqhPDvuKrF@www\\.quickrecipesearch\\.co)|(qwertyuiopasdf@www\\.xyz\\.com)|(Radio_Hub_Online_YfJreNCpww@www\\.radiohubonline\\.com)|(rakshitchoudhary8@gmail\\.com)|(rakshitchoudhary8@gmail\\.om)|(Recipe_Board_Plus_7484a472b0b409e4895321bdd72e1945@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_f92fd9f713f932491e785a977401bb7c@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_gpeHSqIYiT@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_hYpxDyhZpP@www\\.myrecipeguideonline\\.com)|(Recipe_Board_Plus_pfyXDonFTr@www\\.recipeboardplus\\.com)|(Recipe_Book_Search_d62d1a871fc0f1d38ecf6b7653ae688b@www\\.recipebooksearch\\.com)|(Recipe_Book_Search_MRJMOtSRZt@www\\.recipebooksearch\\.com)|(Recipe_Book_Tab_3deea22a93f8e99342510c9cb16ccdf4@www\\.recipebooktab\\.com)|(Recipe_Guide_Plus_41c1f7d66a164e59a4721902d4a0a6c5@www\\.recipeguideplus\\.com)|(Recipe_Guide_Plus_dHGfHpqpFD@www\\.recipeguideplus\\.com)|(Recipe_Online_gwFoqximpy@www\\.recipeonline\\.net\\.test)|(Recipe_Search_Guide_e1d73ceb736fe3f0cf7b0da6063a92b3@www\\.recipesearchguide\\.com)|(Recipe_Search_Guide_mbFGBVqpia@www\\.recipesearchguide\\.com)|(Recipe_Search_Plus_5bc244154d5ed1b0fa3e2ff8e788ddbd@www\\.recipesearchplus\\.com)|(Recipe_Search_Plus_FxKIeZgMHD@www\\.recipesearchplus\\.com)|(Recipes_by_Alot_klEAJdojHM@www\\.mydailyrecipes\\.co)|(sahil@searchprivacy\\.co)|(Satellite_Maps_Now_aPVhlrXyLu@www\\.satellitemapsnow\\.com)|(Say_Rosary_7fbf455ac8a8d9319ec8e9c888bbc8f0@www\\.sayrosary\\.com)|(Say_Rosary_IoTPeJHVYN@www\\.sayrosary\\.com)|(Search_Anonymous_3914bca7a10a50db91f284a844eeec2f@www\\.searchanonymous\\.co)|(Search_Anonymous_kHrtzTbIUW@www\\.searchanonymous\\.co)|(Search_Atlas_8c11f710a756258b85fce73f36080a00@www\\.searchatlas\\.co)|(Search_Atlas_a65471976592d8afb32ab1d355329f4f@www\\.searchatlas\\.co)|(Search_Atlas_fgPWjhrMII@www\\.searchatlas\\.co)|(Search_Atlas_JvMkNyzBew@www\\.searchatlas\\.co)|(Search_Beacon_App_eqehzqftmN@www\\.searchbeaconapp\\.com)|(Search_Center_clone_jwMueYZfAC@www\\.searchcenter\\.co)|(Search_Central_c4359af19cd8d0828733d75832e3bb87@www\\.searchcentral\\.co)|(Search_Direct_Pro_qkzlUJiGov@www\\.searchdirectpro\\.com)|(Search_Easy_008d08b3ff05afbcae6df5b92296a6d0@www\\.search-easy\\.co)|(Search_Easy_Go_577387e8b765f721486040e639398c71@www\\.searcheasygo\\.com)|(Search_Easy_Go_80d5131cc8b26c5c4af3f4aa83886f7f@www\\.searcheasygo\\.com)|(Search_Easy_Go_AvYrOIFWDF@www\\.searcheasygo\\.com)|(Search_Easy_Hub_2f45453af53121c146d7bf5c3dd914c3@www\\.searcheasyhub\\.com)|(Search_Easy_kDZUkxUbSP@www\\.search-easy\\.co)|(Search_Easy_Plus_3f7d63b42346d0eb02176aa32f33b9a4@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8965c3185ad17bdd1c759078bcde92f0@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8d7d969cf1d24004447fa0066e4dfd02@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8f70d67adfbdd9aa623aa2057efffc8b@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_9e6663ee2c4803fe1e7bf20b90f26e96@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_aMOxRncWIJ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_cdb1d9b83ae0801f912e8b73cac0836f@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dedOWbqqXd@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_DHIlDaCkwl@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dWFEmfADcn@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_eRdOVuRKeX@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_HlNUDYUqua@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_njXAdPCyfZ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_rrXYlzwRaJ@www\\.searcheasyplus\\.com)|(Search_Easy_Pro_20670965804c5d16d21370f657dcdca0@www\\.searcheasypro\\.com)|(Search_Easy_Pro_73aa350eceb1758d88bd3edb17b26a95@www\\.searcheasypro\\.com)|(Search_Easy_Pro_VDbJUdDuEi@www\\.searcheasypro\\.com)|(Search_Easy_Web_ad43024621fcd724bf50596e41f6852f@www\\.searcheasyweb\\.com))$/","prefs":[],"schema":1576758467216,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0054d00-739f-43e5-a6a4-22a56fd09844","last_modified":1576771657063},{"guid":"/^((Search_Easy_Web_tvqEdWRwUI@www\\.searcheasyweb\\.com)|(Search_Express_CgqiRHXtYw@www\\.yoursearchexpress\\.com)|(Search_For_Maps_gLRdugmyXV@www\\.search-maps\\.net)|(Search_Plus_090a3f242292c36b80d33fd7e48aeb84@www\\.search-plus\\.co)|(Search_Plus_App_2d6fef8895df8a9a67c9bd3b15438abf@www\\.searchplusapp\\.com)|(Search_Plus_App_zZmjIdjudH@www\\.searchplusapp\\.com)|(Search_Plus_lPNIzNDSuX@www\\.search-plus\\.co)|(Search_Plus_Now_04ba3f2b13d728af94433e016d46239d@www\\.searchplusnow\\.com)|(Search_Plus_Now_312928a70ba3909e221b0524753bf126@www\\.weatherforecasttracker\\.com)|(Search_Plus_Now_7a64f4abfa7dba3075cabf9896c8fa19@www\\.searchplusnow\\.com)|(Search_Plus_Now_81c0506ff8d40fb8a7daa44222962215@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_sgREjdpaZx@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_SMpbwlnYxa@www\\.searchplusnow\\.com)|(Search_Plus_Now_fuKTpdNeOn@www\\.mapmytravel\\.co)|(Search_Plus_Now_RUxZwdNBtU@www\\.searchplusnow\\.com)|(Search_Plus_Now_YQIFAskSvi@www\\.weatherforecasttracker\\.com)|(Search_Plus_Pro_248f4aa071807a8d8f35bf57aef7b217@www\\.mapmytravel\\.co)|(Search_Plus_Pro_c5202d6e9fff0fb53512d681772f0244@www\\.searchpluspro\\.com)|(Search_Plus_Pro_cBmYtdkkFb@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_egAEtDTMkX@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_KRXJEhDHND@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_odzZVUScjD@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_SpGuCbnjPE@www\\.searchpluspro\\.com)|(Search_Plus_Pro_d67fb2263b88d9d41bae10a6e2ae855b@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f7d126d7141628c1b739c58997b082b2@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f889c071fa2a90062f8eeb4e7fd56db6@disable\\.searchpluspro\\.com)|(Search_Plus_Pro_fab7d78fa6444068be71b39db91e15ff@www\\.searchpluspro\\.com)|(Search_Privacy_clone_ozOdXpYKTM@www\\.search-privacy\\.live)|(Search_Privacy_clone_UDbsERGbgS@www\\.privacysearch\\.news)|(Search_Privacy_dIeFDdYUHg@www\\.searchprivacy\\.xyz)|(Search_Privacy_dKaGZWBFIM@www\\.searchprivacy\\.today)|(Search_Privacy_jpagAkMKvy@www\\.search-privacy\\.today)|(Search_Privacy_llZnkTGcOa@www\\.searchprivacy\\.today)|(Search_Privacy_naGfXaprzJ@info\\.searchprivacy\\.co)|(Search_Privacy_PQZCFxQkZX@www\\.privacysearch\\.news)|(Search_Privacy_qUxDJagEVN@www\\.searchprivacy\\.live)|(Search_Privacy_uVBxmwGLSk@www\\.privacy-search\\.works)|(Search_Privacy_wZVkQUHrHw@www\\.privacysearch\\.live)|(Search_Privacy_ZpneZaXeZp@www\\.search-privacy\\.live)|(Search_Privacy_ZvcIJuofJd@www\\.privacy-search\\.org)|(Search_Recipe_Pro_c299176cc8e5b03509bc091d92718516@www\\.searchrecipepro\\.com)|(search_Recipe_Pro_hZSnuXpHlI@www\\.searchrecipepro\\.com)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42f@www\\.searchsecure\\.co)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42fhsadghs@www\\.searchsecure\\.co)|(Search_Secure_clone_haBhKCwJbD_34@www\\.searchsecurepro\\.co)|(Search_Secure_clone_haBhKCwJbD1@www\\.searchsecurepro\\.co)|(Search_Secure_PUhUZXSDqx@www\\.searchsecure\\.co)|(Search_Select_804ce00595966fa5ced4efb6e0919d6f@www\\.searchselect\\.co)|(Search_Select_FQCSJqYZdP@www\\.searchselect\\.co)|(Search_Voyager_91c3275d156ab7272e24590b4f7f49d6@www\\.searchvoyager\\.co)|(Search_Voyager_PgzBPOqQhh@www\\.searchvoyager\\.co)|(search-movie\\.net_cURRAPTBgN@www\\.search-movie\\.net)|(search-movie\\.online_PqiotXlNOM@www\\.search-movie\\.online)|(search-movie\\.today_jpmWHncsRI@www\\.search-movie\\.today)|(Search-Privacy\\.biz_ZPdXCSGFgO@www\\.search-privacy\\.biz)|(Search-Privacy\\.club_CtlbxhsuVt@info\\.search-privacy\\.club)|(Search-Privacy\\.desi_AdRXpDarGi@info\\.search-privacy\\.desi)|(Search-Privacy\\.in\\.net_WibIleNEHx@info\\.search-privacy\\.in\\.net)|(Search-Privacy\\.info_rsNLqucdiG@info\\.search-privacy\\.info)|(Search-Privacy\\.link_wDxGmBgqcl@www\\.search-privacy\\.link)|(Search-Privacy\\.me_AvAriQFEhU@www\\.search-privacy\\.me)|(Search-Privacy\\.net_nWVLWwvLtN@www\\.search-privacy\\.net)|(Search-Privacy\\.online_cYKHeBuuMA@www\\.search-privacy\\.online)|(Search-Privacy\\.org_HWNXCRCnGt@info\\.search-privacy\\.org)|(Search-Privacy\\.site_qacnidOLmc@www\\.search-privacy\\.site)|(Search-Privacy\\.space_FjfWuiGHqH@info\\.search-privacy\\.space)|(Search-Privacy\\.store_xyaGgMqtWA@www\\.search-privacy\\.store)|(Search-Privacy\\.website_smicMDEmxB@www\\.search-privacy\\.website)|(Search-Privacy\\.xyz_gBlCbCGBMh@info\\.search-privacy\\.xyz))$/","prefs":[],"schema":1576758508310,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4f75a73b-1541-4d50-b7c7-4d3524619899","last_modified":1576771657059},{"guid":"/^((Search-Tab\\.net_qpBMgxRRKX@www\\.search-tab\\.net)|(searchmovie\\.today_rRBhPdnLIB@www\\.searchmovie\\.today)|(SearchPrivacy\\.Biz_TQxQMmZjax@info\\.searchprivacy\\.biz)|(SearchPrivacy\\.club_sbgzeaMJld@info\\.searchprivacy\\.club)|(SearchPrivacy\\.company_lbwegvHahG@www\\.searchprivacy\\.company)|(SearchPrivacy\\.in\\.net_ozDwuJlbCG@info\\.searchprivacy\\.in\\.net)|(SearchPrivacy\\.Info_zDsfyaIpyx@info\\.searchprivacy\\.info)|(SearchPrivacy\\.link_MEIDSFxuIf@www\\.searchprivacy\\.link)|(SearchPrivacy\\.me_SHWxbNO@info\\.searchprivacy\\.me)|(SearchPrivacy\\.one_JRipaiPyZz@www\\.searchprivacy\\.one)|(SearchPrivacy\\.space_AJTsgDwydV@info\\.searchprivacy\\.space)|(SearchPrivacy\\.store_NqrJweiCoL@www\\.searchprivacy\\.store)|(SearchPrivacy\\.website_EYeCzNtENe@www\\.searchprivacy\\.website)|(searchprivacy@searchprivacy\\.co)|(searchprivacyco@info\\.search-privacy\\.co)|(searchprivacydemo@searchprivacy\\.co)|(SearchSafe_cmZnrUyIXL@www\\.searchsafe\\.site)|(SearchSafe\\.online_bTqWKNIadp@www\\.searchsafe\\.online)|(SearchSafe\\.website_NFNXBQxRPA@www\\.searchsafe\\.website)|(searchsafee_VRAYffGolz@staging\\.findmaps\\.co)|(SearchTab\\.co_bEVNcWEgQN@www\\.searchtab\\.co)|(SearchTab\\.online_gZFeDEkoQl@www\\.searchtab\\.online)|(Severe_Weather_Check_51c60f3de3995f14f71373a70593618c@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_bcb8c4ad7063c40e0e5b2d0f64ba11a5@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_joZdMWExSs@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_VlvXXiHGHD@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_xBNchBtncq@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_muRAWnsLSV@www\\.severeweathercheck\\.com)|(Single_Login_pHoBMgvLtK@single\\.login\\.com)|(Smart_-_Search_cQYvhxQOuG@www\\.EasyOnlineRecipe\\.net)|(SMART_-_SEARCH_hYubbcgBlB@www\\.netspeedcalculator\\.net)|(Smart_File_Converter_clone_BVgFKwVsaS@www\\.smartfileconverter\\.com)|(Smart_File_Converter_IasnkilxwD@www\\.smartfileconverter\\.com)|(Smart_Package_Tracker_06309abe3838d3a65fcbc43e2958851e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_1e9ff4a4ee10df2fb289180d5bb635bb@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_705864a844f3d8d84a5aecba1f675809@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_9ef0b4fcd24ee214476e73afb6adbb2e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_bfc6ce01ede9446711a752c034df59c4@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_KVsdeebRuB@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_OvvQZsPtpR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_SRguaqnzXn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_XRHzsWuwOn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_yPTsguhReR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_ZxioLKlnOD@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_db3d13974ca0682b514ad40e0f1fc682@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_jqLcWhCacs@www\\.smartpackagetracker\\.com)|(Smart_Search_05fc1caf5755ccc74a092042913cbbda@www\\.finddirections\\.co)|(Smart_Search_10751eb8462a19515e0f9f1525333d1d@www\\.game-quest\\.co)|(Smart_Search_118237f18afcc2ce76539a9d1e015bc2@www\\.dailygame\\.online)|(Smart_Search_13d2b5842a0358c117dd87411a84db0d@www\\.convertfilesonline\\.co)|(Smart_Search_2160f8e9f48a63f3d9d7a019b9a5c53d@www\\.finddirections\\.co)|(Smart_Search_2834376aee173a89462511cf3ae21633@www\\.dailyrecipesearch\\.net)|(Smart_Search_287a4b04b4dca219a02375ca2f6a4985@www\\.finddailycoupons\\.com)|(Smart_Search_3f36608d872e4e46edd8b4e57902e6bd@www\\.dailyrecipesearch\\.net)|(Smart_Search_5cad449f0283b0b10b9cd78472de5c54@www\\.finddirections\\.co)|(Smart_Search_69eb8884d7d2e0aabdad154644e38401@www\\.convertmyfile\\.co)|(Smart_Search_6a0b26a582308b0dd9ae82634ccfe6f7@www\\.localweathertoday\\.net)|(Smart_Search_77710b6943d36049c1b72d9035a63379@www\\.localweathertoday\\.net)|(Smart_Search_7f90cdefd25d69c792d02cec7763b41d@www\\.finddirections\\.co)|(Smart_Search_814229d05c1e81d4ce1e73a3ca7c3eaa@www\\.smartsearchnow\\.co)|(Smart_Search_94fb06cfccd5d4112f555fb00a1b38ec@www\\.finddirections\\.co)|(Smart_Search_a1e27539ac89c70a170688ee375c5426@www\\.finddailycoupons\\.com)|(Smart_Search_a98fb26ee015d18ad91a68c7124e1f30@www\\.get-news\\.co)|(Smart_Search_abeJBrRXlb@www\\.smart-search\\.one))$/","prefs":[],"schema":1576758534450,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24adcec0-6f62-41bd-9e13-97895838bf64","last_modified":1576771657055},{"guid":"/^((Smart_Search_aKLddQIYMY@www\\.gamesdaily\\.online)|(Smart_Search_aQBxkbfpqq@www\\.finddirections\\.co)|(Smart_Search_aStviFIoor@www\\.finddirections\\.co)|(Smart_Search_aTGazruEUE@www\\.search-smart\\.co)|(Smart_Search_ayroufrtQb@www\\.finddirections\\.co)|(Smart_Search_b08c081d9f06123fb6172679fdf4fcb6@www\\.finddirections\\.co)|(Smart_Search_b859bcf9fb977dc2076199076b2f9081@www\\.convertmyfile\\.co)|(Smart_Search_bbgycNKlXh@www\\.dailyjobssearch\\.net)|(Smart_Search_bdDgpqbSTU@www\\.smartsearchnow\\.co)|(Smart_Search_bnnlTJEfCZ@www\\.search-smart\\.live)|(Smart_Search_BWMiEUiCaH-my@www\\.findmaps\\.co)|(Smart_Search_BWMiEUiCaH@www\\.findmaps\\.co)|(Smart_Search_c14750a49aa2937ede499b641a6c4390@www\\.finddirections\\.co)|(Smart_Search_cb20a26ab1dc76cc9f793fb975be4b02@www\\.smartsearchnow\\.co)|(Smart_Search_cFSWRyjwef@www\\.smart-search\\.today)|(Smart_Search_chUMEQmsSU@www\\.finddirections\\.co)|(Smart_Search_CIWmtesCzJ@www\\.mycouponstore\\.co)|(Smart_Search_cKezTfCPJB@www\\.checkmaps\\.live)|(Smart_Search_cKnSYkYtgM@www\\.check-yourmail\\.co)|(Smart_Search_clone_bZjlXmDRQB@www\\.finddirections\\.co)|(Smart_Search_clone_duXXvsUEtZ@www\\.finddirections\\.co)|(Smart_Search_clone_EQDmJygWxO@www\\.searchsmart\\.online)|(Smart_Search_clone_ETXwzVYwpI@www\\.search-smart\\.work)|(Smart_Search_clone_HsJXCDiNNC@www\\.smartsearch\\.link)|(Smart_Search_clone_JxJqcLVLOv@www\\.finddirections\\.co)|(Smart_Search_clone_SoSaSQDKGZ@www\\.dailyrecipesearch\\.net)|(Smart_Search_CQbLIZDIOl@www\\.smartsearch\\.link)|(Smart_Search_CxIpAXIPVs@www\\.smart-search\\.co)|(Smart_Search_d0f38b4ff2f0e788c442249a857e4dde@www\\.finddirections\\.co)|(Smart_Search_d16ea913837e848252ad5d856d9c8b02@www\\.dailyjobssearch\\.net)|(Smart_Search_d8982f2dae25e7422cc1392ccf974d04@www\\.dailyrecipesearch\\.net)|(Smart_Search_da3cc67017bdcd720cbd7fc26f24d743@www\\.check-yourmail\\.co)|(Smart_Search_dcf5af05538a3c68edd4625c7f0d2dc4@www\\.finddailycoupons\\.com)|(Smart_Search_DLsAIStnQX@www\\.smartsearch\\.link)|(Smart_Search_dTBjWAGKlN@www\\.testnetspeed\\.co)|(Smart_Search_e34c59b523a7a1585da696e4576b101c@www\\.gamesdaily\\.online)|(Smart_Search_e6d57c56077122ca0bcef12a39e3f6a3@www\\.localweathertoday\\.net)|(Smart_Search_ea5e7bb722049dd11af40116816edee3@disable\\.convertmyfile\\.co)|(Smart_Search_EkAoOFUJwV@www\\.games-daily\\.co)|(Smart_Search_eMDQwPVVyj@www\\.search-smart\\.co)|(Smart_Search_f377b2bb34f42cbb572c36d9bfb3d9c3@www\\.finddirections\\.co)|(Smart_Search_fbd05acb7ab6331297e367f816ff0a20@www\\.testnetspeed\\.co)|(Smart_Search_FCphmgFrTz@www\\.finddailygames\\.co)|(Smart_Search_FMxybFLCfE@www\\.smart-search\\.today)|(Smart_Search_gGkCXJUDEH@www\\.game-quest\\.co)|(Smart_Search_HnEqPdzcek@www\\.search-smart\\.live)|(Smart_Search_IbBWPmuFLU@www\\.convertfilesonline\\.co)|(Smart_Search_JcpHMeulsq@www\\.dailyrecipesearch\\.net)|(Smart_Search_JJPKAMJWLv@www\\.finddailycoupons\\.com)|(Smart_Search_JTruqraRrz@www\\.localweathertoday\\.net)|(Smart_Search_JViAyYSxof@www\\.search-smart\\.today)|(Smart_Search_KjzSKpViVv@www\\.getmapfinder\\.com)|(Smart_Search_LBQKLuCjDu@www\\.search-smart\\.work)|(Smart_Search_LBUbgBMxrr@www\\.convertmyfile\\.co)|(Smart_Search_lKbvfFvWdq@www\\.finddirections\\.co)|(Smart_Search_LPxWJiUiWP@dailyrecipesearch\\.net)|(Smart_Search_lVYnIBRyYO@www\\.search-smart\\.today)|(Smart_Search_lzlfscclxO@www\\.smartsearch\\.news)|(Smart_Search_mmUSVHTgZN@www\\.searchsmart\\.website)|(Smart_Search_MYlsYAHChr@www\\.search-smart\\.one)|(Smart_Search_OYMxotguWV@www\\.thecoupon-store\\.co)|(Smart_Search_PncWXXrZyE@www\\.get-news\\.co)|(Smart_Search_PxUetfSxfK@www\\.finddirections\\.co)|(Smart_Search_qbdedBcsMV@www\\.mysmartsearch\\.online)|(Smart_Search_QFEtHYupEv@www\\.localweathertoday\\.net)|(Smart_Search_rmcVsyMvUV@www\\.finddailycoupons\\.com)|(Smart_Search_sfQjeIHqAg@www\\.onlinecouponfinder\\.net)|(Smart_Search_SLKIYTovfO@www\\.dailygame\\.online)|(Smart_Search_snYvsooWFZ@www\\.dailycoupons\\.store)|(Smart_Search_SRonsLzSpz@www\\.search-smart\\.link)|(Smart_Search_SUWIUWczzW@www\\.search-smart\\.club)|(Smart_Search_trFxvKvCFp@www\\.dailyrecipesearch\\.net)|(Smart_Search_tTrjAmWOoR@www\\.convertmyfile\\.co)|(Smart_Search_txfWPOCTvy@www\\.finddailycoupons\\.com)|(Smart_Search_UgGHEdLtFf@www\\.search-smart\\.one)|(Smart_Search_UXuBBPZiCD@www\\.search-smart\\.website)|(Smart_Search_VFsgkOxdvk@www\\.convertmyfile\\.co))$/","prefs":[],"schema":1576758569109,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"65197a67-44c8-440d-b22c-26d84b2d763e","last_modified":1576771657051},{"guid":"/^((Templates_Online_clone_UmejRGyzBe@www\\.gettemplatesonline\\.com)|(Templates_Online_clone_WiWqHXsGkm@www\\.gettemplatesonline\\.com)|(Templates_Online_xUPYerdIfL@www\\.gettemplatesonline\\.com)|(test_fhwkrCFoHO@test)|(test_searchprivacy@info\\.searchprivacy\\.info)|(TestFirefoxAddon_ahdBLDcQql@www\\.testfirefoxaddon\\.com)|(testsearchprivacy@info\\.searchprivacy\\.co)|(Text_From_Your_PC_9e43d427bd5cde52e50706cf2ce04da8@www\\.textfromyourpc\\.com)|(Text_From_Your_PC_cBapqdxFhR@www\\.textfromyourpc\\.com)|(The_Coupon_-_Store_ERhPcJTQll@thecoupon-store\\.co)|(The_Coupon_King_1209d556e43b7c529e282d8b8842da76@www\\.thecouponking\\.co)|(The_Coupon_King_lgTjuAddLR@www\\.thecouponking\\.co)|(The_Coupon_King_UwqzosFLgL@www\\.thecouponking\\.com)|(The_Coupon_Store_FuajgfDoOD@www\\.thecouponstore\\.co)|(The_Coupon_Store_lPVGxmIRUf@www\\.thecouponstore\\.co)|(The_Coupon_Store_Test_jkAVapBJTo@www\\.thecouponstore\\.co\\.test)|(The_Coupon_Trail_bdc89c2aeb9eb486945d9f9d80bdbb02@www\\.thecoupontrail\\.com)|(The_Coupon_Trail_MMnMCLSPWo@www\\.thecoupontrail\\.com)|(The_Coupon_Trial_IteRooFtcL@www\\.thecoupontrial\\.com)|(The_Coupons_Daily_efc9df81f19dc213cb2a20067afa4ccb@www\\.thecouponsdaily\\.com)|(The_Coupons_Daily_NAEBGGQbOZ@www\\.thecouponsdaily\\.com)|(The_Coupons_King_cb3ed44aa8013a310be07e3d3fcc4dc2@www\\.thecouponsking\\.co)|(The_Currency_Switch_987755b6cd2466fcb08f71503c38cbfa@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_c80da7ec7cd15c168fc419b3d69aa602@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_e0f313620f09d4dfc50e3a362bac8a9a@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_geyyIAUtgm@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_JZMSasbVPc@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_QlvIbtxDLF@www\\.thecurrencyswitch\\.co)|(The_Movie_Quest_BPyzyFXOpw@www\\.themoviequest\\.today)|(The_Movie_Search_IgbQnCESAN@www\\.themoviesearch\\.co)|(The_Movie_Search_zFBfJgLeGc@www\\.themoviesearch\\.co)|(The_News_Prompter_e90ebcdb43eb03954526e4576d6c6b71@www\\.thenewsprompter\\.com)|(The_News_Prompter_mbjJOGhbsK@www\\.thenewsprompter\\.com)|(The_Package_Track_9e0db37d4fc02628a9996d9be9ee7ad6@www\\.thepackagetrack\\.com)|(The_Quiz_Tab_xWbNAmFREz@www\\.thequiztab\\.com)|(The_Search_Easy_44e7c2c276e66b66d8bfb874777d4a2e@www\\.thesearcheasy\\.com)|(The_Search_Easy_XObNZOoESy@www\\.thesearcheasy\\.com)|(The_Search_Plus_37976642e8a885a46631002f0051ff23@www\\.thesearch-plus\\.co)|(The_Search_Plus_UawsDpTchY@www\\.thesearch-plus\\.co)|(thecouponstore@www\\.thecoupon-store\\.co)|(TheMovie-Hub\\.net_YezkChdTjo@www\\.themovie-hub\\.net)|(TheMovie-Portal_tPUcBCgXvk_1@www\\.themovie-portal\\.com)|(TheMovie-Portal_tPUcBCgXvk@www\\.themovie-portal\\.com)|(TheMovie-Quest\\.com_wlPrmnAQDs@www\\.themovie-quest\\.com)|(TheMovieQuest\\.co_cORgvNNjpL@www\\.themoviequest\\.co)|(TheMovieQuest\\.co_fQQHMPPCrc@www\\.themoviequest\\.co)|(themoviesearch\\.today_NaQhVgVlwL@www\\.themoviesearch\\.today)|(This_is_my_extension_qZkKGOuZcR@www\\.exampleAMO\\.com)|(This_is_New_AMO_dyIGZrXnWN@www\\.kite\\.com)|(This_is_New_AMO_QVeIjjGbol@www\\.kite\\.com)|(Trace_Packages_f406b9f80935c80df1166017cdb4d6f1@www\\.tracepackages\\.com)|(Track_Daily_News_1eaf6dc15b67e558badb4d0cfe763913@www\\.trackdailynews\\.com)|(Track_Daily_News_6e84f45f079de0ffcc94b2d968db9bee@www\\.trackdailynews\\.com)|(Track_Daily_News_a339167d304bfa5f599a249dda7ce993@www\\.trackdailynews\\.com)|(Track_Daily_News_EIMlViVmYz@www\\.trackdailynews\\.com)|(Track_Daily_News_sCvLoGjBau@www\\.trackdailynews\\.com)|(Track_Flight_Pro_7b52baadaefaac0bc71eaa5d3ffdd62c@www\\.trackflightpro\\.com)|(Track_Flight_Pro_c7f7b664812211123e6c54706eb66c3e@www\\.trackflightpro\\.com)|(Track_Flight_Pro_clone_hNojYqaWwF@www\\.trackflightpro\\.com)|(Track_Flight_Pro_eZAWVNMAAT@www\\.trackflightpro\\.com)|(Track_Package_Pro_clone_xayswwXtnt@www\\.trackpackagepro\\.com)|(Track_Package_Pro_clone_xBtZVauyZo@www\\.trackpackagepro\\.com)|(Track_Package_Pro_KvcoWaXXaa@www\\.trackpackagepro\\.com)|(Track_Package_Quick_525020a307e84998fc7ad8a634296e1d@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_SjXacYcSKg@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_zTowhYQtBK@www\\.trackpackagequick\\.com)|(Track_Package_Quick_lFiXdhlnGK@www\\.trackpackagequick\\.com)|(trackthatpackagecom@www\\.trackthatpackage\\.com)|(trailertab@www\\.trailertab\\.co))$/","prefs":[],"schema":1576758629163,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5cd48455-378c-4e67-a37d-8c39d497b4af","last_modified":1576771657042},{"guid":"/^((Translate_cgjqtumrjO@app\\.translate\\.com)|(Travel_Deals_Center_clone_GJNQLATOqW@www\\.traveldealscenter\\.co)|(Travel_Deals_Center_rqctZxkUaz@www\\.traveldealscenter\\.co)|(Travel_Directions_clone_FfMthspRaM@www\\.traveldirections\\.co)|(Travel_Directions_clone_ourIqJKEoa@www\\.traveldirections\\.co)|(Travel_Directions_mvJHkLHMMo@www\\.traveldirections\\.co)|(Tv_Shows_Online_4331a381f3f1b8d9f9f0b56793be73be@www\\.tvshowsonline\\.co)|(Tv_Shows_Online_MpTzgCmWDM@www\\.tvshowsonline\\.co)|(TV_Streaming_Plus_ARhtOdhYyz@www\\.tvstreamingplus\\.co)|(tyghn_EbxtKCSoQf@ghn)|(Universal_Package_Tracker_vEmOcVlKPs@www\\.universalpackagetrackern\\.online)|(Weather_Alert_Pro_BodPvrEWvi@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_clone_sTGOfwOqRV@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_eAvhNglZrt@www\\.weatheralertpro\\.com)|(Weather_Center_App_06cc2a6dd45345b134670c50b38c8692@www\\.weathercenterapp\\.com)|(Weather_Center_App_edIZBMRKqw@www\\.weathercenterapp\\.com)|(Weather_Center_App_ef684143ed5bb6671446fa504a5feec8@www\\.weathercenterapp\\.com)|(Weather_Center_App_f860fbbefafc691d55516dbf9ff9de42@www\\.weathercenterapp\\.com)|(Weather_Center_App_FCsxbRlcmB@www\\.weathercenterapp\\.com)|(Weather_Center_App_rEbQRyobNS@www\\.weathercenterapp\\.com)|(Weather_Coach_aRmHcdLWxv@www\\.weather-coach\\.com)|(Weather_Coach_cnhVSyfNQb@www\\.weather-coach\\.com)|(Weather_Coach_SdaRyeWHza@www\\.weather-coach\\.com)|(Weather_Details_a74cceec1f4c6974ce48a55da22c4fc8@www\\.weather-details\\.co)|(Weather_Details_clone_WmbTEchnZv@www\\.weather-details\\.today)|(Weather_Details_DBDwBdsiUV@www\\.weather-details\\.online)|(Weather_Details_LZKpPYrFpw@www\\.weather-details\\.today)|(Weather_Details_UMhKKuOmLm@www\\.weather-details)|(Weather_Details_xrNgYMjMud@www\\.weather-details\\.today)|(Weather_Forecast_0c98741392250106567fdcdf92e662ed@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_22873441e62b17d83e57bee8dae28096@disable\\.checkweathernow\\.co)|(Weather_Forecast_26bbf7afaa8ca321d3eb1793eab261eb@www\\.checkweathernow\\.co)|(Weather_Forecast_34a39ecaa08283313fa326a45884233b@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_5432f72204437596f302a717de4410ab@www\\.localweathertoday\\.net)|(Weather_Forecast_5c6a315e6da8023a47a4e247bcd60544@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_5d13ac5f68d80a584ad913b02540fae5@www\\.checkweather\\.today)|(Weather_Forecast_647cf952e5329d490351c5b250e81e54@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_6f6484fab931bf3f3fcf75dfa65adc37@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_7462a90b29dc5f13bb4628cce7d2c6dc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_a4fe2e9e47d66eebd6220e13d10434ef@www\\.checkweathernow\\.co)|(Weather_Forecast_BjIrtPRHri@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_Buddy_hqZFZdAdSe@www\\.weatherforecastbuddy\\.com)|(Weather_Forecast_c27096e498d3541e341f2597fa7124b0@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_c6509e49a9a27bdab9facfb442488a79@www\\.localweathertoday\\.net)|(Weather_Forecast_ca28589b2ca67136318e4bfdf954002d@www\\.checkweathertoday\\.net)|(Weather_Forecast_cbf70b1126d7690bf9180b2e6c43e8f6@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_ChxOzHZcLa@www\\.localweathertoday\\.net)|(Weather_Forecast_clone_60d8346940b46a116579ec1ea3906d5d@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_chFFSZCgvz@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_94a823ffc8bedf3bd1e6ab4465826581@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_apzzlMbkyB@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_f2e4cad9766f8cde8ffbdd484efbdd2b@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_yQjWeYXXXI@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HErKKKDyFS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HOrAZgjBCz@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_jMGHMuyVVi@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_KYlMwumWQY@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_kyUmeEeefY@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_pDcEnQJDXJ@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_piPIkUDQPc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_QoJcNyLaQt@www\\.weatherforecasttracker\\.com))$/","prefs":[],"schema":1576758680309,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a083664b-0301-45cd-a2ee-0c690be250b6","last_modified":1576771657038},{"guid":"/^((Weather_Forecast_clone_TSGzGLieya@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_UBimgpjhsm@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_XcnVeRvMca@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_YQnByPToHy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_zkFObDWDhS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_Daily_CTzpOZENfa@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_e3838c6031faf63c6209533e71b456c0@www\\.weatherforecastdaily\\.disabled\\.com)|(Weather_Forecast_EnkDNfGxAS@www\\.checkweathernow\\.co)|(Weather_Forecast_epwQJrNJwH@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_eWEHJWtQzM@www\\.checkweathertoday\\.net)|(Weather_Forecast_eWFHhLxmdi@www\\.checkweathernow\\.co)|(Weather_Forecast_f5d79bda8e7d666123f8cff0f49720ab@www\\.localweathertoday\\.net)|(Weather_Forecast_FbozBLKAnT@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_fc107df349d96479678eb88a9d2f58b3@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_KlMFWMEnxo@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_KNdWdwrVBg@www\\.weather-forecast\\.link)|(Weather_Forecast_lESFprnxRC@www\\.checkweathernow\\.co)|(Weather_Forecast_nsdhLSCwEt@www\\.weather-forecast\\.news)|(Weather_Forecast_OMezCgBGlR@www\\.weather-forecast\\.link)|(Weather_Forecast_Plus_81c2ce246488019a54fed798354fbb85@www\\.weatherforecastplus\\.com)|(Weather_Forecast_Plus_WVxlZhsVCn@www\\.weatherforecastplus\\.com)|(Weather_Forecast_QqFyFxILHq@www\\.checkweather\\.today)|(Weather_Forecast_rUPfzmWQNa@www\\.localweathertoday\\.net)|(Weather_Forecast_Search_4f3974a0460bd8947f25b61879196ae6@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_Search_SPAKKzWPua@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_SjMIOdqezy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_Tab_d586ce62eebca7b5ccd054f645ab3278@www\\.weatherforecasttab\\.com)|(Weather_Forecast_Tab_LHutnjYcaD@www\\.weatherforecasttab\\.com)|(Weather_Forecast_UZnBodXSQY@www\\.localweathertoday\\.net)|(Weather_Forecast_V2_c8e3c1f489201dcee4f10ed13b88423b@www\\.weatherforecasttracker1\\.com)|(Weather_Info_AdPTHnolyR@www\\.weatherinfo\\.live)|(Weather_Info_clone_IylhdngkdZ@www\\.weatherinfo\\.live)|(Weather_Info_clone_LAyJxkrWYr@www\\.weatherinfo\\.live)|(Weather_Info_mYTEbKRsJk@www\\.weatherinfo\\.live)|(Weather_Info_rBUleVUgYg@www\\.weatherinfo\\.today)|(Weather_Info_ZurIhFqkfO@www\\.weatherinfo\\.live)|(Weather_Online_Now_clone_gXBxUraWkz@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_clone_VEajkSqfLm@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_LxMeLWImMw@www\\.weatheronlinenow\\.com)|(Weather_Report_69d519795ecb2edb106cf07b8e5fcbae@www\\.weatherreportlive\\.co)|(Weather_Report_JHDIwuETLZ@www\\.weather-report\\.live)|(Weather_Report_PdxgfapiBL@www\\.weatherreportlive\\.co)|(Weather_Report_WKPqFTsXUk@www\\.weather-report\\.live)|(Weather_Reporter_98959e99f2103eef2d02f3d351ba89b9@www\\.weatherreporter\\.co)|(Weather_Reports_BjGuRgCpLB@www\\.weather-reportsnow\\.com)|(Weather_Reports_c982e1b51cd8bc347ab328410329fbb6@www\\.weatherreports\\.live)|(Weather_Reports_clone_fRjlGYJSnk@www\\.weatherreports\\.live)|(Weather_Reports_clone_NMTTAUMqtY@www\\.dailyweatherreports\\.co)|(Weather_Reports_EQVqqGZdlM@www\\.weather-report\\.link)|(Weather_Reports_HlXmMSuFKX@www\\.weatherreports\\.live)|(Weather_Reports_KDxyqUBBwO@www\\.dailyweatherreports\\.co)|(Weather_Reports_UyzmbxlFVx@www\\.weather-reports\\.today)|(Weather_Reports_xaeygHwNhf@www\\.weatherreports\\.live)|(Weather_Reports_zDpccdTchc@www\\.weatherreports\\.today)|(Weather_Reports_zKYmoRPwNT@www\\.weatherreports\\.live)|(Weather_Tab_Pro_clone_aTBTPSAEUX@www\\.weathertabpro\\.com)|(Weather_Updates_TGBOowTNwY@www\\.weather-updates\\.co)|(Weather-Bee_1b435f4656c8c4f6df6b455cc302cf9b@www\\.weather-bee\\.co)|(Weather-Bee_cbff90268cbc8e1fd65336342cfcf056@www\\.weather-bee\\.co)|(Weather-Bee_deb8c4f31d28d8ef924d8604c528f43b@www\\.weather-bee\\.com)|(Weather-Bee_gFubKNACfC@www\\.weather-bee\\.co)|(Weather-Bee_HyIkcLzmEL@www\\.weather-bee\\.co)|(Weather-Bee_oUeUqEGckY@www\\.weather-bee\\.com)|(WeatherDetails_qGhRPwNzlD@www\\.weatherdetails\\.net)|(Web_Gamer_World_clone_bBqNIFWIiJ@www\\.webgamerworld\\.com)|(Web_Gamer_World_clone_vSvnetvjxh@www\\.webgamerworld\\.com)|(Web_Gamer_World_EnPQSoVMPy@www\\.webgamerworld\\.com))$/","prefs":[],"schema":1576758713481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"86bffc98-7002-4c94-84b1-2036f19f1345","last_modified":1576771657033},{"guid":"/^((WheresMyPackage\\.co_04c5041d404a424ae04b3bdae470bf36@www\\.wheresmypackage\\.co)|(WheresMyPackage\\.co_nkiJdrfSTz@www\\.wheresmypackage\\.co)|(wheresmypackageco@www\\.wheresmypackage\\.co)|(Wonder_Wallpaper_7445d465b196ea5672cf5ddad5121e20@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_86c968090b99d54af67a65a1c6010dc8@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_b3a8885c9af58cc53b837522fbeab5fa@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_BdEgqQaNqI@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_rujWfVzPPf@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_XONDNNciYs@www\\.wonderwallpaper\\.co)|(www\\.search-privacy\\.in\\.net_frtQaDOkLW@www\\.search-privacy\\.in\\.net)|(www\\.search-privacy\\.info_hyVgVlpUDh@www\\.search-privacy\\.info)|(Your_Mail_Tab_06f9e0cacb38332e7d67d6f6eb36fbf4@www\\.yourmailtab\\.com)|(Your_Mail_Tab_27811aa670d957af7c67c9b40421db33@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_FFlaTZQUzT@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_kckMtSXzhP@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_rZgtWWxFTE@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_tplYnwtbOB@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_UStpWwUYys@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_wQEiyJhcTK@www\\.yourmailtab\\.com)|(Your_Mail_Tab_sHxtuglHxJ@www\\.yourmailtab\\.com)|(Your_Map_Tab_caf5c90424b052d0a732d773f984284d@www\\.yourmaptab\\.com)|(Your_Map_Tab_MGrwdnTuFV@www\\.yourmaptab\\.com)|(Your_Maps_Finder_1cb2c0753a9f2089208e662ff7887eff@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_283a77e3a6a0c1cb4d803b12b7b3f38d@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_299d66c546dc1bf61c2f1ac4a823d848@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_2b2f2c9fdc74da065784a5537d7cbe8a@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_493f8ad05595d053fc466c6d712a0f5b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_5fb3ba7aabc0df0482f721f2b8226c49@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_8ec3602a25914b2b98753c78f3ff0792@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_a4e12e88158bb14fe3f3b23935d1005b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_clone_KCngJjrrAW@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_CVslhcZliG@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_dfeYIGYOsX@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_gSkAwghnnM@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_HbjLLgCqVI@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IAQSXqZaut@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IjXrmViPjV@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_jfCclXiWUZ@www\\.yourmapsfinder\\.com)|(Your_Maps_Guide_gJsxGXyDUk@www\\.yourmapsguide\\.com)|(Your_Recipes_Guide_6e2b67bec168f977b275d2cb8e38cb99@www\\.yourrecipesguide\\.com)|(Your_Recipes_Guide_pjXpEcLtqt@www\\.yourrecipesguide\\.com)|(Yum_Recipe_finder_5de2cc2f278f3bfc1a3715a70c8661f0@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_93a02159e31918ef11d89db653420167@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_AoObYTQNIW@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_c3c1e13d25490ca78859e8857319b432@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_nFKjdQhPjD@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_oIeIcINzWP@www\\.yumrecipefinder\\.com)|(Yum_Recipe_Finder_CqcblSJbqU@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_eb8981fe181afd4e02a57fd9c4b9e8f2@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_mgdDNujmFJ@www\\.yumrecipefinder\\.com))$/","prefs":[],"schema":1576758771928,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bfa84d62-24de-474e-bc35-a69b1f46f331","last_modified":1576771657029},{"guid":"/^((@FirefoxUpdate)|(@googledashboard)|(@smash_mov)|(@smash_tv)|(@smashdashboard)|(@smashmovs)|(@smashtvs)|(\\{0be01832-7cce-4457-b8ad-73b743914085\\})|(\\{0e1c683e-9f34-45f1-b365-a283befb471a\\})|(\\{0c72a72d-6b2e-4a0e-8a31-16581176052d\\})|(\\{0ccfc208-8441-4c27-b1cb-799accb04908\\})|(\\{0ede8d39-26f2-49c4-8014-dfc484f54a65\\})|(\\{1fc1f8e6-3575-4a6f-a4d1-c4ca1c36bd2a\\})|(\\{3a1d6607-e6a8-4012-9506-f14cd157c171\\})|(\\{03b3ac4d-59a3-4cc6-aa4d-9b39dd8b3196\\})|(\\{3bb6e889-ac7a-46ca-8eed-45ba4fbe75b5\\})|(\\{3c841114-da8c-44ea-8303-78264edfe60b\\})|(\\{3f3bcb3e-dd73-4410-b102-60a87fcb8323\\})|(\\{3f951165-fd85-42ae-96ef-6ff589a1fe72\\})|(\\{04c86cb3-5f52-4083-9e9a-e322dd02181a\\})|(\\{4d8b44ef-9b8b-4d82-b668-a49648d2749d\\})|(\\{4d25d2b4-6ae7-4a66-abc0-c3fca4cdddf6\\})|(\\{5c9a2eca-2126-4a84-82c0-efbf3d989371\\})|(\\{6ecb9f49-90f0-43a1-8f8a-e809ea4f732b\\})|(\\{6fb8289d-c6c8-4fe5-9a92-7dc6cbf35349\\})|(\\{7fea697d-327c-4d20-80d5-813a6fb26d86\\})|(\\{08a3e913-0bbc-42ba-96d7-3fa16aceccbf\\})|(\\{8b04086b-94a5-4161-910b-59e3e31e4364\\})|(\\{08c28c16-9fb6-4b32-9868-db37c1668f94\\})|(\\{8cd69708-2f5e-4282-a94f-3feebc4bce35\\})|(\\{8dc21e24-3883-4d01-b486-ef1d1106fa3d\\})|(\\{8f8cc21a-2097-488f-a213-f5786a2ccbbf\\})|(\\{9c8b93f7-3bf8-4762-b221-40c912268f96\\})|(\\{9ce66491-ef06-4da6-b602-98c2451f6395\\})|(\\{1e1acc1c-8daa-4c2e-ad05-5ef01ae65f1e\\})|(\\{10b0f607-1efa-4762-82a0-e0d9bbae4e48\\})|(\\{24f338d7-b539-49f1-b276-c9edc367a32d\\})|(\\{40c9030f-7a2f-4a58-9d0a-edccd8063218\\})|(\\{41f97b71-c7c6-40b8-83b1-a4dbff76f73d\\})|(\\{42f3034a-0c4a-4f68-a8fd-8a2440e3f011\\})|(\\{52d456e5-245a-4319-b8d2-c14fbc9755f0\\})|(\\{57ea692b-f9fe-42df-bf5e-af6953fba05a\\})|(\\{060c61d8-b48f-465d-aa4b-23325ea757c3\\})|(\\{65c1967c-6a5c-44dd-9637-0d4d8b4c339b\\})|(\\{65d40b64-b52a-46d8-b146-580ff91889cb\\})|(\\{75b7af0d-b4ed-4320-95c8-7ffd8dd2cb7c\\})|(\\{77fe9731-b683-4599-9b06-a5dcea63d432\\})|(\\{84b20d0c-9c87-4340-b4f8-1912df2ae70d\\})|(\\{92b9e511-ac81-4d47-9b8f-f92dc872447e\\})|(\\{95afafef-b580-4f66-a0fe-7f3e74be7507\\})|(\\{116a0754-20eb-4fe5-bd35-575867a0b89e\\})|(\\{118bf5f6-98b1-4543-b133-42fdaf3cbade\\})|(\\{248eacc4-195f-43b2-956c-b9ad1ae67529\\})|(\\{328f931d-83c1-4876-953c-ddc9f63fe3b4\\})|(\\{447fa5d3-1c27-4502-9e13-84452d833b89\\})|(\\{476a1fa9-bce8-4cb4-beff-cb31980cc521\\})|(\\{507a5b13-a8a3-4653-a4a7-9a03099acf48\\})|(\\{531bf931-a8c6-407b-a48f-8a53f43cd461\\})|(\\{544c7f83-ef54-4d17-aa91-274fa27514ef\\})|(\\{546ea388-2839-4215-af49-d7289514a7b1\\})|(\\{635cb424-0cd5-4446-afaf-6265c4b711b5\\})|(\\{654b21c7-6a70-446c-b9ac-8cac9592f4a9\\})|(\\{0668b0a7-7578-4fb3-a4bd-39344222daa3\\})|(\\{944ed336-d750-48f1-b0b5-3c516bfb551c\\})|(\\{1882a9ce-c0e3-4476-8185-f387fe269852\\})|(\\{5571a054-225d-4b65-97f7-3511936b3429\\})|(\\{5921be85-cddd-4aff-9b83-0b317db03fa3\\})|(\\{7082ba5c-f55e-4cd8-88d6-8bc479d3749e\\})|(\\{7322a4cb-641c-4ca2-9d83-8701a639e17a\\})|(\\{90741f13-ab72-443f-a558-167721f64883\\})|(\\{198627a5-4a7b-4857-b074-3040bc8effb8\\})|(\\{5e5b9f44-2416-4669-8362-42a0b3f97868\\})|(\\{824985b9-df2a-401c-9168-749960596007\\})|(\\{4853541f-c9d7-42c5-880f-fd460dbb5d5f\\})|(\\{6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b\\})|(\\{90e8aa72-a7eb-4337-81d4-538b0b09c653\\})|(\\{02e3137a-96a4-433d-bfb2-0aa1cd4aed08\\})|(\\{9e734c09-fcb1-4e3f-acab-04d03625301c\\})|(\\{a6ad792c-69a8-4608-90f0-ff7c958ce508\\})|(\\{a512297e-4d3a-468c-bd1a-f77bd093f925\\})|(\\{a71b10ae-b044-4bf0-877e-c8aa9ad47b42\\})|(\\{a33358ad-a3fa-4ca1-9a49-612d99539263\\})|(\\{a7775382-4399-49bf-9287-11dbdff8f85f\\})|(\\{afa64d19-ddba-4bd5-9d2a-c0ba4b912173\\})|(\\{b4ab1a1d-e137-4c59-94d5-4f509358a81d\\})|(\\{b4ec2f8e-57fd-4607-bf4f-bc159ca87b26\\})|(\\{b06bfc96-c042-4b34-944c-8eb67f35630a\\})|(\\{b9dcdfb0-3420-4616-a4cb-d41b5192ba0c\\})|(\\{b8467ec4-ff65-45f4-b7c5-f58763bf9c94\\})|(\\{b48e4a17-0655-4e8e-a5e2-3040a3d87e55\\})|(\\{b6166509-5fe0-4efd-906e-1e412ff07a04\\})|(\\{bd1f666e-d473-4d13-bc4d-10dde895717e\\})|(\\{be572ad4-5dd7-4b6b-8204-5d655efaf3b3\\})|(\\{bf2a3e58-2536-44d4-b87f-62633256cf65\\})|(\\{bfc5ac5f-80bd-43e5-9acb-f6d447e0d2ce\\})|(\\{bfe3f6c1-c5fe-44af-93b3-576812cb6f1b\\})|(\\{c0b8009b-57dc-45bc-9239-74721640881d\\})|(\\{c1cf1f13-b257-4271-b922-4c57c6b6e047\\})|(\\{c3d61029-c52f-45df-8ec5-a654b228cd48\\})|(\\{c39e7c0b-79d5-4137-bef0-57cdf85c920f\\})|(\\{ce043eac-df8a-48d0-a739-ef7ed9bdf2b5\\})|(\\{cf62e95a-8ded-4c74-b3ac-f5c037880027\\})|(\\{cff02c70-7f07-4592-986f-7748a2abd9e1\\}))$/","prefs":[],"schema":1576756770976,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c7d7515d-563f-459f-821c-27d4cf825dbf","last_modified":1576771657025},{"guid":"/^((search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted@mozilla\\.com)|({0a054930-63d7-46f4-937a-de80eab21da4})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({0d50d8aa-d1ed-4930-b0a0-f3340d2f510e})|({0eb4672d-58a6-4230-b74c-50ca3716c4b0})|({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({0fc9fcc7-2f47-4fd1-a811-6bd4d611294b})|({4479446e-40f3-48af-ab85-7e3bb4468227})|({1a927d5b-42e7-4407-828a-fdc441d0daae})|({1a760841-50c3-4143-9f7e-3c8f04e8f9d1})|({1bd8ba17-b3ed-412e-88db-35bc4d8771d7})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({01c9a4a4-06dd-426b-9500-2ea6fe841b88})|({1cab8ccf-deff-4743-925d-a47cbd0a6b56})|({1cb0652a-4645-412d-b7e8-0b9e9a83242f})|({1d6634ca-dd37-4a31-aad1-321f05aa2bb3})|({1d9997b2-f61e-429a-8591-999a6d62becc})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({01f409a5-d617-47be-a574-d54325fe05d1})|({2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8})|({2aeb1f92-6ddc-49f5-b7b3-3872d7e019a9})|({2bb68b03-b528-4133-9fc4-4980fbb4e449})|({2cac0be1-10a2-4a0d-b8c5-787837ea5955})|({2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9})|({2ee125f1-5a32-4f8e-b135-6e2a5a51f598})|({2f53e091-4b16-4b60-9cae-69d0c55b2e78})|({3a65e87c-7ffc-408d-927e-ebf1784efd6d})|({3a26e767-b781-4e21-aaf8-ac813d9edc9f})|({3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c})|({3dca6517-0d75-42d2-b966-20467f82dca1})|({3f4191fa-8f16-47d2-9414-36bfc9e0c2bf})|({3f49e12b-bb58-4797-982c-4364030d96d9})|({4aa2f47a-0bae-4a47-8a1b-1b93313a2938})|({04abafc7-7a65-401d-97f3-af2853854373})|({4ad16913-e5cb-4292-974c-d557ef5ec5bb})|({4b1050c6-9139-4126-9331-30a836e75db9})|({4b1777ec-6fe4-4572-9a29-5af206e003bf})|({4beacbbb-1691-40e7-8c1e-4853ce2e2dee})|({4c140bc5-c2ad-41c3-a407-749473530904})|({4cbef3f0-4205-4165-8871-2844f9737602})|({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab})|({04ed02dc-0cb0-40c2-8bc8-6f20843024b8})|({4f6b6aaf-c5a1-4fac-8228-ead4d359dc6d})|({4f8a15fb-45c2-4d3b-afb1-c0c8813a4a5a})|({5af74f5a-652b-4b83-a2a9-f3d21c3c0010})|({5b0f6d3c-10fd-414c-a135-dffd26d7de0f})|({5b421f02-e55e-4b63-b90e-aa0cfea01f53})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({5c5cf69b-ed92-4429-8d26-ff3bb6c37269})|({5cf77367-b141-4ba4-ac2a-5b2ca3728e81})|({5da81d3d-5db1-432a-affc-4a2fe9a70749})|({5eac1066-90c3-4ba0-b361-e6315dcd6828})|({5ec4c837-59b9-496d-96e2-ff3fa74ca01f})|({5efd8c7a-ff37-41ac-a55c-af4170453fdf})|({5f4e63e4-351f-4a21-a8e5-e50dc72b5566})|({6a934ff5-e41d-43a2-baf5-2d215a869674})|({06a71249-ef35-4f61-b2c8-85c3c6ee5617})|({6ad26473-5822-4142-8881-0c56a8ebc8c0})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({6ed852d5-a72e-4f26-863f-f660e79a2ebb})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({6fa41039-572b-44a4-acd4-01fdaebf608d})|({7ae85eef-49cf-440d-8d13-2bebf32f14cf})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7b23c0de-aa3d-447f-9435-1e8eba216f09})|({7b71d75e-51f5-4a71-9207-7acb58827420})|({7c6bf09e-5526-4bce-9548-7458ec56cded})|({7ca54c8d-d515-4f2a-a21f-3d32951491a6})|({7d932012-b4dd-42cc-8a78-b15ca82d0e61})|({7d5e24a1-7bef-4d09-a952-b9519ec00d20})|({7eabad73-919d-4890-b737-8d409c719547})|({7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0})|({7f8bc48d-1c7c-41a0-8534-54adc079338f})|({7f84c4d8-bdf5-4110-a10d-fa2a6e80ef6a})|({8a6bda75-4668-4489-8869-a6f9ccbfeb84})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({8ab8c1a2-70d4-41a8-bf78-0d0df77ac47f})|({8b4cb418-027e-4213-927a-868b33a88b4f})|({8fcfe2b3-598e-4861-a5d4-0d77993f984b})|({9a941038-82fa-4ae4-ba98-f2eb2d195345})|({9b8a3057-8bf4-4a9e-b94b-867e4e71a50c})|({9b8df895-fcdd-452a-8c46-da5be345b5bc})|({09c8fa16-4eec-4f78-b19d-9b24b1b57e1e})|({09cbfddf-5e55-4676-920d-5a16cb9e4cb5})|({9cf8d28f-f546-4871-ac4d-5faff8b5bde3})|({9d592fd5-e655-461a-9b28-9eba85d4c97f})|({9fc6e583-78a5-4a2b-8569-4297bb8b3300})|({014d98ce-dab9-4c1d-8643-166e75d7cb4d})|({18c64b09-4ccb-4c21-ba6f-ebd4a1efa034})|({21d83d85-a636-4b18-955d-376a6b19bd19})|({22ecf14b-ead6-4684-a498-7b2b839a4c97}))$/","prefs":[],"schema":1576757328395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cae5d906-0b1d-4d1c-b83f-f9727b8c4a29","last_modified":1576771657022},{"guid":"/^(({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({117ca2f3-df4c-4e17-a5c5-b49077e9c731})|({11db147a-a1cb-43dd-9c05-0d11683483e1})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({24ed6bdc-3085-413b-a62e-dc5dd30272f4})|({2aa19a7a-2a43-4e0d-a3dc-abb33fa7e2b6})|({3d6fbbb3-6c80-47bb-af20-56fcaebcb9ca})|({42f4c194-8929-42b9-a9a3-afa56dd0913b})|({46740fa0-896d-4f2e-a240-9478865c47c2})|({4718da68-a373-4a03-a77b-0f49b8bb40ee})|({4d41e0b8-bf7e-45ab-bd90-c426b420e3ee})|({50957a38-c15d-42da-94f5-325bc74a554c})|({5650fc63-a7c5-4627-8d0a-99b20dcbd94b})|({5c5c38ec-08bf-493a-9352-6ccf25d60c08})|({67ecb446-9ccd-4193-a27f-7bd1521bd03c})|({71f01ffe-226d-4634-9b21-968f5ce9f8f5})|({72f31855-2412-4998-a6ff-978f89bba0c3})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7c37463c-001e-4f58-9e88-aaab2a624551})|({7de64f18-8e6b-4c41-9b05-d8872b418026})|({82dcf841-c7e1-4764-bb47-caa28909e447})|({872f20ea-196e-4d11-8835-1cc4c877b1b8})|({8efee317-546f-418d-82d3-60cc5187acf5})|({93deeba1-0126-43f7-a94d-4eecfce53b33})|({9cc12446-16da-4200-b284-d5fc18670825})|({9cd27996-6068-4597-8e97-bb63f783a224})|({9fdcedc7-ffde-44c3-94f6-4196b1e0d9fc})|({a191563e-ac30-4c5a-af3d-85bb9e9f9286})|({a4cb0430-c92e-44c6-9427-6a6629c4c5f6})|({a87f1b9b-8817-4bff-80fd-db96020c56c8})|({ae29a313-c6a9-48be-918d-1e4c67ba642f})|({b2cea58a-845d-4394-9b02-8a31cfbb4873})|({b420e2be-df31-4bea-83f4-103fe0aa558c})|({b77afcab-0971-4c50-9486-f6f54845a273})|({b868c6f4-5841-4c14-86ee-d60bbfd1cec1})|({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({c53c4cbc-04a7-4771-9e97-c08c85871e1e})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({cf8e8789-e75d-4823-939f-c49a9ae7fba2})|({d0f67c53-42b5-4650-b343-d9664c04c838})|({dfa77d38-f67b-4c41-80d5-96470d804d09})|({e20c916e-12ea-445b-b6f6-a42ec801b9f8})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e7d03b09-24b3-4d99-8e1b-c510f5d13612})|({fa8141ba-fa56-414e-91c0-898135c74c9d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|(firedocs@mozilla\\.com)|(firetasks@mozilla\\.com)|(getta@mozilla\\.com)|(javideo@mozilla\\.com)|(javideo2@mozilla\\.com)|(javideos@mozilla\\.com)|(javideosz@mozilla\\.com)|(search_free@mozilla\\.com)|(search-unlisted@mozilla\\.com)|(search-unlisted101125511@mozilla\\.com)|(search-unlisted10155511@mozilla\\.com)|(search-unlisted1025525511@mozilla\\.com)|(search-unlisted1099120071@mozilla\\.com)|(search-unlisted1099125511@mozilla\\.com)|(search-unlisted109925511@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted14400770034@mozilla\\.com)|(search-unlisted144007741154@mozilla\\.com)|(search-unlisted144436110034@mozilla\\.com)|(search-unlisted14454@mozilla\\.com)|(search-unlisted1570124111@mozilla\\.com)|(search-unlisted1570254441111@mozilla\\.com)|(search-unlisted15721239034@mozilla\\.com)|(search-unlisted157441@mozilla\\.com)|(search-unlisted15757771@mozilla\\.com)|(search-unlisted1577122001@mozilla\\.com)|(search-unlisted15777441001@mozilla\\.com)|(search-unlisted15788120036001@mozilla\\.com)|(search-unlisted157881200361111@mozilla\\.com)|(search-unlisted1578899961111@mozilla\\.com)|(search-unlisted157999658@mozilla\\.com)|(search-unlisted158436561@mozilla\\.com)|(search-unlisted158440374111@mozilla\\.com)|(search-unlisted15874111@mozilla\\.com)|(search-unlisted1741395551@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted1768fdgfdg@mozilla\\.com)|(search-unlisted180000411@mozilla\\.com)|(search-unlisted18000411@mozilla\\.com)|(search-unlisted1800411@mozilla\\.com)|(search-unlisted18011888@mozilla\\.com)|(search-unlisted1801668@mozilla\\.com)|(search-unlisted18033411@mozilla\\.com)|(search-unlisted180888@mozilla\\.com)|(search-unlisted181438@mozilla\\.com)|(search-unlisted18411@mozilla\\.com)|(search-unlisted18922544@mozilla\\.com)|(search-unlisted1955511@mozilla\\.com)|(search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search@mozilla\\.com)|(searchazsd@mozilla\\.com)|(smart246@mozilla\\.com)|(smarter1@mozilla\\.com)|(smarters1@mozilla\\.com)|(stream@mozilla\\.com)|(tahdith@mozilla\\.com))$/","prefs":[],"schema":1576611696962,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cee5c2ab-1059-4b15-a78c-1203116552c4","last_modified":1576771657018},{"guid":"/^((application2@fr-metoun\\.com)|(application@br-annitop\\.com)|(application@br-atoleg\\.com)|(application@br-cholty\\.com)|(application@br-debozoiz\\.com)|(application@br-echite\\.com)|(application@br-estracep\\.com)|(application@br-exatrom\\.com)|(application@br-iginot\\.com)|(application@br-imastifi\\.com)|(application@br-isobiv\\.com)|(application@br-ludimaro\\.com)|(application@br-pintoula\\.com)|(application@br-proufta\\.com)|(application@br-qhirta\\.com)|(application@br-qibizar\\.com)|(application@br-qopletr\\.com)|(application@br-roblaprouf\\.com)|(application@br-rosalop\\.com)|(application@br-samalag\\.com)|(application@br-sopreni\\.com)|(application@br-stoumo\\.com)|(application@br-villonat\\.com)|(application@br-zoobre\\.com)|(application@de-barbuna\\.com)|(application@de-bicelou\\.com)|(application@de-blabuma\\.com)|(application@de-dalofir\\.com)|(application@de-elplic\\.com)|(application@de-erotah\\.com)|(application@de-ertuck\\.com)|(application@de-eurosty\\.com)|(application@de-ezigat\\.com)|(application@de-lorelam\\.com)|(application@de-losimt\\.com)|(application@de-luchil\\.com)|(application@de-miligap\\.com)|(application@de-open-dog\\.com)|(application@de-rydima\\.com)|(application@de-slapapi\\.com)|(application@de-soqano\\.com)|(application@de-treboola\\.com)|(application@de-vasurk\\.com)|(application@de-ygivas\\.com)|(application@es-biloufer\\.com)|(application@es-boulass\\.com)|(application@es-cemaseur\\.com)|(application@es-elixet\\.com)|(application@es-gestona\\.com)|(application@es-glicalol\\.com)|(application@es-griloup\\.com)|(application@es-iblep\\.com)|(application@es-iglere\\.com)|(application@es-jounyl\\.com)|(application@es-klepst\\.com)|(application@es-nofinaj\\.com)|(application@es-ofarnut\\.com)|(application@es-phistouquet\\.com)|(application@es-pronzal\\.com)|(application@es-roterf\\.com)|(application@es-taapas\\.com)|(application@es-tatoflex\\.com)|(application@fr-acomyl\\.com)|(application@fr-avortep\\.com)|(application@fr-blicac\\.com)|(application@fr-bloubil\\.com)|(application@fr-carazouco\\.com)|(application@fr-cichalou\\.com)|(application@fr-consimis\\.com)|(application@fr-cropam\\.com)|(application@fr-deplitg\\.com)|(application@fr-doadoto\\.com)|(application@fr-domeoco\\.com)|(application@fr-domlaji\\.com)|(application@fr-eferif\\.com)|(application@fr-eivlot\\.com)|(application@fr-eristrass\\.com)|(application@fr-ertike\\.com)|(application@fr-esiliq\\.com)|(application@fr-fedurol\\.com)|(application@fr-grilsta\\.com)|(application@fr-hyjouco\\.com)|(application@fr-intramys\\.com)|(application@fr-istrubil\\.com)|(application@fr-javelas\\.com)|(application@fr-jusftip\\.com)|(application@fr-lolaji\\.com)|(application@fr-macoulpa\\.com)|(application@fr-mareps\\.com)|(application@fr-metoun\\.com)|(application@fr-metyga\\.com)|(application@fr-mimaloy\\.com)|(application@fr-monstegou\\.com)|(application@fr-oplaff\\.com)|(application@fr-ortisul\\.com)|(application@fr-pastamicle\\.com)|(application@fr-petrlimado\\.com)|(application@fr-pinadolada\\.com)|(application@fr-raepdi\\.com)|(application@fr-soudamo\\.com)|(application@fr-stoumo\\.com)|(application@fr-stropemer\\.com)|(application@fr-tlapel\\.com)|(application@fr-tresdumil\\.com)|(application@fr-troglit\\.com)|(application@fr-troplip\\.com)|(application@fr-tropset\\.com)|(application@fr-vlouma)|(application@fr-yetras\\.com)|(application@fr-zorbil\\.com)|(application@fr-zoublet\\.com)|(application@it-bipoel\\.com)|(application@it-eneude\\.com)|(application@it-glucmu\\.com)|(application@it-greskof\\.com)|(application@it-gripoal\\.com)|(application@it-janomirg\\.com)|(application@it-lapretofe\\.com)|(application@it-oomatie\\.com)|(application@it-platoks\\.com)|(application@it-plopatic\\.com)|(application@it-riploi\\.com)|(application@it-sabuf\\.com)|(application@it-selbamo\\.com)|(application@it-sjilota\\.com)|(application@it-stoploco\\.com)|(application@it-teryom\\.com)|(application@it-tyhfepa\\.com)|(application@it-ujdilon\\.com)|(application@it-zunelrish\\.com)|(application@uk-ablapol\\.com)|(application@uk-blamap\\.com)|(application@uk-cepamoa\\.com)|(application@uk-cloakyz\\.com)|(application@uk-crisofil\\.com)|(application@uk-donasip\\.com)|(application@uk-fanibi\\.com)|(application@uk-intramys\\.com)|(application@uk-klastaf\\.com)|(application@uk-liloust\\.com)|(application@uk-logmati\\.com))$/","prefs":[],"schema":1576756704239,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"914ec360-d35e-4420-a88f-1bad3513f054","last_modified":1576771657015},{"guid":"/^((\\{0bf1c111-c256-4a17-891d-1bc69338162e\\})|(\\{0ffbc4b1-f269-4cff-9552-5f77337ebc1a\\})|(\\{1bbdc69d-55d3-4872-bd03-14eb05e7a7ad\\})|(\\{1ce00b82-ac47-43e6-a69c-f7dc9344168a\\})|(\\{2b01628b-0110-4965-972c-7a0b624fb99f\\})|(\\{3a84e0b0-3151-449e-b6e8-1062036afac6\\})|(\\{3bbcc16b-23f7-40a6-b88c-9ced9d009c93\\})|(\\{3ea48f4a-b585-44a7-aff5-faeb5e5b47d5\\})|(\\{7b161d2c-ee98-4321-a78a-433950672c8a\\})|(\\{8a8d97d8-b879-4024-8321-765e0f395b84\\})|(\\{9c0d6766-debe-4461-b14f-68ddfc13a78a\\})|(\\{014f9781-c104-41a4-a983-fc6aa4690664\\})|(\\{27ffdb27-0a34-4dea-a483-3b357bc6a5fe\\})|(\\{81ba256a-4f32-40df-86b5-e6b9861481e1\\})|(\\{338c7503-fb54-4b69-a84b-916f7452c7fa\\})|(\\{400e053f-55df-4e86-a91a-eae8d7b7bcd1\\})|(\\{617e0484-8346-44f2-851e-60ab89a919f9\\})|(\\{656a0095-d852-4dcc-a107-764df7ad0ec4\\})|(\\{754a330b-efbe-4016-8526-bf0f2e11e45e\\})|(\\{802ba900-013c-42f6-a11a-093c4bf35baa\\})|(\\{2771ce08-4898-4f58-89a5-e2b9d00bfab2\\})|(\\{3906b944-92f3-4d43-89dc-31ad6484a77c\\})|(\\{6516cdbc-9332-437f-89ac-b57470655542\\})|(\\{6847c507-1793-4be2-be86-4c2cc0b445bf\\})|(\\{9687db9b-410c-47f2-8c36-fde63c7c29e4\\})|(\\{0035237e-97ab-40eb-ba9d-c453fb6aa079\\})|(\\{20143127-e0bd-4396-aee9-52229cf9b5eb\\})|(\\{33254399-d5b2-4d84-b90b-9c4d4dc71112\\})|(\\{34621968-1952-4428-909d-df5b220efe74\\})|(\\{83769978-21cf-417c-b4a9-582b4161e395\\})|(\\{aa369db0-4232-47b8-bbbb-49ad31d49dce\\})|(\\{aff733de-d7d8-49c2-824a-7f2b2e282927\\})|(\\{c0b587fe-766b-446f-9aae-bc6edc9f6f4c\\})|(\\{c47a75b9-c6d2-4009-a245-c6dcedeea932\\})|(\\{c51bd197-28bd-442f-8537-dea5ae129047\\})|(\\{cac044a2-b93c-4f24-bf2f-b902741d29a8\\})|(\\{de17ce6f-389f-4368-9675-b9ed93133f17\\})|(\\{e2b105bc-1821-4838-bdf9-0fa4f6781b18\\})|(\\{e6c8bc7f-0133-418a-86ed-ba2c0a6925df\\})|(\\{f4acda5f-a75b-4b3b-8a73-8ca3df8d5f57\\})|(\\{f4fd18ee-8f6a-4708-8338-7e7981b73453\\})|(\\{f2320322-1fff-4998-bc28-4ad61621012a\\})|(\\{ff939f5e-a97c-4c14-b853-9c82519dbf73\\})|(@complete-youtube-downloader)|(@swsearchassist)|(@swsearchassist2)|(@youtube-download-helper-addon-1)|(@youtube-download-helper-addon-3)|(@ytd-support)|(@ytmp4-support)|(@ytu-support)|(18-plus-bypass@agebypass\\.org)|(18plus@sweetytweety\\.jp)|(addon@firefox-addon-s\\.com)|(ageverify@doubletrouble\\.net)|(auto-fill-dhruv\\.techapps@gmail\\.com)|(awesomeaddons@gmail\\.com)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--730948579)|(boomerang-for-gmailtm@chrome-store-foxified--1895216441)|(boomerang-for-gmailtm@chrome-store-foxified-1472004183)|(browsing_certificate@easycerts\\.in)|(certs-js@verify\\.org)|(clear-flash-cookies@tubedownload\\.org)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1026618965)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1382673267)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified-3810896411)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-1917762393)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-2539369515)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3411285726)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3957753373)|(dhruv@gmail\\.com)|(easy\\.download@youtube\\.com)|(easy18plusverify@agehelper\\.com)|(EasyQR@johndoe)|(easytranslate@johndoehits)|(ecaieeiecbdhkcgknidmfelflleobbnp@chrome-store-foxified-2878848146)|(eurekasakamika@chrome-store-foxified-unsigned)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified--1071037210)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified-335403930)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--546579415)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--929033716)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--1776201342)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-411918147)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-711293137)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1406852911)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1805495496)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2344964585)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2515600300)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2947667317)|(generated-c5el8k8zv2b1gcncleefj9@chrome-store-foxified--1160265316)|(html5-video-everywhere@lejenome\\.me)|(iapifmceeokikomajpccajhjpacjmibe@chrome-store-foxified-6029610)|(info@ytdownloader\\.info))$/","prefs":[],"schema":1576756923769,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be96c9a1-0b01-468e-ac9b-761ba3587162","last_modified":1576771657011},{"guid":"/^((\\{7e4a75c1-dddc-4496-9963-1c6ac99cf226\\})|(\\{35af257d-14dd-4cd0-8ebd-2d30c2b30561\\})|(\\{d6362448-1e8f-47bf-9d2f-491648d18e3d\\})|(\\{80a42dcf-193e-43a2-b662-d6b14882403f\\})|(\\{044e39fc-333b-423c-8291-26078a780b02\\})|(\\{68b3c6ce-162f-4ece-9ffa-8279855a4228\\})|(\\{057b93a7-84e6-43ff-9686-d452435ed3c5\\})|(\\{1223cfa2-7aad-4a16-b98a-6bf63b346835\\})|(\\{9815ca8b-a77c-4e4d-beac-aad1c7021dcb\\})|(\\{e3f2795a-cefc-4f7f-9435-5f091b988d2f\\})|(\\{98fd0bd5-f486-4d81-9eb1-e89e9d56bfa2\\})|(\\{f96fafd2-5860-4bfa-9537-3f2ca9dd496e\\})|(\\{da93cdd9-6aca-410e-b2f2-e927da726559\\})|(\\{d97e0506-d330-4547-8a5c-093b8aa08d7a\\})|(\\{425ad6b3-72b8-43c0-be7c-2f6585fa0ec1\\})|(\\{0375f007-f5ba-46ec-86d2-c5da84576562\\})|(\\{e8915f55-6566-4872-97eb-d77fbdbf2fb3\\})|(\\{ebd3a0c4-bf9e-4dfa-b487-f77722055edb\\})|(\\{7cc62e47-ed20-45bc-8c92-bb57128e78d6\\})|(\\{b5a15631-6429-49bd-a670-e83ac41f93a9\\})|(\\{f263d545-3234-460f-b546-a8406a0a729d\\})|(\\{6468c148-9888-4243-8de5-cb6291cac82a\\})|(\\{da2281db-0036-46f6-8878-ff26e1cf6a2b\\})|(\\{63f579ba-eaf5-4e1a-a7c2-c5e889beaf9f\\})|(\\{84569fbb-d367-40ce-b24b-fd3b611283b8\\})|(\\{da2bc16f-b499-401b-8771-9d9f32d88f86\\})|(\\{1a275ad6-5dd3-47e9-a563-41a0bebdfd90\\})|(\\{e07ebf1e-5917-46a2-95d9-61d9b51f3797\\})|(\\{0d6791d2-ce0b-4f78-90e4-8e773703bd35\\})|(\\{502c7ef7-745c-4ea0-8066-a17cf1b74957\\})|(\\{c93f0aeb-ae9b-49d9-835b-c58a6b03aa46\\})|(\\{1f0bf2a4-aff5-42d3-8633-71e65f289250\\})|(\\{28766320-358e-42e3-a2c7-67ec77552424\\})|(\\{74d4fcda-c103-4fb7-810a-4596530c00a4\\})|(\\{7b3fd37a-a127-41a0-9e4d-59ccfa165e41\\})|(\\{787fa0b0-d5f1-4454-8b0c-72d191d6775f\\})|(\\{e2bae2ed-0368-48e7-8671-3bdcc5d7713f\\})|(\\{fee16fb4-830f-438a-a3d5-f7e911d23e02\\})|(\\{72113405-b4a5-46c3-a7c6-5353568b87bd\\})|(\\{5ede50a4-4151-4635-804f-a6f56115a0c6\\})|(\\{c11487a0-d104-4bc3-814b-474f8c29049c\\})|(\\{35690b6e-1979-4ea3-89aa-44a94dda2afa\\})|(\\{e9d698ef-bad4-4960-9df3-8c41605a6d7b\\})|(\\{1472b3c1-cae8-42c4-bbdf-e71134dccf08\\})|(\\{7a40b654-1232-4e76-81e7-d95260db25cd\\})|(\\{f54699c8-c82f-4d6e-a161-919bbe8410de\\})|(\\{dca6a5cd-0d24-442a-afd4-80572bb20c34\\})|(\\{b8d5d169-f076-4098-b671-a3cb8b410f56\\})|(\\{903e6561-0646-4c38-8039-d372d8e7c90a\\})|(\\{b39977b9-bcb2-448b-9d7b-9aec7f62bc26\\})|(\\{059b5c30-b96a-48df-8083-5fff97a8f9bf\\})|(\\{1d0351bb-1d96-4779-b639-44eeceb2ebfb\\})|(\\{80c0bdb4-ba98-472d-ae56-afd8b3021115\\})|(\\{4dfc5596-9655-4b0c-819d-e2ff48fb8556\\})|(\\{d7d3ed3c-6f73-42cb-b724-c33fccc1b465\\})|(\\{b378a858-89bb-492e-8b4d-eb83e910a14b\\})|(\\{ec1fa94c-8700-49d0-ba5d-df99a912519e\\})|(\\{4db5d249-881f-4442-8c01-28536c45ebfd\\})|(\\{7a411d82-fc50-4f20-bd2c-b2b065f18097\\})|(\\{675e002b-e144-4694-a725-9e8cc6a3fa67\\})|(\\{1902a069-c039-421e-b502-1e367c237196\\})|(\\{866bb3a8-82bb-4c9a-bca5-26fd5f37c4ec\\})|(\\{6a4e7017-43cd-4646-bb48-003620bb60fe\\})|(\\{bc5c676e-a75f-475b-a27c-79687b1de3ec\\})|(\\{6b544e1a-932d-4da9-aafe-c4b4bbfe1958\\})|(\\{99631434-ff1e-49d3-88d3-9ac40d0dd1bd\\})|(\\{623b31e0-f289-47cf-995e-5a195e261758\\})|(\\{1b4d88a5-4b5d-44c8-849c-82f129a7dacd\\})|(\\{48ba880a-b7c2-4e4e-af55-9134ac926c61\\})|(\\{4b498e2a-8b17-47c0-a449-89a76b6e737f\\})|(\\{d9cbd45f-cdbc-4be1-bb16-8e60764630ff\\})|(\\{bfaaa94a-1a93-4a1c-9b54-9dbe98f3ef07\\})|(\\{87b93e6e-70a6-4538-9848-e9d0f060e372\\})|(\\{fea4fd50-ed6a-4b8e-b00d-3b2276df6e34\\})|(\\{c15450f8-8da2-4add-a8f6-603d90e8d344\\})|(\\{ec972135-8e5c-49d4-bff8-b6006b21f2d2\\})|(\\{b039f24d-8b51-40d3-abf7-55e1dc502112\\})|(\\{b308870f-ae9a-4972-af28-0218717a47f4\\})|(\\{9349a202-8b8e-4777-ba93-c723810da51e\\})|(\\{798750dc-0057-47e0-a1af-73dec73544fa\\})|(\\{186e4b6a-e3f0-4970-8f7b-05ab6bc50320\\})|(\\{dec8de3e-d3a4-4946-bcbd-c3523fee11c5\\})|(\\{06539c62-00d3-4513-9aa4-048dd273107a\\})|(\\{b200a289-900a-4953-b2c6-b7a323d6fb66\\})|(\\{4080defb-6c6b-4012-bcac-71379e9c430f\\})|(\\{b110855c-90dd-427a-894c-54b93c6572b7\\})|(\\{dd599e99-3a48-4e36-9d83-56f8c0019d4d\\})|(\\{4f43f2c7-c1e6-4091-88fe-c829b3bfe553\\})|(\\{b7a022bc-6b89-4ac1-a1fa-bf02251336b0\\})|(\\{1aa370ca-9865-4c52-89a8-79e95abc82f7\\})|(\\{fb727d0f-7c3d-4bf6-8be4-284e7e8b8f83\\})|(\\{1579b5dd-ef3d-4754-bc59-8a7707fe1219\\})|(\\{66f0cb42-bb3e-4a16-90c1-bed1e3be4aad\\})|(\\{f13a1f79-f63a-4332-a9c9-11fc50328fc2\\})|(\\{29962f4d-bf74-4775-9d02-31fe546d6fa6\\})|(\\{aa539764-9ec3-41a6-af0e-6c2dc46ecbf5\\})|(\\{9412adf1-2714-4cb2-ad5b-13d41096234a\\})|(\\{86f2f4cc-97c5-4cc5-8151-c327ab379fba\\}))$/","prefs":[],"schema":1576757017958,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"654077f4-a8b3-4822-8962-0bb1cac1d70d","last_modified":1576771657006},{"guid":"/^((\\{0209c9a2-f58e-4ca5-ba95-80de8a0bec36\\})|(\\{0429d1cf-e6c7-46b9-9959-4d24263f5b9f\\})|(\\{04aed622-650c-44b2-968e-a8740024bdfe\\})|(\\{054ccccf-bb7d-4d0d-ae7e-94931a469627\\})|(\\{06440d64-2a92-45a7-8e8e-c14a35f9224d\\})|(\\{06e83ce4-370c-41c0-bfb7-62bb0e77cabb\\})|(\\{06fe00d4-24df-497f-90e0-88db402cc9d6\\})|(\\{077e07c1-b948-4e88-9965-226cde465f9f\\})|(\\{07b424b4-8a9d-4fe6-afd5-1f2135f5f4ea\\})|(\\{080f27b3-ad41-4bf4-84bb-b6df1d395b0e\\})|(\\{0a3ba90b-224e-48ae-9440-b92d4ac03ee6\\})|(\\{0bd278d9-fbc6-40dd-914d-5e696c4255cb\\})|(\\{0c3c7c7c-3d15-4cf7-936d-dcf6070e82ce\\})|(\\{0ee32a7c-74b2-4a55-b388-8034b39c6b1d\\})|(\\{0f806e24-dbcc-4f14-b8f5-cfd7f88d6302\\})|(\\{0f9b7554-16d4-4496-8f01-e396256033b7\\})|(\\{1331d9a3-b9ec-43fc-a369-f73a926849b9\\})|(\\{14aca62f-1cc5-4424-a30a-ffb3d424b5bc\\})|(\\{14ec0bb2-f06f-46ad-b951-b810f7651284\\})|(\\{16744b56-7518-4526-bf9a-2531d694fb1a\\})|(\\{179d7013-b6d8-4a89-a861-30e0e8a7faee\\})|(\\{17cff984-12b5-438d-a915-41d7d006de4f\\})|(\\{17ee37ab-fe67-45bd-9666-bcf57a371e46\\})|(\\{19f6f2dd-32df-47a2-9b89-76543a987d46\\})|(\\{1a6ddac5-6ca0-4d59-a8e5-02345c67f703\\})|(\\{1b50ef3b-a364-4089-8ef6-1031cc7a0d1d\\})|(\\{1b830180-08d2-4381-a516-b84aba36e52f\\})|(\\{1cdff066-cb3a-4abf-95d0-39691e53dc75\\})|(\\{1e778837-1740-4a35-9eb1-e16b2c189037\\})|(\\{260d8452-72d2-4860-b14e-dd3fcb779656\\})|(\\{262c435a-42e0-4ca1-a713-f52672691f4e\\})|(\\{26d2406b-5118-44fe-a479-15a8c4f6f2bd\\})|(\\{28a26807-fdc2-4e79-b2a1-efcb1c21d199\\})|(\\{28c24c28-a094-4915-a2ff-5ff91caf076b\\})|(\\{2afddffd-6246-45f6-af19-a7803095bdf0\\})|(\\{2d37fd0a-5ae0-4d83-bc0e-fc7d870587c6\\})|(\\{2df75889-c43e-4f4d-b43b-e51d9b50167c\\})|(\\{2e4e320a-d5f6-4685-89f0-4d7084209c06\\})|(\\{2f93ea6a-1c1b-4456-b821-e8ba50aedece\\})|(\\{3034cb02-b9bb-4e8a-8749-cdd7fd1a6902\\})|(\\{3862859a-78c6-474e-b30e-303e86a7c6a4\\})|(\\{386afcb7-64f4-41db-b3e8-a76602ebb2fa\\})|(\\{38b61e2b-1af3-4f35-bdf0-cc4e3afc4880\\})|(\\{395065fd-1b7f-400f-aecb-9cfbcd9d607e\\})|(\\{3b0055c9-ea2c-43be-a927-ecd342946367\\})|(\\{3b37c6dd-d5f0-494d-9dd2-175db561b99c\\})|(\\{3e5a09c0-5f26-4d40-a5d0-a853f1fa759d\\})|(\\{3f2d032a-29ac-4cbe-9463-563f3ba6eb7f\\})|(\\{3f6ea025-e6c2-4372-adca-cb60b811e4da\\})|(\\{4253e6be-5b91-4b66-b44e-11f6260cee0e\\})|(\\{42c5b340-7cda-4d89-81a4-4a20754b5250\\})|(\\{42d8241e-e5f6-47d7-95f6-b6649143b12a\\})|(\\{46061237-f12b-4738-b1e4-7b7070fc03ca\\})|(\\{46bcaa76-c21e-44a2-aed8-6ba630fcc961\\})|(\\{47f394e0-02be-4a08-b865-287b993ac40e\\})|(\\{497c92fb-4d7d-4b9e-9884-a178e5991ee1\\})|(\\{498d00a0-3d8a-45ff-8e8f-3c27fcd12df6\\})|(\\{49ec4e6d-8152-461e-a2f5-095ede6c3cab\\})|(\\{4a87eeaa-4aa5-4695-b393-1ca4f00b2f3e\\})|(\\{4b0d3b3a-d61c-4968-a338-8de76d044f80\\})|(\\{4b9b2a47-e06f-4948-a20f-78ec1ef4e84c\\})|(\\{4dc32f1c-374e-4886-9a62-80ecfc23ed17\\})|(\\{4e901df2-8301-4588-9bc9-1e9f6c4f996f\\})|(\\{4fb6f5ed-eb5a-4115-a635-57fecad85d50\\})|(\\{50c0ae9a-ebaf-44f7-9ea7-52c7d1066721\\})|(\\{5160a705-c8e9-40b9-900e-6d26559038de\\})|(\\{5232e216-65a2-44d0-ba11-05fc8c332af7\\})|(\\{53e6e44a-a0af-49e2-af72-db4518f153bb\\})|(\\{58c7b5da-a1cc-437a-9401-2a56eb77df7d\\})|(\\{59aa5a90-0034-4350-adfe-76aff37e73ee\\})|(\\{59c5d279-711e-4217-8e5e-1aa1497ffcaa\\})|(\\{5a3f607d-7e1a-4faf-88e2-5806d74d18d4\\})|(\\{5a6364f7-3237-462d-bd3f-7c501830ceb0\\})|(\\{5dc73bfe-4193-4390-ae50-ad928655e21f\\})|(\\{5e085187-2509-4f8f-80ed-78c06351a77a\\})|(\\{5edfb7c3-04a5-447d-9069-2093289a7b98\\})|(\\{6219dabe-8f5f-4130-a650-8cfa971d7182\\})|(\\{62c9c13b-d001-4c42-819c-31b9763973c0\\})|(\\{656da759-0ae4-4f3e-a798-8293a5df9476\\})|(\\{66d70c4a-ad30-4f3c-afb4-b498a60c49b3\\})|(\\{68cb3185-4f55-42cb-97ea-188924b1d6c3\\})|(\\{6b99e0e4-e2e8-4fff-9da5-81c0b9e92b62\\})|(\\{6de81b5e-7556-4fc4-9cac-df56e898f3bf\\})|(\\{7162613f-ea9c-48b3-a0e3-6700ea61a4c8\\})|(\\{71ef8107-d5fd-4d2c-94b7-2dcd07448622\\})|(\\{7284399c-6be5-42ff-8ddc-5cc52d46ab40\\})|(\\{7422ce07-cac7-4fe6-af6b-16f5e7e27d05\\})|(\\{76a7b38d-7044-4e36-8315-38db10506ec8\\})|(\\{7772f851-8dd4-4d96-b426-6cd9f739a599\\})|(\\{797129e6-8cc9-401e-b9fe-0fee15533e9a\\})|(\\{7a3429ae-f293-4a70-a13d-f57f153557e3\\})|(\\{7bed7063-0842-43d9-b672-5e5e55915d5d\\})|(\\{7c0220cc-89e5-4726-ada1-fa2ffa412f28\\})|(\\{7c3c79d6-7e31-4947-b9b4-dd21f461ccd4\\})|(\\{7c70cbc0-e80c-4f3b-97b2-2530c4ac1349\\})|(\\{7fc4f148-2648-40f5-bd99-d057ac1292a6\\})|(\\{808a2093-68ff-4f73-b239-0d0f105c4d98\\})|(\\{8411b8e3-e302-48a2-91ee-550102b938f6\\}))$/","prefs":[],"schema":1576757094905,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2a4b5087-eca0-43e8-96f4-6632aabd83d3","last_modified":1576771657003},{"guid":"/^((akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified)|(akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified-2563213750)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3767541208)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2330732719)|(cidchfadpgepemappcgeafeicnjomaad@chrome-store-foxified-509978031)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-558690357)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3523362862)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-850818380)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3686225023)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3659951669)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1114585181)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2593088680)|(edmdnjinnadgoalbaojbhkbognfappih@chrome-store-foxified-206569335)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3272316989)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-96331909)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2158751912)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1554953450)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-323465212)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-3112875041)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1868258955)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-611481225)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-162688242)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1394660953)|(\\{de07e1ed-1597-45f9-957d-4edc44399451\\})|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-294092903)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--2032791676)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--786206880)|(\\{76f8d31f-d1b6-4171-885e-6fcde28ca547\\})|(\\{b7492f2d-72b6-4816-83d5-9c82b3cc5581\\})|(\\{3f0fa616-3f92-42e2-ac1e-69ae7b1c7872\\})|(\\{2e324574-0761-4017-bc96-66270563e277\\})|(\\{950d03c6-722e-498d-90fc-ec9d9c1ab893\\})|(\\{6cb64844-2dca-4f29-82d1-cb59459ad824\\})|(\\{5347a8c7-a156-4455-8301-7d19d269bd2c\\})|(\\{17c69a23-df19-4655-aaa9-e8a35f186ddf\\})|(\\{381eb5ad-0f02-4146-85f4-2cc7c7a7dee4\\})|(\\{e797aab6-f3df-4d0d-89c2-320371720194\\})|(\\{91a95e76-4b27-427f-9554-7c1aa58c8489\\})|(\\{5bd5f5a3-3f30-4c90-bf5c-7ff32eae9fac\\})|(\\{e9cbcded-05e0-4cf0-9163-8507de356646\\})|(\\{4262365c-085f-4f2b-9bd7-048d7d1c90de\\})|(\\{d6d89cdf-36e4-44b5-8ea2-2283e25e99b9\\})|(\\{3ab34cbc-4a18-4fac-b629-3b10091d505e\\})|(\\{28beb080-37b1-42ec-a6e9-89cff276cc3e\\})|(\\{d83baff8-42f1-485c-bc61-0df0a2fa2834\\})|(\\{f1260949-ea01-4f69-b302-87ac898bc677\\})|(\\{f2bb825a-19b7-46ba-b759-557885e28ff9\\})|(\\{d1023b1e-87f6-49d4-b93d-80d94cafb101\\})|(\\{605bf342-f990-43b3-9053-b6ad563cc944\\})|(\\{20da0f4c-c6ee-4c4a-be76-8cb0fdd759b7\\})|(\\{29563a03-2ea3-4187-b3dc-af3027287df8\\})|(\\{9fc76cae-b6b4-45af-aa0e-81d1bf419812\\})|(\\{b83f6a6c-6bb3-492f-aad2-56a6b79a02d4\\})|(\\{4e340962-9d78-486c-8ec8-fdc8ba0448c3\\})|(\\{4f420c0e-824f-408b-8327-418934c566e9\\})|(\\{51057732-1a37-491c-afeb-dccbb18e2341\\})|(\\{ac9415c8-b978-4636-a0f6-99b75f1bfacc\\})|(\\{ba9d81ff-13da-4183-8b32-19cc18a198c3\\})|(\\{614f9cd7-d46e-47a5-bcd6-fc9cefc846ac\\})|(\\{83ab005b-85f8-4185-b500-26c78f29e470\\})|(\\{814b9b95-0470-42f5-9be1-b322ae1a300c\\})|(\\{c565d582-ef45-4ee5-a13d-e0bc544bb483\\})|(\\{bbc0a83c-ff01-4f55-beed-c8dd6256d99b\\})|(\\{00d71c76-8b41-4e12-877b-62ad742c5b5b\\})|(\\{22c15bb7-3cac-4480-ad95-8ef2b4762689\\})|(\\{4ce4a857-3ba4-46d3-83e1-424e608f8a1d\\})|(\\{638ad118-0407-437c-a657-f8bde7b0c511\\})|(\\{c35dba3d-eed7-4ee2-b7ed-b2f636810ea1\\})|(\\{7635e554-de52-4a55-81f4-5d4e7ac9e416\\})|(\\{b768c014-21ff-49c9-9a27-186e33574612\\})|(\\{e31ae098-b80a-4286-8688-8514ace2d0fd\\})|(\\{104607b9-ad49-4760-882a-5cc13164531a\\})|(\\{bf78148e-f4d1-48b7-92b2-93ca2003d619\\})|(\\{877777da-7695-4d7e-a469-2a4b4cfbe0c4\\})|(\\{b09f3de0-26c4-4790-ba8e-50a1d1725053\\})|(\\{a24b471c-9100-455c-825a-689533d24979\\})|(\\{12a8c732-c19a-468e-8be4-a16f9a27c845\\})|(\\{bad6c6a4-6108-4e44-b7e3-c05bed9d4e50\\})|(\\{1b598a16-ca58-41bf-8cc2-3741356363b9\\})|(\\{a5520fcc-b75a-4527-931b-e403aa8772ef\\})|(\\{cec7aeec-9352-4ed1-8362-8e384704ab29\\})|(\\{1bf3e066-3707-41eb-b62d-55da5bbe930d\\})|(\\{1fd8204a-f25b-47d0-bfac-35c41451e2e7\\})|(\\{ab1f1e53-9102-4f4f-a793-0a81f5669e13\\}))$/","prefs":[],"schema":1576756466412,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8258f92c-5b89-42a7-a984-dd4e94fa301a","last_modified":1576771656999},{"guid":"/^((\\{ca33d7f8-5b8c-4215-bf6e-a29b721024b8\\})|(\\{ef107eb3-c699-42ce-9310-1f36890fcac5\\})|(\\{48a3b395-8cb9-4093-b557-d967c653b13f\\})|(\\{27e7c4c8-916b-4dae-ab1d-46573fe889e6\\})|(\\{4795f211-f8b2-45b1-852c-982e1912414e\\})|(\\{000d5ed8-cf10-4929-89b5-f5369f50bbcd\\})|(\\{4b249174-1bc4-49c2-a0ca-eaa51facd4b0\\})|(\\{34d96b10-c44d-4398-9410-8d7d550d023a\\})|(\\{c067681d-dc69-4b05-8052-34fa69549aa8\\})|(\\{5b2dcc2b-08a9-4d36-a249-680a9e994938\\})|(\\{68cb60e7-4bfc-43cf-9875-f9548ad5d913\\})|(\\{ddca4204-8f9c-4e35-a8fe-47e94ffced48\\})|(\\{c5138dc7-3cf8-4117-9988-041c2a85868c\\})|(\\{140c670f-ee4d-4a16-bf83-c4012279b923\\})|(\\{d88779b5-daad-4ae8-abdc-3ff58c80da8a\\})|(\\{ab80f9f6-2a50-4074-b560-f839f1674bb3\\})|(\\{a8187405-efb6-4c1c-a9dc-e90fc064f55d\\})|(\\{f0d5c8c8-0697-4ee9-830d-3271ad125c17\\})|(\\{34e3121a-a2f2-4ada-b271-c661b8e0a215\\})|(\\{c4d8c3ad-ba8e-43e7-ae76-90521132805e\\})|(\\{ec5441c0-ddd4-4e70-8d02-92b99eb5f306\\})|(\\{ba00c2cd-f59d-44c5-984c-fbd066cdabfe\\})|(\\{b41fb99b-8e21-4eb8-b825-c6855daeb9c3\\})|(\\{c8329103-f242-4dee-9fca-b98e2e15c096\\})|(\\{59d0d43f-875f-4ebd-beeb-4dfa213a7d20\\})|(\\{9ce5d8a7-e97b-4341-bf16-c12ad44368c7\\})|(\\{e10ea3cf-17ea-4270-8602-83162b1c8309\\})|(\\{303e86df-ad8c-4a55-b921-5e2a32441834\\})|(\\{8ecebe6c-0ac5-4f3a-a32f-50b1686ee538\\})|(\\{b5150eb9-3cf8-4162-b114-56b289c45f75\\})|(\\{c04252ab-747b-4718-9d1c-bb90c72c4874\\})|(\\{976ecad8-b154-4201-a55e-4478a1651a42\\})|(\\{a0f98d44-f4b9-4726-9f01-7587ee46634c\\})|(\\{6b9c9f21-1108-4ae9-a1d8-d56566e20f13\\})|(\\{fdacc9f4-06f1-4619-bfbc-61f790e279df\\})|(\\{74d5b273-dcf7-4606-9b9d-0c5c38cbab80\\})|(\\{6fee68c0-1b38-483f-963b-43919f4ea797\\})|(\\{017a0e34-4942-47d7-a0ff-2093f14e17ae\\})|(\\{71251d4a-7ff4-4450-9459-163b911d9518\\})|(\\{6da358f8-9746-4c39-957d-b6821561b566\\})|(\\{4613ad29-db02-4d30-b857-b84a8ab412a2\\})|(\\{7993943a-0d47-4d30-8989-ce039ec1636f\\})|(\\{ac2fbafe-f182-49f0-920c-2e0d026b6c1f\\})|(\\{5f79fd50-fb20-42f1-adf5-3021aaf3f0e9\\})|(\\{a4295850-5057-46ab-bb31-2d283dff2474\\})|(\\{74517834-8cb5-4895-9f8b-3de15b771d92\\})|(\\{3dbebe53-9687-4e36-8c1e-79fcb098cecf\\})|(\\{275fc9ab-64fd-4430-8a35-43f73a87e8b9\\})|(\\{a26cdedc-b1eb-4fd2-b331-e71033c489a0\\})|(\\{d8fa69e8-1008-4f32-9db2-13ea7589bcec\\})|(\\{59704739-f6df-4272-968d-32f7c599da09\\})|(\\{208f846e-851a-4c07-a448-a66c40a2294c\\})|(\\{46c7b5ea-c1d0-4c2b-9122-3baa2e3bda3e\\})|(\\{39220be1-e69c-4b22-a5ff-545fcacf215f\\})|(\\{c0975246-6858-46e2-8f09-7d80d810c040\\})|(\\{8f284821-a420-4d79-bb7f-c1aae7a2fa90\\})|(\\{86d3e654-73c5-4b7f-a942-bd2347d4517a\\})|(\\{3d1af64b-542e-47ee-98a3-1f89bfca0f2a\\})|(\\{f0c2850d-101b-4de1-be16-3f09963048ab\\})|(\\{7388541e-8d9e-48a9-ac43-87dfdced6e87\\})|(\\{5d37398b-bea7-4ca7-bc4f-95de295be960\\})|(\\{3d8b3d51-3621-4aa5-b229-731cee83ee64\\})|(\\{ba67c9cf-ef60-4085-b6cf-729e5245089a\\})|(\\{1efe8d5d-ca8d-4a53-b2d4-a41380067041\\})|(\\{7698ee9d-345b-4395-b9e7-0479ed91f98d\\})|(\\{5f233e13-1892-41b6-81c6-a26c702d4a09\\})|(\\{d569420c-50a6-4082-b6d9-41c7bcb33464\\})|(\\{e406fddd-5ba4-4fdc-aa46-d556f97c8ef9\\})|(\\{29066f7e-a4ed-40b1-a02d-38ddf25d9533\\})|(\\{57e3e757-ca29-440c-9ef8-864da0e7ee72\\})|(\\{1237079a-7a08-4660-8fdb-6c3fdcecc787\\})|(\\{60429834-7a98-45e7-b525-6f31d55bbb3c\\})|(\\{bb850649-4ada-4735-a861-072ce9b647dd\\})|(\\{dfb103ab-cfee-49cd-b33a-e134367408c5\\})|(\\{24a0a50a-15d2-4806-9226-78491b3e986c\\})|(\\{2eb4b76a-f057-4d14-8d63-a5afa3571158\\})|(\\{cb5ad67a-5304-4351-bb15-530b159fa1f7\\})|(\\{0bd8bfda-24f5-4652-a434-664621e04a36\\})|(\\{f249d964-ac83-4059-893a-c3c5b38cc746\\})|(\\{94ba7f66-aef6-4590-8044-03aa705a4a2b\\})|(\\{dd178abb-e6fb-4e0a-b242-a64a53b24fb5\\})|(\\{7ff1da48-ae61-45f1-bcbf-2c22b4571d58\\})|(\\{d01909f7-598b-41b0-8907-2a9815c5c457\\})|(\\{93a37679-eb92-4eec-93b2-7bf77b0f94ca\\})|(\\{3ff7ce60-fbe5-4a50-9733-a347a02f09e5\\})|(\\{f076d6ff-1daf-42f3-b485-5b54b13aaf3e\\})|(\\{571d827c-5c84-42cc-8386-9e12abb8209a\\})|(\\{f6515794-8d44-402c-9a3d-3d712cb437bb\\})|(\\{796a59ab-77a7-4add-9481-5c7deee7c037\\})|(\\{a9b99a24-6cc1-491a-a81b-946cb42bc9f2\\})|(\\{9767896a-9561-426e-90d1-03b884d34eda\\})|(\\{95a6ebd9-52bc-4859-b92f-70a7c103e2b8\\})|(\\{4d24059d-463b-40b0-a86a-0a1de38fccb9\\})|(\\{d7c03c15-7287-4fb0-add0-c49744b48410\\})|(\\{6074519d-2d7c-45b6-b239-ea5452e93140\\})|(\\{425dafa9-0997-48df-b971-623847853747\\})|(\\{847688e9-b1d7-4607-b4fd-44c2365c01ba\\})|(\\{1383930d-64e9-4c3d-a629-361c70e3cd26\\}))$/","prefs":[],"schema":1576756857135,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72593718-af38-4f63-bcb9-7c6afd13de8f","last_modified":1576771656996},{"guid":"/^((\\{9aa1f441-7c04-4b00-83b2-6a4362090b41\\})|(\\{3001d016-bc15-49af-a81b-2c8764139321\\})|(\\{0af1d242-b004-49ae-91fc-00fa0f642bf9\\})|(\\{95a5a094-ba8e-4fe1-80bb-6f6c0a01bc2c\\})|(\\{36b33158-36fc-4728-bf08-8e532100af58\\})|(\\{5bda1d03-6533-4d8c-adb4-7179402ddeec\\})|(\\{dc7d18c8-c832-42cd-b9b0-f6a46a737ad1\\})|(\\{56d85baf-c366-491b-b93c-733a4a36009d\\})|(\\{1b08c0c7-d2fd-4905-82ab-d4d759af4051\\})|(\\{1b8a9b33-b3d9-42ea-adce-cec910c44f29\\})|(\\{0be707e8-d7d6-45d5-8212-3fd3784d7de7\\})|(\\{fb2e3c38-be42-480f-b60c-d614d372e218\\})|(\\{c088d705-9f59-40ac-98eb-192f67c44f03\\})|(\\{9570bbbd-d761-4380-850c-d9cc15200916\\})|(\\{2652d5a4-26b1-4e6f-9134-304d7b57af7a\\})|(\\{1e0a2a5f-170c-43c1-b458-c8fc8bdd7dec\\})|(\\{47595710-e0b3-4a88-9bf7-54e1f3bb6772\\})|(\\{c25a320e-dc50-486a-9589-13ef22f75a21\\})|(\\{645237c8-7da2-4298-a789-e11fbaaa580e\\})|(\\{f2356af6-9b9d-4c69-876a-710d446a9124\\})|(\\{98a67ccd-599a-4675-9578-35af1824fdd2\\})|(\\{f3924f49-64a3-4fde-8598-76eec8e67f34\\})|(\\{2a46402d-b6c4-4a0b-87f0-dc90bb24fa93\\})|(\\{40d92297-295d-4a44-8a0f-dd69510c9c30\\})|(\\{a5462b0d-6528-47d5-ada5-4a23d1e0355e\\})|(\\{280f7325-eaf0-451a-ad2d-3b2c4e80e070\\})|(\\{ee5a7045-e216-4836-949a-07f5aa1dabc3\\})|(\\{34ee38f4-e2ba-4e9d-8b1f-dd06e8bd205f\\})|(\\{7c71c234-ba74-467c-b750-727ee7e38382\\})|(\\{a83b3b31-4bfc-4343-beab-761f21b97f57\\})|(\\{b85d35a4-3a03-430d-a1a0-437448a86c22\\})|(\\{8b6c1e29-5009-477e-a798-244b0efb1515\\})|(\\{64891348-7fc0-4299-bd6a-6bfaa6cf21a6\\})|(\\{baa828ff-1723-483b-8034-145ad2795efd\\})|(\\{81fd4851-7ea3-4ea5-8775-49372fe1c8c8\\})|(\\{ce7d8e95-c7d3-49dc-8abf-e860ee707b09\\})|(\\{d84109e8-9945-48bc-90e8-0dd0b1b63b73\\})|(\\{ec12fd66-7294-4167-8fbc-4774150c0fa4\\})|(\\{0c506de9-8467-4a92-8cd3-11c87e121db2\\})|(\\{b1671fe5-c90a-4f68-b8bf-e54a147b5d05\\})|(\\{8b25277a-4df8-4d2d-b3b4-f8219e2ce7d6\\})|(\\{5705cd04-46c2-459f-8a9a-97ce57eee1ae\\})|(\\{8340b371-ed61-4b07-b293-853aa5dbb866\\})|(\\{87bbb065-e195-48ac-989e-ba48ee63b404\\})|(\\{c455fc20-6e9d-418c-9b45-75fd85852b32\\})|(\\{a80c87a7-3366-4192-b9cc-d1e862e1c13d\\})|(\\{5f4ba05c-c1a5-4bc7-b8d3-c14e807b2c64\\})|(\\{0114315a-beda-4d55-89a3-e00f6346e7be\\})|(\\{0fb7b987-721e-4828-9a0e-a72860ded1b2\\})|(\\{c44cd2a5-bf28-4520-ab2d-187752e51a26\\})|(\\{3a34c1a6-3cbf-49a0-bfe9-beff60da5ec6\\})|(\\{677e89a4-ae10-42f3-8e9d-d51be40daf8f\\})|(\\{85d70eae-fde6-4ac0-ab82-0148f2eb1543\\})|(\\{fddac013-6d12-41a4-9924-f5ea7618f22d\\})|(\\{84b5ca75-a431-45c7-995d-6d7268decd0d\\})|(\\{7374dd37-a901-4b65-993c-3323f87e0f3c\\})|(\\{157a5c60-7899-4328-a90c-83d34d0844d4\\})|(\\{5b288e8d-f33c-4602-a945-07f96e43a041\\})|(\\{80f059bd-602a-42d5-9b17-9f2c6a074102\\})|(\\{8e5a8075-8e21-4ab2-b189-5d435208122c\\})|(\\{d5b94c09-0ff8-4b86-b52a-590d5e5ad9af\\})|(\\{a569eb31-9456-49a9-9aa9-e69a8db159d3\\})|(\\{0431a147-f9f5-4ee3-8dca-57303110c226\\})|(\\{88c77421-5ebd-46fb-92a8-e0459b6edd20\\})|(\\{a4a0697d-9a01-4b21-bb88-5ac949cdb7b3\\})|(\\{03e0da0a-da1d-46f2-85c7-08258189fc04\\})|(\\{351f5a4d-a0fd-4ce7-a85a-6cb74fb6c57d\\})|(\\{0e0b22ea-831e-4104-9c2e-612d7ebf82e2\\})|(\\{7b5c604f-ea41-4bfa-88d1-843f27645199\\})|(\\{863f023c-a2e5-4043-8e49-8e3029004b19\\})|(\\{20e4b367-f8ad-4c9a-b590-976be87206aa\\})|(\\{436ca3ce-f10a-4cdc-86c2-a46f086b5fdb\\})|(\\{a53983bc-545e-429a-8aaa-6332e1a6287f\\})|(\\{5fb1995e-ac7e-4c01-a592-8b262856e039\\})|(\\{56086da0-b20d-4118-9670-56e85624c875\\})|(\\{67ef5673-5769-4d5b-902f-ba22cb16a51b\\})|(\\{1d50e81b-0594-4c24-80c2-abc479be4d18\\})|(\\{b190f2cf-f3f0-40e7-a05b-8eed296a0c8d\\})|(\\{490d8bfc-fd42-4ded-9fee-1f009e777468\\})|(\\{1d647c69-8e4b-4fe8-b0f3-d914a1410ee8\\})|(\\{4958ae27-1251-49b4-a9d4-2af7c36c833b\\})|(\\{6e80fdc3-79c7-423a-8e95-0e123c0f2187\\})|(\\{d8d3230d-5642-4c3f-a64e-5ff690f7a466\\})|(\\{ddbe5d7a-e037-4749-89bc-3460d358aca1\\})|(\\{48cd023c-52ef-4fe7-a2ff-101c22c49a5e\\})|(\\{fef34931-b7ca-49a5-8827-bec353efaa08\\})|(\\{331a936b-a87e-4271-b9a6-30935dad77ed\\})|(\\{21084437-803c-49c3-8f84-9a615bfa5dfe\\})|(\\{93511e9d-badf-4b5c-9fbc-17ef6a9786ae\\})|(\\{470e388e-a039-43f8-a7a7-d8f54d273feb\\})|(\\{e4cd5604-caec-4139-9781-94add5f41ba3\\})|(\\{f00bc2b9-2b69-4f68-8bef-91d498686731\\})|(\\{7b3206c4-dc98-4ad9-88ba-5a7b3048fd92\\})|(\\{8e19f5f7-2445-48b1-8910-55d42d9dfe34\\})|(\\{770e30c6-f1b9-4df4-8551-c7f09ddbd8ed\\})|(\\{bb9a8679-1f82-4ab7-8ea2-bac864a38542\\})|(\\{13f5e078-b80a-45fb-a907-c4515a7bb0fa\\})|(\\{d8df47e3-5e86-4669-9a15-a37f8a8593db\\}))$/","prefs":[],"schema":1576756624851,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f945be6-12e7-4948-af77-668bc3996ff3","last_modified":1576771656992},{"guid":"/^((_0dMembers_@www\\.myaudiotab\\.com)|(_12Members_@free\\.myscrapnook\\.com)|(_14Members_@download\\.totalrecipesearch\\.com)|(_1cMembers_@www\\.bringmesports\\.com)|(_29Members_@www\\.headlinealley\\.com)|(_2bMembers_@www\\.bettercareersearch\\.com)|(_2jMembers_@free\\.recipehub\\.com)|(_2jMembers_@www\\.recipekart\\.com)|(_2vMembers_@www\\.dailybibleguide\\.com)|(_39Members_2@www\\.mapsgalaxy\\.com)|(_49Members_@www\\.utilitychest\\.com)|(_4jMembers_@www\\.radiorage\\.com)|(_4lMembers_@www\\.bibletriviatime\\.com)|(_4zMembers_@www\\.videodownloadconverter\\.com)|(_57Members_@free\\.marineaquariumfree\\.com)|(_5aMembers_@download\\.mywebface\\.com)|(_5eMembers_@www\\.translationbuddy\\.com)|(_5mMembers_@download\\.myfuncards\\.com)|(_5pMembers_@www\\.metrowhiz\\.com)|(_64Members_@www\\.televisionfanatic\\.com)|(_69Members_@www\\.packagetracer\\.com)|(_6xMembers_@www\\.readingfanatic\\.com)|(_73Members_@www\\.easyhomedecorating\\.com)|(_7eMembers_@www\\.homeworksimplified\\.com)|(_7jMembers_@download\\.gardeningenthusiast\\.com)|(_7nMembers_@download\\.crazyforcrafts\\.com)|(_8eMembers_@download\\.howtosimplified\\.com)|(_8hMembers_@download\\.allin1convert\\.com)|(_8iMembers_@download\\.audiotoaudio\\.com)|(_8jMembers_@download\\.myimageconverter\\.com)|(_8lMembers_@free\\.filesharefanatic\\.com)|(_94Members_@www\\.motitags\\.com)|(_9eMembers_@free\\.findmefreebies\\.com)|(_9pMembers_@free\\.onlinemapfinder\\.com)|(_9tMembers_@download\\.internetspeedtracker\\.com)|(_9tMembers_@free\\.internetspeedtracker\\.com)|(_apMembers_@free\\.puzzlegamesdaily\\.com)|(_b7Members_@free\\.mytransitguide\\.com)|(_beMembers_@free\\.dailylocalguide\\.com)|(_brMembers_@free\\.yourtemplatefinder\\.com)|(_ceMembers_@free\\.easypdfcombine\\.com)|(_chMembers_@free\\.discoverancestry\\.com)|(_d0Members_@free\\.gostudyhq\\.com)|(_d1Members_@free\\.mysocialshortcut\\.com)|(_d9Members_@www\\.everydaylookup\\.com)|(_dbMembers_@free\\.getformsonline\\.com)|(_dgMembers_@free\\.trackapackage\\.net)|(_dhMembers_@www\\.packagetracking\\.net)|(_diMembers_@www\\.easymaillogin\\.com)|(_djMembers_@www\\.emailfanatic\\.com)|(_dnMembers_@www\\.webmailworld\\.com)|(_doMembers_@free\\.convertanyfile\\.com)|(_dpMembers_@free\\.findyourmaps\\.com)|(_dqMembers_@www\\.downspeedtest\\.com)|(_drMembers_@free\\.downloadinboxnow\\.com)|(_dsMembers_@free\\.internetspeedutility\\.net)|(_duMembers_@free\\.funpopulargames\\.com)|(_dvMembers_@www\\.testinetspeed\\.com)|(_dxMembers_@www\\.download-freemaps\\.com)|(_dzMembers_@www\\.pconverter\\.com)|(_e1Members_@free\\.actionclassicgames\\.com)|(_e5Members_@www\\.productivityboss\\.com)|(_e6Members_@www\\.freelocalweather\\.com)|(_e7Members_@free\\.gamingassassin\\.com)|(_eaMembers_@www\\.mynewsguide\\.com)|(_ebMembers_@download\\.metrohotspot\\.com)|(_ecMembers_@www\\.instantradioplay\\.com)|(_edMembers_@free\\.myradioaccess\\.com)|(_eeMembers_@download\\.freeradiocast\\.com)|(_efMembers_@free\\.funcustomcreations\\.com)|(_ehMembers_@free\\.dailyrecipeguide\\.com)|(_eiMembers_@www\\.100sofrecipes\\.com)|(_ejMembers_@free\\.downloadrecipesearch\\.com)|(_ekMembers_@free\\.biggamecountdown\\.com)|(_eoMembers_@www\\.transitsimplified\\.com)|(_erMembers_@free\\.getvideoconvert\\.com)|(_esMembers_@free\\.downloadmanagernow\\.com)|(_euMembers_@free\\.filesendsuite\\.com)|(_ewMembers_@free\\.mergedocsonline\\.com)|(_exMembers_@free\\.easydocmerge\\.com)|(_f7Members_@download\\.smsfrombrowser\\.com)|(_fdMembers_@wallpapers\\.myway\\.com)|(_fkMembers_@free\\.getflightinfo\\.com)|(_foMembers_@free\\.flightsearchapp\\.com)|(_fpMembers_@free\\.passwordlogic\\.com)|(_frMembers_@free\\.testforspeed\\.com)|(_fsMembers_@free\\.pdfconverterhq\\.com)|(_ftMembers_@free\\.mytelevisionhq\\.com)|(_fvMembers_@free\\.directionsace\\.com)|(_fwMembers_@free\\.howtosuite\\.com)|(_fxMembers_@free\\.mytransitplanner\\.com)|(_g3Members_@free\\.easyphotoedit\\.com)|(_gcMembers_@www\\.weatherblink\\.com)|(_gpMembers_@free\\.mymapswizard\\.com)|(_gtMembers_@free\\.gamingwonderland\\.com)|(_h2Members_@free\\.calendarspark\\.com)|(_hbMembers_@free\\.quickphotoedit\\.com)|(_hfMembers_@free\\.everydaymanuals\\.com)|(_hgMembers_@free\\.atozmanuals\\.com)|(_hmMembers_@free\\.easyweatheralert\\.com)|(_hnMembers_@free\\.quickweatheralert\\.com)|(_hoMembers_@free\\.directionsbuilder\\.com)|(_hpMembers_@free\\.easyfileconvert\\.com)|(_hqMembers_@free\\.scenichomepage\\.com)|(_hvMembers_@free\\.myfileconvert\\.com))$/","prefs":[],"schema":1576757193463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b799430-d1a3-49a8-91a2-f45069528ebe","last_modified":1576771656988},{"guid":"/^((\\{02cfe44d-20d1-4275-b325-42888248443d\\})|(\\{03476021-f140-425d-8e62-a6455206a874\\})|(\\{0a50fe22-313f-4a59-9032-2fd63bdd2815\\})|(\\{21c91802-e348-4dd0-820a-07aca1de12a5\\})|(\\{24f43a02-83c5-44cd-a611-0bae2093393f\\})|(\\{257284b0-be1d-44e4-8321-b2a7a56c2eb5\\})|(\\{2610c188-123a-4e4f-a6c7-2ed7e8b70bf6\\})|(\\{26a28ba8-d8e3-4284-ab58-8542144ff657\\})|(\\{27e8838f-91ab-486b-8851-9de8bd633aac\\})|(\\{27f348a5-adb0-4037-bc03-f6832cfd6fc3\\})|(\\{28f5d824-8067-4859-8fe3-22a5f96552bc\\})|(\\{32f66767-230f-4dd8-8538-d6dca8b327f6\\})|(\\{35a35db0-010b-4105-9dc3-d5fe761023ab\\})|(\\{3d61019d-c636-4c0d-91d2-6e2d734014e0\\})|(\\{44c9b9cf-b960-45fc-bf0a-9be9c455c975\\})|(\\{48e711a3-644f-4520-8205-11b377df480e\\})|(\\{50ba963f-1b4a-4ed0-b22f-8e1c18d17364\\})|(\\{53150391-1080-4a50-96ed-de24a6ea24c6\\})|(\\{5570199f-fc69-45eb-a0b0-7cc60089022c\\})|(\\{595c83ad-5a64-4740-a118-39a49aede0e3\\})|(\\{5ae5110f-449e-4c5e-b247-9d1e9971d3bc\\})|(\\{61b734ef-f886-4466-8525-8276e9b19b55\\})|(\\{64e9998b-c477-4c29-bf1d-945146cf9376\\})|(\\{682ff4d6-9b2b-4e1b-99b0-e2dcc2476bd1\\})|(\\{6836a626-1ec1-4c3c-9b25-5e4cd5048ad5\\})|(\\{69f1dda4-a6fa-49f6-a16c-7b3bc3e0e520\\})|(\\{6b7eb4f0-ef7d-4da4-8c3d-21b7c2dfb19f\\})|(\\{725f919c-8adf-4192-9c0e-89ab1027161e\\})|(\\{7320730b-e202-4405-8d76-97a862239701\\})|(\\{79821b50-57ca-4267-9dbf-84aeb061e126\\})|(\\{7ee25d12-df90-4a6a-a068-7a6919651bc7\\})|(\\{816b4ade-7b69-4a73-994a-b37f9939d5d8\\})|(\\{82956d74-9e19-4770-97cc-73caa2c9f711\\})|(\\{839b2467-6857-49f9-a730-baf7b2a98039\\})|(\\{85af3203-f8a3-4ba5-8d0f-c3ee1d38c0d8\\})|(\\{8866f414-2f72-44a6-b7dc-6959891e9ee3\\})|(\\{914f8b0b-f4e0-46d5-bae6-4fadd78ebe8c\\})|(\\{93969099-a7b4-43aa-bcc0-241676204257\\})|(\\{972315f7-e09e-4f7d-b4d7-1ed093e06dc0\\})|(\\{98c7dc13-2e24-4ea0-8f02-34a2e19f19f1\\})|(\\{99ca0fea-aa27-42b9-9dfb-5c2b02601d30\\})|(\\{9cd8f1f0-b739-427a-9378-16dee329a2b6\\})|(\\{9f0a0293-94ca-4e27-b697-2032f455a12f\\})|(\\{a41f8d9a-ea42-4d59-8966-5f9e805246a5\\})|(\\{b21eea41-def0-4ab6-afe4-ec98397bf59c\\})|(\\{b7561855-e073-4a3a-b827-33bd97042442\\})|(\\{b8b11c35-1c11-4634-9b20-6aff2344a65d\\})|(\\{b90bc248-5b37-4de0-be18-0f208c5cf958\\})|(\\{be17a3b2-18a6-4925-aa7c-bb377bec7793\\})|(\\{be82443f-f8e0-46eb-8cda-80ff1d911a16\\})|(\\{ccce69c0-3cc6-4e63-acb6-77a7c63772ed\\})|(\\{daf9a25c-83b8-4e4b-aca2-ff7ca55289d3\\})|(\\{db7d9d1b-1758-44a0-a8fb-0eb2f3ac4d36\\})|(\\{de34ccf4-0634-4ba2-9bdc-42b293c8cdc8\\})|(\\{df2bbd0f-0a8a-45de-a75b-4349835a8576\\})|(\\{e203bc10-6462-49e6-8f2f-223a29ce82d7\\})|(\\{e66e26fe-5092-4fbd-9851-78a1f5c34575\\})|(\\{ebaf7169-6df9-463f-bf15-10f48143bf73\\})|(\\{ebe3c932-d6fe-4ad7-9eb9-7857aa6fd1ca\\})|(\\{f83c3eae-8dd8-4f38-b7c0-272e34599771\\})|(\\{fb00fead-b480-4906-8b4c-4039c272b83d\\})|(\\{fc14529e-1b64-4717-8a1f-6634cc343c7c\\})|(@blackfridaystores)|(@blackfridaystoresco)|(@blah)|(@celebjunky)|(@checkmaps)|(@childt)|(@convertmypdf)|(@convertmypdfco)|(@dailyjobssearch)|(@dogs)|(@email\\.superextension\\.info)|(@flirtywallpapers)|(@justlovepetscom)|(@liveemail)|(@localweathertoday)|(@localweathertodayco)|(@loginpro)|(@mapsfinder)|(@mynetspeed)|(@mynetspeed\\.co)|(@mynetspeedco)|(@qwertyuiop)|(@qwertyuiopasdf)|(@searchprivacy)|(@searchprivacy-fx)|(@searchprivacy-fx-1\\.1\\.15)|(@searchprivacy-fx-1\\.1\\.16)|(@searchprivacy-fx-1\\.1\\.17)|(@searchprivacy-fx-1\\.1\\.18)|(@searchprivacy-fx-1\\.1\\.19)|(@searchprivacy-fx-1\\.1\\.20)|(@sportsbulletin)|(@sportsupdates)|(@thecouponstore)|(@trailertab)|(@wheresmypackage)|(@wheresmypackageco)|(@www\\.blackfridaystores\\.co)|(@www\\.convertmypdf\\.online)|(@www\\.convertthepdf\\.com)|(@www\\.dailyjobssearch\\.net)|(@www\\.easyonlinerecipe\\.info)|(@www\\.EasyOnlineRecipe\\.net)|(@www\\.easyrecipesearch\\.net)|(@www\\.findmaps\\.co)|(@www\\.job-portal\\.co)|(@www\\.justlovepets\\.online)|(@www\\.movie-quest\\.co)|(@www\\.mymapbuddy\\.net)|(@www\\.mynetspeed\\.co)|(@www\\.searchsafe\\.online)|(@www\\.searchsafe\\.site)|(@www\\.searchsafe\\.space)|(@www\\.searchsafe\\.website)|(@www\\.thecouponstore\\.co)|(@www\\.thecouponstore\\.co\\.test2)|(abc_KtOQLgxUgW@abc)|(Access_Mails_Now_YEsNTbvoal@www\\.accessmailsnow\\.com)|(Access_My_Inbox_zPsghWWAPc@www\\.accessmyinbox\\.com)|(Accurate_Weather_Today_clone_vGXzNgIjwr@www\\.accurateweathertoday\\.com)|(Accurate_Weather_Today_clone_zpRLPSpMcU@www\\.accurateweathertoday\\.com)|(alot_Search_unSoxsuUZQ@www\\.searchalot\\.co))$/","prefs":[],"schema":1576757781685,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0be3662-6b8f-4d91-bbe1-fde9500adb48","last_modified":1576771656985},{"guid":"/^((\\{a4b95555-755a-4a3f-bc64-f6999377963d\\})|(djamol@webdownloader)|(\\{b23e59ff-5491-40f4-adb2-577d31d8778a\\})|(\\{90e41842-755d-40e0-9136-8129df55a644\\})|(\\{8e0ccf87-6ea4-4985-b07f-4d503f105d91\\})|(\\{69d0ae35-7d39-4c41-b455-4d751117317e\\})|(\\{df0dfe82-78a9-456e-9dc1-c832a94d43a7\\})|(\\{7bbd26d9-d245-48d3-b3a6-5e19948dfa14\\})|(\\{3d9109d8-463e-4dde-9416-d25c6ea995df\\})|(\\{2726adf8-c1f9-4ed9-baf1-9a3c1742b659\\})|(\\{bfc40cf5-a085-4f0b-a3ef-5e124f2e445e\\})|(\\{37927c18-d5a5-4187-9e6e-6a787364bd9f\\}))$/","prefs":[],"schema":1576093292597,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603731","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b8daa919-7a9f-4a83-8aef-4a5d3fbfb502","last_modified":1576242123974},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e15}","prefs":[],"schema":1576032043088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603086","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3774104-d770-48a5-acd7-c7136d62bb40","last_modified":1576068160484},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e14}","prefs":[],"schema":1576012075125,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603001","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8c92ab3a-9c31-4f75-b980-19e39b702fd8","last_modified":1576032042722},{"guid":"/^((\\{108dfe62-0473-47cd-b33e-8270d062db77\\})|(\\{e4a4e54a-5d49-4ac3-93d7-ec0d30ad06ef\\})|(\\{ccad95df-add6-4d8a-aa5c-cdc484075bad\\}))$/","prefs":[],"schema":1575996881649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602162","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fd42cd0b-a72a-4a0f-9a6a-965ee2f29cb6","last_modified":1576012074754},{"guid":"{7bb202fa-9247-49c6-898c-ce0d36bc44e3}","prefs":[],"schema":1575976576210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602821","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MyPopupBlocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"810f4d41-368a-4cfc-8513-81063587b97c","last_modified":1575996881281},{"guid":"@cloaking-skull","prefs":[],"schema":1575920492132,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602736","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Cloaking Skull"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4438f49a-2f78-48d9-bc7e-a897f3f62945","last_modified":1575976575848},{"guid":"/^((photoplus@4329fgjfdgkf343\\.com)|(\\{1b1c9b32-9dd3-461c-85c6-bbac4ef2af10\\})|(\\{7DC6D86C-EA66-48C3-9BA7-AE26A8ECB175\\})|(david\\.janitzek@gmail\\.com)|(\\{ac393d9e-1610-4eaa-8951-77655f98b4f7\\}))$/","prefs":[],"schema":1575890870070,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602406","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa154bb5-7fc9-4226-928e-199aa7eded69","last_modified":1575892910839},{"guid":"/^((\\{e1d407bc-1986-4577-bc31-a63d07cbae10\\})|(\\{3a2831f6-37df-4a42-baf6-0b81d5b6a68f\\})|(s3google@translator))$/","prefs":[],"schema":1575889775993,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602293","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3 Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eac7bf16-aae5-4958-8b85-5dcc9a3a1ce8","last_modified":1575890869693},{"guid":"/^((\\{87dd9a06-b692-4fa0-91c4-0aead43c25cc\\})|(\\{9082269e-1de7-4d34-9736-1174917f9459\\}))$/","prefs":[],"schema":1575747691126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602285","why":"These add-ons violate Mozilla's add-on policy by executing remote code and/or collecting ancillary data.","name":"HomeTab/FLSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1af528d2-d0e1-4981-acfa-3b10501aed34","last_modified":1575889775630},{"guid":"/^((xh5yh45p59fdrtimlot6@xh5yh45p59fdrtimlot6\\.com)|(758ct3wkmbrvd8equs21@758ct3wkmbrvd8equs21\\.com))$/","prefs":[],"schema":1575661660854,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602098","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"235d9439-305c-48db-a6da-5a8639ab9c80","last_modified":1575663903042},{"guid":"{ecc522ab-9926-4dc5-90ab-8f979db871ed}","prefs":[],"schema":1575651664337,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602087","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YTMP4DL"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01645c30-87fc-4332-9c94-255ef9e50120","last_modified":1575661660491},{"guid":"/^((\\{81f244fc-e5ab-4233-bad0-f61f334dcd43\\})|(\\{98222415-4241-4b89-b81d-651c1a872881\\}))$/","prefs":[],"schema":1575628797035,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601546","why":"This add-on violates Mozilla's add-on policies by facilitating access to malicious web content and software.","name":"Video download add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"404e3032-80a6-43f5-a02e-c7d4e8f684d5","last_modified":1575632376941},{"guid":"{c5b1783f-29c8-4bb0-ab8b-a6a9a0c5e4e0}","prefs":[],"schema":1575627603102,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601747","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Download faster music (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ef1c681a-ecca-4ea0-b798-6a093765b984","last_modified":1575628796682},{"guid":"/^((smartnav@navigation-internet\\.com)|(game@ultimate-cosmo\\.com)|(update@ultimate-cosmo\\.com)|(extension@gum-gum-streaming\\.com)|(extension@one-piece-fighting\\.com)|(extension@manga-vf\\.fr)|(adblock@gum-gum-streaming\\.com)|(adblock@manga-vf\\.fr))$/","prefs":[],"schema":1575313586028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600592","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0b0c648b-1f8d-49f4-bd6e-96e69bbebb45","last_modified":1575376981463},{"guid":"/^((\\{33a89146-6b66-4834-bea3-18733d7646f8\\})|(\\{55f304c0-a431-4b35-8cd0-472569a9dd86\\})|(\\{581fae86-7847-448d-9950-5a96127b293a\\})|(\\{9f2a514d-e9dd-4bd6-b743-b15492c10167\\})|(\\{28bf22b4-d52d-4d8a-b710-3868b3bc46ce\\})|(\\{3e9246fc-8125-499b-984e-a8b68507bd36\\})|(\\{731784b0-81c4-4fe9-8741-f5960e12088c\\})|(\\{21585a0f-bcb6-480c-9f70-5cd33cf64833\\})|(\\{2741fd42-3faa-4cef-9b08-361f0c4990ea\\})|(\\{4c479c80-2f53-4d38-a366-0f0c3a346d40\\})|(\\{c4471705-e0eb-47ed-8af9-046c1e808fdd\\})|(\\{2b2bc8ab-5a38-4a26-8ce1-2af9fa2ad7bf\\})|(\\{6840b587-8324-44a0-b176-56d15580dde4\\})|(\\{44d8d882-f6a0-4349-93bc-d3a2353a3fd3\\})|(\\{ddf7716b-badc-417c-b3ce-6322fd67cc65\\})|(\\{82abdf82-f361-47ab-bab7-7f862e132e06\\})|(\\{d24e0155-d36c-402e-943f-d5816451e86f\\})|(\\{926f1f58-3c6e-4f07-8847-2998dc0f1dbd\\})|(\\{e8d228cc-ecb9-4ef6-98e3-8052858fd3ea\\})|(\\{86a868c9-707f-46e8-88ca-5edde6a549e2\\})|(\\{7d5a68c2-261f-449f-af8d-b99a7ae7a01f\\})|(\\{e579c6fb-bf80-4ae5-b3d2-613e084af7fa\\})|(\\{ef7a3832-deb4-4798-b61b-a7cc8b8aa1e2\\})|(\\{48532584-e4dc-4902-b27d-ce35cb29c4c7\\})|(\\{b792fe29-4eb1-412b-bd0b-458252dfab39\\})|(\\{c6f8a307-8024-4e6f-a5f1-595ba43d765e\\})|(\\{7c7a26bd-b1cb-4088-a16e-48f26d22d569\\})|(\\{ff3b2825-86da-4525-abe6-c673b70f58cc\\})|(\\{d4def0be-0d09-453a-9cca-ddc1e1cc9a1d\\})|(\\{0024b95a-9610-4e9d-b836-da40c99c959e\\})|(\\{b09a0797-b6d2-485e-8afc-8361055761ea\\})|(\\{f5c86ae7-cf67-43f8-895c-b2b19209ee81\\})|(\\{bc5d5c2b-e895-49d5-966b-cd1aaee9d324\\})|(\\{a6a8b5c9-45da-457e-990c-b89515139e80\\})|(\\{6d00e6c8-2f26-4dad-81e6-888c080ddfc7\\})|(\\{8f4412a8-c670-4298-a0bc-da30dc3a5ae2\\})|(\\{912d27f7-d9ac-489b-8d7c-2873526e11fc\\})|(\\{3d47bef5-277d-4f06-8ad8-802266e57d17\\})|(\\{0e0bbc6c-914e-47e2-96b9-33f94af6f0a7\\})|(\\{e0f289e7-1284-496b-aa09-f052089d61a3\\})|(\\{64832a69-731b-4481-ad59-3c8aa4006643\\})|(\\{c174dc42-ad4e-4378-8f07-8a47025f8407\\})|(\\{28753278-896f-4f48-8ef3-ea3379896a40\\})|(\\{cdb22d53-d13d-4500-af92-7e653e988722\\})|(\\{65d037b6-c44d-49c5-aa10-a947940c61cb\\})|(\\{d4906685-5b71-49a8-92b5-76f19f2b0a66\\})|(\\{2bebc776-9ee0-47c8-9c99-0351b140ffd2\\})|(\\{58d56295-8d0f-4fe1-8538-2d916911e304\\})|(\\{19283d7a-9fb5-417e-9401-b952ce14a268\\})|(\\{7338a117-ff10-4862-8992-b42829b2e47b\\})|(\\{8defb767-abf1-4d39-88df-9cfc6a39a8e3\\})|(\\{15a77f39-2b56-46b5-b5d6-6064a6f1fbdd\\})|(\\{87fd9298-3176-400b-be06-45538ecd0702\\})|(\\{cda1cc52-9961-477d-8faa-95c7f9025498\\})|(\\{c8056cfe-0bd7-43db-88ae-468f78cc8637\\})|(\\{54bf103a-3f38-43aa-b1ed-2ccbcadb4e0b\\})|(\\{bb67004c-57d6-4632-bc89-8991560a011f\\})|(\\{2902f9ee-b79a-415f-99bf-b661c2bf42e0\\})|(\\{81e0bd24-a93d-4db0-8db9-d5560805c153\\})|(\\{3004ff5d-c68c-4e2b-80b4-2dc21bde9195\\})|(\\{25bcebd4-1d72-4502-8927-a1a6ac35d595\\})|(\\{0b440d2f-8a97-4d2e-bacb-703260897903\\})|(\\{7d0cc577-51fb-4994-8926-7df70f5f16fc\\})|(\\{a6c138fd-c83d-416b-90a8-74bfafefb67a\\}))$/","prefs":[],"schema":1575229292065,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600576","why":"This add-on violates Mozilla's add-on policy by collecting data without user disclosure or consent.","name":"Add-ons collecting data without user disclosure or consent"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"80a34f3f-1f4e-47cb-99a4-1b343b322455","last_modified":1575285295616},{"guid":"/^((_qdMembers_@extmys\\.mysearch\\.com)|(_qjMembers_@www\\.taxcenternow\\.com)|(_ohMembers_@www\\.whizds1\\.com)|(_opMembers_@tvhero\\.thewhizmarketing\\.com)|(_oqMembers_@sportsaddict\\.thewhizproducts\\.com)|(_ooMembers_@yourdailytrailer\\.yournewtab\\.com)|(_olMembers_@screendream\\.yournewtab\\.com)|(_orMembers_@sporthero\\.thewhizmarketing\\.com)|(_osMembers_@gogamego\\.thewhizproducts\\.com)|(_r3Members_@www\\.mysearch\\.com)|(_ojMembers_@www\\.whizds2\\.com)|(_flMemberstest_@free\\.myformsfinder\\.com)|(_dqMemberstest_@www\\.downspeedtest\\.com)|(_flMembersAlt_@free\\.myformsfinder\\.com)|(_dqMembersAlt_@www\\.downspeedtest\\.com)|(_rcMembers_@www\\.extsb\\.searchbetter\\.com)|(_piMembers_@install\\.mysporttab\\.com)|(_phMembers_@install\\.streamfrenzy\\.com)|(_pfMembers_@install\\.myvideotab\\.com)|(_qxMembers_@install\\.utili-site\\.com)|(_qyMembers_@install\\.cryptoconvertertab\\.com)|(_r4Members_@install\\.salah-time\\.com)|(_r9Members_@install\\.speed-exam\\.com)|(_rbMembers_@Install\\.movie-canal\\.com)|(_poMembers_@www\\.linkuryds1\\.com)|(_l9Members_@www\\.plaskodss3\\.com)|(_ppMembers_@www\\.firstofferzds1\\.com)|(_qkMembers_@www\\.exploreads\\.com)|(_kfMembers_@www\\.bluecpads\\.com)|(_k2Members_@www\\.arcadejetds\\.com)|(_qiMembers_@tvguru-lp\\.olympuswaymarketing\\.com)|(_p8Members_@www\\.easywatch\\.online)|(_kcMembers_@www\\.utilitytab\\.com)|(_kdMembers_@www\\.utilitytab\\.com)|(_qrMembers_@www\\.install\\.utilitytab\\.com)|(_qsMembers_@www\\.utilitytab\\.com)|(_izMembers_@www\\.geteasyarcade\\.com)|(_qgMembers_@www\\.getinstantpdf\\.com)|(_p7Members_@www\\.tigersdeal\\.com)|(_jgMembers_@www\\.greathippo\\.com)|(_jdMembers_@www\\.greathippo\\.com)|(_juMembers_@arcadejet\\.com)|(\\{90ac1d06-caf8-46b9-9325-59c82190b687\\}))$/","prefs":[],"schema":1575056491406,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600273","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"196e36b5-3225-4f8d-a1a0-6696ea8885f9","last_modified":1575066166785},{"guid":"{99454877-875a-473e-a0c7-03ab910a8461}","prefs":[],"schema":1575040644063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600327","why":"The add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Smart Screen Capture"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f98e9e7-40d0-4af5-969c-9ea1aadbf280","last_modified":1575041576477},{"guid":"/^((Stark-vpn\\.5\\.16@firefox\\.com)|(Video_Downloader_Plus@gmail\\.com))$/","prefs":[],"schema":1575038746215,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600322","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89027d84-8871-4d44-8a14-18f029df268b","last_modified":1575040643688},{"guid":"/^((\\{b3d1c58f-b27e-4da8-bd4c-c3188346139f\\})|(\\{17101510-b5fb-4361-9e02-70a0e714b591\\})|(\\{d46a3635-4ca8-4e70-8bee-e49714896521\\}))$/","prefs":[],"schema":1574981048393,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600315","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36b86fac-a1f2-4df5-937a-d5667e0e824d","last_modified":1575038745843},{"guid":"/^((_orMembers_@www\\.apn\\.ask\\.com)|(_jsMembers_@www\\.apn\\.ask\\.com)|(_osMembers_@www\\.apn\\.ask\\.com)|(_otMembers_@www\\.apn\\.ask\\.com)|(_owMembers_@www\\.apn\\.ask\\.com)|(_ogMembers_@seen-on-screen\\.thewhizmarketing\\.com)|(_qeMembers_@app\\.mysearch\\.com)|(_otMembers_@muzikfury\\.thewhizmarketing\\.com)|(_oiMembers_@screenaddict\\.thewhizproducts\\.com)|(_omMembers_@screenwatch\\.yournewtab\\.com)|(_okMembers_@www\\.whizds3\\.com)|(_j0Members_@www\\.gettvstreamnow\\.com)|(_64Members_b@www\\.televisionfanatic\\.com)|(_ruMembers_@getscreenmania\\.com)|(_rxMembers_@www\\.gamelocket\\.com)|(_s1Members_@www\\.deadlockds\\.com)|(_s3Members_@www\\.mysearchappwhiz\\.com)|(_rvMembers_@www\\.groovymediads\\.com)|(_s8Members_@secure\\.norton\\.myway\\.com)|(_r3Members_@free\\.mysearch\\.com)|(_sgMembers_@www\\.easyhowtoguide\\.com)|(_shMembers_@www\\.fastformsfinder\\.com)|(_siMembers_@www\\.mydirectionsfinder\\.com)|(_seMembers_@www\\.brightcast\\.com)|(_spMembers_@www\\.onlinemapsnow\\.com)|(_slMembers_@www\\.creativeinternetds\\.com)|(_hpMembers0619_@free\\.easyfileconvert\\.com)|(_ceMembers0619_@free\\.easypdfcombine\\.com)|(_euMembers0619_@free\\.filesendsuite\\.com)|(_dpMembers0619_@free\\.findyourmaps\\.com)|(_dxMembers0619_@www\\.download-freemaps\\.com)|(_65Members0619_@download\\.fromdoctopdf\\.com)|(_dbMembers0619_@free\\.getformsonline\\.com)|(_39Members0619_@www\\.mapsgalaxy\\.com)|(_ewMembers0619_@free\\.mergedocsonline\\.com)|(_flMembers0619_@free\\.myformsfinder\\.com)|(_d1Members0619_@free\\.mysocialshortcut\\.com)|(_b7Members0619_@free\\.mytransitguide\\.com)|(_ozMembers0619_@free\\.newnotecenter\\.com)|(_jbMembers0619_@www\\.onlinemapsearch\\.com)|(_jjMembers0619_@www\\.onlineroutefinder\\.com)|(_69Members0619_@www\\.packagetracer\\.com)|(_fsMembers0619_@free\\.pdfconverterhq\\.com)|(_jnMembers0619_@www\\.pdfconverttools\\.com)|(_gcMembers0619_@www\\.weatherblink\\.com)|(_brMembers0619_@free\\.yourtemplatefinder\\.com)|(_s5Members_@www\\.bluecpads1\\.com)|(_j5Members0619_@ext\\.ask\\.com)|(_5zMembersff0619_@www\\.couponxplorer\\.com)|(_1gMembersff0619_@www\\.inboxace\\.com)|(_flMembersff1219_@free\\.myformsfinder\\.com)|(_j5Membersff1219_@ext\\.ask\\.com)|(_8eMembersff1219_@download\\.howtosimplified\\.com)|(_8jMembersff1219_@download\\.myimageconverter\\.com)|(_94Membersff1219_@www\\.motitags\\.com)|(_ceMembersff1219_@free\\.easypdfcombine\\.com)|(_d1Membersff1219_@free\\.mysocialshortcut\\.com)|(_dqMembersff1219_@www\\.downspeedtest\\.com)|(_dzMembersff1219_@www\\.pconverter\\.com)|(_dpMembersff1219_@free\\.findyourmaps\\.com)|(_e1Membersff1219_@free\\.actionclassicgames\\.com)|(_e5Membersff1219_@www\\.productivityboss\\.com)|(_ewMembersff1219_@free\\.mergedocsonline\\.com)|(_euMembersff1219_@free\\.filesendsuite\\.com)|(_dsMembersff1219_@free\\.internetspeedutility\\.net)|(_fsMembersff1219_@free\\.pdfconverterhq\\.com)|(_iwMembersff1219_@free\\.allinonedocs\\.com)|(_hoMembersff1219_@free\\.directionsbuilder\\.com)|(_hpMembersff1219_@free\\.easyfileconvert\\.com)|(_hxMembersff1219_@free\\.mergedocsnow\\.com)|(_hyMembersff1219_@free\\.formfetcherpro\\.com)|(_i2Membersff1219_@free\\.streamlineddiy\\.com)|(_i4Membersff1219_@free\\.fileconvertonline\\.com)|(_j6Membersff1219_@www\\.freemanualsindex\\.com)|(_jbMembersff1219_@www\\.onlinemapsearch\\.com)|(_jaMembersff1219_@www\\.testonlinespeed\\.com)|(_joMembersff1219_@www\\.onlineformfinder\\.com)|(_jnMembersff1219_@www\\.pdfconverttools\\.com)|(_k8Membersff1219_@www\\.mymapsexpress\\.com)|(_koMembersff1219_@www\\.quickpdfmerger\\.com)|(_kxMembersff1219_@www\\.smarteasymaps\\.com)|(_l6Membersff1219_@www\\.propdfconverter\\.com)|(_l4Membersff1219_@www\\.quicktemplatefinder\\.com)|(_l1Membersff1219_@www\\.videoconverterhd\\.com)|(_ozMembersff1219_@free\\.newnotecenter\\.com)|(_lbMembersff1219_@free\\.worldofnotes\\.com)|(_q8Membersff1219_@www\\.getformsfree\\.com)|(_psMembersff1219_@www\\.freetemplatefinder\\.com)|(_pvMembersff1219_@www\\.mapmywayfree\\.com)|(_gcMembersff1219_@www\\.weatherblink\\.com)|(_65Membersff1219_@download\\.fromdoctopdf\\.com)|(_sxMembers_@www\\.mapsmasteronline\\.com)|(_j6Members_@ext\\.ask\\.com)|(_66Members_@download\\.fromdoctopdf\\.com)|(_htMembers_@free\\.gamingwonderland\\.com)|(_5zMembers_@www\\.videodownloadconverter\\.com))$/","prefs":[],"schema":1574953312771,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598777","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f541ab9d-f671-421f-9aed-b27c63d11377","last_modified":1574981047945},{"guid":"/^((\\{7410146d-cf60-4175-a74a-0a7f7785bbff\\})|(\\{e9083fad-c9c7-4ff3-8bb5-b300d3f33546\\})|(\\{6bed141b-56b5-4209-84e1-93c67bf87711\\}))$/","prefs":[],"schema":1574883692223,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599563","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"51353b78-a8ca-4411-98b8-e9585c03f8c7","last_modified":1574953312403},{"guid":"/^((\\{d251b448-d876-4f25-87b3-9dd858a077df\\})|(\\{3f711bc3-65bc-41bd-842f-d21b6cb90313\\}))$/","prefs":[],"schema":1574869966668,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599833","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff958539-ae4f-4008-8413-a3fd86950380","last_modified":1574876724352},{"guid":"/^((\\{cce3a95c-5f17-4ca1-aa0b-b5a8dc3a1b45\\})|(\\{f7c272df-f8e3-419f-b48d-759b9326d51a\\})|(\\{75a25121-873d-4da0-9aec-c4fa83cf13d3\\})|(\\{042080fd-5127-409c-88e7-47136fda641f\\})|(\\{12b167db-911b-4091-b8e5-e9292643610f\\})|(\\{d386a8b2-fba8-47ab-924d-f43d86d9edd0\\})|(\\{995f0889-b95c-4ae7-9510-e6fddf76b62c\\})|(\\{9be5400b-715c-4f49-9085-e1bdfda4a873\\})|(\\{6680a4ae-e659-47f5-9e4e-0ee72494e3af\\})|(\\{2215fd58-f9b5-4d6d-be8a-805716380cac\\})|(\\{041e6a70-edc0-4e6b-a799-0b15d1c95ddb\\})|(\\{4ba68aef-ec5e-412b-9516-d2a7401c0a22\\})|(\\{5c97c09b-6a3f-43cb-950e-c02074193751\\})|(\\{de5d0076-fa35-468e-8b72-6b5524be0684\\})|(\\{702841c9-cd9b-411f-9c8f-7616e75ce749\\})|(\\{bdfaccd7-c343-435a-b22a-fbb8052bd40b\\})|(\\{3a37182d-5653-4c5e-9729-eee005d24dfd\\})|(\\{18a44708-ff7b-45f6-96de-f2ce4373d185\\})|(\\{6c632bb3-04d3-4744-b04d-cd5dbfef41d2\\})|(\\{7ae0db73-6402-44f7-b4f3-81b7ce81bf6a\\})|(\\{716440c3-3ced-41a7-a5b3-ee1da1bfa9f2\\})|(\\{abf84dc9-1ff8-47df-a68b-70e2e8627610\\})|(\\{a369dded-b0bc-446a-b900-c56eaa74042d\\})|(\\{828e6aed-955b-4a9f-9ec2-126f7dc51f37\\})|(\\{58f9ab34-78e6-4432-912a-c13fafc24a03\\})|(\\{68b7cc55-0874-4f91-a519-7b8283b7e974\\})|(\\{71545b8d-0ebb-4767-8864-5fc8dbdbbdee\\})|(\\{217e14c5-4d4b-4691-8428-48ad484f8c04\\})|(\\{6d20b3d7-ccd6-4fa5-ae08-0343193b5518\\})|(\\{ffdb8967-9d19-4377-a728-735f21941d15\\})|(\\{5edc78a5-f41b-4e4b-90e3-ef4fa429feef\\})|(\\{12fb0651-0d2f-4c97-aa37-9121bade678c\\})|(\\{b7c5d63f-b160-48fb-a1fc-485d5e014c63\\})|(\\{4e72d89b-8481-40ae-93d9-93d3316a5d40\\})|(\\{edd994cd-7724-43d3-807b-19bc2749187a\\})|(\\{238a0064-70ee-4d1e-8dca-4bb5a893b44f\\})|(\\{3671ddcb-11ea-4f05-b97d-989d94c42279\\}))$/","prefs":[],"schema":1574789062671,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599537","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"310e84ca-b967-4d81-b990-4d0697d62a6e","last_modified":1574869966292},{"guid":"/^((oawef0q29r43oq2\\.com@oawef0q29r43oq2\\.com)|(950opeokfp242@950opeokfp242\\.com)|(jggzkdudsuumeasqvler@jggzkdudsuumeasqvler\\.com)|(bdcixfqemzjezxbnzicj@bdcixfqemzjezxbnzicj\\.com)|(ne3787m9ykowhnicg8yx@ne3787m9ykowhnicg8yx\\.com)|(799v8e4cklkpetj0l56x@799v8e4cklkpetj0l56x\\.com)|(o7b1gs6trq2nkaocoejp@o7b1gs6trq2nkaocoejp\\.com)|(sta528sfzizg0ay009cs@sta528sfzizg0ay009cs\\.com)|(8x837zsyl6iw9hpjxu2w@8x837zsyl6iw9hpjxu2w\\.com)|(3bwrbcltn5fjo73lci00@3bwrbcltn5fjo73lci00\\.com)|(kmqm7cm5tk1l5s55yq7j@kmqm7cm5tk1l5s55yq7j\\.com)|(9n4v5kw9bf8e1f4dl0rq@9n4v5kw9bf8e1f4dl0rq\\.com)|(o4d5u4gzx14iqfuyobjr@o4d5u4gzx14iqfuyobjr\\.com)|(2ln3gtttxoz3tjerbbta@2ln3gtttxoz3tjerbbta\\.com))$/","prefs":[],"schema":1574538091411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599186","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0ee9e971-ba48-4d51-a907-a3b5533e8e28","last_modified":1574707139043},{"guid":"{3d09bd90-da37-41b5-a719-8da173e9870f}","prefs":[],"schema":1574441398813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598708","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6a12342-3936-41cf-910d-cc133db44d2a","last_modified":1574445055964},{"guid":"Stark-vpn.5.14@firefox.com","prefs":[],"schema":1574438767458,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598688","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Stark VPN"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5d2478e3-cbaa-4192-89f0-5abf3ea10656","last_modified":1574441398416},{"guid":"/^((\\{ac9ec764-a247-4d71-8807-20aa20f93e17\\})|(\\{4253de43-775d-48bc-8e08-fb3f58a2ddaf\\}))$/","prefs":[],"schema":1574434609524,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598672","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search-hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa044b4d-b39e-4ee0-a737-07aca2d672ef","last_modified":1574438767139},{"guid":"/^((\\{cc08012a-f9cd-4bfc-b526-ad8773934a0c\\})|(\\{16fd1825-3f7d-4c38-aa98-78cc4f0a6758\\})|(\\{87261aed-8d85-4037-81fb-4988ae80ee23\\})|(\\{90f51854-74d4-4df9-bf4c-b86f30346bd8\\}))$/","prefs":[],"schema":1574365292775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598646","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YD"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46ed3cc3-8534-484a-bc58-349824debec6","last_modified":1574434609189},{"guid":"@youtube-adblocker-addon","prefs":[],"schema":1574334260915,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598287","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"126a0720-a22f-41f1-876f-0a3e18b79d2b","last_modified":1574342360895},{"guid":"/^((youtubetomp3@addons\\.youtube\\.com)|(addons-mozilla@youtube-to-mp4))$/","prefs":[],"schema":1574260409481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598242","why":"The add-on violates Mozilla's add-on policy by opening websites with malicious intent.","name":"YOUTUBE to MP3"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9729654a-6cd1-4e20-8cf5-47a3ff544ef5","last_modified":1574334260570},{"guid":"/^((\\{333d6dd8-43ed-4f01-944d-b7c737a5db72\\})|(\\{f5712532-777e-4080-b6b9-d548040f7675\\})|(\\{abf3f8d7-bc95-4dd5-ab96-c390ad5f8756\\})|(\\{f769002a-608d-4a8c-adc4-05f4857ff3ae\\})|(\\{1980667f-9bde-4e7e-8d0c-132db12c1b30\\}))$/","prefs":[],"schema":1574192492672,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1597784","why":"Use of affiliate redirects in violation of policy","name":"Affiliate Redidrecting Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28831b71-8a9a-466e-9f34-1f40f2f0e27a","last_modified":1574260409142},{"guid":"/^((_1gMembers_@www\\.inboxace\\.com)|(_39Members_@www\\.mapsgalaxy\\.com)|(_5zMembers_@www\\.couponxplorer\\.com)|(_65Members_@download\\.fromdoctopdf\\.com)|(_flMembers_@free\\.myformsfinder\\.com))$/","prefs":[],"schema":1573749618972,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594461","why":"This add-on does not provide users with an opportunity to refuse the storage of or access to cookies.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d39750c3-a305-4487-bc0f-21500c3597dd","last_modified":1573804224556},{"guid":"/^((\\{c8476e06-0a50-41ec-a840-a2db436cf38c\\})|(youtube\\.downloader@firefox\\.dev)|(youtubedownloader@firefox\\.com)|(youtubehddownloader@firefox\\.com)|(youtube\\.d@firefox\\.dev)|(advblock@blocker)|(YouTube@HD\\.Downloader)|(adt-3\\.0\\.7@blocker)|(\\{7131880e-d327-4802-b5ed-fee33c281abd\\})|(\\{5cb84843-504e-406e-8fb7-051c7fc3c9d3\\})|(\\{d8686bde-e666-4084-ae01-c75aa7a30f93\\})|(\\{96d35545-d94a-4ee1-bc43-d3055650587c\\})|(ali-image-search@4\\.0)|(\\{e7634c48-0d36-448e-891e-b2036beebcd0\\})|(\\{442de29c-b710-45d4-b121-7b4be387c327\\})|(lite-vpn-4\\.1\\.14@gmail\\.com))$/","prefs":[],"schema":1573674093610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1596468","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"19c04aaf-c02d-4583-9978-c519245cd4fb","last_modified":1573749588529},{"guid":"extension@safeguard.ws","prefs":[],"schema":1573501291938,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595616","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Safe-Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53d8f35e-99ec-44fd-8082-3b713a5afcb3","last_modified":1573507879434},{"guid":"crisorgblack@rampampam","prefs":[],"schema":1573155692372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595200","why":"This add-on contains unexpected features in violation of our policies.","name":"Flash Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2bb20972-0d56-44c8-a5d6-0e73a1827e92","last_modified":1573247974595},{"guid":"/^((\\{be2f72d6-0c71-4fd0-8914-e27057e51099\\})|(adblock-2019@youtube-addons))$/","prefs":[],"schema":1573060222748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594498","why":"These add-ons are suspected deceptive and have been disabled for your protection.","name":"Deceptive ad-blocking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"477174ca-470a-40ff-bf8d-2de81c2dc458","last_modified":1573063322832},{"guid":"/^((\\{8f11d935-4bcf-42c8-88c1-7e32e4541c98\\})|(\\{b0a6cb7d-3e77-4a96-aea5-7d0090e55832\\})|(\\{c5a5fd9f-8e84-460d-93dd-499e23b530e9\\})|(\\{ac7c91e8-6797-42ec-a202-5b34dacaa83a\\})|(\\{3784e311-4758-4180-b3e2-2ae42bfb081d\\})|(\\{10f3b1e0-4b97-4cc2-9af6-06a9162ec022\\})|(\\{e1109008-6d70-453d-a84e-3cc0c44af07e\\})|(\\{bb7190ac-8aeb-4a8d-83cf-89c179a4d65e\\})|(\\{a752512a-8287-40c0-97f2-071146da2caf\\})|(\\{185dbeea-416b-4fd6-8512-9ddb941e50b5\\})|(\\{d199eeb9-0964-4dff-94d2-69116fd03418\\})|(\\{d37310a3-08dd-4cb8-a276-3f2bee174555\\})|(\\{b239ce6b-2513-4758-a74e-eae3c8f0a04a\\})|(\\{f0f240d7-ae38-4bf4-a8e2-23d775eb07f4\\})|(\\{1804789c-d056-4887-839c-7a0dcab3be83\\})|(\\{d6115dfe-e3d2-44af-8361-1308c234b14c\\})|(\\{48a804b3-cf0f-4aa1-b798-82e944d7afb0\\})|(\\{3026b451-392b-47d5-b60f-995fb075cfd1\\})|(\\{e050f24c-8e06-4d6f-a962-c6073788ac29\\})|(\\{f45a7c28-423a-46ff-abb6-fc855912d074\\})|(\\{699d463b-dd6c-4cde-bad8-81beb345cb85\\})|(\\{f3a3544e-905d-4cc2-99e2-dd4c928bfc24\\})|(\\{2fa8e43c-084a-4fd7-9873-2d462f535929\\})|(\\{a7a69509-aa1d-42b3-8c8d-b3a2885f9aa7\\})|(\\{f4ca82a2-58cc-4d4f-ab95-1ca0424dcd52\\})|(\\{6f9cc262-0164-47e5-b138-024a525d2498\\})|(\\{b3061ee4-1281-482a-8022-f351c023db8d\\})|(\\{48d4fb44-5ebe-49a0-a731-541f11491d92\\})|(\\{fe8a3e05-e9ff-48d2-9291-b97bd3cba97b\\})|(\\{b7eb6ae4-2476-4ba0-a005-b868eb4bf9b2\\})|(\\{2992ca99-6c98-4864-afbf-d51c9c35ed5a\\})|(\\{2017e4f8-a7fb-421f-a1c5-d7b62189f1db\\})|(\\{d44be860-e0d3-4df2-97e1-eef2075474bc\\})|(\\{d6d4e269-00c4-4eeb-b458-d76222ff52e9\\})|(\\{a0242f56-118b-415c-83d6-8eac264dad4c\\})|(\\{25e8b980-6548-45c4-bb58-a641c13b9807\\})|(\\{40fae6f3-c629-4b2d-b690-bf022ebb2cd8\\})|(\\{359c22b8-d670-4b0e-ba77-e29615b633fb\\})|(\\{8fce6deb-83f3-4695-9c5d-76bf366757bf\\})|(\\{1edcaf80-0c4a-4380-9752-4f2953b8a053\\})|(\\{664101ff-e2e4-43b3-b470-ddb71642df7a\\})|(\\{fee7c990-6f9c-4b44-91fb-74998b2498c5\\}))$/","prefs":[],"schema":1573055872812,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594479","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5e200b1f-e1d0-4819-89e3-3bd34f90c5c1","last_modified":1573059528009},{"guid":"/^((\\{697995ae-b9ee-4556-824b-8e82621f45dd\\})|(\\{6971a39a-916e-4b3f-a14f-bac10571b9f0\\})|(\\{d1047c9a-157b-4f87-a223-a6e6a150e1f8\\})|(\\{f23c6402-4b76-4aa4-b49a-6d083f92ae88\\})|(\\{1a7401bd-96e7-4857-bc5b-7ee66cdecc3c\\})|(\\{ccec0135-ee34-4713-a10c-607a45956d9b\\})|(\\{70428092-3df7-4151-b973-974ca511ae33\\})|(\\{cf2cc560-d765-4b59-b7b7-09a0ae4292f2\\})|(\\{880b8863-e204-47fe-8c8d-db29a10b8c8a\\})|(\\{c95951f5-2b2b-481a-9975-e38abf1f881b\\})|(\\{865df6b7-3ac1-4bd8-be0b-4cc8bb6aab7e\\})|(\\{b6124efd-aa84-42bf-80c7-01c078dc9ef2\\})|(\\{f888f1c9-a936-4ed1-a7f1-5a835ea9e6a0\\})|(\\{c434dae6-9ece-4488-8e9d-0d06d523d95a\\})|(\\{5531f988-1512-4b18-937c-7bc7e209c70f\\})|(\\{fd4fc8ae-fe95-490f-8013-6964455afb34\\})|(\\{84189ee5-4494-4068-b467-49a1b946cba1\\})|(\\{21f0db68-3156-41b4-8180-a48824b35962\\})|(\\{6a3e8874-61b4-40bf-923c-199493cfd284\\})|(\\{683172b8-3a91-4cbc-92f3-2a385f321c98\\})|(\\{269136f3-cd51-4e2d-b1eb-74878262fcef\\})|(\\{1ca4e866-0d45-4898-8138-398f49925cab\\})|(\\{9d53c5bc-9cf2-4c50-9ce5-8aaa113de07f\\})|(\\{19b80768-1437-4d18-972b-41df04a3b0a9\\})|(\\{7090cae8-4f58-4f07-9e53-b37cb4f3f8ad\\})|(\\{31911e49-6d40-4435-b152-c333096ae185\\})|(\\{4910e0bd-d803-4785-9ec4-6e8c9414a53e\\})|(\\{f3a131a1-73fe-4e8c-b499-629aa7a3e405\\})|(\\{94e53c23-cb3e-43c9-b29f-43ea953c61f6\\})|(\\{0a024f33-43b3-4d15-89dc-694964063869\\})|(\\{fa561d95-e80a-4ab9-b71c-556c7fce3b83\\})|(\\{f78a3354-dafd-48e6-8392-0ed1aa8e8a91\\})|(\\{a6b84ecd-25df-41c5-8979-a1a9d962d78b\\})|(\\{5d7282aa-0600-4a16-ad0e-917d20232d2a\\})|(\\{90e0c87b-f534-486f-b5fe-beddad5cfcfb\\})|(\\{c64d3989-b6f6-4eec-b86f-b549a5b2056a\\})|(\\{ccdd4a2e-11a4-4922-8bd2-d8ff05d3194f\\})|(\\{b9f73347-01c2-4727-85cd-7521a2a2841c\\})|(\\{1be85529-e82e-4dfe-aa33-3c62fc37ae8e\\})|(\\{b91fff1b-d45e-47b2-95da-5d774319b88d\\})|(\\{8c81cdd1-4fc2-4510-83c2-641ea7ee7c24\\})|(\\{e5db6079-1786-4072-80f5-d5c894074cc2\\})|(\\{5981e135-789c-4709-8b22-85e0665c8396\\})|(\\{a235175f-3391-43c6-bf58-34c1f6b8f4a6\\})|(\\{617ebed4-628f-4ca3-92de-bec510cab1dd\\})|(\\{3aaa37bc-0fa9-4e34-abbb-d5a34ff729a3\\})|(\\{2d3521bc-914f-4990-ba0a-5d488f176f4e\\})|(\\{17c7768d-c672-4e99-aef2-2fdd35a96804\\})|(\\{7e517ca8-6f65-4de2-869f-dddce73a274c\\})|(\\{9c99bd01-7567-47e6-80f2-bf229b97415f\\})|(\\{5357eef8-cc2f-496a-82d2-5f3b6ca5f7b1\\})|(\\{b83a8605-057b-46ef-86ed-d53db9a9f16f\\})|(\\{55383502-1800-4cf8-8522-df16d6cb9809\\})|(\\{14d742cf-cd34-46a5-984e-1e28fc16e55c\\})|(\\{f5d6d1af-6a02-4eb4-a7fb-ec3486239875\\})|(\\{fac56640-6cad-49a2-b224-9424e18b4009\\})|(\\{79c16aa2-f8a9-40d3-9e81-74884b987e48\\})|(\\{b02eae40-18d6-4e28-8af7-6b161a458769\\})|(\\{9398d059-fc67-43e2-8548-bc60cfa82998\\})|(\\{cd0a4138-8670-4a6b-b15c-0cad1ef290e6\\})|(\\{503dc84b-9967-4b1f-8199-cee55bcd919e\\})|(\\{d0245186-049d-4594-88f9-3fe54e735551\\})|(\\{7208c980-005e-426c-991f-1cd22227b7fb\\})|(\\{19dcb8c5-3577-4279-b70f-eb48a594f821\\})|(\\{fda599e0-d842-47d9-8c8e-21c26ef0afa6\\})|(\\{470eab98-7ad9-49a5-883f-42cb51996fc7\\})|(\\{8c353e56-0d27-4b83-b081-6e012bda5601\\})|(\\{a1931145-d58d-41a2-b190-04549ef9c225\\})|(\\{916d2e1d-aabf-45aa-84ec-a9bb9ee40391\\})|(\\{f2aa9466-c326-440c-b9a8-f2fef8571341\\})|(\\{52a02f53-b805-41d1-af02-0283da3ef383\\})|(\\{aad686bf-b881-4177-8a8f-12c9455e319f\\})|(\\{cec578f9-9103-44f8-9b41-bbe26ba8a993\\})|(\\{6891bcc0-4ad2-4531-9699-ce82528ddcc0\\})|(\\{a5d93cd7-b187-46f8-961b-9f4fc0b4f37f\\})|(\\{b220428d-2f07-4ecd-9114-3a3261d5f7fc\\})|(\\{b0f4740a-6e0f-489e-ab86-3fb3abb7dd15\\})|(\\{611781ad-a17d-4487-8caf-bf72818bacfc\\})|(\\{0b4efcee-b7eb-4151-bdd2-b2f66fedd4fa\\})|(\\{25da4f88-e61c-4823-9c32-864c3a348aab\\})|(\\{e44b4144-0a1a-4c29-95c0-50083ed5c606\\})|(\\{4dbf4218-1a54-4fa1-8448-0521da5b5391\\})|(\\{7140247a-7ee6-4474-9fe9-0cdf6ec7e2e7\\})|(\\{50eac97c-bb52-4107-a3be-6d40eba5b229\\})|(\\{4bd98a1f-d8f6-411a-a1e8-0cf1b482c682\\})|(\\{a7d60016-47ac-4480-b2bc-83dd4e20b096\\})|(\\{a2657d9a-94d1-41e8-a1e5-72e60c032afe\\}))$/","prefs":[],"schema":1572982905588,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594460","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f1eaa18e-75c8-4134-87cf-5a02e3349e44","last_modified":1573055860762},{"guid":"/^((web@3753c687-a0c6-4cd1-b8ff-bab3c76b1236)|(ext@286f29a6-184e-4195-b1e5-1212ebf372a0)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b70000)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0000)|(web@af1e58bc-4ead-11e8-81fc-065ad97f0000)|(web@7398cc9a-684e-40a4-afe1-b620e1a80000)|(web@2DC2452E-6999-11E8-A1CA-6C6318C60000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87000)|(web@ca5a2803-6421-4582-97e1-9e30fe440000)|(web@00022358-d56d-4f5e-a89c-d4534d7c5565)|(\\{ff26fde6-4d73-49a3-bd6c-1ca7876484fc\\})|(290e9605-6fb1-4c8b-a3d4-0084bfad201e@UniversalConverter)|(web@EmailNewTab)|(web@WhatsMySpeed)|(test@FormsHub)|(web@Forms2)|(newweb@MapsNewTab)|(\\{4b1d718d-58ae-404b-a5d2-b7b977cfcb56\\}))$/","prefs":[],"schema":1572291693826,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1592597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3bdd5b53-ddb1-4fb0-b250-d75a604a5546","last_modified":1572443230107},{"guid":"/^((\\{a059a924-e43a-495d-9620-ad8c111d62d9\\})|(\\{79f4bfc6-b1da-4dc4-85cc-ecbcc5dd152e\\}))$/","prefs":[],"schema":1571600493541,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1589974","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Page Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9e8f80d6-a818-4004-9a20-deec55f3fb96","last_modified":1571605630002},{"guid":"/^((firefox@browser-security\\.de)|(firefox@smarttube\\.io)|({0fde9597-0508-47ff-ad8a-793fa059c4e7})|(info@browser-privacy\\.com)|({d3b98a68-fd64-4763-8b66-e15e47ef000a})|({36ea170d-2586-45fb-9f48-5f6b6fd59da7})|(youtubemp3converter@yttools\\.io)|(simplysearch@dirtylittlehelpers\\.com)|(extreme@smarttube\\.io)|(selfdestructingcookies@dirtylittlehelpers\\.com)|({27a1b6d8-c6c9-4ddd-bf20-3afa0ccf5040})|({2e9cae8b-ee3f-4762-a39e-b53d31dffd37})|(adblock@smarttube\\.io)|({a659bdfa-dbbe-4e58-baf8-70a6975e47d0})|({f9455ec1-203a-4fe8-95b6-f6c54a9e56af})|({8c85526d-1be9-4b96-9462-aa48a811f4cf})|(mail@quick-buttons\\.de)|(youtubeadblocker@yttools\\.io)|(extension@browser-safety\\.org)|(contact@web-security\\.com)|(videodownloader@dirtylittlehelpers\\.com)|(googlenotrack@dirtylittlehelpers\\.com)|(develop@quick-amz\\.com))$/","prefs":[],"schema":1571235422841,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483995","why":"Sending user data to remote servers unnecessarily, and potential for remote code execution. Suspicious account activity for multiple accounts on AMO.","name":"Web Security and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.9","minVersion":"0"}],"id":"96b2e7d5-d4e4-425e-b275-086dc7ccd6ad","last_modified":1571235848152},{"guid":"{381f21b1-95bf-4042-bc5c-3a40b2a03f10}","prefs":[],"schema":1571235400908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583468","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Francezon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"dd1261a3-6944-4f51-8118-b0a8f2055d69","last_modified":1571235422828},{"guid":"addon@shoppingguru.info","prefs":[],"schema":1571235356487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583862","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ShoppingGuru"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2104.1111.1110.4221","minVersion":"0"}],"id":"70655a4b-064d-44ab-8d0e-3bec419343ee","last_modified":1571235400895},{"guid":"sparalarm@chip.de","prefs":[],"schema":1571082106908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586677","why":"The add-on is force-installed for users through sideloading, bypassing user consent.","name":"Sparalarm"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"14.39.1","minVersion":"0"}],"id":"19f599bd-2226-49e2-90fd-685fd106fc3d","last_modified":1571235356473},{"guid":"/^((\\{65a93e3b-e350-440d-bf8f-68e18e38d27d\\})|(\\{9db1fb44-b661-4719-9d90-67af3e6a314c\\}))$/","prefs":[],"schema":1571059482617,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586834","why":"This add-on contains an unexpected feature that is collecting ancillary data.","name":"Google Custom Logo and Search Counter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be5d02cb-0a36-4c20-b184-509b86d243c5","last_modified":1571060494402},{"guid":"{c4d46c5f-9832-4057-8a1d-635949ed6a55}","prefs":[],"schema":1570909292250,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587121","why":"This add-on makes use of search settings with unexpected behavior.","name":"LM Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57c094fd-9a37-4ede-9bb0-a1c2d66415f0","last_modified":1571059471124},{"guid":"/^((\\{2B0EC7FF-F330-4e0c-8B33-EFFEC8D39E70\\})|(\\{f70c89b0-bbf3-41a9-bc1f-0912dcf53f33\\})|(@Classifieds)|(@Converter)|(@Coupons)|(@Directions)|(@DownloadManager)|(@Email)|(@Fitness)|(@Flights)|(@FormsApp)|(@Games)|(@Maps)|(@News)|(@Package)|(@Photo)|(@Radio)|(@Recipes)|(@search-encrypt)|(@search-incognito)|(@searchencrypt-b)|(@searchencryptblocker)|(@Speedtest)|(@Sports)|(@Transit)|(@TV)|(@Weather)|(aweapps@Email)|(classified@jetpack)|(email@searchleasier\\.com)|(foo-bar@example\\.com)|(games@jetpack)|(JS@Converter)|(login@easier)|(maps-webext@jetpack)|(Maps@SSA)|(web-ext@games\\.com)|(web@ShoppingNewTab)|(web@SocialNewTab)|(web@WebDesignNewTab)|(webapp@LoginAssistantTab)|(webex@Converter)|(webex@Email)|(webtab@Shopping)|(webtab@Social)|(webtab@WebDesign))$/","prefs":[],"schema":1570701667316,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587782","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collection ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"986aac02-beba-40b2-b463-d8447a778a2e","last_modified":1570713923845},{"guid":"{2a78ab07-91b2-4086-889d-619e43d5e5f8}","prefs":[],"schema":1570563693690,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587734","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SVSrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bb76b262-7087-4cf2-a82f-12cfbf91239a","last_modified":1570701652245},{"guid":"{2e106fa4-ee23-4b4a-9ed0-f93edee539b5}","prefs":[],"schema":1570534326932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587074","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"SVsrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab0b6868-6077-4d47-bd58-1df3f572c04d","last_modified":1570540061375},{"guid":"/^((oigfsj9434lavvv@oigfsj9434lavvv\\.com)|(mity82900jf2@mity82900jf2\\.com))$/","prefs":[],"schema":1570527949565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586780","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Page organizer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ece7523-cdec-46cf-ac20-9e939a4d4802","last_modified":1570534316570},{"guid":"/^((web@MapsNewTab)|(ext@WhatsMySpeed)|(ext@MyEmailCenter)|(ext@TemplateHelper)|(ext@FreeLiveRadio)|(ext@FreeFormsNow)|(web@ConverterNewTab)|(web@EmailAccountNewTab)|(spweb@EmailNewTab)|(web@PackagesNewTab)|(web@ManualsNewTab)|(web@ClassifiedsNewTab)|(web@FormsNewTab)|(web@AncestryNewTab)|(web@RecipesNewTab)|(web@TVNewTab)|(web@WeatherNewTab)|(web@translationsNewTab)|(web@SportsNewTab)|(web@CouponsNewTab)|(web@FlightsNewTab)|(test@InstaFormsFinder)|(web@NewsNewTab)|(web@SpeedTestNewTab)|(web@TransitNewTab)|(web@BibleNewTab)|(web@RadioNewTab)|(web@TemplateNewTab)|(web@PhotoEditorNewTab)|(web@AudioConverterNewTab)|(web@GamesNewTab)|(web@VideoConverterNewTab)|(test@TheWeatherChecker)|(web@InterestsNewTab)|(test@SearchHub)|(web@CalendarNewTab)|(web@TaxesNewTab)|(web@BankNewTab)|(web@CrimeReportNewTab)|(web@CryptoNewTab)|(web@eBooksNewTab)|(web@FinanceNewTab)|(web@FitnessNewTab)|(web@JobsNewTab)|(web@MoviesNewTab)|(web@NotepadNewTab)|(web@OfficeNewTab)|(web@PCTextingNewTab)|(web@PhotoNewTab)|(web@ScrapbookNewTab)|(web@UtilityNewTab)|(test@FlightTrackerUpdate)|(test@FreeForms)|(test@UniversalConverter)|(test@MyEmailCenter)|(test@TemplateHelper)|(test@FreeLiveRadio)|(test@FreeFormsNow)|(ext@FormsHub)|(webext@WhatsMySpeed)|(webext@WatchTelevision)|(webext@EmailExpressTab)|(webext@MyConverterTab)|(webext@TemplateCreatorTab)|(webext@LocalForecastTab)|(webext@EZDirectionsandMapsTab)|(webext@MapsNDirectionsTab)|(webext@MyEmailCenter)|(webext@TemplateHelper)|(webext@FreeLiveRadio)|(webext@FreeFormsNow)|(webext@InstaFormsFinder)|(webext@TheWeatherChecker)|(webext@FlightTrackerUpdate)|(webext@FreeForms)|(webext@UniversalConverter)|(webext@FormsHub)|(webext@SearchHub)|(ds@DirectSearchPro)|(webext@AppDiscoveryTools)|(webext@LiveRadioProTab)|(webext@TheWeatherPilotTab)|(webext@ExpressPackageFinderTab)|(webext@LoginAssistantTab)|(webext@SelectSearch)|(addon@SelectSearch)|(webext@ExpressSpeedChecker)|(webext@BreakingNewsPlus)|(webext@WorldEventsToday)|(addon@WorldEventsToday)|(webext@OnlineTVAccess)|(webext@FindingFormsPro)|(webext@EasyClassifieds)|(webext@SpeedCheckerPlus)|(webext@GetFreeCoupons)|(addon@MyEmailChecker)|(app@FlightTrackerUpdate)|(app@WatchTelevision)|(app@WhatsMySpeed)|(app@MyEmailCenter)|(app@TemplateCreatorTab)|(app@FreeLiveRadio)|(app@FreeFormsNow)|(app@InstaFormsFinder)|(app@SearchHub)|(app@TheWeatherChecker)|(app@FormsHub)|(webtab@Maps)|(app@FreeForms)|(app@UniversalConverter)|(app@EmailExpressTab)|(app@MyConverterTab)|(app@TemplateHelper)|(app@LocalForecastTab)|(app@EZDirectionsandMapsTab)|(app@MapsNDirectionsTab)|(app@AppDiscoveryTools)|(app@LiveRadioProTab)|(app@TheWeatherPilotTab)|(app@ExpressPackageFinderTab)|(app@WorldEventsToday)|(app@OnlineTVAccess)|(app@SpeedCheckerPlus)|(app@EasyClassifieds)|(app@GetFreeCoupons)|(app@FindingFormsPro)|(app@TemplatesHereTab)|(webtab@Packages)|(webtab@Forms)|(webtab@Email)|(webtab@Radio)|(app@MyEmailChecker)|(webtab@TV)|(webtab@Classifieds)|(webtab@Ancestry)|(webtab@Weather)|(webtab@Manuals)|(webtab@SpeedTest)|(app@MyDailyCalendar)|(webtab@Transit)|(webtab@Converter)|(webtab@Coupons)|(webtab@Recipes)|(webtab@News)|(webtab@Sports)|(webtab@translations)|(webtab@Template)|(webtab@AudioConverter)|(webtab@Flights)|(webtab@Photo)|(webtab@Bible)|(webtab@PhotoEditor)|(app@MyVideoConverter)|(webtab@Games)|(app@MyLoginHelper)|(app@QuickEmailAccess)|(app@MyRecipeFinder)|(app@MyFlightFinder)|(webtab@Fitness)|(webtab@VideoConverter)|(webtab@Taxes)|(webtab@Bank)|(webtab@Calendar)|(webtab@CrimeReport)|(webtab@Crypto)|(webtab@eBooks)|(webtab@Finance)|(webtab@Interests)|(webtab@Jobs)|(webtab@Notepad)|(webtab@Movies)|(webtab@Office)|(webtab@PCTexting)|(webtab@Scrapbook)|(webtab@Utility))$/","prefs":[],"schema":1570483391885,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587028","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd51d01b-20bf-4682-a588-c03e988eb746","last_modified":1570527938865},{"guid":"{67d4f93e-6857-45ab-9e7a-158cc61f15d2}","prefs":[],"schema":1570052453260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585735","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"zidaza"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6ce8f6d0-5cef-457c-b7e4-d5c08d61531a","last_modified":1570053270833},{"guid":"/^((\\{049aedf7-b1dc-49b7-9ef4-51cd026f8592\\})|(\\{27c743d8-4731-44ff-9194-9f663df6a3c3\\})|(\\{8bf2bae7-273a-4496-9073-c1ad6688cda8\\})|(\\{b9cfeaaa-2465-4b21-903a-7955fcd4e59a\\})|(\\{07848e3a-f42b-48bf-ac70-f918a7b79258\\})|(\\{02b2eed4-2ca5-4d6f-b19a-a8b1738501f0\\})|(\\{d2af93ad-a542-4b30-b929-7437c2b02afe\\})|(\\{b8e33742-5b78-4c08-89e1-94ebe22fbafe\\})|(\\{502b29ef-b05f-4043-949b-069160f39e32\\})|(\\{2c60eb88-2f38-4b1a-9329-eaa18ad41720\\})|(\\{ccb18b6f-0680-4347-afd5-5ed864114f05\\})|(\\{c9622009-2b37-44f1-a5cf-f0aa869a6bff\\})|(\\{cc241172-6e33-4395-bc68-dd76fa6b6091\\})|(\\{904a47b7-c2c3-465d-a7f9-326c51e8fee0\\})|(\\{365ae96e-15f8-445f-816e-74cd5897613c\\})|(\\{527ccde6-f15c-4437-a061-052593c2ac5b\\})|(\\{063b5c1a-b708-4f05-873b-b3e161d1d49a\\})|(\\{d5422b3f-fcb3-4eca-b2a9-b4b8010fd4c1\\})|(\\{60bab1b2-e7fc-4683-85ef-2ec6cdb5e148\\})|(\\{aad32311-3e2f-419d-8e6b-82c4e28c44d3\\}))$/","prefs":[],"schema":1570045305267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585810","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscating code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a942e2e5-6a55-439f-b078-6288da1cfe68","last_modified":1570052444069},{"guid":"/^((\\{6be4ca4f-8b7e-4d91-994b-24a7c5384086\\})|(\\{1709abf0-19ba-48a8-a9dc-03e931b17f48\\})|(\\{5d5af81d-6501-4d77-a64c-ad2cdc34ceae\\})|(\\{b7de0a65-0b4b-4b74-a4e6-70fc2c36a80a\\})|(\\{64704bd2-ced7-4dd8-a5d2-d20df624288f\\}))$/","prefs":[],"schema":1570036215253,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585723","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code."},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e487385-fe8d-451a-909e-a6f6609b0d7b","last_modified":1570036367326},{"guid":"{5dbbb375-3520-4ace-bb84-df9d92ae1a25}","prefs":[],"schema":1570017905113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585708","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Wappalyzer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a12e67a-ef6d-4f06-9de6-7dc8bcb19517","last_modified":1570036206290},{"guid":"{d41cf5b5-67b7-4510-8633-d8e2c0ec5d46}","prefs":[],"schema":1570001773270,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585625","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Xisey"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87d99543-1e31-46b3-9fd1-91d9c79ff592","last_modified":1570017897427},{"guid":"mozilla_cc3@internetdownloadmanager.com","prefs":[],"schema":1569844559791,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585071","why":"Some versions of this add-on violate Mozilla's add-on policies by using unreviewable source code. Please update to a newer version.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"6.35.5","minVersion":"0"}],"id":"21f14cff-afef-4e0e-97e8-4dbc0207a7a6","last_modified":1569865071841},{"guid":"{546bc2af-d6e7-499f-90b6-58305b836702}","prefs":[],"schema":1569699691574,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583809","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MapsFrontier"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f3133639-f5e5-4b47-a80f-2993fa97ca4a","last_modified":1569844523596},{"guid":"{f39b7905-00d5-4391-9a4b-751ca08dd6b2}","prefs":[],"schema":1569440826824,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583814","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Tic-Tac-Toe Evolution_G"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c3153a8-7551-48f3-a4fa-8ad6cb28faa8","last_modified":1569441800696},{"guid":"/^((ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3843796584)|(ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3264908934))$/","prefs":[],"schema":1569242005272,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582781","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Proxy add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72464ab8-9b51-420f-8e54-bc0f8bb01cf1","last_modified":1569244094631},{"guid":"/^((@searchincognito)|(@si-defaultsearch)|(@si-defaultsearch-listed)|(@searchassistincognito)|(@DiscreteSearch)|(@Discrete-Search)|(@searchsafe)|(@SearchSafeOrg)|(ffredirector@discretesearch\\.com)|(ffredirector@encryptedsearch\\.org)|(ffredirector@searchdefence\\.com)|(ffredirector@searchencrypt\\.com)|(ffredirector@searchencrypted\\.com)|(ffredirector@searchincognito\\.com)|(ffredirector@searchsafe\\.co)|(ff_redirector@discretesearch\\.com)|(ff_redirector@encryptedsearch\\.org)|(ff_redirector@searchdefence\\.com)|(ff_redirector@searchencrypt\\.com)|(ff_redirector@searchencrypted\\.com)|(ff_redirector@searchincognito\\.com)|(ff_redirector@searchsafe\\.co)|(@encryptedsearch)|(@searchdefence)|(@searchencrypted)|(@42e62954-834c-11e7-bb31-be2e44b06b34)|(@DiscreteSearchx)|(@4aec09f1-f1c9-456d-8c40-e0e86f302a0d)|(@566ff1c3-9432-4ed4-bd3d-b43cba47e051)|(@1df4e663-b9f3-4708-9f5d-44265b33397e)|(ff_redirector@searchsafe)|(\\{9b62bdf8-a3c7-43d3-ba7f-0970cabffdaa\\})|(\\{95b48d11-b256-48ad-8ba1-bfe52f0a8bb8\\})|(\\{9e35a2be-64bd-49e3-aa47-fbeedf1834eb\\})|(\\{3ba10b5f-d9fa-4b40-8683-034d3dfc71d4\\})|(\\{20c31601-ebee-4677-a2f0-40e178bf7c77\\})|(\\{98e02622-f905-434e-9003-6c061b5c11c0\\})|(@tabwow)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-258456913)|(@tabwow2)|(\\{be8901e4-2a07-4554-aa05-a64351496e29\\})|(moviestmpd@mozilla\\.com)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-876542484)|(\\{4a8ef415-e453-458f-bfbd-ae92569214db\\})|(fireaction@mozilla\\.com)|(\\{bd9c448c-58b3-434f-9bb6-4ed2c155ba8e\\})|(\\{ebdfa19b-0906-4f78-9e95-7ef74d34c335\\})|(websecure-unlisted@mozilla\\.com)|(\\{2d06d70b-8f32-4007-8f8b-1e0445bcebe7\\})|(\\{ddbe7345-acf4-4ebb-9baf-cd6d2df73b28\\})|(\\{b09d5b98-2d65-46fb-990c-69710577efa0\\})|(\\{3894384e-c719-4a0c-8d24-3816160fc56b\\})|(search-encrypt-tab@mozilla\\.xpi)|(\\{1dafa1da-3894-48b9-ac8f-00bdc4f1868a\\})|(\\{99cfe634-328a-41a5-9a23-64094e4f4919\\})|(inco-plugin@mozilla\\.xpi)|(incognito-window@mozilla\\.xpi)|(mac-search@mozilla\\.xpi)|(fvdplayer@fvd\\.com)|(playernewpp@ext\\.com)|(\\{492936c6-9121-4e54-8d4f-97f544e5bf98\\})|(\\{108a22ea-f316-4c2f-8427-fe65e02f9e2c\\})|(cold@being\\.net)|(\\{38b99237-6c28-406f-898c-cc89df86051d\\})|(search_redirect@mozilla\\.xpi)|(\\{d2ef4a8d-6ec0-4733-9f3f-2394178ecbf3\\})|(tab_plugin@mozilla\\.xpi)|(\\{ae228e30-f40a-41a3-9e7e-53a094dcb8c6\\})|(\\{00ee7237-53cb-4036-8d4f-e78d78ca89e7\\})|(\\{d2f4002c-031b-4ad3-9fb1-afb003e8f932\\})|(\\{c0f366b3-7b3d-4486-a6f3-4ca1d7045091\\})|(\\{ccc6cfc4-3832-4d05-bf28-43a9722de93f\\})|(\\{dd02f638-ce6d-464e-8add-6ea0f314b1d1\\})|(\\{749ed3ff-4d23-4b32-812e-a35e3cf8c000\\})|(tab_cleanup@mozilla\\.xpi)|(incognito_tab@mozilla\\.xpi)|(\\{47c51f55-4f0b-499f-9fdd-c7c66bf4796a\\})|(\\{cd70c7c8-557d-46fa-9688-399c7c8d3d66\\})|(\\{681ad8e0-d1df-4cd2-a4cf-b97c1d6502a3\\})|(\\{0d58e690-bd48-4e3a-baf3-67aa40bc286a\\})|(\\{77bfbf26-4618-4120-9cb6-1fc7c92b8ddc\\})|(\\{037c6f6a-71f8-405b-9cff-fadf2ded6c47\\})|(\\{91cc3274-90d5-4e16-80e3-cd02fc513689\\})|(\\{2225b2af-0c3c-4345-adac-4f5bd40c2182\\})|(\\{81ca6b1e-a95b-4b44-9638-3ff3ea1a571d\\})|(\\{1e32acf8-fc1e-40ae-8783-c501ce50d597\\})|(\\{19670785-b1db-4d69-9538-2880ad8fdf20\\})|(\\{0113b4ad-15ca-4215-adeb-f0404f619ca6\\})|(\\{c7245149-4224-4c5c-91a4-84ea189f2227\\})|(\\{04dd2232-f1b1-4275-ae74-8bd27f3d850c\\})|(prosearch@mozilla\\.xpi)|(\\{d549a064-98e7-49ed-ba9e-a724e79a004f\\})|(\\{fddd3bc6-9d4e-4ee7-b490-0d6141ff7d7f\\})|(\\{122795b5-ae28-4371-9b61-878f5db888ac\\})|(\\{e3d491de-802a-4f82-91eb-9403c9f43637\\}))$/","prefs":[],"schema":1569181301396,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561752","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bea9680c-28c0-48a1-b8d4-e418adeba748","last_modified":1569241020387},{"guid":"{87bd05d5-d79e-4421-9c78-5c98ea78c351}","prefs":[],"schema":1568901038866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582168","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"TypeScript-Console"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9d746da-8881-4854-8026-ecb708a588f6","last_modified":1568905123995},{"guid":"/^((hd@youtube\\.com)|(@youtube-to-mp4)|(youtube-downloader@youtube\\.com))$/","prefs":[],"schema":1568885060842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent.","name":"More Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea29de20-dfe2-40c0-a5ec-45b1c780815d","last_modified":1568901023136},{"guid":"/^((\\{d81c0c7d-7420-4737-a3b9-dd9edeb4412f\\})|(\\{2bc89af7-d0ff-4b22-b7f6-ec87d15d999e\\})|(\\{3ee12352-a9db-4370-aa27-7e1d9acb628a\\}))$/","prefs":[],"schema":1568816167726,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581368","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"FSCH"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e56fd0a-77b6-477d-bada-78a5c18a37dd","last_modified":1568816392824},{"guid":"/^((@yvd-addon)|(ydh@downloader\\.youtube\\.com)|(tomp3@youtube\\.com))$/","prefs":[],"schema":1568814899255,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent","name":"Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73cae2b8-f60e-47b3-afca-a1ff555f4ec5","last_modified":1568816154119},{"guid":"{91c43d32-3a20-40cb-933b-47fd7c4b5a4e}","prefs":[],"schema":1568662894970,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581111","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Cookies Next"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e22dbf2b-70c8-41ed-b17a-32f53a22055b","last_modified":1568814886596},{"guid":"{23db2a76-49ca-4af2-af50-fccedd607e12}","prefs":[],"schema":1568317295345,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580616","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"YUI"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"13056233-543d-4c51-b89a-2a6b96ee324e","last_modified":1568374273725},{"guid":"{1056b983-063b-4bd0-b7f7-1295f7e04ade}","prefs":[],"schema":1568226375813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580749","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fast Browser"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"886e480a-8838-43c7-b9ca-b02592e23065","last_modified":1568285711403},{"guid":"/^((\\{8d0073fa-3193-4a7f-8c95-6a4e3d9272ba\\})|(445ac9f4aa1b833ce2dc75d6d6d6c76d0cef7cc7@temporary-addon)|(\\{cd0672d3-72dc-43d2-ae77-6cda31fb7c88\\})|(\\{403321a6-be8d-4ae3-a66d-e5c846f993b8\\}))$/","prefs":[],"schema":1568154081436,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580503","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Proxy Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a54f1c3-93e1-4a38-885c-afb98e7bc4f2","last_modified":1568224845558},{"guid":"{0fbe26d1-6891-475e-af3e-34f38a30348d}","prefs":[],"schema":1567971701994,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580118","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Lookbox"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67a61ba7-ad12-4eae-bdcc-e5b9b856dff4","last_modified":1568105279739},{"guid":"{a59679da-f097-4db4-b2bc-6ad7b645e127}","prefs":[],"schema":1567019346545,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GetMedia - Movies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.18","minVersion":"0"}],"id":"db043b8d-c91a-4d1d-b420-58087beef552","last_modified":1567022112963},{"guid":"{850be3a2-ca5f-47ad-838c-fe39b006e0da}","prefs":[],"schema":1567018965949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Safe Browsing"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"aeb6bc24-36cf-4199-94d9-68f4822fa2cf","last_modified":1567019082710},{"guid":"{ecb03616-f3c2-4580-99dd-6a233047abdd}","prefs":[],"schema":1567018902311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Sport TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"7e71a557-5664-4319-a792-c94b2bf744d8","last_modified":1567018965935},{"guid":"{8387ccbe-b9ac-438d-b049-c86b30a6dacb}","prefs":[],"schema":1567017236054,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":" This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMusic"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.17","minVersion":"0"}],"id":"9d598ecb-2473-4416-98b9-26658ea7746e","last_modified":1567018491638},{"guid":"{7ff51e81-f4b1-4682-9f45-43a771d80748}","prefs":[],"schema":1567017189557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMovies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.16","minVersion":"0"}],"id":"627a5309-d310-4130-9827-d3e6d3116ba2","last_modified":1567017236040},{"guid":"{2ef58672-740c-46bd-a50d-b9880986b574}","prefs":[],"schema":1567017167776,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Universe Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.5","minVersion":"0"}],"id":"c0767051-017a-45d7-b96f-632d7cae7c47","last_modified":1567017189541},{"guid":"{df9f6ab1-c82c-41d4-85ce-86dcfe839ce9}","prefs":[],"schema":1567017037001,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Media Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"6e9ea480-7f5f-49c7-b130-fb8af66bec0b","last_modified":1567017167761},{"guid":"{b89efd87-232e-4829-87d2-22148919d72f}","prefs":[],"schema":1566762089721,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1576681","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Ad-Blocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04365e2c-fbc2-4393-b2b3-a23ea5de6b79","last_modified":1566934428180},{"guid":"/^((\\{fb2cbb8e-a6f9-464b-97c7-aca958a404d6\\})|(\\{8cc60aa4-fceb-4a74-bef4-bbbdc23b85fb\\}))$/","prefs":[],"schema":1566419767711,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1573237","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"055d2447-c7b7-49a2-bb27-b1c09a592f32","last_modified":1566422986828},{"guid":"/^((AKMWWOEASKZXXCCRFA@AXXX)|(RF_WOEKTAMS@BASDFZMD)|(TI_BOAMZKXFFEE@ZCAOKEE)|(BMMAOSIKZX_TI_EE@BOASLL)|(ZN_ASVVZXLEOOO@ABOVVAE)|(MZXVCKMSSD_ZN_EF@GBOAAOS)|(UA_CZVVMSOEEE@DOPEEZXA)|(ZXCLASKDASD_UA_VV@AVLLZAA)|(VS_SOEOKAKXC@BOOCLLAA)|(AIWEKDZSV_VS_ASCZ@SAAAOOBB)|(IF_AZXOOVVVAA@EALXCOAA)|(VVALLEIASD_IF_AZ@OOBAAXXA)|(ZN_BF_AOXZAOKSD@VZXMASLX)|(VMZKMALSKD_BF_ZN@VIAAEOOSL)|(aunastralaa_1@auzn\\.ne)|(VXKCVLSO_ON_SOC@KIZIAO)|(ON_OPPOWOAKKS@BLZOAAAASL)|(nostallkka@iofjjakk\\.me)|(VZKKAKOOEE_LN_FK@BOOAASSDD)|(LN_VSOAJKXXXZZ@UDPPPADK)|(BNKZKASKDIE_EB_AKK@BLALEEKK)|(EB_AISJIKZLAA@DFKKAKE)|(NLDFKOBASOKCK@KFOLAAAEE)|(BBDMLDSFKER_AF_GG@AYYRR)|(OMVXNSDF_R_F_W@BMAMSEEE)|(EIGKFDAODS_RF_PDNAP_WEN@HUUUHJAA)|(GOEORG_RF_ANA_N@BDOFKOKK)|(BFDISDF_RG_AZXC@BDOFKAQ)|(OKOKDFBDFBDFG_RG_KS_BDK@AAAJAHU)|(ODKFOBKDPFB_PJ_FGK_AKK@AJIIJAA)|(UBXODJ_PA_PJ@XMVCOAKS))$/","prefs":[],"schema":1565206889166,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572346","why":"This add-on violates Mozilla's add-on policies by executing unwanted actions on websites without the user's consent or control.","name":"Page update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"85411892-1225-46fb-8f1b-5aa424bc2c01","last_modified":1565344753436},{"guid":"Shield_My_Searches_ehHQAdRPxE@shieldmysearches.com","prefs":[],"schema":1565034099452,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572066","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Shield My Searches"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74e070ac-891b-4f79-ac76-09a170d21a91","last_modified":1565181472444},{"guid":"{4f71ae77-8abe-43df-bb9f-cf440d6f7756}","prefs":[],"schema":1564993164184,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571059","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adblock for Youtube2019"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f73f6c1-38cf-4255-bb8f-8a61f19afd99","last_modified":1565003019901},{"guid":"{f2539eac-e545-475a-85b4-822347022dd8}","prefs":[],"schema":1564861308712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571130","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Woor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae64120f-d93a-4224-ac75-4038b0d2a33b","last_modified":1564993145778},{"guid":"/^((\\{8842eb7c-5f5c-4d33-aabe-81c27ae87dcc\\})|(web@1A72D794-697C-11E8-9D8C-1C0018C6383E)|(web@2a366bba-0a94-11e8-ba89-0ed5f89f718b)|(web@2bf1a18d-3240-42ad-9f7d-46017edc432c)|(web@2DC2452E-6999-11E8-A1CA-6C6318C6383E)|(web@2DC2452E-6999-11E8-A1CA-6C6318C63000)|(web@3)|(web@3ab4d660-8caf-412a-84eb-9cf2924f54c7)|(web@4)|(web@5)|(web@48F0D4BC-6FB8-11E8-B36A-905EE70C2B9F)|(web@82FCE0DC-836E-11E8-9E9B-164B9D46D017)|(web@90c91611-b4c8-470a-b251-77bb1f859dba)|(web@899ce5cc-06fc-436e-a59e-93a70eb4c810)|(web@3681a37c-6383-4e94-8076-28496af53983)|(web@7398cc9a-684e-40a4-afe1-b620e1a863b2)|(web@7398cc9a-684e-40a4-afe1-b620e1a86000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87dcc)|(web@10722358-d56d-4f5e-a89c-d4534d7c5000)|(web@10722358-d56d-4f5e-a89c-d4534d7c5565)|(web@67887931-77b9-4b1b-baee-9f23a4a384de)|(web@a3ea9864-1034-47b9-a25a-e9cc207a9319)|(web@af1e58bc-4ead-11e8-81fc-065ad97f23a5)|(web@af1e58bc-4ead-11e8-81fc-065ad97f2000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D017)|(web@ca5a2803-6421-4582-97e1-9e30fe44e100)|(web@ca5a2803-6421-4582-97e1-9e30fe44ee00)|(web@ca5a2803-6421-4582-97e1-9e30fe44eee0)|(web@cacf1377-a1b0-43e6-84bc-c0518922b22c)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce006e)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0060)|(web@e7a72615-19b1-42a5-8e34-ddfa89ced000)|(web@e7a72615-19b1-42a5-8e34-ddfa89cee000)|(web@e4058a8a-59ca-4ba7-b503-dfcf75639305)|(web@f3ac4769-1d70-444e-aa46-06d0427473b9)|(web@FACD83DA-68CC-11E8-8484-3DA118C6383E)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c000)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c32e)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c39e)|(web@ourdom)|(web@oursrchdom)|(web@test)|(web@testss))$/","prefs":[],"schema":1564669690124,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570659","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5aa0a7da-cf9e-4bac-bbed-1b7625109cc7","last_modified":1564671502746},{"guid":"{97ab6723-bc9a-4c5b-a08b-5b162d29ad4f}","prefs":[],"schema":1564669434797,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570385","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Toors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30d0ec83-70ac-4a03-9239-7af6c4061cde","last_modified":1564669681391},{"guid":"@weatherhubpro","prefs":[],"schema":1564668992535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570380","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"FreeWeather Pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"47315374-a775-4701-adc3-d0cfb61a44b8","last_modified":1564669425544},{"guid":"YouTube@develop.com","prefs":[],"schema":1564662247837,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570377","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Youtube Downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"176a0ef0-bd71-4b96-a3e3-14c17eaad3dd","last_modified":1564668305895},{"guid":"/^((nickrr878@gmail\\.com)|(\\{a06de0b3-b00f-472c-a34e-3a74b64d1747\\})|(spar\\.team@spar\\.team\\.com)|(\\{59904ffa-b247-41ea-9ac1-2ce0a2da8c98\\})|(\\{69c49344-90ec-458d-9811-a55878e26bd1\\}))$/","prefs":[],"schema":1564660970729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570622","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Shopping add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"26b10e69-d842-40ef-90ce-f96552e269a3","last_modified":1564661731567},{"guid":"/^((web@AppConverter)|(web@SearchManager)|(web@Email2)|(web@DefaultSearch)|(web@AudioConverter)|(web@translations)|(web@Manuals)|(web@HowTo)|(web@Property)|(my@WeatherTab)|(login@EmailAccount)|(web@WebDesign)|(web@Utility)|(web@Ancestry)|(web@Bank)|(web@CrimeReport)|(web@Taxes)|(web@Notepad)|(web@Crypto)|(web@peoplesearch)|(web@Weather)|(web@VideoConverter)|(web@TV)|(web@Transit)|(web@Template)|(web@Sports)|(web@SpeedTest)|(web@Social)|(web@Shopping)|(web@Scrapbook)|(web@Recipes)|(web@Radio)|(web@PhotoEditor)|(web@Photo)|(web@PCTexting)|(web@Packages)|(web@Office)|(web@News)|(web@Movies)|(web@Maps)|(web@Jobs)|(web@Interests)|(web@Games)|(web@Forms)|(web@Flights)|(web@Fitness)|(web@EmailAccount)|(web@Finance)|(web@Email)|(web@eBooks)|(web@DM)|(web@Coupons)|(web@Classifieds)|(web@Calendar)|(web@BrandedTab)|(web@Bible)|(web@Converter))$/","prefs":[],"schema":1564599359459,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570620","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b5e2f528-3a9c-43af-9f6d-98040157a59a","last_modified":1564660457769},{"guid":"{795697ee-695f-45d4-a997-6fe845b473d5}","prefs":[],"schema":1564342890085,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1569556","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM integration (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21bbd8dd-b79e-41b8-bd18-db1592e743c9","last_modified":1564399822770},{"guid":"/^((\\{86f185bb-b672-4a24-b3d9-a8751231b687\\})|(\\{8d98cfc9-3757-4fd9-b017-30ad60fb94ed\\})|(\\{288a7d51-4627-44c9-8cf0-cf18742a6f67\\})|(\\{49e5562b-38e2-4292-8080-ca3ffe8cea42\\}))$/","prefs":[],"schema":1563809747757,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1567876","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eeaa940b-b984-43da-88ce-d26891347e3d","last_modified":1563810026497},{"guid":"/^((\\{e656b354-3c95-4a63-a271-fe301b294da0\\})|(\\{f5ab4224-43ca-4654-b189-23aa9c960803\\})|(\\{fb68ec9f-d02a-48c9-a356-3020bd1d3e21\\})|(\\{2eabd9de-b8bc-43f2-9e77-624a0e04e38d\\})|(\\{426fe5e4-5da1-41b3-81d4-28bd59724f84\\})|(\\{4b1d9906-5cc4-44a6-ad64-a6c7b0e2ebba\\})|(\\{bbe2e2b3-4a77-4108-9183-e0b02676c09d\\})|(\\{01aef979-833c-4f7d-85a0-6be87462c05e\\})|(\\{9b51394e-a1a9-4864-9876-cc1d6f1a47d5\\})|(\\{7c4f0798-6edc-417b-8702-d97ca1c894c6\\})|(\\{ad93f537-5824-4057-a44f-cef1f97c2d68\\})|(\\{ff62fb9d-c5b7-414d-8c2b-bc5d796475e8\\})|(\\{46998928-4162-46e0-b4c7-260a8520aad9\\})|(\\{731367f8-f5e8-4ade-b8cf-5aaf8c2a455b\\})|(\\{eb6b098d-7811-4a20-a94f-ca91721d4aab\\})|(\\{6ddb9deb-d435-4ec2-be8b-ca65900e43e9\\})|(\\{288e4bb9-454e-4374-8734-1069241d618e\\}))$/","prefs":[],"schema":1563306101159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566026","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1f35915e-2de0-4973-adf4-4e77073e0b42","last_modified":1563367115113},{"guid":"/^((\\{7e9c2e2c-8d2d-4406-bb3d-993176f59b34\\})|(\\{f743e1bf-9a1c-43ab-b8ab-57972761b919\\})|(\\{b8274b35-eeaf-4d98-8a6a-cc4fd56603ed\\})|(\\{fd90393d-6ac6-4245-a048-9d423baacbd1\\})|(\\{3f7b376e-23ad-4296-8fd1-77fb254610bc\\})|(\\{fd918017-a23c-40f0-88e1-798ed6fc51f7\\})|(\\{bac48192-5c1f-4dae-aa1c-2fa9ca65dbe0\\}))$/","prefs":[],"schema":1563284869997,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566557","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Add-ons overriding search settings"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59cf2549-3930-4a60-a212-af84facbee32","last_modified":1563302090004},{"guid":"/^((general@mapseasy\\.net)|(\\{fd4b0f58-5268-4d52-b09b-547e867fef27\\})|(\\{efe13936-3bfa-44ce-9224-e8cb27f0f216\\})|(\\{c6b767a7-b0c1-4b68-8ac6-d08fee14c5a0\\})|(\\{a9df2ef3-9746-4d5e-b7aa-0baa531538d2\\})|(\\{2d947dd9-fa0f-4f20-8812-31ce9e29081b\\})|(\\{3e800ada-345b-4ac4-82a5-0dbfd00d7877\\})|(\\{a5fcf820-575a-42c2-aeb1-de1a794db1b9\\})|(\\{da844d4c-44e1-4799-ac53-9bb1ad2c8227\\})|(private-tab@mozilla\\.xpi)|(\\{56dbb679-8db4-47ce-851b-a7eab0e215cc\\})|(\\{c1415289-4471-4b6a-b7b7-4feaf9506b38\\})|(\\{29439407-f908-4779-9078-eb190f21dc4f\\})|(\\{5401ea8b-def8-4df3-bf9a-f520b147df69\\})|(newtab-plugin@mozilla\\.xpi))$/","prefs":[],"schema":1563133289502,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565994","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c349ecdc-5fa8-4b87-bfa2-c732dfde094d","last_modified":1563186751969},{"guid":"/^((langpacasdjasdk-de@firefox\\.mozilla\\.org)|(langpack-de-7@niklasb)|(langpack-de-8@niklasb)|(langpack-de-9@niklasb)|(langpack-de-10@niklasb)|(langpack-de-nightly-1@firefox\\.mozilla\\.org))$/","prefs":[],"schema":1562673203781,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1564401","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"German language pack (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d38035ff-7945-49cc-88fb-6de9f8a13658","last_modified":1562673628501},{"guid":"sourcegraph-for-firefox@sourcegraph.com","prefs":[],"schema":1562614890305,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541010","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Sourcegraph for Firefox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"9fde5729-9be6-4955-9627-67742c5ed62a","last_modified":1562667113062},{"guid":"/^((\\{6d0887bd-1f51-4852-9307-cf2a223c3a9a\\})|(\\{4cb2b177-e2a2-4ae1-b759-03606a85df61\\})|(\\{df28b68e-ad39-4300-add2-b2dc8bf54f71\\})|(\\{eff0a5d5-3f53-4b75-b451-5acffd5bb61d\\})|(\\{7561d328-6b59-449a-bf7a-46fea5027be4\\})|(\\{854246c0-f678-44ff-85f3-f340f33c5da9\\})|(\\{9e976e36-9eb7-44bd-97a3-4901ab3e1021\\})|(\\{2e9a0a60-8423-4ffc-89ef-74a02ca8c5e8\\})|(\\{a5e298c3-2d74-4268-8d13-e0efcb77d896\\})|(\\{39838189-7836-432f-9a34-a009886a61f8\\})|(\\{a3f781a4-adc7-4a12-9812-20da06e7b6d9\\})|(\\{365b3845-1e12-4096-80f1-8be24456d741\\})|(\\{701511ef-2e5a-458f-b735-c789b7ae6feb\\})|(\\{888807df-4517-4b97-ac73-e4294865e375\\})|(\\{ea7c7094-9d83-416d-bd13-e85fcef481a5\\})|(\\{1f67e4bd-6eb6-4fd7-a694-b8b360494cc3\\})|(\\{4f9520a5-caa6-4832-9582-2b26b8739305\\})|(\\{06f5112b-da03-481b-bef1-bf752ddbe7a2\\}))$/","prefs":[],"schema":1562269304530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8e35175-572a-4b00-b5d3-9c8df255f1ec","last_modified":1562320360370},{"guid":"/^((\\{fc2dbae0-1ab3-40fe-9a38-cbee911b903e\\})|(\\{82e3e07c-0cf3-4b9f-a625-65d378698af3\\})|(\\{2904a7ee-0b54-4adb-a500-b932b77b6936\\})|(\\{f6932562-1f6d-4779-b5a4-f4c4654980dd\\})|(\\{97f0cc0f-69cf-4e5a-af68-f404aa3f1ce5\\})|(\\{c346f3ce-08bc-44b7-9410-bd8ad65f32d5\\})|(\\{f68f3bd2-ece8-4a85-b071-cea253cd78ac\\})|(\\{d9b6a925-e00c-4e36-a282-e6b76833e5b5\\})|(\\{e8a67ebd-655e-48f9-99e7-619c850f6bcc\\})|(\\{15942451-8c62-457f-8ff1-8525ce647c0d\\})|(\\{8fcdb966-eec2-4cd0-865e-1d105e9b59e2\\})|(\\{6ae58312-7d81-4d39-84f1-454ae6ace826\\})|(\\{023cd859-1b7c-4384-80e5-eca82c68a21c\\})|(\\{694e912f-011f-4be4-add9-25c85af8014d\\})|(\\{b889539e-4b8c-4e52-a605-a0b33532fd05\\})|(\\{596c6d7c-49ab-440e-a50d-220e5db393f7\\})|(\\{f0fd5c9c-1fcd-4085-ac41-47c379517420\\})|(\\{545dbede-b51c-477b-b23b-936dd5e7a428\\})|(\\{c3f9f4e6-b5ed-49fb-82c6-313b9617cddb\\})|(\\{309908bd-c2fe-4066-82c5-0631571e77fc\\})|(\\{75f93037-6366-4f88-b92b-c3174d68a836\\})|(\\{36e57809-88bb-47ef-9b6c-90170bb753d5\\})|(\\{da83ef9e-f36a-4416-a4ab-29a09c981690\\})|(\\{09e50933-f19f-435a-8e6a-7663715ea3fc\\})|(\\{7f35f6f3-714d-4c0d-befa-5a6843c62b6f\\})|(\\{b3b3f9c6-6b64-47d0-bf5a-f9796d1d7cfc\\})|(\\{116c6521-bda8-469c-9ca6-0702860aca67\\})|(\\{98566ed5-4c57-4da4-946f-03beeaa6145b\\})|(\\{8fc257d4-612c-4196-9688-dd7de0979c44\\})|(\\{9b7f873c-cf3f-4d8d-9cd2-3c68ce0f831f\\}))$/","prefs":[],"schema":1562096490180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f55f27d-37e5-4c3e-bd9d-02924496ba3d","last_modified":1562227635293},{"guid":"/^((\\{a3250b1a-de19-432b-829f-3d4c18ff4549\\})|(\\{b315912c-03f9-4ca8-a9fd-9410786d242a\\})|(\\{d1e4d5e2-9c6d-4e1d-9638-d329d64e5484\\})|(\\{898e64b3-38b0-4748-93a2-7e68874a73c9\\})|(\\{062f9d2e-1e5d-47e1-a9e6-0a4eb1e8182c\\})|(\\{434cedce-3d36-4ec1-b99d-e2b5ec929e8f\\})|(\\{b429f2f0-62de-4c72-9722-9ccbcc43500c\\})|(\\{7405ed28-67e9-4836-9c38-26bb7175da3b\\})|(\\{ebb5fe5c-5561-47e8-8240-bae4ba4b0389\\})|(\\{a9a5ac46-ade8-4927-85db-5c36bb26fd2c\\})|(\\{34d93cc4-a468-4ddd-98a4-31d1237b9986\\})|(\\{394a7da5-0f59-425c-ae83-49ad47c30a51\\})|(\\{15532ccb-c575-4b8b-9a62-ca2e4b9cbd7d\\})|(\\{d0579f20-4e35-4d7e-be6a-3da1b7660ce7\\})|(\\{f39c789b-9a2f-477e-885e-675f499e8307\\})|(\\{7adb91a0-6c6b-4fc6-911c-63a0c10bb363\\})|(\\{8b51d36c-f5d2-4c9d-b431-2c5011168470\\}))$/","prefs":[],"schema":1562061057131,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562598","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"432368eb-333d-4280-846d-e9508ac0a8c4","last_modified":1562061250280},{"guid":"/^((chromelogger@usernamewilson\\.com)|(firefoxsecurity@usernamewilson\\.com))$/","prefs":[],"schema":1562001599116,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fire Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c4cd1e9e-b81f-40ef-8c0d-86b42d884a7e","last_modified":1562061057121},{"guid":"/^((\\{02421745-5b6e-45e3-925c-670b72162fa5\\})|(\\{165626db-f5c5-4e96-b7c5-dafaed6357f4\\})|(\\{87115bc9-2e52-455a-b82d-2753d3303d0c\\})|(\\{be0863e2-c325-48cf-9623-88bcc6d01970\\})|(\\{09298d3c-f8f1-401d-bd70-43cb66af1594\\}))$/","prefs":[],"schema":1561988438120,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562634","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3031bfa1-90c6-4b7a-ba03-7fcd7e010914","last_modified":1561988914045},{"guid":"/^((\\{fd605874-13ff-4b86-8018-9167923792c9\\})|(\\{687ac7de-0c7c-4e5d-9fac-10757591026d\\})|(\\{c9c11fd7-6774-4657-afe4-0cbf1081b505\\})|(\\{5970609b-547d-4094-b806-a9b0a2996c62\\})|(\\{f77d7ff3-05df-4455-aa23-8031dd341ec0\\})|(\\{d5238802-9ff3-49fd-a427-8eb7a73a08e1\\})|(\\{93a425f5-cc32-42bb-ab4d-63b53512cb52\\})|(\\{23de42fd-b546-4792-ae2f-e2f808e13b52\\})|(\\{209b8c63-d260-4fc7-be92-20e3b04eb944\\})|(\\{e6610c1e-4bd2-4ced-9d40-0a4fc125fd42\\})|(\\{6631ea49-4664-4acc-97dc-0d7e4a67a417\\})|(\\{b811cceb-fcd6-4eb6-b07b-c8c01794eaad\\})|(\\{8ad9f113-7b59-4c45-9c90-59609e7ee91a\\})|(\\{130f1820-9c73-439d-a9c8-114702e1d415\\})|(\\{6dd75c5f-407d-4f3b-9c29-90c422c82d85\\})|(\\{99968b5b-6b54-42e8-932f-0414bfd17405\\})|(\\{1a69e311-e730-48af-b050-f60247a32fe9\\})|(\\{67f715b0-1262-4660-9fa2-c6f7bc29ecc9\\})|(\\{3a8513a4-cac1-4619-ae36-9686bcbb42a2\\})|(\\{27af1be9-f9d9-40d7-878c-78d8bcd94dd5\\})|(\\{7b59b760-964a-43af-83b6-b4ef08fd2e07\\})|(\\{861bd389-6024-4aae-a31b-f334163c1406\\})|(\\{cdcdbb24-88fb-42f8-872c-3df116f82cad\\})|(\\{8c60aa85-e195-4203-8529-073a6db56c54\\})|(\\{c5781fde-fe4f-4792-9e01-4e1239c00b08\\})|(\\{1361b734-0efa-4d8d-8108-ead9400b50d8\\})|(\\{ce79c320-0b55-430a-a431-2cd69cc2919e\\})|(\\{cb976837-ff98-4f37-b81b-98571f3a7828\\})|(\\{21dd7ebb-6736-470a-afe0-5dcea38b3db7\\})|(\\{84b09a06-0f25-40ff-8198-98e2e54a739b\\})|(\\{b869d674-37ba-4df4-a34d-dc9be47a963d\\})|(\\{e18783e4-8e04-457e-9b35-611d20fc12e8\\})|(\\{04042b52-3398-4e42-a638-ef9200c589f4\\})|(\\{96292080-d058-458d-a6c6-bff1d52425a2\\})|(\\{aa584391-2c81-4dfb-b06e-5118b026104e\\})|(\\{6285eae8-ff36-4887-b46c-3772ec04390f\\})|(\\{ea28f6ac-affc-45cb-a536-1eb1bceae142\\})|(\\{340afda6-c1e6-4ac4-8e5f-a5b439a9dfa1\\})|(\\{62202f8d-8e11-4ce0-af66-2235ad17051c\\})|(\\{d4e05835-d503-4d21-9701-a24dd61b0513\\})|(\\{3e8d4f85-d823-4dac-84fd-4b87b33e7852\\})|(\\{c04dbf0d-9b39-4730-93fa-6680aa0909f1\\})|(\\{019be100-cda8-43ae-8136-a014db9e7a9f\\})|(\\{73c512b3-a9c9-4690-bba5-fbfb94aeabd7\\})|(\\{0c78c766-7ebb-4b2b-85dc-d4fcd4da6e9e\\})|(\\{a318cd63-2e84-4d05-96b8-13b721fdec8c\\})|(\\{97d03ad5-3911-4c72-8ff9-5f4b9beade68\\})|(\\{77c5010c-c799-469c-85b8-5e7e0140fb10\\})|(\\{16458eb7-545e-4626-8620-e31d71cfbcc3\\})|(\\{a5a61ddf-c248-4109-a1ba-b8bf84e728c3\\})|(\\{6b18c850-65e3-4cc8-b3f6-e78969c9a428\\})|(\\{4ae632f1-6735-4077-8b62-f73d68eab36c\\})|(\\{db7b2525-ccd1-4ee6-8daa-890d7879ed07\\})|(\\{9e382691-320d-4500-b378-90c9ad922422\\})|(\\{1bf86700-b428-4e67-9701-536f66ec0a2c\\})|(\\{d6841f20-fd15-4373-944d-a0dd6a286d69\\})|(\\{18169628-a7de-4c93-9d30-efb66f45b5a4\\})|(\\{d9979d00-eb14-4cb3-bb21-452d2c02e3dd\\})|(\\{cb868690-a1dc-4fe0-bd2e-2ab291cd54a4\\})|(\\{230faf82-9048-43e9-ab19-94bfe1113ad9\\})|(\\{e0723460-a1a2-4877-bb20-a3f14e01e594\\})|(\\{2431dfee-a855-46b4-a740-6d0e4dbaa662\\})|(\\{1d44053a-5ff6-494c-8fef-0084039eb8ac\\})|(\\{bc77d204-ecd7-42ee-8006-cd54be0a400e\\})|(\\{9e22fccc-6b4a-4674-87f2-e6ecd4b409d6\\})|(\\{62474e9a-8a3a-41cc-9530-97baf6f8b7af\\})|(\\{6932ebe8-ed27-4291-86fd-d5147e0f5702\\})|(\\{aa5b9279-e324-4951-8a12-b0712f37e233\\})|(\\{420e769f-b577-420d-bf07-182299d75882\\})|(\\{11a0fbd7-b2c9-427a-8d33-e7fd8e845630\\})|(\\{a4dfd321-45e6-42dc-9ac8-9d606ad4a672\\})|(\\{54685c20-9401-48d7-a950-81e7b10bd9ed\\})|(\\{2605a51d-53d1-4345-9fbc-380fab2a0c4e\\})|(\\{c3699f84-dacd-4734-a60c-7ecb1b28289a\\})|(\\{074b0ddb-5187-484b-9783-22d187e6dd08\\}))$/","prefs":[],"schema":1561923700391,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562630","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56849c09-6253-44ed-bc59-1cd7a61ce961","last_modified":1561988438110},{"guid":"tab-api@mozilla.xpi","prefs":[],"schema":1561710153929,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562154","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Tab API"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f484302-44da-4b6a-afd8-94113b83c0f6","last_modified":1561710520557},{"guid":"/^((\\{b7a0ecf9-212b-49ca-bec1-ead0c6dc2128\\})|(\\{6e977a6d-b31d-4735-a586-41dc25df2100\\})|(\\{67155a2a-6538-42b1-bdc9-f48b442f57e7\\})|(\\{b4d4abc0-5e6e-4a34-a7e3-bfe7319160b8\\})|(\\{2102c5a9-f3c4-4f71-bb6e-c45c9d07b6c8\\})|(\\{071c1c7a-cde3-4a22-aefe-7c8f98df6277\\})|(\\{aa2f3e70-7dcf-4b4e-92c5-54c8280b98de\\})|(\\{3b376420-b276-4a0c-9e28-340dcc0547ce\\})|(\\{ed192371-abcc-4520-ab76-d22afbe51dff\\})|(\\{ad5a457f-59c8-4d90-8e3e-59f13a3bc2b2\\})|(\\{06aa60ab-91ad-4b8a-bfda-98e33b65fbb5\\})|(\\{c2875a12-da6a-4f90-a919-1d2bef57fbff\\})|(\\{b01d1c5b-58b5-4411-86d0-555131c7bd07\\})|(\\{0a79c7eb-5fe9-4e37-841e-18686bc86a20\\})|(\\{341ca205-d6e0-4d03-93be-04939c429412\\})|(\\{855e09d9-ac3a-4885-828d-557734060c1f\\})|(\\{8ac01eb1-9819-4c41-b2b7-042d8cdb3f2e\\}))$/","prefs":[],"schema":1561657651090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562153","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3460b6b7-8251-4588-8f12-81ac8d288c88","last_modified":1561710153920},{"guid":"/^((\\{65b88db7-9c07-4d03-80eb-2e5cf6cd7aa8\\})|(\\{aa2ef90f-db17-4ece-abab-4f87830457db\\})|(\\{e50969c9-088c-4978-9ffb-5d78015dabcc\\})|(\\{15fd1a8e-db53-41fa-9c46-93ec5b7473c1\\})|(\\{ed84b63e-faa2-4c48-b080-e9612cbc2e49\\})|(\\{c784f63e-5609-47a8-92ee-33a2bcb3239b\\})|(\\{1641b1ec-9a3d-4e3c-b52e-bc80671349f9\\}))$/","prefs":[],"schema":1561587664411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561854","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3e88dad8-f640-46dd-8b00-4b955eea7b24","last_modified":1561626172388},{"guid":"/^((\\{f0df6aa3-9792-4476-daa6-4709f93bbce3\\})|(\\{fe934134-3d0f-462b-d56e-e7187dfa8c98\\})|(\\{429999c4-1b8b-46fb-863f-ce19a08afc9c\\})|(\\{b8003074-2123-45be-91cf-654ef9671e1a\\})|(\\{9712066a-d491-4293-cd31-8ef8ee907d40\\})|(\\{dcfbb98b-783b-4df0-8427-e269114736cb\\})|(\\{66c44e3b-2df2-4741-ff07-0067cca4fe95\\})|(\\{af0a4d96-3403-496f-9d9a-5c766bf44bac\\})|(\\{82c60958-45da-4e6a-de21-879775c5473a\\})|(\\{c9118234-5787-488d-b30c-7d0a904fbabb\\})|(\\{f07d3da6-81ea-464f-9bef-6ff5470b307b\\})|(\\{c2454a12-7f57-440e-f695-0a9618f48b80\\})|(\\{f6e1d884-8100-49e7-88b9-bff8d9295cd2\\}))$/","prefs":[],"schema":1561552773231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561603","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Various script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c227983-1180-4b4a-b25b-8160738e7238","last_modified":1561554563187},{"guid":"/^((\\{4200b565-5c4a-410f-b4fb-478daae2537f\\})|(\\{a0bba103-21d5-49c8-96f3-4eabbe78ced3\\})|(\\{ec46fe21-5690-4757-8ebc-1c77f826fe6b\\})|(\\{ce45d605-3bb6-4fad-8c1b-238ecee0d3df\\})|(\\{c70bd1fe-1d7d-4ae5-a731-3d513e6c46ba\\})|(\\{aeec96ca-81b9-405c-bd70-01ea6a50be9d\\})|(\\{0a1603a8-839f-4890-b1e3-1b8e00a7a0c9\\})|(\\{45febc8f-eaeb-4cec-90ea-07a7edc22793\\})|(\\{a7c7febd-6726-4d0e-9947-2edfd8bea35a\\})|(\\{eda3389e-ae07-4a2c-9b50-ce4e9008f297\\})|(\\{0e5d1d65-4fbb-4dd9-9042-3b568d9e2489\\})|(\\{1461f0e5-3c4a-453e-aed2-ca45ff5db747\\})|(\\{e842e73d-9d8a-45a8-bf0d-ef974ab24767\\})|(\\{e1d4fa8a-3da0-4fee-8b4f-0c7233fcb49a\\}))$/","prefs":[],"schema":1561541784349,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561595","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e886e0c-00ab-44c2-bcbe-7c8793d46d89","last_modified":1561551163572},{"guid":"/^((\\{0eddfecf-eb8a-4a08-8189-004932a77d5b\\})|(\\{b8181b05-a263-410c-8c07-5d7e8c80f9a2\\})|(\\{561d3a53-8e1f-417c-9b46-af1ea9942c4d\\})|(\\{cae0f640-a4b8-4ea0-8667-39ec00651b54\\})|(\\{142aae9b-ff6a-4ae3-b4c4-75e99534e661\\})|(\\{0592cc75-3027-420c-9a9c-22b23a21af5b\\})|(\\{23f8f54b-1f6a-4760-bd9a-414aba8d93c4\\})|(\\{09d0cd99-4cde-42d2-9a4e-8002f7595834\\}))$/","prefs":[],"schema":1561380181925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560886","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ADB amazon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dba9e10e-ff77-45dd-a2fc-e7daf5f09fd5","last_modified":1561381085652},{"guid":"/^((\\{99a325df-ca23-41da-84ce-477796f46737\\})|(\\{86a9b963-ebd2-4ef5-abaf-5ffd7cf86387\\})|(\\{9c05da6f-e5e2-4455-bae3-2754e1b36db4\\})|(\\{002d0276-03dc-439b-bea4-576976bbd7c4\\})|(\\{4476484a-2a0a-4a7a-8612-18ac22e02ac9\\})|(\\{edb28501-65bc-49f1-b168-1ea5e84d4a19\\})|(\\{13b0c2d6-0a44-47e0-aced-0664877b8a4e\\})|(\\{fdd30cab-1f29-439b-829d-80c5546087e0\\})|(\\{2abed6fc-d8ac-479f-8fdb-f5d20b0a5c27\\})|(\\{7afb7eb5-7837-474f-a925-62728be18488\\})|(\\{ff86f12d-e38b-4c70-ab00-9cd20174ddcd\\})|(\\{31b72d81-14d8-40e5-a2c2-7259a7d40d96\\})|(\\{84e3002a-a0ea-42f8-b30c-1739cb21b105\\})|(\\{47d8027c-a331-4f8b-8c69-4c95680caba5\\})|(\\{d03ae30a-58b5-4dc1-afd9-bc4ea8efc761\\})|(\\{eb745394-234d-48b4-bf1e-cdec66de26d3\\})|(\\{b5614c0a-878a-412f-ad7b-bc5a7916b3bf\\})|(\\{1d5916f7-3a78-40ce-92a0-35989646fe8d\\})|(\\{34cfd020-1dce-4f12-9499-f7e3b02582d0\\})|(\\{7fbdd1c1-82a4-4cfc-a3c2-ad192f5c8cf8\\})|(\\{04fbbb51-3b76-484a-99ca-ccd3e484da26\\}))$/","prefs":[],"schema":1561379624735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560888","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5525a8a4-2b7f-4cb8-8932-5daf35a2acc9","last_modified":1561380181911},{"guid":"/^((superzoom-unlisted@funnerapps\\.com)|(superzoom-unlisted-test@funnerapps\\.com)|(superzoom-hosted@funnerapps\\.com))$/","prefs":[],"schema":1561260352539,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560927","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"SuperZoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7a12a25-37c2-4ec7-8fa2-e016442b4457","last_modified":1561379624719},{"guid":"/^((\\{dfc97392-12f9-474c-9a61-fba12334d09f\\})|(\\{ca0e7543-892d-4625-8565-3671141a4ac4\\})|(\\{d50b1b61-8ba1-471b-833e-c5526ea4f307\\})|(\\{ae53880e-f5b2-4020-bdb5-0872cc1196af\\})|(\\{cb8982c0-1f56-439e-94a0-83a0308ea952\\})|(\\{91ca701d-73e3-4d76-80bc-4cbefc16beae\\})|(\\{f238a031-3366-4792-89b0-736f5e1af888\\})|(\\{35f7fa51-338b-4a7c-9f74-055708e2c941\\}))$/","prefs":[],"schema":1561232502012,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a6e32f3-3d97-4393-8733-1a24b8796aa3","last_modified":1561246819959},{"guid":"/^((\\{eb585608-4896-4892-8a9b-1786929a6517\\})|(\\{b53cec3a-0479-4887-93b2-4732059e6f95\\})|(\\{52e84405-484c-4bfb-a279-da57dc8f89d4\\})|(\\{65136894-4082-4eac-a968-ad5dfd1771f8\\})|(\\{98d5570d-3606-40f8-8af2-2d2144698a92\\})|(\\{5ced4e6d-5c50-4e26-9d8b-b82a8d9b4e87\\})|(\\{fc97e534-4690-462b-8227-af38c67b57e2\\})|(\\{8aa21cc1-d9ac-4c43-b205-bfbd87aa8163\\})|(\\{f3dd0563-975b-475b-b295-2922f6e69717\\})|(\\{b1ee58e1-90de-425b-ab76-dd8e034305c8\\})|(\\{ae026b4b-7159-4415-98d4-1fb712092028\\})|(\\{452ec3ac-8fba-4de8-a5dd-db1cf9b89c35\\})|(\\{4c0a3c25-f706-4160-8128-197137e814b8\\})|(\\{30c347c6-642c-46cf-899d-442632d90e25\\})|(\\{7dd79020-d8d4-4241-b1fe-efca66530d5d\\}))$/","prefs":[],"schema":1561059702370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"61f4423b-7171-4a82-8aae-71621233ee2a","last_modified":1561148779474},{"guid":"/^((\\{2adb8263-d69a-4436-a46e-b8595c35d3e4\\})|(\\{d2d96579-be7c-4bc0-9d94-7eb8920ed437\\})|(\\{3ef03e82-ae5c-4bb4-85f2-d0925d3b1d8f\\})|(\\{5f89e2ff-b113-45a7-bd44-a8cbb6b3e18e\\})|(\\{d0a65809-897d-40af-974c-df6baa16e0d6\\})|(\\{17d71711-a428-4231-93f7-25f65dc7a05f\\})|(\\{88bf0d44-b815-4654-b177-25ed224587de\\})|(\\{0bc2f2bb-b040-4512-b0bf-a2a875bfbcc7\\})|(\\{c05607b1-ce5d-4a14-ac71-91d93e5adc7c\\})|(\\{14d1d1c6-3982-4379-bf48-67aff16b0b40\\})|(\\{db395935-5b36-43e0-9c21-2fc546e3504b\\})|(\\{031a0658-d9a4-4dab-8b9a-3608a92d3d9f\\})|(\\{28a6ee49-33dd-4cc1-8650-7abc95ff30c1\\})|(\\{578c5cb1-ed39-4270-9010-3d7c623e4ed3\\}))$/","prefs":[],"schema":1560890279256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560126","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39d92b03-d7b7-41d3-8d14-73088972f735","last_modified":1560959139660},{"guid":"/^((\\{52e29477-bb59-452a-a929-7d238ab68dc8\\})|(\\{e7c3e8d7-0cd7-4cea-8fe6-afd0dda61f56\\})|(\\{f57df33b-b222-4524-86c3-531a6d20b4c2\\})|(\\{5bfc5ee1-d8de-4efd-80f5-966b94eec12b\\})|(\\{ed229f56-afbb-48e5-8422-2ad940afa02f\\})|(\\{c87d1f11-ce0e-46eb-8710-1288416b709b\\})|(\\{177b00c2-4fb2-4268-b0c7-cb5a1ad08d83\\})|(\\{33850c97-5260-409e-9796-bd9e03aeb411\\}))$/","prefs":[],"schema":1560874921856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559787","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b44844c7-0ba9-477c-b0f3-bd12725c620e","last_modified":1560875340234},{"guid":"/^((\\{004b2982-0956-4c66-a7f3-7dba26eeda94\\})|(\\{31606ee8-6af1-4d3e-98d0-451b8483a498\\})|(\\{914f7369-d844-4e72-a8de-043378710864\\})|(\\{87506f0b-af77-4113-8358-fbb0a9f6daa7\\})|(\\{74832b41-91e6-4bf0-a6a9-5e74bf3e5683\\})|(\\{94e526a9-70ec-4566-995c-53e597166c8c\\})|(\\{1679b342-31d5-44b2-ae2b-91c487b2654f\\})|(\\{ead96242-a6c8-4478-88c5-5e2c54d9ace1\\})|(\\{ab0e69c5-d215-4825-8e40-de0bcae97da9\\})|(\\{2607b07a-90e6-4c0e-9bd8-94eb16982303\\})|(\\{c8336a7e-f5ef-41d8-9754-31676cb4f6c4\\})|(\\{49185403-71d8-40ed-9e30-71171231a2c0\\})|(\\{724540be-a261-4d92-bee5-ede7c6375ed6\\})|(\\{6b687abb-9aa2-4e76-bdc9-cb542809cf7a\\})|(\\{faec57e2-f33f-4974-b29c-3afc2d710ae5\\})|(\\{2dc254ac-f312-4db3-84b2-29690e20ce4d\\})|(\\{c60eb214-f702-48fd-b173-756b528cee4b\\})|(\\{6cf50082-5b79-400b-846a-8902d6609a37\\})|(\\{a45c880d-5037-4428-9e1c-ec1cd45fe830\\})|(\\{d410777f-d023-44d5-bdb8-a54b0c927daa\\})|(\\{36fbd9e9-1d2d-411f-981d-b57fbc1067db\\})|(\\{170130b4-3178-4dc2-a1f6-98a788299b16\\})|(\\{aa54e92d-20ad-4f3f-a0c7-95a97bd5e99d\\})|(\\{6e73d781-bce5-40e0-a847-63a936f58ca6\\})|(\\{861af4ed-838b-4e5f-94c7-0e95bc6b709b\\})|(\\{3e000c1f-3ad5-455c-9a20-f18035273746\\})|(\\{aeacd5ad-8949-46a0-96b0-96c9f93f0b8b\\})|(\\{c7f65d43-1a36-4683-864f-c7224037289e\\}))$/","prefs":[],"schema":1560874615935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559776","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Norton add-ons and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7434a6e0-c434-4017-b475-625bd0f85890","last_modified":1560874921842},{"guid":"/^((\\{c3ff7a71-7392-4aa1-a193-95fd393a7389\\})|(\\{9255568f-d790-4b45-9fe7-d4d1bcc193cd\\})|(\\{76d7025a-8c31-4b0b-a9de-c6679919ef81\\})|(\\{6b93c35f-74c4-4d79-8557-b3fcb090049a\\})|(\\{f9dbfda2-5680-43f1-9575-5cb044264f7c\\})|(\\{096e84e1-36c8-48fe-b642-03c91c1ef14f\\})|(\\{a11e0be8-9b45-4d69-9aad-339d3220147c\\})|(\\{fb754f2e-c021-4190-96fd-7142cbcb985e\\})|(\\{69187792-e951-4ea9-ad26-378f25efee81\\})|(\\{6468fac9-e37b-43e9-9895-36143902e431\\})|(\\{ff1db01d-4e0d-4917-b487-7f3c28d7f5da\\})|(\\{1adb7040-3a78-4270-b4d3-b926819d4c72\\})|(\\{9b3d09a1-2134-48e3-bf0c-a6dc659aad93\\})|(\\{bfa38150-f24e-4443-9d07-875b21ff479e\\})|(\\{05c8e9b0-0b8a-4da2-9e44-a215e691302c\\})|(\\{e4868162-b7f2-40dc-9101-4eab9858876b\\})|(\\{541118b3-1905-4d4a-9059-3ac745b0b043\\})|(\\{d38507bd-22ee-4839-be07-cae4806ac227\\})|(\\{dbef35f1-fc95-42e3-a4a6-b94a970b8a7a\\})|(\\{f34d7289-64c7-4720-90e9-6a6cad0ddc9c\\})|(\\{96b900d3-784a-4e93-8b9f-5f7885424117\\})|(\\{a6ccaf93-4d0a-4bcd-b574-b6d1417bdb0d\\})|(\\{186d942f-cc7f-4054-9673-067f9aaae190\\})|(\\{f7c0f615-d406-4cf8-b5de-bde347f7d9f9\\})|(\\{ddf49e42-2db2-448f-9717-96a93bdb078d\\})|(\\{add62eb4-d1c1-4217-920c-dfb462e955aa\\})|(\\{71ef4372-6321-4e99-937a-0a4a03476348\\})|(\\{053307b4-d841-4d42-8fda-881aa7f7777d\\})|(\\{458e497b-8e5c-4901-82be-1e33832bdac2\\})|(\\{3bf07b01-bc56-4b28-acb4-7d56bb6f5fc8\\})|(\\{7e50978d-cf4e-429b-8482-946c86991bfd\\})|(\\{7691a931-7d5e-4daf-ad20-14539572c215\\})|(\\{c1d8d622-aa7b-4e36-9d5e-e1de1b1044da\\})|(\\{f1b85cd5-bc61-4994-96fb-74df9c62d385\\})|(\\{e26cab94-6216-47e7-b725-948613f2a08c\\})|(\\{2278a05e-3b98-4fe4-83f3-f90d42ce0870\\})|(\\{85240094-c94c-40b7-84ac-6dcf1d50cee5\\})|(\\{7e5f5b7a-ef9d-41a8-8137-da6399afdd5d\\})|(\\{85d01efb-0331-4f7c-9ef2-f5f35c0df0a9\\})|(\\{f455923d-856d-4f2e-8e1b-8cffb0b7a4a4\\})|(\\{cd4fab1b-03b4-42eb-9800-1664c4de06c2\\})|(\\{44ad1c10-baa5-4efe-96bf-743d6a86079e\\})|(\\{73cf3b22-f479-495e-8bab-54ca07e3341f\\})|(\\{c4e856fe-5594-4484-9463-a139eb6071e5\\})|(\\{6f110a84-aa60-4849-8408-9ee70c868e8e\\})|(\\{67d91fb9-3da3-481c-a426-a350788764f2\\})|(\\{eb7699e3-9886-40d5-863e-0bf6862f2f98\\})|(\\{e18709ec-f4d2-40de-8e88-ef7a6f1d4fef\\})|(\\{f83cd650-3411-454d-aadd-79bbd82f3793\\})|(\\{edb44a75-f988-4ce7-ad83-1b7cfe3da54b\\})|(\\{b328a40e-52a7-48df-8960-8f79927bfd35\\})|(\\{f8681a1c-062e-4934-a1ff-6479f179aa97\\})|(\\{f052ef52-7b0e-4a99-9490-892b515d7ace\\}))$/","prefs":[],"schema":1560714091988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559772","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"34b4e88a-ca61-48fc-a6c7-7e08aedf7887","last_modified":1560874615921},{"guid":"/^((\\{c5ab9361-f8d8-454a-b268-a4b355b37a83\\})|(\\{f7bbdf7b-7f4e-4319-b9c6-ba62f38e1d5c\\})|(\\{97154c2a-2a3d-4ddb-814d-5451e3c35103\\})|(\\{1665bb10-e8d5-44ea-8cd3-531b6ebfaef9\\})|(\\{f3b474a6-b76c-4a9e-ae57-df0a3992d8f1\\}))$/","prefs":[],"schema":1560430131572,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559330","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"436f1b52-16b8-4c70-b67d-ad6c39f6bd39","last_modified":1560502059138},{"guid":"/^((de\\.firefoxextension12345@asdf\\.pl)|(deex1@de\\.com)|(esex1@ese\\.com)|(estrellach@protonmail\\.com)|(fifi312@protonmail\\.com)|(finex1@fin\\.com)|(firefoxextension123@asdf\\.pl)|(firefoxextension1234@asdf\\.pl)|(firefoxextension12345@asdf\\.pl)|(firefoxextension123456@asdf\\.pl)|(frexff1@frexff1\\.com)|(frexff2@frexff2\\.com)|(frexff3@frexff3\\.com)|(ind@niepodam\\.pl)|(jacob4311@protonmail\\.com)|(javonnu144@protonmail\\.com)|(keellon33-ff@protonmail\\.com)|(keellon33@protonmail\\.com)|(masetoo4113@protonmail\\.com)|(mikecosenti11@protonmail\\.com)|(paigecho@protonmail\\.com)|(salooo12@protonmail\\.com)|(swex1@swe\\.com)|(swex2@swe\\.com)|(swex3@swe\\.com)|(willburpoor@protonmail\\.com)|(williamhibburn@protonmail\\.com))$/","prefs":[],"schema":1560426922081,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483769","why":"Malware targeting Facebook","name":"Facebook malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"202fbae4-e904-430a-a244-63b0fb04385f","last_modified":1560429929334},{"guid":"/^((\\{50c31b2c-af26-4238-bbbc-f11218d19682\\})|(\\{7c244b9b-4058-4362-9c3f-6f553c75d051\\})|(\\{bc90f38a-c295-45c4-a09f-7038ed6139a7\\})|(\\{d55311d8-83ce-4320-b30f-a7acac9224ac\\})|(\\{39d2838c-8b0d-453d-b685-71b2af4f3ff5\\})|(\\{95fdb905-de6c-4499-b7f2-372910a44405\\}))$/","prefs":[],"schema":1560371525142,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bcce386-ce8e-4e59-838d-a02d35de154b","last_modified":1560417609081},{"guid":"/^((\\{615a653c-240f-4dac-a42b-66751cfe7405\\})|(\\{3119fa71-b8b7-430e-ba44-4c25d5d2a4e8\\})|(\\{98075bd1-491f-4506-9e0a-262b08042e5b\\})|(\\{6102d260-a977-46a0-8635-7cdf3f3b72b3\\})|(\\{593356cd-e02b-4529-9d14-c5e4740fe749\\})|(\\{15b2bf6b-274d-477e-8456-3efc218f9fe4\\})|(\\{78311b1c-ffbe-413a-86c2-86b136aacd17\\})|(\\{98f992f6-d311-4248-939c-05f5db60ee78\\})|(\\{b1f0bcd0-0bf2-43c5-b61c-ee1fdf7f88fe\\})|(\\{7113cc05-ebbf-4c1a-9c6e-a9f959817851\\})|(\\{5325d52b-99b5-4a98-8625-24bbc8098b7f\\})|(\\{b6e3b23b-adfc-4f23-986b-4e62faedf402\\})|(\\{fd000b48-0259-4356-9c5e-2ff22d8784b7\\})|(\\{7fae693e-a917-40eb-9881-769c85f64ab3\\})|(\\{c0b9ae3d-d604-4327-95a7-67733d00bc89\\})|(\\{bc6b6fa2-ef8d-41f8-99de-ad838ad09594\\})|(\\{9dfbbcab-e7d0-4483-85ca-ca71ba03b769\\})|(\\{1d4ef484-d567-436c-ba0b-9cc0fb224708\\})|(\\{9874efa4-3a66-459a-aa77-ecf9ac8d1fe4\\})|(\\{47faaf0b-ec1e-46d3-ad59-bb44345b86d2\\})|(\\{b4b433dd-adcd-4491-8f80-ecdfb4788dc4\\}))$/","prefs":[],"schema":1560340682934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c016d195-ae3c-45d9-ab13-1010f0711b88","last_modified":1560340840541},{"guid":"/^((\\{43c62192-abed-474e-a619-9d486383f5d2\\})|(\\{9506f10a-e5c1-4a0a-83e7-8e83b3fb77d2\\})|(\\{a4fd5625-6912-4cc3-861e-f5338e4c36f8\\})|(\\{2ff20211-5540-4c13-8c06-6769902b0e15\\})|(\\{e15e3074-88a0-4a6d-bd1f-a7149eff3a6a\\})|(\\{e5800ff7-8cf3-410c-91a6-4b61838e4486\\})|(\\{22754446-97f4-473f-8da2-3ffbd44abdc3\\})|(\\{eea1ab8b-a4bd-4905-aa02-80874a452fff\\})|(\\{b0bfaa8c-702e-47ea-84ff-6b20ef979385\\})|(\\{f13622f7-470e-4ad3-85a5-25a0fd43f9fa\\})|(\\{f75cba29-48aa-4c02-8d7e-704532de1aa6\\})|(\\{43325b83-0f60-4d46-9b43-f9be2e91682c\\}))$/","prefs":[],"schema":1560251614258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558543","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2399177f-4b21-4c46-ae74-ab7db1edb879","last_modified":1560339940028},{"guid":"{e1bb4a20-9e0d-443a-b171-4d3b71f27211}","prefs":[],"schema":1560247588269,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557680","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Biis"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f42edc78-6eda-4dfc-9f7b-fbaaa869852e","last_modified":1560248603844},{"guid":"/^((\\{f7b6b9aa-4564-443b-9da0-a194492cecb9\\})|(\\{f20526fe-45cb-441b-96e1-6d8aad20b97f\\})|(\\{2a7ada19-27c1-4f16-b67d-64344e85565f\\})|(\\{7faf6c45-9883-49c8-9d90-c70fd4fb72bd\\}))$/","prefs":[],"schema":1559835473927,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557381","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f781593-e000-464e-b46e-204201f42003","last_modified":1559836209248},{"guid":"/^((\\{4580e89a-d987-4a54-acd5-103eb91374df\\})|(\\{04767859-e649-473a-9ff8-1491f9217a2f\\})|(add-on@fdvoyzaxvni)|(add-on@mxdshahek)|(add-on@plgargwikihoves)|(add-on@plgbrhovtwitpor)|(add-on@plgeshovwikies)|(add-on@plgfrhovinstafr)|(add-on@plgfrscroltwofr)|(add-on@plgnlscroltwonl)|(add-on@plgsngicosnsac)|(app@clzohispatolas)|(app@plgarghovtwitt)|(app@plgargtydownesp)|(app@plgautriczoomde)|(app@plgcohovtwites)|(app@plgdehotwittde)|(app@plgdeudownlde)|(app@plgeshovtwittes)|(app@plgindhovtwiten)|(app@plgitscroltwoit)|(app@plgnlhovtwittnl)|(app@plgphscroltwoen)|(app@plgsajjhamzooph)|(app@plgsingchewmve)|(appapp@plgindzoplshind)|(application@arzoplgirasta)|(application@blibluk)|(application@breplgdownporbr)|(application@es9hsgaedr)|(application@es10gfjqzma)|(application@gerluk)|(application@grasow)|(application@plgbehovtwittnl)|(application@plgbelgdownflam)|(application@plgbescroltwonl)|(application@plgbrhovwikibr)|(application@plgdescroltwode)|(application@plgfihovinstafi)|(application@plgindiendownen)|(application@plgindzoplshind)|(application@plgphhovtwiten)|(application@twexispolavieda)|(ext@es8dffdsghe)|(ext@plgagscroltwoes)|(ext@plgbehovtwittfr)|(ext@plgbelgizompnl)|(ext@plgbgzowomawfr)|(ext@plgesscroltwoes)|(ext@plgithovinstait)|(ext@plgsescroltwose)|(ext@plgukscroltwoen)|(ext@sgdlpictomagi)|(ext@uksfdahdhsc)|(extension@es5dssdsj)|(extension@itsfahqiaxb)|(extension@plgauthovtwitde)|(extension@plgbrscroltwopt)|(extension@plgdehoverwikde)|(extension@plgfrdownlnewfr)|(extension@plgfrhoverwikfr)|(extension@plgfrsearchfr)|(plg@defdgajbisl)|(plg@es6fdhfec)|(plg@es7fdsfddqa)|(plg@esfdhalmbwn)|(plg@frhadiadsk)|(plg@indplgomenawc)|(plg@plgbescroltwofr)|(plg@plgbrhovinstapt)|(plg@plgbrsearchpt)|(plg@plgesdownopenew)|(plg@plgitadownaudit)|(plg@plgithovertwitt)|(plg@plgnlhovwikinl)|(plg@plgnlscroltwonl)|(plg@plgnorvegzoom)|(plg@plgsuhovtwittde)|(plg@plgukhovwikien)|(plg@singplganowong)|(plugin@frmdehpzamdoas)|(plugin@pldinddowninen)|(plugin@plgdahovinstada)|(plugin@plgdesearchde)|(plugin@plghowtwifr)|(plugin@plgitsearchit)|(plugin@plgitwikihoveit)|(plugin@plgnohovtwitno)|(plugin@plgpaysbasdownl)|(plugin@plgukendowauden)|(plugin@plgukhovtwitten)|(plugin@ptgouloumette)|(plugin@sgpongextejmk))$/","prefs":[],"schema":1559815025832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557258","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67ab85b2-4241-4f2a-8589-801b4221b79d","last_modified":1559835396847},{"guid":"{ca6a76c4-1831-4e90-9ed8-2a3768114563}","prefs":[],"schema":1559739635606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556974","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Xtif"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c7614a2-793c-454d-967e-35b06de2cbd1","last_modified":1559814857242},{"guid":"/^((\\{8dcc43e0-bd17-44db-a0a1-4cf179f4a97f\\})|(\\{a4ef8092-6d9b-4ca2-bc6a-021fc9e8e156\\})|(\\{9fb5bfd6-27d6-4321-8af9-47b6ceacac3f\\})|(\\{3c9052cd-10e7-4ccf-9dda-8524cccf66a7\\})|(\\{da554ce8-5c96-4511-93f2-4e00a85aeb20\\}))$/","prefs":[],"schema":1559677299211,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557027","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7bc4a56-2f54-4791-b644-0ed2403bb9db","last_modified":1559739185033},{"guid":"/^((__MSG_name__@crx-to-xpi)|(\\{3fedc417-0513-4d15-a7e5-978d044cc9b9\\})|(\\{5c0f4cf6-b6f5-4485-a941-6c25f65c54eb\\})|(\\{5e1948ce-2889-4504-9e53-170753e731f6\\})|(\\{5fbf70b1-6dd8-4cd3-83fd-fbc53c59b7f7\\})|(\\{6ed4cb78-09ec-4a85-ad8c-d29382beb6d2\\})|(\\{6f7b3f15-30ab-40ce-9424-9a03a4969bea\\})|(\\{7d516686-2f77-4f2f-8a24-2441f9661187\\})|(\\{8c50589a-419d-40b5-8edb-4027a509725a\\})|(\\{8cf8a461-47f0-4eef-966c-faf0ae9593f8\\})|(\\{9ae1dd88-5e97-4ff4-b6a6-907689b6289b\\})|(\\{17a98bce-6b45-4c91-82ac-2916264e79ad\\})|(\\{50bf8563-c1e1-4c6d-80f8-281cd0d9f453\\})|(\\{51c03d30-c160-409f-be23-a576bf6ee2a6\\})|(\\{76a4a4cd-0bbb-4c6b-b285-d3aa4b55a99e\\})|(\\{94c8b1f5-7675-48fb-8c2b-3a8c7faa059e\\})|(\\{110b4b76-4314-4c63-9ae7-01e0e30f995f\\})|(\\{204d5f5f-d2bf-4892-a35d-e02d7436a410\\})|(\\{358af48c-726e-4853-a941-a19f9f4bcf8a\\})|(\\{02110a55-b817-49e7-bddd-5ce06d7f66e3\\})|(\\{9521b96b-f232-4689-81eb-907ba68872fb\\})|(\\{83034ff5-c83d-4560-8e6e-646862d2f405\\})|(\\{167357db-2afa-43a2-90df-ca2c6527ed78\\})|(\\{08429889-d4dd-4dc0-a607-5e26d976f376\\})|(\\{20289793-a4b4-48de-b640-672e6be44f5e\\})|(\\{a1be3447-d87d-409b-8721-d895935f65b8\\})|(\\{bf599b22-fc5d-43ac-ae24-343016cf6a94\\})|(\\{c8faeded-34a7-4eb6-8e21-407c82040ca1\\})|(\\{d8b5848f-b314-483b-8fd3-9f919f0f3b8b\\})|(\\{d768a761-3df5-4676-8cbe-5e3f4f426f6d\\})|(\\{e5d45ac7-1a6d-4ec8-89ae-d75ff07b89b3\\})|(\\{e5705290-3609-4b11-a062-6c55fd074d80\\})|(\\{ec92f712-38a6-4d81-80fb-529990a5b83d\\})|(\\{f14fbd1c-1df9-4ab3-a983-a8889f88fec2\\})|(\\{fcdb43b5-add6-49f2-a102-761147cb88fe\\})|(\\{fddfb568-5055-4dc7-ac3c-5eabc69c3c75\\})|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified--782543786)|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified-875652714)|(darktheme@addon\\.com))$/","prefs":[],"schema":1559660128156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556759","why":"This add-on violates Mozilla's add-on policies by changing request setting without user control or consent.","name":"Malicious request manipulation add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6016087e-a255-4d70-8ffa-d7095af42e00","last_modified":1559660502221},{"guid":"{31dea008-38a8-44c5-8404-d1b110f47ab5}","prefs":[],"schema":1559648801945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0423\u043a\u0440\u0430\u0438\u043d\u0430"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.2","minVersion":"0"}],"id":"dc8887b5-eae3-4cc9-937f-229b8830ba83","last_modified":1559649064547},{"guid":"{4bf7c817-a8ab-4d98-b84d-65f79f05415d}","prefs":[],"schema":1559647486096,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0420\u043e\u0441\u0441\u0438\u044f"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.14","minVersion":"0"}],"id":"96dbcd8a-d40a-4949-957b-b6eda96d0b95","last_modified":1559648801932},{"guid":"/^((\\{366bbde3-553b-4587-99d1-ce34f6b52e1b\\})|(\\{af48b3a0-a899-4722-a6b0-72ea823c9c57\\})|(\\{bc4dba63-23da-47ce-9ed5-574859c80ae2\\})|(\\{e390c529-7e38-4191-9cee-7b6902c9d833\\}))$/","prefs":[],"schema":1559647399044,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556700","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0561368d-755a-498b-a3ba-55274d9bc925","last_modified":1559647486083},{"guid":"{5a3477ec-7abe-4efc-b44a-7ede3cc02217}","prefs":[],"schema":1559563381261,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556698","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"youtube video download pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94404f29-bf39-473a-a299-57d922f51c6c","last_modified":1559647399030},{"guid":"/^((jid1-93CWPmRaVPjRQA@jetpack)|(\\{3c78ca35-67af-4917-a24b-7699456ca61e\\})|(\\{8a8f48ed-3daf-41b9-88f4-73730459aaf6\\})|(\\{f906b9c7-576c-45ad-8f48-358271e15e5b\\})|(\\{de4f3cf2-cd35-4a2f-a405-33a4a29918a2\\})|(\\{7a365978-94e2-49d4-b5f7-6178dc80ed69\\})|(\\{dbc00301-7930-4421-91d8-23bf463228c2\\})|(\\{4f42055b-fd40-4b98-b71f-a58725d729d1\\})|(\\{8b6ae26a-4479-4727-bd89-46aef6f6e5d6\\})|(\\{b6a95353-bf1f-4c03-b4e5-43eca107ecbf\\})|(\\{933d68b5-80f4-44ba-bceb-2a6338c0ac7e\\})|(\\{cc9eb257-0f4e-423a-b124-318c59271a3b\\})|(\\{d0dc10cb-6b80-4e88-aec9-605d4e75ae59\\})|(\\{8dc1a829-e888-4ce5-a19e-614277de4d7a\\})|(\\{81ad5a42-34cb-4c35-b354-2306dbe418fb\\})|(\\{2fe8edfa-61ab-4257-848b-59def269a511\\})|(\\{55de894d-cfd0-4654-af30-719020792149\\})|(\\{4b9ffc29-0e02-4583-89d9-495084f96b43\\})|(\\{aa94dd9b-7d23-4776-ac2e-9939a3cf7bb0\\})|(\\{b43a0fd7-b010-42ae-a613-db7e792c995f\\})|(\\{af57625d-4b59-4028-874d-767a37bc9ebd\\})|(\\{84387d47-147e-4d50-8a3a-6e2bb4b522e5\\}))$/","prefs":[],"schema":1559562690935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555945","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash Players and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a9526a76-d420-4adf-9a57-7096172d6077","last_modified":1559563142131},{"guid":"/^((\\{e914f532-5b99-4c2c-a6d9-56c6f9e07f09\\})|(\\{d7904110-ef0b-4daf-8fe1-1627c9cd14b9\\})|(\\{091d1ebc-55f9-4af0-871a-b3b383b70241\\})|(\\{eaf253cb-0418-4994-98cd-4fcfb5b827c1\\}))$/","prefs":[],"schema":1559562473865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555848","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"WFot and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"740446f0-e16d-484d-a946-873f92d78c79","last_modified":1559562690921},{"guid":"/^((\\{3d35fa06-3f8e-457c-9ffa-a115f33e8e7b\\})|(\\{fd834065-2938-4522-ae8c-55592bf7e870\\})|(\\{d52afc01-3504-45eb-aa06-3fa55d2dc7cd\\})|(\\{2a34eba4-2a55-4863-91a6-c389d8e108c9\\})|(\\{45082e42-ceef-4df8-9f27-b5adf766ed8d\\})|(\\{8f77cfd1-6eee-4489-93d0-ae8627d8211d\\}))$/","prefs":[],"schema":1559562343779,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555481","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"BatchSerialized and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10b029a4-72af-4e6a-b53a-492b94d1813f","last_modified":1559562473850},{"guid":"/^((\\{0c955fab-3d51-4989-aca5-d806cf0f2ea4\\})|(\\{1b382a66-46e8-4d33-a8a4-a857dc03cf12\\})|(\\{3f41aff5-f248-4b99-9c76-b7d192d9e979\\})|(\\{5c3d28a2-b778-4b48-9d71-da6fc2c37ccd\\})|(\\{8ef9fda9-1384-4efa-bbac-02f76f9a75dc\\})|(\\{8fd2e113-76cc-45cd-b4b0-cbef46166d76\\})|(\\{9c914f01-3e9f-45af-8d53-618ce7659d96\\})|(\\{70d353ca-2edb-4196-9294-d80cbca9ae3a\\})|(\\{79fba572-6a81-42be-abf8-92037bd908db\\})|(\\{106c67c5-a780-4076-af33-94945b16d4f1\\})|(\\{177bb2d7-15a6-475a-a34a-94f964b22731\\})|(\\{248d26ad-c8d7-4a1c-8d7e-22a36226f52b\\})|(\\{679b892e-c913-4993-bc18-1b737ac5de8d\\})|(\\{877e11b1-0725-41f9-b0e0-1b89cd88097a\\})|(\\{902b9979-3273-44cd-a717-8c55aec563fe\\})|(\\{3515e081-cd1d-482c-898a-62ade3007f8d\\})|(\\{4080f1c9-b07f-408e-9678-bdda4822f536\\})|(\\{7631efe5-237b-44e3-9193-205346744e31\\})|(\\{8157ad65-a32e-41f3-b99f-5c6f60a82d3e\\})|(\\{9434fbdd-d45c-43ee-98ac-a1c794f89c43\\})|(\\{19976dc8-c059-4058-a7b4-ba734cde798f\\})|(\\{32678e4c-b8df-4a19-91d8-3294b84ce78a\\})|(\\{773450d4-d2d7-48c2-9378-5affb64c4575\\})|(\\{894136b3-8133-432a-b46d-6f528608aa49\\})|(\\{7804268c-4d4f-44c1-a53c-2680e61b6687\\})|(\\{a12fdc00-7623-459d-8188-8e954b6f6eb7\\})|(\\{a46f0ac4-bd96-475d-bba6-2ab01575e06f\\})|(\\{c7dfadc5-8d54-4f00-bc2f-c1ba1483eb41\\})|(\\{cc89ddb5-7f2d-4b9c-bcf6-fc8057869838\\})|(\\{d7c4c15f-e91d-496d-8f78-79809c114a57\\})|(\\{d2925b02-9e1e-4b81-9a72-714a772be945\\})|(\\{dc59a997-f35a-4fa6-9ac0-40c1dce4829b\\})|(\\{def69fda-720f-4e2b-8783-93491939d9a1\\})|(\\{dfbe87b9-0fb6-41fb-a143-f8e0a47452f7\\})|(\\{f778e9f0-ea54-4264-83fb-6783906bce17\\}))$/","prefs":[],"schema":1559504489486,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556339","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e57383a8-d67b-40b9-8df0-ac8a8a6321fb","last_modified":1559555647852},{"guid":"@yt-adblock","prefs":[],"schema":1559145199457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555403","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c34988ff-b712-4123-ad14-11d24d2d3a18","last_modified":1559147777278},{"guid":"/^((\\{6f35f413-21ef-4d85-96f7-64b7cccb947b\\})|(\\{7ec94ecf-7215-4cd1-a193-402c3b6e8474\\})|(\\{767e59b0-41da-4cf5-bfe1-56c8402c1ca2\\})|(\\{0770eaac-f694-49a9-bac0-39933e62862a\\})|(\\{5319ec46-b72f-4b1c-90a7-67b1b392af05\\})|(\\{7765a798-ae6b-4ea9-920d-fe7f6d07043a\\})|(\\{93927b7e-0c83-4ce8-b66e-36bb88e2551f\\})|(\\{bd6bd2fb-8614-4302-a67d-bf4f7da55e20\\}))$/","prefs":[],"schema":1559136970465,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555357","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8ca8b1b-1897-45b6-b12a-b64c45d8959e","last_modified":1559139447403},{"guid":"{f6bca217-8cdc-4c85-b8ae-30da228dbd71}","prefs":[],"schema":1559127564301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555026","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Gmail checker plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a110749-4dbf-46c9-a6a8-56c19d6eb346","last_modified":1559136956255},{"guid":"/^((\\{cc9f487a-618e-4c48-b0a9-65f25d53c887\\})|(\\{8fcc31d3-f865-40fc-9f31-a38ab9973e9a\\}))$/","prefs":[],"schema":1559124226003,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555282","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3025513-0716-4a0b-8a1b-9d5636c90f79","last_modified":1559124311799},{"guid":"/^((\\{207df7ea-6d21-4fdb-b4fb-566ae3666245\\})|(\\{e622e0a7-d0c6-4747-bf5f-fe0321da85e6\\})|(\\{8ea990c1-ea81-4aa8-8f0b-ab6ddb888bbc\\})|(\\{1f0f312f-85ae-4603-9761-4dea6a699227\\})|(\\{f9b0e524-7ccc-4392-9130-09a7c84f9730\\})|(\\{f9567a86-accf-4710-bf33-d5ff890416af\\}))$/","prefs":[],"schema":1559123848301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555280","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32891270-8ebe-41b1-b89c-9caf80944c89","last_modified":1559124225988},{"guid":"/^((\\{8fad4bef-56e9-4879-8780-ca7c18aa1171\\})|(\\{a6ce9b9f-cea4-44b6-ada5-a96c6bbf6d83\\})|(\\{a14b3807-8409-4b4d-bb16-5d1996492672\\}))$/","prefs":[],"schema":1559122494410,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555273","why":"This add-on violates Mozilla's add-on policies by collecting ancillary user data.","name":"Keylogger malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57a3e7c7-3cf9-46a5-88ac-3f87029e4b5a","last_modified":1559122823674},{"guid":"/^((\\{5d840f65-c476-479b-a2e3-5a19b7a0a853\\})|(\\{021b8ac0-4a36-4294-8261-662d947a83d4\\})|(\\{038b50d5-8590-4479-93d2-4c07b619f402\\})|(\\{882bf6a6-47d7-47c3-8bbf-4f8fb259358d\\})|(\\{0918fee5-aee0-4e84-9613-a8b1e59dfcff\\})|(\\{90854ba5-e748-4f74-b8c2-9a6aa409894c\\})|(\\{a22263da-63d6-44fc-bdb8-381ba7e3c36a\\})|(\\{ec50f1de-0bae-4bfa-b665-59254094089e\\})|(\\{f48a449e-54f7-44fd-90f2-34a9526d5766\\}))$/","prefs":[],"schema":1559046153546,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554962","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6c8516bd-c427-4a7a-9f52-10c942e083a2","last_modified":1559046242210},{"guid":"/^((\\{a43383bc-1d39-4d94-b353-ceaf942c7d52\\})|(\\{0a727455-07c0-4c8b-a0e2-7853347e13e4\\})|(\\{3810f596-bf50-74e2-a47c-9894ebdc5179\\})|(\\{03ce6944-6491-4f7c-ae42-3f2a9c3f9c99\\})|(\\{3523e8cd-09e2-4442-ae13-e1d1575d4b27\\})|(\\{a08f79e0-c70f-4021-80e9-44614d5f8b5a\\})|(\\{e43b625a-f337-4cd6-b3d1-6763b5213223\\})|(\\{744c464d-4cc3-4303-b3d1-5b756144cd5e\\})|(\\{c948603c-496d-426f-a7ff-9af3d7ac1380\\})|(\\{ceaea029-439b-4d0d-99ca-a261de44d0dd\\}))$/","prefs":[],"schema":1559039806318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554942","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"940f09a9-e0ba-4b98-8dd1-edb78573b62f","last_modified":1559039956017},{"guid":"/^((\\{d227e621-ef26-4b4d-b724-0138e5bb03dc\\})|(\\{ec418296-8754-46fa-a265-9856f1706f8d\\})|(\\{e64aeb61-251e-46ed-863c-b9a7c4849cfd\\}))$/","prefs":[],"schema":1559039652168,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554941","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Service Processor and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2ea28df4-7fdc-4571-95ba-10b61e270c72","last_modified":1559039806304},{"guid":"/^((\\{e7f0881e-39e9-4569-85b5-71b925294de3\\})|(\\{4d19382a-c81d-488a-98ac-f73484a6dd2b\\})|(\\{6d68222e-1982-4b74-9fd1-52b6a4b4c2a5\\}))$/","prefs":[],"schema":1558986099090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554675","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Microsoft .NET Framework Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2b5e298d-9dfd-4c66-ae18-1671001f4cf2","last_modified":1559039652155},{"guid":"/^((\\{59feb34b-bb64-4063-933b-d5af131da847\\})|(\\{9d84eba6-c1cb-4ec2-8b4b-b6be1ecd902a\\})|(\\{7c98044a-2ab6-481b-bc75-e2e5df6c4de8\\})|(\\{62457714-ded1-44fd-b107-b14da63a2850\\}))$/","prefs":[],"schema":1558975224053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554740","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a5c8e26-d7c8-4c45-91cc-d86bd1aaa0f3","last_modified":1558976967835},{"guid":"/^((\\{6f2cec94-2f78-4812-9898-1bf98d7ccbfe\\})|(\\{e8cff71e-5c43-4fd3-b63b-7b9f6c29d54c\\}))$/","prefs":[],"schema":1558959050284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554676","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Data exfiltration malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98aa70f7-d993-490b-ab07-108cc5a8f38c","last_modified":1558967785430},{"guid":"/^((\\{b3c1723b-6e69-4a3d-b3f6-90793bbd6500\\})|(\\{ba38e6b7-7480-4e58-9f5b-162e83c6ece8\\})|(\\{ff08056a-a34e-44b1-bcae-805d3770738f\\})|(\\{29806031-d49c-4ef3-a37a-32ee29e5fc0b\\})|(\\{541e33f8-ec74-4311-b7a3-8baa185aeb7e\\})|(\\{d8196867-5419-450c-aee4-1e349b4b0b5f\\})|(\\{ebd7a4e7-056e-4009-bb5e-753c1d1eed93\\})|(\\{01935a63-d565-478a-9f91-9ff9aa49ce61\\})|(\\{d0e7ce73-9829-4a10-b5f2-83f8bf2c730b\\})|(\\{b70f302a-84ad-4f10-8af3-f6ea4aa327fb\\})|(\\{e5f1a2e5-798b-4915-b109-5ebbe2b57821\\})|(\\{7921669d-959a-4992-857d-f47761b5b4ac\\})|(\\{80808d17-bf74-4b91-8fa5-694c3107950d\\})|(\\{84984575-1b73-4b96-ba1c-d9959393e742\\})|(\\{20587256-b018-41c2-91fc-5a278a2837f2\\})|(\\{577f8c9b-c791-4999-9c39-1e4584f4e9d6\\})|(\\{3691584f-c3a3-4fde-8817-b2501802ef54\\})|(\\{e1680c37-e6ff-4280-8f97-943d77e63022\\})|(\\{013ae092-188d-4e95-9138-2b4d98dda7cd\\})|(\\{05e3806c-00e6-40c7-8503-9c30f3db8e63\\})|(\\{9552ab33-c43e-4338-a020-80dc3636f577\\})|(\\{8fd3c74f-57d7-4e1b-9e52-6c4517ef89f0\\})|(\\{9b0ad6aa-7c54-4655-aca5-78e973b0ebd4\\})|(\\{e648ecf7-4858-40f8-9d85-5cc5f68eae6c\\})|(\\{9430fbaf-aa5d-4492-92c2-0f1354c5c860\\})|(\\{d58bd1fd-6451-42d5-b066-4baf7d4271f9\\})|(\\{948790d7-57d3-4db1-8fc7-7ccee4abf047\\})|(\\{1b8d5392-1641-43c1-a6d6-d1429e9d4109\\})|(\\{3ae072ea-3ffc-4395-8f3c-ebe92f355c3d\\})|(\\{32f9b8a8-505a-4621-979b-b6919633f787\\})|(\\{e939e079-1e15-4491-95b3-6fb8a836e80b\\}))$/","prefs":[],"schema":1558954910531,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554635","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e454fe70-d5d7-40c0-a571-e9253d1361d5","last_modified":1558955090783},{"guid":"{19ed30e8-28ad-405a-a7e4-18a8c78b1078}","prefs":[],"schema":1558951086426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554624","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"OpTurs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a3b8837-605f-48dd-8b40-a66777f45108","last_modified":1558951513292},{"guid":"{9834ff7f-e3ea-485a-b861-801a2e33f822}","prefs":[],"schema":1558813299527,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554465","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"LinkT"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9496c5f-b37d-4b8e-abaf-509b980ab553","last_modified":1558868765210},{"guid":"/^((\\{0e9ab3be-c296-4825-aecd-3923ded051f6\\})|(\\{9f737295-e8d2-4e70-b226-8809f6b135c9\\})|(\\{68e1d557-8fc1-40e0-b197-43f8f3d36239\\})|(\\{90221614-a0b9-4301-b141-3f8a23fb4835\\})|(\\{d3255cb0-bf30-43b0-afd3-db97bfeeede4\\})|(\\{b4498268-c0d0-435c-944e-8dd6e8518654\\})|(\\{93d90a45-a10e-47df-a106-2ffeefe3052a\\})|(\\{d7b04034-ea8b-4219-ad1c-ffa061a2e0cb\\})|(\\{391772ba-a23c-4892-b30d-45d2a935be3c\\})|(\\{0b2aaa98-1f4b-483a-815f-3f864711a737\\})|(\\{2564ed8f-305b-4ade-a787-6fae696c14ab\\})|(\\{fc2fe0a7-9886-4a7e-9850-cccc2879b0e7\\}))$/","prefs":[],"schema":1558712940017,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554227","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"768bde60-2086-487f-b374-ca3fa6e712fd","last_modified":1558713145915},{"guid":"{4ee078c0-ded1-4f82-9bb1-de645e778924}","prefs":[],"schema":1558712019540,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554097","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Switch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0508904-1f0b-4352-a5e6-a33f8fa26ce8","last_modified":1558712846698},{"guid":"/^((spp@avast\\.com)|(\\{056790bb-9676-40fb-845a-feae6dedfbee\\})|(\\{15d51e39-3ccf-4ce2-a434-dbbf1785e867\\})|(\\{2bbdf86f-3c6b-48d6-9934-9051ce5f5976\\})|(\\{2f6d1519-33b5-4970-a7ec-561f5e067ba0\\})|(\\{2fd10339-a9db-4846-bdd7-ee41cea97312\\})|(\\{31390faf-ef95-4f4b-a1a4-3c3a09dd7b5a\\})|(\\{411bfbf9-646d-401c-b87d-e77d812a68ce\\})|(\\{44e4b2cf-77ba-4f76-aca7-f3fcbc2dda2f\\})|(\\{5422d0cd-3b45-4fcd-9886-463be7e1a05f\\})|(\\{5ae5a1f8-a994-4e61-8c99-54a9fe58a9c4\\})|(\\{5d4c1f36-196d-4e9a-909b-8ad138546f79\\})|(\\{7150cd87-1b5f-41ea-b659-5cae4b753e2d\\})|(\\{78a02646-2bf6-417e-9498-32f29a4ef89a\\})|(\\{7bdac7a1-be1d-4ecd-8cf1-a1db64adfaaf\\})|(\\{80686e70-c06a-4ab3-b7bf-fd4c05985c1b\\})|(\\{83830f14-c5d0-4546-af99-cbaba3ab832d\\})|(\\{869a5e06-732e-4635-8da3-90a2802f9c80\\})|(\\{87ea875a-396a-4c7b-b202-cecd5a4fe0d4\\})|(\\{94847025-c5a9-4dd7-83df-54c17b79eeb8\\})|(\\{992e4d3d-f56b-4f71-b826-0dd976681228\\})|(\\{a259d36e-9c24-4216-8b28-d3e83c07a832\\})|(\\{a669b31a-3a2b-4c75-838c-a8542f77c79f\\})|(\\{af35bf73-7d25-4286-9be6-fa822818ac82\\})|(\\{b01f0319-b398-4a6e-b9c9-e59e2d99eee7\\})|(\\{c516baf9-a911-453e-be0e-26389cfb33ac\\})|(\\{c88fc74d-31b5-40d4-bb8a-008f2d7a1ea0\\})|(\\{ca6b87f3-2d8b-49ea-9627-95e900c5f108\\})|(\\{cdc01730-6108-4581-b5da-36f7fa8e3d2e\\})|(\\{cfbbd54d-26dd-4f20-b0c9-26b2d920bc04\\})|(\\{d384c2ef-9e42-4dfa-bba5-73b9b6ad2e61\\})|(\\{d7ef08b6-ef77-43b6-ad60-74ea67495674\\})|(\\{dec788dd-9a21-416d-91c7-bf79250cab04\\})|(\\{fb182266-3336-4dcb-8898-859affe73e7f\\})|(\\{fe17e98b-1ed8-45fe-a6e5-8280902d2500\\})|(\\{febfdee8-5724-4aea-8b70-6be9e22248fc\\})|(\\{ff471567-6ff5-48d9-8db6-d2c9134f0aed\\}))$/","prefs":[],"schema":1558674107244,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554004","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Keyloggers and Fake Anti-Virus or VPN add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3b36e078-7c88-411c-9366-033ac185c66d","last_modified":1558711200727},{"guid":"{e256d52b-d9ae-4709-aa9f-ba4d1eb1b284}","prefs":[],"schema":1558637428118,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553531","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Reading Cursors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4b943d8a-828f-45d2-b8e7-f16e6c3f860c","last_modified":1558637573461},{"guid":"{7d3c46ed-b9f7-497e-bccc-e6d878032d14}","prefs":[],"schema":1558636256156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553746","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Zoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1282ea00-9aa1-47c6-9a93-4fc17aa4fcc4","last_modified":1558637428108},{"guid":"{cc02a70f-0610-456c-bc5e-5eefb6716904}","prefs":[],"schema":1558636068339,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553761","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"headingsMap"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37c5c7d6-e0ce-4c6b-8c89-49d94b6fe159","last_modified":1558636256148},{"guid":"/^((\\{5768d1b3-4e2d-4088-bd65-c7a62353ea3a\\})|(\\{65b99c4e-a9bb-4bb9-913d-503fa9bcdc46\\})|(\\{31ebd11b-bb60-403b-94a9-e09a3bf7d64f\\})|(\\{571339cd-9f45-47be-9476-767a62cb6c97\\})|(\\{ed4f9665-1851-4398-ab15-46c5e3ab8fac\\})|(\\{972319b8-8dd8-4ed0-8de2-9bc6582f0560\\})|(\\{4a0d8618-3e21-4bb8-8ae3-d04316b55a1e\\})|(devlopper61@avast\\.com)|(\\{8df3e056-6d4f-42fa-b0ad-40ee9a79d9c4\\})|(\\{e7e68020-07de-4f9f-9aec-6df29e9f64b8\\}))$/","prefs":[],"schema":1558635731472,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553857","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Easy Screenshot, Youtube Download*"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f8e7584-6c6c-4579-882a-6f6ed21766dd","last_modified":1558636068330},{"guid":"{b19d065e-4460-4714-9208-3f2b38907522}","prefs":[],"schema":1558537447980,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553521","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"QxSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"60311c2e-044e-4e24-9abe-6ee75d7f5467","last_modified":1558537465968},{"guid":"addonfx@horoscope-france.com","prefs":[],"schema":1558537035045,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553518","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control and executing remote code.","name":"Horoscope France"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ec32be61-2646-4686-9829-7cff21f5d1f8","last_modified":1558537447957},{"guid":"{65dc18e1-109f-4039-929b-f8a7a29be090}","prefs":[],"schema":1558536906311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553517","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bf7a8bf0-e60e-4516-9e93-777c19509ef6","last_modified":1558537035028},{"guid":"{3fc1db2b-e7db-4512-b24e-1faf4d3a1b4d}","prefs":[],"schema":1558536030188,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553479","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"quikaxes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43966df2-e95c-415b-bffc-13814e1d2b11","last_modified":1558536765550},{"guid":"{a37a7625-b64e-45f3-8b79-f71634f14438}","prefs":[],"schema":1558467699805,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553326","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Lift"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e86024e-5621-4ded-bc16-184f94fa2e29","last_modified":1558528706505},{"guid":"/^((\\{3e20d1e2-a7ee-4ce2-ab9c-51c8300a8ff6\\})|(\\{30906bbc-0942-445b-89c8-f74dac0edb8f\\}))$/","prefs":[],"schema":1558382009200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553071","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Amiri"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c5f5681-8547-4e65-9c05-5796e483b8e1","last_modified":1558434518612},{"guid":"/^((\\{ec19994c-c5a5-46d9-bd4d-0fc417c6f4b8\\})|(\\{a0be7e8d-b0a3-460b-8a52-429c79e49ee2\\})|(\\{1814dd58-4147-4cca-a0a3-c5aa35966d9c\\}))$/","prefs":[],"schema":1558381075651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551937","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Inspiring Quotes + Daily Quote Tab + Pug Extension"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"efecef61-549b-4c13-8a52-394c636dd24b","last_modified":1558381320379},{"guid":"{dc6176c4-a192-4a92-849f-ad13abe889ad}","prefs":[],"schema":1558379927394,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551934","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Easy Speedtest"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a5fa8f77-7761-4996-a11d-d8cf723103da","last_modified":1558381015030},{"guid":"{ac4be7d1-4db6-4b4c-bf48-e345350bcb59}","prefs":[],"schema":1558379796996,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552830","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code and exfiltrating user data.","name":"Browser type hider"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41137e55-8a11-4259-a009-42c29daadf17","last_modified":1558379927382},{"guid":"{da993d54-9605-42f7-a32f-9f565245070c}","prefs":[],"schema":1558362750147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552834","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2212748f-ad60-497f-af7b-50d20b326e40","last_modified":1558379796981},{"guid":"/^((\\{2b3eed60-8f6e-4afc-99f1-38d12f4253da\\})|(\\{3a6f9dac-3a93-4f6f-8b74-9ebc0f501306\\})|(\\{46bba8e9-7a75-4dd6-932e-bdd74141cb87\\})|(\\{4b480ab6-b63a-43f8-b4f4-d312972ab086\\})|(\\{6106687e-ca0c-4d7e-93bc-115929e4d299\\})|(\\{717ce133-3c0a-448e-b6ed-fc7d22b76534\\})|(\\{7224f1ae-c342-4bb5-8441-d324a8951624\\})|(\\{768e9638-2eba-42e4-a13a-4f3f1df391a2\\})|(\\{7b655f43-c871-46d2-8f6d-31989e8ee939\\})|(\\{7e46c692-9488-4671-8c39-7830f92628b0\\})|(\\{83bc6b56-545f-4ba1-a80b-f82d55cc0f68\\})|(\\{970a774e-b7a7-498f-b3f2-d88b14b4dab1\\})|(\\{9d2e8731-3287-46eb-9c19-ece63fe693c7\\})|(\\{a37ccd20-e04f-4949-b055-98ca58639606\\})|(\\{af85f82c-3e8f-4ee5-ab53-b8d3aaac34ec\\})|(\\{b35c6d47-8b07-4d49-89a9-dfe8c10f58f6\\})|(\\{c2485579-368c-4593-a1cd-985b2fa0b990\\})|(\\{c85c16ba-78b4-41b3-9201-f80fa662c52f\\})|(\\{c97e5535-6f2e-4d34-a5a3-0e6e07f7fd13\\})|(\\{ce7db166-9564-482f-91d9-3a450ec3216d\\})|(\\{d64a2c73-ff21-4e3e-998f-ec2dc42ad725\\})|(\\{db6d93c3-67a0-410c-b7bd-f72f267f0cec\\})|(\\{e513775f-359f-47aa-a3d9-eddc946aabe0\\})|(\\{f70258e4-643b-4ec2-9c84-de89009eec61\\})|(\\{f8794e87-82b2-4df4-bce6-db207f62c165\\}))$/","prefs":[],"schema":1558349836861,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552847","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0225ae55-626d-42b2-8f48-46ec95ec89f8","last_modified":1558361121954},{"guid":"jid1-HfFCNbAsKx6Aow@jetpack","prefs":[],"schema":1558343683249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549020","why":"Versions up to 2.9.1.0 of this add-on violate Mozilla\u2019s add-on policies by executing remote code through the native messaging host.","name":"SConnect"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.9.1.0","minVersion":"0"}],"id":"413065ac-176f-440d-b4a7-0f928f3e330d","last_modified":1558349549359},{"guid":"/^((\\{78d3cced-d2a7-46e9-9fea-5be7ed61eea8\\})|(\\{3233777f-a1a7-4ea4-8c2c-fba1a0a68383\\})|(\\{0eb43948-2a3d-4490-b32d-7ca37dd83f07\\})|(\\{64fd625d-2977-46a6-96ca-77f81ebfd54d\\})|(\\{6e138cae-1be3-449e-a964-b3c3060d89b9\\})|(\\{f875c255-8b92-4229-95e1-6d9adaf20dd7\\})|(\\{3c62ef7f-ae8f-4baa-9d2d-27a377480b79\\})|(\\{35a91fe5-c255-498b-9f9f-bec506fdb257\\})|(\\{7d3c52e6-2b7f-4ce8-b28b-032306fe32df\\})|(\\{0ecf6f68-d506-4239-bc69-f77de8f03758\\})|(\\{7290f2b1-3d70-4990-a828-40c775c05f82\\})|(\\{50150580-86bc-460f-ae3a-12e51b9d842e\\})|(\\{a1b46cda-8a83-48e0-b355-7eca4250694f\\})|(\\{614d8f88-b5b4-4897-adc0-0207613f4d4f\\})|(\\{ddc259e9-3738-4b18-a00c-9259dad206ae\\})|(\\{5b2bf836-5322-4161-82dd-fcc8ac6e4247\\})|(\\{97a90c0a-5e3d-47bf-aacc-230e4cb1f2d1\\}))$/","prefs":[],"schema":1558341490879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552764","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bda902e-fb36-417b-940f-992ab7a18fde","last_modified":1558343652556},{"guid":"{3241efcf-4bfe-4405-ba7e-029d3efb03bf}","prefs":[],"schema":1558341442463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552681","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Neat"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"657d264f-23d2-40f9-bac3-1d7c8b5d8453","last_modified":1558341473815},{"guid":"{c4da221b-461a-4ed9-b2d2-6ef1842a94bd}","prefs":[],"schema":1558341410023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552639","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Dimensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f48c8fe3-70c4-4d9e-84f4-79aeee9970f0","last_modified":1558341442447},{"guid":"{72a6bcef-d0ce-49f5-9773-1b78265174a2}","prefs":[],"schema":1558341352074,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552306","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"YtDow"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4ab989c-1517-493b-9486-f0c4a59a1c95","last_modified":1558341410006},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558341285260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551964","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7135e2e-249f-45d4-bfe3-88b834ddb636","last_modified":1558341352061},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558313782700,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551903","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Top Scroller"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fdc0d028-2915-4130-a19c-c5819b3acc81","last_modified":1558341285245},{"guid":"websurf@mizilla.org","prefs":[],"schema":1557871049351,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550673","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Websurf"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a2b8447b-ea50-45bb-936a-64d790ebe448","last_modified":1557871228984},{"guid":"{d8f707bf-0a35-462f-8e4d-f90205770547}","prefs":[],"schema":1557870872432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550689","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"STPs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be42b13c-301b-4304-a1ed-89b4c13d9eb2","last_modified":1557871049337},{"guid":"{0b66e692-1991-4b46-89df-c8101925bad1}","prefs":[],"schema":1557870310029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551079","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Base6"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a308009d-3320-49af-b0b8-1174f5a25fe6","last_modified":1557870872418},{"guid":"/^((\\{198586f6-9fdc-4ce6-8f21-7bdd85eab432\\})|(\\{1cd349e4-1d52-46ec-b648-6da8ba2ef659\\})|(\\{28c26373-1066-4cb5-8e92-1926cb31f83c\\})|(\\{2b99ea1d-9e25-4005-adeb-2fc9fc6700fc\\})|(\\{2be44a2e-f432-4527-a249-f7a6aecc8464\\})|(\\{2eda700f-8674-43fd-842f-73289b6e317f\\})|(\\{3745fc58-1413-4029-aea4-e1aa8a2c0cad\\})|(\\{3c19f6fc-1b86-411c-8d9a-7fdde31600b2\\})|(\\{450f8d34-b065-46a6-bd9f-ee7f614d750b\\})|(\\{498e999a-2d6b-47e7-8da2-97e0f694f6ff\\})|(\\{56862943-b999-45ef-be94-b97211126ba4\\})|(\\{5dc4633d-2c01-4d8d-8980-a90055d0679c\\})|(\\{77101ac4-6fe7-43ed-8362-75ad2a4b3299\\})|(\\{83ae749b-9ab3-41f9-ba8a-f73470399abe\\})|(\\{8ef68e62-a602-477c-95c2-9b861f91e813\\})|(\\{b81c02f0-e563-4794-8fd3-18a65b0f35fe\\})|(\\{c03bf205-6673-4495-abd7-f12556d3d8ce\\})|(\\{d1e8be12-c4e4-481b-9be1-400f54257dfa\\})|(\\{d3f73060-8ca3-4c24-b389-6a896f43f538\\})|(\\{e5e98141-81c0-433d-ade2-4174ea951243\\})|(\\{ec6ff98f-7315-4cfb-88b9-e6a64bb97ef6\\})|(\\{ee765c0e-cf70-426e-ac5d-704c874202af\\})|(\\{f8a4dc88-e967-4c75-acb3-6176ab166bf4\\}))$/","prefs":[],"schema":1557849229557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551093","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8436c1bb-43f2-42d6-acec-05145fdbeccf","last_modified":1557870310012},{"guid":"{61121092-5257-4607-b16a-12364832f0e4}","prefs":[],"schema":1557835907235,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551260","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Page Image Previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dbd3690c-2ce4-474b-b13d-97f9ab2c54c5","last_modified":1557835935826},{"guid":"/^((\\{2e510835-3d3c-4995-ba75-2eee6ff203c7\\})|(\\{bc72fefd-ab07-40ce-8555-45f9b23ef8c0\\}))$/","prefs":[],"schema":1557835858186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551259","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9ced28d2-c4bf-4933-b369-1ded1ca7f6dc","last_modified":1557835907221},{"guid":"{4037503e-7401-4ccf-8fc1-af9f8c9fc168}","prefs":[],"schema":1557835817321,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551243","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"APKCombo"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abc5acc2-c9ea-4d44-b8ab-3fefb5723194","last_modified":1557835858172},{"guid":"{52484281-3051-4c52-9309-83896b989ddf}","prefs":[],"schema":1557835777799,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551162","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control.","name":"Fppl"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73b95004-eb42-428b-852b-3671edbc3913","last_modified":1557835817308},{"guid":"{3555a8e7-6fc1-4ad8-9e35-b09877d94a8c}","prefs":[],"schema":1557776499103,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551080","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control and executing remote code.","name":"Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a941e00d-4ec8-41db-ac90-75041af68a3b","last_modified":1557835777786},{"guid":"/^((\\{da61a3e5-5a98-4c47-ae6c-f4db738f1133\\})|(\\{b0e13c2b-c1cd-426b-bed9-905bf9557fbf\\})|(\\{328c22c5-5f1c-4eb7-95a3-148fd4ad429d\\})|(\\{f6cca5fb-5aa1-471f-88f3-e2ffa87281ef\\})|(\\{d342bf37-554e-41c9-b67b-72769e59b82b\\})|(\\{03ec69b5-3e8e-4bb8-8eda-28f12c54bff8\\})|(\\{a8c876cb-af13-4ad9-9a86-fc3c0722b48c\\})|(\\{56136c32-0159-4368-9d28-c1b8b1515c89\\})|(\\{79bf4660-9729-444b-ae03-6c8005869611\\})|(\\{aa7fdaa5-d888-47e2-b27b-4fa4b3225339\\})|(\\{31e0d180-52b1-4c1d-8f84-7e625715edc4\\})|(\\{f7d20549-e5ee-4045-9e8f-9705bb10c104\\})|(\\{303abacb-760b-43c3-9640-5b456d92db78\\})|(\\{debabd67-2e0a-485e-8213-ac081065a027\\})|(\\{971e739b-c528-41b6-a60c-48fc3cdb52d9\\})|(\\{ffb3a485-2723-4a88-b3ad-8b29773759c4\\})|(\\{b076177a-a5c4-4652-9f6d-953f89f9a81a\\})|(\\{66210cb7-6352-45d5-9d22-ad7a0fb5e247\\})|(\\{8053ad7b-5129-4c74-ade9-8166c38e8636\\})|(\\{1a435c36-133e-4163-ac71-8701a147880c\\})|(\\{8c40c6df-7c9d-4876-bcbe-0621734aba45\\})|(\\{40e1e7d9-ae29-4aec-9465-5e0d49859583\\})|(\\{74eab03b-35cd-4950-b436-7afce3876e58\\})|(\\{95839c11-63a7-4b2b-b3d3-eee9d2c5c42d\\})|(\\{bfaa03c3-744e-48eb-8fb6-4ad61791d4d8\\})|(\\{f123e726-9396-4899-822a-172b8bcb2c5f\\})|(\\{157e255b-2053-4140-b95c-ff003b62bf17\\})|(\\{3e49a17b-b58e-417b-9ebb-a7e8c2317893\\})|(\\{4df1d536-e30f-4344-bee6-6ef2def890c2\\})|(\\{f33ce070-63f4-4d2b-823e-d52fc7a30ba7\\})|(\\{2003e2a5-e848-4fc5-8e7d-3af1efe4f992\\})|(\\{ff2157da-6981-40b6-aa60-d8125e73868e\\})|(\\{d89fa1e5-c9d4-4104-ad8e-00b39e5c6d15\\})|(\\{66e45d14-550f-4489-98c6-8a0caed33375\\})|(\\{86e6d45f-1dfe-4e53-bf52-22bf65b9ae6d\\})|(\\{e71407fe-e1ed-4755-af8f-dd64a952ce1a\\})|(\\{b67b3615-d8fe-4961-a41e-391864afde2d\\})|(\\{5785789b-ccba-44a1-9018-1135b56bd37f\\})|(\\{6dfb93d1-2add-471c-bbbc-b6164b4c1d94\\}))$/","prefs":[],"schema":1557495790401,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550581","why":"I\u2019ve reviewed the add-on and confirmed that it is collecting ancillary user data, violating our policies.","name":"Adobe Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fee4b92e-146b-437d-9cc0-95cfc800f0e0","last_modified":1557497630665},{"guid":"jid1-NIfFY2CA8fy1tg@jetpack","prefs":[],"schema":1557437285372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock for Firefox to resolve this issue.","name":"Adblock for Firefox ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.28.0","minVersion":"3.19.0"}],"id":"8ff19ad3-e4e0-40e3-8f02-fd80d18f63b5","last_modified":1557437486195},{"guid":"{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}","prefs":[],"schema":1557437276676,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock Plus to resolve this issue.","name":"Adblock Plus ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.5.1","minVersion":"3.2"}],"id":"f0fc8d21-d0ec-4285-82d7-d482dae772bc","last_modified":1557437285359},{"guid":"{2b10c1c8-a11f-4bad-fe9c-1c11e82cac42}","prefs":[],"schema":1557437241208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of \u00b5Block to resolve this issue.","name":"\u00b5Block ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.9.5.14","minVersion":"0.9.5.11"}],"id":"12a0c69f-e755-428b-97dc-229bccb8a5b0","last_modified":1557437276663},{"guid":"/^((\\{4e84c504-10e8-4e75-8885-dcc0c90999b9\\})|(\\{8ce99d6d-8d0d-4420-bd17-c303bd8a763e\\})|(\\{16de314a-56cd-4175-9baf-bbe0b09dfed3\\}))$/","prefs":[],"schema":1557434135180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549744","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Secure Privacy + Trustnave + Fastwebnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04a300c2-04fc-401e-a428-c7c887bf2bff","last_modified":1557434278943},{"guid":"{5308dcd8-f3c7-4b85-ad66-54a120243594}","prefs":[],"schema":1557433916783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550428","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"F_Feed"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"312e30b0-0b4c-4a43-8f6c-8b8447a20f6a","last_modified":1557434135166},{"guid":"/^((\\{c8d0fea0-d7b7-4f6f-b9bc-9df6722d9d18\\})|(\\{bed8e1f2-b00b-44e3-8cf0-5335080d0003\\}))$/","prefs":[],"schema":1557433212304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550435","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Webplus+Fastnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9686c72-1902-4868-88d1-6587fd24a57c","last_modified":1557433916770},{"guid":"/^((\\{d389cdfe-843e-44cb-b127-441492e46e63\\})|(\\{1340c760-3f4c-4428-b2c0-88821a84de2b\\})|(\\{38524a16-a73d-4a8f-8111-f9347bb5266c\\}))$/","prefs":[],"schema":1557258104673,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549740","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2feeb46a-6784-4c6e-8c07-e120bec00b14","last_modified":1557394160484},{"guid":"/^((adsmin@vietbacsecurity\\.com)|(\\{efdefbd4-5c30-42c3-ad2b-4c49082ec4cd\\})|(\\{63d83b36-a85c-4b51-8f68-8eb6c0ea6922\\})|(\\{4613a1ed-6cb1-410b-a8b1-3f81f73b6e00\\})|(\\{90b1aef7-7a52-4649-b5ca-91b5e81b5eab\\})|(\\{d6e2e76d-edff-416b-8c04-53052ff9fec7\\})|(\\{43af2e0f-b5ce-409b-9ee6-5360785c9b08\\})|(\\{e45fa96d-8b74-4666-86de-3bbfb774a74f\\})|(\\{4f8332b6-6167-4b7f-a1f9-61d8eb89b102\\})|(cpcnbnofbhmpimepokdpmoomejafefhb@chrome-store-foxified-14654081)|(developios89@gmail\\.com)|(\\{d82da356-1fa8-4550-958a-bd2472972314\\})|(\\{1dfbd1c3-a8ca-4eb3-8747-d30bfd20ecd5\\})|(\\{6f9fa22a-128f-4d1b-8ef5-d20a44d24245\\})|(\\{5f6af572-35c1-44d7-9d0f-dffbb62fcafe\\})|(developper@avast\\.com)|(\\{886a6486-37b3-4bcd-891b-fd0e335e7b1a\\})|(\\{886a6486-37b3-4bcd-891b-fd0e355e7b1a\\})|(\\{d1cd26ff-fde7-46a4-85cc-48e3bb7e9e8d\\})|(\\{ae11d5cc-8efb-43a0-89bf-e5a779b4fa40\\})|(\\{aca140ce-8249-4e6e-8e2c-cd5b1c987441\\})|(\\{f68b2ca7-0d2c-44cc-afc8-a606a896c467\\})|(\\{321db3c3-8cfd-49f1-99de-fcdc3485b379\\}))$/","prefs":[],"schema":1557222463147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549558","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b62c9ee1-d66f-4964-906e-2a9b07e3fdc1","last_modified":1557222511299},{"guid":"artur.dubovoy@gmail.com","prefs":[],"schema":1557162612874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549444","why":"This add-on violates Mozilla's policies by executing remote code.","name":"Flash Video Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"16.3.9","minVersion":"16.3.5"}],"id":"d7ca07b4-9c97-4f49-a304-117c874ff073","last_modified":1557162636319},{"guid":"{93d460ee-879f-4d8f-8599-a1c69ed59ec2}","prefs":[],"schema":1556912498785,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549069","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Browser Security &Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"95cfb43b-72c3-4fb3-a0f2-fc975aff398d","last_modified":1556977392946},{"guid":"{fc4c96b2-4eaa-4221-86a6-392dc1eb919a}","prefs":[],"schema":1556797012258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548536","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"AspectResolver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f6acc8a-f46c-42cb-8220-48c2e5885bd3","last_modified":1556808070195},{"guid":"/^((premium-enhancer@ext\\.com)|(notif-rm-unlisted@ext\\.com)|(search-updater@ext\\.com)|(updt-lite-unlisted@ext\\.com)|(coldsearch@ext\\.com)|(reader@ext\\.com)|(local@ext\\.com)|(fptool@ext\\.com)|(gflash@ext\\.com)|(advplayer@ext\\.com)|(yfp@ext\\.com)|(ytbenhancer@ext\\.com)|(yoump@ext\\.com)|(floating@ext\\.com)|(ytbhelper@ext\\.com))$/","prefs":[],"schema":1556792823258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547311","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various fake player/search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9efe3274-2bd2-44a3-aa7f-92934581470b","last_modified":1556794746654},{"guid":"{a38141d9-ef67-4d4b-a9da-e3e4d0b7ba6a}","prefs":[],"schema":1556787949626,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548473","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"ReStyle"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0ff609b-c98e-4d29-8323-61c3e064ec9c","last_modified":1556791242742},{"guid":"{0beedf0b-dc79-48bd-adff-2ed36acdb806}","prefs":[],"schema":1556787897696,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547930","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71475499-ca6f-4b71-8bef-2b95cf59ee30","last_modified":1556787931409},{"guid":"{c11adb01-56bc-44d6-ac05-6f364e2afe01}","prefs":[],"schema":1556787838618,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547934","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6371474-8681-4498-8e89-421f25fd2e12","last_modified":1556787897686},{"guid":"{a1f6fa05-26cd-4399-a97a-7996067d04b0}","prefs":[],"schema":1556739699995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548134","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"TC"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3659d4a2-3121-45cd-b8b6-5b2c96ebc17f","last_modified":1556787838607},{"guid":"{c65b18e1-cd3d-4773-a901-15a0753e7d81}","prefs":[],"schema":1556224830338,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546994","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"PrincipalInterceptor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"af62a050-b136-4d56-ab3a-af85a2510bc4","last_modified":1556224874229},{"guid":"{4bf110f8-5f50-4a35-b7fa-64228bfa2d0b}","prefs":[],"schema":1556224790813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547048","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Predicate Property"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5968da82-1d7e-407e-bf93-5d2247ce55c1","last_modified":1556224830329},{"guid":"{0bd4e0af-664d-4273-a670-7cb3d0b5a4a5}","prefs":[],"schema":1556224295744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547046","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"ConsumerWatcher"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a6cc6fb-dce1-49cd-b624-7b44afacf157","last_modified":1556224790803},{"guid":"{bbddf452-1a72-4a5d-a833-0416ac7fd76f}","prefs":[],"schema":1556197615318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546989","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"AV Scanner (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"20c25379-aed8-4ab4-9e7f-f2d3f5d948a7","last_modified":1556206274610},{"guid":"/^((\\{1601769e-0b0d-4c43-97a7-723ce374996b\\})|(\\{d714118b-5cdd-4829-9299-1066fecc0867\\})|(\\{e8671db6-24be-4744-808c-a63fb744ccca\\}))$/","prefs":[],"schema":1556133515829,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545834","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"XPC and Tabs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b536121-fd82-4639-bc70-30d7060e42d3","last_modified":1556133806451},{"guid":"{3f5f741d-a980-4b58-8552-b1ae328841f4}","prefs":[],"schema":1556099103820,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546480","why":"This add-on violates Mozilla's add-on policy by intentionally weakening website security and adding fraudulent content to web pages.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae288e5e-78d5-4b49-8b4d-fa9f25c3baa2","last_modified":1556112119390},{"guid":"{3fab603e-3ee1-1222-a859-5f85a3441216}","prefs":[],"schema":1555527937277,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545213","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user consent or control.","name":"Add security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74ad8c8b-a65a-470c-aa2f-ca14e1e8774d","last_modified":1555528639011},{"guid":"/^((\\{880cacfe-5793-4346-89ce-fbbd368d394c\\})|(\\{f0780038-50b9-11e9-9c72-4ba2d8f2ec9f\\})|(\\{22ffe411-2b0e-11e9-87f9-c329f1f9c8d2\\})|(\\{cf4bae43-026f-4e7e-a85a-952a7ca697a1\\})|(\\{17052516-09be-11e9-a008-03419f6c8bc6\\})|(\\{333fb3de-18a8-18e8-b6d3-e73213911efb\\})|(\\{aa4abac2-1ffa-12aa-bbdd-9305cb2c1254\\})|(\\{72222e70-2fd6-11e9-956b-27f7787b8d2d\\})|(\\{637212d8-3484-11e9-9812-005056b22b42\\})|(\\{4a222e60-31de-1eca-8476-37565daf6afb\\})|(\\{7fc6d222-48d5-11e9-b586-17e94c73a1b1\\})|(\\{e111c358-121b-13fa-bf23-bb57da32d184\\})|(\\{9674445c-8dff-4580-96b2-99442a7ae9af\\}))$/","prefs":[],"schema":1555525532852,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544315","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Various"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbd7444f-e62a-4639-b172-845548b6d4a7","last_modified":1555527929174},{"guid":"{674fff65-6cd0-488a-9453-fb91fc3d7397}","prefs":[],"schema":1555406446874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543924","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Assistant"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8aff4cb0-4d5f-4e74-8db7-b04f616c3b60","last_modified":1555503879816},{"guid":"{40cd7fd2-a3e4-43f9-9d86-0e0a70376203}","prefs":[],"schema":1555184501005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544268","why":"This add-on maliciously injects remote code for execution.","name":"Scan Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"881d3476-f18a-4560-b065-cded406783d2","last_modified":1555228377222},{"guid":"{8ee8602c-aba6-4e2a-9faa-1724c3f4f9ba}","prefs":[],"schema":1555102738661,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544205","why":"The add-on is  maliciously loading remote code for execution.","name":"Service Proccesor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94621e2f-28a0-4b18-97c6-5f6203f5912e","last_modified":1555161086175},{"guid":"{d8b03707-e39f-4b17-8e56-56354fb14af5}","prefs":[],"schema":1555100104657,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544103","why":"This add-on maliciously injects scripts, violating our policies.","name":"Interruptible Observer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a921aa8-d44a-4272-be63-0fd102577f59","last_modified":1555100575898},{"guid":"{132cb2fd-a6ae-45d2-84cf-b48d591f037d}","prefs":[],"schema":1555099951278,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543922","why":"This add-on injects remote scripts and overrides search behavior without user consent or control. It also masks as an add-on with a different purpose.","name":"Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"371796e4-387a-4dd0-9ddc-47ba1dd85be7","last_modified":1555100104648},{"guid":"H.264.Addon.Test@firefox.com","prefs":[],"schema":1555099832659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543919","why":"This add-on exfiltrates user data without consent or control and may be misleading the user into believing this is an add-on by Firefox.","name":"H.264 Video Codec Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53ef1aad-7bdb-4f4e-8d46-55d6ec2d78ab","last_modified":1555099951269},{"guid":"{608f71eb-5bd6-45d8-bc93-b9e812cf17b7}","prefs":[],"schema":1555099501294,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543801","why":"This add-on maliciously injects remote scripts, violating our policies.","name":"Consumer Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea00841e-8dc2-4e11-9119-7a599e47d800","last_modified":1555099832650},{"guid":"/^((\\{8220ccaf-15a4-4f47-a670-a4119a4296a4\\})|(\\{9da72c11-44d7-423c-b19c-c75cd6188c3e\\})|(\\{99d0e4d0-c5ef-4567-b74c-80c5ed21ad99\\}))$/","prefs":[],"schema":1555011689511,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543848","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user's consent or control.","name":"Search overriding add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03554696-58fe-4b90-89d1-72b72f88f82e","last_modified":1555069748234},{"guid":"/^((\\{b37f383f-e60f-4eb1-ac0f-9147e0e8f2f7\\})|(\\{8ad567d2-3fe2-446b-bce9-a3acbe878dba\\}))$/","prefs":[],"schema":1554997740201,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543673","why":"These add-ons are overriding search behavior without user's consent or control.","name":"Hash"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"036e2e7d-5403-49be-92cf-b5187ceef7ec","last_modified":1554997910212},{"guid":"{be6ab6a9-7004-4c5c-8df9-8d36122d8b14}","prefs":[],"schema":1554997613727,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543705","why":"This add-on injects remote scripts with malicious intent.","name":"asin"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6fd3ab94-8e38-47f3-b129-3ca8396d0a22","last_modified":1554997740187},{"guid":"/^((\\{61f433aa-45fd-42a9-9c90-c1d7820661d5\\})|(\\{86cd46b6-433a-439c-bff2-722846709f44\\})|(\\{98e126a4-4e70-4300-b893-3b2cca19bc9b\\})|(\\{8f42dc3a-1c46-4fc2-8c7f-dd76a63b1cf7\\})|(\\{a24d3582-2fc2-475c-8440-335736e17c6e\\})|(\\{cf0b5280-cd08-465d-ad7d-70308538f30a\\})|(\\{936f3c79-5dc9-4694-bca8-47932de3357a\\})|(\\{e48d5888-8736-4858-83ba-e816378ffef8\\})|(\\{5305f89c-ceec-4217-8bae-c9c376c7462b\\})|(\\{a2ac47e5-d225-4718-9b57-18a932f87610\\})|(\\{79f60f07-6aee-42cd-9105-c0a52f401316\\}))$/","prefs":[],"schema":1554981266268,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543664","why":"These add-ons exfiltrate user data while masking as a legit add-on.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fc38e782-d55b-4fb7-8f9c-374aa18af09c","last_modified":1554997613713},{"guid":"/^((\\{0913599d-3094-44a7-8cc2-b8467d5afc7c\\})|(\\{7bee7f1b-d8ad-424d-807d-e69e6634988e\\}))$/","prefs":[],"schema":1554898779160,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543462","why":"This add-on violates Mozilla's policies by exfiltrating user data without their consent or control.","name":"Malware exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0d86ba71-7baa-4cb3-b3b8-da4ccdfa36b9","last_modified":1554976164809},{"guid":"/^((\\{9946bf2f-0aef-4040-bc57-cdae2bde196a\\})|(\\{d511784e-d088-4fce-b77c-14c186f08641\\})|(\\{fe59312a-97bd-4ca7-bce3-b0db95b1e251\\}))$/","prefs":[],"schema":1554897771015,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543118","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"Invert (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed01b7e5-73d1-42a6-9fc8-af2d83879854","last_modified":1554898652923},{"guid":"{c75432cb-980d-4e64-98c8-d7947b382a2c}","prefs":[],"schema":1554897109129,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543255","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Concrete Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7fd0eb9c-9f6c-40ea-ba39-645cafb1d5a0","last_modified":1554897390260},{"guid":"/^((\\{6a99a9ec-f149-4ad3-b644-15e44290d00c\\})|(\\{cd9d1582-13dc-4ce1-9c83-4aaa31c6bc36\\})|(\\{3414a827-ee54-4331-85eb-736a824bb7e0\\}))$/","prefs":[],"schema":1554896836686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543181","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users' consent or control.","name":"Drag (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4f0ac78-ba85-4b5a-9d1f-f3f2c6ae4f7c","last_modified":1554897104624},{"guid":"/^((\\{4b6e66db-ee0b-4fc3-abe6-b97cb4798faf\\})|(\\{8aff5f41-86f8-40f1-896d-954eae7fb670\\}))$/","prefs":[],"schema":1554817097951,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543049","why":"Search hijacking","name":"Fit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8a7efe6b-8670-4714-b4b2-08ce5f202ee7","last_modified":1554818136441},{"guid":"{81425b21-cc8c-42d0-98e8-69844bcb7404}","prefs":[],"schema":1554811583185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543048","why":"Remote Script Injection","name":"Tech Chip"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dafcc63d-37e0-42e2-b439-59727cf9de48","last_modified":1554811754967},{"guid":"{d85aa6ef-639b-43a1-8560-ddeb59935d10}","prefs":[],"schema":1554803024628,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543047","why":"Remote Script Injection","name":"BatchSerialize"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"204b7b05-d8e1-4de3-86f9-fcf95edb40c0","last_modified":1554811583171},{"guid":"/^((\\{bf163ed1-e9f9-4c98-ae4b-8391133472d1\\})|(\\{ec283482-2d66-49b2-9dc5-0d03bcbffe65\\})|(\\{0a19856e-4168-4765-a8ab-a3a34fa88ec1\\})|(\\{e2019dd1-4591-42e2-864a-535a99972b1a\\})|(\\{88a65f0c-f952-41f0-8868-f22fa12597b3\\}))$/","prefs":[],"schema":1554754247858,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ddd97fae-7040-4758-811f-1dd53116e6ab","last_modified":1554755273775},{"guid":"/^((\\{743fc0de-1085-4078-8611-848024989608\\})|(\\{02acc043-f402-4e48-aa15-56ee1364e17c\\})|(\\{1b7892ab-6dbe-49d1-9c71-bbb70458c830\\})|(\\{25b3b5bc-b77a-49d1-ab56-c0e760fe02ff\\})|(\\{2c78aa89-8cdd-4a96-821a-e35628aea2fb\\})|(\\{2f154b99-05c2-4629-b687-f2aa031d9f65\\})|(\\{36df6f78-16c4-42c2-a6b8-9210a2953739\\})|(\\{40ada62f-72a8-46b7-8e50-4153f660ce34\\})|(\\{49f58462-fc24-472c-b85a-4a3dbbf48741\\})|(\\{4a8cb3fd-0400-47b3-a799-9f2964229bfa\\})|(\\{5429f6da-d7fe-4f1b-a85e-6dc721ec0037\\})|(\\{74480b2f-1198-45b3-86b3-ca0778482216\\})|(\\{777f1169-a824-459d-8a2d-ca2ffaf59424\\})|(\\{81e610be-656a-4a71-866d-dd94b5096c60\\})|(\\{81ee3e70-b6e4-44d0-b5c2-94ded26bb5ac\\})|(\\{881c71c1-6800-4e8b-89de-0d14ef67d588\\})|(\\{9b5d7f59-be9c-4f1e-bf0c-31f085c17726\\})|(\\{9eff0ead-25a4-429c-b4b2-280ba3c6f2d9\\})|(\\{ad1b7e87-e260-4aee-a602-ef234743443e\\})|(\\{b54a530a-cacc-4c76-a7c3-feafd4ce0b13\\})|(\\{bd0d7634-770e-4d9f-8309-d264a5fbbfa9\\})|(\\{bdf16cc8-3da6-4317-a1eb-2ab8adce6b66\\})|(\\{bf484a7f-49fd-4681-afa5-8a063d010a14\\})|(\\{c7cf6d86-207b-4231-a96a-bbfdc9fe59aa\\})|(\\{d33f83c2-dbc6-41d2-a8b9-28fdaa96985e\\})|(\\{d71757ee-edc7-44d5-b536-cb0370d7d9f6\\})|(\\{daf86db4-7dd4-47d4-a1d1-7c31f6b9bbe3\\})|(\\{e27060a0-5fb5-4844-b446-d2655d7681fa\\})|(\\{fae0d133-05dd-44e6-88e1-e218ca2b2caf\\})|(\\{fbf69005-55d8-4360-a562-255a8c285fea\\})|(\\{fd6d1b53-89f5-4d91-9234-fb3e1b067c1b\\}))$/","prefs":[],"schema":1554753973658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e12a97c7-2c83-4e1c-a2c3-66a653bc6048","last_modified":1554754247845},{"guid":"{ea173fdc-f27a-482a-8a0a-61fd1aa2ee2e}","prefs":[],"schema":1554744706554,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541005","why":"Masks as a legit add-on and includes a remote script that is against our policies","name":"InterpreterInvocation"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8742ec6a-2e51-4e94-bc6a-653dac08521b","last_modified":1554753973644},{"guid":"{16768af9-4120-4566-95cf-c4234effa084}","prefs":[],"schema":1554733900697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540999","why":"This add-on changes the search settings in a way that is not allowed per our policies","name":"Unknown search hijacking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fb0ed8e-6e5d-489e-8c9d-b6f48705a742","last_modified":1554736392840},{"guid":"{35b9640e-ebbb-44b7-85af-d9ec3af3c6a6}","prefs":[],"schema":1554730607333,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540690","why":"Malicious remote script injection","name":"Patagonia Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0eb3a151-ca6b-4dbb-81b3-c10635660c84","last_modified":1554733900683},{"guid":"{d574e1f8-537d-4b6c-97bb-9f7a138f4d67}","prefs":[],"schema":1554728269766,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540686","why":"Injects remote scripts and masks as a different add-on","name":"DistributedConsumer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a158055b-3387-4961-a4a3-a820d9299e15","last_modified":1554730607318},{"guid":"one-search@mozzilla.xpi","prefs":[],"schema":1554666099983,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1542208","why":"The add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"One Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1344c583-9593-412f-a565-c6cc96a07c28","last_modified":1554718843138},{"guid":"/^((\\{00b4b65b-79d9-4e92-bc1e-2b926918b91c\\})|(\\{0cb66591-e935-47e4-95c2-3063786f6555\\})|(\\{6cf25884-f86d-4a4e-a924-d95282ce5b71\\})|(\\{22cce9c6-a1de-457f-8938-c981b976b6f4\\})|(\\{89d99d4c-e7c4-4601-91a8-216e597a826b\\})|(\\{998d3ac7-b475-410e-ad3d-2eeb526c1853\\})|(\\{9423e8df-6200-45c0-877a-479c46e91b30\\})|(\\{64937e0b-6e00-4d5f-bf19-190d6614aae2\\})|(\\{91507dc4-c005-4534-80af-d8fbdeac29ed\\})|(\\{a2247e60-7b89-4857-a2fa-0eaee1cad460\\})|(\\{c9c28751-5865-449f-8e45-b3363edf9fb7\\})|(\\{cdfd004f-cddc-4ad7-8e2d-a58457e42b1f\\})|(\\{d3e7f35d-7d9f-4d38-9a2b-1581f6b3e870\\})|(\\{df574ffe-cce0-42db-857b-627cb164a4d4\\})|(\\{e06afe6e-ed52-40f8-82bf-d070a37387fb\\})|(\\{e7e7fb96-cfab-4a5b-85fe-20f621e1bc2e\\})|(\\{e12e5afd-bd1e-43c6-9288-321dc485cb1c\\})|(\\{e92d8545-0396-4808-96de-830c61c0d1b3\\})|(\\{e883b012-1987-4f37-8053-02e59e20c242\\})|(\\{ed3386c6-76c6-4786-a37b-9816d5f2a260\\}))$/","prefs":[],"schema":1554462951082,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541662","why":"These add-ons violate Mozilla's add-on policies by overriding search preferences without user control or consent.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1c376fe-20c5-4da3-9126-3fe95b874dce","last_modified":1554463075420},{"guid":"/^((\\{6ab41e83-2a91-4c2a-babb-86107a1d1f75\\})|(\\{d84a9d0d-7a31-459e-b45a-2ad111884d1f\\}))$/","prefs":[],"schema":1554293659259,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541405","why":"This add-on violates Mozilla's add-on policies by overriding search settings without user control or notice.","name":"PopWin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04b2954e-4f83-4557-968e-2139a277bf1c","last_modified":1554301860877},{"guid":"/^((@searchlock-staging-automation)|(@searchlock-automation)|(@searchlock-fx)|(@searchlock-staging)|(jid1-vRJA7N8VwBoiXw@jetpack))$/","prefs":[],"schema":1554293340413,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540868","why":"This add-on violates Mozilla's add-on policies by executing remote code and overriding search preferences.","name":"SearchLock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aacb25e1-71c5-4bee-ad16-e39e732210ba","last_modified":1554293606641},{"guid":"{03dfffe0-509f-11e9-aa00-e7e13d49f3de}","prefs":[],"schema":1554290590697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540113","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Addon (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c75fe89-7011-47ad-b213-57f5a81a4c89","last_modified":1554290693618},{"guid":"{e555c358-121b-13fa-bf23-bb57da32d184}","prefs":[],"schema":1554290541557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540111","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1809ea7a-8155-4ae7-8c83-ee7c749d30f5","last_modified":1554290590689},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e1}","prefs":[],"schema":1554147700324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539514","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4e4e75-cc96-4ca9-aa9f-6a2d2f6cd96a","last_modified":1554290541548},{"guid":"{a3f765c3-8dde-4467-ad6e-fd70c3333e50}","prefs":[],"schema":1554119395186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538143","why":"Remote script injection","name":"Angelic Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93dc42cc-4ff3-460d-a8f2-12f1d947b530","last_modified":1554119427564},{"guid":"{91f77263-866e-4acb-a569-f66ac47889f8}","prefs":[],"schema":1553974898434,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539226","why":"Remote script injection","name":"Bit Apex"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c528f48a-9b2c-48ca-8b4a-eac442cc0bd0","last_modified":1554119395177},{"guid":"{2256fabf-19f1-4e12-9951-5d126dd9e928}","prefs":[],"schema":1553899022464,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540086","why":"Search hijacking","name":"Twit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c705f73-9d1d-4ee9-ad11-347d18729adb","last_modified":1553900528324},{"guid":"/^((\\{00f77164-eca9-4353-916d-8ea493a54c8d\\})|(\\{0716b2a5-8181-45b8-b675-915e38903761\\})|(\\{26124967-7e32-4577-b998-7296c68d3eb9\\})|(\\{273052bc-fc67-4fc1-a6fd-e62acc3ddad1\\})|(\\{4b5f53ac-36ac-4018-80cb-f1106f60ef96\\})|(\\{61065f61-51aa-462c-aca0-f1addbfa202b\\})|(\\{63383006-d617-4a00-9ca7-30a6864782ee\\})|(\\{7629c987-59ea-4e2f-bcde-b55646ecd268\\})|(\\{78e8c8fa-32ce-432b-9a40-b615bff7cd96\\})|(\\{8e9c05df-e0f5-479f-abb9-858650cb471e\\})|(\\{947f1ac0-09f2-4016-a345-dad0d2ee8f57\\})|(\\{9b9f8124-47bc-4699-8557-45573995b0af\\})|(\\{ab159932-d1dd-4d16-9332-8302a01e0ced\\})|(\\{b7340504-f6ba-43cb-8bd6-5ead88d29898\\})|(\\{bcb9265f-20fd-4311-a33f-212c2d08043a\\})|(\\{f8701822-2814-4d5d-af01-cf7fde4fd510\\}))$/","prefs":[],"schema":1553898687988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Data exfiltration, is not actually a flash player","name":"Adobe Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"64fc6369-b504-4920-abab-f2cf3cc5424a","last_modified":1553899022456},{"guid":"/^((\\{7dd03112-82a0-4c82-9957-117dedaac14a\\})|(\\{59fd3cac-1a4d-4f0f-a129-c241b203eb51\\}))$/","prefs":[],"schema":1553897736388,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540287","why":"Search hijacking","name":"Song"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b32b14f5-0024-48fb-a4b6-1496add1dac0","last_modified":1553898687980},{"guid":"/^((\\{70c2cef0-6cc6-41b8-ad6b-bbd11182a101\\})|(\\{a0366612-376e-47e3-b5fa-b805c7176088\\}))$/","prefs":[],"schema":1553810805293,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540055","why":"Search hijacking, masking as legit add-on","name":"Pix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d78262b0-ecfc-475e-9759-f7319451cb43","last_modified":1553847044919},{"guid":"/^((\\{10f1b84d-79ca-41d0-97f6-abb53cec0765\\})|(\\{7891c029-0071-4534-b7f0-7288f14ee0ad\\}))$/","prefs":[],"schema":1553810612956,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538476","why":"Remote script injection, search hijacking","name":"FX"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"50197dbd-71bc-492f-a0f1-6658ec454df4","last_modified":1553810696456},{"guid":"/^((\\{058769c7-784e-47a9-a2c4-dfd81bbf6c8c\\})|(\\{2a58598a-f951-4fb0-af2b-12fb7482bf33\\}))$/","prefs":[],"schema":1553810234714,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Keylogger","name":"Fake adobe flash player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e1355888-e1cd-4d21-9652-c3000662ed88","last_modified":1553810612947},{"guid":"/^((\\{54c7e57f-8ef0-48d5-92a0-6e95d193a12c\\})|(\\{32d262da-e3cd-4300-aa0b-c284eb4e17bf\\}))$/","prefs":[],"schema":1553802101395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538536","why":"Search hijacking, masking as legit add-on","name":"TxP"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa6c7cdb-e477-4478-8dd4-3e1106be6aa3","last_modified":1553810234705},{"guid":"/^((\\{36261798-4c2a-4206-89cc-6c28932b2e98\\})|(\\{b2b9bb64-78d5-43ca-b0cf-a9ee8460521b\\}))$/","prefs":[],"schema":1553616425198,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538234","why":"Clone of Feedbro with added remote scripts and search hijacking","name":"Feedbro Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e00b2639-8a4f-427a-80d8-7c4937c58f31","last_modified":1553620435398},{"guid":"new-tab-search@mozzilla.xpi","prefs":[],"schema":1553616311575,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538500","why":"Search hijacking","name":"New Tab Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4dca16a-9fa1-4b55-899c-0f8d5eda1a57","last_modified":1553616386570},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e3}","prefs":[],"schema":1553616259023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538141","why":"remote code execution","name":"Fake Security add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c09f067-6e5f-4ee0-9040-08b4297ebe02","last_modified":1553616311567},{"guid":"{7ab5c514-4ebe-22e9-a925-9b7c7317c373}","prefs":[],"schema":1553548654429,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538266","why":"remote code injection","name":"Eval"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1f04f09-f4d5-4875-b4b1-a2c772178e8e","last_modified":1553616158755},{"guid":"{bc919484-f20e-48e2-a7c8-6642e111abce}","prefs":[],"schema":1553519202849,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538962","why":"Inserting monetization iframes and masking as a legit add-on. Contains patterns for known malicious add-ons.","name":"Pinterest Save Button clone"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7abbecfb-5512-47d1-ba9b-96d6a61b85ee","last_modified":1553548325261},{"guid":"/^((\\{157cd8f9-48f0-43a1-9bcf-c4316753e087\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e086\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e088\\}))$/","prefs":[],"schema":1553186907495,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1537895","why":"This add-on violates Mozilla's add-on policies by overriding search settings.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e263fbec-7155-442f-aa82-cdf218f9e3d7","last_modified":1553193746700},{"guid":"/^((\\{1c94bc8a-3ac1-12e1-aae7-0b314772229c\\})|(\\{8a22255c-4737-11e9-a86b-0bb66337cb31\\})|(\\{3fab603e-3ee1-1222-a859-5f85a3441216\\}))$/","prefs":[],"schema":1553166786114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535655","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"'Security' add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6cf1b676-f0b8-4fea-8a5f-64957650dc2e","last_modified":1553172061896},{"guid":"{28ac81f1-b04d-448f-94be-1b8cc8fbd58d}","prefs":[],"schema":1553079961735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536513","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"UtilsBridge (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f60b3eec-b8b8-4bd7-8d2b-3f7912c3451f","last_modified":1553080348264},{"guid":"/^((\\{9332d73d-7991-46bf-8b67-6db1a21f0167\\})|(\\{b33715d3-eff8-4186-a252-0af5094b8644\\})|(\\{eb7aff78-6145-4a31-a7f5-f3c353ddb312\\})|(\\{6c5cd693-2919-4458-b776-2ac5b6ab1cb0\\})|(\\{daacefee-aaba-4f10-8d4d-059904d8a153\\})|(\\{94d8d504-838c-4392-9971-cd2f6e21ca21\\})|(\\{6574bb31-c971-454f-b08c-a75bfee00855\\})|(\\{1688ecb0-e382-481f-8c70-541d70bdd2e9\\})|(\\{f7b9f777-7b01-4f73-8eb8-f2ad85d4da1c\\})|(\\{598d7ac6-1789-4573-ae6a-5798ed7f6d83\\})|(\\{c0eb4d03-d18e-40bf-b21b-8237ee1bed76\\})|(\\{d0513185-1f20-4045-a232-f3a4252af379\\})|(\\{9ae8269f-eea1-4097-87fd-b7d2f102184d\\})|(\\{5683f95b-2517-4ca7-9d19-83d7f309b62a\\})|(\\{013d3691-0dd6-471b-bf0d-2750d7406a22\\})|(\\{ae73a262-1a27-4d1d-9be7-4b41a84dfd23\\})|(\\{1d92fc5d-5353-401f-8c5f-373b3b6dae67\\})|(\\{e8a81b54-3728-4a9c-8c63-18ef803ef9be\\})|(\\{d604961b-3a3d-4f60-87ae-35977c10b787\\})|(\\{cbe9b620-fac0-407a-b3be-b0a61b319ef8\\})|(\\{1cdb403e-11c7-421b-9c87-0c0d90263626\\})|(\\{f5fa0bfe-a981-48ff-b809-8faa3126f0bc\\})|(\\{7dc6d0d2-b2f0-4334-979d-6ebeff77785a\\})|(\\{13623b47-de82-4226-85f8-d3ae343e619b\\})|(\\{db7b6ea7-2605-44c7-807b-2419d7eec531\\})|(\\{b9298a4a-acca-446d-aa72-d37f5e1576cd\\})|(\\{2e689bc0-735f-445c-bcc7-2cc495f5eb40\\})|(\\{04acd977-4c2b-4162-af33-8c585bea90c5\\})|(\\{2436dde0-3230-4933-9020-c15b3b9e693b\\})|(\\{dcb556aa-ef6e-4778-9f60-c5ae18a72cfb\\})|(\\{5a24385f-ada4-455d-95ad-62cb6256360d\\})|(\\{97f88a13-5b79-4345-a85e-2560d54f577c\\})|(\\{12f4cde8-7d1c-4a9e-9ef7-431f5ecd53a4\\})|(\\{18a93813-7deb-40cf-b3a6-402369e6d817\\})|(\\{9cee5c92-eb1e-4892-86ff-d2d1c627f5b9\\})|(\\{cb1c544e-d444-4c85-8224-64aa26e82230\\})|(\\{1c3b247f-2ef4-4483-93a6-0a3da7bc3548\\})|(\\{1f6913f2-dead-4f96-bf96-0e64affd46ae\\})|(\\{109adc7d-f308-43a5-aa0e-07ccdc5dad2c\\})|(\\{7170e23c-c706-48a7-919f-c1c22548dbfb\\})|(\\{6aa47f05-1f3f-4798-908a-0ed01b2361e0\\})|(\\{33ef0e7b-15ea-4b08-a779-173731ac20b3\\})|(\\{a0361564-9461-4da0-8ec0-7dc6f418f707\\})|(\\{c12631ed-993a-4c2e-9bf0-37867ae40491\\})|(\\{00b79649-3f0e-4b12-a8f0-376a7b2db716\\})|(\\{89096e44-c8b4-4ce5-aad2-f5bac765f608\\})|(\\{6f4eff89-0e32-42bd-a5c1-354adc8417fd\\})|(\\{482c54ae-e080-4596-bf7c-ae972fdff9a3\\})|(\\{04868575-532f-4b43-9325-7e707c109c25\\})|(\\{042c3065-1291-4409-bae5-8d11f3c268e2\\})|(\\{126e7fc4-bf2d-4467-88b1-f3b17bc10da4\\})|(\\{cea21739-b9ce-46c7-ad3e-3607b1ff6538\\})|(\\{06eea1e7-a8be-4794-8cd5-ed12e5f86161\\})|(\\{50993bc5-011c-4322-b522-41e6f3997163\\})|(\\{219a2146-5d9b-472a-8630-4c96a0994bec\\})|(\\{1db94c2f-d957-4b12-a1dc-903bb28f5ff5\\})|(\\{2f7d887c-7d56-41fa-bf9b-eadf6e500427\\})|(\\{2b16f4ab-a2a9-43fd-8fd6-ad6f354b0d28\\})|(\\{034d2b14-29e6-42ad-b2db-2c31286f3fb7\\})|(\\{77058195-5ae1-440c-8f86-c60a96d12ca9\\})|(\\{8082ff2f-2151-4281-8134-1423e5961ca1\\})|(\\{9fa797e8-d7d4-4851-b7e9-76b61ecf046f\\})|(\\{87178fbe-17a5-4d8d-b5ed-48d17179b101\\})|(\\{f010d9e9-0878-4c83-af45-df966cbe8d26\\})|(\\{2aa8c5cd-18fa-4991-b354-d6f459efeca9\\})|(\\{4021839d-3f4a-4866-94fb-9fa809c5245b\\}))$/","prefs":[],"schema":1553024292304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535088","why":"This add-on violates Mozilla's add-on policies by exfiltration user data and tracking online activities.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"478d4acd-3c01-4dd5-b784-4e06b69d1c05","last_modified":1553079818962},{"guid":"{781b89d4-fa53-45a1-bea4-151dd4c8b288}","prefs":[],"schema":1553013598703,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535280","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Drop Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81759002-967e-4856-9f55-61d7c30cdb3b","last_modified":1553013656506},{"guid":"{3b52063a-0683-4de2-b6e1-6192c78b6ba3}","prefs":[],"schema":1553013551744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536042","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Project Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a7f932a-3911-4884-8cb9-d282d282c0cc","last_modified":1553013598695},{"guid":"{47610aad-982f-4822-93ca-8c27dc96a13b}","prefs":[],"schema":1552938092086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534773","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Tech Hand (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"12874e4d-28b5-4e98-8c33-b6cf5eb032bf","last_modified":1553013551736},{"guid":"amqp-dwn-all-vd@artur.brown","prefs":[],"schema":1552916969263,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536052","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Video Downloader Plus (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3f5ce2f-d8ef-4dae-9fce-1d7fb69d2b37","last_modified":1552917123606},{"guid":"/^((\\{1d758385-fddd-478e-85a0-13eef59f60e5\\})|(\\{1ec3e92a-fd3c-4e16-82e2-56d44bd7bdf4\\})|(\\{3dadda0d-d67c-4452-9475-246c33198192\\})|(\\{4a48f6a8-c9d6-4ae2-8513-a7e9fe785a56\\})|(\\{4d2da172-b160-42b5-9fea-0ede63e0ab52\\})|(\\{5bcd4feb-ce52-4e6f-9da6-eef2a75a4f70\\})|(\\{5eb45d74-0f46-4269-bc0e-8a2a49d64267\\})|(\\{7e8c27c0-b94c-4026-8068-2d152143f073\\})|(\\{9ede19b2-bb97-4d1c-abab-b1d72e7d4c74\\})|(\\{19abb7a0-fb4d-41ff-97d4-65f1680c1348\\})|(\\{25efbdeb-04fa-4998-a9f8-99c1293c7b7f\\})|(\\{0049a401-f02d-4d16-8b5e-5933e5855a4c\\})|(\\{65b91ca5-cd06-42a6-9637-8ecde3a69fd6\\})|(\\{146ec14e-f623-4cb2-88ed-7d3bb8101090\\})|(\\{790d2797-82f3-4bc3-8759-c00d426bbf2f\\})|(\\{865f42b5-e073-4a36-84b1-47d09096b48b\\})|(\\{90055a5b-45a8-45c1-b0a0-979ab2a9064f\\})|(\\{a4f5c163-7b64-46c4-bfd3-348ecc99873a\\})|(\\{a8c40ee7-a376-417b-8022-40909a10181b\\})|(\\{a1031346-14d3-464f-9e50-c30dfd88ad92\\})|(\\{abd16535-2fa8-4bfd-b84e-ed09c9c60e53\\})|(\\{b5ee8c58-b5e5-4ba0-a899-9a54a2f0e386\\})|(\\{b246bb42-577e-4587-adf2-7274b378b0b4\\})|(\\{bb43765b-fe06-4d50-9802-0c6742b220aa\\})|(\\{bf3f628d-9e52-4727-b940-054c65a5a304\\})|(\\{c6bc710d-8cc8-4224-9287-44ecfa452a81\\})|(\\{c232edce-83c9-4184-9782-22df800f65e2\\})|(\\{c5397be4-b756-45b8-a247-339846fada52\\})|(\\{c6675bc5-f7ea-4a11-8252-1152d3783ae3\\})|(\\{cc6a088b-5a84-4e48-8de8-d2f6be3abae7\\})|(\\{e6c12219-f67e-4ea0-a9c3-2c541febeff1\\})|(\\{eb3a7ef7-a4d0-49a4-8b21-2a91c1758100\\})|(\\{ec34588b-86b4-4de3-a3bf-f4d1d8386475\\})|(\\{f4fd8825-648f-4b63-a499-3fd702d42149\\})|(\\{fc4f31f6-c5ed-4afd-8c19-df96e107ce7d\\})|(\\{fe337ef5-bb69-44bf-82a8-ee5c13406165\\})|(\\{ff285a1c-5672-44c3-890e-6c4f25976b83\\}))$/","prefs":[],"schema":1552908996320,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535421","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"25f18cc5-6ecc-419f-b093-b79e9f261062","last_modified":1552916969252},{"guid":"{a4491aab-e273-4bc3-b45e-a7b9b9414a5f}","prefs":[],"schema":1552695264438,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534792","why":"Search takeover not according to policies, masking as a different add-on","name":"FFCop"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d2da9c45-59f8-4257-9d7e-07c4fa5de958","last_modified":1552695747900},{"guid":"/^((\\{0f6b717d-1625-4434-b770-5ae33eb64b16\\})|(\\{6d092be7-0bad-46af-9489-04e4b3988644\\})|(\\{7f6049d6-e8b0-4c42-8028-204d1458ddb6\\})|(\\{12b75028-c038-40bd-be5b-2809b7d18d78\\})|(\\{46f35a01-faaf-4fab-95e6-7dfc8b6d8b73\\})|(\\{55d2c6f7-62fa-4091-988b-7f4c4b3c1bff\\})|(\\{75aeaeec-d415-404d-84ba-bd70bcc5e70c\\})|(\\{76b8cf24-227d-4e2b-af4c-39ec5b47babf\\})|(\\{77b725cc-5d0e-4b82-88f0-ec6961acd697\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f531\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f539\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e084\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e085\\})|(\\{201ec7f7-57b1-48dd-945c-b1ea7489195d\\})|(\\{280fc0f5-6dfb-4a3c-92ae-acb2d5352175\\})|(\\{388f6d65-4a1b-43ac-b791-387882c30599\\})|(\\{0575cabd-38f3-4964-bdc3-0141a2f062e9\\})|(\\{927e4189-4f56-437e-a0d4-5e232612b5c7\\})|(\\{7277d7cf-c598-420b-ab6e-ab066e1e2fdd\\})|(\\{67775ec2-c879-438b-9409-89fba7ffc684\\})|(\\{397386d2-bb76-4b69-8121-86fad15c5216\\})|(\\{bd7f03dc-b362-4744-b118-43ab916205f9\\})|(\\{c133fb29-c967-4aec-953a-4974e8cbdb26\\})|(\\{cc94c8a7-efa3-435c-91fe-ca305f70e39d\\})|(\\{cfd2ff68-6579-4448-8a26-561bdb63877c\\})|(\\{d00f0050-a66c-49fc-9236-1498d4d29f67\\})|(\\{daa287a2-5916-413e-9b61-52c00b5aa061\\})|(\\{dcfac76f-2fd2-4477-9a60-22d167cabcb4\\})|(\\{dd1bbcf4-bff3-4f15-8a2c-3d52ce987f70\\})|(\\{ddb546b5-6490-4af5-8813-8e701bc06e26\\})|(\\{ead6848b-4bd6-4f9a-93bd-b8460c6f6973\\})|(\\{eb8f7a97-ffb0-40f1-9321-5ab1de884f1c\\})|(\\{ec3e8a3d-df39-4f84-ab31-dae369a225e4\\})|(\\{ef986f55-2dc9-4e39-8c87-618cf4fe5e69\\})|(\\{f8b4b601-7917-40c1-94ec-8efbbf125a46\\})|(\\{f8bc456c-0fb4-4d5d-a85f-dfeb25459e76\\})|(\\{f0458469-cc09-407e-a891-be8606553341\\})|(\\{fa73622c-8b41-45b8-9d93-6d66e7633765\\})|(@loveroms)|(loveroms-ash1280@jetpack)|(searchdimension@gmail\\.com))$/","prefs":[],"schema":1552655172725,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535402","why":"    This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"Add-ons including abusive search behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f9cd41dd-9e52-4506-bb58-a31e189f4ab9","last_modified":1552655392045},{"guid":"{b6f5f2d0-1aa3-4e43-b536-6db1b1bf7d1c}","prefs":[],"schema":1552592498693,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535601","why":"This add-on violates Mozilla's add-on policies by exfiltrating user data.","name":"FFcanu (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b807d5f-a192-450a-a0b3-98113c4beff1","last_modified":1552655172717},{"guid":"{e19fed8c-637a-42e3-b62a-3a6c4040ded8}","prefs":[],"schema":1552570939014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535345","why":"This add-on violates Mozilla's add-policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5027a1c1-e050-434f-ba77-56417bc2d7cf","last_modified":1552589019976},{"guid":"{fb62e856-f09b-4cbc-ba07-642ab55f6cb4}","prefs":[],"schema":1552567880022,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534781","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"EncDNA module (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ce66baec-1237-481c-87db-ccc1bcf0359d","last_modified":1552567941331},{"guid":"{54fc344c-e8ba-462a-a6d9-9ce1b794ce46}","prefs":[],"schema":1552567837850,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534817","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bec4aaf-dd5b-4754-bd01-461fdc7ea5ca","last_modified":1552567880014},{"guid":"{7b6def45-d585-431a-a479-5bb2badf2506}","prefs":[],"schema":1552567781490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535055","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"PredicitionR (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9227d28-b627-48b8-8392-e9fb5a00d9b6","last_modified":1552567837842},{"guid":"{6fb28b6b-abf2-4937-af28-340851faa971}","prefs":[],"schema":1552567721181,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534769","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"metamedian (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed853ce8-83e0-42b7-8d93-7f48041d4987","last_modified":1552567781482},{"guid":"{ae5b30dd-b29d-4ae6-844b-5d7bfc3d7915}","prefs":[],"schema":1552567676370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534807","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Crypto Valuator (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3cfd9af5-a7d0-49d3-971b-7af5e2eab78f","last_modified":1552567721173},{"guid":"web-private@ext.com","prefs":[],"schema":1552567616148,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534828","why":"This add-on violates Mozilla's add-on policies by overriding search preferences.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d52fe32-71e5-47bd-8eda-d98fa0c489e9","last_modified":1552567676362},{"guid":"/^((ads@firefox\\.pl)|(adsfinland@firefox\\.pl)|(adsfrance@firefox\\.pl)|(dodateknowy@o2\\.pl)|(dodateksuper1@firefox\\.pl)|(dodateksuper2@firefox\\.pl)|(dodateksuper3@firefox\\.pl)|(dodateksuper5@firefox\\.pl)|(dodateksuper6@firefox\\.pl)|(dodateksuper@firefox\\.pl)|(test_b@iext\\.pro)|(\\{697be03c-cdd2-430e-b6cf-0f9b5f0556ee\\})|(\\{c9ced03f-a5cf-4dbf-b5ba-67673e442590\\})|(\\{cbe59f66-a23a-45c1-81ac-d0cbedf9ea4e\\})|(\\{dbf0a186-d41c-40ae-8841-e9d8a6b49d8d\\}))$/","prefs":[],"schema":1552493457658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534940","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67025e3b-860c-4680-949f-ec472cd72fae","last_modified":1552567437766},{"guid":"/^((\\{86c18738-11ed-4c16-af92-786aa036c83c\\})|(\\{d0fee16a-f4eb-4dc1-9961-82b913e5943d\\})|(\\{1c4937a1-c678-4607-8665-a16384ee302e\\})|(\\{22caeb02-38a3-415d-b168-64fadccbb4a4\\})|(\\{1c9372e7-5f0e-4541-99cf-dfbf2ab00b01\\})|(\\{9fe66994-8ed1-4317-a20a-1d0544ca062f\\})|(\\{6df222d8-97c7-42bf-9683-1cf8119c1e9e\\})|(\\{4c2dda03-bad0-4160-a8a1-6d089200420e\\})|(\\{7aae7d4f-55b9-42eb-b683-932591265e17\\})|(\\{e6f8ab99-3c96-410c-95d1-267ad48ed3e2\\})|(\\{6d8c5068-d0cb-47a5-af5e-3f23064f4608\\})|(\\{90481f38-d06a-465e-a54c-206bbb1ee9ae\\})|(\\{4b75aeb8-f14a-4ef3-b1ad-09733b40dac3\\})|(\\{3a8ca495-f5ab-4320-b070-4f44266fe3d1\\})|(\\{84f8914f-0dec-48ed-a0fd-4a7712c06793\\})|(\\{aa613fce-603c-41df-bf49-9b09614cebe6\\})|(\\{30314350-199a-4951-9c05-c3537a946492\\})|(\\{a2edce1d-10ab-483d-8c01-5e5fe0c82902\\})|(\\{ec91a3d4-8311-4700-aa15-b3941f21a052\\})|(\\{e9049687-164a-4cf3-be1f-1291cfb0f44a\\})|(\\{2be73925-ebaf-43ca-8b26-bd820887f591\\})|(\\{840eadea-1c68-411f-b4e9-08d9f236385d\\})|(\\{0a89d040-5fb1-46d7-bf81-43b55e83695d\\})|(\\{6a1e76ed-4ac2-4a0c-8beb-43ae63558b36\\})|(\\{1b90c930-e7d7-486a-9085-8b57129489c7\\})|(\\{eab649ca-af76-4de9-95b0-8036e35a66cc\\})|(\\{0628e652-98f4-4e58-9ecb-ad996b061aef\\})|(elfr@geckoaddon\\.org)|(else@geckoaddon\\.org)|(fr_b@iext\\.pro)|(it_b@iext\\.pro)|(sv_b@iext\\.pro)|(no_b1@iext\\.pro)|(fi_b@iext\\.pro)|(au_b@iext\\.pro)|(elfr12@geckoaddon\\.org)|(test@informations\\.to)|(se_pop@informations\\.to)|(it@spongebog\\.funny-ok\\.com)|(it@tsunami\\.funny-ok\\.com)|(fi@spongebog\\.funny-ok\\.com)|(fi@tsunami\\.funny-ok\\.com)|(no@spongebog\\.funny-ok\\.com)|(no@tsunami\\.funny-ok\\.com)|(fr@tsunami\\.funny-ok\\.com)|(fr@spongebog\\.funny-ok\\.com)|(se@tsunami\\.funny-ok\\.com)|(se@spongebog\\.funny-ok\\.com)|(au@spongebog\\.funny-ok\\.com)|(au@tsunami\\.funny-ok\\.com)|(nz@spongebog\\.funny-ok\\.com)|(nz@tsunami\\.funny-ok\\.com)|(gr@spongebog\\.funny-ok\\.com)|(gr@tsunami\\.funny-ok\\.com)|(nz_fnew@tsunami\\.funny-ok\\.com))$/","prefs":[],"schema":1552320039514,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534103","why":"Stealing cookies, browsing history and other information","name":"Rogue Updater add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b57d9505-21bf-4a24-accb-05ceac50dadc","last_modified":1552323475989},{"guid":"{c04d9d7d-1c8c-4eab-a51a-828c47e1b8b7}","prefs":[],"schema":1552246898392,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1533780","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"asin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c739daa-ffee-48d9-a825-e53c8fd2bb3c","last_modified":1552300402314},{"guid":"/^((\\{ee2d725e-9726-43ac-8040-60ce9ff2831b\\})|(\\{55417a80-e6f7-4d77-8d73-f59045e5e890\\}))$/","prefs":[],"schema":1551728497880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1532269","why":"This add-on violates Mozilla's add-on policies by using a deceptive name.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aca80fb4-760e-4cd4-9fec-649fb38b2947","last_modified":1551794995188},{"guid":"/^((\\{5084f455-bc8f-483c-b145-91245bcbfd64\\})|(\\{bd69d5d0-4b2f-48cb-bab5-dcf1e0f9c63b\\}))$/","prefs":[],"schema":1551398716775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1531416","why":"Maliciously collecting form data and cookie modification","name":"Adblock/Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7718be46-8e84-4bc7-a5a9-4c5de18378ee","last_modified":1551399019543},{"guid":"/^((\\{6745ccb4-833d-497e-b582-d98a5e790e8c\\})|(\\{cd205ddb-b106-4d2a-a965-5d1c610b5072\\})|(\\{218ec82e-2839-42da-acaa-e527454f4237\\})|(\\{7af25a3d-1caf-49f8-8be9-8ae6065db7c5\\}))$/","prefs":[],"schema":1551397746059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530911","why":"Search hijacking, remote scripts","name":"Emoj1 clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"77a32be3-94ce-49c2-b129-fa2562a7f47b","last_modified":1551398716765},{"guid":"Youtube-video@Myaddons.com","prefs":[],"schema":1551397521494,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529887","why":"Remote script injection and data exfiltration","name":"YouTube Video and MP3 Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a30f9f2a-aa68-48b7-88cc-8a582405b385","last_modified":1551397746049},{"guid":"Youtube-downloader@Myaddons.com","prefs":[],"schema":1551396963937,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529873","why":"Remote script injection, data exfiltration","name":"YouTube MP3 Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1d596a69-157f-4743-9465-f86d6452206b","last_modified":1551397521482},{"guid":"{ba74c7ee-32b1-11e9-ade5-1f2222a4f325}","prefs":[],"schema":1551382900634,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529573","why":"Remote script injection and user data exfiltration","name":"GET Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01825fea-8c5c-4d76-bd06-e1019c188056","last_modified":1551396963926},{"guid":"/^((\\{e0686c32-99b4-44d8-972f-88bf08b68f88\\})|(\\{b2225e4c-9d1d-472b-8aeb-5ff203bcff9a\\}))$/","prefs":[],"schema":1551210091992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530932","why":"This add-on is distributed violates Mozilla's add-on policies by being distributed through a fake Firefox update page.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37252271-9e38-46a9-b23a-2b6d7048c0db","last_modified":1551250023025},{"guid":"{9d7cfde2-39ae-11e9-bde0-02427e2eba50}","prefs":[],"schema":1551104404768,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530640","why":"This add-on violates Mozilla's add-on policies by including abusive remote functionality, negatively affecting security and performance.","name":"Unnamed malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7bb234b0-cfda-4a23-bf02-9c82fb3500a3","last_modified":1551204284998},{"guid":"{4603d01d-ae80-4653-9288-d5ef98b99a17}","prefs":[],"schema":1551099702949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529924","why":"This add-on violates Mozilla add-on policies by including abusive remote code.","name":"IMmailgun (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32227de6-a7bf-454c-bf44-4478ddd96abe","last_modified":1551099805258},{"guid":"{157cd8f9-48f0-43a1-9bcf-c4316753e083}","prefs":[],"schema":1551037300209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529926","why":"This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3fe8de-6d05-4d95-a6d2-cd5695f1b0c0","last_modified":1551099426266},{"guid":"{5288d05d-253f-4675-be3b-152bf02aa3ec}","prefs":[],"schema":1550683849233,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529328","why":"Remote script injection along with deceptive code to hide the fact","name":"Unicode & Emoji Support"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9600b4cd-da02-4947-a4f5-c56c657ba197","last_modified":1550684288501},{"guid":"restore.old@youtube.com","prefs":[],"schema":1550580649249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529126","why":"This add-ons does remote script injection in a way that attempts to hide the injection. The code being executed runs on all pages which is contrary to what the add-on is described to do.","name":"Restore Old Youtube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"27917953-17fb-4ffc-bcf1-5fc2727174b4","last_modified":1550617105595},{"guid":"/^((pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-18573537)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-570932499)|(aackamlchlgmalkmcphbhhcjebbpnfdf@chrome-store-foxified-233164420)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-1808417494)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-699139867)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1808417494)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1190639722)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-2745518014)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified-1955364993)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1516694386)|(generated-rk4dtanssk56goquir78sz@chrome-store-foxified--1594555229)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-1388315457)|(oaoebpgbkehlcdggaeeohgfpopdhjell@chrome-store-foxified-1823310541)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified--1031675095)|(ancjheohbkbnkgcmfaldcaepoeeplkgh@chrome-store-foxified-1823310541)|(generated-lwcbpuj27wcknyyl6pkap7@chrome-store-foxified-1823310541)|(generated-bmtr2hbgikv399aj6aeycd@chrome-store-foxified-1823310541)|(generated-8w9odie82h2ugbsrofooj3@chrome-store-foxified-1823310541)|(\\{4170faaa-ee87-4a0e-b57a-1aec49282887\\})|(\\{b66dd4bc-7f5e-41d9-bc43-84c5736d0c87\\})|(\\{507ad1fb-08ae-43ac-a596-fd5b6e7dea9a\\})|(\\{8bf85207-66df-4eb7-b913-ac162498c687\\})|(\\{b063895a-8077-452d-b049-ebc20a39f882\\})|(\\{5776bd90-3d09-43b5-a769-8da373e9820f\\})|(\\{f6bdce44-3d5a-4f88-9a64-e39fcb4f0717\\})|(\\{1c22e687-6a02-440c-a6d5-c1ccaf520e10\\})|(\\{f7be824f-7287-466a-8590-2f48007a223b\\})|(\\{89ffc0b4-97f7-447c-bd6f-9c519b0188bd\\})|(\\{3a67084b-c231-4b4b-a924-ffa741f90921\\})|(\\{fac8b1d0-f321-491d-9234-c40d89b3660d\\})|(\\{a8053a83-8d1a-4f0e-9f88-d31cfe00cf83\\})|(\\{d10fa57e-37d3-43d3-39f8-e6d5b2a7759d\\})|(savetube_downloader@savetube\\.co)|(\\{95a8a08c-53a8-7e1d-5a80-f1a5cd4751bf\\})|(\\{5037bd74-c23b-4bbf-8865-6b5a09e07342\\})|(\\{830c558c-70f0-4b07-95f1-8e06ad34ee2c\\})|(\\{e4d93c37-1299-452f-9b60-adee15ad3802\\})|(googlemaps@search))$/","prefs":[],"schema":1550502645324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528761","why":"Malicious add-ons injecting remote scripts and exfiltrating data for monetization purposes. Some of the add-ons are masking themselves as legit add-ons and using various obfuscation tactics to hide their injections.","name":"Rogue Youtube downloaders and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f2483d7d-1895-4ae6-9901-7321e59062a6","last_modified":1550502978653},{"guid":"/^((((generated-e0yf8zkhypow3jjifkqzwo)|(iiinclagpealgnaglbmkdbfbgchjjbpg)|(jaehkpjddfdgiiefcnhahapilbejohhj))@chrome-store-foxified--?\\d+)|(jid1-9ETkKdBARv7Iww@jetpack)|(\\{813fe658-5a29-4dcc-ba6c-3941676e4f19\\}))$/","prefs":[],"schema":1550254444783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528308","why":"This add-on violates Mozilla's add-on policies by tracking user behavior and including remote code.","name":"BuyHatke Best Price Comparison, Graph, Coupons (and similar)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d6b2dbad-31e9-4984-b649-19036cd38e1d","last_modified":1550265430182},{"guid":"/^((odnenajaeicndaeiapagpglohiklndhe@chrome-store-foxified-2174031944)|(akdibckdjeocfbcjaikipkhhbggcbgkg@chrome-store-foxified-699805590)|(\\{bd9f5830-bf8c-4e38-933d-09f85b24d744\\})|(youtube-downloader@addoncrop\\.com)|(dailymotion-downloader@addoncrop\\.com)|(youtube-mp3-iframe-downloader@addoncrop\\.com)|(youtube-downloader-lite@addoncrop\\.com)|(dailymotion-downloader-lite@addoncrop\\.com)|(generated-p5qj07ef5ceqfktp5v8whw@chrome-store-foxified--505607522)|(generated-tuag2j5gwq73xzp8fbw3j8@chrome-store-foxified--505607522)|(generated-uj53d5j612ap5pz11hwgv2@chrome-store-foxified--505607522)|(\\{f51f0244-bfb0-40ce-bf9d-af49f5949e61\\})|(\\{81751484-2dc9-47bf-aec3-b8e556237178\\})|(\\{d89d1e20-57af-4164-82cc-650af45cf0a5\\})|(\\{a5e28713-14c3-4967-befe-2ec253e317cd\\})|(\\{335ac35b-6c16-4304-93f0-64a418e5bf81\\})|(\\{d3fdb429-ef84-40a4-b160-010745ee0098\\})|(\\{d66db057-7d38-4df4-a0ba-63c272be25ee\\})|(\\{ff7f7151-09e3-4e35-9052-b21e23e7e2c1\\})|(\\{1479da02-e759-4a6f-8f62-c08096583806\\})|(\\{42d59cda-c117-459e-b244-1b850c27ccc9\\})|(\\{bec48f33-7869-4158-8cbc-5cf1606f9afa\\})|(\\{08ca656c-4973-46a8-85a9-3d771399c86e\\})|(\\{dc5336c8-5624-4f74-a794-bb15f3760f34\\})|(\\{6a3d97de-1b42-4624-880a-1a68bc917142\\})|(\\{ad965166-3a34-449d-8230-a636fb5cae57\\})|(video-view@vv\\.us)|(video-view@excoe\\.com)|(xeco@rama\\.com)|(ghj@brem\\.com)|(fgtr@rembgr\\.com)|(xero@saltam\\.com)|(sora@remjem\\.com)|(repo@saram\\.com)|(tora@empoytr\\.net)|(saving@ropbart\\.com)|(japa@vbgt\\.com)|(rtya@nop\\.net)|(asan@khazan\\.com)|(xerb@tangot\\.com)|(audiotools@ramdeen\\.com)|(webat@extrolm\\.com)|(media@medplus\\.com)|(audio@audequl\\.com)|(control@medcontrols\\.com)|(sabqo@rimjim\\.com)|(repto@secroa\\.com)|(meters@videobf\\.com)|(betro@diskra\\.com)|(codeca@vxmrop\\.com)|(revoca@feronx\\.com)|(brota@vidbrghta\\.com))$/","prefs":[],"schema":1550173301925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1527603","why":"This add-on violates Mozilla's add-on policy by including malicious remote code.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94f7e0f-7088-43c9-a8da-eae102781079","last_modified":1550253583075},{"guid":"superzoom@funnerapps.com","prefs":[],"schema":1549578756953,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525405","why":"This add-on includes abusive functionality including violating the user's security and privacy.","name":"SuperZoom (Abusive)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7c4b329-7a54-48d3-9494-81783fe99d90","last_modified":1549627400713},{"guid":"/^((addon@firefox-updater\\.com)|(downloader@youtube-download\\.org)|(downloader2@youtube-download\\.org)|(downloader1@youtube-download\\.org))$/","prefs":[],"schema":1549369087422,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525153","why":"These add-ons include abusive behavior.","name":"\"FF Manual Update (Required)\" and \"Easy Youtube Video Downloader Express\" (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b72e942-af54-469c-b9f2-9e436ad2c0d1","last_modified":1549373215201},{"guid":"/^((\\{0b347362-773f-4527-a006-f96e9db437e5\\})|(\\{9edb10ad-67af-4ad0-af45-efe452479321\\})|(\\{202e2671-6153-450d-bc66-5e67cee3603f\\}))$/","prefs":[],"schema":1548963700621,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1524357","why":"This add-on includes hidden abusive functionality.","name":"Video download add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"680a99e9-c972-4a14-9b15-e56eeeed75eb","last_modified":1549037404012},{"guid":"/^((\\{a9bc520e-68ab-49c2-a8df-75a0349d54fd\\})|(\\{bfc5d009-c6bd-4526-92ce-a9d27102f7f2\\}))$/","prefs":[],"schema":1548699141208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522959","why":"Add-ons that contain abusive functionality.","name":"Unnamed (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"97c4ee31-4009-40de-ae02-f1b349c87d01","last_modified":1548699177099},{"guid":"{4e47160d-ec83-417c-ab01-cda978378d9e}","prefs":[],"schema":1548699076839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522970","why":"The add-on contains abusive functionality.","name":"mlflow (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"62c54642-73ab-4641-b5c2-47e4ae29bbc5","last_modified":1548699141199},{"guid":"/^((\\{feff5ea4-ed4a-46a3-9331-12fec01d52a9\\})|(\\{8ffc339c-0ca1-46e3-acb3-3bfd889f9a21\\})|(\\{1fe481b5-baad-44e9-b410-082cf0f2acbb\\})|(\\{92c85192-b325-4599-82e2-a110f193eae6\\})|(\\{5bc21266-26f1-469a-bc1a-a49d7b70ecb9\\})|(\\{dc2dd143-f2e7-4f46-a8ff-4dc1a985e889\\})|(\\{c1233bb6-31a9-4c7d-8469-f8f44adee9ba\\})|(\\{d0d48905-1065-43dc-ab96-434d100602ed\\})|(\\{11deae99-2675-4d5e-86cd-7bd55b88daf2\\})|(\\{a7014e8e-eacf-4ba0-9047-c897c4ed3387\\})|(\\{b9c545a5-0ffa-490a-8071-2fee09478cfe\\})|(\\{39e8eebb-4d9e-4a03-93a8-4468fdd7a186\\})|(\\{8ccc00b1-2010-4155-a07c-f4d7c4d6dec2\\})|(\\{a1056511-4919-43b7-a9e5-ac2b770de810\\})|(\\{90a6da19-9165-44c1-819c-e3b53409f9c9\\})|(\\{e3862078-8f9f-4f8e-99dc-55ba558f0619\\})|(\\{d89fcf34-2615-4efc-a267-1e83ab6a19d0\\})|(\\{588151ce-eab4-4acf-83a7-bb5ccaf4d867\\})|(\\{6ab6312d-5fd4-42a9-ab10-08b954e53f9d\\})|(\\{24a6cbde-be68-4b7d-9f1b-d4d5dfd178a3\\})|(\\{55ae1a08-105f-4f7f-9d4e-e448b517db2b\\})|(\\{74fe9d83-df17-4812-bd3f-27b84b0086b7\\})|(\\{21140e51-713a-4bf8-865b-e2ee07282409\\})|(\\{24f39610-2958-4dc8-a73b-75cc9665bffa\\})|(\\{c50a45a5-efa4-44af-8946-6f20e4748d47\\})|(\\{41d0b7e0-0d93-4f67-bed9-da6d7688ad16\\})|(\\{c2bee222-2163-4c0f-89f5-4ac502f06810\\})|(\\{4be4602e-2b20-473f-8f2b-85e8c53d17dc\\})|(\\{dec2e9b5-e787-4fb5-a7bc-5894f80f7367\\})|(\\{179526e1-1824-49f7-afb3-49fdaadaa503\\})|(\\{4f07d826-ca9e-4370-a508-b984f54758de\\})|(\\{d0558df2-714f-4793-9d85-d2d648de4f2e\\})|(\\{daf1a69b-f47b-4936-bd25-5ac21f4e27ec\\}))$/","prefs":[],"schema":1548099697813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521975","why":"Remote script injection and deceptive tactics to hide the fact","name":"ext-affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87c17ce6-aaef-4d47-a662-588efff34041","last_modified":1548198338831},{"guid":"hlper@xero.com","prefs":[],"schema":1548076840649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521533","why":"This add-on executes abusive remote code.","name":"Av Player Helper (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e2ae4c0-66cd-40bc-9cf6-5ca0ce9548f7","last_modified":1548084072622},{"guid":"/^((xtera@soravem\\.net)|(nozl@ssave\\.net))$/","prefs":[],"schema":1547926889113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521429","why":"This add-on injects abusive remote code.","name":"Video Assist (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c69997df-0b61-4de5-a351-b640123a9c3b","last_modified":1548073537411},{"guid":"/^((\\{94f608b3-76b6-4b7b-8cef-7360df22a930\\})|(\\{9648b74f-35ea-4218-acf0-ec2191f509f6\\}))$/","prefs":[],"schema":1547754101798,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1520813","why":"Add-ons that leak private user data.","name":"Instagram Register and Google Register (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a15e8d7e-0726-4190-8187-c75e2b46d429","last_modified":1547810271416},{"guid":"reopen@closedtab.com","prefs":[],"schema":1547067530457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518847","why":"This add-on contains unwanted abusive behavior unrelated to the add-ons functionality.","name":"Reopen Closed Tabs (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"451d950f-ca89-491b-87e7-45123e4f5ab4","last_modified":1547206877909},{"guid":"{43ecded1-f7cb-4bb6-a03d-4bec23b9f22d}","prefs":[],"schema":1547025691087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518580","why":"This add-on violates Mozilla's policy and user's security/privacy by loading abusive code from remote.","name":"lamme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"06c6868e-055f-4e7d-aa8f-5ba577f43e85","last_modified":1547027153061},{"guid":"youtube_downloader@addon.partners","prefs":[],"schema":1546890104853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518032","why":"This add-on contains unwanted abusive functionality.","name":"YouTube Download Tool HD (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a42c5bb-9cb4-4d96-b978-8d9f816322e6","last_modified":1547025691078},{"guid":"/^((\\{00cf6ee0-14f3-4e35-a4fd-d2160fe2f05e\\})|(\\{0da583da-e623-41f2-b2d2-0ac61b493171\\})|(\\{105c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{10a15a74-271f-4098-a662-bd827db4f8bc\\})|(\\{13e02b9b-2797-4100-8144-65b73c4145c4\\})|(\\{1eb56568-8a30-42b1-a646-ad9f485f60fe\\})|(\\{1eb8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{2f8220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{33f39a5d-137c-4757-9f9d-e86395c8bf20\\})|(\\{347ca189-9e63-43d2-8a2f-5d5141598bdc\\})|(\\{396056fc-1697-4954-b535-06de8d62fe1b\\})|(\\{3d530918-dbe8-442c-8faf-1f4ca7ca8ab9\\})|(\\{3e283c2e-cde3-4baa-8076-226ca8fb90ef\\})|(\\{591468f8-ebbd-497a-92f1-fa0a1206adb4\\})|(\\{5f6c3eb8-aa32-489a-bb01-b12b23d2001a\\})|(\\{6cbb397a-d865-42b2-8454-25a75b710dff\\})|(\\{7ae2bde0-f7ea-4bf3-a055-06953f9fcf31\\})|(\\{7b402578-ddec-4eee-9c8b-98e4e8db0059\\})|(\\{7fb00cf7-40d3-4415-a0c8-a48d3fbe847f\\})|(\\{87a8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{888220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{8b1dd8f3-224b-4975-bda2-cb2dd184d4d8\\})|(\\{8bcdc9cc-f6be-4203-ae43-a9d281f0bcdb\\})|(\\{8cda9ce6-7893-4f47-ac70-a65215cec288\\})|(\\{8dc9b946-0bb9-4264-9c76-fd9ff1e159a2\\})|(\\{942e0fec-19f2-4ebc-8a74-009da7fa625d\\})|(\\{b2a720a8-b2a7-4277-aa6b-bdeb6958f669\\})|(\\{bdcf953b-d2aa-4e7a-8176-aeb1e95a0caf\\})|(\\{cae82615-f7be-4aff-875d-33da1bc93923\\})|(\\{d2aa953b-bdcf-4f7a-8476-ddb1e9500caf\\})|(\\{da0fa57e-17d3-40d3-99f8-e9d5b2a7759d\\})|(\\{da1237ca-e35d-4653-b2b5-d98043f33781\\})|(\\{e164563a-1512-4b81-99ff-95f2644c4075\\})|(\\{e2a720a8-b3a7-1277-aa2b-bdeb2958f669\\})|(\\{e6a90490-6ef7-407d-863a-7dd120f6f7dc\\})|(\\{f15cfa53-fa9b-43cf-84e8-16ece6695922\\})|(\\{f722c845-2d8b-4a0a-b518-4f39af703e79\\})|(\\{ff1c4e62-7c11-4ea7-b734-3462417ceeb5\\})|(\\{ffa0a57e-17d2-41d3-96f8-e8d5b2a0759d\\}))$/","prefs":[],"schema":1546378806655,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1517154","why":"Executing remote code containing coin mining and other undisclosed monetization","name":"Various remote iframe add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53c5fb08-1001-471e-87ce-31185a84bcbc","last_modified":1546439268437},{"guid":"{02267dc4-36f2-4c22-8103-9e26477b48ef}","prefs":[],"schema":1545922885656,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516539","why":"Google Search hijacking and affiliate injection","name":"Markdown"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6dd73da4-cb2f-4eb8-8850-890e80c8d57b","last_modified":1545926512914},{"guid":"{d064563a-1542-4b8b-99ff-95f1644c4075}","prefs":[],"schema":1545921144932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516488","why":"Obfuscated remote script injection stealing data","name":"PDF Print and Save"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"875bc1c6-257e-438a-8624-3bfe963747b0","last_modified":1545922824252},{"guid":"/^((\\{83768008-e10c-48c0-b303-5a0f1de763a1\\})|(\\{430b0612-bfad-463b-8783-cf2e32801513\\})|(\\{519adb83-4abb-4a66-8e94-243754b8adce\\})|(\\{228a707d-55c1-465b-a759-a2129eb6602e\\}))$/","prefs":[],"schema":1545853297809,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516131","why":"Remote script injection and data exfiltration","name":"Various malicious remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c0cb1a85-c6c6-453e-b126-0e6e26ceaf88","last_modified":1545870108716},{"guid":"/^((\\{4c4ceb83-f3f1-ad73-bfe0-259a371ed872\\})|(\\{a941b5ab-8894-41e1-a2ca-c5a6e2769c5f\\})|(\\{56488007-bd74-4702-9b6d-aee8f6cc05ea\\})|(\\{9eebac07-ac86-4be7-928f-e1015f858eee\\})|(\\{5a993517-5be7-480e-a86c-b8e8109fa774\\})|(\\{309ad78e-efff-43cf-910c-76361c536b20\\})|(\\{cefcf45b-dfec-4072-9ffc-317094c69c28\\})|(\\{5b04980b-25e9-4bc6-b6ea-02c58d86cc5e\\})|(\\{0021a844-360f-480e-ac53-47391b7b17b4\\})|(\\{2bed9f51-62a8-4471-b23c-827e6727c794\\})|(\\{7d2130d3-d724-4f58-b6b7-8537a9e09d4c\\})|(\\{ccd3847a-e5ec-4d28-bf98-340230dcbd4d\\})|(\\{83716b9b-6e6e-4471-af76-2d846f5804f3\\})|(\\{5154c03a-4bfc-4b13-86a9-0581a7d8c26d\\})|(\\{24f51c5c-e3f5-4667-bd6c-0be4f6ef5cc2\\})|(\\{73554774-4390-4b00-a5b9-84e8e06d6f3c\\})|(\\{c70cfd12-6dc3-4021-97f2-68057b3b759b\\})|(\\{ef5fe17b-eb6a-4e5e-9c18-9d423525bbbd\\})|(\\{461eb9b4-953c-4412-998e-9452a7cb42e0\\})|(\\{966b00fe-40b0-4d4b-8fde-6deca31c577b\\})|(\\{dab908ac-e1b0-4d7e-bc2e-86a15f37621f\\})|(\\{01a067d3-7bfa-44ac-8da7-2474a0114a7e\\})|(\\{6126261f-d025-4254-a1db-068a48113b11\\})|(\\{6c80453f-05ec-4243-bb71-e1aac5e59cae\\})|(\\{f94ec34b-5590-4518-8546-c1c3a94a5731\\})|(\\{5d4c049e-7433-485a-ac62-dd6e41af1a73\\})|(\\{507f643d-6db8-47fe-af9c-7a7b85a86d83\\})|(\\{5c56eeb4-f97c-4b0d-a72f-8e639fbaf295\\})|(\\{2ef98f55-1e26-40d3-a113-a004618a772e\\})|(\\{77d58874-d516-4b00-b68a-2d987ef83ec5\\})|(\\{7a0755d3-3ba2-4b19-98ce-efcdc36423fc\\})|(\\{47ee3ba1-8974-4f71-b8a4-8033d8c2155f\\})|(\\{a477f774-bc36-4cc8-85bd-99f6b04ea255\\})|(\\{1a2e41e3-4343-4a00-90cd-ce77ac77a8af\\})|(\\{7b180e9a-afd6-4693-94a1-c7b5ed9b46fa\\})|(\\{51f76862-f222-414d-8724-6063f61bbabf\\})|(\\{d47a0c63-ac4c-48ce-8fc7-c5abc81d7f75\\})|(\\{b8adf653-f262-413c-b955-100213b105ad\\})|(\\{ccedf35b-dfd6-417a-80de-fb432948861d\\})|(\\{70e29b0e-7cd8-40df-b560-cf6eb066350d\\})|(\\{9926f8ad-b4c3-4122-a033-1b8a5db416db\\})|(\\{62eefb1c-a2d8-40ba-ab94-9fc2f2d31b2f\\})|(\\{17f14919-00bd-44a4-8c14-78ab9728038f\\})|(\\{20e36a3e-672c-4448-9efb-5750cbffe90c\\})|(\\{6070c95f-6460-4ffd-9846-2bbd7238697f\\})|(\\{1edb8a4e-f105-4623-9e19-e40fb082b132\\})|(\\{223a1503-772d-45eb-8cb8-e2e49563703d\\})|(\\{59e0f01c-1f70-445c-a572-7be5d85549bd\\})|(\\{8ec160b7-1089-4944-a999-a1d6afa71c5d\\})|(\\{d2d111d6-0ea1-4880-ae7b-2e82dff3a719\\})|(\\{cfacacd6-191c-46c4-b78c-8a48289b2829\\})|(\\{1155e72f-2b21-433f-ba9a-5af6ed40c8ee\\})|(\\{583910bd-759f-40f6-b96a-1d678d65650f\\}))$/","prefs":[],"schema":1545162093238,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1514865","why":"Remote script injection and data exfiltration","name":"Various add-ons using .cool domains"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53168513-103a-4ea0-a48f-bc291354cc9f","last_modified":1545232187960},{"guid":"{56a1e8d2-3ced-4919-aca5-ddd58e0f31ef}","prefs":[],"schema":1544470901949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491312","why":"The add-on introduces unwanted functionality for users.","name":"Web Guard (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dc366d6-c774-4eca-af19-4f9495c2c55e","last_modified":1544544484935},{"guid":"/^((\\{a99e680b-4349-42a5-b292-79b349bf4f3d\\})|(\\{f09a2393-1e6d-4ae4-a020-4772e94040ae\\})|(\\{c9ed9184-179f-485f-adb8-8bd8e9b7cee6\\})|(\\{085e53da-25a2-4162-906e-6c158ec977ac\\})|(\\{bd6960ba-7c06-493b-8cc4-0964a9968df5\\})|(\\{6eeec42e-a844-4bfd-a380-cfbfc988bd78\\})|(\\{3bbfb999-1c82-422e-b7a8-9e04649c7c51\\})|(\\{bfd229b6-089d-49e8-a09c-9ad652f056f6\\})|(\\{ab23eb77-1c96-4e20-b381-14dec82ee9b8\\})|(\\{ebcce9f0-6210-4cf3-a521-5c273924f5ba\\})|(\\{574aba9d-0573-4614-aec8-276fbc85741e\\})|(\\{12e75094-10b0-497b-92af-5405c053c73b\\})|(\\{99508271-f8c0-4ca9-a5f8-ee61e4bd6e86\\})|(\\{831beefc-cd8c-4bd5-a581-bba13d374973\\})|(\\{c8fe42db-b7e2-49e6-98c4-14ac369473a4\\})|(\\{f8927cca-e6cb-4faf-941d-928f84eb937f\\})|(\\{17e9f867-9402-4b19-8686-f0c2b02d378f\\})|(\\{f12ac367-199b-4cad-8e5a-0a7a1135cad0\\})|(\\{487003ce-5253-4eab-bf76-684f26365168\\})|(\\{487003ce-5213-2ecb-bf16-684f25365161\\}))$/","prefs":[],"schema":1543088493623,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1509864","why":"Add-ons that track users and load remote code, while pretending to provide cursor customization features.","name":"Various cursor and update add-ons (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8d942b3-779d-4391-a39c-58c746c13b70","last_modified":1543241996691},{"guid":"{97f19f1f-dbb0-4e50-8b46-8091318617bc}","prefs":[],"schema":1542229276053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1507191","why":"Fraudulent Adobe Reader add-on","name":"Adobe Reader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03120522-ee87-4cf8-891a-acfb248536ff","last_modified":1542272674851},{"guid":"/^((video-downloader@vd\\.io)|(image-search-reverse@an\\.br)|(YouTube\\.Downloader@2\\.8)|(eMoji@ems-al\\.io))$/","prefs":[],"schema":1542023230755,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1506560","why":"Add-ons that contain malicious copies of third-party libraries.","name":"Malware containing unwanted behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cd079abe-8e8d-476f-a550-63f75ac09fe8","last_modified":1542025588071},{"guid":"/^({b384b75c-c978-4c4d-b3cf-62a82d8f8f12})|({b471eba0-dc87-495e-bb4f-dc02c8b1dc39})|({36f623de-750c-4498-a5d3-ac720e6bfea3})$/","prefs":[],"schema":1541360505662,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1504619","why":"Add-ons that contain unwanted behavior.","name":"Google Translate (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa5eefa7-716a-45a6-870b-4697b023d894","last_modified":1541435973146},{"guid":"{80869932-37ba-4dd4-8dfe-2ef30a2067cc}","prefs":[],"schema":1538941301306,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1497161","why":"Malicious page redirection","name":"Iridium (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd5b0fa4-48fd-4bf6-943d-34de125bf502","last_modified":1538996335645},{"guid":"admin@vietbacsecurity.com","prefs":[],"schema":1537309741764,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491716","why":"Logging and sending keystrokes to a remote server.","name":"Vietnamese Input Method (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89d714f6-9f35-4107-b8af-a16777f66337","last_modified":1537309752952},{"guid":"Safe@vietbacsecurity.com","prefs":[],"schema":1537309684266,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491717","why":"Logging and sending keystrokes to a remote server.","name":"SafeKids (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c651780e-c185-4d6c-b509-d34673c158a3","last_modified":1537309741758},{"guid":"/^((\\{c9226c62-9948-4038-b247-2b95a921135b\\})|(\\{5de34d4f-b891-4575-b54b-54c53b4e6418\\})|(\\{9f7ac3be-8f1c-47c6-8ebe-655b29eb7f21\\})|(\\{bb33ccaf-e279-4253-8946-cfae19a35aa4\\}))$/","prefs":[],"schema":1537305338753,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491298","why":"These add-ons inject remote malicious scripts on Google websites.","name":"Dll and similar (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54b3e69a-40ae-4be5-b7cf-cf51c526dcfb","last_modified":1537306138745},{"guid":"updater-pro-unlisted@mozilla.com","prefs":[],"schema":1537305285414,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491306","why":"Redirects search queries.","name":"Updater Pro (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3108c151-9f25-4eca-8d80-a2fbb2d9bd07","last_modified":1537305338747},{"guid":"/^((\\{686fc9c5-c339-43db-b93a-5181a217f9a6\\})|(\\{eb4b28c8-7f2d-4327-a00c-40de4299ba44\\})|(\\{58d735b4-9d6c-4e37-b146-7b9f7e79e318\\})|(\\{ff608c10-2abc-415c-9fe8-0fdd8e988de8\\})|(\\{5a8145e2-6cbb-4509-a268-f3121429656c\\})|(\\{6d451f29-1d6b-4c34-a510-c1234488b0a3\\})|(\\{de71f09a-3342-48c5-95c1-4b0f17567554\\})|(\\{df106b04-984e-4e27-97b6-3f3150e98a9e\\})|(\\{70DE470A-4DC0-11E6-A074-0C08D310C1A8\\})|(\\{4dcde019-2a1b-499b-a5cd-322828e1279b\\})|(\\{1ec3563f-1567-49a6-bb5c-75d52334b01c\\})|(\\{c140c82e-98e6-49fd-ae17-0627e6f7c5e1\\})|(\\{2581c1f6-5ad9-48d4-8008-4c37dcea1984\\})|(\\{a2bcc6f7-14f7-4083-b4b0-c335edc68612\\})|(\\{4c726bb6-a2af-44ed-b498-794cfd8d8838\\})|(\\{fa6c39a6-cd11-477b-966d-f388f0ba4203\\})|(\\{26c7bd04-18d3-47f5-aeec-bb54e562acf2\\})|(\\{7a961c90-2071-4f94-9d9a-d4e3bbf247c0\\})|(\\{a0481ea2-03f0-4e56-a0e1-030908ecb43e\\})|(\\{c98fb54e-d25f-43f4-bd72-dfaa736391e2\\})|(\\{da57263d-adfc-4768-91f7-b3b076c20d63\\})|(\\{3abb352c-8735-4fb6-9fd6-8117aea3d705\\})|(contactus@unzipper\\.com)|(\\{a1499769-6978-4647-ac0f-78da4652716d\\})|(\\{581D0A4C-1013-11E7-938B-FCD2A0406E17\\})|(\\{68feffe4-bfd8-4fc3-8320-8178a3b7aa67\\})|(\\{823489ae-1bf8-4403-acdd-ea1bdc6431da\\})|(\\{4c0d11c3-ee81-4f73-a63c-da23d8388abd\\})|(\\{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f\\})|(\\{21f29077-6271-46fc-8a79-abaeedb2002b\\})|(\\{55d15d4d-da76-44ab-95a3-639315be5ef8\\})|(\\{edfbec6b-8432-4856-930d-feb334fb69c1\\})|(\\{f81a3bf7-d626-48cf-bd24-64e111ddc580\\})|(\\{4407ab94-60ae-4526-b1ab-2521ffd285c7\\})|(\\{4aa2ba11-f87b-4950-8250-cd977252e556\\})|(\\{646b0c4d-4c6f-429d-9b09-37101b36ed1c\\})|(\\{1b2d76f1-4906-42d2-9643-0ce928505dab\\})|(\\{1869f89d-5f15-4c0d-b993-2fa8f09694fb\\})|(\\{7e4edd36-e3a6-4ddb-9e98-22b4e9eb4721\\})|(\\{e9c9ad8c-84ba-43f2-9ae2-c1448694a2a0\\})|(\\{6b2bb4f0-78ea-47c2-a03a-f4bf8f916eda\\})|(\\{539e1692-5841-4ac6-b0cd-40db15c34738\\}))$/","prefs":[],"schema":1536183366865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488578","why":"These add-ons take away user control by redirecting search.","name":"Tightrope search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81eb67a5-3fdb-448c-aadd-5f4d3b7cf281","last_modified":1536186868443},{"guid":"/^((\\{f01a138a-c051-4bc7-a90a-21151ce05755\\})|(\\{50f78250-63ce-4191-b7c3-e0efc6309b64\\})|(\\{3d2b2ff4-126b-4874-a57e-ed7dac670230\\})|(\\{e7c1abd4-ec8e-4519-8f3a-7bd763b8a353\\})|(\\{4d40bf75-fbe2-45f6-a119-b191c2dd33b0\\})|(\\{08df7ff2-dee0-453c-b85e-f3369add18ef\\}))$/","prefs":[],"schema":1535990752587,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488248","why":"Add-ons that inject malicious remote code.","name":"Various Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67f72634-e170-4860-a5a3-133f160ebc32","last_modified":1535992146430},{"guid":"/^((\\{1cfaec8b-a1cb-4fc5-b139-897a22a71390\\})|(\\{2ed89659-09c1-4280-9dd7-1daf69272a86\\})|(\\{5c82f5cc-31f8-4316-bb7d-45a5c05227e6\\})|(\\{6a98a401-378c-4eac-b93c-da1036a00c6c\\})|(\\{6d83ebde-6396-483c-b078-57c9d445abfa\\})|(\\{07efb887-b09f-4028-8f7f-c0036d0485ea\\})|(\\{36f4882f-ff0b-4865-8674-ef02a937f7da\\})|(\\{61dea9e9-922d-4218-acdd-cfef0fdf85e7\\})|(\\{261be583-9695-48e0-bd93-a4feafaa18e6\\})|(\\{401ae092-6c5c-4771-9a87-a6827be80224\\})|(\\{534b7a84-9fc6-4d7c-9d67-e3365d2ae088\\})|(\\{552a949f-6d0e-402d-903d-1550075541ba\\})|(\\{579b8de8-c461-4301-ab09-695579f9b7c7\\})|(\\{754d3be3-7337-488e-a5bb-86487e495495\\})|(\\{2775f69b-75e4-46cb-a5aa-f819624bd9a6\\})|(\\{41290ec4-b3f0-45ad-b8f3-7bcbca01ed0d\\})|(\\{0159131f-d76f-4365-81cd-d6831549b90a\\})|(\\{01527332-1170-4f20-a65b-376e25438f3d\\})|(\\{760e6ff0-798d-4291-9d5f-12f48ef7658b\\})|(\\{7e31c21c-156a-4783-b1ce-df0274a89c75\\})|(\\{8e247308-a68a-4280-b0e2-a14c2f15180a\\})|(\\{b6d36fe8-eca1-4d85-859e-a4cc74debfed\\})|(\\{bab0e844-2979-407f-9264-c87ebe279e72\\})|(\\{d00f78fe-ee73-4589-b120-5723b9a64aa0\\})|(\\{d59a7294-6c08-4ad5-ba6d-a3bc41851de5\\})|(\\{d145aa5b-6e66-40cb-8a08-d55a53fc7058\\})|(\\{d79962e3-4511-4c44-8a40-aed6d32a53b1\\})|(\\{e3e2a47e-7295-426f-8517-e72c31da3f23\\})|(\\{e6348f01-841d-419f-8298-93d6adb0b022\\})|(\\{eb6f8a22-d96e-4727-9167-be68c7d0a7e9\\})|(\\{fdd72dfe-e10b-468b-8508-4de34f4e95e3\\}))$/","prefs":[],"schema":1535830899087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487472","why":"Several add-ons that change forcefully override search settings.","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43f11241-88e3-4139-9f02-ac39489a241f","last_modified":1535990735167},{"guid":"/^((\\{35253b0b-8109-437f-b8fa-d7e690d3bde1\\})|(\\{0c8d774c-0447-11e7-a3b1-1b43e3911f03\\})|(\\{c11f85de-0bf8-11e7-9dcd-83433cae2e8e\\})|(\\{f9f072c8-5357-11e7-bb4c-c37ea2335fb4\\})|(\\{b6d09408-a35e-11e7-bc48-f3e9438e081e\\}))$/","prefs":[],"schema":1535658090284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486754","why":"Add-ons that execute remote malicious code.","name":"Several malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56bd2f99-57eb-4904-840a-23ca155d93ad","last_modified":1535701073599},{"guid":"/^((fireAnalytics\\.download@mozilla\\.com)|(fireabsorb@mozilla\\.com)|(fireaccent@mozilla\\.com)|(fireaccept@mozilla\\.com)|(fireads@mozilla\\.com)|(firealerts@mozilla\\.com)|(fireapi@mozilla\\.com)|(fireapp@mozilla\\.com)|(fireattribution@mozilla\\.com)|(fireauthenticator@mozilla\\.com)|(firecalendar@mozilla\\.com)|(firemail@mozilla\\.com)|(firemarketplace@mozilla\\.com)|(firequestions@mozilla\\.com)|(firescript@mozilla\\.com)|(firesheets@mozilla\\.com)|(firespam@mozilla\\.com)|(firesuite@mozilla\\.com)|(\\{3b6dfc8f-e8ed-4b4c-b616-bdc8c526ac1d\\})|(\\{834f87db-0ff7-4518-89a0-0167a963a869\\})|(\\{4921fe4d-fbe6-4806-8eed-346d7aff7c75\\})|(\\{07809949-bd7d-40a6-a17b-19807448f77d\\})|(\\{68968617-cc8b-4c25-9c38-34646cdbe43e\\})|(\\{b8b2c0e1-f85d-4acd-aeb1-b6308a473874\\})|(\\{bc0b3499-f772-468e-9de6-b4aaf65d2bbb\\}))$/","prefs":[],"schema":1535555549913,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486636","why":"Add-ons that hijack search settings.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fcd12629-43df-4751-9654-7cc008f8f7c0","last_modified":1535555562143},{"guid":"/^((\\{25211004-63e4-4a94-9c71-bdfeabb72bfe\\})|(\\{cbf23b92-ea55-4ca9-a5ae-f4197e286bc8\\})|(\\{7ac0550e-19cb-4d22-be12-b0b352144b33\\})|(Mada111@mozilla\\.com)|(\\{c71709a9-af59-4958-a587-646c8c314c16\\})|(\\{6ac3f3b4-18db-4f69-a210-7babefd94b1e\\})|(addon@fastsearch\\.me)|(\\{53d152fa-0ae0-47f1-97bf-c97ca3051562\\})|(\\{f9071611-24ee-472b-b106-f5e2f40bbe54\\})|(\\{972920f1-3bfd-4e99-b605-8688a94c3c85\\})|(\\{985afe98-fa74-4932-8026-4bdc880552ac\\})|(\\{d96a82f5-5d3e-46ed-945f-7c62c20b7644\\})|(\\{3a036dc5-c13b-499a-a62d-e18aab59d485\\})|(\\{49574957-56c6-4477-87f1-1ac7fa1b2299\\})|(\\{097006e8-9a95-4f7c-9c2f-59f20c61771c\\})|(\\{8619885d-0380-467a-b3fe-92a115299c32\\})|(\\{aa0587d6-4760-4abe-b3a1-2a5958f46775\\})|(\\{bdada7ae-cf89-46cf-b1fe-f3681f596278\\})|(\\{649bead3-df51-4023-8090-02ceb2f7095a\\})|(\\{097c3142-0b68-416a-9919-9dd576aedc17\\})|(\\{bc3cced8-51f0-4519-89ee-56706b67ea4b\\})|(\\{796da6e3-01c0-4c63-96dd-1737710b2ff6\\}))$/","prefs":[],"schema":1535485297866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487083","why":"Add-ons that hijack search settings and contain other unwanted features.","name":"Vairous malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"016676cc-c381-4c01-adcf-2d46f48142d0","last_modified":1535550828514},{"guid":"/^((Timemetric@tmetric)|(image-fastpicker@eight04.blogspot\\.com)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({0ff32ce0-dee9-4e7e-9260-65e58373e21d})|({4ca00873-7e8d-4ada-b460-96cad0eb8fa9})|({6b427f73-2ee1-4256-b69d-7dc253ebe030})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({40a9d23b-09ef-4c82-ae1d-7fc5c067e987})|({205c2185-ebe4-4106-92ab-0ffa7c4efcbb})|({256ec7b0-57b4-416d-91c1-2bfdf01b2438})|({568db771-c718-4587-bcd0-e3728ee53550})|({5782a0f1-de26-42e5-a5b3-dae9ec05221b})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({3e6586e2-7410-4f10-bba0-914abfc3a0b4})|({b3f06312-93c7-4a4f-a78b-f5defc185d8f})|({c1aee371-4401-4bab-937a-ceb15c2323c1})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({d0aa0ad2-15ed-4415-8ef5-723f303c2a67})|({d8157e0c-bf39-42eb-a0c3-051ff9724a8c})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1535356061028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485145","why":"Add-ons that run remote malicious code from websites that trick the user into installing the add-on.","name":"Malware running remote malicious code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0d44ee3-9492-47d7-ac1c-35f520e819ae","last_modified":1535393877555},{"guid":"/^((fastplayer@fastsearch\\.me)|(ff-search-flash-unlisted@mozilla\\.com)|(inspiratiooo-unlisted@mozilla\\.com)|(lite-search-ff-unlisted@mozilla\\.com)|(mysearchprotect-unlisted@mozilla\\.com)|(pdfconverter-unlisted@mozilla\\.com)|(plugin-search-ff-unlisted@mozilla\\.com)|(pro-search-ff-unlisted@mozilla\\.com)|(pro-search-unlisted@mozilla\\.com)|(searchincognito-unlisted@mozilla\\.com)|(socopoco-search@mozilla\\.com)|(socopoco-unlisted@mozilla\\.com)|(\\{08ea1e08-e237-42e7-ad60-811398c21d58\\})|(\\{0a56e2a0-a374-48b6-9afc-976680fab110\\})|(\\{193b040d-2a00-4406-b9ae-e0d345b53201\\})|(\\{1ffa2e79-7cd4-4fbf-8034-20bcb3463d20\\})|(\\{528cbbe2-3cde-4331-9344-e348cb310783\\})|(\\{6f7c2a42-515a-4797-b615-eaa9d78e8c80\\})|(\\{be2a3fba-7ea2-48b9-bbae-dffa7ae45ef8\\})|(\\{c0231a6b-c8c8-4453-abc9-c4a999a863bd\\}))$/","prefs":[],"schema":1535139689975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483854","why":"Add-ons overwriting search changes without consent and remote script injection","name":"\"Flash Updater\" and search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46779b5a-2369-4007-bff0-857a657626ba","last_modified":1535153064735},{"guid":"/^(({aeac6f90-5e17-46fe-8e81-9007264b907d})|({6ee25421-1bd5-4f0c-9924-79eb29a8889d})|({b317fa11-c23d-45b9-9fd8-9df41a094525})|({16ac3e8f-507a-4e04-966b-0247a196c0b4}))$/","prefs":[],"schema":1534946831027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485609","why":"Add-ons that take away user control by changing search settings.","name":"Search hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab029019-0e93-450a-8c11-ac31556c2a77","last_modified":1535020847820},{"guid":"@testpilot-addon","prefs":[],"schema":1534876689555,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485083","why":"Older versions of the TestPilot add-on cause stability issues in Firefox.","name":"Testpilot (old, broken versions)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.8-dev-259fe19","minVersion":"0"}],"id":"ee2d12a4-ea1d-4f3d-9df1-4303e8993f18","last_modified":1534946810180},{"guid":"/^((@svuznnqyxinw)|(myprivacytools@besttools\\.com)|(powertools@penprivacy\\.com)|(privacypro@mybestprivacy\\.com)|(realsecure@top10\\.com)|(rlbvpdfrlbgx@scoutee\\.net)|(vfjkurlfijwz@scoutee\\.net))$/","prefs":[],"schema":1534382102271,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1482322","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"df852b6a-28be-4b10-9285-869f4761f111","last_modified":1534382538298},{"guid":"/^(({1a3fb414-0945-405c-a62a-9fe5e1a50c69})|({1a45f6aa-d80a-4317-84d2-0ce43671b08a})|({2d52a462-8bec-4708-9cd1-894b682bdc78})|({3f841cfc-de5a-421f-8bd7-2bf1d943b02a})|({5c7601bf-522b-47e5-b0f0-ea0e706af443})|({7ebe580f-71c9-4ef8-8073-f38deaeb9dfb})|({8b2188fd-1daf-4851-b387-28d964014353})|({8cee42ac-f1fe-40ae-aed6-24e3b76b2f77})|({8d13c4a9-5e8c-47a6-b583-681c83164ac9})|({9b1d775a-1877-45c9-ad48-d6fcfa4fff39})|({9efdbe5f-6e51-4a35-a41b-71dc939e6221})|({23f63efb-156e-440b-a96c-118bebc21057})|({026dfc8c-ecc8-41ba-b45f-70ffbd5cc672})|({34aa433c-27e9-4c87-a662-9f82f99eb9af})|({36f34d69-f22f-47c3-b4cd-4f37b7676107})|({39bd8607-0af4-4d6b-bd69-9a63c1825d3c})|({48c6ad6d-297c-4074-8fef-ca5f07683859})|({54aa688d-9504-481d-ba75-cfee421b98e0})|({59f59748-e6a8-4b41-87b5-9baadd75ddef})|({61d99407-1231-4edc-acc8-ab96cbbcf151})|({68ca8e3a-397a-4135-a3af-b6e4068a1eae})|({71beafd6-779b-4b7d-a78b-18a107277b59})|({83ed90f8-b07e-4c45-ba6b-ba2fe12cebb6})|({231dfb44-98e0-4bc4-b6ee-1dac4a836b08})|({273f0bce-33f4-45f6-ae03-df67df3864c2})|({392f4252-c731-4715-9f8d-d5815f766abb})|({484ec5d0-4cfd-4d96-88d0-a349bfc33780})|({569dbf47-cc10-41c4-8fd5-5f6cf4a833c7})|({578cad7a-57d5-404d-8dda-4d30de33b0c2})|({986b2c3f-e335-4b39-b3ad-46caf809d3aa})|({1091c11f-5983-410e-a715-0968754cff54})|({2330eb8a-e3fe-4b2e-9f17-9ddbfb96e6f5})|({5920b042-0af1-4658-97c1-602315d3b93d})|({6331a47f-8aae-490c-a9ad-eae786b4349f})|({6698b988-c3ef-4e1f-8740-08d52719eab5})|({30516f71-88d4-489b-a27f-d00a63ad459f})|({12089699-5570-4bf6-890f-07e7f674aa6e})|({84887738-92bf-4903-a5e8-695fd078c657})|({8562e48e-3723-412a-9ebd-b33d3d3b29dd})|({6e449795-c545-41be-92c0-5d467c147389})|({1e369c7c-6b61-436e-8978-4640687670d6})|({a03d427a-bd2e-42b6-828f-a57f38fac7b5})|({a77fc9b9-6ebb-418d-b0b6-86311c191158})|({a368025b-9828-43a1-8a5c-f6fab61c9be9})|({b1908b02-410d-4778-8856-7e259fbf471d})|({b9425ace-c2e9-4ec4-b564-4062546f4eca})|({b9845b5d-70c9-419c-a9a5-98ea8ee5cc01})|({ba99fee7-9806-4e32-8257-a33ffc3b8539})|({bdf8767d-ae4c-4d45-8f95-0ba29b910600})|({c6c4a718-cf91-4648-aa9b-170d66163cf2})|({ca0f2988-e1a8-4e83-afde-0dca56a17d5f})|({cac5db09-979b-40e3-8c8e-d96397b0eecb})|({d3b5280b-f8d8-4669-bdf6-91f23ae58042})|({d73d2f6a-ea24-4b1b-8c76-563fce9f786d})|({d77fed37-85c0-4b94-89bb-0d2849472b8d})|({d371abec-84bb-481b-acbf-235639451127})|({de47a3b4-dad1-4f4a-bdd6-8666586e29e8})|({ded6afad-2aaa-446b-b6bd-b12a8a61c945})|({e0c3a1ca-8e21-4d1b-b53b-ea115cf59172})|({e6bbf496-6489-4b48-8e5a-799aad4aa742})|({e63b262a-f9b8-4496-9c4b-9d3cbd6aea90})|({e73c1b5d-20f7-4d86-ad16-9de3c27718e2})|({eb01dc49-688f-4a21-aa8d-49bd88a8f319})|({edc9816b-60b4-493c-a090-01125e0b8018})|({effa2f97-0f07-44c8-99cb-32ac760a0621})|({f6e6fd9b-b89f-4e8d-9257-01405bc139a6})|({ff87977a-fefb-4a9d-b703-4b73dce8853d})|({ffea9e62-e516-4238-88a7-d6f9346f4955}))$/","prefs":[],"schema":1534335096640,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483191","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d9892a76-b22e-40bd-8073-89b0f8110ec7","last_modified":1534336165428},{"guid":"/^((Timemetric@tmetric)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({568db771-c718-4587-bcd0-e3728ee53550})|({829827cd-03be-4fed-af96-dd5997806fb4})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1534275699570,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483206","why":"Add-ons that execute malicious remote code","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2734325e-143b-4962-98bf-4b18c77407e2","last_modified":1534334500118},{"guid":"{5834f62d-6164-4cdd-a0a3-c00c66ec9d13}","prefs":[],"schema":1532704368947,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479002","why":"This add-on violates our security and user-choice/no surprises policies.","name":"Youtube Dark Mode (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d0a401cb-0c70-4784-8288-b06a88b2ae8a","last_modified":1532705151926},{"guid":"/^((@asdfjhsdfuhw)|(@asdfsdfwe)|(@asdieieuss)|(@dghfghfgh)|(@difherk)|(@dsfgtftgjhrdf4)|(@fidfueir)|(@fsgergsdqtyy)|(@hjconsnfes)|(@isdifvdkf)|(@iweruewir)|(@oiboijdjfj)|(@safesearchavs)|(@safesearchavsext)|(@safesearchincognito)|(@safesearchscoutee)|(@sdfykhhhfg)|(@sdiosuff)|(@sdklsajd)|(@sduixcjksd)|(@sicognitores)|(@simtabtest)|(@sodiasudi)|(@test13)|(@test131)|(@test131ver)|(@test132)|(@test13s)|(@testmptys)|(\\{ac4e5b0c-13c4-4bfd-a0c3-1e73c81e8bac\\})|(\\{e78785c3-ec49-44d2-8aac-9ec7293f4a8f\\})|(general@filecheckerapp\\.com)|(general@safesearch\\.net))$/","prefs":[],"schema":1532703832328,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1475330","why":"These Add-ons violate our data collection, no surprises and user-choice policies.","name":"Safesearch (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d664412d-ed08-4892-b247-b007a70856ff","last_modified":1532704364007},{"guid":"{dd3d7613-0246-469d-bc65-2a3cc1668adc}","prefs":[],"schema":1532684052432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"BlockSite"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.3","minVersion":"0"}],"id":"e04f98b5-4480-43a3-881d-e509e4e28cdc","last_modified":1532684085999},{"guid":"{bee8b1f2-823a-424c-959c-f8f76c8b2306}","prefs":[],"schema":1532547689407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"Popup blocker for FireFox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.7.3","minVersion":"0"}],"id":"f0713a5e-7208-484e-b3a0-4e6dc6a195be","last_modified":1532684052426},{"guid":"/^((\\{39bd8607-0af4-4d6b-bd69-9a63c1825d3c\\})|(\\{273f0bce-33f4-45f6-ae03-df67df3864c2\\})|(\\{a77fc9b9-6ebb-418d-b0b6-86311c191158\\})|(\\{c6c4a718-cf91-4648-aa9b-170d66163cf2\\})|(\\{d371abec-84bb-481b-acbf-235639451127\\})|(\\{e63b262a-f9b8-4496-9c4b-9d3cbd6aea90\\}))$/","prefs":[],"schema":1532386339902,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1477950","why":"Add-ons that contain malicious functionality like search engine redirect.","name":"Smash (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c37c7c24-e738-4d06-888c-108b4d63b428","last_modified":1532424286908},{"guid":"/^((\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{1cab8ccf-deff-4743-925d-a47cbd0a6b56\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{071b9878-a7d3-4ae3-8ef0-2eaee1923403\\})|(\\{261476ea-bd0e-477c-abd7-33cdf626f81f\\})|(\\{224e66d0-6b11-4c4b-9bcf-41180889898a\\})|(\\{1e90cf52-c67c-4bd9-80c3-a2bf521fc981\\})|(\\{09c4799c-00f1-439e-9e60-3827c589b372\\})|(\\{d3d2095a-9faa-466f-82ae-3114179b34d6\\})|(\\{70389ea5-7e4d-4515-835c-fbd047f229dd\\})|(\\{2e8083a5-cd88-4aaa-bb8b-e54e9753f280\\})|(\\{fbf2480b-5c19-478e-bfd0-192ad9f84dc9\\})|(\\{6c7dc694-89f8-477e-88d5-c55af4d6a846\\})|(\\{915c12c6-901a-490d-9bfc-20f00d1ad31d\\})|(\\{d3a4aa3e-f74c-4382-876d-825f592f2976\\})|(\\{0ad91ec1-f7c4-4a39-9244-3310e9fdd169\\})|(\\{9c17aa27-63c5-470a-a678-dc899ab67ed3\\})|(\\{c65efef2-9988-48db-9e0a-9ff8164182b6\\})|(\\{d54c5d25-2d51-446d-8d14-18d859e3e89a\\})|(\\{e458f1f1-a331-4486-b157-81cba19f0993\\})|(\\{d2de7e1f-6e51-41d6-ba8a-937f8a5c92ff\\})|(\\{2b08a649-9bea-4dd4-91c8-f53a84d38e19\\})|(\\{312dd57e-a590-4e19-9b26-90e308cfb103\\})|(\\{82ce595a-f9b6-4db8-9c97-b1f1c933418b\\})|(\\{0a2e64f0-ea5a-4fff-902d-530732308d8e\\})|(\\{5fbdc975-17ab-4b4e-90d7-9a64fd832a08\\})|(\\{28820707-54d8-41f0-93e9-a36ffb2a1da6\\})|(\\{64a2aed1-5dcf-4f2b-aad6-9717d23779ec\\})|(\\{ee54794f-cd16-4f7d-a7dd-515a36086f60\\})|(\\{4d381160-b2d5-4718-9a05-fc54d4b307e7\\})|(\\{60393e0e-f039-4b80-bad4-10189053c2ab\\})|(\\{0997b7b2-52d7-4d14-9aa6-d820b2e26310\\})|(\\{8214cbd6-d008-4d16-9381-3ef1e1415665\\})|(\\{6dec3d8d-0527-49a3-8f12-b05f2a8b95b2\\})|(\\{0c0d8d8f-3ae0-4c98-81ac-06453a316d16\\})|(\\{84d5ef02-a283-484a-80da-7087836c74aa\\})|(\\{24413756-2c44-47c5-8bbf-160cb37776d8\\})|(\\{cf6ac458-06e8-45d0-9cbf-ec7fc0eb1710\\})|(\\{263a5792-933a-4de1-820a-d04198e17120\\})|(\\{b5fd7f37-190d-4c0a-b8dd-8b4850c986ac\\})|(\\{cb5ef07b-c2e7-47a6-be81-2ceff8df4dd5\\})|(\\{311b20bc-b498-493c-a5e1-22ec32b0e83c\\})|(\\{b308aead-8bc1-4f37-9324-834b49903df7\\})|(\\{3a26e767-b781-4e21-aaf8-ac813d9edc9f\\}))$/","prefs":[],"schema":1532361925873,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476553","why":"Third-party websites try to trick users into installing add-ons that inject remote scripts.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52842139-3d11-41ac-9d7f-8e51122a3141","last_modified":1532372344457},{"guid":"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}","prefs":[],"schema":1530711142817,"blockID":"i1900","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1472948","why":"This add-on violates data practices outlined in the review policy.","name":"Stylish"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.1","minVersion":"3.0.0"}],"id":"c635229f-7aa0-44c5-914f-80c590949071","last_modified":1530716488758},{"guid":"/^(contactus@unzipper.com|{72dcff4e-48ce-41d8-a807-823adadbe0c9}|{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f}|{994db3d3-ccfe-449a-81e4-f95e2da76843}|{25aef460-43d5-4bd0-aa3d-0a46a41400e6}|{178e750c-ae27-4868-a229-04951dac57f7})$/","prefs":[],"schema":1528400492025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1460331","why":"Add-ons change search settings against our policies, affecting core Firefox features. Add-on is also reportedly installed without user consent.","name":"SearchWeb"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5afea853-d029-43f3-a387-64ce9980742a","last_modified":1528408770328},{"guid":"{38363d75-6591-4e8b-bf01-0270623d1b6c}","prefs":[],"schema":1526326889114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461625","why":"This add-on contains abusive functionality.","name":"Photobucket Hotlink Fix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f0764d5-a290-428b-a5b2-3767e1d72c71","last_modified":1526381862851},{"guid":"@vkmad","prefs":[],"schema":1526154098016,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461410","why":"This add-on includes malicious functionality.","name":"VK Universal Downloader (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbfa5303-c1bf-49c8-87d8-259738a20064","last_modified":1526322954850},{"guid":"/((@extcorp\\.[a-z]+)|(@brcorporation\\.com)|(@brmodcorp\\.com)|(@teset\\.com)|(@modext\\.tech)|(@ext?mod\\.net)|(@browcorporation\\.org)|(@omegacorporation\\.org)|(@browmodule\\.com)|(@corpext\\.net)|({6b50ddac-f5e0-4d9e-945b-e4165bfea5d6})|({fab6484f-b8a7-4ba9-a041-0f948518b80c})|({b797035a-7f29-4ff5-bd19-77f1b5e464b1})|({0f612416-5c5a-4ec8-b482-eb546af9cac4}))$/","prefs":[],"schema":1525290095999,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ab9f100-e253-4080-b3e5-652f842ddb7a","last_modified":1525377099954},{"guid":"/^({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({dfa77d38-f67b-4c41-80d5-96470d804d09})$/","prefs":[],"schema":1524146566650,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1455291","why":"These add-ons claim to be the flash plugin.","name":"Flash Plugin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96b137e6-8cb5-44d6-9a34-4a4a76fb5e38","last_modified":1524147337556},{"guid":"/^({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|(@googledashboard)|(@smashdashboard)|(@smash_tv)|(@smash_mov)|(@smashmovs)|(@smashtvs)|(@FirefoxUpdate)|({92b9e511-ac81-4d47-9b8f-f92dc872447e})|({3c841114-da8c-44ea-8303-78264edfe60b})|({116a0754-20eb-4fe5-bd35-575867a0b89e})|({6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b})|({f992ac88-79d3-4960-870e-92c342ed3491})|({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|({a512297e-4d3a-468c-bd1a-f77bd093f925})|({08c28c16-9fb6-4b32-9868-db37c1668f94})|({b4ab1a1d-e137-4c59-94d5-4f509358a81d})|({feedf4f8-08c1-451f-a717-f08233a64ec9})$/","prefs":[],"schema":1524139371832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454691","why":"This malware prevents itself from getting uninstalled ","name":"Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"feb2d0d7-1b76-4dba-bf84-42873a92af5f","last_modified":1524141477640},{"guid":"{872f20ea-196e-4d11-8835-1cc4c877b1b8}","prefs":[],"schema":1523734896380,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454413","why":"Extension claims to be Flash Player","name":"Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e5f5cb2-346c-422a-9aaa-29d8760949d2","last_modified":1523897202689},{"guid":"adbeaver@adbeaver.org","prefs":[],"schema":1521630548030,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1445031","why":"This add-on generates numerous errors when loading Facebook, caused by ad injection included in it. Users who want to continue using this add-on can enable it in the Add-ons Manager.","name":"AdBeaver"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"baf7f735-d6b6-410a-8cc8-25c60f7c57e2","last_modified":1522103097333},{"guid":"{44685ba6-68b3-4895-879e-4efa29dfb578}","prefs":[],"schema":1521565140013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1447042","why":"This add-on impersonates a Flash tool and runs remote code on users' systems.","name":"FF Flash Manager"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"547037f2-97ae-435a-863c-efd7532668cd","last_modified":1521630548023},{"guid":"/^(addon@fasterweb\\.com|\\{5f398d3f-25db-47f5-b422-aa2364ff6c0b\\}|addon@fasterp\\.com|addon@calculator)$/","prefs":[],"schema":1520338910918,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443478","why":"These are malicious add-ons that use deceptive names and run remote scripts.","name":"FasterWeb add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f58729ec-f93c-41d9-870d-dd9c9fd811b6","last_modified":1520358450708},{"guid":"{42baa93e-0cff-4289-b79e-6ae88df668c4}","prefs":[],"schema":1520336325565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443196","why":"The add-on claims to be \"Adobe Shockwave Flash Player\"","name":"Adobe Shockwave Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0cd723fe-d33d-43a0-b84f-7a3cad253212","last_modified":1520338780397},{"guid":"{f3c31b34-862c-4bc8-a98f-910cc6314a86}","prefs":[],"schema":1519242096699,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1440736","why":"This is a malicious add-on that is masked as an official Adobe Updater and runs malicious code.","name":"Adobe Updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"adfd98ef-cebc-406b-b1e0-61bd4c71e4b1","last_modified":1519409417397},{"guid":"/^(\\{fd0c36fa-6a29-4246-810b-0bb4800019cb\\}|\\{b9c1e5bf-6585-4766-93fc-26313ac59999\\}|\\{3de25fff-25e8-40e9-9ad9-fdb3b38bb2f4\\})$/","prefs":[],"schema":1519069296530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439432","why":"These are malicious add-ons that are masked as an official Adobe Updater and run malicious code.","name":"Adobe Updater"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e28ba5c-af62-4e53-a7a1-d33334571cf8","last_modified":1519078890592},{"guid":"/^(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\}|{5e024309-042c-4b9d-a634-5d92cf9c7514\\}|{f4262989-6de0-4604-918f-663b85fad605\\}|{e341ed12-a703-47fe-b8dd-5948c38070e4\\}|{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\}|{ac296b47-7c03-486f-a1d6-c48b24419749\\}|{5da81d3d-5db1-432a-affc-4a2fe9a70749\\}|{df09f268-3c92-49db-8c31-6a25a6643896\\}|{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\}|{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\}|{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\}|{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\}|{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})$/","prefs":[],"schema":1518550894975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1438028","why":"These are malicious add-ons that inject remote scripts into popular websites.","name":"Page Marker add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc5848e8-23d5-4655-b45c-dc239839b74e","last_modified":1518640450735},{"guid":"/^(https|youtube)@vietbacsecurity\\.com$/","prefs":[],"schema":1517909997354,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1435974","why":"These add-ons contain malicious functionality, violating the users privacy and security.","name":"HTTPS and Youtube downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"646e2384-f894-41bf-b7fc-8879e0095109","last_modified":1517910100624},{"guid":"{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de}","prefs":[],"schema":1517514097126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434893","why":"This is a malicious add-on that injects remote scripts into popular pages while pretending to do something else.","name":"Image previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2104a522-bb2f-4b04-ad0d-b0c571644552","last_modified":1517577111194},{"guid":"/^({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({3908d078-e1db-40bf-9567-5845aa77b833})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})$/","prefs":[],"schema":1517260691761,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.\n","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70f37cc7-9f8a-4d0f-a881-f0c56934fa75","last_modified":1517260722621},{"guid":"/^({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({1e68848a-2bb7-425c-81a2-524ab93763eb})$/","prefs":[],"schema":1517168490224,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"805ee80e-0929-4c92-93ed-062b98053f28","last_modified":1517260691755},{"guid":"/^({abec23c3-478f-4a5b-8a38-68ccd500ec42}|{a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4}|{62237447-e365-487e-8fc3-64ddf37bdaed}|{b12cfdc7-3c69-43cb-a3fb-38981b68a087}|{1a927d5b-42e7-4407-828a-fdc441d0daae}|{dd1cb0ec-be2a-432b-9c90-d64c824ac371}|{82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a}|{87c552f9-7dbb-421b-8deb-571d4a2d7a21})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c92f2a05-73eb-454e-9583-f6d2382d8bca","last_modified":1516829074251},{"guid":"/^({618baeb9-e694-4c7b-9328-69f35b6a8839}|{b91fcda4-88b0-4a10-9015-9365e5340563}|{04150f98-2d7c-4ae2-8979-f5baa198a577}|{4b1050c6-9139-4126-9331-30a836e75db9}|{1e6f5a54-2c4f-4597-aa9e-3e278c617d38}|{e73854da-9503-423b-ab27-fafea2fbf443}|{a2427e23-d349-4b25-b5b8-46960b218079}|{f92c1155-97b3-40f4-9d5b-7efa897524bb}|{c8e14311-4b2d-4eb0-9a6b-062c6912f50e}|{45621564-b408-4c29-8515-4cf1f26e4bc3}|{27380afd-f42a-4c25-b57d-b9012e0d5d48})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2d4fe65b-6c02-4461-baa8-dda52e688cf6","last_modified":1516829040469},{"guid":"/^({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab}|{cc689da4-203f-4a0c-a7a6-a00a5abe74c5}|{0eb4672d-58a6-4230-b74c-50ca3716c4b0}|{06a71249-ef35-4f61-b2c8-85c3c6ee5617}|{5280684d-f769-43c9-8eaa-fb04f7de9199}|{c2341a34-a3a0-4234-90cf-74df1db0aa49}|{85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33}|{b5a35d05-fa28-41b5-ae22-db1665f93f6b}|{1bd8ba17-b3ed-412e-88db-35bc4d8771d7}|{a18087bb-4980-4349-898c-ca1b7a0e59cd}|{488e190b-d1f6-4de8-bffb-0c90cc805b62})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a3fd797-0ab8-4286-9a1b-2b6c97f9075b","last_modified":1516829006347},{"guid":"/^({f6df4ef7-14bd-43b5-90c9-7bd02943789c}|{ccb7b5d6-a567-40a2-9686-a097a8b583dd}|{9b8df895-fcdd-452a-8c46-da5be345b5bc}|{5cf77367-b141-4ba4-ac2a-5b2ca3728e81}|{ada56fe6-f6df-4517-9ed0-b301686a34cc}|{95c7ae97-c87e-4827-a2b7-7b9934d7d642}|{e7b978ae-ffc2-4998-a99d-0f4e2f24da82}|{115a8321-4414-4f4c-aee6-9f812121b446}|{bf153de7-cdf2-4554-af46-29dabfb2aa2d}|{179710ba-0561-4551-8e8d-1809422cb09f}|{9d592fd5-e655-461a-9b28-9eba85d4c97f})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae78cd5-6b26-472e-ab2d-db4105911250","last_modified":1516828973824},{"guid":"/^({30972e0a-f613-4c46-8c87-2e59878e7180}|{0599211f-6314-4bf9-854b-84cb18da97f8}|{4414af84-1e1f-449b-ac85-b79f812eb69b}|{2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8}|{bea8866f-01f8-49e9-92cd-61e96c05d288}|{046258c9-75c5-429d-8d5b-386cfbadc39d}|{c5d359ff-ae01-4f67-a4f7-bf234b5afd6e}|{fdc0601f-1fbb-40a5-84e1-8bbe96b22502}|{85349ea6-2b5d-496a-9379-d4be82c2c13d}|{640c40e5-a881-4d16-a4d0-6aa788399dd2}|{d42328e1-9749-46ba-b35c-cce85ddd4ace})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"750aa293-3742-46b5-8761-51536afecaef","last_modified":1516828938683},{"guid":"/^({d03b6b0f-4d44-4666-a6d6-f16ad9483593}|{767d394a-aa77-40c9-9365-c1916b4a2f84}|{a0ce2605-b5fc-4265-aa65-863354e85058}|{b7f366fa-6c66-46bf-8df2-797c5e52859f}|{4ad16913-e5cb-4292-974c-d557ef5ec5bb}|{3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c}|{543f7503-3620-4f41-8f9e-c258fdff07e9}|{98363f8b-d070-47b6-acc6-65b80acac4f3}|{5af74f5a-652b-4b83-a2a9-f3d21c3c0010}|{484e0ba4-a20b-4404-bb1b-b93473782ae0}|{b99847d6-c932-4b52-9650-af83c9dae649})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a29aed6f-6546-4fa2-8131-df5c9a5427af","last_modified":1516828911059},{"guid":"/^({2bb68b03-b528-4133-9fc4-4980fbb4e449}|{231e58ac-0f3c-460b-bb08-0e589360bec7}|{a506c5af-0f95-4107-86f8-3de05e2794c9}|{8886a262-1c25-490b-b797-2e750dd9f36b}|{65072bef-041f-492e-8a51-acca2aaeac70}|{6fa41039-572b-44a4-acd4-01fdaebf608d}|{87ba49bd-daba-4071-aedf-4f32a7e63dbe}|{95d58338-ba6a-40c8-93fd-05a34731dc0e}|{4cbef3f0-4205-4165-8871-2844f9737602}|{1855d130-4893-4c79-b4aa-cbdf6fee86d3}|{87dcb9bf-3a3e-4b93-9c85-ba750a55831a})$/","prefs":[],"schema":1516822896448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c092b0d-7205-43a1-aa75-b7a42372fb52","last_modified":1516828883523},{"guid":"/^({fce89242-66d3-4946-9ed0-e66078f172fc})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})$/","prefs":[],"schema":1516650096284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1432560","why":"These are malicious add-ons that make it hard for the user to be removed.","name":"FF AntiVir Monitoring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9dfeee42-e6a8-49e0-8979-0648f7368239","last_modified":1516744119329},{"guid":"/^(\\{1490068c-d8b7-4bd2-9621-a648942b312c\\})|(\\{d47ebc8a-c1ea-4a42-9ca3-f723fff034bd\\})|(\\{83d6f65c-7fc0-47d0-9864-a488bfcaa376\\})|(\\{e804fa4c-08e0-4dae-a237-8680074eba07\\})|(\\{ea618d26-780e-4f0f-91fd-2a6911064204\\})|(\\{ce93dcc7-f911-4098-8238-7f023dcdfd0d\\})|(\\{7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0\\})|(\\{b019c485-2a48-4f5b-be13-a7af94bc1a3e\\})|(\\{9b8a3057-8bf4-4a9e-b94b-867e4e71a50c\\})|(\\{eb3ebb14-6ced-4f60-9800-85c3de3680a4\\})|(\\{01f409a5-d617-47be-a574-d54325fe05d1\\})$/","prefs":[],"schema":1516394914836,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bf72f70-a611-4845-af3f-d4dabe8862b6","last_modified":1516394982586},{"guid":"/^(\\{ac06c6b2-3fd6-45ee-9237-6235aa347215\\})|(\\{d461cc1b-8a36-4ff0-b330-1824c148f326\\})|(\\{d1ab5ebd-9505-481d-a6cd-6b9db8d65977\\})|(\\{07953f60-447e-4f53-a5ef-ed060487f616\\})|(\\{2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9\\})|(\\{f82b3ad5-e590-4286-891f-05adf5028d2f\\})|(\\{f96245ad-3bb0-46c5-8ca9-2917d69aa6ca\\})|(\\{2f53e091-4b16-4b60-9cae-69d0c55b2e78\\})|(\\{18868c3a-a209-41a6-855d-f99f782d1606\\})|(\\{47352fbf-80d9-4b70-9398-fb7bffa3da53\\})$/","prefs":[],"schema":1516311993443,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4ca8206f-bc2a-4428-9439-7f3142dc08db","last_modified":1516394914828},{"guid":"{5b0f6d3c-10fd-414c-a135-dffd26d7de0f}","prefs":[],"schema":1516131689499,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1430577","why":"This is a malicious add-on that executes remote scripts, redirects popular search URLs and tracks users.","name":"P Birthday"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8088b39a-3e6d-4a17-a22f-3f95c0464bd6","last_modified":1516303320468},{"guid":"{1490068c-d8b7-4bd2-9621-a648942b312c}","prefs":[],"schema":1515267698296,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1428754","why":"This add-on is using a deceptive name and performing unwanted actions on users' systems.","name":"FF Safe Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"674b6e19-f087-4706-a91d-1e723ed6f79e","last_modified":1515433728497},{"guid":"{dfa727cb-0246-4c5a-843a-e4a8592cc7b9}","prefs":[],"schema":1514922095288,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1426582","why":"Version 2.0.0 shipped with a hidden coin miner, which degrades performance in users who have it enabled. Version 1.2.3 currently available on AMO is not affected.","name":"Open With Adobe PDF Reader 2.0.0"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.0","minVersion":"2.0.0"}],"id":"455772a3-8360-4f5a-9a5f-a45b904d0b51","last_modified":1515007270887},{"guid":"{d03b6b0f-4d44-4666-a6d6-f16ad9483593}","prefs":[],"schema":1513366896461,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1425581","why":"This is a malicious add-on posing as a legitimate update.","name":"FF Guard Tool (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10d9ce89-b8d4-4b53-b3d7-ecd192681f4e","last_modified":1513376470395},{"guid":"{7e907a15-0a4c-4ff4-b64f-5eeb8f841349}","prefs":[],"schema":1510083698490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate update.","name":"Manual Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7569261-f575-4719-8202-552b20d013b0","last_modified":1510168860382},{"guid":"{3602008d-8195-4860-965a-d01ac4f9ca96}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28c805a9-e692-4ef8-b3ae-14e085c19ecd","last_modified":1509120934909},{"guid":"{87010166-e3d0-4db5-a394-0517917201df}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"84dd8a02-c879-4477-8ea7-bf2f225b0940","last_modified":1509120881470},{"guid":"{8ab60777-e899-475d-9a4f-5f2ee02c7ea4}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ccebab59-7190-4258-8faa-a0b752dd5301","last_modified":1509120831329},{"guid":"{368eb817-31b4-4be9-a761-b67598faf9fa}","prefs":[],"schema":1509046897080,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9abc7502-bd6f-40d7-b035-abe721345360","last_modified":1509120801043},{"guid":"@68eba425-7a05-4d62-82b1-1d6d5a51716b","prefs":[],"schema":1505072496256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1398905","why":"Misleads users into thinking this is a security and privacy tool (also distributed on a site that makes it look like an official Mozilla product).","name":"SearchAssist Incognito"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"595e0e53-b76b-4188-a160-66f29c636094","last_modified":1505211411253},{"guid":"@H99KV4DO-UCCF-9PFO-9ZLK-8RRP4FVOKD9O","prefs":[],"schema":1502483549048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently.","name":"FF Adr (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5df16afc-c804-43c9-9de5-f1835403e5fb","last_modified":1502483601731},{"guid":"@DA3566E2-F709-11E5-8E87-A604BC8E7F8B","prefs":[],"schema":1502480491460,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently into users' systems.","name":"SimilarWeb (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0a47a2f7-f07c-489b-bd39-88122a2dfe6a","last_modified":1502483549043},{"guid":"/^({95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}|{E3605470-291B-44EB-8648-745EE356599A}|{95E5E0AD-65F9-4FFC-A2A2-0008DCF6ED25}|{FF20459C-DA6E-41A7-80BC-8F4FEFD9C575}|{6E727987-C8EA-44DA-8749-310C0FBE3C3E}|{12E8A6C2-B125-479F-AB3C-13B8757C7F04}|{EB6628CF-0675-4DAE-95CE-EFFA23169743})$/","prefs":[],"schema":1494022576295,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362585","why":"All of these add-ons have been identified as malware, and are being installed in Firefox globally, most likely via a malicious application installer.","name":"Malicious globally-installed add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fd71895-7fc6-4f3f-aa22-1cbb0c5fd922","last_modified":1494024191520},{"guid":"@safesearchscoutee","prefs":[],"schema":1494013289942,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362553","why":"This add-on intercepts queries sent to search engines and replaces them with its own, without user consent.","name":"SafeSearch Incognito (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"edad04eb-ea16-42f3-a4a7-20dded33cc37","last_modified":1494022568654},{"guid":"msktbird@mcafee.com","prefs":[],"schema":1493150718059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354912","why":"These versions of this add-on are known to cause frequent crashes in Thunderbird.","name":"McAfee Anti-Spam Thunderbird Extension 2.0 and lower"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0","minVersion":"0","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"0"}]}],"id":"9e86d1ff-727a-45e3-9fb6-17f32666daf2","last_modified":1493332747360},{"guid":"/^(\\{11112503-5e91-4299-bf4b-f8c07811aa50\\})|(\\{501815af-725e-45be-b0f2-8f36f5617afc\\})$/","prefs":[],"schema":1491421290217,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354045","why":"This add-on steals user credentials for popular websites from Facebook.","name":"Flash Player Updater (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c142360c-4f93-467e-9717-b638aa085d95","last_modified":1491472107658},{"guid":"fr@fbt.ovh","prefs":[],"schema":1490898754477,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1351689","why":"Scam add-on that silently steals user credentials of popular websites","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0f8344d0-8211-49a1-81be-c0084b3da9b1","last_modified":1490898787752},{"guid":"{95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}","prefs":[],"schema":1487179851382,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1338690","who":"All users who have this add-on installed.","why":"This is a malicious add-on that is silently installed in users' systems.","name":"youtube adblock (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"04b25e3d-a725-493e-be07-cbd74fb37ea7","last_modified":1487288975999},{"guid":"ext@alibonus.com","prefs":[],"schema":1485297431051,"blockID":"i1524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333471","who":"All Firefox users who have these versions installed.","why":"Versions 1.20.9 and lower of this add-on contain critical security issues.","name":"Alibonus 1.20.9 and lower","created":"2017-01-24T22:45:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.20.9","minVersion":"0","targetApplication":[]}],"id":"a015d5a4-9184-95db-0c74-9262af2332fa","last_modified":1485301116629},{"guid":"/^(ciscowebexstart1@cisco\\.com|ciscowebexstart_test@cisco\\.com|ciscowebexstart@cisco\\.com|ciscowebexgpc@cisco\\.com)$/","prefs":[],"schema":1485212610474,"blockID":"i1522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333225","who":"All Firefox users who have any Cisco WebEx add-ons installed.","why":"A critical security vulnerability has been discovered in Cisco WebEx add-ons that enable malicious websites to execute code on the user's system.","name":"Cisco WebEx add-ons","created":"2017-01-23T22:55:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.1","minVersion":"1.0.0","targetApplication":[]}],"id":"30368779-1d3b-490a-0a34-253085af7754","last_modified":1485215014902},{"guid":"googlotim@gmail.com","prefs":[],"schema":1483389810787,"blockID":"i1492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1328594","who":"All users who have Savogram version 1.3.2 installed. Version 1.3.1 doesn't have this problem and can be installed from the <a href=\"https://addons.mozilla.org/addon/savogram/\">add-on page</a>. Note that this is an older version, so affected users won't be automatically updated to it. New versions should correct this problem if they become available.","why":"Version 1.3.2 of this add-on loads remote code and performs DOM injection in an unsafe manner.","name":"Savogram 1.3.2","created":"2017-01-05T19:58:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.2","minVersion":"1.3.2","targetApplication":[]}],"id":"0756ed76-7bc7-ec1e-aba5-3a9fac2107ba","last_modified":1483646608603},{"guid":"support@update-firefox.com","prefs":[],"schema":1483387107003,"blockID":"i21","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629717","who":"All users of the add-on in all Mozilla applications.","why":"This add-on is adware/spyware masquerading as a Firefox update mechanism.","name":"Browser Update (spyware)","created":"2011-01-31T16:23:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dfb06be8-3594-28e4-d163-17e27119f15d","last_modified":1483389809169},{"guid":"{2224e955-00e9-4613-a844-ce69fccaae91}","prefs":[],"schema":1483387107003,"blockID":"i7","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=512406","who":"All users of Internet Saving Optimizer for all Mozilla applications.","why":"This add-on causes a high volume of Firefox crashes and is considered malware.","name":"Internet Saving Optimizer (extension)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9efb796-97c2-6434-d28f-acc83436f8e5","last_modified":1483389809147},{"guid":"supportaccessplugin@gmail.com","prefs":[],"schema":1483387107003,"blockID":"i43","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=693673","who":"All users with Firefox Access Plugin installed","why":"This add-on is spyware that reports all visited websites to a third party with no user value.","name":"Firefox Access Plugin (spyware)","created":"2011-10-11T11:24:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ed230a4-e174-262a-55ab-0c33f93a2529","last_modified":1483389809124},{"guid":"{8CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1483387107003,"blockID":"i10","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=541302","who":"All users of this add-on in all Mozilla applications.","why":"This add-on secretly hijacks all search results in most major search engines and masks as a security add-on.","name":"Internal security options editor (malware)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e2e0ac09-6d68-75f5-2424-140f51904876","last_modified":1483389809102},{"guid":"admin@youtubespeedup.com","prefs":[],"schema":1483387107003,"blockID":"i48","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=714221","who":"All users with any version of Youtube Speed UP! installed on any Mozilla product.","why":"This add-on hijacks your Facebook account.","name":"Youtube Speed UP! (malware)","created":"2011-12-29T19:48:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a93922c4-8a8a-5230-8f76-76fecb0653b6","last_modified":1483389809057},{"guid":"pink@rosaplugin.info","prefs":[],"schema":1482945809444,"blockID":"i84","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743484","who":"All Firefox users who have this add-on installed","why":"Add-on acts like malware and performs user actions on Facebook without their consent.","name":"Facebook Rosa (malware)","created":"2012-04-09T10:13:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"66ad8de9-311d-076c-7356-87fde6d30d8f","last_modified":1482945810971},{"guid":"videoplugin@player.com","prefs":[],"schema":1482945809444,"blockID":"i90","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=752483","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Flash Player update. It can hijack Google searches and Facebook accounts.","name":"FlashPlayer 11 (malware)","created":"2012-05-07T08:58:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d25943f1-39ef-b9ec-ab77-baeef3498365","last_modified":1482945810949},{"guid":"youtb3@youtb3.com","prefs":[],"schema":1482945809444,"blockID":"i60","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723753","who":"All Firefox users who have this extension installed.","why":"Malicious extension installed under false pretenses.","name":"Video extension (malware)","created":"2012-02-02T16:38:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cae3093f-a7b3-5352-a264-01dbfbf347ce","last_modified":1482945810927},{"guid":"{8f42fb8b-b6f6-45de-81c0-d6d39f54f971}","prefs":[],"schema":1482945809444,"blockID":"i82","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743012","who":"All Firefox users who have installed this add-on.","why":"This add-on maliciously manipulates Facebook and is installed under false pretenses.","name":"Face Plus (malware)","created":"2012-04-09T10:04:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09319ab3-55e7-fec1-44e0-84067d014b9b","last_modified":1482945810904},{"guid":"{95ff02bc-ffc6-45f0-a5c8-619b8226a9de}","prefs":[],"schema":1482945809444,"blockID":"i105","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Eklenti D\u00fcnyas\u0131 (malware)","created":"2012-06-08T14:34:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"afbbc08d-2414-f51e-fdb8-74c0a2d90323","last_modified":1482945810858},{"guid":"{fa277cfc-1d75-4949-a1f9-4ac8e41b2dfd}","prefs":[],"schema":1482945809444,"blockID":"i77","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738419","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware that is installed under false pretenses as an Adobe plugin.","name":"Adobe Flash (malware)","created":"2012-03-22T14:39:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81753a93-382d-5f9d-a4ca-8a21b679ebb1","last_modified":1482945810835},{"guid":"youtube@youtube3.com","prefs":[],"schema":1482945809444,"blockID":"i57","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722823","who":"All Firefox users that have installed this add-on.","why":"Malware installed on false pretenses.","name":"Divx 2012 Plugin (malware)","created":"2012-01-31T13:54:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4a93a0eb-a513-7272-6199-bc4d6228ff50","last_modified":1482945810811},{"guid":"{392e123b-b691-4a5e-b52f-c4c1027e749c}","prefs":[],"schema":1482945809444,"blockID":"i109","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=769781","who":"All Firefox users who have this add-on installed.","why":"This add-on pretends to be developed by Facebook and injects scripts that manipulate users' Facebook accounts.","name":"Zaman Tuneline Hay\u0131r! (malware)","created":"2012-06-29T13:20:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9a805aa-cae7-58d6-5a53-2af4442e4cf6","last_modified":1482945810788},{"guid":"msntoolbar@msn.com","prefs":[],"schema":1482945809444,"blockID":"i18","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of Bing Bar 6.0 and older for all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Bing Bar","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"6.*","minVersion":" 0","targetApplication":[]}],"id":"9b2f2039-b997-8993-d6dc-d881bc1ca7a1","last_modified":1482945810764},{"guid":"yasd@youasdr3.com","prefs":[],"schema":1482945809444,"blockID":"i104","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Play Now (malware)","created":"2012-06-08T14:33:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a352dff-d09d-1e78-7feb-45dec7ace5a5","last_modified":1482945810740},{"guid":"fdm_ffext@freedownloadmanager.org","prefs":[],"schema":1482945809444,"blockID":"i2","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=408445","who":"Users of Firefox 3 and later with versions 1.0 through 1.3.1 of Free Download Manager","why":"This add-on causes a high volume of crashes.","name":"Free Download Manager","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.1","minVersion":"1.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"fc46f8e7-0489-b90f-a373-d93109479ca5","last_modified":1482945810393},{"guid":"flash@adobe.com","prefs":[],"schema":1482945809444,"blockID":"i56","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"This add-on poses as an Adobe Flash update and injects malicious scripts into web pages. It hides itself in the Add-ons Manager.","name":"Adobe Flash Update (malware)","created":"2012-01-30T15:41:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"696db959-fb0b-8aa4-928e-65f157cdd77a","last_modified":1482945810371},{"guid":"youtubeer@youtuber.com","prefs":[],"schema":1482945809444,"blockID":"i66","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726787","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously, and is installed under false pretenses.","name":"Plug VDS (malware)","created":"2012-02-13T15:44:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0878ce4e-b476-ffa3-0e06-21a65b7917a1","last_modified":1482945810348},{"guid":"flash@adobee.com","prefs":[],"schema":1482945809444,"blockID":"i83","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743497","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware installed under false pretenses.","name":"FlashPlayer 11 (malware)","created":"2012-04-09T10:08:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09bb4661-331c-f7ba-865b-9e085dc437af","last_modified":1482945810259},{"guid":"youtube@2youtube.com","prefs":[],"schema":1482945809444,"blockID":"i71","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=730399","who":"All Firefox users who have installed this add-on.","why":"Extension is malware, installed under false pretenses.","name":"YouTube extension (malware)","created":"2012-02-27T10:23:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5d389c1f-b3a0-b06f-6ffb-d1e8aa055e3c","last_modified":1482945810236},{"guid":"webmaster@buzzzzvideos.info","prefs":[],"schema":1482945809444,"blockID":"i58","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722844","who":"All Firefox users who have installed this add-on.","why":"Malware add-on that is installed under false pretenses.","name":"Buzz Video (malware)","created":"2012-01-31T14:51:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7aab105-e2c2-42f5-d9be-280eb9c0c8f7","last_modified":1482945810213},{"guid":"play5@vide04flash.com","prefs":[],"schema":1482945809444,"blockID":"i92","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755443","who":"All Firefox users who have this add-on installed.","why":"This add-on impersonates a Flash Player update (poorly), and inserts malicious scripts into Facebook.","name":"Lastest Flash PLayer (malware)","created":"2012-05-15T13:27:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7190860e-fc1f-cd9f-5d25-778e1e9043b2","last_modified":1482945810191},{"guid":"support3_en@adobe122.com","prefs":[],"schema":1482945809444,"blockID":"i97","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759164","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"FlashPlayer 11 (malware)","created":"2012-05-28T13:42:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"decf93a1-2bb0-148c-a1a6-10b3757b554b","last_modified":1482945810168},{"guid":"a1g0a9g219d@a1.com","prefs":[],"schema":1482945809444,"blockID":"i73","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=736275","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as Flash Player. It steals user cookies and sends them to a remote location.","name":"Flash Player (malware)","created":"2012-03-15T15:03:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6dd66b43-897d-874a-2227-54e240b8520f","last_modified":1482945810146},{"guid":"ghostviewer@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i59","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723683","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on that automatically posts to Facebook.","name":"Ghost Viewer (malware)","created":"2012-02-02T16:32:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06dfe833-8c3d-90ee-3aa8-37c3c28f7c56","last_modified":1482945810123},{"guid":"kdrgun@gmail.com","prefs":[],"schema":1482945809444,"blockID":"i103","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.","name":"Timeline Kapat (malware)","created":"2012-06-08T14:32:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a9a46ab2-2f56-1046-201c-5faa3435e248","last_modified":1482945810078},{"guid":"youtube2@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i67","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=728476","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware, installed under false pretenses.","name":"Youtube Online (malware)","created":"2012-02-18T09:10:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"14650ece-295b-a667-f9bc-a3d973e2228c","last_modified":1482945810055},{"guid":"admin@youtubeplayer.com","prefs":[],"schema":1482945809444,"blockID":"i51","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=717165","who":"All Firefox users with this extension installed.","why":"This add-on is malware, doing nothing more than inserting advertisements into websites through iframes.","name":"Youtube player (malware)","created":"2012-01-18T14:34:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16b2ce94-88db-0d79-33fc-a93070ceb509","last_modified":1482945809957},{"guid":"youtubeee@youtuber3.com","prefs":[],"schema":1482945809444,"blockID":"i96","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=758503","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that is disguised as a DivX plugin.","name":"Divx 2012 Plugins (malware)","created":"2012-05-25T09:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f01be9cb-5cf2-774a-a4d7-e210a24db5b9","last_modified":1482945809912},{"guid":"{3252b9ae-c69a-4eaf-9502-dc9c1f6c009e}","prefs":[],"schema":1482945809444,"blockID":"i17","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 2.2 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Default Manager (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.2","minVersion":"2.2","targetApplication":[]}],"id":"38be28ac-2e30-37fa-4332-852a55fafb43","last_modified":1482945809886},{"guid":"{68b8676b-99a5-46d1-b390-22411d8bcd61}","prefs":[],"schema":1482945809444,"blockID":"i93","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755635","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that post content on Facebook accounts and steals user data.","name":"Zaman T\u00fcnelini Kald\u0131r! (malware)","created":"2012-05-16T10:44:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"733aff15-9b1f-ec04-288f-b78a55165a1c","last_modified":1482945809863},{"guid":"applebeegifts@mozilla.doslash.org","prefs":[],"schema":1482945809444,"blockID":"i54","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721562","who":"All Firefox users that install this add-on.","why":"Add-on is malware installed under false pretenses.","name":"Applebees Gift Card (malware)","created":"2012-01-26T16:17:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1372c8ab-5452-745a-461a-aa78e3e12c4b","last_modified":1482945809840},{"guid":"activity@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i65","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726803","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously and poses as an official Facebook add-on.","name":"Facebook extension (malware)","created":"2012-02-13T15:41:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"79ad1c9b-0828-7823-4574-dd1cdd46c3d6","last_modified":1482945809437},{"guid":"jid0-EcdqvFOgWLKHNJPuqAnawlykCGZ@jetpack","prefs":[],"schema":1482945112982,"blockID":"i62","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=724650","who":"All Firefox users who have installed this add-on.","why":"Add-on is installed under false pretenses and delivers malware.","name":"YouTube extension (malware)","created":"2012-02-06T14:46:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5ae1e642-b53c-54c0-19e7-5562cfdac3a3","last_modified":1482945809415},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i25","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=637542","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-03-14T15:53:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.3.0.*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1"}]}],"id":"c950501b-1f08-2ab2-d817-7c664c0d16fe","last_modified":1482945809393},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i38","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=660111","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-05-27T13:55:02Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"3.3.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"5.0a1"}]}],"id":"f11de388-4511-8d06-1414-95d3b2b122c5","last_modified":1482945809371},{"guid":"youtube@youtube7.com","prefs":[],"schema":1482945112982,"blockID":"i55","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721646","who":"All Firefox users with this add-on installed.","why":"This is malware posing as video software.","name":"Plugin Video (malware)","created":"2012-01-27T09:39:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"08ceedf5-c7c1-f54f-db0c-02f01f0e319a","last_modified":1482945809304},{"guid":"crossriderapp3924@crossrider.com","prefs":[],"schema":1482945112982,"blockID":"i76","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738282","who":"All Firefox users who have installed this add-on.","why":"This add-on compromises Facebook privacy and security and spams friends lists without user intervention.","name":"Fblixx (malware)","created":"2012-03-22T10:38:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d0a019-62fb-837b-1f1f-6831e56442b5","last_modified":1482945809279},{"guid":"{45147e67-4020-47e2-8f7a-55464fb535aa}","prefs":[],"schema":1482945112982,"blockID":"i86","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=748993","who":"All Firefox users who have this add-on installed.","why":"This add-on injects scripts into Facebook and performs malicious activity.","name":"Mukemmel Face+","created":"2012-04-25T16:33:21Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"960443f9-cf48-0b71-1ff2-b8c34a3411ea","last_modified":1482945809255},{"guid":"{4B3803EA-5230-4DC3-A7FC-33638F3D3542}","prefs":[],"schema":1482945112982,"blockID":"i4","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=441649","who":"Users of Firefox 3 and later with version 1.2 of Crawler Toolbar","why":"This add-on causes a high volume of crashes.","name":"Crawler Toolbar","created":"2008-07-08T10:23:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2","minVersion":"1.2","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"a9818d53-3a6a-8673-04dd-2a16f5644215","last_modified":1482945809232},{"guid":"flashupdate@adobe.com","prefs":[],"schema":1482945112982,"blockID":"i68","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"Add-on is malware, installed under false pretenses.","name":"Flash Update (malware)","created":"2012-02-21T13:55:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba5b46e-790d-5af2-9580-a5f1e6e65522","last_modified":1482945809208},{"guid":"plugin@youtubeplayer.com","prefs":[],"schema":1482945112982,"blockID":"i127","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=783356","who":"All users who have this add-on installed.","why":"This add-on tries to pass as a YouTube player and runs malicious scripts on webpages.","name":"Youtube Facebook Player (malware)","created":"2012-08-16T13:03:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"17a8bece-e2df-a55d-8a72-95faff028b83","last_modified":1482945809185},{"guid":"GifBlock@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i79","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739482","who":"All Firefox users who have installed this extension.","why":"This extension is malicious and is installed under false pretenses.","name":"Facebook Essentials (malware)","created":"2012-03-27T10:53:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"728451e8-1273-d887-37e9-5712b1cc3bff","last_modified":1482945809162},{"guid":"ff-ext@youtube","prefs":[],"schema":1482945112982,"blockID":"i52","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719296","who":"All Firefox users that have this add-on installed.","why":"This add-on poses as a YouTube player while posting spam into Facebook account.","name":"Youtube player (malware)","created":"2012-01-19T08:26:35Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd2dd72a-dd52-6752-a0cd-a4b312fd0b65","last_modified":1482945809138},{"guid":"ShopperReports@ShopperReports.com","prefs":[],"schema":1482945112982,"blockID":"i22","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=630191","who":"Users of Shopper Reports version 3.1.22.0 in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Shopper Reports","created":"2011-02-09T17:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.22.0","minVersion":"3.1.22.0","targetApplication":[]}],"id":"f26b049c-d856-750f-f050-996e6bec7cbb","last_modified":1482945809115},{"guid":"{27182e60-b5f3-411c-b545-b44205977502}","prefs":[],"schema":1482945112982,"blockID":"i16","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 1.0 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Search Helper Extension (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"1.0","targetApplication":[]}],"id":"2655f230-11f3-fe4c-7c3d-757d37d5f9a5","last_modified":1482945809092},{"guid":"{841468a1-d7f4-4bd3-84e6-bb0f13a06c64}","prefs":[],"schema":1482945112982,"blockID":"i46","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=712369","who":"Users of all versions of Nectar Search Toolbar in Firefox 9.","why":"This add-on causes crashes and other stability issues in Firefox.","name":"Nectar Search Toolbar","created":"2011-12-20T11:38:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"9.0","minVersion":"9.0a1"}]}],"id":"b660dabd-0dc0-a55c-4b86-416080b345d9","last_modified":1482945809069},{"guid":"support@daemon-tools.cc","prefs":[],"schema":1482945112982,"blockID":"i5","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=459850","who":"Users of Daemon Tools Toolbar version 1.0.0.5 and older for all Mozilla applications.","why":"This add-on causes a high volume of crashes.","name":"Daemon Tools Toolbar","created":"2009-02-13T18:39:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.5","minVersion":"0","targetApplication":[]}],"id":"8cabafd3-576a-b487-31c8-ab59e0349a0e","last_modified":1482945809045},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1482945112982,"blockID":"i53","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719605","who":"All users of Firefox with this add-on installed.","why":"This add-on is being offered as an online movie viewer, when it reality it only inserts scripts and ads into known sites.","name":"Peliculas-FLV (malware)","created":"2012-01-19T15:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.3","minVersion":"2.0.3","targetApplication":[]}],"id":"07bc0962-60da-087b-c3ab-f2a6ab84d81c","last_modified":1482945809021},{"guid":"royal@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i64","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=725777","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on posing as a Facebook tool.","name":"Facebook ! (malware)","created":"2012-02-09T13:24:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd1d2623-0d15-c93e-8fbd-ba07b0299a44","last_modified":1482945808997},{"guid":"{28bfb930-7620-11e1-b0c4-0800200c9a66}","prefs":[],"schema":1482945112982,"blockID":"i108","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=766852","who":"All Firefox user who have this add-on installed.","why":"This is malware disguised as an Adobe product. It spams Facebook pages.","name":"Aplicativo (malware)","created":"2012-06-21T09:24:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"908dc4fb-ebc9-cea1-438f-55e4507ba834","last_modified":1482945808973},{"guid":"socialnetworktools@mozilla.doslash.org","prefs":[],"schema":1482945112982,"blockID":"i78","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739441","who":"All Firefox users who have installed this add-on.","why":"This add-on hijacks the Facebook UI and adds scripts to track users.","name":"Social Network Tools (malware)","created":"2012-03-26T16:46:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1064cd25-3b87-64bb-b0a6-2518ad281574","last_modified":1482945808950},{"guid":"youtubeeing@youtuberie.com","prefs":[],"schema":1482945112982,"blockID":"i98","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759663","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Youtube add-on.","name":"Youtube Video Player (malware)","created":"2012-05-30T09:30:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3484f860-56e1-28e8-5a70-cdcd5ab9d6ee","last_modified":1482945808927},{"guid":"pfzPXmnzQRXX6@2iABkVe.com","prefs":[],"schema":1482945112982,"blockID":"i99","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759950","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as a Flash Player update.","name":"Flash Player (malware)","created":"2012-05-30T17:10:18Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"29cc4abc-4f52-01f1-eb0b-cad84ba4db13","last_modified":1482945808881},{"guid":"/^(pdftoword@addingapps.com|jid0-EYTXLS0GyfQME5irGbnD4HksnbQ@jetpack|jid1-ZjJ7t75BAcbGCX@jetpack)$/","prefs":[],"schema":1482341309012,"blockID":"i1425","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1325060","who":"All users who have any of the affected versions installed.","why":"A security vulnerability was discovered in old versions of the Add-ons SDK, which is exposed by certain old versions of add-ons. In the case of some add-ons that haven't been updated for a long time, all versions are being blocked.","name":"Various vulnerable add-on versions","created":"2016-12-21T17:23:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"150e639f-c832-63d0-a775-59313b2e1bf9","last_modified":1482343886365},{"guid":"{cc8f597b-0765-404e-a575-82aefbd81daf}","prefs":[],"schema":1480349193877,"blockID":"i380","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866332","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts and performs unwanted actions on behalf of the user.","name":"Update My Browser (malware)","created":"2013-06-19T13:03:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4950d7aa-c602-15f5-a7a2-d844182d5cbd","last_modified":1480349217152},{"guid":"extension@FastFreeConverter.com","prefs":[],"schema":1480349193877,"blockID":"i470","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"649dd933-debf-69b7-020f-496c2c9f99c8","last_modified":1480349217071},{"guid":"59D317DB041748fdB89B47E6F96058F3@jetpack","prefs":[],"schema":1480349193877,"blockID":"i694","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053540","who":"All Firefox users who have this add-ons installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is a suspicious add-on that appears to be installed without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JsInjectExtension","created":"2014-08-21T13:46:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"75692bd4-18e5-a9be-7ec3-9327e159ef68","last_modified":1480349217005},{"guid":"/^({bfec236d-e122-4102-864f-f5f19d897f5e}|{3f842035-47f4-4f10-846b-6199b07f09b8}|{92ed4bbd-83f2-4c70-bb4e-f8d3716143fe})$/","prefs":[],"schema":1480349193877,"blockID":"i527","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:13:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d68dd97-7965-0a84-8ca7-435aac3c8040","last_modified":1480349216927},{"guid":"support@vide1flash2.com","prefs":[],"schema":1480349193877,"blockID":"i246","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=830159","who":"All Firefox users who have this add-on installed.","why":"This is an add-on that poses as the Adobe Flash Player and runs malicious code in the user's system.","name":"Lastest Adobe Flash Player (malware)","created":"2013-01-14T09:17:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2004fba1-74bf-a072-2a59-6e0ba827b541","last_modified":1480349216871},{"guid":"extension21804@extension21804.com","prefs":[],"schema":1480349193877,"blockID":"i312","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b2cf1256-dadd-6501-1f4e-25902d408692","last_modified":1480349216827},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i602","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.8.*","minVersion":"3.15.8","targetApplication":[]}],"id":"b2b4236d-5d4d-82b2-99cd-00ff688badf1","last_modified":1480349216765},{"guid":"{FE1DEEEA-DB6D-44b8-83F0-34FC0F9D1052}","prefs":[],"schema":1480349193877,"blockID":"i364","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867670","who":"All Firefox users who have this add-on installed. Users who want to enable the add-on again can do so in the Add-ons Manager.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2013-06-10T16:14:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a59b967c-66ca-7ad9-2dc6-d0ad37ded5fd","last_modified":1480349216652},{"guid":"vpyekkifgv@vpyekkifgv.org","prefs":[],"schema":1480349193877,"blockID":"i352","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=872211","who":"All Firefox users who have this add-on installed.","why":"Uses a deceptive name and injects ads into pages without user consent.","name":"SQLlite Addon (malware)","created":"2013-05-14T13:42:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fd981ab-7ee0-e367-d804-0efe29d63178","last_modified":1480349216614},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i702","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T10:05:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.10","targetApplication":[]}],"id":"60e54f6a-1b10-f889-837f-60a76a98fccc","last_modified":1480349216512},{"guid":"{f0e59437-6148-4a98-b0a6-60d557ef57f4}","prefs":[],"schema":1480349193877,"blockID":"i304","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845975","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">installation guidelines</a> and is dropped silently into user's profiles.","name":"WhiteSmoke B","created":"2013-02-27T13:10:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0469e643-1a90-f9be-4aad-b347469adcbe","last_modified":1480349216402},{"guid":"xz123@ya456.com","prefs":[],"schema":1480349193877,"blockID":"i486","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-11-15T13:34:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9825a25-a96c-407e-e656-46a7948e5745","last_modified":1480349215808},{"guid":"{C7AE725D-FA5C-4027-BB4C-787EF9F8248A}","prefs":[],"schema":1480349193877,"blockID":"i424","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=860641","who":"Users of Firefox 23 or later who have RelevantKnowledge 1.0.0.2 or lower.","why":"Old versions of this add-on are causing startup crashes in Firefox 23, currently on the Beta channel. RelevantKnowledge users on Firefox 23 and above should update to version 1.0.0.3 of the add-on.","name":"RelevantKnowledge 1.0.0.2 and lower","created":"2013-07-01T10:45:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.2","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"23.0a1"}]}],"id":"c888d167-7970-4b3f-240f-2d8e6f14ded4","last_modified":1480349215779},{"guid":"superlrcs@svenyor.net","prefs":[],"schema":1480349193877,"blockID":"i545","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:52:42Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"002cd4fa-4c2b-e28b-9220-4a520f4d9ec6","last_modified":1480349215672},{"guid":"mbrsepone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i479","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=937331","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Lightweight Pack (malware)","created":"2013-11-11T15:42:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0549645e-5f50-5089-1f24-6e7d3bfab8e0","last_modified":1480349215645},{"guid":"mbroctone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i476","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936590","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks the users' Facebook account.","name":"Mozilla Storage Service (malware)","created":"2013-11-08T15:32:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"92198396-8756-8d09-7f18-a68d29894f71","last_modified":1480349215504},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i616","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.28.*","minVersion":"3.15.28","targetApplication":[]}],"id":"f11b485f-320e-233c-958b-a63377024fad","last_modified":1480349215479},{"guid":"/^({e9df9360-97f8-4690-afe6-996c80790da4}|{687578b9-7132-4a7a-80e4-30ee31099e03}|{46a3135d-3683-48cf-b94c-82655cbc0e8a}|{49c795c2-604a-4d18-aeb1-b3eba27e5ea2}|{7473b6bd-4691-4744-a82b-7854eb3d70b6}|{96f454ea-9d38-474f-b504-56193e00c1a5})$/","prefs":[],"schema":1480349193877,"blockID":"i494","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. It also uses multiple add-on IDs for no apparent reason. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrent and related","created":"2013-12-02T14:52:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"485210d0-8e69-3436-536f-5d1deeea4167","last_modified":1480349215454},{"guid":"{EB7508CA-C7B2-46E0-8C04-3E94A035BD49}","prefs":[],"schema":1480349193877,"blockID":"i162","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=799266","who":"All Firefox users who have installed any of these add-ons.","why":"This block covers a number of malicious add-ons that deceive users, using names like \"Mozilla Safe Browsing\" and \"Translate This!\", and claiming they are developed by \"Mozilla Corp.\". They hijack searches and redirects users to pages they didn't intend to go to.\r\n\r\nNote: this block won't be active until bug 799266 is fixed.","name":"Mozilla Safe Browsing and others (Medfos malware)","created":"2012-10-11T12:25:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07566aa3-4ff9-ac4f-9de9-71c77454b4da","last_modified":1480349215428},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i614","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.26.*","minVersion":"3.15.26","targetApplication":[]}],"id":"ede541f3-1748-7b33-9bd6-80e2f948e14f","last_modified":1480349215399},{"guid":"/^({976cd962-e0ca-4337-aea7-d93fae63a79c}|{525ba996-1ce4-4677-91c5-9fc4ead2d245}|{91659dab-9117-42d1-a09f-13ec28037717}|{c1211069-1163-4ba8-b8b3-32fc724766be})$/","prefs":[],"schema":1480349193877,"blockID":"i522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:15:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"580aed26-dc3b-eef8-fa66-a0a402447b7b","last_modified":1480349215360},{"guid":"jid0-O6MIff3eO5dIGf5Tcv8RsJDKxrs@jetpack","prefs":[],"schema":1480349193877,"blockID":"i552","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974041","who":"All Firefox users who have this extension installed.","why":"This extension is malware that attempts to make it impossible for a second extension and itself to be disabled, and also forces the new tab page to have a specific URL.","name":"Extension_Protected (malware)","created":"2014-02-19T15:26:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e53063b4-5702-5b66-c860-d368cba4ccb6","last_modified":1480349215327},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i604","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.11.*","minVersion":"3.15.10","targetApplication":[]}],"id":"b910f779-f36e-70e1-b17a-8afb75988c03","last_modified":1480349215302},{"guid":"brasilescapefive@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i483","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938473","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Video Pack (malware)","created":"2013-11-14T09:37:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"85ee7840-f262-ad30-eb91-74b3248fd13d","last_modified":1480349215276},{"guid":"brasilescapeeight@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i482","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938476","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Pack (malware)","created":"2013-11-14T09:36:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"457a5722-be90-5a9f-5fa0-4c753e9f324c","last_modified":1480349215249},{"guid":"happylyrics@hpyproductions.net","prefs":[],"schema":1480349193877,"blockID":"i370","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881815","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into Firefox without the users' consent, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Happy Lyrics","created":"2013-06-11T15:42:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"730e616d-94a7-df0c-d31a-98b7875d60c2","last_modified":1480349215225},{"guid":"search-snacks@search-snacks.com","prefs":[],"schema":1480349193877,"blockID":"i872","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082733","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Search Snacks","created":"2015-03-04T14:37:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7567b06f-98fb-9400-8007-5d0357c345d9","last_modified":1480349215198},{"os":"WINNT","guid":"{ABDE892B-13A8-4d1b-88E6-365A6E755758}","prefs":[],"schema":1480349193877,"blockID":"i107","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=764210","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-06-14T13:54:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"e3b89e55-b35f-8694-6f0e-f856e57a191d","last_modified":1480349215173},{"guid":"amo-validator-bypass@example.com","prefs":[],"schema":1480349193877,"blockID":"i1058","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1227605","who":"All users who install this add-on.","why":"This add-on is a proof of concept of a malicious add-on that bypasses the code validator.","name":" AMO Validator Bypass","created":"2015-11-24T09:03:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"86e38e3e-a729-b5a2-20a8-4738b376eea6","last_modified":1480349214743},{"guid":"6lIy@T.edu","prefs":[],"schema":1480349193877,"blockID":"i852","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:30:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39798bc2-9c75-f172-148b-13f3ca1dde9b","last_modified":1480349214613},{"guid":"{a7f2cb14-0472-42a1-915a-8adca2280a2c}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i686","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033809","who":"All users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HomeTab","created":"2014-08-06T16:35:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"33a8f403-b2c8-cadf-e1ba-40b39edeaf18","last_modified":1480349214537},{"guid":"{CA8C84C6-3918-41b1-BE77-049B2BDD887C}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i862","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131230","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ebay Shopping Assistant by Spigot","created":"2015-02-26T12:51:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9a9d6da2-90a1-5b71-8b24-96492d57dfd1","last_modified":1480349214479},{"guid":"update@firefox.com","prefs":[],"schema":1480349193877,"blockID":"i374","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=781088","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Premium Update (malware)","created":"2013-06-18T13:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bb388413-60ea-c9d6-9a3b-c90df950c319","last_modified":1480349214427},{"guid":"sqlmoz@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i350","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=871610","who":"All Firefox users who have this extension installed.","why":"This extension is malware posing as Mozilla software. It hijacks Facebook accounts and spams other Facebook users.","name":"Mozilla Service Pack (malware)","created":"2013-05-13T09:43:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"715082e8-7a30-b27b-51aa-186c38e078f6","last_modified":1480349214360},{"guid":"mozillahmpg@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i140","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=791867","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that tries to monetize on its users by embedding unauthorized affiliate codes on shopping websites, and sometimes redirecting users to alternate sites that could be malicious in nature.","name":"Google YouTube HD Player (malware)","created":"2012-09-17T16:04:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98150e2e-cb45-1fee-8458-28d3602ec2ec","last_modified":1480349214216},{"guid":"astrovia@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i489","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=942699","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-11-25T12:40:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6f365ff4-e48f-8a06-d19d-55e19fba81f4","last_modified":1480349214157},{"guid":"{bbea93c6-64a3-4a5a-854a-9cc61c8d309e}","prefs":[],"schema":1480349193877,"blockID":"i1126","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that disables various security checks in Firefox.","name":"Tab Extension (malware)","created":"2016-02-29T21:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acb9dcc-59d4-46d1-2a11-1194c4948239","last_modified":1480349214066},{"guid":"ffxtlbr@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i628","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:47:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4387ad94-8500-d74d-68e3-20564a9aac9e","last_modified":1480349214036},{"guid":"{28387537-e3f9-4ed7-860c-11e69af4a8a0}","prefs":[],"schema":1480349193877,"blockID":"i40","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar (2)","created":"2011-07-19T10:19:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"ff95664b-93e4-aa73-ac20-5ffb7c87d8b7","last_modified":1480349214002},{"guid":"{41e5ef7a-171d-4ab5-8351-951c65a29908}","prefs":[],"schema":1480349193877,"blockID":"i784","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HelpSiteExpert","created":"2014-11-14T14:37:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0c05a0bb-30b4-979e-33a7-9f3955eba17d","last_modified":1480349213962},{"guid":"/^({2d7886a0-85bb-4bf2-b684-ba92b4b21d23}|{2fab2e94-d6f9-42de-8839-3510cef6424b}|{c02397f7-75b0-446e-a8fa-6ef70cfbf12b}|{8b337819-d1e8-48d3-8178-168ae8c99c36}|firefox@neurowise.info|firefox@allgenius.info)$/","prefs":[],"schema":1480349193877,"blockID":"i762","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082599","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"These add-ons are silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SaveSense, neurowise, allgenius","created":"2014-10-17T16:58:10Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c5439f55-ace5-ad73-1270-017c0ba7b2ce","last_modified":1480349213913},{"guid":"{462be121-2b54-4218-bf00-b9bf8135b23f}","prefs":[],"schema":1480349193877,"blockID":"i226","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke","created":"2012-11-29T16:27:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"994c6084-e864-0e4e-ac91-455083ee46c7","last_modified":1480349213879},{"guid":"firefox@browsefox.com","prefs":[],"schema":1480349193877,"blockID":"i546","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936244","who":"All Firefox users who have this add-on installed. If you want to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseFox","created":"2014-01-30T12:26:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"407d8c84-8939-cd28-b284-9b680e529bf6","last_modified":1480349213853},{"guid":"{6926c7f7-6006-42d1-b046-eba1b3010315}","prefs":[],"schema":1480349193877,"blockID":"i382","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844956","who":"All Firefox users who have this add-on installed. Those who wish to continue using it can enable it again in the Add-ons Manager.","why":"This add-on is silently installed, bypassing the Firefox opt-in screen and violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"appbario7","created":"2013-06-25T12:05:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2367bd94-2bdd-c615-de89-023ba071a443","last_modified":1480349213825},{"guid":"05dd836e-2cbd-4204-9ff3-2f8a8665967d@a8876730-fb0c-4057-a2fc-f9c09d438e81.com","prefs":[],"schema":1480349193877,"blockID":"i468","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935135","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be part of a <a href=\"https://www.drwebhk.com/en/virus_techinfo/Trojan.DownLoader9.50268.html\">Trojan software</a> package.","name":"Trojan.DownLoader9.50268 (malware)","created":"2013-11-07T14:43:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2fd53d9b-7096-f1fb-fbcb-2b40a6193894","last_modified":1480349213774},{"guid":"jid1-0xtMKhXFEs4jIg@jetpack","prefs":[],"schema":1480349193877,"blockID":"i586","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011286","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware installed without user consent.","name":"ep (malware)","created":"2014-06-03T15:50:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50ca2179-83ab-1817-163d-39ed2a9fbd28","last_modified":1480349213717},{"guid":"/^({16e193c8-1706-40bf-b6f3-91403a9a22be}|{284fed43-2e13-4afe-8aeb-50827d510e20}|{5e3cc5d8-ed11-4bed-bc47-35b4c4bc1033}|{7429e64a-1fd4-4112-a186-2b5630816b91}|{8c9980d7-0f09-4459-9197-99b3e559660c}|{8f1d9545-0bb9-4583-bb3c-5e1ac1e2920c})$/","prefs":[],"schema":1480349193877,"blockID":"i517","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:54:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e88a28ab-5569-f06d-b0e2-15c51bb2a4b7","last_modified":1480349213344},{"guid":"safebrowse@safebrowse.co","prefs":[],"schema":1480349193877,"blockID":"i782","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1097696","who":"All Firefox users who have this add-on installed.","why":"This add-on loads scripts with malicious code that appears intended to steal usernames, passwords, and other private information.","name":"SafeBrowse","created":"2014-11-12T14:20:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"edd81c91-383b-f041-d8f6-d0b9a90230bd","last_modified":1480349213319},{"guid":"{af95cc15-3b9b-45ae-8d9b-98d08eda3111}","prefs":[],"schema":1480349193877,"blockID":"i492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945126","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook (malware)","created":"2013-12-02T12:45:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7064e9e2-fba4-7b57-86d7-6f4afbf6f560","last_modified":1480349213294},{"guid":"{84a93d51-b7a9-431e-8ff8-d60e5d7f5df1}","prefs":[],"schema":1480349193877,"blockID":"i744","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:47:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dbc7ef8b-2c48-5dae-73a0-f87288c669f0","last_modified":1480349213264},{"guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i918","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:58:16Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"7f2a68f3-aa8a-ae41-1e48-d1f8f63d53c7","last_modified":1480349213231},{"guid":"831778-poidjao88DASfsAnindsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i972","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190962","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video patch (malware)","created":"2015-08-04T15:18:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39471221-6926-e11b-175a-b28424d49bf6","last_modified":1480349213194},{"guid":"lbmsrvfvxcblvpane@lpaezhjez.org","prefs":[],"schema":1480349193877,"blockID":"i342","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=863385","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also appears to install itself both locally and globally, producing a confusing uninstall experience.","name":"RapidFinda","created":"2013-05-06T16:18:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98fb4536-07a4-d03a-f7c5-945acecc8203","last_modified":1480349213128},{"guid":"{babb9931-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i499","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946086","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Credits (malware)","created":"2013-12-04T15:22:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be1d19fa-1662-322a-13e6-5fa5474f33a7","last_modified":1480349213100},{"guid":"{18d5a8fe-5428-485b-968f-b97b05a92b54}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i802","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:52:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bc846147-cdc1-141f-5846-b705c48bd6ed","last_modified":1480349213074},{"guid":"{b6ef1336-69bb-45b6-8cba-e578fc0e4433}","prefs":[],"schema":1480349193877,"blockID":"i780","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Power-SW","created":"2014-11-12T14:00:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3b080157-2900-d071-60fe-52b0aa376cf0","last_modified":1480349213024},{"guid":"info@wxdownloadmanager.com","prefs":[],"schema":1480349193877,"blockID":"i196","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec (malware)","created":"2012-11-05T09:24:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b62597d0-d2cb-d597-7358-5143a1d13658","last_modified":1480349212999},{"os":"WINNT","guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i111","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=771802","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-07-10T15:28:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"d3f96257-7635-555f-ef48-34d426322992","last_modified":1480349212971},{"guid":"l@AdLJ7uz.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i728","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GGoSavee","created":"2014-10-16T16:34:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e6bfa340-7d8a-1627-5cdf-40c0c4982e9d","last_modified":1480349212911},{"guid":"{6b2a75c8-6e2e-4267-b955-43e25b54e575}","prefs":[],"schema":1480349193877,"blockID":"i698","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052611","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowserShield","created":"2014-08-21T15:46:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"492e4e43-f89f-da58-9c09-d99528ee9ca9","last_modified":1480349212871},{"guid":"/^({65f9f6b7-2dae-46fc-bfaf-f88e4af1beca}|{9ed31f84-c8b3-4926-b950-dff74047ff79}|{0134af61-7a0c-4649-aeca-90d776060cb3}|{02edb56b-9b33-435b-b7df-b2843273a694}|{da51d4f6-3e7e-4ef8-b400-9198e0874606}|{b24577db-155e-4077-bb37-3fdd3c302bb5})$/","prefs":[],"schema":1480349193877,"blockID":"i525","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:11:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"78562d79-9a64-c259-fb63-ce24e29bb141","last_modified":1480349212839},{"guid":"adsremoval@adsremoval.net","prefs":[],"schema":1480349193877,"blockID":"i560","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=962793","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes various user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ad Removal","created":"2014-02-27T09:57:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4d150ad4-dc22-9790-07a9-36e0a23f857f","last_modified":1480349212798},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i445","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=911966","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that imitates a popular video downloader extension, and attempts to hijack Facebook accounts. The add-on available in the add-ons site is safe to use.","name":"YouTube Enhancer Plus (malware)","created":"2013-09-04T16:53:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"208.7.0","minVersion":"208.7.0","targetApplication":[]}],"id":"41d75d3f-a57e-d5ad-b95b-22f5fa010b4e","last_modified":1480349212747},{"guid":"{336D0C35-8A85-403a-B9D2-65C292C39087}","prefs":[],"schema":1480349193877,"blockID":"i224","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812292","who":"All Firefox users who have this add-on installed.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2012-11-29T16:22:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c87666e6-ec9a-2f1e-ad03-a722d2fa2a25","last_modified":1480349212655},{"guid":"G4Ce4@w.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i718","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YoutUbeAdBlaocke","created":"2014-10-02T12:21:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e1e9322-93e9-4ce1-41f5-46ad4ef1471b","last_modified":1480349212277},{"guid":"extension@Fast_Free_Converter.com","prefs":[],"schema":1480349193877,"blockID":"i533","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949597","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"FastFreeConverter","created":"2013-12-20T15:04:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"726f5645-c0bf-66dc-a97a-d072b46e63e7","last_modified":1480349212247},{"guid":"@stopad","prefs":[],"schema":1480349193877,"blockID":"i1266","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1298780","who":"Users who have version 0.0.4 and earlier of the add-on installed.","why":"Stop Ads sends each visited url to a third party server which is not necessary for the add-on to work or disclosed in a privacy policy or user opt-in.  Versions 0.0.4 and earlier are affected.","name":"Stop Ads Addon","created":"2016-08-30T12:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.0.4","minVersion":"0","targetApplication":[]}],"id":"3d1893dd-2092-d1f7-03f3-9629b7d7139e","last_modified":1480349212214},{"guid":"703db0db-5fe9-44b6-9f53-c6a91a0ad5bd@7314bc82-969e-4d2a-921b-e5edd0b02cf1.com","prefs":[],"schema":1480349193877,"blockID":"i519","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:57:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a27d0f9f-7708-3d5f-82e1-e3f29e6098a0","last_modified":1480349212183},{"guid":"{13c9f1f9-2322-4d5c-81df-6d4bf8476ba4}","prefs":[],"schema":1480349193877,"blockID":"i348","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867359","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also fails to revert settings changes on removal.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"mywebsearch","created":"2013-05-08T15:55:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"372cf3df-0810-85d8-b5d7-faffff309a11","last_modified":1480349212102},{"guid":"{a6e67e6f-8615-4fe0-a599-34a73fc3fba5}","prefs":[],"schema":1480349193877,"blockID":"i346","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867333","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. Also, it doesn't reset its settings changes on uninstall.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Startnow","created":"2013-05-06T17:06:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1caf911c-ff2f-b0f6-0d32-29ef74be81bb","last_modified":1480349212077},{"guid":"9518042e-7ad6-4dac-b377-056e28d00c8f@f1cc0a13-4df1-4d66-938f-088db8838882.com","prefs":[],"schema":1480349193877,"blockID":"i308","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=846455","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Solid Savings","created":"2013-02-28T13:48:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"df25ee07-74d4-ccd9-dbbe-7eb053015144","last_modified":1480349212020},{"guid":"jufa098j-LKooapd9jasJ9jliJsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1000","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201163","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Secure Video (malware)","created":"2015-09-07T14:00:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c3a98025-0f4e-3bb4-b475-97329e7b1426","last_modified":1480349211979},{"guid":"{46eddf51-a4f6-4476-8d6c-31c5187b2a2f}","prefs":[],"schema":1480349193877,"blockID":"i750","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:17:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b4ef650-e1ad-d55f-c420-4f26dbb4139c","last_modified":1480349211953},{"guid":"{DAC3F861-B30D-40dd-9166-F4E75327FAC7}","prefs":[],"schema":1480349193877,"blockID":"i924","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"be57998b-9e4d-1040-e6bb-ed9de056338d","last_modified":1480349211896},{"guid":"JMLv@njMaHh.org","prefs":[],"schema":1480349193877,"blockID":"i790","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1103516","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"YouttubeAdBlocke","created":"2014-11-24T14:14:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"070d5747-137d-8500-8713-cfc6437558a3","last_modified":1480349211841},{"guid":"istart_ffnt@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i888","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152553","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on appears to be malware, being silently installed and hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Istart","created":"2015-04-10T16:27:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32fad759-38d9-dad9-2295-e44cc6887040","last_modified":1480349211785},{"guid":"gystqfr@ylgga.com","prefs":[],"schema":1480349193877,"blockID":"i449","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912742","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Define Ext","created":"2013-09-13T16:19:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fe8f509-c530-777b-dccf-d10d58ae78cf","last_modified":1480349211748},{"guid":"e9d197d59f2f45f382b1aa5c14d82@8706aaed9b904554b5cb7984e9.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i844","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128324","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sense","created":"2015-02-06T15:01:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8f8695c-a356-a1d6-9291-502b377c63c2","last_modified":1480349211713},{"guid":"{184AA5E6-741D-464a-820E-94B3ABC2F3B4}","prefs":[],"schema":1480349193877,"blockID":"i968","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1164243","who":"All users who have this add-on installed.","why":"This is a malicious add-on that poses as a Java extension.","name":"Java String Helper (malware)","created":"2015-08-04T09:41:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fac1d2cb-eed7-fcef-5d5a-43c556371bd7","last_modified":1480349211687},{"guid":"7d51fb17-b199-4d8f-894e-decaff4fc36a@a298838b-7f50-4c7c-9277-df6abbd42a0c.com","prefs":[],"schema":1480349193877,"blockID":"i455","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=919792","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts and posts spam to the users' friends.","name":"Video Console (malware)","created":"2013-09-25T10:28:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd4d2e17-4ce6-36b0-3035-93e9cc5846d4","last_modified":1480349211660},{"guid":"prositez@prz.com","prefs":[],"schema":1480349193877,"blockID":"i764","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSitez","created":"2014-10-29T16:43:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"684ad4fd-2cbd-ce2a-34cd-bc66b20ac8af","last_modified":1480349211628},{"guid":"{25D77636-38B1-1260-887C-2D4AFA92D6A4}","prefs":[],"schema":1480349193877,"blockID":"i536","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=959279","who":"All Firefox users who have this extension installed.","why":"This is a malicious extension that is installed alongside a trojan. It hijacks searches on selected sites.","name":"Microsoft DirectInput Object (malware)","created":"2014-01-13T10:36:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd174588-940e-f5b3-12ea-896c957bd4b3","last_modified":1480349211555},{"guid":"{badea1ae-72ed-4f6a-8c37-4db9a4ac7bc9}","prefs":[],"schema":1480349193877,"blockID":"i543","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963809","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is apparently malware that is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Address Bar Search","created":"2014-01-28T14:28:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8c1dd68e-7df6-0c37-2f41-107745a7be54","last_modified":1480349211119},{"guid":"{d87d56b2-1379-49f4-b081-af2850c79d8e}","prefs":[],"schema":1480349193877,"blockID":"i726","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer Lite","created":"2014-10-13T16:01:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b0895b4-dd4f-1c91-f4e3-31afdbdf3178","last_modified":1480349211007},{"guid":"OKitSpace@OKitSpace.es","prefs":[],"schema":1480349193877,"blockID":"i469","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:35:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6a11aa68-0dae-5524-cc96-a5053a31c466","last_modified":1480349210982},{"guid":"{c96d1ae6-c4cf-4984-b110-f5f561b33b5a}","prefs":[],"schema":1480349193877,"blockID":"i808","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Better Web","created":"2014-12-19T09:36:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0413d46b-8205-d9e0-65df-4caa3e6355c4","last_modified":1480349210956},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i706","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T14:50:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.6.160","minVersion":"1.6.160","targetApplication":[]}],"id":"bb2b2114-f8e7-511d-04dc-abc8366712cc","last_modified":1480349210859},{"guid":"CortonExt@ext.com","prefs":[],"schema":1480349193877,"blockID":"i336","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=864551","who":"All Firefox users who have this add-on installed.","why":"This add-on is reported to be installed without user consent, with a non-descriptive name, and ties a number of browser features to Amazon URLs, probably monetizing on affiliate codes.","name":"CortonExt","created":"2013-04-22T16:10:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a5bdd05d-eb4c-ce34-9909-a677b4322384","last_modified":1480349210805},{"guid":"1chtw@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i430","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":" Mozilla Service Pack (malware)","created":"2013-08-05T16:42:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bf1e31c7-ba50-1075-29ae-47368ac1d6de","last_modified":1480349210773},{"guid":"lrcsTube@hansanddeta.com","prefs":[],"schema":1480349193877,"blockID":"i344","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866944","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"LyricsTube","created":"2013-05-06T16:44:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"424b9f39-d028-b1fb-d011-d8ffbbd20fe9","last_modified":1480349210718},{"guid":"{341f4dac-1966-47ff-aacf-0ce175f1498a}","prefs":[],"schema":1480349193877,"blockID":"i356","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=868129","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"MyFreeGames","created":"2013-05-23T14:45:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"560e08b1-3471-ad34-8ca9-463f5ca5328c","last_modified":1480349210665},{"guid":"/^({d6e79525-4524-4707-9b97-1d70df8e7e59}|{ddb4644d-1a37-4e6d-8b6e-8e35e2a8ea6c}|{e55007f4-80c5-418e-ac33-10c4d60db01e}|{e77d8ca6-3a60-4ae9-8461-53b22fa3125b}|{e89a62b7-248e-492f-9715-43bf8c507a2f}|{5ce3e0cb-aa83-45cb-a7da-a2684f05b8f3})$/","prefs":[],"schema":1480349193877,"blockID":"i518","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:56:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"145b0f22-501e-39eb-371e-ec8342a5add9","last_modified":1480349210606},{"guid":"{72b98dbc-939a-4e0e-b5a9-9fdbf75963ef}","prefs":[],"schema":1480349193877,"blockID":"i772","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SitezExpert","created":"2014-10-31T16:15:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"386cb2c9-e674-ce2e-345f-d30a785f90c5","last_modified":1480349210536},{"guid":"hha8771ui3-Fo9j9h7aH98jsdfa8sda@jetpack","prefs":[],"schema":1480349193877,"blockID":"i970","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190963","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video fix (malware)","created":"2015-08-04T15:15:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3ca577d8-3685-4ba9-363b-5b2d8d8dd608","last_modified":1480349210477},{"guid":"{7e8a1050-cf67-4575-92df-dcc60e7d952d}","prefs":[],"schema":1480349193877,"blockID":"i478","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935796","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"SweetPacks","created":"2013-11-08T15:42:28Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1519eb45-fcaa-b531-490d-fe366490ed45","last_modified":1480349210416},{"guid":"/^({66b103a7-d772-4fcd-ace4-16f79a9056e0}|{6926c7f7-6006-42d1-b046-eba1b3010315}|{72cabc40-64b2-46ed-8648-26d831761150}|{73ee2cf2-7b76-4c49-b659-c3d8cf30825d}|{ca6446a5-73d5-4c35-8aa1-c71dc1024a18}|{5373a31d-9410-45e2-b299-4f61428f0be4})$/","prefs":[],"schema":1480349193877,"blockID":"i521","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:14:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"983cb7fe-e0b4-6a2e-f174-d2670876b2cd","last_modified":1480349210351},{"guid":"{dd6b651f-dfb9-4142-b0bd-09912ad22674}","prefs":[],"schema":1480349193877,"blockID":"i400","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"975d2126-f727-f5b9-ca01-b83345b80c56","last_modified":1480349210301},{"guid":"25p@9eAkaLq.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i730","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YYOutoubeAdBlocke","created":"2014-10-16T16:35:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5a0c5818-693f-43ae-f85a-c6928d9c2cc4","last_modified":1480349210275},{"guid":"tmbepff@trendmicro.com","prefs":[],"schema":1480349193877,"blockID":"i1222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1275245","who":"All users of this add-on. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"Add-on  is causing a high-frequency crash in Firefox","name":"Trend Micro BEP 9.1.0.1035 and lower","created":"2016-05-24T12:10:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"9.1.0.1035","minVersion":"0","targetApplication":[]}],"id":"8045c799-486a-927c-b972-b9da1c2dab2f","last_modified":1480349209818},{"guid":"pricepeep@getpricepeep.com","prefs":[],"schema":1480349193877,"blockID":"i220","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811433","who":"All Firefox users who have Pricepeed below 2.1.0.20 installed.","why":"Versions older than 2.1.0.20 of the PricePeep add-on were silently side-installed with other software, injecting advertisements in Firefox. Versions 2.1.0.20 and above don't have the install problems are not blocked.","name":"PricePeep","created":"2012-11-29T16:18:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.1.0.19.99","minVersion":"0","targetApplication":[]}],"id":"227b9a8d-c18d-239c-135e-d79e614fe392","last_modified":1480349209794},{"guid":"hoverst@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i498","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946029","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Flash Player (malware)","created":"2013-12-04T15:17:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2b25ba3e-45db-0e6c-965a-3acda1a44117","last_modified":1480349209745},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i606","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.13.*","minVersion":"3.15.13","targetApplication":[]}],"id":"c3d88e22-386a-da3b-8aba-3cb526e08053","last_modified":1480349209713},{"guid":"advance@windowsclient.com","prefs":[],"schema":1480349193877,"blockID":"i508","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950773","who":"All Firefox users who have this add-on installed.","why":"This is not the <a href=\"https://addons.mozilla.org/addon/microsoft-net-framework-assist/\">Microsoft .NET Framework Assistant</a> created and distributed by Microsoft. It is a malicious extension that is distributed under the same name to trick users into installing it, and turns users into a botnet that conducts SQL injection attacks on visited websites.","name":"Microsoft .NET Framework Assistant (malware)","created":"2013-12-16T10:15:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5d30a74-732e-c3fa-f13b-097ee28d4b27","last_modified":1480349209674},{"guid":"{5eeb83d0-96ea-4249-942c-beead6847053}","prefs":[],"schema":1480349193877,"blockID":"i756","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080846","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SmarterPower","created":"2014-10-17T16:30:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e101dbc0-190c-f6d8-e168-0c1380581cc9","last_modified":1480349209625},{"guid":"/^({7e8a1050-cf67-4575-92df-dcc60e7d952d}|{b3420a9c-a397-4409-b90d-bcf22da1a08a}|{eca6641f-2176-42ba-bdbe-f3e327f8e0af}|{707dca12-3f99-4d94-afea-06dcc0ae0108}|{aea20431-87fc-40be-bc5b-18066fe2819c}|{30ee6676-1ba6-455a-a7e8-298fa863a546})$/","prefs":[],"schema":1480349193877,"blockID":"i523","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:42:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a3a6bc8e-46a1-b3d5-1b20-58b90ba099c3","last_modified":1480349209559},{"guid":"{e0352044-1439-48ba-99b6-b05ed1a4d2de}","prefs":[],"schema":1480349193877,"blockID":"i710","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Site Counselor","created":"2014-09-30T15:28:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b8fedf07-dcaf-f0e3-b42b-32db75c4c304","last_modified":1480349209491},{"guid":"addlyrics@addlyrics.net","prefs":[],"schema":1480349193877,"blockID":"i426","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891605","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Add Lyrics","created":"2013-07-09T15:25:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81678e9e-ebf0-47d6-e409-085c25e67c7e","last_modified":1480349209383},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i610","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:21:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.22.*","minVersion":"3.15.22","targetApplication":[]}],"id":"935dfec3-d017-5660-db5b-94ae7cea6e5f","last_modified":1480349209128},{"guid":"info@allpremiumplay.info","prefs":[],"schema":1480349193877,"blockID":"i163","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-C (malware)","created":"2012-10-29T16:40:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6afbf9b8-ae3a-6a48-0f6c-7a3e065ec043","last_modified":1480349209076},{"guid":"now.msn.com@services.mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i490","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=926378","who":"All Firefox users who have this add-on installed.","why":"As part of their ongoing work to fine-tune their editorial mix, msnNOW has decided that msnNOW will stop publishing on Dec. 3, 2013. Rather than having a single home for trending content, they will continue integrating that material throughout all MSN channels. A big thank you to everyone who followed msnNOW stories using the Firefox sidebar","name":"MSNNow (discontinued social provider)","created":"2013-11-27T08:06:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"de7d699d-016d-d973-5e39-52568de6ffde","last_modified":1480349209021},{"guid":"fftoolbar2014@etech.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i858","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131078","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and changes users' settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF Toolbar","created":"2015-02-11T15:32:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6877bf40-9e45-7017-4dac-14d09e7f0ef6","last_modified":1480349208988},{"guid":"mbrnovone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i477","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936249","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Service (malware)","created":"2013-11-08T15:35:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"758c2503-766d-a2f5-4c58-7cea93acfe05","last_modified":1480349208962},{"guid":"{739df940-c5ee-4bab-9d7e-270894ae687a}","prefs":[],"schema":1480349193877,"blockID":"i530","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949558","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"WhiteSmoke New","created":"2013-12-20T14:49:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8097aa6-3009-6dfc-59df-353ba6b1142b","last_modified":1480349208933},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i636","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033120","who":"All Firefox users who have this version of the add-on installed.","why":"Version 199.7.0 of the YoutubeEnhancer extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YoutubeEnhancer - Firefox","created":"2014-07-08T15:58:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"199.7.0","minVersion":"199.7.0","targetApplication":[]}],"id":"204a074b-da87-2784-f15b-43a9ea9a6b36","last_modified":1480349208851},{"guid":"extacylife@a.com","prefs":[],"schema":1480349193877,"blockID":"i505","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947741","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-09T15:08:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acadb8d-d3be-e0e0-4656-9107f9de0ea9","last_modified":1480349208823},{"guid":"{746505DC-0E21-4667-97F8-72EA6BCF5EEF}","prefs":[],"schema":1480349193877,"blockID":"i842","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128325","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Shopper-Pro","created":"2015-02-06T14:45:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f19c5fb-1c78-cbd6-8a03-1678efb54cbc","last_modified":1480349208766},{"guid":"{51c77233-c0ad-4220-8388-47c11c18b355}","prefs":[],"schema":1480349193877,"blockID":"i580","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004132","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Utility","created":"2014-04-30T13:55:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.1.9999999","minVersion":"0","targetApplication":[]}],"id":"daa2c60a-5009-2c65-a432-161d50bef481","last_modified":1480349208691},{"guid":"{a2bfe612-4cf5-48ea-907c-f3fb25bc9d6b}","prefs":[],"schema":1480349193877,"blockID":"i712","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer","created":"2014-09-30T15:28:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"13450534-93d7-f2a2-7f0a-e4e3948c4dc1","last_modified":1480349208027},{"guid":"ScorpionSaver@jetpack","prefs":[],"schema":1480349193877,"blockID":"i539","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963826","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"ScorpionSaver","created":"2014-01-28T14:00:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3499c968-6e8b-37f1-5f6e-2384807c2a6d","last_modified":1480349207972},{"guid":"{D19CA586-DD6C-4a0a-96F8-14644F340D60}","prefs":[],"schema":1480349193877,"blockID":"i42","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=690184","who":"Users of McAfee ScriptScan versions 14.4.0 and below for all versions of Firefox and SeaMonkey.","why":"This add-on causes a high volume of crashes.","name":"McAfee ScriptScan","created":"2011-10-03T09:38:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"14.4.0","minVersion":"0.1","targetApplication":[]}],"id":"1d35ac9d-49df-23cf-51f5-f3c228ad0dc9","last_modified":1480349207877},{"guid":"gjhrjenrengoe@jfdnkwelfwkm.com","prefs":[],"schema":1480349193877,"blockID":"i1042","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212174","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Avant Player (malware)","created":"2015-10-07T13:12:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d6453893-becc-7617-2050-0db284e0e0db","last_modified":1480349207840},{"guid":"{33e0daa6-3af3-d8b5-6752-10e949c61516}","prefs":[],"schema":1480349193877,"blockID":"i282","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835683","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>, bypassing the third party opt-in screen.","name":"Complitly","created":"2013-02-15T12:19:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.1.999","minVersion":"0","targetApplication":[]}],"id":"1f94bc8d-9d5f-c8f5-45c0-ad1f6e147c71","last_modified":1480349207789},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i608","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.20.*","minVersion":"3.15.18","targetApplication":[]}],"id":"e7d50ff2-5948-d571-6711-37908ccb863f","last_modified":1480349207761},{"guid":"{63eb5ed4-e1b3-47ec-a253-f8462f205350}","prefs":[],"schema":1480349193877,"blockID":"i786","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF-Plugin","created":"2014-11-18T12:33:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ca4558a2-8ce4-3ca0-3d29-63019f680c8c","last_modified":1480349207705},{"guid":"jid1-4vUehhSALFNqCw@jetpack","prefs":[],"schema":1480349193877,"blockID":"i634","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033002","who":"All Firefox users who have this version of the add-on installed.","why":"Version 99.7 of the YouTube Plus Plus extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YouTube Plus Plus 99.7","created":"2014-07-04T14:13:57Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"99.7","minVersion":"99.7","targetApplication":[]}],"id":"a6d017cb-e33f-2239-4e42-ab4e7cfb19fe","last_modified":1480349207680},{"guid":"{aab02ab1-33cf-4dfa-8a9f-f4e60e976d27}","prefs":[],"schema":1480349193877,"blockID":"i820","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Incredible Web","created":"2015-01-13T09:27:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"847ecc6e-1bc1-f7ff-e1d5-a76e6b8447d2","last_modified":1480349207654},{"guid":"torntv@torntv.com","prefs":[],"schema":1480349193877,"blockID":"i320","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-03-20T16:35:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cdd492b8-8101-74a9-5760-52ff709fd445","last_modified":1480349207608},{"guid":"crossriderapp12555@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i674","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=877836","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"The add-on is silently installed, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JollyWallet","created":"2014-07-22T16:26:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d4467e20-0f71-f0e0-8cd6-40c82b6c7379","last_modified":1480349207561},{"guid":"344141-fasf9jas08hasoiesj9ia8ws@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1038","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211169","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Plugin (malware)","created":"2015-10-05T16:42:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7986b7b-9b5a-d372-8147-8b4bd6f5a29b","last_modified":1480349207485},{"guid":"meOYKQEbBBjH5Ml91z0p9Aosgus8P55bjTa4KPfl@jetpack","prefs":[],"schema":1480349193877,"blockID":"i998","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201164","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Smooth Player (malware)","created":"2015-09-07T13:54:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30c3e511-9e8d-15ee-0867-d61047e56515","last_modified":1480349207370},{"guid":"{8dc5c42e-9204-2a64-8b97-fa94ff8a241f}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i770","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astrmenda Search","created":"2014-10-30T14:52:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a9c7702-0349-70d6-e64e-3a666ab084c6","last_modified":1480349207320},{"guid":"savingsslider@mybrowserbar.com","prefs":[],"schema":1480349193877,"blockID":"i752","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b1faf30-5725-7847-d993-b5cdaabc9829","last_modified":1480349207290},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i612","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.24.*","minVersion":"3.15.24","targetApplication":[]}],"id":"e0ff9df4-60e4-dbd0-8018-57f395e6610a","last_modified":1480349206818},{"guid":"{1e4ea5fc-09e5-4f45-a43b-c048304899fc}","prefs":[],"schema":1480349193877,"blockID":"i812","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Great Finder","created":"2015-01-06T13:22:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ea40b9f-2423-a2fd-a5e9-4ec1df2715f4","last_modified":1480349206784},{"guid":"crossriderapp8812@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i314","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06c07e28-0a34-e5ee-e724-491a2f6ce586","last_modified":1480349206708},{"guid":"/^(ffxtlbr@mixidj\\.com|{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}|{67097627-fd8e-4f6b-af4b-ecb65e50112e}|{f6f0f973-a4a3-48cf-9a7a-b7a69c30d71a}|{a3d0e35f-f1da-4ccb-ae77-e9d27777e68d}|{1122b43d-30ee-403f-9bfa-3cc99b0caddd})$/","prefs":[],"schema":1480349193877,"blockID":"i540","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:07:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4c03ddda-bb3f-f097-0a7b-b7b77b050584","last_modified":1480349206678},{"guid":"hansin@topvest.id","prefs":[],"schema":1480349193877,"blockID":"i836","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130406","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Inside News (malware)","created":"2015-02-06T14:17:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0945a657-f28d-a02c-01b2-5115b3f90d7a","last_modified":1480349206628},{"guid":"lfind@nijadsoft.net","prefs":[],"schema":1480349193877,"blockID":"i358","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=874131","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Lyrics Finder","created":"2013-05-24T14:09:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2307f11c-6216-0dbf-a464-b2921055ce2b","last_modified":1480349206603},{"guid":"plugin@getwebcake.com","prefs":[],"schema":1480349193877,"blockID":"i484","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938264","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> and is broadly considered to be malware. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"WebCake","created":"2013-11-14T09:55:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2865addd-da1c-20c4-742f-6a2270da2e78","last_modified":1480349206578},{"guid":"{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}","prefs":[],"schema":1480349193877,"blockID":"i354","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=837838","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Mixi DJ","created":"2013-05-23T14:31:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"03a745c3-0ee7-e262-ba31-62d4f78ddb62","last_modified":1480349206525},{"guid":"/^({7316e43a-3ebd-4bb4-95c1-9caf6756c97f}|{0cc09160-108c-4759-bab1-5c12c216e005}|{ef03e721-f564-4333-a331-d4062cee6f2b}|{465fcfbb-47a4-4866-a5d5-d12f9a77da00}|{7557724b-30a9-42a4-98eb-77fcb0fd1be3}|{b7c7d4b0-7a84-4b73-a7ef-48ef59a52c3b})$/","prefs":[],"schema":1480349193877,"blockID":"i520","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:11:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3901c48-9c06-fecb-87d3-efffd9940c22","last_modified":1480349206491},{"guid":"{354dbb0a-71d5-4e9f-9c02-6c88b9d387ba}","prefs":[],"schema":1480349193877,"blockID":"i538","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964081","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Show Mask ON (malware)","created":"2014-01-27T10:13:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad90253-8921-b5df-3658-45a70d75f3d7","last_modified":1480349206465},{"guid":"{8E9E3331-D360-4f87-8803-52DE43566502}","prefs":[],"schema":1480349193877,"blockID":"i461","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=906071","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which is <a href=\"https://addons.mozilla.org/firefox/blocked/i392\">blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-10-17T16:10:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ae8cca6e-4258-545f-9a69-3d908264a701","last_modified":1480349206437},{"guid":"info@bflix.info","prefs":[],"schema":1480349193877,"blockID":"i172","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have this add-on installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:39:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7a9062f4-218d-51d2-9b8c-b282e6eada4f","last_modified":1480349206384},{"guid":"{dff137ae-1ffd-11e3-8277-b8ac6f996f26}","prefs":[],"schema":1480349193877,"blockID":"i450","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=917861","who":"All Firefox users who have this add-on installed.","why":"This is add-on is malware that silently redirects popular search queries to a third party.","name":"Addons Engine (malware)","created":"2013-09-18T16:19:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8e583fe4-1c09-9bea-2473-faecf3260685","last_modified":1480349206312},{"guid":"12x3q@3244516.com","prefs":[],"schema":1480349193877,"blockID":"i493","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-02T12:49:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"af2a9e74-3753-9ff1-d899-5d1e79ed3dce","last_modified":1480349206286},{"guid":"{20AD702C-661E-4534-8CE9-BA4EC9AD6ECC}","prefs":[],"schema":1480349193877,"blockID":"i626","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1027886","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-19T15:16:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b9ccabe-8f9a-e3d1-a689-1aefba1f33b6","last_modified":1480349206261},{"guid":"{c5e48979-bd7f-4cf7-9b73-2482a67a4f37}","prefs":[],"schema":1480349193877,"blockID":"i736","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080842","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ClearThink","created":"2014-10-17T15:22:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6e8b3e4f-2f59-cde3-e6d2-5bc6e216c506","last_modified":1480349206231},{"guid":"{41339ee8-61ed-489d-b049-01e41fd5d7e0}","prefs":[],"schema":1480349193877,"blockID":"i810","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FireWeb","created":"2014-12-23T10:32:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a35f2ca6-aec4-c01d-170e-650258ebcd2c","last_modified":1480349206165},{"guid":"{845cab51-d8d2-472f-8bd9-2b44642d97c2}","prefs":[],"schema":1480349193877,"blockID":"i460","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=927456","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and handles users' settings, violating some of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Vafmusic9","created":"2013-10-17T15:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8538ccb4-3b71-9858-3f6d-c0fff7af58b0","last_modified":1480349205746},{"guid":"SpecialSavings@SpecialSavings.com","prefs":[],"schema":1480349193877,"blockID":"i676","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881511","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is add-on is generally considered to be unwanted and is probably silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SpecialSavings","created":"2014-07-22T16:31:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5e921810-fc3a-0729-6749-47e38ad10a22","last_modified":1480349205688},{"guid":"afurladvisor@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i434","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Helper","created":"2013-08-09T11:26:11Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"083585eb-d7e7-e228-5fbf-bf35c52044e4","last_modified":1480349205645},{"guid":"info@thebflix.com","prefs":[],"schema":1480349193877,"blockID":"i174","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:40:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"811a61d4-9435-133e-6262-fb72486c36b0","last_modified":1480349205526},{"guid":"{EEE6C361-6118-11DC-9C72-001320C79847}","prefs":[],"schema":1480349193877,"blockID":"i392","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SweetPacks Toolbar","created":"2013-06-25T12:38:45Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c1dc6607-4c0a-4031-9f14-70ef1ae1edcb","last_modified":1480349205455},{"guid":"/^(4cb61367-efbf-4aa1-8e3a-7f776c9d5763@cdece6e9-b2ef-40a9-b178-291da9870c59\\.com|0efc9c38-1ec7-49ed-8915-53a48b6b7600@e7f17679-2a42-4659-83c5-7ba961fdf75a\\.com|6be3335b-ef79-4b0b-a0ba-b87afbc6f4ad@6bbb4d2e-e33e-4fa5-9b37-934f4fb50182\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i531","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:01:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"46aa79a9-d329-f713-d4f2-07d31fe7071e","last_modified":1480349205287},{"guid":"afext@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i466","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=933988","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't respect user choice, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Extension","created":"2013-11-07T13:32:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8176f879-bd73-5468-e908-2d7cfc115ac2","last_modified":1480349205108},{"guid":"{FCE04E1F-9378-4f39-96F6-5689A9159E45}","prefs":[],"schema":1480349193877,"blockID":"i920","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"eb191ff0-20f4-6e04-4344-d880af4faf51","last_modified":1480349204978},{"guid":"{9CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1480349193877,"blockID":"i503","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947384","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that uses a deceptive name to stay in users' systems.","name":"XUL Cache (malware)","created":"2013-12-06T11:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dcdae267-8d3a-5671-dff2-f960febbbb20","last_modified":1480349204951},{"guid":"{0153E448-190B-4987-BDE1-F256CADA672F}","prefs":[],"schema":1480349193877,"blockID":"i914","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:56:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"2bfe0d89-e458-9d0e-f944-ddeaf8c4db6c","last_modified":1480349204871},{"guid":"{77beece6-3997-403a-92fa-0055bfcf88e5}","prefs":[],"schema":1480349193877,"blockID":"i452","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted11","created":"2013-09-18T16:34:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d348f91f-caeb-a803-dfd9-fd5d285aa0fa","last_modified":1480349204844},{"guid":"dealcabby@jetpack","prefs":[],"schema":1480349193877,"blockID":"i222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811435","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed with other software, injecting advertisements in Firefox.","name":"DealCabby","created":"2012-11-29T16:20:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6585f0bd-4f66-71e8-c565-d9762c5c084a","last_modified":1480349204818},{"guid":"{3c9a72a0-b849-40f3-8c84-219109c27554}","prefs":[],"schema":1480349193877,"blockID":"i510","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=951301","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-17T14:27:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7cfa3d0b-0ab2-5e3a-8143-1031c180e32f","last_modified":1480349204778},{"guid":"{2aab351c-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i500","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946087","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Photo (malware)","created":"2013-12-04T15:29:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7a76d34-ddcd-155e-9fae-5967bd796041","last_modified":1480349204716},{"guid":"{0A92F062-6AC6-8180-5881-B6E0C0DC2CC5}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i864","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131220","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and makes unwanted settings changes, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BlockAndSurf","created":"2015-02-26T12:56:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"acb16d1c-6274-93a3-7c1c-7ed36ede64a9","last_modified":1480349204612},{"guid":"trackerbird@bustany.org","prefs":[],"schema":1480349193877,"blockID":"i986","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1189264","who":"All Thunderbird users who have this version of the add-on installed on Thunderbird 38.0a2 and above.","why":"This add-on is causing consistent crashes on Thunderbird 38.0a2 and above.","name":"trackerbird 1.2.6","created":"2015-08-17T15:56:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2.6","minVersion":"1.2.6","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"38.0a2"}]}],"id":"bb1c699e-8790-4528-0b6d-4f83b7a3152d","last_modified":1480349204041},{"guid":"{0134af61-7a0c-4649-aeca-90d776060cb3}","prefs":[],"schema":1480349193877,"blockID":"i448","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912746","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our Add-on Guidelines. It manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar add-on","created":"2013-09-13T16:15:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cf428416-4974-8bb4-7928-c0cb2cfe7957","last_modified":1480349203968},{"guid":"/^(firefox@vebergreat\\.net|EFGLQA@78ETGYN-0W7FN789T87\\.COM)$/","prefs":[],"schema":1480349193877,"blockID":"i564","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974104","who":"All Firefox users who have these add-ons installed. If you wish to continue using these add-ons, you can enable them in the Add-ons Manager.","why":"These add-ons are silently installed by the Free Driver Scout installer, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"veberGreat and vis (Free Driver Scout bundle)","created":"2014-03-05T13:02:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"487538f1-698e-147e-6395-986759ceed7e","last_modified":1480349203902},{"guid":"69ffxtbr@PackageTracer_69.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i882","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1153001","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be malware, hijacking user's settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PackageTracer","created":"2015-04-10T16:18:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d37b4e0-3c60-fdad-dd8c-59baff6eae87","last_modified":1480349203836},{"guid":"{a9bb9fa0-4122-4c75-bd9a-bc27db3f9155}","prefs":[],"schema":1480349193877,"blockID":"i404","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb7a1dc7-16a0-4f70-8289-4df494e0d0fa","last_modified":1480349203633},{"guid":"P2@D.edu","prefs":[],"schema":1480349193877,"blockID":"i850","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:29:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"49536a29-fc7e-9fd0-f415-e15ac090fa56","last_modified":1480349203605},{"guid":"linksicle@linksicle.com","prefs":[],"schema":1480349193877,"blockID":"i472","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b5b15b3-6da7-cb7c-3c44-30b4fe079d52","last_modified":1480349203581},{"guid":"{377e5d4d-77e5-476a-8716-7e70a9272da0}","prefs":[],"schema":1480349193877,"blockID":"i398","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:15:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ea94df32-2a85-23da-43f7-3fc5714530ec","last_modified":1480349203519},{"guid":"{4933189D-C7F7-4C6E-834B-A29F087BFD23}","prefs":[],"schema":1480349193877,"blockID":"i437","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=900695","who":"All Firefox users.","why":"This add-on is widely reported to be malware.","name":"Win32.SMSWebalta (malware)","created":"2013-08-09T15:14:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cbef1357-d6bc-c8d3-7a82-44af6b1c390f","last_modified":1480349203486},{"guid":"{ADFA33FD-16F5-4355-8504-DF4D664CFE10}","prefs":[],"schema":1480349193877,"blockID":"i306","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844972","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It's also possible that it changes user settings without their consent.","name":"Nation Toolbar","created":"2013-02-28T12:56:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"017fd151-37ca-4646-4763-1d303fb918fa","last_modified":1480349203460},{"guid":"detgdp@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i884","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152614","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Security Protection (malware)","created":"2015-04-10T16:21:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b5cc88e-499d-2a47-d793-982d4c05e6ee","last_modified":1480349203433},{"guid":"/^(67314b39-24e6-4f05-99f3-3f88c7cddd17@6c5fa560-13a3-4d42-8e90-53d9930111f9\\.com|ffxtlbr@visualbee\\.com|{7aeae561-714b-45f6-ace3-4a8aed6e227b}|{7093ee04-f2e4-4637-a667-0f730797b3a0}|{53c4024f-5a2e-4f2a-b33e-e8784d730938})$/","prefs":[],"schema":1480349193877,"blockID":"i514","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:25:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f91eee1-7303-3f97-dfe6-1e897a156c7f","last_modified":1480349203408},{"guid":"FXqG@xeeR.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i720","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"GoSSave","created":"2014-10-02T12:23:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc061-a4ff-b75b-ec42-eb17c42a2956","last_modified":1480349203341},{"guid":"kallow@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i495","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945426","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-12-02T15:09:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a2c37a9-e7cc-2d03-2043-098d36b8aca2","last_modified":1480349203247},{"guid":"008abed2-b43a-46c9-9a5b-a771c87b82da@1ad61d53-2bdc-4484-a26b-b888ecae1906.com","prefs":[],"schema":1480349193877,"blockID":"i528","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949565","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"weDownload Manager Pro","created":"2013-12-20T14:40:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"da46065f-1c68-78f7-80fc-8ae07b5df68d","last_modified":1480349203131},{"guid":"{25dd52dc-89a8-469d-9e8f-8d483095d1e8}","prefs":[],"schema":1480349193877,"blockID":"i714","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Counselor","created":"2014-10-01T15:36:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e46c31ad-0ab3-e48a-47aa-9fa91b675fda","last_modified":1480349203066},{"guid":"{B1FC07E1-E05B-4567-8891-E63FBE545BA8}","prefs":[],"schema":1480349193877,"blockID":"i926","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:46Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"09868783-261a-ac24-059d-fc772218c1ba","last_modified":1480349202708},{"guid":"/^(torntv@torntv\\.com|trtv3@trtv\\.com|torntv2@torntv\\.com|e2fd07a6-e282-4f2e-8965-85565fcb6384@b69158e6-3c3b-476c-9d98-ae5838c5b707\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i529","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949559","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"TornTV","created":"2013-12-20T14:46:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"040e5ec2-ea34-816a-f99f-93296ce845e8","last_modified":1480349202677},{"guid":"249911bc-d1bd-4d66-8c17-df533609e6d8@c76f3de9-939e-4922-b73c-5d7a3139375d.com","prefs":[],"schema":1480349193877,"blockID":"i532","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:02:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d32b850d-82d5-b63d-087c-fb2041b2c232","last_modified":1480349202631},{"guid":"{7D4F1959-3F72-49d5-8E59-F02F8AA6815D}","prefs":[],"schema":1480349193877,"blockID":"i394","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i392\">is blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-06-25T12:40:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"851c2b8e-ea19-3a63-eac5-f931a8da5d6e","last_modified":1480349202341},{"guid":"g@uzcERQ6ko.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i776","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GoSave","created":"2014-10-31T16:23:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ee1e1a44-b51b-9f12-819d-64c3e515a147","last_modified":1480349202307},{"guid":"ffxtlbr@incredibar.com","prefs":[],"schema":1480349193877,"blockID":"i318","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812264","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"IncrediBar","created":"2013-03-20T14:40:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9e84b07c-84d5-c932-85f2-589713d7e380","last_modified":1480349202280},{"guid":"M1uwW0@47z8gRpK8sULXXLivB.com","prefs":[],"schema":1480349193877,"blockID":"i870","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131159","who":"All users who have this add-on installed.","why":"This is a malicious add-on that goes by the the name \"Flash Player 11\".","name":"Flash Player 11 (malware)","created":"2015-03-04T14:34:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"71d961b2-37d1-d393-76f5-3afeef57e749","last_modified":1480349202252},{"guid":"4zffxtbr-bs@VideoDownloadConverter_4z.com","prefs":[],"schema":1480349193877,"blockID":"i507","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949266","who":"All Firefox users who have this add-on installed.","why":"Certain versions of this add-on contains an executable that is flagged by multiple tools as malware. Newer versions no longer use it.","name":"VideoDownloadConverter","created":"2013-12-12T15:37:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.75.3.25126","minVersion":"0","targetApplication":[]}],"id":"0a0f106a-ecc6-c537-1818-b36934943e91","last_modified":1480349202156},{"guid":"contato@facefollow.net","prefs":[],"schema":1480349193877,"blockID":"i509","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950846","who":"All Firefox users who have this add-on installed.","why":"This add-on spams users' Facebook accounts.","name":"Face follow","created":"2013-12-16T16:15:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"56f15747-af8c-342c-6877-a41eeacded84","last_modified":1480349202067},{"guid":"/^({83a8ce1b-683c-4784-b86d-9eb601b59f38}|{ef1feedd-d8da-4930-96f1-0a1a598375c6}|{79ff1aae-701f-4ca5-aea3-74b3eac6f01b}|{8a184644-a171-4b05-bc9a-28d75ffc9505}|{bc09c55d-0375-4dcc-836e-0e3c8addfbda}|{cef81415-2059-4dd5-9829-1aef3cf27f4f})$/","prefs":[],"schema":1480349193877,"blockID":"i526","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:12:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9dfa4e92-bbf2-66d1-59a9-51402d1d226c","last_modified":1480349202010},{"guid":"{f2548724-373f-45fe-be6a-3a85e87b7711}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i768","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astro New Tab","created":"2014-10-30T14:52:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8510e9e2-c7d8-90d0-a2ff-eb09293acc6e","last_modified":1480349201854},{"guid":"KSqOiTeSJEDZtTGuvc18PdPmYodROmYzfpoyiCr2@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1032","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211172","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Player (malware)","created":"2015-10-05T16:22:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d9188ac-235f-773a-52a2-261b3ea9c03c","last_modified":1480349201504},{"guid":"{849ded12-59e9-4dae-8f86-918b70d213dc}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i708","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1047102","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes homepage and search settings without the user's consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda New Tab","created":"2014-09-02T16:29:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a319bfee-464f-1c33-61ad-738c52842fbd","last_modified":1480349201453},{"guid":"grjkntbhr@hgergerherg.com","prefs":[],"schema":1480349193877,"blockID":"i1018","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1208196","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"GreenPlayer (malware)","created":"2015-09-24T16:04:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9c47d940-bdd9-729f-e32e-1774d87f24b5","last_modified":1480349201425},{"guid":"{EEF73632-A085-4fd3-A778-ECD82C8CB297}","prefs":[],"schema":1480349193877,"blockID":"i165","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-M (malware)","created":"2012-10-29T16:41:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5ecd02a-20ee-749b-d5cf-3d74d1173a1f","last_modified":1480349201262},{"guid":"firefox-extension@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i688","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1049533","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hides itself under the name Java_plugin, among others.","name":"FinFisher (malware)","created":"2014-08-06T17:13:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98aca74a-69c7-9960-cccc-096a4a4adc6c","last_modified":1480349201235},{"guid":"{e44a1809-4d10-4ab8-b343-3326b64c7cdd}","prefs":[],"schema":1480349193877,"blockID":"i451","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted","created":"2013-09-18T16:33:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad5f53ed-7a43-cb1f-cbd7-41808fac1791","last_modified":1480349201128},{"guid":"{21EAF666-26B3-4A3C-ABD0-CA2F5A326744}","prefs":[],"schema":1480349193877,"blockID":"i620","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024752","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-12T15:27:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2d8833db-01a7-a758-080f-19e47abc54cb","last_modified":1480349201096},{"guid":"{1FD91A9C-410C-4090-BBCC-55D3450EF433}","prefs":[],"schema":1480349193877,"blockID":"i338","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844979","who":"All Firefox users who have this add-on installed.","why":"This extension overrides search settings, and monitors any further changes done to them so that they can be reverted. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>.","name":"DataMngr (malware)","created":"2013-04-24T11:30:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2e35995f-bec6-aa2b-3372-346d3325f72e","last_modified":1480349201059},{"guid":"9598582LLKmjasieijkaslesae@jetpack","prefs":[],"schema":1480349193877,"blockID":"i996","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201165","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Secure Player (malware)","created":"2015-09-07T13:50:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"52f9c6e7-f7d5-f52e-cc35-eb99ef8b4b6a","last_modified":1480349201029},{"guid":"{bf7380fa-e3b4-4db2-af3e-9d8783a45bfc}","prefs":[],"schema":1480349193877,"blockID":"i406","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrentBar","created":"2013-06-27T10:46:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3bcefc4b-110c-f3b8-17ad-f9fc97c1120a","last_modified":1480349201000},{"guid":"{424b0d11-e7fe-4a04-b7df-8f2c77f58aaf}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i800","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda NT","created":"2014-12-15T10:51:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07bdf6aa-cfc8-ed21-6b36-6f90af02b169","last_modified":1480349200939},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i618","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:25:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.31.*","minVersion":"3.15.31","targetApplication":[]}],"id":"825feb43-d6c2-7911-4189-6f589f612c34","last_modified":1480349200911},{"guid":"{167d9323-f7cc-48f5-948a-6f012831a69f}","prefs":[],"schema":1480349193877,"blockID":"i262","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke (malware)","created":"2013-01-29T13:33:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a8f249fe-3db8-64b8-da89-7b584337a7af","last_modified":1480349200885},{"guid":"/^({988919ff-0cd8-4d0c-bc7e-60d55a49eb64}|{494b9726-9084-415c-a499-68c07e187244}|{55b95864-3251-45e9-bb30-1a82589aaff1}|{eef3855c-fc2d-41e6-8d91-d368f51b3055}|{90a1b331-c2b4-4933-9f63-ba7b84d60d58}|{d2cf9842-af95-48cd-b873-bfbb48cd7f5e})$/","prefs":[],"schema":1480349193877,"blockID":"i541","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:09:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36196aed-9d0d-ebee-adf1-d1f7fadbc48f","last_modified":1480349200819},{"guid":"{29b136c9-938d-4d3d-8df8-d649d9b74d02}","prefs":[],"schema":1480349193877,"blockID":"i598","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011322","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Mega Browse","created":"2014-06-12T13:21:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"63b1c965-27c3-cd06-1b76-8721add39edf","last_modified":1480349200775},{"guid":"{6e7f6f9f-8ce6-4611-add2-05f0f7049ee6}","prefs":[],"schema":1480349193877,"blockID":"i868","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1086574","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Word Proser","created":"2015-02-26T14:58:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f54797da-cdcd-351a-c95e-874b64b0d226","last_modified":1480349200690},{"guid":"{02edb56b-9b33-435b-b7df-b2843273a694}","prefs":[],"schema":1480349193877,"blockID":"i438","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=896581","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar Toolbar","created":"2013-08-09T15:27:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"896710d2-5a65-e9b0-845b-05aa72c2bd51","last_modified":1480349200338},{"guid":"{1cdbda58-45f8-4d91-b566-8edce18f8d0a}","prefs":[],"schema":1480349193877,"blockID":"i724","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor Pro","created":"2014-10-13T16:00:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b70bd36-d2f7-26fa-9038-8b8dd132cd81","last_modified":1480349200288},{"guid":"{b12785f5-d8d0-4530-a3ea-5c4263b85bef}","prefs":[],"schema":1480349193877,"blockID":"i988","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1161573","who":"All users who have this add-on installed. Those who wish continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on overrides user's preferences without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Hero Fighter Community Toolbar","created":"2015-08-17T16:04:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e6d73f2-e8e3-af69-866e-30d3977b09e4","last_modified":1480349200171},{"guid":"{c2d64ff7-0ab8-4263-89c9-ea3b0f8f050c}","prefs":[],"schema":1480349193877,"blockID":"i39","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar","created":"2011-07-19T10:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"e928a115-9d8e-86a4-e2c7-de39627bd9bf","last_modified":1480349200047},{"guid":"{9edd0ea8-2819-47c2-8320-b007d5996f8a}","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i684","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033857","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is believed to be silently installed in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"webget","created":"2014-08-06T13:33:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d38561f5-370f-14be-1443-a74dad29b1f3","last_modified":1480349199962},{"guid":"/^({ad9a41d2-9a49-4fa6-a79e-71a0785364c8})|(ffxtlbr@mysearchdial\\.com)$/","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i670","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036740","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on has been repeatedly been silently installed into users' systems, and is known for changing the default search without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MySearchDial","created":"2014-07-18T15:47:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a04075e6-5df2-2e1f-85a6-3a0171247349","last_modified":1480349199927},{"guid":"/^({1f43c8af-e9e4-4e5a-b77a-f51c7a916324}|{3a3bd700-322e-440a-8a6a-37243d5c7f92}|{6a5b9fc2-733a-4964-a96a-958dd3f3878e}|{7b5d6334-8bc7-4bca-a13e-ff218d5a3f17}|{b87bca5b-2b5d-4ae8-ad53-997aa2e238d4}|{bf8e032b-150f-4656-8f2d-6b5c4a646e0d})$/","prefs":[],"schema":1480349193877,"blockID":"i1136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a2d0378f-ebe4-678c-62d8-2e4c6a613c17","last_modified":1480349199818},{"guid":"liiros@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i814","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119657","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"One Tab (malware)","created":"2015-01-09T12:49:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"387c054d-cc9f-7ebd-c814-b4c1fbcb2880","last_modified":1480349199791},{"guid":"{97E22097-9A2F-45b1-8DAF-36AD648C7EF4}","prefs":[],"schema":1480349193877,"blockID":"i916","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:57:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"94fba774-c4e6-046a-bc7d-ede787a9d0fe","last_modified":1480349199738},{"guid":"{b64982b1-d112-42b5-b1e4-d3867c4533f8}","prefs":[],"schema":1480349193877,"blockID":"i167","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=805973","who":"All Firefox users who have this add-on installed.","why":"This add-on is a frequent cause for browser crashes and other problems.","name":"Browser Manager","created":"2012-10-29T17:17:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"00bbe501-2d27-7a1c-c344-6eea1c707473","last_modified":1480349199673},{"guid":"{58bd07eb-0ee0-4df0-8121-dc9b693373df}","prefs":[],"schema":1480349193877,"blockID":"i286","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=842206","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-02-18T10:54:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b40a60d3-b9eb-09eb-bb02-d50b27aaac9f","last_modified":1480349199619},{"guid":"trtv3@trtv.com","prefs":[],"schema":1480349193877,"blockID":"i465","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-11-01T15:21:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d4d8a33-2eff-2556-c699-9be0841a8cd4","last_modified":1480349199560},{"guid":"{d2cf9842-af95-48cd-b873-bfbb48cd7f5e}","prefs":[],"schema":1480349193877,"blockID":"i439","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902569","who":"All Firefox users who have this add-on installed.","why":"This is another instance of the <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i354\">previously blocked</a> Mixi DJ add-on, which doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you wish to continue using it, it can be enabled in the Add-ons Manager.","name":"Mixi DJ V45","created":"2013-08-09T16:08:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e81c31fc-265e-61b9-d4c1-0e2f31f1652e","last_modified":1480349199478},{"guid":"/^({b95faac1-a3d7-4d69-8943-ddd5a487d966}|{ecce0073-a837-45a2-95b9-600420505f7e}|{2713b394-286f-4d7c-89ea-4174eeab9f5a}|{da7a20cf-bef4-4342-ad78-0240fdf87055})$/","prefs":[],"schema":1480349193877,"blockID":"i624","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n","name":"WiseConvert","created":"2014-06-18T13:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ed57d7a6-5996-c7da-8e07-1ad125183e84","last_modified":1480349199446},{"guid":"{f894a29a-f065-40c3-bb19-da6057778493}","prefs":[],"schema":1480349193877,"blockID":"i742","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:46:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d8334e-4b7c-4336-2d90-e6aa2d783967","last_modified":1480349199083},{"guid":"plugin@analytic-s.com","prefs":[],"schema":1480349193877,"blockID":"i467","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935797","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Analytics","created":"2013-11-07T14:08:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffbed3f3-e5c9-bc6c-7530-f68f47b7efd6","last_modified":1480349199026},{"guid":"{C4A4F5A0-4B89-4392-AFAC-D58010E349AF}","prefs":[],"schema":1480349193877,"blockID":"i678","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=895668","who":"All Firefox users who have this add-on installed. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"This add-on is generally silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"DataMngr","created":"2014-07-23T14:12:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"151021fc-ce4e-a734-e075-4ece19610f64","last_modified":1480349198947},{"guid":"HxLVJK1ioigz9WEWo8QgCs3evE7uW6LEExAniBGG@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1036","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211170","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Mega Player (malware)","created":"2015-10-05T16:37:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32e34b41-a73c-72d4-c96c-136917ad1d4d","last_modified":1480349198894},{"guid":"{6af08a71-380e-42dd-9312-0111d2bc0630}","prefs":[],"schema":1480349193877,"blockID":"i822","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1126353","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hiding itself in the Add-ons Manager, and keeping track of certain user actions.","name":"{6af08a71-380e-42dd-9312-0111d2bc0630} (malware)","created":"2015-01-27T09:50:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96d0c12b-a6cf-4539-c1cf-a1c75c14ff24","last_modified":1480349198826},{"guid":"colmer@yopmail.com","prefs":[],"schema":1480349193877,"blockID":"i550","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=968445","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2014-02-06T15:49:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c394d10b-384e-cbd0-f357-9c521715c373","last_modified":1480349198744},{"guid":"fplayer@adobe.flash","prefs":[],"schema":1480349193877,"blockID":"i444","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=909433","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-08-26T14:49:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c6557989-1b59-72a9-da25-b816c4a4c723","last_modified":1480349198667},{"guid":"{6E19037A-12E3-4295-8915-ED48BC341614}","prefs":[],"schema":1480349193877,"blockID":"i24","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=615518","who":"Users of RelevantKnowledge version 1.3.328.4 and older in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"comScore RelevantKnowledge","created":"2011-03-02T17:42:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.328.4","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"7c189c5e-f95b-0aef-e9e3-8e879336503b","last_modified":1480349198606},{"guid":"crossriderapp4926@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i91","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=754648","who":"All Firefox users who have installed this add-on.","why":"Versions of this add-on prior to 0.81.44 automatically post message to users' walls and hide them from their view. Version 0.81.44 corrects this.","name":"Remove My Timeline (malware)","created":"2012-05-14T14:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.81.43","minVersion":"0","targetApplication":[]}],"id":"5ee3e72e-96fb-c150-fc50-dd581e960963","last_modified":1480349198547},{"guid":"/^(93abedcf-8e3a-4d02-b761-d1441e437c09@243f129d-aee2-42c2-bcd1-48858e1c22fd\\.com|9acfc440-ac2d-417a-a64c-f6f14653b712@09f9a966-9258-4b12-af32-da29bdcc28c5\\.com|58ad0086-1cfb-48bb-8ad2-33a8905572bc@5715d2be-69b9-4930-8f7e-64bdeb961cfd\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i544","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:51:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d8d25967-9814-3b65-0787-a0525c16e11e","last_modified":1480349198510},{"guid":"wHO@W9.net","prefs":[],"schema":1480349193877,"blockID":"i980","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1192468","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"BestSavEFOrYoU (malware)","created":"2015-08-11T11:20:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4beb917f-68f2-1f91-beed-dff6d83006f8","last_modified":1480349198483},{"guid":"frhegnejkgner@grhjgewfewf.com","prefs":[],"schema":1480349193877,"blockID":"i1040","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212451","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Async Codec (malware)","created":"2015-10-07T13:03:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb6ab4ce-5517-bd68-2cf7-a93a109a528a","last_modified":1480349198458},{"guid":"firefox@luckyleap.net","prefs":[],"schema":1480349193877,"blockID":"i471","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3a9e04c7-5e64-6297-8442-2816915aad77","last_modified":1480349198433},{"guid":"lugcla21@gmail.com","prefs":[],"schema":1480349193877,"blockID":"i432","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902072","who":"All Firefox users who have this add-on installed.","why":"This add-on includes malicious code that spams users' Facebook accounts with unwanted messages.","name":"FB Color Changer (malware)","created":"2013-08-06T13:16:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b6943f35-9429-1f8e-bf8e-fe37979fe183","last_modified":1480349198372},{"guid":"{99079a25-328f-4bd4-be04-00955acaa0a7}","prefs":[],"schema":1480349193877,"blockID":"i402","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16008331-8b47-57c8-a6f7-989914d1cb8a","last_modified":1480349198341},{"guid":"{81b13b5d-fba1-49fd-9a6b-189483ac548a}","prefs":[],"schema":1480349193877,"blockID":"i473","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:43Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"76debc7b-b875-6da4-4342-1243cbe437f6","last_modified":1480349198317},{"guid":"{e935dd68-f90d-46a6-b89e-c4657534b353}","prefs":[],"schema":1480349193877,"blockID":"i732","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sites Pro","created":"2014-10-16T16:38:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"97fdc235-ac1a-9f20-1b4a-17c2f0d89ad1","last_modified":1480349198260},{"guid":"{32da2f20-827d-40aa-a3b4-2fc4a294352e}","prefs":[],"schema":1480349193877,"blockID":"i748","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:02:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6c980c8e-4a3c-7912-4a3a-80add457575a","last_modified":1480349198223},{"guid":"chinaescapeone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i431","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":"F-Secure Security Pack (malware)","created":"2013-08-05T16:43:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fbd89a9d-9c98-8481-e4cf-93e327ca8be1","last_modified":1480349198192},{"guid":"{cc6cc772-f121-49e0-b1f0-c26583cb0c5e}","prefs":[],"schema":1480349193877,"blockID":"i716","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor","created":"2014-10-02T12:12:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"debcd28c-884b-ca42-d983-6fabf91034dd","last_modified":1480349198148},{"guid":"{906000a4-88d9-4d52-b209-7a772970d91f}","prefs":[],"schema":1480349193877,"blockID":"i474","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"326d05b9-ace7-67c6-b094-aad926c185a5","last_modified":1480349197744},{"guid":"{AB2CE124-6272-4b12-94A9-7303C7397BD1}","prefs":[],"schema":1480349193877,"blockID":"i20","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=627278","who":"Users of Skype extension versions below 5.2.0.7165 for all versions of Firefox.","why":"This add-on causes a high volume of Firefox crashes and introduces severe performance issues. Please <a href=\"http://www.skype.com/intl/en/get-skype/on-your-computer/click-and-call/\">update to the latest version</a>. For more information, please <a href=\"http://blog.mozilla.com/addons/2011/01/20/blocking-the-skype-toolbar-in-firefox/\">read our announcement</a>.","name":"Skype extension","created":"2011-01-20T18:39:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.2.0.7164","minVersion":"0.1","targetApplication":[]}],"id":"60e16015-1803-197a-3241-484aa961d18f","last_modified":1480349197667},{"guid":"f6682b47-e12f-400b-9bc0-43b3ccae69d1@39d6f481-b198-4349-9ebe-9a93a86f9267.com","prefs":[],"schema":1480349193877,"blockID":"i682","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1043017","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"enformation","created":"2014-08-04T16:07:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a7ae65cd-0869-67e8-02f8-6d22c56a83d4","last_modified":1480349197636},{"guid":"rally_toolbar_ff@bulletmedia.com","prefs":[],"schema":1480349193877,"blockID":"i537","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950267","who":"All Firefox users who have this extension installed. If you want to continue using it, you can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"Rally Toolbar","created":"2014-01-23T15:51:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4ac6eb63-b51a-3296-5b02-bae77f424032","last_modified":1480349197604},{"guid":"x77IjS@xU.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i774","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YoutubeAdBlocke","created":"2014-10-31T16:22:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4771da14-bcf2-19b1-3d71-bc61a1c7d457","last_modified":1480349197578},{"guid":"{49c53dce-afa0-49a1-a08b-2eb8e8444128}","prefs":[],"schema":1480349193877,"blockID":"i441","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844985","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"ytbyclick","created":"2013-08-09T16:58:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f08d720-58c2-6acb-78ad-7af45c82c90b","last_modified":1480349197550},{"guid":"{bb7b7a60-f574-47c2-8a0b-4c56f2da9802}","prefs":[],"schema":1480349193877,"blockID":"i754","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080850","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite","created":"2014-10-17T16:27:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f222ceb2-9b69-89d1-8dce-042d8131a12e","last_modified":1480349197500},{"guid":"/^((34qEOefiyYtRJT@IM5Munavn\\.com)|(Mro5Fm1Qgrmq7B@ByrE69VQfZvZdeg\\.com)|(KtoY3KGxrCe5ie@yITPUzbBtsHWeCdPmGe\\.com)|(9NgIdLK5Dq4ZMwmRo6zk@FNt2GCCLGyUuOD\\.com)|(NNux7bWWW@RBWyXdnl6VGls3WAwi\\.com)|(E3wI2n@PEHTuuNVu\\.com)|(2d3VuWrG6JHBXbQdbr@3BmSnQL\\.com))$/","prefs":[],"schema":1480349193877,"blockID":"i324","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:48:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5be3a399-af3e-644e-369d-628273b3fdc2","last_modified":1480349197432},{"guid":"{8f894ed3-0bf2-498e-a103-27ef6e88899f}","prefs":[],"schema":1480349193877,"blockID":"i792","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ExtraW","created":"2014-11-26T13:49:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bebc9e15-59a1-581d-0163-329d7414edff","last_modified":1480349197368},{"guid":"profsites@pr.com","prefs":[],"schema":1480349193877,"blockID":"i734","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.\r\n","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSites","created":"2014-10-16T16:39:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d6d84d7-0b3f-c5ab-57cc-6b66b0775a23","last_modified":1480349197341},{"guid":"{872b5b88-9db5-4310-bdd0-ac189557e5f5}","prefs":[],"schema":1480349193877,"blockID":"i497","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945530","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making settings changes that can't be easily reverted.","name":"DVDVideoSoft Menu","created":"2013-12-03T16:08:09Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e8da89c4-c585-77e4-9872-591d20723a7e","last_modified":1480349197240},{"guid":"123456789@offeringmedia.com","prefs":[],"schema":1480349193877,"blockID":"i664","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036757","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that attempts to hide itself by impersonating the Adobe Flash plugin.","name":"Taringa MP3 / Adobe Flash","created":"2014-07-10T15:41:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d0a7dda-d92a-c8e2-21be-c92b0a88ac8d","last_modified":1480349197208},{"guid":"{df6bb2ec-333b-4267-8c4f-3f27dc8c6e07}","prefs":[],"schema":1480349193877,"blockID":"i487","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940681","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Facebook 2013 (malware)","created":"2013-11-19T14:59:45Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5867c409-b342-121e-3c3b-426e2f0ba1d4","last_modified":1480349197109},{"guid":"/^({4e988b08-8c51-45c1-8d74-73e0c8724579}|{93ec97bf-fe43-4bca-a735-5c5d6a0a40c4}|{aed63b38-7428-4003-a052-ca6834d8bad3}|{0b5130a9-cc50-4ced-99d5-cda8cc12ae48}|{C4CFC0DE-134F-4466-B2A2-FF7C59A8BFAD})$/","prefs":[],"schema":1480349193877,"blockID":"i524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:43:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a3a26a2-cdaa-e5ba-f6ac-47b98ae2cc26","last_modified":1480349197082},{"guid":"{87b5a11e-3b54-42d2-9102-0a7cb1f79ebf}","prefs":[],"schema":1480349193877,"blockID":"i838","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:29:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba0e57c-4c0c-4eb6-26e7-c2016769c343","last_modified":1480349196965},{"guid":"/^({bf67a47c-ea97-4caf-a5e3-feeba5331231}|{24a0cfe1-f479-4b19-b627-a96bf1ea3a56})$/","prefs":[],"schema":1480349193877,"blockID":"i542","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:10:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fc442b64-1b5d-bebb-c486-f431b154f3db","last_modified":1480349196622},{"guid":"/^({ebd898f8-fcf6-4694-bc3b-eabc7271eeb1}|{46008e0d-47ac-4daa-a02a-5eb69044431a}|{213c8ed6-1d78-4d8f-8729-25006aa86a76}|{fa23121f-ee7c-4bd8-8c06-123d087282c5}|{19803860-b306-423c-bbb5-f60a7d82cde5})$/","prefs":[],"schema":1480349193877,"blockID":"i622","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"WiseConvert","created":"2014-06-18T13:48:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffd184fa-aa8f-8a75-ff00-ce285dec5b22","last_modified":1480349196597},{"guid":"/^({fa95f577-07cb-4470-ac90-e843f5f83c52}|ffxtlbr@speedial\\.com)$/","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i696","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1031115","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are silently installed and change homepage and search defaults without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. They are also distributed under more than one add-on ID.","name":"Speedial","created":"2014-08-21T13:55:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"130c7419-f727-a2fb-3891-627bc69a43bb","last_modified":1480349196565},{"guid":"pennerdu@faceobooks.ws","prefs":[],"schema":1480349193877,"blockID":"i442","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=904050","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Console Video (malware)","created":"2013-08-13T14:00:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb83e48e-a780-9d06-132c-9ecc65b43674","last_modified":1480349196541},{"guid":"{E90FA778-C2B7-41D0-9FA9-3FEC1CA54D66}","prefs":[],"schema":1480349193877,"blockID":"i446","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=788838","who":"All Firefox users who have this add-on installed. The add-on can be enabled again in the Add-ons Manager.","why":"This add-on is installed silently, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YouTube to MP3 Converter","created":"2013-09-06T15:59:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"83eb6337-a3b6-84e4-e76c-ee9200b80796","last_modified":1480349196471},{"guid":"{ad7ce998-a77b-4062-9ffb-1d0b7cb23183}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i804","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:53:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"633f9999-c81e-bd7a-e756-de7d34feb39d","last_modified":1480349196438},{"guid":"dodatek@flash2.pl","prefs":[],"schema":1480349193877,"blockID":"i1279","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"Any user with version 1.3 or newer of this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja Flash WORK addon","created":"2016-10-27T15:52:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.3","targetApplication":[]}],"id":"2dab5211-f9ec-a1bf-c617-6f94f28b5ee1","last_modified":1480349196331},{"guid":"{2d069a16-fca1-4e81-81ea-5d5086dcbd0c}","prefs":[],"schema":1480349193877,"blockID":"i440","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=903647","who":"All Firefox users who have this add-on installed.","why":"This add-on is installed silently and doesn't follow many other of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you want to continue using this add-on, you can enable it in the Add-ons Manager.","name":"GlitterFun","created":"2013-08-09T16:26:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3f77f3c-b1d6-3b29-730a-846007b9cb16","last_modified":1480349196294},{"guid":"xivars@aol.com","prefs":[],"schema":1480349193877,"blockID":"i501","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946420","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2013-12-04T15:34:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3303d201-7006-3c0d-5fd5-45503e2e690c","last_modified":1480349196247},{"guid":"2bbadf1f-a5af-499f-9642-9942fcdb7c76@f05a14cc-8842-4eee-be17-744677a917ed.com","prefs":[],"schema":1480349193877,"blockID":"i700","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052599","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is widely considered malware and is apparently installed silently into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PIX Image Viewer","created":"2014-08-21T16:15:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b72889b-90e6-ea58-4fe8-d48257df7d8b","last_modified":1480349196212},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i600","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:16:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.5.*","minVersion":"3.15.5","targetApplication":[]}],"id":"51c4ab3b-9ad3-c5c3-98c8-a220025fc5a3","last_modified":1480349196158},{"guid":"{729c9605-0626-4792-9584-4cbe65b243e6}","prefs":[],"schema":1480349193877,"blockID":"i788","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Ext Assistance","created":"2014-11-20T10:07:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3c588238-2501-6a53-65ea-5c8ff0f3e51d","last_modified":1480349196123},{"guid":"webbooster@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i630","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:49:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d894ea79-8215-7a0c-b0e9-be328c3afceb","last_modified":1480349196032},{"guid":"firefox@bandoo.com","prefs":[],"schema":1480349193877,"blockID":"i23","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629634","who":"Users of Bandoo version 5.0 for Firefox 3.6 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Bandoo","created":"2011-03-01T23:30:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.0","minVersion":"5.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"bd487cf4-3f6a-f956-a6e9-842ac8deeac5","last_modified":1480349195915},{"guid":"5nc3QHFgcb@r06Ws9gvNNVRfH.com","prefs":[],"schema":1480349193877,"blockID":"i372","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=875752","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware pretending to be the Flash Player plugin.","name":"Flash Player 11 (malware)","created":"2013-06-18T13:23:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dc71fcf5-fae4-5a5f-6455-ca7bbe4202db","last_modified":1480349195887},{"guid":"/^(7tG@zEb\\.net|ru@gfK0J\\.edu)$/","prefs":[],"schema":1480349193877,"blockID":"i854","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=952255","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"youtubeadblocker (malware)","created":"2015-02-09T15:41:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cfe42207-67a9-9b88-f80c-994e6bdd0c55","last_modified":1480349195851},{"guid":"{a7aae4f0-bc2e-a0dd-fb8d-68ce32c9261f}","prefs":[],"schema":1480349193877,"blockID":"i378","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=865090","who":"All Firefox users who have installed this add-on.","why":"This extension is malware that hijacks Facebook accounts for malicious purposes.","name":"Myanmar Extension for Facebook (malware)","created":"2013-06-18T15:58:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30ecd9b9-4023-d9ef-812d-f1a75bb189b0","last_modified":1480349195823},{"guid":"crossriderapp5060@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i228","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=810016","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and it overrides user preferences and inserts advertisements in web content.","name":"Savings Sidekick","created":"2012-11-29T16:31:13Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a37f76ac-7b77-b5a3-bac8-addaacf34bae","last_modified":1480349195769},{"guid":"/^(saamazon@mybrowserbar\\.com)|(saebay@mybrowserbar\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i672","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011337","who":"All Firefox users who have these add-ons installed. Users wishing to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-07-22T15:13:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e072a461-ee5a-c83d-8d4e-5686eb585a15","last_modified":1480349195347},{"guid":"{b99c8534-7800-48fa-bd71-519a46cdc7e1}","prefs":[],"schema":1480349193877,"blockID":"i596","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011325","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseMark","created":"2014-06-12T13:19:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f411bb0f-7c82-9061-4a80-cabc8ff45beb","last_modified":1480349195319},{"guid":"/^({94d62e35-4b43-494c-bf52-ba5935df36ef}|firefox@advanceelite\\.com|{bb7b7a60-f574-47c2-8a0b-4c56f2da9802})$/","prefs":[],"schema":1480349193877,"blockID":"i856","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130323","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite (malware)","created":"2015-02-09T15:51:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3d52650-d3e2-4cef-71f7-e6188f56fe4d","last_modified":1480349195286},{"guid":"{458fb825-2370-4973-bf66-9d7142141847}","prefs":["app.update.auto","app.update.enabled","app.update.interval","app.update.url"],"schema":1480349193877,"blockID":"i1024","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1209588","who":"All users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on hides itself in the Add-ons Manager, interrupts the Firefox update process, and reportedly causes other problems to users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Shield","created":"2015-09-29T09:25:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32c5baa7-d547-eaab-302d-b873c83bfe2d","last_modified":1480349195258},{"guid":"{f2456568-e603-43db-8838-ffa7c4a685c7}","prefs":[],"schema":1480349193877,"blockID":"i778","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sup-SW","created":"2014-11-07T13:53:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"93568fa2-0cb7-4e1d-e893-d7261e81547c","last_modified":1480349195215},{"guid":"{77BEC163-D389-42c1-91A4-C758846296A5}","prefs":[],"schema":1480349193877,"blockID":"i566","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964594","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-on Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-03-05T13:20:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"080edbac-25d6-e608-abdd-feb1ce7a9a77","last_modified":1480349195185},{"guid":"helper@vidscrab.com","prefs":[],"schema":1480349193877,"blockID":"i1077","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1231010","who":"All Firefox users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on injects remote scripts and injects unwanted content into web pages.","name":"YouTube Video Downloader (from AddonCrop)","created":"2016-01-14T14:32:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36b2e1e0-5fda-bde3-db55-dfcbe24dfd04","last_modified":1480349195157},{"guid":"jid1-XLjasWL55iEE1Q@jetpack","prefs":[],"schema":1480349193877,"blockID":"i578","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1002037","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that presents itself as \"Flash Player\" but is really injecting unwanted content into Facebook pages.","name":"Flash Player (malware)","created":"2014-04-28T16:25:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1e75b2f0-02fc-77a4-ad2f-52a4caff1a71","last_modified":1480349195058},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1480349193877,"blockID":"i142","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=792132","who":"Todos los usuarios de Firefox que instalaron la versi\u00f3n 4.2 del complemento Cuevana Stream.\r\n\r\nAll Firefox users who have installed version 4.2 of the Cuevana Stream add-on.","why":"<strong>Espa\u00f1ol</strong>\r\nUna versi\u00f3n maliciosa del complemento Cuevana Stream (4.2) fue colocada en el sitio Cuevana y distribuida a muchos usuarios del sitio. Esta versi\u00f3n recopila informaci\u00f3n de formularios web y los env\u00eda a una direcci\u00f3n remota con fines maliciosos. Se le recomienda a todos los usuarios que instalaron esta versi\u00f3n que cambien sus contrase\u00f1as inmediatamente, y que se actualicen a la nueva versi\u00f3n segura, que es la 4.3.\r\n\r\n<strong>English</strong>\r\nA malicious version of the Cuevana Stream add-on (4.2) was uploaded to the Cuevana website and distributed to many of its users. This version takes form data and sends it to a remote location with malicious intent. It is recommended that all users who installed this version to update their passwords immediately, and update to the new safe version, version 4.3.\r\n\r\n","name":"Cuevana Stream (malicious version)","created":"2012-09-18T13:37:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"4.2","minVersion":"4.2","targetApplication":[]}],"id":"91e551b9-7e94-60e2-f1bd-52f25844ab16","last_modified":1480349195007},{"guid":"{34712C68-7391-4c47-94F3-8F88D49AD632}","prefs":[],"schema":1480349193877,"blockID":"i922","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:27:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"dd350efb-34ac-2bb5-5afd-eed722dbb916","last_modified":1480349194976},{"guid":"PDVDZDW52397720@XDDWJXW57740856.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i846","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128320","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ge-Force","created":"2015-02-06T15:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c33e950c-c977-ed89-c86a-3be8c4be1967","last_modified":1480349194949},{"guid":"discoverypro@discoverypro.com","prefs":[],"schema":1480349193877,"blockID":"i582","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004231","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enabled it in the Add-ons Manager.","why":"This add-on is silently installed by the CNET installer for MP3 Rocket and probably other software packages. This is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Discovery Pro","created":"2014-04-30T16:10:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"34eab242-6fbc-a459-a89e-0dc1a0b8355d","last_modified":1480349194878},{"guid":"jid1-bKSXgRwy1UQeRA@jetpack","prefs":[],"schema":1480349193877,"blockID":"i680","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=979856","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into user's systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Trusted Shopper","created":"2014-08-01T16:34:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f701b790-b266-c69d-0fba-f2d189cb0f34","last_modified":1480349194851},{"guid":"bcVX5@nQm9l.org","prefs":[],"schema":1480349193877,"blockID":"i848","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128266","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"boomdeal","created":"2015-02-09T15:21:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8d6d4e1-b9e6-07f5-2b49-192106a45d82","last_modified":1480349194799},{"guid":"aytac@abc.com","prefs":[],"schema":1480349193877,"blockID":"i504","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947341","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-06T12:07:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bfaf8298-dd69-165c-e1ed-ad55584abd18","last_modified":1480349194724},{"guid":"Adobe@flash.com","prefs":[],"schema":1480349193877,"blockID":"i136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=790100","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware posing as a legitimate Adobe product.","name":"Adobe Flash (malware)","created":"2012-09-10T16:09:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"47ac744e-3176-5cb6-1d02-b460e0c7ada0","last_modified":1480349194647},{"guid":"{515b2424-5911-40bd-8a2c-bdb20286d8f5}","prefs":[],"schema":1480349193877,"blockID":"i491","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940753","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"Connect DLC","created":"2013-11-29T14:52:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d658443-b34a-67ad-934e-cbf7cd407460","last_modified":1480349194580},{"guid":"/^({3f3cddf8-f74d-430c-bd19-d2c9147aed3d}|{515b2424-5911-40bd-8a2c-bdb20286d8f5}|{17464f93-137e-4646-a0c6-0dc13faf0113}|{d1b5aad5-d1ae-4b20-88b1-feeaeb4c1ebc}|{aad50c91-b136-49d9-8b30-0e8d3ead63d0})$/","prefs":[],"schema":1480349193877,"blockID":"i516","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947478","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and being distributed under multiple add-on IDs.","name":"Connect DLC","created":"2013-12-20T12:38:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96f8e157-8b8b-8e2e-76cd-6850599b4370","last_modified":1480349194521},{"guid":"wxtui502n2xce9j@no14","prefs":[],"schema":1480349193877,"blockID":"i1012","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1206157","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Video fix (malware)","created":"2015-09-21T13:04:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"246798ac-25fa-f4a4-258c-a71f9f6ae091","last_modified":1480349194463},{"guid":"flashX@adobe.com","prefs":[],"schema":1480349193877,"blockID":"i168","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=807052","who":"All Firefox users who have this add-on installed.","why":"This is an exploit proof-of-concept created for a conference presentation, which will probably be copied and modified for malicious purposes. \r\n","name":"Zombie Browser Pack","created":"2012-10-30T12:07:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d7c69812-801c-8d8e-12cb-c5171bdc48a1","last_modified":1480349194428},{"guid":"{4889ddce-7a83-45e6-afc9-1e4f1149fff4}","prefs":[],"schema":1480343836083,"blockID":"i840","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:30:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be600f35-0633-29f3-c571-819e19d85db9","last_modified":1480349193867},{"guid":"{55dce8ba-9dec-4013-937e-adbf9317d990","prefs":[],"schema":1480343836083,"blockID":"i690","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048647","who":"All Firefox users. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Deal Keeper","created":"2014-08-12T16:23:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"512b0d40-a10a-5ddc-963b-b9c487eb1422","last_modified":1480349193833},{"guid":"/^new@kuot\\.pro|{13ec6687-0b15-4f01-a5a0-7a891c18e4ee}|rebeccahoppkins(ty(tr)?)?@gmail\\.com|{501815af-725e-45be-b0f2-8f36f5617afc}|{9bdb5f1f-b1e1-4a75-be31-bdcaace20a99}|{e9d93e1d-792f-4f95-b738-7adb0e853b7b}|dojadewaskurwa@gmail\\.com$/","prefs":[],"schema":1480343836083,"blockID":"i1414","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"All users who have this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja dodatku Flash (malware)","created":"2016-10-28T18:06:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5cebc983-bc88-d5f8-6807-bd1cbfcd82fd","last_modified":1480349193798},{"guid":"{58d2a791-6199-482f-a9aa-9b725ec61362}","prefs":[],"schema":1480343836083,"blockID":"i746","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:01:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc7d0-635c-b74a-de9f-16eb5837b36a","last_modified":1480349193730},{"guid":"{94cd2cc3-083f-49ba-a218-4cda4b4829fd}","prefs":[],"schema":1480343836083,"blockID":"i590","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1013678","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' profiles, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Value Apps","created":"2014-06-03T16:12:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"556b8d4d-d6c2-199d-9f33-8eccca07e8e7","last_modified":1480349193649},{"guid":"contentarget@maildrop.cc","prefs":[],"schema":1480343836083,"blockID":"i818","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119971","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Astro Play (malware)","created":"2015-01-12T09:29:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"440e9923-027a-6089-e036-2f78937dc193","last_modified":1480349193622},{"guid":"noOpus@outlook.com","prefs":[],"schema":1480343836083,"blockID":"i816","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119659","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"Full Screen (malware)","created":"2015-01-09T12:52:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b64d7cef-8b6c-2575-16bc-732fca7db377","last_modified":1480349193537},{"guid":"{c95a4e8e-816d-4655-8c79-d736da1adb6d}","prefs":[],"schema":1480343836083,"blockID":"i433","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield","created":"2013-08-09T11:25:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b3168278-a8ae-4882-7f26-355bc362bed0","last_modified":1480349193510},{"guid":"{9802047e-5a84-4da3-b103-c55995d147d1}","prefs":[],"schema":1480343836083,"blockID":"i722","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Finder Pro","created":"2014-10-07T12:58:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50097c29-26b1-bf45-ffe1-83da217eb127","last_modified":1480349193482},{"guid":"/^({bf9194c2-b86d-4ebc-9b53-1c08b6ff779e}|{61a83e16-7198-49c6-8874-3e4e8faeb4f3}|{f0af464e-5167-45cf-9cf0-66b396d1918c}|{5d9968c3-101c-4944-ba71-72d77393322d}|{01e86e69-a2f8-48a0-b068-83869bdba3d0})$/","prefs":[],"schema":1480343836083,"blockID":"i515","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:26:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"029fa6f9-2351-40b7-5443-9a66e057f199","last_modified":1480349193449},{"guid":"/^({d50bfa5f-291d-48a8-909c-5f1a77b31948}|{d54bc985-6e7b-46cd-ad72-a4a266ad879e}|{d89e5de3-5543-4363-b320-a98cf150f86a}|{f3465017-6f51-4980-84a5-7bee2f961eba}|{fae25f38-ff55-46ea-888f-03b49aaf8812})$/","prefs":[],"schema":1480343836083,"blockID":"i1137","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"252e18d0-85bc-7bb3-6197-5f126424c9b3","last_modified":1480349193419},{"guid":"ffxtlbr@claro.com","prefs":[],"schema":1480343836083,"blockID":"i218","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=816762","who":"All Firefox users who have installed this add-on.","why":"The Claro Toolbar is side-installed with other software, unexpectedly changing users' settings and then making it impossible for these settings to be reverted by users.","name":"Claro Toolbar","created":"2012-11-29T16:07:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e017a3b2-9b37-b8a0-21b0-bc412ae8a7f4","last_modified":1480349193385},{"guid":"/^(j003-lqgrmgpcekslhg|SupraSavings|j003-dkqonnnthqjnkq|j003-kaggrpmirxjpzh)@jetpack$/","prefs":[],"schema":1480343836083,"blockID":"i692","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048656","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SupraSavings","created":"2014-08-12T16:27:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b0d30256-4581-1489-c241-d2e85b6c38f4","last_modified":1480349193295},{"guid":"helperbar@helperbar.com","prefs":[],"schema":1480343836083,"blockID":"i258","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=817786","who":"All Firefox users who have this add-on installed. This only applies to version 1.0 of Snap.do. Version 1.1 fixed all the issues for which this block was created.","why":"This extension violates a number of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, particularly on installation and settings handling. It also causes some stability problems in Firefox due to the way the toolbar is handled.\r\n\r\nUsers who wish to keep the add-on enabled can enable it again in the Add-ons Manager.","name":"Snap.do","created":"2013-01-28T13:52:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"0","targetApplication":[]}],"id":"f1ede5b8-7757-5ec5-d8ed-1a01889154aa","last_modified":1480349193254},{"guid":"/^((support2_en@adobe14\\.com)|(XN4Xgjw7n4@yUWgc\\.com)|(C7yFVpIP@WeolS3acxgS\\.com)|(Kbeu4h0z@yNb7QAz7jrYKiiTQ3\\.com)|(aWQzX@a6z4gWdPu8FF\\.com)|(CBSoqAJLYpCbjTP90@JoV0VMywCjsm75Y0toAd\\.com)|(zZ2jWZ1H22Jb5NdELHS@o0jQVWZkY1gx1\\.com))$/","prefs":[],"schema":1480343836083,"blockID":"i326","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:49:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3142020b-8af9-1bac-60c5-ce5ad0ff3d42","last_modified":1480349193166},{"guid":"newmoz@facebook.com","prefs":[],"schema":1480343836083,"blockID":"i576","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=997986","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook user accounts and sends spam on the user's behalf.","name":"Facebook Service Pack (malware)","created":"2014-04-22T14:34:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d85798d3-9b87-5dd9-ace2-64914b93df77","last_modified":1480349193114},{"guid":"{0F827075-B026-42F3-885D-98981EE7B1AE}","prefs":[],"schema":1480343836083,"blockID":"i334","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=862272","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-04-16T13:25:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad4545f-8f9d-dd53-2aa8-e8945cad6185","last_modified":1480349192987}]}
\ No newline at end of file
+{"data":[{"guid":"/^((\\{329fc2d4-30d7-48b7-8247-4a4bb7682da8\\})|(\\{5738de0c-38f0-4e38-a01e-8553ec09235c\\})|(\\{bc775a74-c002-4e99-bf4d-ad9a806263dd\\})|(\\{1272ff2b-0339-4d10-9297-cb0e90a2be0e\\})|(\\{e5771c28-c725-43b0-b8d4-5d4acd072b7d\\}))$/","prefs":[],"schema":1586806901368,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1629790","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a02c6a6-ef2e-4b46-ab67-49157ed9e49c","last_modified":1586977183602},{"guid":"/^((\\{39262546-d73e-4259-ba57-b772473106a3\\})|(\\{f6e51fb0-9724-4c86-aa95-12d20c77a7fa\\})|(\\{805466a4-90a7-48a3-85bb-bad244244a85\\})|(\\{60cfdc21-74c4-42bb-9b9f-9688f1a22e17\\})|(\\{c96f35f7-9ca8-4119-8d08-aaf1f5231fa7\\})|(\\{057b25cd-d923-4faf-828b-47d36f069a40\\})|(\\{1c5a9f06-a63b-49c4-9d66-563c7a9ed059\\})|(\\{61e204ba-f49f-41e4-8d38-0cbf003e3ea8\\})|(\\{139b5a73-e8ae-496a-b0eb-2bc4de518fc6\\})|(\\{59b82710-8c63-4d82-bc16-64f6bda5cd20\\})|(\\{bfe32796-ee0b-4271-a5d2-81938374395f\\})|(\\{ef5353b7-cf92-40e9-8f5c-93210015b15f\\}))$/","prefs":[],"schema":1586956158067,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1630241","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Cryptowallet Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"17d89613-a8c6-4e49-a5c7-e9eac64133f1","last_modified":1586977183599},{"guid":"/^((spylog@cfsoft\\.com)|(\\{7cb9bddc-8c0e-4b4e-92df-3735e3db909a\\})|(\\{8c64047e-20da-45f2-998d-f852e0886c70\\})|(\\{684a1175-31b9-478a-845f-ab332d0c0ec3\\})|(vni@vietbacsecurity\\.com)|(\\{95e9e74d-4318-4f14-939d-24ec61ed6657\\})|(blockpopup@vietbacsecurity\\.com)|(blocallpopup@vietbacsecurity\\.com)|(Vanga@vietbacsecurity\\.com)|(sontung@vietbacsecurity\\.com)|(TiengViet@vietbacsecurity\\.com)|(Pomodorotimer@vietbacsecurity\\.com)|(Clock@vietbacsecurity\\.com)|(alarmclock@vietbacsecurity\\.com)|(gotiengviet@vietbacsecurity\\.com)|(location@vietbacsecurity\\.com)|(Amlich@vietbacsecurity\\.com)|(lich@vietbacsecurity\\.com)|(lichx@vietbacsecurity\\.com)|(Bitcoin@vietbacsecurity\\.com)|(thoitiet@vietbacsecurity\\.com)|(Bitcointovnd@vietbacsecurity\\.com)|(font@vietbacsecurity\\.com)|(porn@vietbacsecurity\\.com)|(TiengVietkhongdau@vietbacsecurity\\.com)|(Calendar@vietbacsecurity\\.com)|(007@vietbacsecurity\\.com)|(spymyself@vietbacsecurity\\.com)|(youtubedl@vietbacsecurity\\.com)|(adminaaa@vietbacsecurity\\.com)|(adminaaaq@vietbacsecurity\\.com)|(adminaaan@vietbacsecurity\\.com)|(adminaaank@vietbacsecurity\\.com)|(admindsa@vietbacsecurity\\.com)|(admindsak@vietbacsecurity\\.com)|(admdin@vietbacsecurity\\.com)|(admins@vietbacsecurity\\.com)|(cotuong@vietbacsecurity\\.com)|(\\{a127afcb-7284-40aa-aac2-cbe0fdd4491d\\})|(\\{9c07f8ad-57dc-459f-b07c-96900e8a3806\\})|(\\{c2c59ff7-83e6-4988-8c1d-473d8ac76bba\\})|(\\{8f0e655a-22ee-43bb-97fc-80af74a4dc34\\})|(\\{49253a6c-eeb9-465c-bcf9-258f731dad9e\\})|(\\{c5542677-064b-4fce-876b-3e1ba30371a4\\})|(\\{7b786f87-2016-4752-a781-5f8b4c63241e\\})|(\\{4b768602-8729-4852-8587-d55169ce67e9\\})|(\\{04c37c01-32bd-4e4a-94bf-36d8175b0555\\})|(\\{743aeddb-e150-40e0-8091-e8b52e7225a4\\})|(\\{1b7f9ca4-0a14-4ef9-8ec3-3cd05efb683c\\})|(\\{e843a1e9-21a2-43ad-a1ff-34e430eae000\\})|(\\{92a420a0-5075-4126-8318-2ce8b4ef8746\\})|(\\{f204e4e2-c9d0-4a12-bbdf-20ae0346171e\\})|(\\{045504f3-13d3-420d-a8a2-74e6e548f5f8\\})|(\\{44c67012-6467-4925-9284-1ad3785e02fd\\})|(\\{709baa43-e321-4d09-80ad-bf41c93d49d5\\})|(\\{7679dbca-1b6e-4e9a-ae70-8fab1e541051\\})|(\\{46d6f718-bbf8-42de-85bf-07c7e2ee3db1\\})|(\\{9b4d83fa-395f-4c86-a897-7927ce9383e3\\})|(chudaibi@vietbacsecurity\\.com)|(\\{f55e480d-37ff-403c-9601-1380c8119b7a\\})|(\\{1c52bac9-b511-47e6-9492-51832b6d73ae\\})|(\\{f09be92f-8d2a-4294-b787-dee323ca52ef\\})|(\\{14e65683-b5ee-4e41-8083-c8138b0a30ed\\})|(\\{1c65312f-bbf4-4447-9fe5-433234eb4562\\})|(\\{f7d105c4-d341-4d17-b0ee-257cb1473a07\\})|(\\{12b5579f-eb13-4399-a902-2f36c3ad3447\\})|(\\{e3d1a35f-50eb-4125-9b0f-d26a59f88823\\})|(minh@41batrieu\\.com)|(\\{abb3fe45-b511-4d21-aa0c-0cd1fed6dffb\\})|(tocao@vietbacsecurity\\.com)|(\\{87cb22c4-7395-4658-bf65-a2c27c8f1e8c\\})|(\\{9324c255-2e6e-4b27-b4fa-5af7f6e167c6\\})|(\\{02d3a0c5-1f60-4824-b37f-9dc2c67ef9f2\\})|(\\{711e1a95-bc52-44de-bb17-ea24ed493e65\\})|(\\{c2fff0c1-601f-42e4-878f-c1cdd624c279\\}))$/","prefs":[],"schema":1586962120860,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1630297","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1c016cb6-d9b3-4a24-a887-1649b3ac2134","last_modified":1586977183595},{"guid":"{ab2186b0-8c0b-4921-a2d4-95e6e05c0e3c}","prefs":[],"schema":1586115691726,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1628040","why":"This ad-on violates Mozilla's Add-on policies by collecting user data without disclosure or consent.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"baf700c9-b165-4569-a247-8ced9b94fab1","last_modified":1586290176418},{"guid":"/^((\\{ddf1ef2e-af32-dd2f-0640-85ef6d10fb02\\})|(\\{b511c8c7-d036-7302-a1cf-4aefb16e8658\\})|(\\{1e939f19-1391-b8ba-3790-5d4404c43bb1\\})|(\\{7da26e3b-a032-bad1-857f-d19328d0ee12\\})|(\\{ff4cdb7a-d968-140e-6709-eea6c7e0d1fc\\})|(\\{63a8cb2c-5a8f-d848-272d-310e846a7bfb\\})|(\\{07b11f4d-d53b-f8df-1bc8-10773768a2d6\\})|(\\{e74124a5-c58e-a28d-9e96-d0fcb73e6905\\})|(\\{4c9f5729-16af-e8ff-5e07-7ee7ccc06665\\})|(\\{76f93d6c-ace1-28af-5e1b-d09442925b1a\\})|(\\{694226c5-3426-466d-d826-4dd70cc4260c\\})|(\\{ea403745-59f6-af83-4190-ab3b9fafd369\\})|(\\{cbe1950f-9a99-9d66-4060-12b9e85b675b\\})|(\\{874a192b-50de-af0f-53c0-76b54b4c5b76\\})|(\\{13bf414f-8444-9f88-e05a-5fb8be3bef6a\\})|(\\{7aaab407-a72e-c07a-5971-77a238b093e1\\})|(\\{d4d1feb4-71b9-a8e4-089f-699483413d32\\})|(\\{c7eef1d4-370d-8005-26e7-67ee1b76ef4d\\})|(\\{941e84f4-e93f-2bd3-be34-efc9be9f8b66\\})|(\\{256ac5f6-5fcb-44ac-eeb8-c65f4470c7e1\\})|(\\{84a0bb93-9422-8d02-b607-fd98f854837a\\})|(\\{c987166c-d73d-b9c1-0e21-51e9ea4d2df6\\})|(\\{8cc0f1c4-990a-5fb4-eb3b-bb455da8c268\\})|(\\{5b6512ff-d5fe-bebb-3862-43a9d7a7bcb4\\})|(\\{6885fd10-acd9-2987-0a27-583828c051df\\})|(\\{945b997e-4cf8-1476-76e8-4c0e489d57b8\\})|(\\{284e1fd3-5f68-c175-1cd5-9f8340543d61\\})|(\\{3b5f5ac5-9b7e-0d10-678c-100f39949103\\})|(\\{e2eda9e6-76b1-c5e0-6ab5-4a119db1f094\\})|(\\{e7c89b14-f86f-8f9e-4aa7-bf93f058c403\\})|(\\{57711d16-ab2e-7841-ddcc-3d245c9e53f4\\})|(\\{30017eef-489f-1557-cd23-bd588933e30d\\})|(\\{a376fa1e-0214-3b11-3260-f464aa202ff0\\})|(\\{ab64c65f-a4d5-ffee-61ec-635208ee910c\\})|(\\{c31b8bd4-6ba5-414f-5929-3b108372cfb5\\})|(\\{ef96f34d-6b17-687f-fdc2-b2286ef7c68e\\})|(\\{8238128c-7659-fb9c-a29e-ce5844273852\\})|(\\{27bbe28b-181e-6e1c-be31-bdd6404004b6\\})|(\\{d70e5451-61bb-9c6d-0913-4767c47d156a\\})|(\\{9c705bfa-89f2-a7c0-329d-d7dc4ad0b32b\\})|(\\{4af055a2-e1f3-6c2c-484a-dd12d651085d\\})|(\\{46a61b09-8b11-2334-9c1d-d057ac644702\\})|(\\{cca52e1f-857c-3654-3f8f-ba32136d0160\\})|(\\{04a32ec2-76c5-a8e0-49ac-aa51b36cf91c\\})|(\\{fc4bfc3d-666e-2687-5f77-2514854794ac\\})|(\\{8f11842c-4a65-d7b5-c12d-6fab43a5f51f\\})|(\\{8d08e6d2-e82f-ede4-089b-23184112b0b5\\})|(\\{7dd7b266-a9da-451a-47e7-b56fb5c77a40\\})|(\\{55636e59-2fac-a595-6a3d-42f4359b7f3a\\})|(\\{a6b75d85-0607-a71a-087e-6ecd5cd525ac\\})|(\\{b39ab5a0-3902-15c3-6fc1-ce45924dcf22\\})|(\\{90f781a4-3d9f-a1c1-c4a6-b446223bee6d\\})|(\\{047bdfe9-b256-d910-a2ff-aaef394e37bc\\})|(\\{3496aee8-1e4a-4a2d-d935-e9c60a1007da\\})|(\\{a197c072-4b06-440e-391e-d60a64bdcd6a\\})|(\\{13fd2e82-d19d-6ad0-b77a-3caaab77ee00\\})|(\\{0ac1543f-5b68-c8b8-9268-af4b51a0233d\\})|(\\{c3f2a253-e235-d612-9d44-e1d5a28fd883\\})|(\\{5ed4b053-1445-dd12-2118-9d697d40736b\\})|(\\{7c2c341e-c8a7-7806-cf00-0ed3a16496c9\\})|(\\{c1d30a2e-4b27-3730-da00-93c350122f57\\})|(\\{63b32739-1c43-d874-19db-5dd4d1ef2abc\\})|(\\{92bae4b7-ea7d-3fdb-b34c-20293af43734\\})|(\\{5fd29856-2296-49cc-37ee-4d0e4dc738ef\\})|(\\{c4487a30-f901-f358-8a05-23ac3cfa9469\\})|(\\{4a2169e8-1a23-378a-bc4b-5d3b817193a5\\})|(\\{5917dee3-e834-7514-6768-2324f39ebe90\\})|(\\{2986179a-af19-6571-79f8-1bb75de24f88\\})|(\\{8cfbe90c-eeb7-30b2-31ce-da719c1a63cf\\})|(\\{4617e32e-8a17-1fe9-d89c-7e8fffeca945\\})|(\\{de3d433a-af12-a27c-8886-113668435e8d\\})|(\\{52326034-27a5-2035-473b-46cf569866b9\\})|(\\{58172e8e-3cfb-9a0d-90a7-d9ae64537326\\})|(\\{530c001f-94f1-f453-dbc6-b89c30c36cf9\\})|(\\{38ea3f7d-6f09-2f03-e75f-de2bad37e84a\\})|(\\{82e77989-fe96-1895-c958-6a9a7c8955c5\\})|(\\{1baf2f92-1872-b460-7d6c-8fc1ccacedc9\\})|(\\{6f8c3be7-5264-bf34-b488-8991ebccb7b5\\})|(\\{82f650b6-57b2-3160-843b-c6b9c0aafd28\\})|(\\{ce0fda96-6059-e2bd-b61c-7e0ea9426c48\\})|(\\{77fe55df-763b-c6e1-6d5d-540d86a3f4d5\\})|(\\{3028912a-4002-ee0e-4a5a-ea060ddc1ed0\\})|(\\{8049c65e-6536-1556-f5a0-82745ba3a711\\})|(\\{43962ebd-ae57-d2d2-7660-8b501c66090c\\})|(\\{3be51fdd-4325-9022-ce8a-94fc9406d0ff\\})|(\\{4bbf76c6-0cda-6b55-a82d-6a02869ba851\\})|(\\{627f651e-58c1-4f10-81d9-8fc4a2b8a6d4\\})|(\\{b3d9f42b-0cf6-5f80-0645-6870904c6d99\\})|(\\{f24bbc96-20bc-4510-a275-442a604aa12c\\})|(\\{a97e6c70-d890-4a69-b7ae-ff97bb25808e\\})|(\\{95674029-cc9f-4e46-9a64-b7a4b3e39277\\})|(\\{f8f40912-e963-48d3-b176-fe7223e54d94\\})|(\\{8a1eed18-914e-4a58-aac5-791272bc5c26\\})|(\\{3267ca67-cf6c-451b-8ba9-311d3b954e8e\\})|(\\{00969488-23d9-4291-a6d7-abfbb9d75fd7\\}))$/","prefs":[],"schema":1585730548980,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626592","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"df94545c-e570-4efe-afd4-11ab0e4f9ddf","last_modified":1585930042641},{"guid":"{7fa7ce90-e40e-44dc-8b79-84337f3de987}","prefs":[],"schema":1585743918356,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626597","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Decodex"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab0258b9-63bc-425a-8dc4-53250d2f27e2","last_modified":1585930042636},{"guid":"{6f62927a-e380-401a-8c9e-c485b7d87f0d}","prefs":[],"schema":1585744575197,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626602","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Lookbox"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3486ee79-b128-4496-985d-6f5d9dc2c340","last_modified":1585930042632},{"guid":"{68d4ca8c-c012-43a7-8f22-d569a5fe3eb6}","prefs":[],"schema":1585745131075,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1626603","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Maximize"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39e5eda4-c9a8-4a8e-a6d5-fd3d0d3b0215","last_modified":1585930042628},{"guid":"{171cdcfa-d6d3-4bc2-8e5d-dfcbb67c7695}","prefs":[],"schema":1585597291445,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625509","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Sushkom AV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a51c888f-234f-4f0b-a76c-c0a036bfa6ca","last_modified":1585730548574},{"guid":"{b7410e57-0452-47d5-a7cf-a1a91e7fd0b7}","prefs":[],"schema":1585424490920,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625922","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa5e3c2-1be6-4eb9-9357-f2d0686448be","last_modified":1585575900465},{"guid":"/^((\\{e2e34cff-c7d2-4c87-8195-d206ac928969\\})|(\\{aea3f9d0-909d-4c39-9282-25b11aa29d61\\})|(\\{ec5c4eed-0275-4148-a7f0-b21c05121703\\}))$/","prefs":[],"schema":1585158977245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625025","why":"This add-on violates Mozilla's add-on policies by using a deceptive name or collecting ancillary user data.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"034951cb-7614-4202-af35-18123476eb03","last_modified":1585238797372},{"guid":"/^((\\{927f6d6a-104f-4e69-b99a-e62e856899d9\\})|(\\{edf2d18c-ba07-4f30-bd59-85520b7259d8\\})|(\\{2128e9bc-aa97-4f9e-9327-bdce611538fb\\})|(\\{41a71134-b81e-49c5-be44-154c1b981153\\})|(\\{e00696fa-7731-40c6-81f1-5507d0435347\\})|(\\{f6dee727-c6cf-4d4a-b108-d59c3d9723ce\\})|(\\{48935666-26c5-484a-ade3-1660eca6a219\\})|(\\{06b9fcaa-45df-4fb3-a8fa-775d68690f5b\\})|(jid1-4P0kohSJxU1qGa@jetpack)|(jid1-93WyvptyvzGATw@jetpack)|(addon@ytdownloader1\\.info)|(\\{f4817c52-46ac-4b98-b682-f900701c5778\\}))$/","prefs":[],"schema":1585177209604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1625186","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abcf90de-7322-4232-a59c-06e4b3a33c68","last_modified":1585238797365},{"guid":"/^ext@bettersurfplus$/","prefs":[],"schema":1585140126652,"blockID":"i506","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-10T15:10:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b4da06d2-a0fd-09b6-aadb-7e3b29c3be3a","last_modified":1585158976536},{"guid":"/^((\\{7aeae561-714b-45f6-ace3-4a8aed6e227b\\})|(\\{01e86e69-a2f8-48a0-b068-83869bdba3d0\\})|(\\{77f5fe49-12e3-4cf5-abb4-d993a0164d9e\\}))$/","prefs":[],"schema":1585140060946,"blockID":"i436","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891606","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, changing Firefox default settings and not reverting them on uninstall. If you want to continue using this add-on, it can be enabled in the Add-ons Manager.","name":"Visual Bee","created":"2013-08-09T15:04:44Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad6dc811-ab95-46fa-4bff-42186c149980","last_modified":1585158976531},{"guid":"/^((\\{0b24cf69-02b8-407d-83db-e7af04fc1f3e\\})|(\\{6feed48d-41d4-49b8-b7d6-ef78cc7a7cd7\\})|(\\{8a0699a0-09c3-4cf1-b38d-fec25441650c\\}))$/","prefs":[],"schema":1585138327934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434759","why":"These add-ons use remote scripts to alter popular sites like Google or Amazon.","name":"Malicious remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ffc62d-40c4-43ac-aa3f-7240978d0ad0","last_modified":1585158976522},{"guid":"/^(({41c14ab8-9958-44bf-b74e-af54c1f169a6})|({78054cb2-e3e8-4070-a8ad-3fd69c8e4707})|({0089b179-8f3d-44d9-bb18-582843b0757a})|({f44ddcb4-4cc0-4866-92fa-eefda60c6720})|({1893d673-7953-4870-8069-baac49ce3335})|({fb28cac0-c2aa-4e0c-a614-cf3641196237})|({d7dee150-da14-45ba-afca-02c7a79ad805})|(RandomNameTest@RandomNameTest\\.com)|(corpsearchengine@mail\\.ru)|(support@work\\.org))$/","prefs":[],"schema":1585145454357,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a123214-b4b6-410c-a061-bbaf0d168d31","last_modified":1585158976514},{"guid":"/^((@mixclouddownloader)|(all-down@james\\.burrow)|(d\\.lehr@chello\\.at)|(easy-video-downloader@addonsmash)|(easy-youtube-mp3@james\\.burrow)|(gid@addonsmash)|(gmail_panel@addon_clone)|(idm@addonsmash)|(image-picka@addonsmash)|(instant-idm@addon\\.host)|(jdm@awesome\\.addons)|(open-in-idm@addonsmash)|(open-in-idm@james\\.burrow)|(open-in-vlc@awesome\\.addons)|(saveimage@addonsmash)|(thundercross@addonsmash)|(vk-download@addon\\.host)|(vk-music-downloader@addonsmash)|(whatsapp_popup@addons\\.clone)|(ytb-down@james\\.burrow)|(ytb-mp3-downloader@james\\.burrow)|(\\{0df8d631-7d88-401e-ba7e-af1425dded8a\\})|(\\{3c74e141-1993-4c04-b755-a66dd491bb47\\})|(\\{5cdd95c7-5d92-40c5-8e2a-8c52c90191d9\\})|(\\{40efedc0-8e48-404a-a779-f4016b25c0e6\\})|(\\{53d605ce-599b-4352-8a06-5e594b3d1822\\})|(\\{3697c1e8-27d7-4c63-a27e-ac16191a1545\\})|(\\{170503FA-3349-4F17-BC86-001888A5C8E2\\})|(\\{649558df-9461-4824-ad18-f2d4d4845ac8\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{27875553-afd5-4365-86dc-019bcd60594c\\})|(\\{6e7624fa-7f70-4417-93db-1ec29c023275\\})|(\\{b1aea1f1-6bed-41ef-9679-1dfbd7b2554f\\})|(\\{b9acc029-d62b-4d23-b921-8e7aea34266a\\})|(\\{b9b59e13-4ac5-4eff-8dbe-c345b7619b3c\\})|(\\{b0186d2d-3126-4537-9186-a6f198547901\\})|(\\{b3e8fde8-6d97-4ac3-95e0-57b797f4c56b\\})|(\\{e6a9a96e-4a08-4719-b9bd-0e91c35aaabc\\})|(\\{e69a36e6-ee12-4fe6-87ca-66b77fc0ffbf\\})|(\\{ee3601f1-78ab-48bf-89ae-0cfe4aed1f2e\\})|(\\{f4ce48b3-ad14-4900-86cb-4604474c5b08\\})|(\\{f5c1262d-b1e8-44a4-b820-a834f0f6d605\\}))$/","prefs":[],"schema":1585149409880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476020","why":"Add-ons repeatedly violated several of review policies.","name":"Several youtube downloading add-ons and others"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"ae8ae617-590d-430b-86d4-16364372b67f","last_modified":1585158976511},{"guid":"/^(({a4d84dae-7906-4064-911b-3ad2b1ec178b})|({d7e388c5-1cd0-4aa6-8888-9172f90951fb})|({a67f4004-855f-4e6f-8ef0-2ac735614967})|({25230eb3-db35-4613-8c03-e9a3912b7004})|({37384122-9046-4ff9-a31f-963767d9fe33})|({f1479b0b-0762-4ba2-97fc-010ea9dd4e73})|({53804e15-69e5-4b24-8883-c8f68bd98cf6})|({0f2aec80-aade-46b8-838c-54eeb595aa96})|({b65d6378-6840-4da6-b30e-dee113f680aa})|({e8fc3f33-14b7-41aa-88a1-d0d7b5641a50})|({c49ee246-d3d2-4e88-bfdb-4a3b4de9f974}))$/","prefs":[],"schema":1585138540335,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1484536","why":"Add-ons that don't respect user choice by overriding search.","name":"Search hijacking add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01c22882-868b-43e1-bb23-29d5dc7bc11b","last_modified":1585158976508},{"guid":"/^((\\{0b47ef96-f7c9-4017-97b6-51c1280eaf6e\\})|(\\{2c65ed54-5215-4f10-a7bd-39445a6450fd\\})|(\\{80dbc30a-168b-4a18-bd5b-51f9b1807d7f\\})|(\\{93a106e3-e70b-48af-9282-30e3d6c87af9\\})|(\\{2120dc72-6040-45ed-9655-aaabed57fc93\\})|(\\{c3c9f1ee-4192-4d5a-b753-a62c19b16c98\\})|(\\{d0fc8cf9-66aa-4f08-8c96-3f882c2e9c9b\\})|(\\{da69b9e2-c2d1-4b90-93be-4cc3976e452d\\})|(\\{eb70585e-76bb-4eae-9f06-7fc5efbc877e\\})|(fairshare-unlock@burstworks-test\\.com)|(fairshare-unlock@burstworks\\.com)|(freevideodownloader-hosted@funnerapps\\.com)|(freevideodownloader-test-hosted@funnerapps\\.com)|(gmo-panel@ddmr\\.com)|(helper-sig@savefrom\\.net)|(ihmgiclibbndffejedjimfjmfoabpcke@chrome-store-foxified--?\\d+)|(ihmgiclibbndffejedjimfjmfoabpcke@chromeStoreFoxified--?\\d+)|(panel-branded@ddmr\\.com)|(panel-canadaTalkNow@ddmr\\.com)|(panel-community@ddmr\\.com)|(panel-digaYgane@ddmr\\.com)|(panel-ecglobal@ddmr\\.com)|(panel-fusionCash@ddmr\\.com)|(panel-grindaBuck@ddmr\\.com)|(panel-measurement@ddmr\\.com)|(panel-mysoapbox@ddmr\\.com)|(panel-ofernation@ddmr\\.com)|(panel-rewarding@ddmr\\.com)|(panel-superpay@ddmr\\.com)|(panel-zippy@ddmr\\.com)|(test_fairshare-unlock@burstworks\\.com)|(test-fairshare-unlock@burstworks\\.com)|(vindale@ddmr\\.com))$/","prefs":[],"schema":1585151995695,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562965","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04c27082-2b78-4005-a6c5-8e0a13f83288","last_modified":1585158976505},{"guid":"/^((\\{3c8970fa-1340-45ad-82fe-81f3beccfbdc\\})|(\\{4ab99b95-4d05-438c-8a3e-adb1b3fe8d81\\})|(\\{7f87a05d-dba7-448e-9af2-ee0f4a294c01\\})|(\\{59a219a8-45cd-458d-9b3e-8d86c19dfc31\\})|(\\{79f4bfc7-b1da-4dc4-85cc-ecbcc5dd152e\\})|(\\{484dc5ad-4d6a-4ee4-91b7-b5b8166e6b3d\\})|(\\{2643d75f-9d64-47ef-9c23-78f0f055c7b8\\})|(\\{76399bf2-8354-4b11-bf43-6c863b195b1d\\})|(\\{110791c0-2883-4301-8214-90be7549df43\\})|(\\{a33e004d-2ac0-4d77-8e14-50780bc231a3\\})|(\\{aaaa5840-6b3b-49d8-92c2-9696798c4e2a\\})|(\\{bfc55377-7210-4e7a-828f-6fdb9df02847\\})|(\\{c6c78b9a-370d-49c5-b9c6-96d7e38861c5\\})|(\\{c115eb3a-4746-472b-8f1f-d8596c49b3b6\\})|(\\{deaa22e5-33ed-440f-a734-c3175e6228a7\\})|(\\{e34d5840-6b3b-49d8-92c2-9696798c4e2a\\})|(aapbdbdomjkkjkaonfhkkikfgjllcleb@[cC]hrome-?[sS]tore-?[fF]oxified--?((\\d+)|(unsigned)))|(babelfox_client@rami)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--?\\d+)|(bridge-translate-app@chrome-store-foxified--?\\d+)|(dephbpajmknbniclommefdlnflkfnpgh@chrome-store-foxified--?\\d+)|(extension@newtab\\.biz)|(generated-74o6bact7xu7y32fvfju4s@chrome-store-foxified--?\\d+)|(generated-axbwzwbksnnig1ug9v5dly@chrome-store-foxified--?\\d+)|(googletranslateelement@developer\\.org)|(icdahkkjdchifpnbebileaelbcgipepe@chrome-store-foxified--?\\d+)|(ifgljfjnflaadalpmkkgdailepedeehd@chrome-store-foxified--?\\d+)|(knpgbkpddpcepnloiijojmgbdhihkjkl@chrome-store-foxified--?\\d+)|(translate-4@chrome-store-foxified--?\\d+))$/","prefs":[],"schema":1585157952678,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1593243","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"11fd123a-e67d-44ab-909f-b776ea2e8d0a","last_modified":1585158976501},{"guid":"/^((graph-helper@thegraph\\.co)|(lab@uneg\\.edu\\.ve)|(ponyhoofbeta@ponyhoof\\.little\\.my)|(\\{75080f0e-3dbe-455d-a1d1-33850f36e2ff\\})|(\\{27883109-b35d-4b6b-9e5b-89b26496fb5e\\})|(\\{cf407827-6739-4514-ad2e-8af25c0e1d97\\})|(\\{c9efb61c-f0bb-42a2-a3e5-ca75da67007c\\})|(\\{c671463f-7bd2-4a35-839c-2097aa52b1d2\\})|(\\{83d16411-a3d6-4268-a95f-1e9abcbdd521\\})|(\\{3835f36e-a8a8-4247-a731-6e1ed7d52c5f\\})|(\\{8d13fb0d-e6b6-4301-9865-3c438a1a347f\\})|(\\{21262c5a-3c8e-46a1-b504-7d16ccddf656\\})|(\\{3e1f3207-8b6c-493b-91f3-0eb43326e273\\})|(\\{9fe1f0bb-c24d-4eab-90f5-9471905132f6\\})|(\\{8b189632-155f-4478-bf51-285c3a54de8c\\})|(\\{3854ac9e-7c1c-4d2a-84f7-edc8656ac7ae\\})|(\\{ec82c419-3cc7-4789-bad0-a069ef80211e\\})|(\\{C0D03FFD-391A-41CE-ACA2-64557D9440CC\\})|(\\{D4A86045-8722-4289-93C4-7C80970F0E7D\\})|(\\{5f23a0d5-ff0e-4e18-8afc-cf50c468ea1d\\})|(\\{6b67941f-2544-468d-b371-ad5c2d99687b\\})|(\\{d6a07a0c-cad7-4e08-987a-099c1add5fc4\\})|(web-signer@softplan\\.com\\.br)|(\\{251eec9f-108a-4864-960f-e07cee35a991\\})|(\\{9cd44027-9d26-4cbd-bfd9-da7eaa495261\\})|(\\{4244357f-568b-477b-802a-db9d6551a719\\})|(\\{1ed0819f-e210-4089-8e24-af2dba6451bb\\})|(\\{e02dba27-b975-4dcb-9adb-ea74ed6cd632\\})|(\\{1240d113-0410-418b-b99f-047aad6ddae3\\})|(\\{115d13bd-f95d-4a61-9dd7-fb3ab816a8dd\\})|(mydesires@mydesires\\.com)|(mesenvies@mesenvies\\.fr)|(\\{0f250607-4465-49bb-a56c-12c8514a3e7d\\})|(\\{12a290cc-2b60-4efb-96f0-dde41f27769d\\})|(\\{9ac03a7d-f80f-4868-8b95-35074f8cdf62\\})|(\\{ce1da0e5-133b-4828-8cbb-66c5ea97e78e\\})|(\\{0da8fe99-30f7-462c-85d0-db66f4f70a97\\})|(\\{9aca9f23-d9aa-4680-9dcb-837291ff6854\\})|(\\{d86d1438-56ef-4294-ab9b-ac1f2c6420e6\\})|(\\{6280d3e5-a444-4823-be7d-317090d3b175\\})|(\\{faccc7b3-b0c7-4fcc-9d4d-b12721ea7f0d\\})|(\\{b84f4632-26f1-4fb5-9082-1f2ca7685afa\\})|(\\{a543f841-3613-4a52-bce8-58bd6e7eb100\\})|(\\{5b1c9b32-9dd3-461c-85c6-bbac4ef2af19\\})|(\\{0207f077-7f95-47ba-b0f9-b356d456f914\\})|(teste@addon\\.com)|(\\{6da58723-1757-42a4-a2db-849f6159c880\\})|(\\{4a122670-da9d-4257-b2bc-27440af385af\\})|(\\{f39035e7-e7f6-4dc1-b13b-04d7a365ab41\\})|(\\{3b3201ca-d7a1-48ab-a89b-ad97cd688590\\})|(\\{bb0179bf-3435-4924-8ae5-19f35e7f1a7f\\})|(\\{d2f6e317-3957-4931-b9b1-6b3ebef25aab\\})|(luckypdf@luckypdfconverter\\.com)|(\\{755ae77a-2901-4177-99aa-ac3fe15974e0\\})|(\\{6e5cab8f-78da-45fe-90af-4cfaf3d95d0e\\})|(\\{cd0c26ad-5150-42cb-bec1-2da0db715a90\\})|(\\{357d3c5d-5c68-4943-b49e-df20c6ff931e\\})|(\\{8b5d6a2c-d18c-47b6-9b13-cebab7425838\\})|(\\{d26b38f2-1ec0-43d8-8d05-8e14a09955bc\\})|(\\{d3b4d997-cf97-4ffe-9401-3efcbc816fd9\\})|(\\{506848ee-e612-4d2f-8645-70c26e577efd\\})|(\\{c0272d15-248c-4f93-80cd-684c0f360da1\\})|(\\{7a478659-43ba-4054-8d67-9ad75f66f0f6\\})|(\\{351b37fb-6d84-4820-8dbe-a517d8f856ce\\})|(\\{f0031513-5b7e-4cc6-9a16-616c82e79d48\\})|(\\{adf2ee6b-ef1c-4350-b35f-369e6b0dc64a\\})|(\\{06a6425d-0e31-4703-a0e2-72d4a552477c\\})|(\\{6f8a85a2-d83b-4a2c-ac38-d06bf3fb1b92\\})|(\\{9d96147e-9418-4493-bedb-380bf065f8b0\\})|(\\{3055992b-3fda-44bf-9065-8514ea2c2acb\\})|(\\{602ade61-49fc-4a40-9287-53949c8f0462\\})|(\\{c28dd807-0b3f-4bc4-984c-ff9578202712\\})|(\\{495e077c-0015-4e70-80f3-4b1b71e9c866\\})|(\\{19ebc477-304c-4d75-990b-6d47c230c19d\\})|(\\{08df44a4-ef6a-4828-9ebe-a730dd47ee5e\\})|(allsigningoffline@nextsense\\.com)|(\\{cc304579-73e2-4fa7-9863-f1cda545e542\\})|(\\{bf0d9dc8-ca00-4bba-88a0-535e20b089ea\\})|(\\{00dd06ff-7392-449b-9e87-8a39c5f5cb05\\})|(\\{c8882c78-ee4f-4c9c-8380-ab8f1d333e0d\\})|(\\{1bf5b2e0-14aa-49a4-9642-d2f28bb44730\\})|(\\{8afde9a0-bd2d-48f4-939c-8e7ec4210085\\})|(\\{8bd4cf33-e9c2-4a9c-84f5-ef0f3a512c53\\})|(\\{390d4afb-83c3-4a8c-93a0-587f9c52eb10\\})|(\\{3624218a-2799-478f-84bf-8f6ddd4fe8f5\\})|(\\{5303ae90-10ef-4c9c-bc51-d7062883b9a1\\})|(vivoinforma@tutanota\\.com)|(\\{8e638a74-6131-40b9-b64e-4341cf67d491\\})|(\\{f9295774-e455-4986-832c-cc4863769e66\\})|(thisisummsstrikethroughhighlighting@example\\.com)|(frigate@loranrendel)|(\\{ff4dc908-b851-42b7-adee-d9a5bb1e6813\\})|(\\{3ec50eaf-e36b-4b26-b255-0d75abe112b9\\})|(@LmXEarthZoomToolOneShot)|(\\{91be62bd-8752-45bf-a20a-b6b2d4abf87e\\})|(cloud-support@wildfire\\.ai)|(YoutubeUploader@ArcAvalon\\.com)|(\\{2e3be1f1-fb5c-40fb-b578-d2c9184ce470\\}))$/","prefs":[],"schema":1585146642510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92ac1ebd-7dcd-4446-a7b3-7e359ad1c4b5","last_modified":1585158976498},{"guid":"/^((Smart_Search_voIhxkbgGH@www\\.convertmyfile\\.co)|(Smart_Search_vRIICPGhwx@www\\.job-portal\\.co)|(Smart_Search_wsRtgwiOcH@www\\.search-smart\\.live)|(Smart_Search_xCropjfsuc@www\\.searchsmart\\.live)|(Smart_Search_yCAOHFcvfi@www\\.smart-search\\.live)|(Smart_Search_yDaEiIzkQK@www\\.smartsearch\\.live)|(Smart_Search_yhCKmmAXWz@www\\.searchsmart\\.online)|(Smart_Search_yrwXRZHXLh@www\\.search-smart\\.online)|(Smart_Search_YXySavVGVt@www\\.search-smart\\.work)|(SMART_SEARCH_YZaevPNtHc@www\\.localweathertoday\\.net)|(Smart_Search_ZsEjqVBHGd@www\\.convertthefile\\.net)|(Smart_Searches_FuCzQWfGWa@www\\.smartsearches\\.co)|(SMART-SEARCH_sHhQFGpFhV@www\\.coupondealer\\.co)|(Smart-Search_UasOSUTNhv@www\\.map-buddy\\.net)|(Smart\\.Search_631e8da2146d6187149c9206fac1a89e@www\\.convertthepdf\\.co)|(Smart\\.Search_IfzjxIabfy@www\\.convertthepdf\\.co)|(SmartSearch_clone_DyqkuEZPRF@www\\.search-smart\\.co)|(SmartSearch_DSuyKfIhTM@www\\.convertmypdf\\.online)|(SmartSearch_gkOEsQztVd@www\\.search-smart\\.co)|(SmartSearch_ohUbxjDpNV@www\\.search-smart\\.co)|(Speed_Check_01c5dfe0109bc6cb0e711840b239846c@www\\.checkmyspeed\\.co)|(Speed_Check_07449674bdae85845b4fc92e2695caf3@www\\.checkmyspeednow\\.com)|(Speed_Check_2098fea3a2c7a807bdeb61111c2de48f@www\\.checkmyspeed\\.co)|(Speed_Check_2305caaa9793a7577aa6283a89da7971@www\\.checkmyspeednow\\.com)|(Speed_Check_25ae2975d89f06e814b2e421109be7ef@www\\.checkmyspeednow\\.com)|(Speed_Check_55750cbafa724e361805677e2c1a0ea7@www\\.checkmyspeednow\\.com)|(Speed_Check_56ad7958c2981e0f1cad6d4de2abcb4b@www\\.checkmyspeed\\.co)|(Speed_Check_616286717d187249f5d29d2bc8771294@www\\.checkmyspeednow\\.com)|(Speed_Check_87ec83e10e18545948a0d739589fa6c0@www\\.checkmyspeed\\.co)|(Speed_Check_917a4c229b30f0ac1bca0aa5a43f8f2e@www\\.checkmyspeednow\\.disabled\\.com)|(Speed_Check_94cbe40b6d2b11c86b07bbb606fe11e2@www\\.checkmyspeednow\\.com)|(Speed_Check_a4d8b86ff6fa408ee87b70d65c41d1dd@www\\.checkmyspeed\\.co)|(Speed_Check_cdeb8d6f1f2426379a89eac745d5853a@www\\.checkmyspeed\\.co)|(Speed_Check_clone_aqksrBHRvi@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_CrMqWRFYTl@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_ec2c77c7b610b83c9f6bef2573e4d3a1@www\\.checkmyspeed\\.co)|(Speed_Check_clone_IchkKEIlVC@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_nmRPlvUEJv@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_OczJkeuXDq@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_QlPnYtcPGo@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_RjaZbJQbEk@www\\.checkmyspeednow\\.com)|(Speed_Check_clone_WPgSSdchao@www\\.checkmyspeed\\.co)|(Speed_Check_ed30669ac9901d20415ead7770db761a@www\\.speedchecktool\\.com)|(Speed_Check_FZSVtPegfX@www\\.checkmyspeed\\.co)|(Speed_Check_iQueDNOXmF@www\\.checkmyspeed\\.co)|(Speed_Check_LUlQBGtuOE@www\\.checkmyspeednow\\.com)|(Speed_Check_MNeDWiZeoo@www\\.checkmyspeed\\.co)|(Speed_Check_XckNwcWvNE@www\\.checkmyspeed\\.co)|(Speed_Check_xSObhPOTMw@www\\.checkmyspeed\\.co)|(Speed_Checker_Pro_260678188808c41791fdd9d9ed445802@www\\.speedcheckerpro\\.com)|(Speed_Checker_Pro_esgyoKewQa@www\\.speedcheckerpro\\.com)|(Speed_Test_Ace_0e5d46c255d8ceec71018d460c702e40@www\\.speedtestace\\.com)|(Speed_Test_Ace_b81323c0334e1c3f409c1dd14aa60f61@www\\.speedtestace\\.co)|(Speed_Test_Ace_clone_DKdXeTMeZx@www\\.speedtestace\\.co)|(Speed_Test_Ace_kcEikItaOC@www\\.speedtestace\\.co)|(Speed_Test_Ace_ppoJbdaucW@www\\.speedtestace\\.co)|(Speed_Test_Now_ZDIRLnXzms@speedtestnow\\.co)|(Speed_Test_OoJkZnYICK@www\\.speed-test\\.live)|(Speed_Test_uJpXMlaztD@www\\.testyourspeed\\.co)|(sportsbulletin@www\\.sportsupdates\\.co)|(sportseveryday@www\\.sportseveryday\\.co)|(sportseverydayco@www\\.sportseveryday\\.co)|(sportsupdates\\.website_SdCnLxLIxY@www\\.sportsupdates\\.website)|(Spot_Flight_Now_6b388ff946e79dc3fd82eec51958d550@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eb4c54758e45589d6039415632c1e319@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_eTPyUPJmtK@www\\.spotflightnow\\.com)|(Spot_Flight_Now_clone_UZIlZeQYAb@www\\.spotflightnow\\.com)|(Spot_Flight_Now_EtIsXJyXXm@www\\.spotflightnow\\.com)|(Spot_Flight_Now_f268f21c4c60f3e78601d20b97453943@www\\.spotflightnow\\.com)|(staging\\.checknetspeed\\.co_nREaqypDrX@staging\\.checknetspeed\\.co)|(Start_A_Career_RXEBmchKFm@www\\.jobs\\.startacareer\\.co)|(Stream_TV_Live_KrYxWrtCtv@www\\.streamtvlive\\.co))$/","prefs":[],"schema":1585146841367,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae4b574-f195-4f18-8bc0-c3b712e4316b","last_modified":1585158976495},{"guid":"/^((Easy_Doc_Converter_b4ab66ebed6d4f9148bd9024b5b45266@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_egpEGOXPkz@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_f5e570a648be4d82f02fa2106a21a43f@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_IteaxXKJex@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_jJGqUHYgCN@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KPOmYhpWMq@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_KyppGVLzlw@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_PuJVSyMdMn@www\\.easydocconverter\\.com)|(Easy_Email_Center_clone_LWcJzWsabx@www\\.easyemailcenter\\.com)|(Easy_Email_Center_clone_WroHXxYaWe@www\\.easyemailcenter\\.com)|(Easy_Email_Center_fhZhWrvhNZ@www\\.easyemailcenter\\.com)|(Easy_Email_Checker_54b7a48dd3773a01313275df62afd4cf@www\\.easyemailchecker\\.net)|(Easy_Email_Plus_GqrjVlzgJP@www\\.easyemailplus\\.com)|(Easy_Forms_Finder_gmYexjlshO@www\\.easyformsfinder\\.com)|(Easy_Inbox_Access_clone_BHQcoGwBXJ@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_pXyLNbavvp@www\\.easyinboxaccess\\.com)|(Easy_Inbox_Access_yVECZMgzTG@www\\.easyinboxaccess\\.com)|(Easy_Mail_Login_FRPUoJrXUl@www\\.easymail-login\\.co)|(Easy_Mail_Logins_AGDDyUpIjb@www\\.easymaillogin\\.co)|(Easy_Map_Finder_a811a7fb227baf4b89b3ed4d017fcfc4@www\\.easymapsfinder\\.com)|(Easy_Map_Tab_44b8d948ebfb6010e7fe17ad02606c6e@www\\.easymaptab\\.com)|(Easy_Map_Tab_rfqbzWtygp@www\\.easymaptab\\.com)|(Easy_Maps_VsjiCqbVfo@www\\.mapdirectionspront\\.co)|(Easy_Online_Recipe_IzyMoUNAGs@www\\.easyonlinerecipe\\.co)|(Easy_Online_Recipe_oEqObvsniN@www\\.easyonlinerecipe\\.net)|(Easy_Recipes_277ea1aa5aaed20cbb145291ebf0cdc1@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_35f61f2bee1a01e94edbbb868bbb66ca@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_5d97b38952cbd818b53669ee377f4a4e@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_JkInlZZXKJ@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_qwPPMUMPbm@www\\.dailyrecipesearch\\.net)|(Easy_Recipes_VZjydpXYuD@www\\.dailyrecipesearch\\.net)|(Easy_Search_3ce2d360291c0435253c279a003f4bee@www\\.easy-search\\.co)|(Easy_Search_9259a3968f7a7a407cf8a9c5b5aac8b5@www\\.easy-search\\.co)|(Easy_Search_Access_41cd311e7ebb5abe48a68600a41b6a6e@www\\.easysearchaccess\\.com)|(Easy_Search_Access_zBaMiEnnEw@www\\.easysearchaccess\\.com)|(Easy_Search_bJrePoApTo@www\\.easy-search\\.co)|(Easy_Search_gFyxFnsAsY@www\\.easy-search\\.co)|(Easy_Search_Online_8d5692e3bf9af4e8d0fcb27b753b4bb0@www\\.easysearchonline\\.co)|(Easy_Search_Online_YJpastaXEE@www\\.easysearchonline\\.co)|(Easy_Search_Pro_edc3f4614998d63f6bddb8cddf1eca75@www\\.easysearchpro\\.co)|(Easy_Search_Pro_JDFkWEUATn@www\\.easysearchpro\\.co)|(Easy_Weather_Checker_b96bc45b78e94fcc92bbf66eabb4c7e0@www\\.easyweatherchecker\\.com)|(Easy_Weather_Checker_OZbmtCpDgx@www\\.easyweatherchecker\\.com)|(Easy_Weather_Forecast_6b2ee7704b4f8f93b4e4c42c707dadc1@www\\.easyweatherforecast\\.com)|(Easy_Weather_Forecast_pNIPnyHOJG@www\\.easyweatherforecast\\.com)|(EasyMailLogin\\.net_usETGyzdRX@www\\.easymaillogin\\.net)|(EasyOnlineRecipe\\.co_CVOjgBfTWs@www\\.easyonlinerecipe\\.co)|(EasyOnlineRecipe\\.net_icOMrzwKiN@www\\.easyonlinerecipe\\.net)|(EasySearchGo_JMJgGKKsKw@www\\.easysearchgo\\.com)|(Email_Access_7ad642481026e05b4ff4a7da92468bdb@www\\.accessmymails\\.co)|(Email_Access_JVuQrQxsXR@www\\.accessmymails\\.co)|(Email_Checker_MguwpDKJMd@www\\.easyemailchecker\\.net)|(Email_Inbox_Now_OVfDpBfbuk@www\\.emailinboxnow\\.com)|(Email_Login_CofCwMXmYY@www\\.easymaillogin\\.net)|(Email_Login_eVRzKHiywW@www\\.easymaillogin\\.net)|(Email_Login_KABgNaGQJZ@www\\.easymaillogin\\.net)|(Email_Login_Pro_80b99340e1bcedf5f0a1f4d1345538e1@www\\.emailloginpro\\.com)|(Email_Login_Pro_SHHHqfDSTO@www\\.emailloginpro\\.com)|(Email_Login_Pro_xvgHLfPbBB@www\\.loginemailpro\\.net)|(Email_Tab_13d31aa17a541c3018f2625a09486686@www\\.emailtab\\.co)|(Email_Tab_ZdbwsMpyuq@www\\.emailtab\\.co)|(Everyday_Astro_clone_bOSsysyaan@www\\.everydayastro\\.co)|(Everyday_Astro_CMqmHgpSTg@www\\.everydayastro\\.co)|(Everyday_Astro_dVNMgQmXws@www\\.everydayastro\\.online)|(Everyday_Astro_NHOKASspnT@www\\.everydayastro\\.online)|(Everyday_Astro_sDIIbCNITP@www\\.everydayastro\\.online)|(Everyday_Astro_xiJdwxnNom@www\\.everydayastro\\.online)|(Everyday_Astro_YGSUqIslKW@www\\.everyday-astro\\.com))$/","prefs":[],"schema":1585145745119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21ecfbe4-1255-4f86-b78c-c4fd06a6f197","last_modified":1585158976491},{"guid":"/^((\\{441a1a1f-ba4f-4f2e-ade8-88c2950323a6\\})|(\\{81faa316-ef9f-4fc9-9db8-af17eabc776b\\})|(\\{e2ee901b-44cb-430f-be5e-23ab0291d8f4\\})|(\\{d1e6ace8-9623-4a5d-a94f-81fd289fe834\\})|(\\{0de5c9e4-4488-489a-a130-0e192cc6bb08\\}))$/","prefs":[],"schema":1584906090910,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1624545","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user disclosure or consent.","name":"Add-ons redirecting requests"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9b936d20-0a13-42de-b735-11409c3e4881","last_modified":1585130632165},{"guid":"/^((\\{9263519f-ca57-4178-b743-2553a40a4bf1\\})|(\\{d97223b8-44e5-46c7-8ab5-e1d8986daf44\\})|(\\{0111c475-01e6-42ea-a9b4-27bed9eb6092\\})|(\\{36a4269e-4eef-4538-baea-9dafbf6a8e2f\\})|(\\{2cac0be1-10a2-4a0d-b8c5-787837ea5955\\})|(\\{6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4\\})|(\\{2134e327-8060-441c-ba68-b167b82ff5bc\\})|(\\{a3fbc8be-dac2-4971-b76a-908464cfa0e0\\})|(\\{de3b1909-d4da-45e9-8da5-7d36a30e2fc6\\})|(\\{02328ee7-a82b-4983-a5f7-d0fc353698f0\\})|(\\{28044ca8-8e90-435e-bc63-a757af2fb6be\\})|(\\{63df223d-51cf-4f76-aad8-bbc94c895ed2\\})|(\\{3f4191fa-8f16-47d2-9414-36bfc9e0c2bf\\})|(\\{a0c54bd8-7817-4a40-b657-6dc7d59bd961\\})|(\\{f0b809eb-be22-432f-b26f-b1cadd1755b9\\})|(\\{919fed43-3961-48d9-b0ef-893054f4f6f1\\})|(\\{cd28aa38-d2f1-45a3-96c3-6cfd4702ef51\\})|(\\{829827cd-03be-4fed-af96-dd5997806fb4\\})|(\\{7d932012-b4dd-42cc-8a78-b15ca82d0e61\\})|(\\{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de\\})|(\\{a0ab16af-3384-4dbe-8722-476ce3947873\\})|(\\{23c65153-c21e-430a-a2dc-0793410a870d\\})|(\\{31680d42-c80d-4f8a-86d3-cd4930620369\\})|(\\{f4262989-6de0-4604-918f-663b85fad605\\})|(\\{e341ed12-a703-47fe-b8dd-5948c38070e4\\})|(\\{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\})|(\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{72c1ca96-c05d-46a7-bce1-c507ec3db4ea\\})|(\\{869b5825-e344-4375-839b-085d3c09ab9f\\})|(\\{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\})|(\\{df09f268-3c92-49db-8c31-6a25a6643896\\})|(\\{5f4e63e4-351f-4a21-a8e5-e50dc72b5566\\})|(\\{4479446e-40f3-48af-ab85-7e3bb4468227\\})|(\\{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\})|(\\{be37931c-af60-4337-8708-63889f36445d\\})|(\\{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\})|(\\{0432b92a-bfcf-41b9-b5f0-df9629feece1\\})|(\\{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\})|(\\{01166e60-d740-440c-b640-6bf964504b3c\\})|(\\{76ce213c-8e57-4a14-b60a-67a5519bd7a7\\})|(\\{226b0fe6-f80f-48f1-9d8d-0b7a1a04e537\\})|(\\{be981b5e-1d9d-40dc-bd4f-47a7a027611c\\})|(\\{37f8e483-c782-40ed-82e9-36f101b9e41f\\})|(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\})|(\\{7d5e24a1-7bef-4d09-a952-b9519ec00d20\\})|(\\{408a506b-2336-4671-a490-83a1094b4097\\})|(\\{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})|(\\{cf9d96ff-5997-439a-b32b-98214c621eee\\})|(\\{302ef84b-2feb-460e-85ca-f5397a77aa6a\\})|(\\{0c9970a2-6874-483b-a486-2296cfe251c2\\})|(\\{e5bc3951-c837-4c98-9643-3c113fc8cf5e\\})|(\\{93017064-dfd4-425e-a700-353f332ede37\\})|(\\{28092fa3-9c52-4a41-996d-c43e249c5f08\\})|(\\{a893296e-5f54-43f9-a849-f12dcdee2c98\\})|(\\{fc0d55bd-3c50-4139-9409-7df7c1114a9d\\})|(\\{c661c2dc-00f9-4dc1-a9f6-bb2b7e1a4f8d\\})|(\\{419be4e9-c981-478e-baa0-937cf1eea1e8\\})|(\\{449e185a-dd91-4f7b-a23a-bbf6c1ca9435\\})|(\\{1c981c7c-30e0-4ed2-955d-6b370e0a9d19\\})|(\\{9ce2a636-0e49-4b8e-ad17-d0c156c963b0\\})|(\\{a2de96bc-e77f-4805-92c0-95c9a2023c6a\\})|(\\{a42e5d48-6175-49e3-9e40-0188cde9c5c6\\})|(\\{86d98522-5d42-41d5-83c2-fc57f260a3d9\\})|(\\{05a21129-af2a-464c-809f-f2df4addf209\\})|(\\{446122cd-cd92-4d0c-9426-4ee0d28f6dca\\})|(\\{bfd92dfd-b293-4828-90c1-66af2ac688e6\\})|(\\{f9e1ad25-5961-4cc5-8d66-5496c438a125\\})|(\\{8a61507d-dc2f-4507-a9b7-7e33b8cbc31b\\})|(\\{84406197-6d37-437c-8d82-ae624b857355\\})|(\\{11df9391-dba5-4fe2-bd48-37a9182b796d\\})|(\\{e9ccb1f2-a8ba-4346-b43b-0d5582bce414\\})|(\\{79db6c96-d65a-4a64-a892-3d26bd02d2d9\\})|(\\{214cb48a-ce31-4e48-82cf-a55061f1b766\\})|(\\{4c140bc5-c2ad-41c3-a407-749473530904\\})|(\\{c5cf4d08-0a33-4aa3-a40d-d4911bcc1da7\\})|(\\{591d1b73-5eae-47f4-a41f-8081d58d49bf\\})|(\\{f1bce8e4-9936-495b-bf48-52850c7250ab\\})|(\\{7c1df23b-1fd8-42b9-8752-71fff2b979de\\})|(\\{3c27c34f-8775-491a-a1c9-fcb15beb26d3\\})|(\\{ddae89bd-6793-45d8-8ec9-7f4fb7212378\\})|(\\{c488a8f5-ea3d-408d-809e-44e82c06ad9d\\})|(\\{2f8aade6-8717-4277-b8b1-55172d364903\\})|(\\{2eb66f6c-94b3-44f5-9de2-22371236ec99\\})|(\\{216e0bcc-8a23-4069-8b63-d9528b437258\\})|(\\{d14acee6-f32b-4aa3-a802-6616003fc6a8\\})|(\\{b26bf964-7aa6-44f4-a2a9-d55af4b4eec0\\})|(\\{e2139287-2b0d-4f54-b3b1-c9a06c597223\\})|(\\{3f4dea3e-dbfc-428f-a88b-36908c459e20\\})|(\\{92111c8d-0850-4606-904a-783d273a2059\\})|(\\{2aa275f8-fabc-4766-95b2-ecfc73db310b\\})|(\\{f01c3add-dc6d-4f35-a498-6b4279aa2ffa\\}))$/","prefs":[],"schema":1585040894048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439702","why":"This malicious add-on claims to be a Firefox \"helper\" or \"updater\" or similar.","name":"FF updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"48b14881-5f6b-4e48-afc5-3d9a7fae26a3","last_modified":1585130632161},{"guid":"/^((__TEMPLATE__APPLICATION__@ruta-mapa\\.com)|(application-3@findizer\\.fr)|(application2@allo-pages\\.fr)|(application2@bilan-imc\\.fr)|(application2@lettres\\.net)|(application2@search-maps-finder\\.com)|(application-imcpeso@imc-peso\\.com)|(application-meuimc@meu-imc\\.com)|(application-us2@factorlove)|(application-us@misterdirections)|(application-us@yummmi\\.es)|(application@amiouze\\.fr)|(application@astrolignes\\.com)|(application@blotyn\\.com)|(application@bmi-result\\.com)|(application@bmi-tw\\.com)|(application@calcolo-bmi\\.com)|(application@cartes-itineraires\\.com)|(application@convertisseur\\.pro)|(application@de-findizer\\.fr)|(application@de-super-rezepte\\.com)|(application@dermabeauty\\.fr)|(application@dev\\.squel\\.v2)|(application@eu-my-drivingdirections\\.com)|(application@fr-allo-pages\\.fr)|(application@fr-catizz\\.com)|(application@fr-mr-traduction\\.com)|(application@good-recettes\\.com)|(application@horaires\\.voyage)|(application@imc-calcular\\.com)|(application@imc-peso\\.com)|(application@it-mio-percorso\\.com)|(application@iti-maps\\.fr)|(application@itineraire\\.info)|(application@lbc-search\\.com)|(application@les-pages\\.com)|(application@lovincalculator\\.com)|(application@lovintest\\.com)|(application@masowe\\.com)|(application@matchs\\.direct)|(application@mein-bmi\\.com)|(application@mes-resultats\\.com)|(application@mestaf\\.com)|(application@meu-imc\\.com)|(application@mon-calcul-imc\\.fr)|(application@mon-juste-poids\\.com)|(application@mon-trajet\\.com)|(application@my-drivingdirections\\.com)|(application@people-show\\.com)|(application@plans-reduc\\.fr)|(application@point-meteo\\.fr)|(application@poulixo\\.com)|(application@quipage\\.fr)|(application@quizdeamor\\.com)|(application@quizdoamor\\.com)|(application@quotient-retraite\\.fr)|(application@recettes\\.net)|(application@routenplaner-karten\\.com)|(application@ruta-mapa\\.com)|(application@satellite\\.dev\\.squel\\.v2)|(application@search-bilan-imc\\.fr)|(application@search-maps-finder\\.com)|(application@slimness\\.fr)|(application@start-bmi\\.com)|(application@tests-moi\\.com)|(application@tousmesjeux\\.fr)|(application@toutlannuaire\\.fr)|(application@tuto-diy\\.com)|(application@ubersetzung-app\\.com)|(application@uk-cookyummy\\.com)|(application@uk-howlogin\\.me)|(application@uk-myloap\\.com)|(application@voyagevoyage\\.co)|(application@wikimot\\.fr)|(application@www\\.plans-reduc\\.fr)|(application@yummmi\\.es)|(application@yummmies\\.be)|(application@yummmies\\.ch)|(application@yummmies\\.fr)|(application@yummmies\\.lu)|(application@zikplay\\.fr)|(applicationY@search-maps-finder\\.com)|(cmesapps@findizer\\.fr)|(findizer-shopping@jetpack)|(\\{8aaebb36-1488-4022-b7ec-29b790d12c17\\}))$/","prefs":[],"schema":1585060581210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1452648","why":"Those add-ons do not provide a real functionality for users, other than silently tracking browsing behavior.","name":"Tracking Add-ons (harmful)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36f97298-8bef-4372-a548-eb829413bee9","last_modified":1585130632157},{"guid":"firefox@browser-addon.xyz","prefs":[],"schema":1584609109987,"details":{"bug":"https://bugzilla.mozilla.org/","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Adblock Premium"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eafece33-b993-443e-b944-8bcefb4389ec","last_modified":1584737928024},{"guid":"/^((\\{bb5254c6-92a2-4361-b000-816bc4d34c55\\})|(\\{2fb3aa6a-4ab8-4071-a0f9-379100ac95a2\\})|(\\{0cd3acae-0589-41e3-9525-61786e493188\\})|(\\{3f259f0b-ad11-48c5-a7c4-a5a0897a6d1c\\})|(\\{02b6b8e0-f3b6-4f0a-8055-2baf79c606c1\\})|(\\{9419fd2e-894c-4aa8-aa14-18b5982c5889\\})|(\\{7d0d82e8-308b-4039-b3df-577b41483946\\}))$/","prefs":[],"schema":1584447915622,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623342","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-os collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b107267-ee8d-4ecf-b7d5-64966911681d","last_modified":1584609109587},{"guid":"/^((\\{e3d1040d-ea1e-4337-b51b-9f353817184f\\})|(\\{205c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{08ac7dd2-8595-4966-a00b-1ef6a5bdb6f3\\})|(\\{8e937b56-4242-4cb5-b92a-f64452da816e\\})|(\\{9a1ded7e-5fe2-43ad-90a6-3732ceae3d08\\})|(\\{b384b75c-c978-4c4d-b3cf-62a82d8f8fff\\})|(\\{6133a4ea-818f-4e22-bbde-0437d80142bf\\})|(\\{aaf2b501-9d4f-4966-be95-0334bd16b291\\}))$/","prefs":[],"schema":1584542165088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623343","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dd9652a-c6cf-4cb0-b6f7-7bea8990b4fb","last_modified":1584609109583},{"guid":"/^((\\{cde82615-f0be-9aff-872d-31da1bc93923\\})|(\\{85a8a08c-52a8-7d1d-5b80-f1b5cd4751bf\\})|(\\{3d1468f8-abbd-4a7a-95f1-fa5a1201adb4\\})|(\\{386056fc-2697-4a54-bd35-02de8d62fe1b\\})|(\\{1ae2bde0-f2ea-4bf1-a075-08853f9fcf31\\})|(\\{382056fc-2627-2a54-bd25-02de1d62fe1b\\})|(\\{926abf23-d2b0-4142-9aaa-5338b33a0000\\})|(\\{ffedd9c9-45b9-4e11-bbf0-a1408fa0975d\\})|(\\{b35ef07a-7c1b-4b6a-b7aa-de1e918396cb\\}))$/","prefs":[],"schema":1584542307136,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623345","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c8fccf9-b1bb-41f0-bdc3-3a5790fdd4be","last_modified":1584609109580},{"guid":"{4e820bcf-688e-4b4e-8773-3861dad6a7e0}","prefs":[],"schema":1584387693606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1623047","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d65d4593-d2bb-41ab-b485-9818bc6f285f","last_modified":1584447915216},{"guid":"/^((\\{c89232c3-39bb-41e5-a197-7f4412b45fe6\\})|(oniria@valid-install\\.com))$/","prefs":[],"schema":1583964274652,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621940","why":"This add-on violates Mozilla's add-on policies by collecting search data going to a third party provider or collecting search data without user disclosure or consent.","name":"Add-ons violating policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6d431a97-5d54-4de7-a012-5b030c5324eb","last_modified":1584054334501},{"guid":"/^((\\{93475144-dae7-452c-a9e4-ef9da092517d\\})|(\\{cfc5bfc9-3dc0-483d-8dc8-27d05f6cff30\\})|(\\{498bc33d-979f-4d5d-93e4-ba608752ad10\\}))$/","prefs":[],"schema":1583875388267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621571","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"965435ff-2bb1-4b17-9e0b-b157d5c53a91","last_modified":1583964274232},{"guid":"/^((\\{eb5bd821-bb2c-4968-bf17-8e9336fbdfc4\\})|(\\{84be56c9-16ae-4bde-a556-0b9f7946c1be\\}))$/","prefs":[],"schema":1583914825954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621578","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dc0fc5f1-511f-4fc3-9558-fc7d9fa61e75","last_modified":1583964274228},{"guid":"{dcfd7c5e-ca9e-461f-a748-74f187332e5f}","prefs":[],"schema":1583788354663,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621247","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Emoji Library (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"320f94ad-5e02-4209-a066-22f415100d06","last_modified":1583875387847},{"guid":"/^((\\{d8e66734-06c1-44f4-968e-9af179ca3fcb\\})|(\\{3e836ac4-d85f-4e8b-8647-6e922b3b2b2a\\})|(\\{71d690cd-dff7-4d28-9cfb-d92bd6522d1f\\})|(\\{f20a4998-3973-4094-b61b-cbaeff99ff84\\}))$/","prefs":[],"schema":1583757249813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620356","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d10ec091-688b-4906-9ed1-42aedc998e1e","last_modified":1583788354268},{"guid":"/^((\\{8890a066-99e3-417d-96b6-f71db4f5fec0\\})|(\\{49f9bb4f-f470-48e7-a04e-25baa35209d4\\})|(\\{38799169-e35a-4034-8e62-8d82ae8b8a85\\})|(\\{a67a2dc1-081e-4efb-aa62-5dc7f499fe86\\}))$/","prefs":[],"schema":1583759516487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620970","why":"This add-on violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"Add-ons using remote new tab pages"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4568b40-4efd-4cca-9680-ba50dea36ec9","last_modified":1583788354265},{"guid":"/^((\\{16004b4c-8fcd-43e8-8867-233023c6fdeb\\})|(\\{79fa9c23-e61f-4434-8b27-0bd44c37edff\\})|(\\{15d5bc6f-15f8-4d0d-9483-7dbbcf722c56\\}))$/","prefs":[],"schema":1583759652565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1620971","why":"This add-on violates Mozilla's add.on policies by collecting searches to 3rd party providers.","name":"Add-ons collecting search terms"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1caad16-4ec4-43ca-a145-04fbd5fd81c9","last_modified":1583788354262},{"guid":"/^((test@WhatsMySpeed)|(ext@630e3b49-decc-4d5e-8a9e-242df04e8ba1)|(ext@6bbf8f72-c54d-4731-b455-e164685c5914)|(sp@FindingFormsPro)|(sp@EmailAccessHere)|(sp@WatchTelevision)|(sp@WatchTVOnline)|(sp@QuickEmailAccess)|(sp@QuickNEasyRecipes)|(sp@MyFlightFinder)|(sp@BreakingNewsPlus)|(sp@WeatherDiscover)|(sp@MyRecipeFinder)|(sp@AppDiscoveryTools)|(sp@FileConversionNow)|(sp@TemplatesHere)|(sp@SpeedCheckerPlus)|(sp@MapsNDirectionHub)|(sp@FormsHere)|(sp@ConvertPDFHub)|(sp@ProPDFConverters)|(sp@DLOfficeTools)|(sp@MapNDirectionHub)|(sp@GamerHubPro)|(sp@MyLoginHub)|(sp@LocalForecast)|(sp@GoGamesHub)|(sp@LiveRadioPro)|(sp@MyOnlineCoupons)|(sp@TrackYourPackages)|(sp@MapsProHub)|(sp@ShipmentTrackers)|(sp@ConvertPDFTo)|(sp@EmailProHub)|(sp@FreeConverterHub)|(sp@AccessFreeTemplates)|(sp@ViewOnlineRecipes)|(sp@MySweeps)|(sp@SatelliteandEarthMaps)|(sp@SatelliteandEarthMap)|(sp@PackageTrackingOnline)|(sp@DirectionsandMapsNow)|(sp@ClassifiedsListApp)|(sp@MyHoroscope)|(sp@meinemailzentrum)|(web@meinemailzentrum)|(web@meinemailzentrum\\.com)|(sp@MyVideoConverter)|(sp@EasyClassifieds)|(sp@WatchSportsHere))$/","prefs":[],"schema":1583766889752,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618984","why":"The add-ons violate our no surprises policy","name":"Various add-ons violating no surprises"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"076d3556-68cb-4a5d-83cc-e4cca29d3f48","last_modified":1583788354259},{"guid":"/^((\\{deb55b0e-7064-4552-955c-15ba6a46ad79\\})|(\\{15d967ca-cb54-444c-a7ad-b0dad1dbb723\\})|(\\{7953fef3-37b3-4954-a0e0-806cbec35a63\\})|(\\{2deadd5b-1edc-4634-b342-4e20ad03fd2d\\})|(\\{f74e5fe2-4f8a-489a-8f75-f965a9d4a98d\\})|(\\{0df2d5d8-b197-4022-ad3f-c24a44e9d23f\\})|(\\{e972a079-8e0f-4426-91e9-2c1cf9c8b89e\\})|(\\{d9ce0e4f-e41e-4160-b58e-b99300fa5d83\\})|(\\{43473acc-f92a-445c-9ce3-efc297fb62d0\\})|(\\{5b86a98e-5ce8-4664-9051-3d8f7127d1c5\\})|(\\{5f1e99d2-147f-48bc-aa87-41ed02d65965\\})|(\\{ffd007b3-c085-4bcb-9629-19a528f346ba\\})|(\\{df4e0189-a17d-41aa-af86-b6de65952842\\})|(\\{06880fd6-ffaa-4c77-a5bb-97dcd0ce554b\\})|(\\{f4e654cc-7ee1-401d-ac52-ced86f38e575\\})|(\\{d207c7e2-8a92-4f8e-807d-027fa2eed42b\\})|(\\{8d9fbceb-756f-417a-a691-de9a2c1c5648\\})|(\\{3602c279-d63c-4f81-b832-ef82fda60514\\})|(\\{2f27430f-99b9-4594-83ae-60a4df917e38\\})|(\\{be81f239-4a22-4b02-8878-358a3dcd6539\\})|(\\{e7c3277a-c312-4072-837a-4417aae7269a\\})|(\\{d5783778-d85e-4768-9b91-16b9068df780\\})|(\\{8c6f409e-f740-4807-9a28-c898266c518c\\})|(\\{9b1a4630-5873-4b3c-bcf2-4b4d59cc9739\\})|(\\{8522aad0-47c1-47e6-afbc-1e53a113bb2d\\})|(\\{d0e1738e-e2ce-4e75-bcdf-fdef4c0b7403\\})|(\\{4ac16c6e-ff72-45b2-b641-bf92144e1118\\})|(\\{e9c99267-487c-4fcc-9585-4a8e08d4342d\\})|(\\{0fdf70d2-0dbd-4ead-b746-9cbf4cacac6c\\})|(\\{0393ecde-cfd9-4a72-aa9d-6b64949b890c\\})|(\\{e80bc052-25fe-40ea-813a-dc98dffc2a77\\})|(\\{bfbe94d8-3389-4e4b-8cad-67eedd3bfa08\\})|(9\\.1\\.2\\.1@qamypersonalzodiac\\.xyz)|(9\\.1\\.2\\.1@qafungamesnetwork\\.xyz)|(9\\.1\\.3\\.1@qafungamesnetwork\\.xyz)|(\\{1985b6a7-5f69-484d-b462-667392e9ceae\\})|(\\{0d802f03-a2bf-433b-8124-7a2126bc53d9\\})|(\\{4c7d34ec-3bae-40ab-8300-38136f1bbcaf\\})|(\\{f0a11d18-866f-475d-8804-93d16729e59b\\}))$/","prefs":[],"schema":1583769750285,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621039","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3a700b8-0177-4b11-bf7a-ae7c97e5115b","last_modified":1583788354256},{"guid":"{2abaf8da-5ca6-4896-8bf4-33cced7d1eec}","prefs":[],"schema":1583770759014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1621043","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pluto TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b7c877c-cf5b-478c-bc1a-d1a4f17f5599","last_modified":1583788354253},{"guid":"/^((\\{cf7362f7-d34e-423d-ade0-ff408145d75d\\})|(\\{225a2fd0-2266-4bbf-b1db-b4cd7ee3b774\\})|(\\{89ac12b3-2da6-423f-afdd-a755925070d9\\})|(\\{3c56ddf2-a46b-4338-9dc4-bf79a6947838\\})|(\\{4aec95dd-4720-4b7b-9032-c53c71c69531\\})|(\\{19efb4dd-72e6-4e76-9814-9185f0cebe1a\\})|(\\{a73d9f4d-dff4-47ff-ad33-1747dc74faf8\\})|(\\{58c16ee9-4ac8-466c-b8ac-5d8b019945f3\\})|(\\{a88f8f80-e2f4-4357-9f85-d49fcc22662e\\})|(\\{a623f590-df10-4f74-a281-27457212e744\\})|(\\{14df2d69-1ca8-4e68-8289-23816420eebe\\})|(\\{7789cecb-ccd2-4a7f-a75b-8d0243ab68b8\\})|(\\{0e2b182e-05c6-4830-9d20-b402c5598e55\\})|(\\{fd03573a-9361-4f90-9c60-be6013ebfb8e\\})|(\\{5ae01022-7989-4620-b46e-7ba5859e20d3\\})|(\\{d3ced839-59e1-4389-8631-a9f153187990\\})|(\\{07d66467-bc14-433c-84d7-905e8d2f550f\\})|(\\{3019ef01-bffd-45cf-8cd1-46f6c56cdda4\\})|(\\{1f0c9873-0598-4132-b20a-f0ab42c5c8a3\\})|(\\{b955bec7-392d-4074-bac8-60c6d1f402f5\\})|(\\{9f45dcf0-549e-4f15-a0ad-99ac2821fd8d\\})|(\\{16d5d1cf-0aef-4adf-99ce-214eb32d38fa\\})|(\\{b38602ca-4ac6-40b1-b20c-55828f514b3d\\})|(\\{55318007-10db-4d47-b4df-3946ed3653af\\})|(\\{cd2d96b3-e8ec-4ef9-95ba-72ee0dae011a\\})|(\\{b8250196-9419-4b06-9634-48f6c3570b53\\})|(\\{2a738b9e-5147-4441-91cd-e40a1ef50a27\\})|(\\{777580ee-50ee-4c37-98a9-844111149404\\})|(\\{a44f69d9-9c70-4b33-9502-b19e79399e3c\\})|(\\{2e6daca8-d5b4-4611-bd81-b964ab97bee8\\})|(\\{6fda5ac5-a41f-4905-a5c0-860313ab535b\\})|(\\{d51b14e2-4c5f-4601-b2b6-af8b572171cc\\})|(\\{dc5b9553-f925-43c5-936a-fd9ff0e56e47\\})|(\\{b0d8908e-ac38-473b-b20f-3a8d775c23f9\\})|(\\{d96abf04-438b-45a6-b6ec-3036124b5458\\})|(\\{469003fe-c00d-45db-82b7-c04635c227e9\\})|(\\{7d04eb8b-023a-4966-b6b9-06c706081d74\\})|(\\{41987721-6948-46f5-9e68-bcaf776e35ea\\})|(\\{127f13e3-f58a-44f6-bff8-955dd3688448\\})|(\\{09c02fc4-4a23-43c4-b1ad-854a3e1e6a29\\})|(\\{d061e0a3-7554-4a78-b7cf-e3f57df09b00\\})|(\\{28e445aa-892e-42e3-a0f1-30ab0ebba44c\\})|(\\{bc158e4c-6514-4b0e-9da4-6018326fe634\\})|(\\{fde60598-cfe6-4e9c-9f7a-28ea348a7f09\\})|(\\{a7addae9-82ab-4d91-a2b9-be373207bd9b\\})|(\\{71cc8c13-7aab-49d4-a419-b6e2880daaf0\\})|(\\{9a43f082-11c5-4062-bbad-04b63e6ed433\\})|(\\{19cdad5d-2a97-46b4-ba28-3a191d18b174\\})|(\\{99ee7e8c-61c2-4ffc-8f7a-c70c0bd4f1f9\\})|(\\{47706cc2-917e-4a2d-aba1-ee5c05613e0d\\})|(\\{a1a40297-cfac-455a-ad94-ef20eda2672a\\})|(\\{d807c94c-fbd3-48b7-9c07-a54336ace9f3\\})|(\\{0645230a-9e65-4a9d-ae90-97416f33f29d\\})|(\\{064d021b-9424-4700-b550-80c7a983c240\\})|(\\{59722380-31f0-4588-ac19-670f021cd67b\\})|(\\{0f504621-b4e1-4d5b-89dc-b57399b10c29\\})|(\\{ba135229-de15-41d9-8a35-fd198698fda4\\})|(\\{2117ec43-2df6-4bf2-a468-f067ea721432\\})|(\\{fd3fa8d5-be30-4e57-ba9e-ad11d0f70c41\\})|(\\{cb8e0410-17e0-4866-8075-b3224d52ea6b\\})|(\\{dff54861-9936-440e-94a0-92d39794be5c\\})|(\\{72c03815-0ef1-427f-b577-9c73bd19a7ca\\})|(\\{f13a447c-857b-4d93-a5cd-cb2578ede3d9\\})|(\\{8717ef97-76f5-4729-8a94-1ce396c0d2e9\\})|(\\{5e192df0-d31d-42b7-b866-155068118d2a\\})|(\\{d9238c4c-4259-4c0a-92c5-d03006959c1b\\})|(\\{95716b5d-ce17-4a97-9691-40f62291649e\\})|(\\{a0f9afee-bc26-4fa9-a1df-c705ad21cc94\\})|(\\{8f02a7c1-c6a1-4d3c-923a-59bd7e373205\\})|(\\{2452d750-d1dd-4cef-be51-3cc75f7a62d7\\})|(\\{e077a5e8-62c9-41a6-8427-10445a3d7818\\})|(\\{1685d632-1737-4bae-83a4-b0df6541f187\\}))$/","prefs":[],"schema":1583005290759,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618688","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons violating multiple policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41a53d4b-120a-4ab0-9dbc-8a8d3802b734","last_modified":1583233056644},{"guid":"/^((jid1-h7qSFwT2a1FJOp@jetpack)|(jid1-w4wG5nJhx4LJZr@jetpack)|(\\{74b0af75-8791-44e2-95a6-7f0ab94143ec\\}))$/","prefs":[],"schema":1582980182934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1619067","why":"This add-on violates Mozilla's add-on policies by adding abusive content to websites.","name":"Add-ons including abusive functionality"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"0.1.7","minVersion":"0.1.6"}],"id":"c4c0b595-6481-42a6-9e94-998b808dd143","last_modified":1582981347968},{"guid":"monstercropper@gmail","prefs":[],"schema":1582726441204,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618273","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Extensions Manager (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c706648-260d-42c3-8461-3ddcf9db11f9","last_modified":1582916527189},{"guid":"{df73c71d-e4b6-46e1-a853-9831ad860a7b}","prefs":[],"schema":1582752497018,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618518","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Dark Theme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59f951ab-6183-4ae8-9ed0-99b667fa2a86","last_modified":1582916527186},{"guid":"/^((\\{fa59fb58-b15e-4dec-a9e4-145fbdaa2f03\\})|(somethingadguard@ok)|(somethingsmartadblock@ok)|(somethingublockorigin@ok)|(somethingadblockpro@ok)|(somethingadblocker@ok)|(somethingadblockerforyoutube@ok)|(somethingadblockerlite@ok)|(somethingfacebookadblock@ok)|(somethinghostadblocker@ok)|(somethingnanoadblocker@ok)|(somethingublockmobile@ok)|(somethingurbanfreeadblocker@ok)|(somethingwebmailadblocker@ok)|(somethingyoutubeadblock@ok)|(somethingyoutubeadscleaner@ok)|(somethingyoutubevideoadblocker@ok)|(\\{d3360051-c575-4f6e-938e-ac3bd4598573\\})|(\\{e16f9fba-1ccc-4b59-b52b-69c452bddfd1\\})|(somethingadblockforfirefox@ok)|(\\{b707de34-1ebb-40e3-b44c-d46a2d10443f\\})|(somethingadblockforyoutubeyoutubeadblocker@ok)|(somethingadblockplus@ok)|(\\{4fead186-a35f-41b4-b794-6c90e6f8886b\\})|(somethingadblockerultimate@ok)|(somethingadblockerx@ok)|(somethingfacebookadblocker@ok)|(somethinggmailadblock@ok)|(somethingpandaadblock@ok)|(somethingyoutubeadblocker@ok)|(somethingmublock@ok)|(\\{b49fea32-c666-4259-98bc-50348f3909c5\\})|(somethingdudenmentortextprufung@ok)|(somethingemaillanguageproofreadingandgrammar@ok)|(somethinggrammalectefr@ok)|(somethinggrammarandspellcheckerlanguagetool@ok)|(somethinggrammarcom@ok)|(somethinggrammarlyforfirefox@ok)|(somethinggrammarlytomarkdown@ok)|(somethinggrammarnazimkd@ok)|(somethingjacindaspellchecker@ok)|(somethinglinguixcom@ok)|(somethingmaxigramar@ok)|(somethingngspellingandgrammarchecker@ok)|(somethingpruuf@ok)|(somethingspellcheckanywhere@ok)|(somethingthaispellchecker@ok)|(somethingwordeepproofreading@ok)|(somethingwordy@ok)|(\\{8097be72-4409-4b72-809c-062d67ec1a9e\\})|(something1passwordx@ok)|(somethingapricofreepasswordmanager@ok)|(somethingavirapasswordmanager@ok)|(somethingbitwarden@ok)|(somethingbondarpass@ok)|(somethingbrowserpass@ok)|(somethingclearlogin@ok)|(somethingcpmautofill@ok)|(somethingcyclonis@ok)|(somethingdatavault@ok)|(somethingelpass@ok)|(somethingethernom@ok)|(somethinggpass@ok)|(somethinghakopasswordmanager@ok)|(somethingheroauth@ok)|(somethingid50@ok)|(somethingikeyvaultdev@ok)|(somethingintuitivepassword@ok)|(somethingkeepasswordmanager@ok)|(somethingkeepasstuskpasswordaccess@ok)|(somethingkeepasshelperpasswordmanager@ok)|(somethingkeepasshttpconnector@ok)|(somethingkeepassxcbrowser@ok)|(somethingkeeperpassword@ok)|(somethingkeycatopensource@ok)|(somethingkeydepot@ok)|(somethingkeywi@ok)|(somethinglastpass@ok)|(somethinglesspass@ok)|(somethingmanageengine@ok)|(somethingmasterpassword@ok)|(somethingmaxaccessmanagement@ok)|(somethingmonapassword@ok)|(somethingmyki@ok)|(somethingnextcloudpasswordsclient@ok)|(somethingnordpasspasswordmanager@ok)|(somethingnortonpassword@ok)|(somethingonetouchprotect@ok)|(somethingpassb@ok)|(somethingpassbolt@ok)|(somethingpasscamp@ok)|(somethingpasscell@ok)|(somethingpasscodepro@ok)|(somethingpassff@ok)|(somethingpassfort@ok)|(somethingpassman@ok)|(somethingpasswordcrypt@ok)|(somethingpassworddepotaddon@ok)|(somethingpasswordconfidential@ok)|(somethingpasswordstate@ok)|(somethingpersipass@ok)|(somethingpersonaforfirefox@ok)|(somethingpfppainfreepasswords@ok)|(somethingphashword@ok)|(somethingpsonofree@ok)|(somethingpwdmgr@ok)|(somethingroboformpasswordmanager@ok)|(somethingsafeincloudpasswordmanager@ok)|(somethingsafelypasswordmanager@ok)|(somethingsavemypassword@ok)|(somethingsecurden@ok)|(somethingsteganospasswordmanager@ok)|(somethingstickypasswordmanager@ok)|(somethingsubsfreepasswordmanager@ok)|(somethingmteasierpass@ok)|(somethingtrustloginidaas@ok)|(somethingtweakpassfreepasswordmanager@ok)|(somethinguniqkeysecurepasswordmanager@ok)|(somethingvivokeyvault@ok)|(somethingwebsphinx@ok)|(somethingwebvault@ok)|(somethingxtambroker@ok)|(somethingxton@ok)|(somethingyotipasswordmanager@ok)|(somethingzohovault@ok))$/","prefs":[],"schema":1582832492598,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618810","why":"This add-on violates Mozilla's add-on policies by using a deceptive name and/or injecting remote code.","name":"Deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c21543e2-3f39-4ac9-b39e-6a2a18249351","last_modified":1582916527183},{"guid":"/^((\\{0aa583da-e323-42f2-b4d2-0bc61b493171\\})|(\\{20a15a74-371f-5098-a362-bd127db4f8bc\\})|(\\{c11016db-e96e-4eb7-bc19-7121d96d0e2f\\})|(\\{0fadbf07-bb25-4737-9800-b879a6e1c417\\})|(\\{e7fefcf3-b39c-4f17-5215-ebfe120a7031\\})|(\\{f85238e5-862b-45aa-9d66-0ab56a032375\\})|(\\{ea3f3dc3-6fbc-450d-9120-07b3b03cd9ec\\})|(\\{aa909324-7520-4dcd-9eb0-9f0a9ec3c003\\})|(\\{807833d9-8ea7-42f8-a8a4-46ff7519dd8b\\})|(\\{92047279-0910-4abb-beb7-a7f2cd6cf04b\\})|(\\{94036cd5-1829-4480-ab0b-e2455deafb9c\\})|(\\{05d0e324-7d90-3e2d-2eb0-6f1a9ec3c003\\})|(\\{abd0e324-7120-3dcd-3eb0-9f1a9ec3c003\\})|(\\{578e48b0-7c9b-4890-91ff-f6ce3e958edb\\})|(\\{0aa583da-e323-42f2-b4d2-0bc61b493183\\})|(\\{72d08da8-8277-47f0-8bee-ba5ad40dda6c\\})|(\\{9fd0e085-1545-13de-a831-ab9a05dcf253\\})|(\\{ced9def2-2d86-4a1b-a9eb-29e2f3c9eb48\\})|(\\{364f2138-c271-47a3-9ddc-466c4a27feef\\}))$/","prefs":[],"schema":1582891948231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618814","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae0ffe5f-a7a2-48ec-9b01-2c0c9d3eb2e8","last_modified":1582916527180},{"guid":"/^((o-o-0-o-o@codobir)|(o-o-0-o-oSearchBar@codobir)|(o-o-0-o-oAdBlocker@codobir)|(\\{93e2581c-ec13-4be8-bb22-d2544356fca7\\})|(\\{7582f270-d0ea-4f78-a1fe-851def5d06d0\\})|(\\{089fbef0-49fc-4237-ba6c-2604af7a6e18\\})|(\\{7f897f01-98aa-4e5b-b40d-dbdd7c968b8b\\})|(\\{5f6ae810-5186-466b-b7d6-29ab4355e3dc\\})|(\\{02dc7465-0eaf-44ef-999f-9dad3f9502ed\\})|(\\{0135039f-a362-4296-9c30-e8626bb484d4\\})|(\\{8775e445-b777-451b-8d4a-dd10985bf95c\\})|(\\{a244077a-0017-472a-b1af-8f0b4a167a3a\\})|(\\{ebcf3de2-902e-4690-a35a-d6160175639d\\})|(\\{209a92d8-da4f-4342-81b7-ed2b92863cbe\\})|(\\{a2cd102f-34e4-4ef8-87e9-b1d642b6716d\\})|(\\{6382c930-913c-4bfb-a82d-f098cf3e84e8\\})|(\\{323aca10-65de-4392-8ea2-591642470c58\\})|(\\{70508e0e-9f91-4bad-853f-cd76764a5a5a\\})|(\\{b673c390-83d1-43d7-b0e3-a7a2c79b23a4\\})|(\\{b74e188a-c975-4725-a6a7-53fe0645d424\\})|(\\{46ed97fb-8411-4e04-9332-0c89ea8cfbfd\\})|(\\{2b484d2d-5b4b-411d-b8bb-bc3e7d9672bc\\})|(\\{6e707a00-b889-4b91-8cf9-19674f09d849\\})|(\\{f24e3561-ecb6-4539-b9cb-95af4624811d\\})|(\\{46f41d8d-4bb0-4549-86e7-34c09c65b5fd\\})|(\\{99a15fc0-dcf0-4669-a895-664f286c6a88\\})|(\\{0585f5cb-8f50-4e76-82e2-75a0cf852d35\\})|(\\{783f9072-d29c-4567-93f9-ca424cd71fcb\\})|(\\{05d62c84-a9f1-401c-85f8-a657e6a85940\\})|(\\{8c44b1c4-364a-431c-98ec-9c7a88b8fef1\\})|(\\{44da520a-6bd8-40bd-8992-87ab3f866cad\\})|(\\{4dc3d7a3-58bc-4ace-ac3e-2776377595e1\\})|(\\{5cd1ffd4-2899-4b2c-a226-453c85d957c1\\})|(\\{74c7755a-16dd-4cf8-b407-20c47cb4b78e\\})|(\\{865fc230-1a34-4c95-a718-a53276d77a02\\})|(\\{a233e339-2ae5-4d5a-ad1e-d82db722a85d\\})|(\\{23e06ed5-bb15-4cd9-828f-df483e65e1f5\\})|(\\{840e5e73-880e-45dd-a2d0-fbefd09f368f\\})|(\\{dcc9f6a8-5306-4662-a2d5-9da72e9e6641\\})|(\\{a7714acb-7a85-472c-97e7-3310eb47fbc2\\})|(\\{88aeeecb-1924-4c1f-aa22-9d43e8757004\\})|(\\{55295427-ab86-40e0-a56e-f913aba2ae8d\\})|(\\{b80386b3-c4ae-426a-b755-e38999447aff\\})|(\\{71a36a35-73cf-4d33-8f9e-3e1b1f838f2a\\})|(\\{504212ab-b2e3-4157-a36a-b02bca78e727\\})|(\\{c4a86ea8-34d1-4a72-aeff-8b227a52f562\\})|(\\{c1413369-3202-4ec7-873a-23dc5715e180\\})|(\\{97ea8e7f-a2f9-4009-95bc-d9f8be5405dc\\})|(\\{76c146d0-ad1a-4457-979a-a0b84a7ca86d\\})|(\\{ea6a2984-78b8-473f-9850-f3406a8c2b79\\})|(\\{b005573e-35ca-4c55-a87a-25cb53ff526e\\})|(\\{00a73039-4695-4559-820e-e17b5fb5ccac\\})|(\\{fc05507e-2482-4928-b943-a7a6ad59d166\\})|(\\{e8cb2def-d6ab-435c-b2f0-af701a40350a\\})|(\\{524b9704-5aca-4283-aadb-fba6eead9b92\\})|(\\{7d629677-6ad7-43f1-b182-8734474c3fc7\\})|(\\{0edbf5ac-c258-4c65-af7e-8dffbdf847f5\\})|(\\{c5c906de-c84e-4b48-a738-e8e32546f496\\})|(\\{3a9abaab-8451-4909-978a-bf1d4e716137\\})|(\\{1195cc1e-0cc5-4e48-8b08-7160bdab5511\\})|(\\{3e3217ad-344f-4a2b-97ba-d4380a6d4f91\\})|(\\{ee4a70aa-687c-4176-9392-7e47b5c09afe\\})|(\\{7d1d1676-b23a-4249-9c01-f7f1dbcb18bf\\})|(\\{51e9d221-2349-4764-a4a4-00552369c210\\})|(\\{30b40c71-198b-4b3e-8ff1-569860189be4\\})|(\\{beef68e8-c078-45c0-a593-64a9bfb4b2bc\\})|(\\{6ce76b14-1c76-4774-919d-7a3c820a4d56\\})|(\\{522b149a-3a6f-4bc3-ab7d-1bf41e4c29cb\\})|(\\{17a2d3ca-1505-46aa-836a-85ea62b5b617\\})|(\\{d7b81889-d34f-467a-a690-9507b5d72647\\})|(\\{66463498-8185-4874-9fdf-be281b08df26\\})|(\\{5a144fd3-9e6b-4b3a-ba29-bba7fa187e40\\})|(\\{bb405e27-949e-41e2-9930-26cb8360dc19\\})|(\\{f7a40a38-b3e4-4852-9981-8078ae99374a\\})|(\\{8675dfc9-9953-474f-8b2c-16b1307f66ee\\})|(\\{62d44bdc-60ea-4a78-a738-e59dd50589bc\\})|(\\{a7875dff-b031-4588-9d4a-1f989704ebe5\\})|(\\{3cfd3ce1-f358-48a5-a30b-5cc144d14f38\\})|(\\{9ce2677c-ede7-45be-b281-2e0c9d24fff3\\})|(\\{d13d4d9d-e9ec-4833-948f-a8e2c4bb1ec1\\})|(\\{87d402fc-7bbe-4b48-8c1a-38984a9dff7e\\})|(\\{69b186c0-e619-46b9-a978-b6ac97abd26b\\})|(\\{408bfadf-6f2b-428e-aca7-e4b95037bd72\\})|(\\{2a047ecb-a3cf-4ef5-8420-d45ea9cb246b\\})|(\\{c171fea9-aa8e-4348-8b9a-1b371f4821ea\\})|(\\{4f24b616-1f23-4c60-aadb-2386900b690d\\})|(\\{766d6d39-6592-4f47-bd1f-84639a2e5ad9\\})|(\\{b7caa882-3108-487e-9f69-3f43168789ac\\})|(\\{e96c08ad-1eff-4687-94ed-a14a76c7152c\\})|(\\{cfddeb9b-5339-4df3-af2e-88e26987cb8a\\})|(\\{d558cc36-a306-4288-9888-a68c419b2cf7\\})|(\\{0765615e-cc53-4ed8-9501-8e33b627db77\\})|(\\{0de24de8-5130-43bd-b041-2d284a26b9f0\\})|(\\{114a7625-4642-4013-bf25-9d8c8a1e428c\\})|(\\{d2554ad1-d14c-43b1-9f3f-84ae454748be\\})|(\\{374319ec-ad46-450b-928c-feff04666d58\\})|(\\{f8a572d2-a614-45aa-a8a3-3cb6bdec3388\\})|(\\{d55d0631-bd77-42b3-8ca3-ff5889d69e4d\\})|(\\{4bf71a8f-3f21-4de0-8cc6-12a53df60922\\})|(\\{5787258d-5a12-4153-bd9c-5825c53786a0\\}))$/","prefs":[],"schema":1582892445504,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c948a9b-2340-4886-b8fc-29ca66c1790f","last_modified":1582916527177},{"guid":"/^((\\{e78b3b45-89ad-4210-9a6b-3150506851e1\\})|(\\{c5874e9e-f46f-4220-b356-476122247a0b\\})|(\\{941c102c-7b8d-40af-9f49-a0496d89b486\\})|(\\{97c53a72-d50f-4e1c-8d26-f0aa8578a4aa\\})|(\\{65d9977d-e895-490e-ac9e-83031d46551f\\})|(\\{6e27edd2-f950-4b69-9a4a-f4941f2b0621\\})|(\\{af4d7096-c51a-4cb6-a30d-d2790fd66325\\})|(\\{b666da6b-b171-465d-ac69-20ea2a8a9971\\})|(\\{8e83ab0b-d34a-49ce-9d64-6394637cd9e4\\})|(\\{763aa5bc-8faf-4103-bad2-d15aab97146d\\})|(\\{40613d6c-a8f9-4a8f-a048-72ca8f1206a5\\})|(\\{865cf362-afee-472d-b2ae-6186e59f8e3c\\})|(\\{6778c1de-8ab3-4ee8-9e3d-788b17060ffa\\})|(\\{a501a160-de33-4c20-96a8-b660fd18db01\\})|(\\{b27d330c-3ac1-4421-9c96-1a5781ee9bff\\})|(\\{3997ee99-bd51-4f18-95b1-3b8a887ea014\\})|(\\{ffb40ecd-2ef3-4dfa-8c69-9a847c853b0e\\})|(\\{061c317b-b050-46a9-a7a5-2f9dfc0ef3c7\\})|(\\{e30d3343-fc0f-4526-8b9a-eebd6b7b1af2\\}))$/","prefs":[],"schema":1582898093853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618862","why":"This add-on violates Mozilla's add-on policies by using a deceptive name, violating Mozilla's No Surprises policy or including non-disclosed monetization","name":"Misleading or deceptive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7548e625-f059-4976-ab43-de78a1124dd2","last_modified":1582916527173},{"guid":"/^((jid1-C96jkOWH1jEZ5A@jetpack)|(@pdfit)|(@youtube_downloader)|(\\{503b5ae9-dcb1-41c4-9cf8-0c70a5c2bc70\\})|(\\{a9de7157-1c27-45bf-ab59-bedcbf57cff9\\})|(\\{908c4278-9f44-4b59-ad6f-91e2aabc8682\\}))$/","prefs":[],"schema":1582659695507,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618172","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98dbf563-0a8e-4796-ac48-1be0e4520610","last_modified":1582726440807},{"guid":"{6059d268-eb5b-491c-9879-964e1c67c854}","prefs":[],"schema":1582723099417,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618174","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Second Tab Search (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e15a83e1-60c6-475d-977c-83e180646e6a","last_modified":1582726440804},{"guid":"@searchencrypt","prefs":[],"schema":1582723268591,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1618185","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search Encrypt"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3c782d96-5d25-45d3-8f07-016a791e316c","last_modified":1582726440801},{"guid":"/^((\\{374c327c-fbd0-4769-a378-1cb0fef54b1c\\})|(\\{11d9b7d9-acea-4a66-94ff-3fbbcca15abc\\})|(\\{e9e3ac53-8384-4f2a-a451-78af21417b13\\})|(\\{61539a14-2728-448f-a071-45043287cf10\\})|(\\{9ca7082d-0e18-465e-8588-8d3990c5b9ae\\})|(\\{0444bcb0-66d3-49b1-ac1f-b79f7f682f15\\}))$/","prefs":[],"schema":1582486893083,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617571","why":"This add-on violates Mozilla's add-on policies by intercepting page loads with affiliate urls.","name":"Affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8ce5794-a1db-4a63-af32-1750de36a383","last_modified":1582562264396},{"guid":"/^((bazaarhero@jetpack)|(boingdeals@jetpack)|(boingdeals-1@jetpack)|(boingdeals-200@jetpack)|(\\{e9edde2d-5dda-46b5-b6ca-f732d96d941a\\})|(\\{29c11376-f72c-489b-a9eb-8fe309b1623e\\}))$/","prefs":[],"schema":1582548114995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617577","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1406ee6a-4eab-441d-ad1f-ce09b650ce2d","last_modified":1582562264393},{"guid":"{6ac0938d-7ca6-43ac-9c26-653d37820440}","prefs":[],"schema":1582549126839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617578","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"414cf401-fbc9-4218-85fe-5880068e8452","last_modified":1582562264389},{"guid":"/^((\\{d551e6af-55af-4295-92f0-ba0e3d15bb00\\})|(\\{36858137-f125-47fc-8e0c-499f161abaf0\\})|(\\{7edb2ea5-61a9-4447-87b2-d37ed4198d1c\\})|(\\{0ea11f50-96b6-4a8b-92f4-1eb6ca77acac\\})|(\\{1449de8a-cdb8-4f65-b909-c6391e49615f\\})|(\\{e7cdc797-edcb-46a0-a66e-f5dab3c808d6\\})|(\\{d57b5f9f-b35d-4879-84a3-3547d44249ec\\})|(\\{d4e41bc4-cb00-42d0-b756-ed8deb827cbc\\})|(\\{083acfab-6228-439a-b796-62647803b216\\})|(\\{ed2df6fc-df45-43ac-a923-bd3fbc3534c2\\})|(\\{ebc63925-e43d-4cc1-b234-4c8b6abc331c\\})|(\\{231652e4-ad9a-4dd7-89b1-d79876c0dca7\\})|(\\{2cb0bdaf-5789-415b-a92d-2adbc695cb63\\})|(\\{429a08cf-84c4-4eae-9ecf-fc6c3a07249c\\})|(\\{ec4fb55e-d94d-4196-9ee6-a6f19e3c9405\\})|(\\{bd55549f-9853-427c-a45d-6aba2b4776d2\\})|(\\{bbfa0b1d-c75b-4483-8331-b5b01c82fe5d\\}))$/","prefs":[],"schema":1582237690303,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617192","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Lusha"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b12eaf8d-77ff-4bd6-8b9f-797af110f86c","last_modified":1582301451440},{"guid":"beeline@beelinereader.com","prefs":[],"schema":1582298543556,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1617198","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Beeline Reader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.10.1","minVersion":"0"}],"id":"42642ca5-9342-4e51-a2ec-b5eed799468f","last_modified":1582301451437},{"guid":"/^((\\{e046e345-918c-4fe8-89a2-0987c5d12636\\})|(adi@fmt-tools\\.com)|(\\{90e41842-755d-40e0-9136-8129df55a64b\\}))$/","prefs":[],"schema":1582296975853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605160","why":"These add-ons violate Mozilla's add-on policies by making use of obfuscated code.","name":"Add-ons with obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b96957ff-ca4e-4ec4-97f7-3dbb4ddbc479","last_modified":1582301451434},{"guid":"jid0-G6461UajDjhNAwSukoedlkhD0XA@jetpack","prefs":[],"schema":1582141291510,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616735","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control and by collecting ancillary user data against our policies.","name":"Ratings Preview for YouTube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dca3181b-35a3-4dd0-9efb-8e7a19fab4d5","last_modified":1582237689888},{"guid":"{e0a905db-294f-4e91-be75-8b5c7c5df90a}","prefs":[],"schema":1582103702651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614333","why":"This add-on violates Mozilla's add-on policies by making use of obfuscated code.","name":"Gladiatus Time Saver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.2.7","minVersion":"0"}],"id":"a98992d1-8a30-406f-944d-c0161d0aaa21","last_modified":1582237689885},{"guid":"bookmark-this@page.xpi","prefs":[],"schema":1581968493407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616217","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24b4f43e-106f-44a6-a992-7d07634bb5eb","last_modified":1582103702173},{"guid":"/^((addon@faster\\.com)|(\\{09bfa06b-5e73-4daa-96bd-88092fe71c52\\})|(\\{eb4d44d6-4ad4-4b77-9509-8e6eadaef074\\})|(Blockfbunseenads@addon\\.com)|(Blockfbunseenads0@addon\\.com)|(\\{a8180cdc-19f4-4299-9bb5-5b6b2f2c2de6\\})|(\\{2454bb7d-4cf7-40f3-a5da-40e6889d83fa\\})|(\\{cd6999f9-c84e-47b4-a355-d54bedfe9c17\\})|(\\{53d5a956-eecc-456b-a6ce-b137c511a04d\\})|(\\{9b2dba6e-c179-47ca-bbd8-6b7033c4f2fc\\})|(\\{d77d7463-a323-4b3a-9b96-69b31e4d488e\\}))$/","prefs":[],"schema":1582023416031,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616233","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9119771-cb28-4853-8aae-72aedfe27b2f","last_modified":1582103702167},{"guid":"/^((\\{6fb37444-4339-4a36-9e4f-c4c47b550c4e\\})|(\\{430b4bcb-4487-471e-82b8-a3056ae137ba\\})|(\\{394990b1-4ede-4bdd-a3fe-58506591f00b\\})|(\\{3ca06113-1cea-4e7a-b775-19666a9c77a2\\})|(\\{deebf5b9-62b8-4b5c-8e1b-8f8d83939441\\})|(\\{15c41cbc-18a2-4756-80a9-418ba03f533d\\}))$/","prefs":[],"schema":1582027274373,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616234","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc8e1b77-eab1-42d7-9625-bf4153547903","last_modified":1582103702162},{"guid":"/^((\\{9664bedb-6f24-4672-8b72-2565e0b3fc21\\})|(alex\\.todor@gmail\\.com)|(alex1233\\.todor@gmail\\.com)|(alex123333\\.todor@gmail\\.com)|(alex131\\.todor@gmail\\.com)|(alex13\\.todor@gmail\\.com)|(alex12223\\.todor@gmail\\.com)|(alex1214122223\\.todor@gmail\\.com)|(alex1222214123\\.todor@gmail\\.com)|(alex1222214fawfaw123\\.todor@gmail\\.com)|(a\\.todor@gmail\\.com)|(abvcaasgawgaw\\.todor@gmail\\.com)|(abvcaasgawgaw122141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw122fwaaaafaw141\\.todor@gmail\\.com)|(abvcaasgawgaw12aa2fwaaaafaw141\\.todor@gmail\\.com)|(abvc\\.todor@gmail\\.com)|(ateststn@example\\.com)|(abvc1\\.todor@gmail\\.com)|(test@gmail\\.com)|(test1112@gmail\\.com)|(as@test\\.com)|(stagod@test\\.com)|(stagod_qa@test\\.com)|(stagod_as@test\\.com)|(fop@test\\.com)|(\\{e83eb1bf-7847-4253-8108-4c1ec0601757\\})|(\\{3cfa4fd4-a747-4666-b97e-2262f6255eeb\\}))$/","prefs":[],"schema":1582038056642,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1616286","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32ebf2f0-a321-48fd-a5a4-94a4980f4697","last_modified":1582103702156},{"guid":"/^((\\{04871291-3f6e-4969-a991-4183decfacef\\})|(\\{9493fc95-5a66-445e-9200-c9b617942c05\\})|(\\{a89d4fea-98ea-42bf-aeb7-e14059e809a2\\})|(\\{aabe1376-bc1f-440d-a275-284d026f3058\\})|(\\{b6aefc39-259d-4485-b8fa-c9b2ea77223e\\})|(\\{5ce16faf-66ca-401c-bf43-7c75cf75487e\\})|(\\{dfdf383a-eff4-4ae4-a8b8-97640748e795\\})|(\\{6a563873-967b-4644-afb1-bc3e9da68128\\}))$/","prefs":[],"schema":1581545094971,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615250","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1c5195a4-afb7-47ef-83c6-7c3c6f5d0ed1","last_modified":1581702872026},{"guid":"/^((something@ok)|(\\{4eefc8e1-086b-43a3-bb21-17c05f43cd3a\\})|(adv@blocker)|(adv\\.3\\.2\\.8@blocker)|(\\{f56e22e4-f6f9-48ca-aca3-480d9b293a16\\})|(\\{b26aabf7-6b17-424f-a71d-e8ca37ccb672\\}))$/","prefs":[],"schema":1581687835975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1615601","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d5259975-b1c3-4f50-861b-d7b4c082b58a","last_modified":1581702872020},{"guid":"/^((\\{6e27c586-e50c-49b1-9925-5427f3e9f028\\})|(\\{ae6dcbb6-d0a6-494b-bdfc-ea9d7b8f7667\\})|(\\{14aec2a8-0289-43f3-85fb-5d52491a0538\\})|(\\{b541ce5d-e99a-4629-9167-e71ac65bf32f\\}))$/","prefs":[],"schema":1581450092560,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614884","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ba0f5f7c-8998-49f1-89a8-7f3a15c41cc8","last_modified":1581545094556},{"guid":"/^((\\{0bbf5ce8-0bfb-4589-a4e8-4f1e435389d2\\})|(\\{820847ac-fb62-47a4-a6be-00d863584c76\\})|(\\{703d2caf-edff-4198-baa3-615135f97890\\})|(\\{f459049d-939d-432e-83c7-07ced47e629a\\})|(\\{0d56e009-957a-4575-a984-ecd22ccf3120\\})|(\\{88386103-f99d-4aab-83c2-64106a77748e\\})|(\\{29e30d06-1030-4a82-8e29-25706012da97\\})|(\\{c0d5c1cb-e676-4ff7-8189-793efc86fa2f\\})|(\\{aade33ec-2184-4759-8de5-5d61f1e29e72\\})|(\\{72dc5fd5-179b-40b6-9218-e88434939ed8\\})|(\\{8c9ec486-bd7b-40dd-ab49-1ca3ff452484\\})|(\\{67c0ce2e-2359-44e7-b9d9-1061a3c4a041\\})|(\\{149c0e63-b3f6-4f8d-bb1d-94b7e36d8aea\\})|(\\{c3a1e646-c155-4a40-b5bf-ac9252e6b632\\})|(\\{6876f3d2-97d6-46d6-b9bf-aa46264f6c3c\\})|(\\{330a08b1-d93e-48a2-9081-e93e25190eec\\})|(\\{443305ec-55d7-411c-bb4a-96e83b4e631e\\})|(\\{945964bd-5c29-48e3-9dd6-26741626c1ba\\})|(\\{ec8513c5-2bcc-45b0-ae77-da6685cfafd9\\})|(\\{57703f70-e1b7-462d-bf7e-657bac5eb30c\\})|(\\{8c1d6a6c-3745-429e-8ec5-2a374320e703\\})|(\\{2ff583b8-72a9-40bd-877b-b355ad33ce44\\})|(\\{f2ed910e-ab21-4ad3-a70a-8adca5e683f6\\})|(\\{4ae1f921-575e-4599-8b77-e8e7ab337860\\})|(\\{cfe7c709-6df6-4d54-9f4c-6fc3967904ce\\})|(\\{4e0cceff-558b-4902-9870-55ecb16f78a6\\})|(\\{093726f6-5907-480b-81fc-fafe4f04b5e8\\})|(\\{4a2650e6-fb1b-4e83-b0ad-4e991c9ac01e\\})|(\\{2dcd1f94-6a18-47c3-826a-d8f1044b3ade\\})|(\\{90e61a54-35d6-44c8-bb33-88623e6a03ae\\})|(\\{61389b8e-55eb-43ad-a68d-bebefe7476ad\\})|(\\{f8890846-fcc1-479f-a90b-dce3e486b0ba\\}))$/","prefs":[],"schema":1581438380344,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614707","why":"This add-on violates Mozilla's add-on policies by collecting search terms or intecepting searches that are going to a third-party search provider.","name":"Add-ons collecting search information"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d33858b8-d192-4be2-a844-b151f0f287ca","last_modified":1581441570691},{"guid":"/^((\\{312951c4-a455-4886-a2f1-e4fb05b9fee7\\})|(traderibis@gmail\\.com))$/","prefs":[],"schema":1581429986729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613706","why":"The add-on injects remote HTML code not compliant with our policies.","name":"TraderBiS"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52b9033d-de65-48ad-9062-7c340835feb0","last_modified":1581438379932},{"guid":"/^((\\{ebba9c65-d04c-4c02-afd1-476d7c06fc2f\\})|(\\{117f05e4-3403-4cbe-a041-30fa60054e9f\\})|(\\{03417bad-eb5b-4bd4-89f8-f10d78fce082\\})|(\\{42f0a4e1-710d-4154-b34a-731dbbe2097b\\})|(\\{6a0a9103-3482-4717-aca8-f22ee2228d25\\})|(\\{23d5c4a6-1231-4f87-ebf9-e5800eae221b\\})|(\\{99a32eb1-5da4-4a35-beb6-7c3b5222ce04\\}))$/","prefs":[],"schema":1581277291027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1614308","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39473bb3-638d-4b7e-a847-f197e6320564","last_modified":1581340917940},{"guid":"/^((\\{0E64F71A-6B21-4324-A5D9-69231DE8C20C\\})|(\\{747e7f5b-c9Fa-4e4f-b466-639b88c8998f\\})|(\\{8693cb76-1caf-4115-9bd7-6bab02330326\\})|(\\{cf8452e1-0ddb-44d2-95eb-4cb8e7a35707\\})|(\\{79bbada5-9050-4d8c-9367-0aad8185cd90\\})|(\\{C7928956-827D-4649-A234-BB758377C005\\})|(\\{512d597b-9bbb-47cf-b0e6-526456ee6d26\\})|(\\{fd591fc9-480d-4f04-8ae5-0be02121b425\\})|(\\{e3258209-0248-4092-bc59-3032565d2f0a\\})|(\\{725fc0a6-1f6b-4cf9-ae17-748d111dc16d\\})|(\\{3e30848f-3b39-425b-8538-d85da166cb19\\})|(\\{9e27a3ff-0131-4aed-bc7c-2364bd89d7c9\\})|(\\{74e039b8-a2db-4a41-9155-4ccfc2c86682\\})|(\\{cfd9177e-c8c6-4d94-b5e9-d87850e2c8aa\\})|(\\{e21459c1-5604-4324-a3a0-8d23800725ec\\})|(\\{a563f3c0-d631-442f-ae27-1467cd47f1f4\\})|(\\{cbb3237c-ed1f-4735-a364-1849c0907b3b\\})|(\\{5c88311a-c457-4d3a-961c-3dc0cf01e6f9\\})|(\\{0bdf29c1-0c18-40cf-b3a2-c938b5cfdabc\\})|(\\{56e0ce0d-ffff-46a4-b2cf-1260d6898b94\\})|(\\{673d181c-5a1f-42c9-a8a2-f2f5af4a2a2a\\})|(\\{63dc2763-30bb-45fc-90ce-0d2a5c07a46a\\})|(\\{2751af61-65b3-4e7b-b098-497d6d6d7629\\})|(\\{5ce7c96e-2e99-4a6d-8f5e-cbcd68fd64b6\\})|(\\{e7e1a9ef-2755-445f-a639-d9bbf5e1982f\\})|(\\{ef5483ba-d634-468b-93d0-1bed3f09306b\\})|(\\{10367a10-912e-47c8-ab86-9a752230e097\\})|(\\{bf13ca91-6471-45c9-999a-e6176ffa9681\\})|(\\{7b8ddd2d-c2cc-428c-8Ede-604995d8B4da\\})|(\\{d05d4f3c-74ba-40bf-afa0-ad944df067ae\\})|(\\{fed8f5bc-0324-4007-8e90-84709e0c57c8\\})|(\\{9ef981d5-0b21-41fd-9412-008633de79f2\\})|(\\{1569b001-9f51-46a2-a4ed-f2122c475799\\})|(\\{340eab9c-f3c6-4a6c-9439-79733e12df5d\\})|(\\{1ab78f66-5390-4db2-8d1e-c759599ef2a4\\})|(\\{ce00b27c-1a7d-40f9-be61-57ae046ebe1a\\})|(\\{9fc1abcd-3044-4bbb-b04f-c233f1d20bfc\\})|(\\{78255a39-463e-4fce-9a2a-acca442414f3\\})|(\\{159bf803-5c0e-4863-bfb1-7a036174bef5\\})|(\\{7828da87-6bf1-4799-91cd-6e9167511fa5\\})|(\\{9aa7920f-677b-4904-9ea3-cae4c4320d15\\})|(\\{3e78b05f-90aa-496c-ac3f-cbc92a738fa1\\})|(\\{cd9d2474-fff2-4f19-8452-0ec2f4422117\\})|(\\{c7722662-0964-4341-9232-0fdebb37811e\\})|(\\{fdb0fb76-f05d-4732-9348-6f8765673e14\\})|(\\{05abc1ee-f871-4ce6-a51d-6011cdf545ba\\})|(\\{300e263c-aed7-4df7-b197-82d5122ccf6a\\})|(\\{14775497-c7c4-4209-9d6b-a8a40c0aed1a\\})|(\\{10f8343f-0f77-4cb4-8266-e06dde15e8ca\\})|(\\{d2a58c6b-be02-4ea5-9e7e-6982454e9ef3\\})|(\\{0f27c13a-5921-4e7c-86c0-b43ad63a4bea\\})|(\\{f1922123-3aad-41cb-8ab5-281ec8cbe351\\})|(\\{be0f8a88-522f-43a3-8146-5b2ad0985987\\})|(\\{44056c1f-6259-4ec2-8e60-b1c65f9b1039\\})|(\\{1e4c4a84-ea2a-45c0-935e-59cc375575ee\\})|(\\{62a11f62-84b9-425f-b506-93c3711b73e7\\})|(\\{bcb5539d-0913-4d90-94a0-e3144ab239ac\\})|(\\{e4dd1b2b-dcd2-494e-b69f-8c76e89a6234\\})|(\\{48eeddb6-f7f9-415d-9835-b859e37ed024\\})|(\\{ddf2a2fa-a5ed-4765-a44c-4b56077cd588\\})|(\\{2a208cb8-5297-47b4-91a7-0e66475218d8\\})|(\\{7ec57eac-456d-442a-85f2-477cb20c3dde\\})|(\\{20aa1960-d5c2-48fb-ae09-fa6261381537\\})|(\\{b4ebedae-d18f-46d6-8b87-679d1fd27f3d\\})|(\\{67fa631f-29fe-4001-892c-1dfdd56e5ed3\\})|(\\{ae92cb39-b2a6-4865-a125-1b273ffb4a1c\\})|(\\{5b2245da-f41b-4fb3-88b3-5e9a097e06c7\\})|(\\{69272cbc-110d-4b5c-b903-16bd118ddf45\\})|(\\{d4d22de7-54af-40a1-99f7-c2b0f2d86a23\\})|(\\{e1445f3b-92ee-4085-a57f-380e96ed8316\\})|(\\{f9830d93-3782-44e9-b199-d2355f61b98f\\})|(\\{218769cc-3b47-4978-ac59-8a9447bcb193\\})|(\\{f472ddca-60dd-4d6b-90c7-244a84d0a487\\})|(\\{8af6985d-1eef-47be-8213-bd6e25dad273\\})|(\\{da95491a-1812-442a-bde4-7a29f69044d4\\})|(\\{f8d10888-29b8-48d3-8e5f-e02e41fb642e\\})|(\\{e9091337-2af8-440e-a318-ca9e0f053fc0\\})|(\\{3ba1e00c-8339-4ae3-a87e-f4af9f1ee33f\\})|(\\{b40e5bcd-5966-424f-8a15-6ecc3dba050a\\})|(\\{c376e851-c30c-48a1-9f59-d528d34560b8\\})|(\\{8ad33b1d-31a7-47e6-bb46-6c91bc1daea3\\})|(\\{dac8f2fe-662b-4017-bf62-5052d0b23af9\\})|(\\{c27b6b15-fd63-458e-91b8-5974a7b2242b\\})|(\\{b222e127-a52c-4884-8a0a-065342b0c74d\\})|(\\{f53f1857-3f7f-4cf2-9e4e-2533f2c253ee\\})|(\\{eb260b8d-f7d3-48d8-a29a-c2b07e1ed36e\\})|(\\{49f6227b-4803-46aa-b189-466869e8dc5d\\})|(\\{a8694ce8-04ee-49c6-81cf-cf005e7009b4\\})|(\\{c53aa3f1-3385-4e2d-9d38-daf09b0db7bd\\})|(\\{9b230441-bb88-4060-bcc9-637cc5a54639\\})|(\\{895ac4f5-bd07-41c9-bbe1-cdb4d2be9975\\})|(\\{6886d657-954f-427b-b52f-9ddb1b52da62\\})|(\\{d1bc06d5-8470-4120-a2af-8e05b252ccca\\})|(\\{2aad1b2d-c29f-4623-83ac-6291c169c4d5\\})|(\\{e54137a1-794f-482d-93b6-13e2dddf7bf7\\})|(\\{773b7d0b-dc32-4125-83b4-a74887588698\\})|(\\{dd8a0577-a2ef-4719-b138-8aae7cf05add\\})|(\\{9b0dc71f-13e1-42f7-9e64-518cf228c079\\}))$/","prefs":[],"schema":1581005656992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8b5feaac-be07-4612-a090-4714b80191f0","last_modified":1581082030075},{"guid":"/^((\\{7b931d6c-4721-482d-8fcb-8c789bafc9a4\\})|(\\{03ea1c25-7fae-4ca7-9e9a-4b161936232a\\})|(\\{06580af3-ba0f-4e49-966d-932b19f6914d\\})|(\\{7f2afade-1aa3-4acd-8161-4a7d111535c4\\})|(\\{45fc7dea-37bf-46ca-9ccd-4b156778ed55\\})|(\\{b8f12b3f-ebe5-4599-9c51-1414ba5783be\\})|(\\{6440c999-2444-49d0-b8b4-188503a14a32\\})|(\\{0741d175-fd06-414e-91ad-095d6484b8e9\\})|(\\{db88d1a7-fc18-46b5-b015-bd9599966cad\\})|(\\{4f3df885-1268-43ce-9e2a-45668ce523c3\\})|(\\{938ec54b-e728-4e04-9a05-108b2246cf51\\})|(\\{bd474d1d-02ad-40a4-9237-4cd64d16de55\\})|(\\{622b8278-44d4-4f9a-ad96-1363247ae6c6\\})|(\\{9fd1d710-ebe9-4da5-a488-d51eb1e88ac7\\})|(\\{ee4314d4-00a2-48ce-bd11-4364496faa8c\\})|(\\{a06cfa87-55e7-4c65-a71c-a5e984c38e94\\})|(\\{1e36e1a3-6756-4ecc-9138-6939b23ed54c\\})|(\\{219cb4e4-5e4a-484a-844f-fee741dc65fc\\})|(\\{057669e1-0925-4d28-bd20-0fb643ad290e\\})|(\\{466bf5d6-c235-4731-9539-ebf90346f096\\})|(\\{a96faf19-5035-4149-9664-773abbc0881b\\})|(\\{656b685b-a458-4651-bb39-66242c67dd6d\\})|(\\{1acdd00a-744a-4875-be39-5a136aa20d7d\\})|(\\{58873ce7-60eb-46b9-a4af-ae62095b3fb1\\})|(\\{387033d3-4292-486e-80f4-44e531349a54\\})|(\\{5b8b07d1-4e0a-4c96-aad5-672a00c1358e\\})|(\\{15a8fac7-2bf1-4536-b4a3-7f51c9b7fa1a\\})|(\\{668952b1-4609-453e-9972-e9557192070a\\})|(\\{5f017950-0824-4806-9cda-e17d454f1b18\\})|(\\{008db332-feb7-447c-8359-829c2e5fc374\\})|(\\{3d412505-479b-47c0-b330-3599533e783a\\})|(\\{117a7b8a-6c7e-4fff-8d48-e12b02871b91\\})|(\\{8753c4a4-e083-49db-872c-eef47d1d58ab\\})|(\\{f439338b-3af7-4afe-bd48-77ee1039077e\\})|(\\{32588122-b871-43fa-b845-60b548a30235\\})|(\\{89a92c73-87b1-48b1-bc68-b814d1348d1d\\})|(\\{dbb477cc-8be4-44f4-9cc2-845632a7e433\\})|(\\{da48acfb-08ed-484d-90b3-0e63c759a4f4\\})|(\\{af40910c-c446-4a65-843e-5c39b6ef38f7\\})|(\\{0121e1fe-e88a-452f-ba88-7c330f87c137\\})|(\\{9cc2b320-5edf-4b20-be94-108583cc9b66\\})|(\\{babab679-6c9b-40c2-b62b-e21a3b4b5734\\})|(\\{5e4d38a3-eefd-4fb6-bbe6-5eb69295f37e\\})|(\\{ffb5e280-9fb1-42c8-bfbc-ac2db8232d9c\\})|(\\{50198f5f-f09b-4d09-96e7-ca94e327ce7b\\})|(\\{eee19d83-6edb-4b9d-b483-1070d60595a7\\})|(\\{7c5e2b18-56ad-4249-8390-03dd99aa5b09\\})|(\\{61af5d39-dd37-46fb-8ead-c7756764458c\\})|(\\{fb0dabc2-2a3d-45b2-8ed4-dc22b74f0ab4\\})|(\\{e3eb4df8-0cfb-4380-a7c0-856d4deda887\\})|(\\{180a38cb-115e-4794-a039-696446dc6b4a\\})|(\\{91dc3cb5-ab77-4e1c-af09-d827a0df9e08\\})|(\\{c4fec1da-703f-49fa-bd3a-5d7f939d2ae0\\})|(\\{a75f51d6-8d4b-4a28-b706-300403b82859\\})|(\\{d79394db-944c-4820-a90c-a2f48ab5fff1\\})|(\\{d6f11f95-a27b-47cd-bbcf-a9b5f2dd2a36\\})|(\\{3e64646d-9618-44ca-bf27-e424e76bd622\\})|(\\{43b57421-3ba8-4116-82c8-afd142c05674\\})|(\\{30935b8f-9a74-4e49-b6f5-8bb95d3ab3a7\\})|(\\{1ec5af15-c738-492d-bdcf-c14fd5be5e13\\})|(\\{feff2b30-7349-4e7b-9a9c-541f97dbc9e5\\})|(\\{48dbfb68-13d3-4372-820d-d52ea58ebdfd\\})|(\\{1a3a904a-3daa-4d1a-8260-c20b44fec6e3\\})|(\\{3794f3f1-6a11-48fb-a7c9-b33344ee82ca\\})|(\\{e3587df7-7358-4a36-aeff-944db7ab30ff\\})|(\\{43a526a3-28ea-409f-933c-2ef3d9a0629b\\})|(\\{2d3e88ab-b4af-47d4-b79b-a0becf1437b2\\})|(\\{0e02d0ec-97b5-4b46-b42e-d4179b067478\\})|(\\{dc7083b2-64f5-4ec0-a84b-3e5fdd552f11\\})|(\\{69d07419-67e5-4465-ad46-b969d5e5c3f8\\})|(\\{f31bdeec-878f-4465-b9f5-e844b45eb9a2\\})|(\\{9b63b79e-32c8-425b-ad18-753b58b73cbe\\})|(\\{8caf71a8-6c65-4cd4-95c6-9913dd169278\\})|(\\{e1f6fe90-e0fe-418d-9ff6-566cdd5b60e9\\})|(\\{e34bd75e-5e7e-48e6-a84e-1d18e5fcfb2d\\})|(\\{087940d8-dc20-4e9e-829b-7bd96c37b02d\\})|(\\{48defe55-de7a-4051-a5cf-ac6a649e66bc\\})|(\\{8bd54503-66cb-49dc-81ec-9fa0e9c42fe3\\})|(\\{ed9f9df1-9f6c-4e4a-a4ac-5d422a7c2a5c\\})|(\\{13261711-0eeb-457e-9035-7c415e286830\\})|(\\{E3F6115C-B027-11E8-AD5B-6E4CAE35F1A2\\})|(\\{93654046-f548-4d3e-9370-cc2244406725\\})|(\\{943ba377-5410-47cb-a025-30d55960622c\\})|(\\{426123a8-3e04-4887-a4a7-18931eaa428e\\})|(\\{4c50cefd-8f14-41ab-b719-8606b116d1c2\\})|(\\{ab2d09e4-07c0-461b-94f3-b2ea2a6773b9\\})|(\\{3f20ebf2-5869-431e-a73d-53d435176b04\\})|(\\{5b845034-25ed-4b92-bfac-ed7b305a3e13\\})|(\\{24c45b33-30e2-4d41-adb1-2a1bd9942ca6\\})|(\\{46f426fa-dc37-4b1f-ae63-11370ec65b39\\})|(\\{d678f055-e538-4c58-8a61-746166ac5063\\})|(\\{f852266a-7f88-47d8-b610-6ca130d9774c\\})|(\\{dce62517-e86a-40e0-9361-64c2e61f011a\\})|(\\{f7883a1d-0f04-4f8b-85ec-f339b791335a\\})|(\\{204f251f-feba-487a-9bbc-ca8b22b222af\\})|(\\{59c8031e-40de-485b-9988-69a4f4f51e52\\})|(\\{a5207f0f-109a-406f-8d86-3a2c806c9c7b\\})|(\\{3b66b98a-8782-4f16-a2f6-33175f9b0101\\}))$/","prefs":[],"schema":1581076280856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0e546e4e-6d89-41a0-92fb-987b98efea6f","last_modified":1581082030072},{"guid":"/^((\\{0970b6b2-6702-443d-84fa-90f5b5cf7c10\\})|(\\{9ba7732f-7e77-4dae-9885-a9cb91930b0b\\})|(\\{dd43f6d2-30c7-43df-bce6-6edc46c84d9d\\})|(\\{72207416-61e9-4960-9cb2-87d2df8486fa\\})|(\\{d53274cb-43e2-4cbc-b1f4-5463cc026ab0\\})|(\\{e1faa92b-b124-463e-b247-2609d534733c\\})|(\\{654068ac-aa86-4f05-aab3-f9dbea380021\\})|(\\{58d9fc43-39c7-41be-96a6-a27b1e179191\\})|(\\{f5469e0b-d4cc-4c30-9922-f0c82f1e04e2\\})|(\\{2ebc9fc9-8642-4f97-935a-6885e66ed6db\\})|(\\{b7d87fb6-afc7-4544-b798-7fcc1c8114f0\\})|(\\{d36916ad-9b5b-4390-b302-321c43d85753\\})|(\\{1e67d5ab-aff2-4540-a2e7-cd19ee112ab7\\})|(\\{82f9d6fb-cbbb-4862-8c18-c0876aa00c3a\\})|(\\{2a78a205-7363-4d76-9eea-a862be445724\\})|(\\{bb65aeb0-db01-4f8b-893a-634d2977269f\\})|(\\{5cac0db7-8b8d-44e1-8932-687b152feb8b\\})|(\\{6cade252-0973-49b2-acda-36960804c0f3\\})|(\\{61e466b4-00e9-4ed2-94bc-dbfade21f066\\})|(\\{316b549c-841f-4f2e-9e91-5a8cf5c22808\\})|(\\{73571d19-5073-4b32-915a-a2350e814cf1\\})|(\\{2e5d7ab6-cdea-4a23-8bb5-3245ccec2c5f\\})|(\\{fbf35eb0-14de-483f-90aa-3f8c4ea773f0\\})|(\\{4a9619bf-edd4-4f6c-a787-c919cd4b1d17\\})|(\\{167fc8e3-1bcf-4f46-a8f1-1722db81c4a0\\})|(\\{b861c901-a92c-475a-9efd-805d01a1c6bf\\})|(\\{6800f73d-3133-4697-a368-16c1f6e63894\\}))$/","prefs":[],"schema":1581076281891,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613891","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dbaa501-a6b0-439b-9871-79f081f4afdd","last_modified":1581082030069},{"guid":"/^((Search_Secure_clone_oRrmYYtiAX@www\\.searchsecurepro\\.co)|(Search_Secure_clone_rHXTjLgNGR@www\\.searchsecureprime\\.co)|(Search_Safe_pHUandPyRQ@www\\.searchsafe\\.site)|(SearchSafe_IEHxXeEbnC@www\\.searchsafe\\.site)|(Search_Secure_ByKsqSMauFtest@www\\.testsearchsecurepro\\.co)|(Search_Secure_GyQyTTzqnYtest@www\\.searchsecuretest\\.co)|(Search_Secure_NhrEwtJEhM@www\\.searchsecurenow\\.com)|(Search_Cipher_bBzgbIQyiC@www\\.searchcipher\\.co)|(Protect_My_Search_Online_clone_jtypmmXRwz@www\\.protectmysearchonline\\.com)|(MyAstroFinder_LTEnkWRkmt@www\\.myastrofinder\\.co)|(Live_Weather_Check_PZjCbwpxyH@www\\.liveweathercheck\\.com)|(Travel_Deals_Center_clone_GvEXeOfSMc@www\\.traveldealscenter\\.co)|(Dictionary_Pro_ARbsoVmMdl@www\\.dictionarypro\\.co))$/","prefs":[],"schema":1580931692537,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613657","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e480bd4d-7ff0-425c-9c1d-4153fa55ea81","last_modified":1581005656617},{"guid":"/^((\\{0fc22c4c-93ed-48ea-ad12-dc8039cf3795\\})|(\\{0A2C2098-F04D-11E5-A933-5334BC8E7F8B\\})|(\\{8504399b-e635-40fe-8943-977a58521db3\\})|(\\{347d4451-8da5-4d67-96b2-a2e8a6de8e09\\})|(\\{176c8b66-7fc3-4af5-a86b-d0207c456b14\\})|(\\{8692b95e-1a13-4118-b5b9-be8f3d2fc9b7\\})|(\\{b3e1e418-986b-4231-8579-0fc754574d9c\\})|(\\{88619e16-f0f3-4606-837f-a4496d11c0b4\\})|(\\{b4229471-001b-4960-bea9-795d91cb943e\\})|(\\{16390554-6fc5-4dfe-b7bb-809e378df660\\})|(\\{5fa01132-d07b-40e1-b958-e7825b878422\\})|(\\{07ebc943-2c8a-44a9-8d4d-5bbb78b2d2e5\\})|(\\{02405c0b-a202-483f-ba02-b09bab55cebd\\})|(\\{094f9b39-0561-4cb4-8b51-cb8ee5bd5b90\\})|(\\{a66e7db5-fc74-42c8-8e8c-d7a401a577d2\\})|(\\{58f9a1bb-0635-4b79-bb41-166c3e810329\\})|(\\{9da80afe-bcd4-4271-8f70-f986370d954c\\})|(\\{2671041f-f659-43b1-a400-0f7a3b852f74\\})|(\\{d9c98668-f0a1-43d7-800d-0c6d11321663\\})|(\\{1d6f99a8-d100-446e-8cc5-85231e7ab7fa\\})|(\\{ae170991-a8c8-4caf-b6cc-a3cc994abe83\\})|(\\{bfdd7357-3692-4d5b-86c5-4d86cd5e39e3\\})|(\\{aa5e865e-1e21-4ed9-b80a-f374be86b5cc\\})|(\\{26c58d0d-8514-42d5-87fd-701fd53ce3b8\\})|(\\{c934c41a-5de5-4086-b2da-1afc7d744162\\})|(\\{e87de7b9-5994-4b91-9c1a-a1d4d12a3969\\})|(\\{0eeab47a-73f3-48e7-977f-08815b4ee5ad\\})|(\\{1df850c2-38cb-46f1-87a5-308af6409c14\\})|(\\{1f481c59-fe50-4148-83d1-ff551f6dddf9\\})|(\\{70cfab72-ee99-428a-b5fb-26d924be3acb\\})|(\\{b156eeb6-cf37-48d8-b15b-bb863c431ba1\\})|(\\{a81f7ce6-0cc3-41fe-a33a-eb856636c887\\})|(\\{3949b4a3-bbb6-4119-9fa0-249fdff22c45\\})|(\\{abe2755c-a3b3-4714-a354-51eb5b8129fe\\})|(\\{547f048f-4fbd-40ef-9365-3d54559eae61\\})|(\\{e3e293e3-f18a-42f1-98bf-71d8166aef54\\})|(\\{ca742d81-6e6d-473e-ab68-f757d480e159\\})|(\\{6ac89db3-5ee1-43d8-a12b-a1b6e0ceafe0\\})|(\\{4eac966b-28db-477f-a471-a3bf74621110\\})|(\\{2c413992-ba94-4917-bd57-57eef39b4f8a\\})|(\\{6935560b-a856-42be-baa8-a06459785ed7\\})|(\\{503d9872-3db8-4f05-9c9c-b8bcd6d08ae3\\})|(\\{2055799b-b1ed-44ab-9200-4190467a3c59\\})|(\\{fe27a89e-a1b6-408e-b0b3-b2ccc0cbdf3c\\})|(\\{3fab2a05-1bfa-458d-93f8-16c523d72804\\})|(\\{32939492-d835-4540-9c03-1af0b715268d\\})|(\\{e9c96255-4eed-49fa-9740-54ef684b8197\\})|(\\{45fc39ef-f2c8-449a-b533-77e4d6202777\\})|(\\{d3ce94d3-a9ee-49e2-9290-031e56a4a5d0\\})|(\\{6b8a371e-ce42-4355-b4bc-ad4c83d5f932\\})|(\\{cfacd4cc-9f18-40f2-8711-795e738d51be\\})|(\\{d41f259b-c827-46d9-891a-33b6caf2370c\\})|(\\{3e90457a-815b-4b0a-812d-f02a43c23951\\})|(\\{063de0bf-2da4-48c6-bed2-ed11ecb3bfb8\\})|(\\{cd253156-e140-433a-a0fc-ccab28bf069b\\})|(\\{9a6f884b-3b8a-4925-8f7e-a975e2f6ec20\\})|(\\{5986d98c-b75c-46d8-9c5a-0fef03cddd5b\\})|(\\{8d586a4b-f00f-4a5b-940b-2fe00dc2905c\\})|(\\{ab0f5841-11f0-4c92-9bf8-b885f4431253\\})|(\\{eb1bafab-7f4d-43a6-8f78-fb0dbb099cff\\})|(\\{e6b152f0-5457-44ab-a6cc-d7869dc694a4\\})|(\\{942fe5ef-e9a6-4791-b840-a2e74baaeb4a\\})|(\\{d1c67270-c2af-47af-a4bc-2c020df200c5\\})|(\\{8a934de2-3238-4c24-aa29-52e1fafc64d4\\})|(\\{c65f3bbe-684e-43d6-b030-615118b38e54\\})|(\\{286f65d2-6b01-4f04-871e-2cef4095065f\\})|(\\{2FF4B97E-A47A-11E7-B621-7403A54193D8\\})|(\\{da482f08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{3a961d08-8ca9-45af-9c30-2ba4d673e10f\\})|(\\{e87de7b9-59a4-4b91-9c1a-a1d4d12a3969\\})|(\\{942fe5ef-e9a6-4a91-b840-a2e74baaeb4a\\})|(\\{b15a65af-8dbe-46ac-9537-f91fb1640809\\})|(\\{da48af08-4b6f-4c59-942a-75e1fedc8c6b\\})|(\\{ce2c3653-8d63-4cd0-ad8a-31f03703820a\\})|(\\{5d987ae9-c201-4352-a219-a34ee28a6f9e\\})|(\\{b15ac5af-8dbe-46ac-9537-f91fb1612309\\})|(\\{3fa556a3-3bfd-4e4b-b403-072938701c66\\})|(\\{57baae18-26fa-4ec0-9fe8-a0e197c1a220\\})|(\\{4de7b432-e5e2-45d3-95cc-df3e913b68d4\\})|(\\{a15a65af-89be-4fac-9127-f91fb16c0809\\})|(\\{c2c8b504-f5bb-489e-858f-38ca5224d033\\})|(\\{7f458bd6-4841-4373-97a4-a3d140b02552\\})|(\\{e20bc238-0831-4d4b-9386-d2fa5abe804a\\})|(\\{e51fa7b7-4c3f-4f66-8bc7-e864a413b790\\})|(\\{f9c04a94-59d8-47f7-a97d-980ff99f81cf\\})|(\\{d6ea5103-78ff-4736-b2e0-c0ce94bee77e\\})|(\\{f8fd0172-1b1a-4084-b440-4119996ab2c9\\})|(\\{a52e4eea-9923-443b-98a6-942eb27ba324\\})|(\\{a1fcb660-c2cd-49b7-a327-88e887afb43d\\})|(\\{cea42340-da28-4c95-89c4-0a66d69050d4\\})|(\\{c2f47878-f9d3-4c89-be58-a69dd9d1484a\\})|(\\{7ddf85d3-7014-4fdb-836a-fbbe4385347f\\})|(\\{36f452d0-6154-4be8-a388-174fc98d9333\\})|(\\{c69d7a2e-ad00-4e9f-80d7-fa0604ac3954\\})|(\\{8d40db57-9287-473d-b398-259d702d92f1\\})|(\\{bf51b8cc-a07d-475a-9013-91e2c089ae60\\})|(\\{32030663-2a21-4d20-a2e6-ed3d4a51b704\\})|(\\{1204abf0-0409-4934-ab58-1f5424134bc1\\}))$/","prefs":[],"schema":1580758890801,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c6f59bf-90a6-4fdb-a12d-f1b4a1446331","last_modified":1580842055124},{"guid":"/^((\\{a88e625f-b840-43b2-9feb-99c259b6751e\\})|(\\{0cc6c564-63c6-481d-9dbb-ddfd40ced202\\})|(\\{329e1c15-fcee-4063-83bc-59c894861cbc\\})|(\\{98e2e7ef-e544-4426-a182-621e8b85c15d\\})|(\\{d8869a56-bccc-4011-9b86-2962a57d7377\\})|(\\{255138e4-d9f7-4779-8713-e5970090ab67\\})|(\\{ee5907df-603f-4684-8f2a-425742ed37cb\\})|(\\{0e725b0e-9f26-4bb5-b9b1-738df2692e19\\})|(\\{2bf69cca-c4cc-4200-ab56-1d27fef48e03\\})|(\\{4edc1ea7-7037-4b54-8a64-a43339545710\\})|(\\{6edff7c6-97a8-4355-a074-e191b0a9a4ff\\})|(\\{79c5d05b-a6ba-470b-b06d-d33fe04418e5\\})|(\\{a1ebe305-b540-4dc5-91a2-8a2a0d646efa\\})|(\\{1211b4db-1ed4-4630-82e6-cdf69d58f035\\})|(\\{4d4e8ee2-78aa-42f5-a30a-c3727241cb96\\})|(\\{b6178891-7400-4b86-8a96-d57b1b7eee20\\})|(\\{3cfcb0bb-f7fc-440b-bae9-1050a966013b\\})|(\\{747931c3-bf5f-49d0-a4d2-615847200653\\})|(\\{989fcf36-da63-4d83-a036-b996788e7a4c\\})|(\\{a0dc99d3-7b9c-4fa2-8d42-39179b1e1e5a\\})|(\\{d4ce8b88-6b17-4ed8-b695-29da839dfb41\\})|(\\{cb2af2e8-ca55-4545-864f-96686760b59e\\})|(\\{3961b434-016c-4598-9ab2-38425197f32e\\})|(\\{b4e25be7-a4a7-408b-8759-8b185b4421f7\\})|(\\{0cb56fc3-e3f8-4ea3-aba7-4a2d351f82be\\})|(\\{b3e9621c-3194-4cf8-8b28-4ad32a988d5a\\})|(\\{241b64a7-7b2e-475b-b195-b1cfeb099745\\})|(\\{b727f9fe-9345-4ce4-8797-f65f85dfad7d\\})|(\\{a90d260f-7c39-4539-9948-8f3ee4406a9e\\})|(\\{35a57c90-ce66-42f6-ad0f-52b92690f4c2\\})|(\\{83048c90-baca-477c-8774-054f80eca4e6\\})|(\\{91c1e004-2e1a-4103-89c2-2f585c2d306d\\})|(\\{a5701591-3a6d-43b1-b74b-c47a1b7aa5b7\\})|(\\{641eef82-a96a-4702-b3fb-f50f8d7cdc85\\})|(\\{b436362d-94e9-4209-a3e5-26dc7d1ec86a\\})|(\\{70dc19f1-1312-402f-a370-cd8a1e231116\\})|(\\{c9a68220-ad02-4b09-9456-12ed03121344\\})|(\\{dc0d8992-0c9e-4473-b8c4-72240fc7be39\\})|(\\{1c3ca6ca-1427-4b6e-85be-315e18f81135\\})|(\\{96309a2c-339e-4c3e-84ff-ef7dac131a18\\})|(\\{95d07270-fb53-40c3-9b9f-46ed78658a1a\\})|(\\{15700ca0-8d4b-40d3-99aa-bff59aa48676\\})|(\\{5d308759-368c-4b5a-804c-acb6e18c6436\\})|(\\{b47ace66-3443-4d26-a858-7bbcfe1c18b6\\})|(\\{10dc172a-38b3-441b-a2d4-52b4ce8e4b7b\\})|(\\{73a47b20-be2c-43e4-a728-c46d33612ccb\\})|(\\{5f3f1314-618c-4c3d-ac4d-f83ae6d247ac\\})|(\\{bb81241e-b093-4c55-8c3e-7dca2250ada6\\})|(\\{4d8be4aa-4790-4807-add9-af62132e675d\\})|(\\{4295e30f-80bc-4d48-b794-c609de6f2dc0\\})|(\\{057c6b57-46f3-43b4-9576-438afdd3b3ca\\})|(\\{60a58bf1-08ae-46d7-9010-5cfe8eb5f282\\})|(\\{bffd69a1-5a8a-4b0d-ae14-f8744adb92b2\\})|(\\{b5c0b80e-dbc6-4701-98c2-3b0b8e182404\\})|(\\{48306d77-a699-4cbe-9ed3-b3162dfff00b\\})|(\\{f1f285dd-4a5c-48ad-81bd-78fe204ed582\\})|(\\{da0b9335-8edc-4429-8889-c5872ad02417\\})|(\\{6e834570-8580-44c2-91b2-d30f687aeb07\\})|(\\{9ea1bae9-5dca-4a1f-9fcf-a325a39b85c1\\})|(\\{69149c7f-92c7-4d41-b88f-e68c237d1d63\\})|(\\{985e1bca-d152-4fc3-89a0-cba2c0ac44bb\\})|(\\{746c7167-56bf-48b1-bd6c-08b05b48a863\\})|(\\{4bc87632-de6e-4c23-8192-f561f185a823\\})|(\\{1d21ed2a-94c9-4bae-983e-5c1e5094060a\\})|(\\{148df2dd-451b-42eb-952b-f608f26cfb6f\\})|(\\{2c6d6dea-438c-442a-ae11-a943804d90b4\\})|(\\{2c7e143c-9f4d-412b-b552-17033d4992c6\\})|(\\{e2309514-8386-413c-856e-21b54ebc3d9c\\})|(\\{4b417a17-ff90-4f16-bb8b-fb1e0d9ca824\\})|(\\{7c68360c-d03c-4c26-bbfa-2f9c9064701f\\})|(\\{eefb2906-cb27-4801-9ae8-67b49807b151\\})|(\\{b7c790c9-aaf6-46f2-9462-812d3e129ce7\\})|(\\{aac68138-e60d-48e2-92dc-d28577e553d9\\})|(\\{5959fff0-d04a-4147-8d4d-aaa7bb314a00\\})|(\\{40bf9b7a-9c36-40a8-8e68-91b79eb3bd44\\})|(\\{96429801-73cc-403b-be68-fb8a992f9307\\})|(\\{218e967f-59b5-41f6-a22f-7fe3c1580956\\})|(\\{ba51f209-a2f6-42a1-9608-536058540d0c\\})|(\\{d993e7df-00f9-445f-9082-294017eeec36\\})|(\\{f1990255-00e8-4d34-91d5-11d09066e4f3\\})|(\\{dbb78ed6-8449-475f-a152-0148596539eb\\})|(\\{ac798a99-00f0-421c-a3c9-a13bea8ef728\\})|(\\{e486268f-9299-422e-91df-9706ea220c46\\})|(\\{ecf1e24d-cfeb-4fa1-9953-202c3e62a820\\})|(\\{caf7fac5-0784-4701-a50d-2d0c27074b9a\\})|(\\{8f85f7d7-7182-4a53-a18a-bf83f0bfd1b4\\})|(\\{be556a9a-df8f-45b9-87aa-ae0eaf50a2b4\\})|(\\{9f80406a-ba8a-4548-bb0e-e987fb1d7921\\})|(\\{d0386a6e-e364-4e67-b340-782492bdb3ee\\})|(\\{cb0d2b3a-929c-42f1-8874-07a0650d0298\\})|(\\{cd9f2f81-3674-4d3e-a1b3-824fd3e5e906\\})|(\\{58366e2d-3a39-4fea-b631-521e3e73162b\\})|(\\{d854ae81-f759-48a9-8732-2371664fe2fe\\})|(\\{4747285e-3ec6-4d8f-9d1d-d0430297f182\\})|(\\{2f1919a8-4ca8-4a80-9175-c2da3a98490b\\})|(\\{32b30902-43a3-4f37-8e86-860ea525e923\\})|(\\{60376450-fe48-4d30-b551-b35535df6e96\\})|(\\{22456782-c5e4-437f-9369-5b23b875cd6a\\}))$/","prefs":[],"schema":1580814638830,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3ee1de-0c37-4883-a22f-822c8d6f8991","last_modified":1580842055121},{"guid":"/^((\\{35417623-1a2c-4e75-846f-e2a7b95b3b24\\})|(\\{d6dfebf0-51d4-490b-b03d-a17bf7fe4a6d\\})|(\\{50c7fb39-c03e-4d82-a071-fac7eaf960b7\\})|(\\{28999f9d-6e83-4c52-bb2b-5d2c46b7ef58\\})|(\\{9409fdd1-d78d-4df8-bb5e-f178f42702f6\\})|(\\{4c356115-33da-49e5-877b-090c64d76a66\\})|(\\{cf674a88-861f-4357-aea7-37f09e534552\\})|(\\{43238f2d-ddba-4604-803f-889bfaa22ebf\\})|(\\{36405669-81af-44c0-83cc-32ae8f901db0\\})|(\\{2ca5cfff-58dc-47d4-b56c-c206d281a9cf\\})|(\\{b22df1a7-f312-41a8-8fd7-cdd160ba7be2\\})|(\\{cf019c95-1c49-438a-9398-3863642fb606\\})|(\\{c7a9d852-c30d-4e6d-b040-a445551bee61\\})|(\\{379932ed-2938-4ccb-b57e-2dc44c3b5121\\})|(\\{d2395ba4-96e4-4ffb-a4da-608f27328c9f\\})|(\\{7ffbda76-3f9f-403b-a5e1-559c4f18c1f3\\})|(\\{361db730-4c11-49e8-b189-fa461f738786\\})|(\\{677456f1-2716-4a23-9a74-f3867e860dbf\\})|(\\{46c19d03-16ce-45f2-82ce-d8ccaeb3ceea\\})|(\\{6339b6ff-da02-4821-b5a0-48490a54b14e\\})|(\\{7d4d815d-798c-4cc0-9561-2f84b4598f94\\})|(\\{40fc3311-9612-4cb7-b337-fd581dead5f2\\})|(\\{9e639048-d366-4db0-a15a-f1953130fc8e\\})|(\\{ce2d009a-47af-4e94-94aa-23bd8973addf\\})|(\\{41984c46-3ec2-4684-99db-a5c4356f7ba0\\})|(\\{a63f9261-e05c-45f8-8b43-f987eaf5b27e\\})|(\\{37e06cae-3367-43e2-bdb2-0c087f2603c6\\})|(\\{f9d80e53-acb1-4483-bf3c-f58920551ded\\})|(\\{1672a22a-f6cc-4318-9616-22e1e3b3049d\\})|(\\{1cc6cbe4-38ad-44c4-a462-a2a222bab5be\\})|(\\{0255dcf8-ac71-4403-ab5a-c8f7abf66a39\\})|(\\{564f7511-ba68-48a0-9a85-636a100ce3d1\\})|(\\{4ebf29d7-102f-497c-bc8d-696dd66ecde6\\})|(\\{4c4139ca-ffbc-4f10-a534-22dd4c787944\\})|(\\{a12c1827-a5fa-4c11-8403-e02e9520f0ec\\})|(\\{2178817b-1d32-4068-9675-8fffe11a88f8\\})|(\\{b779151f-7a4c-46b2-83e4-3dbad231a9b9\\})|(\\{fe8a8186-80ef-4112-a41f-7d00ffceb63e\\})|(\\{0ee72846-9a34-422e-b202-382aa19bc0bb\\})|(\\{c92d2fba-d002-426d-acc4-0891fa40040f\\})|(\\{e3bdfd08-fa29-4a56-9851-f6d0b965004f\\})|(\\{0017666d-27b7-4347-bbbf-6d389b4430dc\\})|(\\{c9db55d0-61e4-4515-a9a7-24e3783bf106\\})|(\\{fbf87239-ec23-4907-bb6c-93daa5015ea3\\})|(\\{44801e5e-a635-455e-b08f-f3da88b06bed\\})|(\\{59517a31-ea51-44cd-ac7c-02d952ecf04e\\})|(\\{ee075bcc-2101-4c9e-8f04-7e7281ca5c74\\})|(\\{fd073c3a-d7d8-43f6-9d1c-1865bc0ff940\\})|(\\{a15f4275-8f19-4508-b548-a88597092bbd\\})|(\\{568ad6c6-0b91-46bd-9093-bc394a84c257\\})|(\\{11f798d4-003b-41a8-aa65-1f566ff53f06\\})|(\\{a02f26f3-49f7-4e95-a69f-78b1ce2d3471\\})|(\\{ed48226c-94b9-4878-86ba-de38851290d7\\})|(\\{97e5276c-a627-4c62-8659-4772a81203c0\\})|(\\{4cb19fea-1568-4f0b-809a-0763fbb36888\\})|(\\{599cff19-2ba7-4bf3-93a9-87f7f277cadc\\})|(\\{f0564e7e-f154-4612-b50e-e0d11c47b359\\})|(\\{3cc8efd6-4808-428a-9e0c-ef6fa45d17b4\\})|(\\{3842feba-bb44-49f6-9511-de1a1b78d348\\})|(\\{ebc3de57-de6d-43ee-b76b-676893dd7035\\})|(\\{a5f552f7-7279-49e5-92cc-70f952534726\\})|(\\{3ece0c93-9723-4280-8356-d1eb2025e2d5\\})|(\\{8579047e-a427-4ac8-87b9-ee9651c1f856\\})|(\\{c9bfdfd9-4617-4749-afd1-265f0b7158cf\\})|(\\{0c570e22-54e7-4d93-86f2-36e19707018a\\})|(\\{cfc0fa6e-0d6a-4fcb-9dc2-58b220307293\\})|(\\{8640eaec-8d51-4d6c-b01b-a671f4aac012\\})|(\\{a0ca05be-c6f2-4c18-993f-de55abca7000\\})|(\\{de066e14-6527-4be4-9751-e53ea16fd60f\\})|(\\{5a8f8da1-3994-43da-98be-3a58ed4d2ec6\\})|(\\{bcd8524a-8f39-4eba-a795-aabdd95305b4\\})|(\\{7d76001d-fda5-4abf-93f6-a947dd3cca24\\})|(\\{d18219fc-b632-47dc-bea1-73451164d187\\})|(\\{e97fbca9-d513-4fa7-9524-576620470399\\})|(\\{069b10e7-f7ef-40df-87bb-95783401a54a\\})|(\\{12a978dd-a7b9-42c2-b431-65aaa56c2a77\\})|(\\{66ba2e20-9378-493b-837f-4b3a028ab5d9\\})|(\\{9ad5b1e9-a19c-4a65-be1b-8b888da7cf58\\})|(\\{87ce9b48-e659-4b14-ab54-c80ffbeaa77f\\})|(\\{4da94d09-4730-4277-a544-f3b7890b6666\\})|(\\{30e6c020-4ec6-4b18-8f29-3dc294fbbb44\\})|(\\{5bfbdd70-ce54-4686-9351-0d90a7dd011f\\})|(\\{17eb23ec-f059-4857-a405-9d06242e99b5\\})|(\\{b4170b6a-0af2-45b1-9214-3665e870ab3a\\})|(\\{bc20b5b7-46c3-4af6-942f-f0323445b576\\})|(\\{44edc268-9242-461f-9d8a-fb59337101b0\\})|(\\{301321f7-e0a2-4cc2-9cc6-7ee1390ea895\\})|(\\{b57a503c-6370-4ed1-90ed-1b6444ca1e52\\})|(\\{c4707969-efc7-46ce-845d-28a46c78fda6\\})|(\\{22714afe-0f06-496d-9897-31e52e83a12e\\})|(\\{a07fb8cb-91fa-4799-9ff5-115e8a88b57f\\})|(\\{f539ec45-16dd-47a3-a9d5-8643b021d4c9\\})|(\\{b9348282-9380-4e55-9939-e4c10254a496\\}))$/","prefs":[],"schema":1580814639945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1613073","why":"This add-on violates Mozilla's add-on policies by redirecting searches or collecting search terms without user disclosure or consent or other privacy violations","name":"Add-ons violating Mozilla's policies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae074a33-05f8-4721-a9ff-7111502291c2","last_modified":1580842055117},{"guid":"antimalware@titansurfer.com","prefs":[],"schema":1580240491748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611797","why":"This add-on contains deceptive code that is not in line with our data collection policies.","name":"Titan Surfer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c703b7fd-4b40-44f8-9de6-786b66ef8e1b","last_modified":1580742890204},{"guid":"app@OnlineFilesConverter","prefs":[],"schema":1580380822975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612169","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Online Files Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bcb1821a-25e6-4b9b-a54c-bf4543f895c0","last_modified":1580742890201},{"guid":"{f83128d7-ef15-47a2-a99a-70d181413b81}","prefs":[],"schema":1580381170095,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612294","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake banking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1ca7b6ce-30d5-4290-b46f-9fad59b65f9c","last_modified":1580742890197},{"guid":"{d281b854-0c99-4e4b-b647-32038ae53c27}","prefs":[],"schema":1580727235989,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612868","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SApp+ (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93cceac3-803b-412a-b413-fdb1b0689626","last_modified":1580742890194},{"guid":"/^((\\{236a5a66-132c-4d7b-a62f-66f1a76bb7b7\\})|(\\{0fadbf07-bb25-4737-9800-b879a6f1c417\\})|(\\{c8ec696d-935c-45d0-a604-180244e839e3\\}))$/","prefs":[],"schema":1580740785659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612869","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"183a1de1-2625-44d6-90df-cbdbee9d23bd","last_modified":1580742890191},{"guid":"/^((mozilla_cc4@internetdownloadmanager\\.com)|(\\{4509d977-32a4-480a-ab95-6ddb5bfc6616\\}))$/","prefs":[],"schema":1580741006002,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612871","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad2f927a-eb67-4360-92e0-87f567608c1a","last_modified":1580742890188},{"guid":"/^((\\{f2431eaf-2b0d-4f0b-8148-3188db294d73\\})|(\\{c43e5363-2c61-4c3d-afa4-9cbe06e767d0\\})|(\\{bb8eab9f-4611-496b-bd31-a1b2ee66d8f9\\})|(\\{5f61d055-ae45-4ecd-9570-555609f66f5a\\})|(\\{532d8a77-86b6-4a7a-87a4-d973dc0cf9d0\\})|(\\{bfd10065-670d-4477-98dd-8bb4285040d5\\})|(\\{79f33a52-631a-406b-afcf-9be8b4bb480a\\})|(\\{fd994367-ecfe-44dc-a595-cb155110492d\\})|(\\{9a01416a-758c-4fd7-8e56-998acc588f9b\\})|(\\{517a72f3-e9cb-4e9f-8a2a-9639f4daed76\\})|(\\{4fda7f17-eaa0-44d1-91e5-7d8305a2de0e\\})|(\\{695bd646-ba09-4a3d-9616-191b355aec33\\})|(\\{6893ed50-b006-430c-bbfe-5f049e57470b\\})|(\\{7a2f84c6-d1ef-4902-bae7-b6c7807cb32f\\})|(\\{afde1624-c4a4-4494-9ed5-1ad15799dbd4\\})|(\\{e05b53dc-910d-47ce-9c9d-5195e8e8f3e5\\})|(\\{11b0ec0d-ae49-4ce8-a13c-198affdb4d9e\\}))$/","prefs":[],"schema":1580741081005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1612872","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd36267c-dbd3-4df1-bc01-5f566ba56de0","last_modified":1580742890185},{"guid":"/^((\\{6b7df170-e6fa-4b9b-bd76-d6b866a5bc6c\\})|(\\{7e1c1f98-4c89-4668-b9ea-e258e7c9e22b\\})|(\\{1f2128cd-bcaa-4e60-b555-0713054df0f9\\})|(\\{9043971c-ce88-400b-b56f-7a9e3853eb32\\})|(\\{afcbdf71-be6d-46cf-b5ff-6a6b9ec7f920\\}))$/","prefs":[],"schema":1580067691094,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611725","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4a4d34-1341-49ea-8b53-96a1ecfac49e","last_modified":1580207330647},{"guid":"/^((\\{0ded4ebe-965f-4de0-89d2-91ed13ae15ee\\})|(\\{5c143da2-6a9e-4afe-9ca2-b758aebe6e64\\})|(\\{c6566b12-297b-41fb-8189-f32a7d1c1b87\\}))$/","prefs":[],"schema":1580078568605,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611806","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70af2927-6552-4eae-a91a-89e4cdd61b88","last_modified":1580207330645},{"guid":"/^((\\{9237d0ab-aaf0-41a2-b873-c0f131b09ce4\\})|(\\{18b14b7d-e228-416a-bab8-37acf6d6dfca\\})|(rwkaddon@racewarkingdoms\\.com)|(\\{2e2d6d72-2634-496c-a8db-db869b639a21\\}))$/","prefs":[],"schema":1580137101921,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611807","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"303a149e-8262-4d16-b24b-348b84d5051e","last_modified":1580207330642},{"guid":"{c6ce41ee-a4e3-4fd7-ab6a-988b6916d66a}","prefs":[],"schema":1580137557625,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611810","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Qwicky Advertisements (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18581952-6448-4728-9fd4-2860b3e6534e","last_modified":1580207330639},{"guid":"djuvt@czgnp","prefs":[],"schema":1579817517633,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611297","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Update De (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ad789bcb-4c12-401d-b6fe-202a5b6697b6","last_modified":1579987441268},{"guid":"/^((zdphb@swlguy)|(czgnp@hhjl)|(mjrxg@zdphb)|(fuevm@czkvq)|(bgufa@djuvt)|(czkvq@bgufa)|(axvij@fuevm)|(swlguy@axvij))$/","prefs":[],"schema":1579863493098,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611403","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"83d7f7c0-8a56-4feb-9e66-b77af6343430","last_modified":1579987441264},{"guid":"/^((\\{50fc0c97-b405-4f63-9c10-465cab131ec7\\})|(\\{e08f09a1-e8e4-421c-a460-ada7b13077c1\\})|(\\{887c8e31-c11d-4b67-8bbc-e5b5e8fea9dc\\})|(\\{d67b6e83-976d-458f-aece-0af986c16db7\\})|(\\{d0c0679f-9fa1-448c-a78b-f8fa1591597b\\})|(\\{23747ea4-fb31-4349-9954-2728f1d4bda2\\})|(\\{5d492e1a-7e3a-48ca-9745-784a5b61980a\\})|(\\{bec8dea7-eed3-464a-b99e-92cab1e10373\\})|(\\{48d63231-1796-4b26-a3f7-1aa7f5bed1f4\\})|(\\{fdc94eff-5212-416e-b2e4-d67c088c4907\\})|(\\{ffd2c868-9f15-48f1-a77b-c5a1842a2e41\\})|(\\{9b0e5b96-2b47-4ee4-b511-7402c05ab43a\\})|(\\{f01f803c-fb6a-4c0f-9dfa-d8f6173b3b17\\})|(\\{b2ed387a-02c8-4bff-bf6f-00ce6b5f067f\\})|(\\{7222c5ee-8154-4e47-8521-1dafcd00d902\\})|(\\{c085ea8c-57cf-41c5-a41e-38dd6288e808\\})|(\\{2cc9608c-dc69-4bc0-8d3b-95852face3ac\\})|(\\{5977f159-e17c-48d4-8e2a-8b48962a57cd\\})|(\\{10e4d201-689d-4864-a04e-f21186f3d4e2\\})|(\\{79119982-95ef-4cfd-9fe2-b193018503ee\\})|(\\{520dd821-08e0-4821-abf8-347474c78f72\\})|(\\{6ff93655-17b6-4bab-bb0e-40abfcd5a853\\})|(\\{af670583-4dde-4e1f-b169-efc5aec481f0\\})|(\\{b053d2ab-0c28-41a6-99c4-4d276af55169\\})|(\\{4b70886d-6215-492d-8330-c220b714a216\\})|(\\{21855045-7800-4467-923b-096efe6ded40\\})|(\\{6c1f8c3a-47dc-480f-8007-3204db00a8c2\\})|(\\{2dc676a9-bc76-405c-9252-b76c60cc172d\\})|(\\{d464e0a4-8798-4356-8cb1-b1b819d80d2d\\})|(\\{b4cc995f-aca5-43dc-bde2-dc5b5de620ba\\})|(\\{448b1043-fc5e-471a-8a10-5ec74fb16054\\})|(\\{becb255d-985e-4f59-9e7b-a3f678bb53ba\\})|(\\{f200084c-a7cc-46a1-a84e-289a8c033124\\})|(\\{c6b5b880-ae5e-4cad-8eaf-fce059892c0b\\})|(\\{0ea7199a-707d-457c-95d3-cc84436c5634\\})|(\\{dc702775-072a-42c4-8a7f-0e02b202a48f\\})|(\\{4a1c6922-5b77-4f07-84f7-47e504ec5249\\})|(\\{145fa75f-ba31-4f91-8664-c2559887a664\\})|(\\{b9d3f331-5a3c-494e-a0dd-5b7dc1b949b3\\})|(\\{f7801e2a-e119-434d-83c5-e87eedffecf2\\})|(\\{1b88498d-c70e-41ab-98ef-4239582e77d6\\})|(\\{b0162d70-142b-43f2-8414-30414a2b1ea0\\})|(\\{1f7166b4-c765-4129-b727-ef077814e0af\\})|(\\{ee2cd2a1-b4f8-4ef1-9fe8-db89e8844e47\\})|(\\{569c8641-f0f7-4eda-afd2-4ca6f6fc8bc9\\})|(\\{85c5a731-0b8b-4d91-bbad-07790b7a0165\\})|(\\{02197da2-c4b2-4a55-b323-f56aba8d3ed2\\})|(\\{d5250fb9-6db6-4eb3-bfe7-b8d3bf326c6e\\})|(\\{947c328f-b462-4618-bc4a-a967d1d7bc77\\})|(\\{c04bf263-7edd-481f-a3b1-0ea9d2aff14b\\})|(\\{f69637b8-b48a-46b5-b1ad-132afc1dcaa0\\})|(\\{8f2b4de9-599f-452e-9fe5-a3ea7ee2d633\\})|(\\{ebc34c54-8004-4281-8321-84145bda54ec\\})|(\\{c3f94bd2-0391-44c0-89a1-212ca3844abe\\}))$/","prefs":[],"schema":1579863851954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611277","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2af6cf76-8f55-405b-8f5b-d784616768ba","last_modified":1579987441261},{"guid":"/^((zddx9wbjta9g23vk5ejo@zddx9wbjta9g23vk5ejo\\.com)|(\\{0629026f-e941-4a98-8975-b8cdcc20fbdc\\}))$/","prefs":[],"schema":1579796394954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1611198","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or showing malicious behavior on third-party websites.","name":"Browser Kompatibilit\u00e4t (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94be063-b34b-4ec1-bb02-59bc343029a4","last_modified":1579817517239},{"guid":"{c77fdf50-1880-4914-b553-6e3500f43f2e}","prefs":[],"schema":1579617431416,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610552","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Pdfviewer - tools (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cb6be8a0-0600-439e-85f1-512cc1d0e48f","last_modified":1579796394592},{"guid":"{669207af-aef4-42e5-b1fa-675995be9cf9}","prefs":[],"schema":1579604778159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610480","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54396dc1-f469-4a88-b0f8-352985a85b13","last_modified":1579609877650},{"guid":"/^((crisstehn@ffmust)|(jjwalter@junior)|(qlobthedark@ggmay)|(ficlever@roentgen)|(nzclever@roentgen)|(ukkinda@rottaai)|(GOEORG_RF_ANA_N@BDOFsKOKK)|(ioadjf9340joif024rf@ioadjf9340joif024rf\\.com)|(f1a1cz46o6rzl335xcrg@f1a1cz46o6rzl335xcrg\\.com)|(03t4joaijlcvjja@03t4joaijlcvjja\\.com)|(bdojfkobidjfo9e@bdojfkobidjfo9e\\.com)|(0iwtjvpvfhqyv2go1237@0iwtjvpvfhqyv2go1237\\.com)|(g68xhmxwozq8xtp4emty@g68xhmxwozq8xtp4emty\\.com)|(idyzvr0haermejvwfaqm@idyzvr0haermejvwfaqm\\.com)|(czaoyj52ki5owo07318z@czaoyj52ki5owo07318z\\.com)|(4sgly4c7s5pca7o220g0@4sgly4c7s5pca7o220g0\\.com)|(8sd351lwavakull4dcqd@8sd351lwavakull4dcqd\\.com)|(ukkindaa@rottaai)|(besth@lgimm)|(canaddxd@ptrx)|(nlextt@awes)|(bestseg@bbcd)|(swlguy@swlg)|(germctr@prx)|(pro@socialsmonetization\\.com)|(nicejohnus@lg)|(beta@lvvtqmq4qrhgmjb2zd7o\\.com)|(beta@b96mupkh82zywdrmxecz\\.com)|(dvhi19naabzond6ikvl6@dvhi19naabzond6ikvl6\\.com)|(approver@vdmqsgm5nyfiirwh8ryy\\.com))$/","prefs":[],"schema":1579603732879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610462","why":"This add-on is violating Mozilla's add-on policies by showing malicious behavior on third-party websites.","name":"Malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"448ff9b0-94eb-4d24-af8e-b56141824c80","last_modified":1579604777796},{"guid":"/^((f53pabhktayw2qusajt8@f53pabhktayw2qusajt8\\.com)|(weatherpool@bwv9ggnrvitryck9k8tf\\.com))$/","prefs":[],"schema":1579549290940,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610359","why":"These add-ons collect ancillary user data or take action on behalf of the user without consent.","name":"WeatherPool and Your Social"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30ab36b8-c080-4ded-8531-07259112779c","last_modified":1579603732509},{"guid":"/^((\\{293476ee-263e-4cad-8dc4-2fe03209adc7\\})|(\\{622303be-705e-4247-bc2e-9016d8867e3d\\})|(\\{6ac09a19-8de3-418f-a4e1-1ee3e8810990\\}))$/","prefs":[],"schema":1579601336651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610456","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Fake premium products"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3db3364a-0e20-4635-bc63-f2bba4a10415","last_modified":1579603732505},{"guid":"/^((\\{525f4b51-8ea1-4db8-bc81-829cf10a14a0\\})|(\\{2411143d-8afe-41ea-874d-ea4a8dc8b1c7\\}))$/","prefs":[],"schema":1579250266121,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1610061","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b6f17555-93b5-4721-a92d-53500d1fe0fe","last_modified":1579530103133},{"guid":"/^((\\{5335fd1c-3baf-4578-b339-516dbdcec832\\})|(\\{1bf381aa-a819-4067-a537-eadb0d6538ba\\})|(\\{0e3703a0-46ae-4d18-bd04-8f8f570fdb77\\})|(\\{b350dc7e-cfcc-4ffe-9225-9feefe922bdb\\})|(\\{eeb3bf29-f1db-4f75-a6cb-8675ace58390\\})|(\\{9a216bb4-d664-4535-baef-ee1f4db012d2\\}))$/","prefs":[],"schema":1579191500704,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609718","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Tamo Junto Caixa"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d845bc55-9b05-4dc7-ba4a-57462a51be39","last_modified":1579250265716},{"guid":"/^((_65Members_1202@download\\.fromdoctopdf\\.com)|(_65Members_1202test@download\\.fromdoctopdf\\.com))$/","prefs":[],"schema":1579193594086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609721","why":"This ad-don violates Mozilla's add-on policies by loading remote content into the new tab page.","name":"FromDocToPDF"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ebca1ceb-555d-4ce0-8c06-5b1475f08d45","last_modified":1579250265714},{"guid":"/^((\\{61e9b862-ef9b-4cc1-9dc2-ec00e437118c\\})|(\\{29828604-0f21-4ce2-8df7-b840aa53d713\\})|(\\{9430316a-f94c-40b6-9cea-8ac0df5c6638\\})|(\\{87ad96b4-86e8-4d94-aee1-7b607d02effb\\})|(\\{26f61847-2e07-4b10-a030-267eea1bf3b7\\})|(\\{450eb888-9bba-4de7-8821-4bb806ff82bc\\}))$/","prefs":[],"schema":1579193819569,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609365","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e5aad13-e8ee-43bc-91fc-4805c8195f3e","last_modified":1579250265710},{"guid":"{f6766565-1c5d-4eff-bda7-20f00aaedd11}","prefs":[],"schema":1579101106448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609550","why":"This add-on violates our policies by attempting to install other malware","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21b59bc5-57db-4f31-9e18-614c03858e5c","last_modified":1579191500334},{"guid":"/^((\\{15ebdf9b-c3d7-4aee-9568-b42a11a7b071\\})|(\\{a3d09db2-d3ac-4403-9bfa-878de450fbb4\\}))$/","prefs":[],"schema":1579039175200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1609265","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake anti-malware add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e3a3e97-c35a-4ec8-abce-a95c17d96f27","last_modified":1579039687654},{"guid":"/^((\\{976ef2b7-3bae-470e-84d9-3212d9200733\\})|(\\{d8fa8e34-e84c-4554-bfd7-16fd023b1c71\\})|(\\{d1ad5122-5caa-4986-a639-ce19bd1bc582\\})|(\\{599fb5a5-a334-4547-8a42-afccc1ddb347\\})|(\\{4bff9999-2ede-4b60-8572-a2915411abbf\\})|(\\{3a9a4c90-d87d-48e9-a799-072a7aa5be64\\})|(\\{822d29f8-9376-4da8-a7a0-4fa2eb5964c7\\})|(\\{c4926e5b-5b37-4781-87a2-28ce0b522d6b\\})|(\\{e36ea66b-30c3-481c-9e00-057b364c1c4a\\}))$/","prefs":[],"schema":1578927737593,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608886","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"361f3333-3cdf-43cd-b99e-78b666ec33ae","last_modified":1579039174816},{"guid":"{b7037d81-2c5c-4747-99e4-f4fc1c888b85}","prefs":[],"schema":1578938241613,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608887","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"RoliTrade"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd9c30ab-d112-4f58-be0d-0e213350b6e7","last_modified":1579039174813},{"guid":"{5cc1b399-c98f-483e-9799-be29c6627246}","prefs":[],"schema":1578656865603,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608432","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Rolimons Plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"05061ed7-378d-45a0-b105-3216c256b486","last_modified":1578927737176},{"guid":"/^((hddenobdjekcmnkgfpkodhohcjghiijm@chrome-store-foxified-1800284493)|(\\{90e41842-755d-40e0-9136-8129dd44a65c\\})|(\\{edf47ed5-7efe-4725-85d9-5e7a30d42998\\}))$/","prefs":[],"schema":1578665901864,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608433","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6975177c-1dc8-4fad-94f0-7a43ed397977","last_modified":1578927737173},{"guid":"/^((\\{3acb1e80-e126-4024-840f-3297659f9448\\})|(\\{44e3f210-6036-4364-90b9-3e8bb6fb3d98\\})|(\\{51e7e0fa-69e1-43f8-9578-d8372c2885b7\\})|(\\{1c2393b0-f2f7-497d-a34e-399dc6002d26\\})|(\\{a6a02c49-fafc-45d0-bb60-9f940a64c99a\\})|(\\{02a0090d-026a-4d02-a530-1b4d96e80c14\\})|(\\{9a988579-6773-48c2-91ab-8e917b20ab90\\})|(\\{22dfee7d-aa7c-4765-95e6-e81513cc7d37\\})|(\\{8c6d03f8-db65-4d5c-8431-ff66365847c4\\})|(\\{168b7acd-43d3-46d5-b76a-de3139dd9570\\})|(\\{abc95bbf-2548-4bf3-a0b9-9cb028496277\\})|(\\{d1282b8a-c467-4b02-9c11-e63e614ee8a8\\})|(\\{338422e6-bcf6-4171-9541-1c0f8c3dc3db\\})|(\\{10d5b345-535a-472b-8e8f-4f1a1cec9f2b\\})|(\\{64813672-8b55-4ac3-8dd2-c1da80132b77\\})|(\\{00e7df6e-7a0f-44d1-9fc1-0ddbdb473f4e\\})|(\\{564c2b95-b70b-4243-84dd-21fead791642\\})|(\\{71deda20-495f-4061-9c90-f46d1f7dfedd\\})|(\\{054d7610-9edb-47a7-af57-aed4be023015\\})|(\\{2b3f6877-99b0-4d35-8b85-9f75dd53ac92\\})|(\\{299f2568-3330-4466-8b47-4240643f8200\\})|(\\{077ead0f-8e84-4d6e-8fb1-a22126f9bf4f\\})|(\\{8ae52853-efd8-4d3d-b8f4-f70b048a389c\\})|(\\{36321783-e1c3-4f95-859a-d1c88eb75327\\})|(\\{7f878add-6b95-4b57-ab16-d8688819373a\\})|(\\{10148e15-b7f7-43bd-89c0-01957aad8188\\})|(\\{65e3540e-c3d9-4831-9dbf-598f2ef38d7f\\})|(\\{6fe77565-de36-4d06-ae30-59e3c98fc974\\})|(\\{7c79599d-ddde-4f62-9561-3c7aaea788a6\\})|(\\{d2fb1b99-98c4-48ea-ac43-8d729a1a8963\\})|(\\{38387674-fcc2-4292-a20b-08931ea0936e\\})|(\\{f00678a9-4b60-4a24-bdb0-4ce6c960cd28\\})|(\\{15d08bce-4f8a-451f-bdb5-5d1f720dde7d\\})|(\\{3a1da641-0fcc-4c06-b4b9-21d8d5dd3720\\})|(\\{6b7a8c7d-3956-4ac3-8c98-423a0bed1d75\\})|(\\{28f786b3-64a1-4152-9629-efabdede0b4c\\})|(\\{b1535617-e25a-48fe-b47d-c57affc65d5a\\})|(\\{255f303c-d5ce-47af-a925-1ad2c84c710f\\})|(\\{0ab25c60-4750-45f1-85f2-913440d6c6fc\\})|(\\{6cf0ef3e-d911-44c0-8b58-7abcb99d0243\\})|(\\{991c3933-0b3b-49f5-b3a3-1a60bf62f269\\})|(\\{bc5e31d7-42da-49c2-9624-1b4d5707b5ec\\})|(\\{8d8320f0-df3c-48f1-8839-f6969cbd3c17\\})|(\\{35f35aaa-506e-41d4-8468-3c4f4a56b434\\})|(\\{f1f6e2bb-32d1-4d79-8e5a-659e5af15b78\\})|(\\{1109f231-559f-44dd-bd84-85fac05f845b\\})|(\\{b6111372-b58f-4130-a6ae-a1445a196d85\\})|(\\{b21099c0-e496-443b-8d43-610a9aae60fb\\})|(\\{d8a40da5-bbca-417e-9ea5-e77332739366\\})|(\\{5dcaea9a-e152-4667-a4d5-b29f5afe9e61\\})|(\\{98b95d2a-1de8-4234-a73f-568531785850\\})|(\\{b11ad72d-2f64-4494-9f5e-6ad2e36bfc16\\})|(\\{3503a09e-76e5-4fba-8d65-d8bbb198b2c1\\})|(\\{f45fac5e-f3b0-4932-8c8b-254c6dcd3219\\})|(\\{4210d4ec-9e2a-40d1-83de-53a9728c01d5\\})|(\\{10691e9c-7399-4fb2-b824-256ed6c8c08e\\})|(\\{148338c2-ee0d-4659-baed-5b9aca28407f\\})|(\\{f3a2a32b-ec49-4fc5-bb46-f00f86d4cbff\\})|(\\{425bd894-b282-4a58-a2d0-3054fe3fd856\\})|(\\{7ccc3a62-7f92-4a1e-8e32-af734721a136\\})|(\\{91c939ae-00db-400d-a814-a964dc85fcf8\\})|(\\{83fdf43f-c064-4ae0-ac5f-6668fca576b0\\})|(\\{824f975f-a740-47d5-b4c8-0868fdcb154f\\})|(\\{2404f236-28ae-4852-b50d-50e66312f69f\\})|(\\{3f307709-bdf8-4dc5-afd7-4aaeb2a85176\\})|(\\{24f3c174-f09b-41fe-8c26-dfc051b2f352\\})|(\\{ecb81864-05bd-45f9-a1a3-5f56ad62c1c0\\})|(\\{fecad0e5-5f8c-4539-8893-9a4c9e4ab567\\})|(\\{03badfb9-bba5-4a3b-ae1e-0bde1bef38f3\\})|(\\{1f2defb6-af80-4822-b1d2-816c0575dd8b\\})|(\\{195450ff-844e-4ec7-b111-166c28e54b6b\\})|(\\{abd20b0f-3f79-4cdd-b2f7-6ed4f9a3e546\\})|(\\{b1a2d328-e1bc-46b5-b6d3-d4c5366a6262\\})|(\\{49d113aa-c37c-4a49-b73e-69eaaaec519d\\})|(\\{f9fe81b9-29be-4e30-ba7e-821e96b74c00\\})|(\\{c47a57e5-9486-4b58-b4e9-2e49e02c39df\\})|(\\{48aecb91-709c-4660-b0f8-681c177628bb\\})|(\\{0033af2c-0017-4237-821d-24e1ce20ed20\\})|(\\{d95d2ab6-2728-4d89-b4f2-74fc3abcfe26\\})|(\\{813bec70-cac2-497b-9117-8873b5e33cbc\\})|(\\{b613e7fc-3274-4874-b59c-b2afaaba60b5\\})|(\\{f88e19b5-9434-455a-a2bf-de13250a642b\\})|(\\{562fec92-ba72-4461-a73b-48b0cc87c943\\})|(\\{c8d2d52a-5617-420e-9568-983c0c7a6982\\})|(\\{7e32bebe-f9ef-4328-a4f8-7a86afdb9568\\})|(\\{b95fa449-7f1d-44dd-84c7-65565334d1e1\\})|(\\{788d6386-606f-45fb-83a6-af4956d9aa11\\})|(\\{00a646ad-3d34-4ca9-9633-9ea96be7a225\\})|(\\{a745c5df-b386-4906-80ba-ec9b6aa6b37a\\})|(\\{a3b508d5-864d-43c5-a4ec-9d5523cd01a6\\})|(\\{4e945e2a-b553-45e6-8dcb-495c60a663a0\\})|(\\{1a6ea1a0-1a2a-4a57-91c8-07cb629588ce\\})|(\\{20ef853f-2c16-496c-bcd2-5109a7a1be59\\})|(\\{cb5604d4-d166-4060-978e-1c7ddfda4a94\\})|(\\{9207a89d-db88-4ef1-bf2e-a89c12d882fa\\})|(\\{f561afa7-165c-45c5-beef-754e16b40794\\})|(\\{09021ead-28e3-415a-8f9d-ed250954147c\\})|(\\{1d6ef53c-0407-4eb6-aa80-b672788f9d0a\\}))$/","prefs":[],"schema":1578858092043,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1491ea56-7723-431d-be05-5808a3101bf5","last_modified":1578927737169},{"guid":"/^((\\{2b046d1e-b392-4073-ad8d-bb882b073be0\\})|(\\{69a8db6c-b55c-4560-bfa7-edf21ed9f265\\})|(\\{d41d46ca-a557-48df-a951-e968a1168137\\})|(\\{845d89e8-e3c0-4447-ad36-9fcba4d3d28c\\})|(\\{da572bae-f959-4f9d-aade-afda00b83e2b\\})|(\\{fe334432-8ba6-4444-8cf9-1bb59c308aa0\\})|(\\{b8242421-8cd0-4064-a6e8-bbfdd62d67fa\\})|(\\{7d863da3-4f8f-4b2c-87cf-5bc7a03b24c8\\})|(\\{fc53c14b-9bdf-4a0b-9f07-421109bcab31\\})|(\\{7771103f-bf4a-4757-b679-2ec30eae8cfb\\})|(\\{66196147-9b28-4050-a46c-c9bf668511d2\\})|(\\{a41db617-17b7-429d-b135-5fd5d54b9ad6\\})|(\\{aa0e1b27-728c-4e45-9b7e-7731e8d6451f\\})|(\\{6e12cb13-d166-47e9-b1a6-ce980e1489bb\\})|(\\{3b3e3db5-2710-4bfd-bce8-bf3a1b5e0bc0\\})|(\\{3e4763fc-2175-4a69-9854-f437774da824\\})|(\\{63708597-3f14-494c-981c-bbecb10fddcc\\})|(\\{ec2c5f61-37e6-49dd-a430-6f0060f6e152\\})|(\\{8eb7ade7-96d3-4be9-b20e-f321fe07c9ec\\})|(\\{b9b60c96-b158-495b-87ab-db97fe2aecac\\})|(\\{5d885234-3fff-4c81-bfe0-7e01ca9701f1\\})|(\\{79cb8cb6-a0fe-434f-a6d6-2af167fbb069\\})|(\\{ec41b4cb-5c60-471f-a68a-d52e91f54292\\})|(\\{fc64c6fc-4356-42e4-8253-75facb478836\\})|(\\{d68b6b30-81e6-450b-aa7d-b0e3f1b11e2e\\})|(\\{6E01B689-3E52-44B7-A33A-197C48498C0D\\})|(\\{D4EE626F-0BE2-4CE3-B635-11498D2EAF24\\})|(\\{bea54a21-f8e6-4a47-a739-84aa5a03a391\\})|(\\{57FE0157-8BDB-4C11-BCD6-6654E0C1AE3D\\})|(\\{8B8E2B7E-7DBE-4EDD-ADA1-8AA93098E3F3\\})|(\\{66c281ce-2682-4182-91da-6d3742ce9a9a\\}))$/","prefs":[],"schema":1578922331209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608815","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"2Ring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d8ef0aae-2659-4076-be2a-ef0cf0388c49","last_modified":1578927737166},{"guid":"/^((\\{d26e41d8-8dfa-4a08-ad90-6df0240c8290\\})|(\\{9ee44d55-47d9-45bb-b56c-79ab2fecd93e\\}))$/","prefs":[],"schema":1578582285426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608291","why":"This add-on violates Mozilla's add-on policies by executing remote code and/or collecting user data without disclosure or consent.","name":"Converto Wiz Ads Search & PDF Converter HD Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c502c85-3f2d-4a3b-9abf-249eff0968f0","last_modified":1578656865193},{"guid":"/^((browser-safety@browser-safety\\.org)|(facebook-bookmark-manager@fbtools\\.io)|(facebook-video-downloader@fbtools\\.io)|(extensiondist@browser-safety\\.org)|(selfdestroyingcookies@dirtylittlehelpers\\.com)|(googlenotrackpro@dirtylittlehelpers\\.com)|(youtubemp3@yttools\\.io)|(youtubeadblockerpro@yttools\\.io)|(videodownloaderpro@dirtylittlehelpers\\.com)|(simplysearchpro@dirtylittlehelpers\\.com))$/","prefs":[],"schema":1578653962604,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1608387","why":"This add-on has been blocked by Mozilla.","name":"Several add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6368943f-3d77-491c-82bc-f29591e170d6","last_modified":1578656865190},{"guid":"/^((\\{1c1a344c-b8d3-4783-ac5b-9a9d241c29b6\\})|(\\{a4fccc0e-a372-4127-983e-c0f607427a89\\})|(\\{275f2631-9a1b-4ab3-8c6a-4529ecd8512b\\})|(\\{0b1104bc-8ec5-437e-9d81-2cc641cbe8c6\\})|(\\{4e373c31-1942-4c9d-93b3-38b0ad701f27\\})|(\\{7f1af5f0-b450-44f2-aa5f-bc4c793553db\\})|(\\{68c84054-b43a-4a78-bb35-27ec06974d1d\\})|(\\{f959a2e9-f211-424b-b0cd-ea7ecf269753\\})|(\\{fef99996-e542-45b6-b383-86132e67a93f\\})|(\\{c1bd56b2-4b48-4366-8d04-16a0f69f7b4b\\})|(\\{17456fc3-4777-484a-b177-9b82752a738e\\})|(\\{9c746226-1a87-49e2-a083-725c5fc10885\\})|(\\{3056ec65-736e-4a77-abf7-9d0b44ba0b74\\})|(support@seovpn\\.net)|(\\{fbb6a675-8923-40da-86cc-a547eae63594\\})|(\\{bf9abe9d-4589-41f2-acd4-e5dd9d4a4595\\})|(\\{d012bf08-e9b1-43a2-b6b4-b60c0fdd6fb7\\})|(\\{0cc696dc-6214-406f-8831-1d0ae14c2eed\\})|(\\{39ef127b-a7c5-4cf6-8383-333ce2300707\\})|(\\{77af48b1-2786-430a-a2f8-f0e666ecdb86\\})|(\\{9807c7c0-0d7b-4ee9-b39e-4a2b10f74b74\\})|(\\{21ceb717-4e26-4843-9229-b0a55c629c6b\\})|(\\{ba87282f-fb6a-464b-b2b4-18ab718a6b9e\\})|(\\{f844e48e-929c-4dc7-8224-c829b67d453f\\})|(\\{2af80abc-e031-42c6-b800-02dd4dade3bc\\})|(\\{849583eb-dd9d-424e-af82-d64205b79bb2\\})|(\\{8d8963e3-810b-4e72-85d9-d6e8affbe8e1\\})|(\\{aa385b5c-14b4-4d2a-ad81-db3cd054efe6\\})|(\\{c30a6fea-44b9-4f3e-945a-401485d7e152\\})|(\\{327735cb-5842-4296-a8c9-660118c9dbe8\\})|(\\{2809097a-41e3-468b-9c33-2ce449bc18f9\\})|(\\{91b36c25-1dd4-4a1c-a722-a1868deed9a1\\})|(\\{3b61770f-a22e-4704-be5b-310a729e6652\\})|(\\{b1741149-382d-447a-b8fe-bd2dbf03b252\\})|(\\{8a5d399d-3716-4627-ad97-750cd10783e6\\})|(\\{a1bb458d-6a71-4efb-a032-04f44f638a0d\\})|(\\{8a86326c-5b59-4c87-af77-becea91bdc7f\\})|(\\{21b022a6-b739-4787-a071-268f45bd4f0f\\})|(\\{59e225c1-5a78-40b4-bb6a-9cd783eea9fd\\})|(\\{d0ba8c04-3d8d-4c87-8eec-355d3c1dbc57\\})|(\\{d0b408ae-c1b4-45b1-8d0f-5a9135dab115\\})|(\\{c802afcc-8fb2-410c-a50b-0dfc4e502364\\})|(\\{8ef92c49-fe9b-4354-b943-8fbce6156ab5\\})|(\\{40d41864-a14a-45e9-bc75-ff95189975cc\\})|(\\{b5f5f423-85e5-4641-8517-2549ef2597ff\\})|(\\{bd4e3180-94a8-4d2a-9186-b15ccbca2abb\\})|(\\{1099ff05-78d0-4a0f-a348-0e60d8e627f3\\})|(\\{9d7450f3-9f39-4dda-820b-ac50797229a5\\})|(\\{9762a546-d483-4d82-9e97-e8293b67ab3b\\})|(\\{233e675a-f2e9-494e-a62a-56a8e75440d1\\})|(\\{44b31737-7370-41ad-9a16-7e92f993d651\\})|(\\{5e8c48e7-43a3-4f5c-8f61-018e994ed581\\})|(\\{cabb5a82-b018-40eb-b551-08b7c6b28d25\\})|(\\{19c2d564-4774-4b52-b175-0d9a674a1ee7\\})|(\\{4d6bc7a3-8d17-44d9-a1c9-34b6c72d2a82\\})|(lin\\.Vin@userx\\.com)|(\\{a74a99d0-f5ac-4775-8af5-ad48341865de\\})|(\\{b8331308-eaa2-40ca-94e3-d5184b9555ab\\})|(\\{43a11cab-4d48-468d-88ac-6632c2b90f0a\\})|(\\{13fde54f-87aa-4966-801b-189946617b03\\})|(\\{051e900e-73a7-42e9-bf92-54a05b592814\\})|(\\{389a79d4-7af9-4c22-8e3f-0a424a9d16a6\\})|(\\{d80ce712-fad0-470f-bb42-7f0f5d10ac66\\})|(\\{b08e2ddf-304e-4336-b7b8-15698239be1a\\})|(\\{5bdae4dc-1859-4766-97c6-5d4b7d5ccb68\\})|(\\{a8b80325-5125-4d50-95b8-e3548eca99f9\\})|(\\{16f5bfef-6792-48da-9458-c15a904a3202\\})|(\\{821251e6-48aa-4eee-aca2-d2003047eba7\\})|(\\{e4d3e60e-2980-4899-aaa5-aa2c8571e8af\\})|(\\{00bde975-f669-4fef-aca4-de3335e5e629\\})|(\\{815e064e-df14-440a-a9c7-6191d47f302d\\})|(\\{12267241-c4e5-49b7-afc0-1ba02cd86146\\})|(\\{1461d5d5-0180-4e5c-870c-1648fd13eb3d\\})|(\\{09f52a46-5e5e-4bb7-92e4-5a802ba2dc65\\})|(\\{89fd7bd0-b6cf-49cb-981d-6eaa3515e09e\\})|(\\{309cf23f-2ca7-4308-9c31-03ef0cf0e8df\\})|(\\{604184f4-c000-4071-8b27-ae7c191dd575\\})|(\\{45c9a869-b55f-4792-aefd-e353229b48f1\\})|(\\{1b7f62a2-5dfb-4a7c-8613-a2333ae83337\\})|(\\{6e7e98a6-d7e7-4319-92bf-283cdcbf06b0\\})|(\\{2e60f9f6-f57f-46e5-9876-b50f84154a04\\})|(ali_nasiri@mefa\\.com)|(\\{d7909c43-9b01-44e8-aec2-d569a3461183\\})|(\\{d64d110d-2783-4663-b533-036338b0fabc\\})|(\\{8c5a0a9e-480c-4571-acb3-602cb081f9b9\\})|(\\{1efb16f1-34cb-4179-b27b-301f1a8d023a\\})|(ali@mefa\\.com)|(nasiri@mefa\\.com)|(nasiri_ali@mefa\\.com)|(\\{de57334f-24fb-4b0d-9087-d2945212ba76\\})|(\\{e45a208c-582f-4549-8c39-3e3b6c3f503d\\})|(\\{7cf37c0c-5cf2-4945-8c82-ffd5a1206abb\\})|(\\{aea2f3bb-b278-4ab3-a2b1-370b74a2795d\\})|(\\{c0d80342-fa84-4366-90d5-0d2c965a6c71\\})|(\\{e7953669-b2cb-49bf-8f53-9b2cedbe4df7\\})|(\\{0f5248f4-bb0b-41ee-9162-397ac92538c8\\})|(\\{f2a73021-b834-410c-95c9-6e9e826c5523\\})|(\\{ac9759e0-3657-40c0-8da8-aa83b2df14e1\\})|(\\{AABB3453-4EAC-421A-34FA-4789107489AE\\})|(\\{e471c14f-775a-474c-afde-e2562f35a1ee\\})|(\\{8a420af6-7de8-4d13-bc74-1b90e3a7c45e\\}))$/","prefs":[],"schema":1578325482610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87a59976-a41c-48e0-a05f-b00ceddc3990","last_modified":1578409770946},{"guid":"/^((\\{29e8ec68-5717-4d25-8465-c8ad11c2493e\\})|(\\{1807ab11-ce49-47e8-b29f-2c7f3b27957c\\})|(\\{d497ce7b-9308-4a00-81c8-f1e20769d9f4\\})|(\\{3e2a7fe2-d800-4300-adbc-85d45101ccbb\\})|(\\{41a6db99-eb5a-436f-add8-6655030cd3c4\\})|(\\{d0041bb0-914b-4105-8335-f19dfe4000c5\\})|(\\{16c0318f-441f-4996-9420-9582cd8dc4a8\\})|(\\{11560f98-1a72-428e-901d-19eee028703d\\})|(\\{200fc207-8d2d-491f-a14d-898c2af6005c\\})|(\\{6098201e-19fe-4930-8235-507abc271c92\\})|(\\{47247604-b3df-42ef-a7d6-e6f54f3ed34d\\})|(\\{d9e45250-0a78-4fad-bda9-435289e1117d\\})|(\\{7897756a-f527-42fc-8327-23afa5a73037\\})|(\\{ebb45fe8-b626-4d4a-9b51-4c61be7d8ec8\\})|(\\{17a3a525-b5e9-4bdf-9f2f-0a6b82489261\\})|(\\{7d5e14ab-7973-45ee-9b5e-fb2af9105a58\\})|(\\{3db27392-c030-4b1d-a461-df246030e8ed\\})|(\\{687dbc1c-4640-420e-b5e0-69ffbff851a4\\})|(\\{99f71699-61a0-407e-9a1e-4f7f2b24032e\\})|(\\{9608a917-807d-426d-8b3d-4bd8e6669d3c\\})|(\\{6d0d1145-1b99-4c1b-9112-a0698ce1ad93\\})|(\\{02373fa8-bfe0-4f6d-bf65-cf843ae16ca9\\})|(\\{76e05242-0ea0-47dc-99ab-85a5768d24ee\\})|(\\{b2671579-9ae7-4e10-9aad-e484189f2599\\})|(\\{f8574a50-a306-455d-96b3-9a95590e3351\\})|(\\{d2a79680-fab2-40d5-93c7-3842a3c7a170\\})|(\\{6d3d4ff6-42b4-4ae6-8273-e55309e194ef\\})|(\\{e26d666b-5437-4b51-9a35-6a32ef2ebc93\\})|(\\{1d1e0112-694e-499e-9a6f-fd4fdd8a0400\\})|(\\{8fef18c6-29cc-44db-a373-2476eaa98d07\\})|(\\{bca08103-f769-42c1-9e83-c3dac1d073e5\\})|(\\{9be3ea2f-3def-4ace-a4ca-a36bd350ebe3\\})|(\\{e4a7d768-fe07-4b2d-8722-782ecd2d857d\\})|(\\{ed0bae9a-6c29-4615-b7b0-8134008f866d\\})|(\\{6a230256-13ad-4912-88fb-35dfe6fc8405\\})|(\\{f33c98b2-f1fb-4e82-a472-b27aa763b697\\})|(\\{692d8158-fc1a-43b9-901c-9211c5f00129\\})|(\\{f43b5702-0a0d-4f50-a012-a9fa25d19ac4\\})|(\\{e5d75e88-cd31-492b-a63c-ab6759658d4f\\})|(\\{706dac82-d1ce-43b6-81fd-77652fad15a9\\})|(\\{8c403e0e-104d-46ec-8355-5b7d57d35e6b\\})|(\\{c5a32b03-4044-4085-91d8-af1d688c0c66\\})|(\\{76e7835b-8600-473e-870f-aa1e9ac922de\\})|(amz@userx\\.com)|(\\{d2b50060-69cd-422b-bc5a-77590580adfa\\})|(\\{e9d1c5e0-e297-439d-a536-efd94b0baa06\\})|(\\{80816d1d-664a-4710-915a-99c298970b38\\})|(\\{3cf55a2e-ab5b-4a2a-8b5a-0760f46ffcc1\\})|(\\{be762a22-7fcf-4c67-a8e4-7f2b085a9f50\\})|(\\{2df2d33c-e1fb-4eeb-b276-a84bd3338e0f\\})|(\\{133ce0f4-83f3-4fec-b672-0067748ccf1f\\})|(\\{b575f7f6-5afe-40f8-8bb3-92c0ca24371f\\})|(\\{d514a041-1260-4512-9759-55c30b63bc20\\})|(\\{4129ed8c-e3ad-4e88-832e-66314cf44268\\})|(\\{9e97ac90-9eb9-429f-99f5-d61f60052068\\})|(\\{3366bcb1-8b0d-4451-9c1b-cf8aeb8e5df0\\})|(\\{3d06b84f-0b8b-4a7b-9a55-22c226c85a55\\})|(\\{e2f8e0bc-62bf-40f4-9dcd-3379a64db2bf\\})|(\\{3e998c2a-c05c-4445-9567-7a1948077970\\})|(\\{51cefcff-f7a1-4c57-b6bc-bad9fc9f275d\\})|(\\{84d6d305-ccc0-4879-b80f-708318ebcaa6\\})|(\\{05a2137a-9dde-476d-a63e-d80400d6bf36\\})|(\\{c2627d22-c3cc-4c5a-a69a-eca6cfe9ac90\\})|(\\{3cfe4756-4994-4c92-a97b-adc57243a277\\})|(\\{5a05e509-59a9-4358-b994-a062d97a7d0f\\})|(\\{791bc86d-dae4-45d5-957c-fe56843770f3\\})|(\\{8976df61-4480-4d4d-bfd1-2e9d0635eaa8\\})|(\\{f4ee4889-fed0-4598-a8b2-c3e224250d82\\})|(\\{e26b2735-47b6-4239-a3d2-0e4ca4293076\\})|(\\{ae9589dd-3141-47d1-9449-8e719044ff92\\})|(\\{ff18147b-3853-4938-b15f-241d99f4e590\\})|(\\{758126c6-d156-4eed-8870-477eefb17281\\})|(ella@fmt-tools\\.com)|(\\{e4df007c-60db-418b-97f3-d7896c441515\\})|(\\{90e41842-755d-40e0-9136-8129df55a65c\\})|(\\{faeee13b-39fb-49dd-82c5-47604a2e2e9a\\})|(\\{c3583bcf-271e-4b41-8207-32bd3db491a0\\})|(\\{cbe6f8d9-bd60-4f27-acd1-388a976e3749\\})|(\\{18be83e0-4bc9-469a-bde5-cc671acb022b\\})|(\\{97152370-246f-4059-999d-92f26f358e71\\})|(\\{8a975636-e12e-4532-ad35-9d9e691a246d\\})|(\\{3eb5ea84-a445-4dab-8074-d29dbf4e66f0\\})|(\\{f19cf85e-47ea-446b-808d-38f4010594b3\\})|(\\{b28a1358-5cdc-442e-b851-613bdf118320\\})|(\\{90f0ad05-0267-4ea6-9809-1098ec724905\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d4\\})|(\\{d18372a9-89d9-4799-87f1-ccd4cfac80d5\\})|(\\{4625fcb8-6b60-49e7-9447-31cb1e2a2d59\\})|(\\{7dc2d526-d11b-4e6f-9301-a4bc620f5838\\})|(\\{d763ea47-6889-4e23-9b6c-ac56087c96a7\\})|(\\{3c7f00c4-4e4a-411b-960a-4ce782ece6c9\\})|(\\{8c1db2e7-c550-4d76-8009-ad9fca9c0813\\})|(\\{0b23f4db-0f49-44b7-9d27-b424ba9f6d62\\})|(\\{d798f753-a0e4-4d8b-866b-3b817b7b6d25\\})|(\\{e3d7ec01-ada7-4330-899b-bce60c64471b\\})|(\\{3a210e15-601e-4204-8690-cb05ed14019d\\})|(\\{51226db3-500d-45d1-bbc3-a9bf560caf39\\})|(\\{0aa6f915-ed71-4de8-aaeb-63f799d83af7\\})|(\\{3d46809c-6c20-469c-a608-3ece3121da4a\\}))$/","prefs":[],"schema":1578335483666,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607277","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0bb0f9b4-6807-4642-9199-026411426eb2","last_modified":1578409770942},{"guid":"/^((\\{af51d321-202e-49af-9a3c-78a5ebb22b63\\})|(\\{749b293a-1e19-494b-8a3a-cb79d5464226\\})|(\\{fbe6ff3f-2675-466a-916e-352080c27adb\\})|(\\{ad0378a7-5153-4e6d-999c-6c8e49868293\\})|(\\{2f7de182-3427-4386-a880-c601050580ab\\})|(\\{99bad30d-3792-4a03-ab9d-8e88f5f1cccf\\})|(\\{475b8326-3218-492c-b4c3-32307053c21a\\})|(\\{18571b27-500b-4604-a4ea-e0e7d8b61ce6\\})|(\\{fad11a52-2f9a-4d89-b712-f61184d756e7\\})|(\\{113c9d19-e80a-4c72-9a23-58f7b08144cf\\})|(\\{a0b384d9-c275-4670-a4be-8b0be45d562e\\})|(\\{19bac525-be97-4470-b76a-c24168d5e6e8\\})|(\\{2a40afd4-e56b-425b-bff2-62f190d80fac\\})|(\\{cbc65b60-2350-4b7f-8c83-1b9182a56430\\})|(\\{6adb7178-1105-46e6-9a4d-1824385cef5d\\})|(\\{6d46665c-4708-495d-a929-096ea137a08d\\})|(\\{fd6273bc-3b55-4bf0-872c-146b3feb73f9\\})|(\\{707783a0-6669-4e1f-8036-53f5c936304b\\})|(\\{7086907a-f6fd-46f4-b51c-a7dd2b10509c\\})|(\\{0ed69e4f-6cec-4bfa-9004-076ebd0be34f\\})|(\\{d051ddb8-1de2-403c-84d2-afd96a3f4550\\})|(\\{52699f66-62fe-4970-83eb-5ad82bf72497\\})|(\\{6c32d68b-4866-4277-b454-d824a3a3209c\\})|(\\{d608864f-5573-47eb-a2d7-46d158ee3fa7\\})|(\\{38c59c7e-bc02-4e7f-89ea-c4d9555362c6\\})|(\\{981a212a-52b0-4413-976c-a4730f1df128\\})|(\\{06e004dc-40a8-4123-addc-c6b6eb5234c7\\})|(\\{c87d86f9-d5df-4a24-9fe0-dd39232e4d88\\})|(\\{86baf51d-21b6-456e-889b-c7d96ba2fd63\\})|(\\{db83a6c1-efb7-45a1-b074-8e3e5a53793e\\})|(\\{70c00ae0-5b15-4ee8-99f9-23d85c63c07e\\})|(\\{ff72e707-d6e2-446f-a760-6ff187f107c9\\})|(\\{6f65c53b-596f-4238-afa2-347150b3ada3\\})|(\\{95da423e-90ec-43d9-b5c8-e195bff7b432\\})|(\\{4a792129-a244-4a39-a416-ce4f7743918f\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e16\\})|(\\{49242aa4-83ba-4e25-a827-4d1ec86972a8\\})|(\\{d69204d4-610c-4144-9d26-8cf8b2ad6e19\\})|(\\{3505b15c-533a-4c2e-9065-6d7b2381a7f9\\})|(\\{07daa733-944d-4b0b-9bce-01638b9d9b42\\})|(\\{ebb69cbc-b69f-4d3d-a676-83811a061baa\\})|(\\{f9327eb7-2532-4e45-a551-a9f8233e4ef7\\})|(\\{4fcb9938-6716-46ce-8107-73f3cc7b3900\\})|(\\{cee1ccee-5508-4927-a939-9a557e63bbc8\\})|(\\{c6973149-51bd-443a-898c-e4b26d4ee44b\\})|(@mouselessjj)|(\\{39772968-f7e5-4a84-87d2-adcd2d032c69\\})|(\\{3ba568f0-bb3a-4744-b64f-46c428f3bd99\\})|(benalio@gmail\\.com)|(\\{70c50468-54be-4d7c-b1b4-b7378d0ff45d\\})|(\\{f77c3471-806a-40d6-9fdc-7df832f7ae74\\})|(\\{cf660d66-4aac-461b-a05f-b71b62f549c6\\})|(\\{1c58ca6f-91ad-4423-b8bd-f5323df92eb3\\})|(\\{1a393581-d6ce-454f-a503-8a321ba0f022\\}))$/","prefs":[],"schema":1578339693692,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607422","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"18cdf7c5-6650-46d5-a536-364ce9dcfa92","last_modified":1578409770937},{"guid":"/^((pro@affiliatebrowserguard\\.com)|(beta@affiliatebrowserguard\\.com))$/","prefs":[],"schema":1578394762485,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1607211","why":"This add-on violates Mozilla's add-on policies by redirecting requests without user consent or control.","name":"Affiliate Browser Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c8aa2f43-2c48-4628-af4f-0987125d0441","last_modified":1578409770930},{"guid":"/^((@adultdownloader)|(\\{6391a084-dd1c-41b8-aefb-ce207da8bf21\\})|(\\{19e997bc-8449-4ab3-b4f2-f24db1053fa9\\})|(\\{e65a0802-7bbd-4c83-9bec-50ec16dadcdf\\})|(\\{6928cfc2-eda9-4971-8d8c-de26747c27ea\\})|(\\{93c15410-f7c9-41a7-a13d-28dba750f15e\\})|(\\{d7c369d6-74e2-4da7-8eef-dc134914facb\\})|(\\{e3109828-453d-4fc1-8019-488f891720d5\\})|(\\{d825dcfa-4340-4330-b4e7-b208439ee961\\})|(\\{8e7d2b8c-6167-496d-8e4c-45d9040a4a7a\\})|(\\{62935c48-c7bb-4a6c-a1b0-449fdc8737c0\\}))$/","prefs":[],"schema":1578166891954,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605959","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c086bfd7-15ff-41eb-ac43-d84e95606eec","last_modified":1578325482223},{"guid":"/^((\\{943773bb-c8a8-4576-bf3a-7cacca534887\\})|(\\{0afab6d1-c267-4ff6-9289-4a2b2ad78f33\\})|(\\{4278c56e-7b67-43ab-8c87-f68a6a883df6\\})|(\\{f146cde8-6dcf-4ebf-9d67-b7eccc9bc8a6\\})|(\\{d0e43d96-0e73-48d7-9a60-b235022f4330\\})|(\\{a94ed9b8-24a6-4719-97af-08eaac91a42b\\})|(\\{d62ca114-0f4e-4d25-813e-292d0c682e05\\})|(\\{908b1c05-3766-45e1-b56b-f0b4457c6451\\})|(\\{068054b5-46c0-47c2-be37-dd015fb1c050\\})|(\\{1c1cde54-c8e9-4c61-a2be-30411888ac8a\\})|(\\{b06648df-3c80-49e8-9d9e-71741ba28c72\\})|(\\{a085da90-cc10-4c26-954e-ae4eb773c6d7\\})|(\\{1d53aa0d-eca3-4bb1-947c-aebfdd0770fd\\})|(\\{83ebd575-b66b-4b02-a628-d2764194d0a6\\})|(\\{fd5f7e74-2e60-454b-b702-05e9d66b334b\\})|(\\{fdd2f5a3-9061-4fc8-87d2-cf7f7668d336\\})|(\\{f890d432-ce0b-4857-b030-dc36fc791423\\})|(\\{d5b4e84c-7991-4be5-9c26-c3e92ba0901a\\})|(\\{8d54459a-34cb-461f-b1fe-2266484cc098\\})|(\\{67b21df3-a1da-48ee-aee8-18ae8ad7fe21\\})|(\\{18feff20-5892-43cd-8606-83e8e7c33ebd\\})|(\\{554e901f-5476-4fad-8714-a08b8249068b\\})|(\\{248c9c9f-404d-4284-bd12-2fa988edb0ad\\})|(\\{9c347568-2528-4dea-8a0d-6e9fa7f88512\\})|(\\{0447e445-abb9-450b-b12c-de16fa40e176\\})|(\\{3015019d-1c2f-4310-adf1-1b33c4566d9e\\})|(\\{a3aca1ed-74b4-46d4-9c73-ca9ba8c91ac6\\})|(\\{7b2aabfa-673f-4afb-9cba-7a9329a24d79\\}))$/","prefs":[],"schema":1578083875760,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606925","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"de533f3a-d0e3-4704-916e-fd2a297cee93","last_modified":1578084466436},{"guid":"/^((\\{a91c41b7-4196-4867-84b4-d417a1b10da2\\})|(\\{e3d3ea5c-c8c0-4c9e-89c6-f6b5677186cc\\})|(\\{fa3b6777-4f64-476c-9ace-a79709ccd0a6\\})|(\\{6251b844-0c54-44bc-8c5e-891e3ba86c2e\\})|(\\{8e588566-afb2-4612-a420-3e3bd18693e7\\})|(\\{a0bf35ec-76cc-4d86-875b-09d46e8790c2\\})|(\\{fd257beb-d772-4333-9901-dc5913aee499\\})|(\\{a9acb248-93fb-4081-9d88-92468f229842\\})|(\\{7e1b62bc-3ab4-4c4d-8182-b095a492eab4\\}))$/","prefs":[],"schema":1577994095119,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1606132","why":"This add-on violates Mozilla's add-on policies by using obfuscated code and/or executing remote code.","name":"CodeScript and WorldScript"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d3f2971-9764-4b6d-94ef-2a0b97da7619","last_modified":1578066343576},{"guid":"@mendeleyimporter","prefs":[],"schema":1576845976756,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600910","why":"The add-on does not comply with Mozilla's requests to provide reviewable source code and is suspected to violate Mozilla's add-on policies by collecting data without disclosure or consent.","name":"Mendeley Importer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e028ecb3-be1e-48fb-9681-9c04ff7fad3d","last_modified":1576881756956},{"guid":"s3firefox@translator","prefs":[],"schema":1576845555478,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605007","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3.Translator \u2013 s3firefox@translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"31a14241-2af8-4ec8-b597-d5c3ebedc30c","last_modified":1576845976374},{"guid":"/^((\\{cee1ccee-5503-4927-a923-9a557e63bbc8\\})|(\\{8a84b40d-84a4-40d6-96de-c504a4fcd114\\}))$/","prefs":[],"schema":1576784492013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1605289","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d940ce81-7ac8-4741-9fc8-2699cb92d4ef","last_modified":1576845555097},{"guid":"/^((therill@mozilla\\.com)|(Updates@mozilla\\.com))$/","prefs":[],"schema":1576756361317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e235a161-aaa1-4afd-8e9b-61ab2aeaf82e","last_modified":1576771657205},{"guid":"/^((\\{5620c992-8683-4ce1-b19d-3633b4c28bd0\\})|(\\{cbc29a75-5858-4b7b-98e4-c813a4e6a085\\})|(\\{4cf619a8-2de2-41cb-bf23-dfa52e4e7d5a\\})|(\\{3b013e48-d683-45ed-8715-a6ece06f0753\\})|(\\{9834ff7f-e3ea-485a-b861-801a2e33f822\\}))$/","prefs":[],"schema":1576756618517,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c324513-5792-495d-a389-d7527a0433b2","last_modified":1576771657202},{"guid":"/^((\\{ab70d6ee-9d0a-4349-919f-2e3c9aa77927\\})|(\\{fe94f94a-75ff-48a9-9cab-03e626e30352\\})|(\\{085590fa-c340-423d-9b45-d8e963349513\\})|(\\{c06005f4-a53f-4503-b631-9c6fbea45e9e\\})|(\\{a1904bba-73b5-4fab-8556-95fdf0200c19\\})|(\\{4548ed4c-964e-4a53-acec-b24f5b9ea6a6\\})|(\\{99d68c16-4f64-463a-ad09-470a5ac07981\\})|(\\{14338345-a844-4c6e-9fca-d200a93f1d9b\\})|(\\{2bc78397-6bd3-4a2f-a737-dbc639ee9940\\}))$/","prefs":[],"schema":1576756684025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92cedc61-c6c7-485e-98b0-a03c71eb2c5a","last_modified":1576771657198},{"guid":"/^((application@uk-manulap\\.com)|(application@uk-misafou\\.com)|(application@uk-nedmaf\\.com)|(application@uk-optalme\\.com)|(application@uk-plifacil\\.com)|(application@uk-poulilax\\.com)|(application@uk-rastafroc\\.com)|(application@uk-ruflec\\.com)|(application@uk-sabrelpt\\.com)|(application@uk-sqadipt\\.com)|(application@uk-tetsop\\.com)|(application@uk-ustif\\.com)|(application@uk-vomesq\\.com)|(application@uk-vrinotd\\.com)|(application@us-estuky\\.com)|(application@us-lesgsyo\\.com)|(applicationY@search-lesgsyo\\.com)|(\\{88069ce6-2762-4e02-a994-004b48bd83c1\\}))$/","prefs":[],"schema":1576756765926,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"42d1f27b-9cbf-4a3e-a18a-5c4418c2f5b6","last_modified":1576771657195},{"guid":"/^((\\{d1b87087-09c5-4e58-b01d-a49d714da2a2\\})|(\\{d14adc78-36bf-4cf0-9679-439e8371d090\\})|(\\{d64c923e-8819-488c-947f-716473d381b2\\})|(\\{d734e7e3-1b8e-42a7-a9b3-11b16c362790\\})|(\\{d147e8c6-c36e-46b1-b567-63a492390f07\\})|(\\{db1a103d-d1bb-4224-a5e1-8d0ec37cff70\\})|(\\{dec15b3e-1d12-4442-930e-3364e206c3c2\\})|(\\{dfa4b2e3-9e07-45a4-a152-cde1e790511d\\})|(\\{dfcda377-b965-4622-a89b-1a243c1cbcaf\\})|(\\{e4c5d262-8ee4-47d3-b096-42b8b04f590d\\})|(\\{e82c0f73-e42c-41dd-a686-0eb4b65b411c\\})|(\\{e60616a9-9b50-49d8-b1e9-cecc10a8f927\\})|(\\{e517649a-ffd7-4b49-81e0-872431898712\\})|(\\{e771e094-3b67-4c33-8647-7b20c87c2183\\})|(\\{eff5951b-b6d4-48f5-94c3-1b0e178dcca5\\})|(\\{f26a8da3-8634-4086-872e-e589cbf03375\\})|(\\{f992ac88-79d3-4960-870e-92c342ed3491\\})|(\\{f4e4fc03-be50-4257-ae99-5cd0bd4ce6d5\\})|(\\{f73636fb-c322-40e1-82fb-e3d7d06d9606\\})|(\\{f5128739-78d5-4ad7-bac7-bd1af1cfb6d1\\})|(\\{fc11e7f0-1c31-4214-a88f-6497c27b6be9\\})|(\\{feedf4f8-08c1-451f-a717-f08233a64ec9\\}))$/","prefs":[],"schema":1576756852767,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0896a86b-a211-4c64-968c-8671a21b2b5a","last_modified":1576771657191},{"guid":"/^((\\{2926cc6a-5f5d-4ef7-9cd0-0417408e8809\\})|(\\{569a3468-ebdc-4d95-84ef-0b6cbbcb2119\\})|(\\{6ef88cf3-c31c-4a9b-973b-765c21bc6f81\\})|(\\{a36b6921-0b70-4fad-b39b-786b23716b74\\})|(\\{fcc6a194-c627-4bf1-b185-e9611dc8d56d\\})|(\\{ddc71014-7997-421d-bb86-3b70b2ab24d5\\})|(\\{453638fc-e7f1-4a3d-acfb-724a0c750686\\})|(\\{0283d25d-25e6-4710-845f-b112fb264d3f\\})|(\\{071b1860-ff82-46d0-816c-a458382beaa7\\})|(\\{f0f6892f-6d0d-4146-9de5-21cc7eb3672a\\})|(\\{845c7444-bd97-4200-8144-c95ce77c07be\\})|(\\{8bc84806-edbd-4713-8a53-19a8c345fdfb\\})|(\\{959dfd6a-fbc5-49f0-8284-34e8606c7fd2\\})|(\\{9f90e1c8-a63e-43a9-8cd5-ad1d6fdf0f3a\\})|(\\{6b7cde7b-a79d-4012-b36c-86719ebcc308\\})|(\\{57f57692-7ef1-473a-adf7-7507e0e31c7d\\})|(\\{34bc568b-4243-4001-b528-118df3310667\\})|(\\{521e44f0-374e-466a-8829-2a98af75104b\\})|(\\{a4de65f7-33ae-4622-bb17-15053f0383f2\\})|(\\{f5ca8ea6-e854-4163-bc55-1a6f4086c1b2\\})|(\\{45765127-988a-4f3e-807d-f7784d76ecd0\\})|(\\{dc95db1e-68c5-44f4-a924-daac966373d2\\})|(\\{4119a8f1-508c-490d-87d4-203e93bbc5fb\\})|(\\{85997b97-ae1f-49e2-b42b-60f9c78c2d03\\})|(\\{a39c31c3-a57a-4c26-8454-267414494eed\\})|(\\{fa47c7ee-e855-41b0-9d3d-3c1d46d98a19\\})|(\\{6255931b-744a-49a2-bf6d-69ba35556760\\})|(\\{54112e17-779d-4275-9a04-81760931d356\\})|(\\{cea0dfab-286c-44c5-b41e-79d8ca5d097e\\})|(\\{fd6b2837-7828-4ad8-9bfe-361336aba33e\\})|(\\{0a56d404-ece2-441d-8d0b-e276ae1a07c2\\})|(\\{be54a202-b6e0-485d-b60b-f77f117ae602\\})|(\\{ff927da8-a634-4b4f-9010-2e76e3a6db2d\\})|(\\{a91f82ce-675b-4940-b58f-96095eb004af\\})|(\\{885c70f6-e286-433e-8f42-d7f319321d9d\\})|(\\{3e52fa7b-34c5-48e3-9cc2-3e33464db303\\})|(\\{ca94cd4e-3aec-41af-aa3c-1a8ddba9b9be\\})|(\\{0971aa7e-3a32-418a-acca-fdb5dacfca2f\\})|(\\{4d16cfea-bbe5-4254-b98b-70267cf2a2bc\\})|(\\{5cb20af8-1a98-43b0-9f09-0ee6d494ce65\\}))$/","prefs":[],"schema":1576756919670,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c81cb302-2519-4997-84de-75aa01f2dee9","last_modified":1576771657188},{"guid":"/^((jabcajffpafebcdcaddoegpenicdipdk@chrome-store-foxified-1110252619)|(jpegcert@freeverify\\.org)|(kmrfree@yahoo\\.com)|(lets-kingw@empotrm\\.com)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-29039950)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-77744803)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-357866719)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-447115206)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-549146896)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1084455972)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-1602969934)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2271560562)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-2595595173)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3103352300)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3116340547)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-3959272483)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4076222235)|(mdanidgdpmkimeiiojknlnekblgmpdll@chrome-store-foxified-4090031097)|(media-certificates@auth0\\.io)|(mingle-cash-extension@minglecash\\.com)|(MiningBlocker@MiningBlockerAddOn\\.com)|(multimedia@certifications\\.us)|(nominer-block-coin-miners@tubedownload\\.org)|(open-in-idm@tubedownload\\.org)|(sabqo@yolla\\.net)|(search-by-image@addonsmash)|(selfdestructingcookies@addonsmash)|(streaming-certficate@mdn\\.org)|(swt@gobck\\.com)|(tabs-re-open@gtk\\.cc)|(user-agent-rewriter@a\\.org)|(vba@vba\\.com)|(verification@bexp\\.co)|(vidcert@certs\\.org)|(xplayer@gobck\\.com)|(youtube_download_express@free-downloader\\.online)|(youtube_downloader@downloaders\\.xyz)|(youtube_grabber@utubegrabber\\.co)|(youtube-lyrics-by-rob-w@awesome\\.addons)|(youtube-mp4-downloader@tubedownload\\.org)|(ytdownloader@ytdownloader\\.org)|(yttools\\.download@youtube\\.com))$/","prefs":[],"schema":1576757015029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eaa146be-e47f-4c20-bdbd-c8046a929100","last_modified":1576771657184},{"guid":"/^((\\{ed4c3ce2-5372-429c-ae20-fa5b1f540fd7\\})|(\\{cd11da28-330d-4f09-a21f-fae7509f1b60\\})|(\\{74bc7a66-d4e6-4f1c-a0ef-1b65baa41cbf\\})|(\\{8069effc-45bb-4caf-8b27-a135431cd6b9\\})|(\\{577fc233-25bf-4e43-a164-aa75eb9d053a\\})|(\\{f5626996-f5cd-4d00-bcea-20dda6d9edd6\\})|(\\{9bb810ef-716e-4dc5-9f03-491a2c59384e\\})|(\\{02634a24-04d0-439f-9faf-a323ab4a1bac\\})|(\\{b73f7a43-a43a-47f5-8b1f-1ef7caa7857d\\})|(\\{3b5bf07b-5964-408a-8e43-e0239219c524\\})|(\\{73d3a404-150f-4594-ac2c-24f9beec78b1\\})|(\\{ef6a2133-5ed9-4dbc-a735-6ffe8490062e\\})|(\\{76b61321-01a1-4a17-850f-b064a0366b57\\})|(\\{bc41ca18-9209-4500-a847-4e514fea2536\\})|(\\{32c4c845-9bd7-4b20-97fa-a7616e7802ef\\})|(\\{410d9002-b517-471f-956e-30129e307af3\\})|(\\{43366e90-e4be-4ba6-bec0-3fb149128480\\})|(\\{8ebc90a4-f7a1-420a-8380-f85545403f80\\})|(\\{6d3fa41f-e896-4f85-ba59-321f4b26f380\\})|(\\{05c811f2-f828-4d3e-ad02-7386373e9a28\\})|(\\{e10a0ee6-8083-42a7-bed1-35400b029bf2\\})|(\\{c925be5a-ae0e-4958-be36-44dc2e64d4f7\\})|(\\{3803ed37-c101-4b21-a678-762f51b7eabf\\})|(\\{08a15cc0-d6cb-43c5-9a40-27443554b455\\})|(\\{d0953283-5970-4ebe-b270-940c6befdbb7\\})|(\\{7c983689-80c7-46dd-b9d2-4d2db1cf94a6\\})|(\\{8f320a17-868c-43dc-94fb-9d1ab7f4fe73\\})|(\\{843b406a-9593-49bf-9365-684fe8cb2f5a\\})|(\\{42cd0cbd-248d-4a44-88b6-1a3680d159ac\\})|(\\{23efa05d-99b1-49e0-a67d-5378f2afc20d\\})|(\\{f91c606c-dd33-42a4-9219-824187730f59\\})|(\\{9e233d16-18ae-4519-a83c-2806f4fee321\\})|(\\{a93cdf30-75da-463b-865b-f49cc7fd2697\\})|(\\{dcacb62c-9096-482d-845d-10413199a89b\\})|(\\{9d5da26f-c366-46b2-b3e7-5c8e3e0b9788\\})|(\\{dd176d1f-8cd5-4b5b-8b06-839449e87b5e\\})|(\\{9ada3b66-4412-427d-8696-ac0fe0ac891e\\})|(\\{9695495e-cb65-4cd6-8a93-52c9e2b8d767\\})|(\\{e9d1a027-a84c-4e90-b602-66ffe22a0ad6\\})|(\\{f71bda5e-c591-44aa-8f84-2f04989f7e7a\\})|(\\{e6e67c6f-c010-406d-8575-1835341ec4cf\\})|(\\{22fbf524-38be-4ead-b6ce-e55cb23ed74b\\})|(\\{866dafe9-1c49-47d7-a46c-1cb50ca52461\\})|(\\{3479fadc-41b1-492e-bb16-d8f9e514d488\\})|(\\{8c02daf2-79ed-4650-89ca-1e099d28c5e7\\})|(\\{65e6b805-7f0c-455f-b1b4-c34621056b46\\})|(\\{78de7006-944c-4c18-a33a-d6931619f2b0\\})|(\\{16c8051b-2c16-4641-bf29-2daee7883fd0\\})|(\\{19263ccc-a97f-49f4-867a-b49351c42c0c\\})|(\\{bfe416d8-e8c3-469c-908e-6926770152f0\\})|(\\{a29a4a96-2fcd-48f8-bfe1-a1d1df46e73d\\})|(\\{2d651636-a0fa-45b7-a97e-ebc85959ff23\\})|(\\{ac8a3af8-e264-4a0b-b813-d7fab03ae3fe\\})|(\\{4719ad8b-354b-443d-b1e6-4d60b851c465\\})|(\\{7679a9f9-29d8-4979-86e7-a5b5cf0e2fd3\\})|(\\{099e1648-58e7-492e-8019-3418263b9265\\})|(\\{9a83d154-4ea3-45f9-ae21-28f3c1f86773\\})|(\\{475b88fd-574c-4881-98e0-0184a03593cb\\})|(\\{d7b586f8-a22d-4986-9dfb-67d49ba46a68\\})|(\\{50b79e30-a649-4477-8612-7085c0ee3ad4\\})|(\\{e9b2d453-9a98-41e4-9837-c0d68ff1aeac\\})|(\\{b1814ce5-0d9f-495f-b260-a7e1e5538263\\})|(\\{9b06d35e-2eb0-4653-886f-a3f4cdcbb754\\})|(\\{e7d6a360-69d4-4f8c-a96f-fd63388995b2\\})|(\\{68a50af6-ddad-4750-a9a7-a71c55e019b7\\})|(\\{8286a0e0-ba89-48b3-871b-8c9acff32023\\})|(\\{b3c79903-9bc5-4ddf-aeeb-7d91989ae819\\})|(\\{7c5cc4ec-9637-428c-bcf7-28bba279cf84\\})|(\\{93d460ee-879f-4d8f-8599-a1c69ed59ec2\\})|(\\{207c95d5-2bb9-4760-b3a4-8c58ea173bff\\})|(\\{b3482681-1abf-4dfa-bace-dc7b51e6a150\\})|(\\{d3516cf6-d531-434a-b80a-df72c7166744\\})|(\\{da01a2aa-0cbb-4f57-a395-2256d142c519\\}))$/","prefs":[],"schema":1576757089378,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71f2c72f-b4d7-4ea9-bb8f-70d4d86eb184","last_modified":1576771657180},{"guid":"/^((\\{84a9ae69-5c01-4a73-80d3-c2201410d8c1\\})|(\\{852c68da-c573-42f8-85f8-9dcf57684f87\\})|(\\{85a31d9e-063f-421f-9d3f-649a393e94ec\\})|(\\{876778c8-5329-461d-882e-d4983ae6062a\\})|(\\{8913da4a-46fb-461c-9e60-3e257ef2c0e6\\})|(\\{8aa0118c-998e-40ac-84e9-12c936e5d70e\\})|(\\{8b4a6441-811f-4461-b136-7ebf3aebe3dc\\})|(\\{8bc41c3b-e052-4fd8-8de3-970ef5224bd9\\})|(\\{8e03b200-aad9-434b-9a99-e7aae7493a5f\\})|(\\{8fe94d0d-4746-401c-ad05-e0e1be97ea0e\\})|(\\{900f3c9c-b327-4608-950b-9765119c2e7a\\})|(\\{915080f5-97a3-4584-861f-70cd91f56474\\})|(\\{91d034a6-1765-4a59-85e5-9ddeb371ed9b\\})|(\\{9207dfae-06fc-4545-9fa6-6466b7ed2559\\})|(\\{926b2440-8443-4de3-9025-9a448cf3b838\\})|(\\{952bfd34-d195-4b10-8a3c-b103786cf090\\})|(\\{95315ff2-427b-427c-a433-236fb3b5eda4\\})|(\\{971db1e5-a5cb-46f9-91f9-9b687f4e5832\\})|(\\{982e11b3-e092-4713-81d4-5da1eadd278e\\})|(\\{98a2b9a7-13fa-49ff-aaa4-83786fad7862\\})|(\\{99f52d4d-1cd2-4e17-8f57-fa2493848f3f\\})|(\\{9a467b2c-be87-4d55-80d9-998dc6243e8b\\})|(\\{9abfecfa-d53e-4aea-bb6c-4fe47367f61e\\})|(\\{9b0243a5-92fb-43a4-adcc-3161f0ec030c\\})|(\\{9c7bb0bf-1534-4805-b9fa-a91004bd7e30\\})|(\\{a00e65f6-bf34-4ef9-a0e5-b63002c823e9\\})|(\\{a0dce648-f703-4867-9f3f-9bfa7601d1b1\\})|(\\{a16a700a-35ff-4ed1-ab81-164e3c823342\\})|(\\{a1f14b23-0c36-44e8-8f0d-9c732acbb550\\})|(\\{a4ea8038-65ae-4d7c-92e2-dd95caf007f4\\})|(\\{a55cd5be-89e4-40ba-8c3b-0023a1f41c8e\\})|(\\{a57ec9eb-cbab-4ddb-bafd-80cf5fd38891\\})|(\\{a5aa1d1e-dec7-4e25-bead-0861099f9628\\})|(\\{a604a85d-ba8f-4e8f-8ca1-867ca8d13a13\\})|(\\{a7a33aad-9e17-4db3-a127-d185e31607ae\\})|(\\{a9404f9f-6ac9-4366-bfcf-50d0d3bdeac3\\})|(\\{aaf2dd6b-5ca9-47aa-b41f-5b00c5c82d2e\\})|(\\{abf10dee-7cc9-4b79-ad5b-1e4300ab24a7\\})|(\\{ac97e702-b2e2-4a91-ae3e-bf0856300737\\})|(\\{ae03577f-2d20-4775-8286-685cdbee76e4\\})|(\\{aef2e959-90c0-44cf-bbb5-e0789af93efe\\})|(\\{af0d8090-d04f-4e9a-a3fb-1c9ac89e9f68\\})|(\\{b0da2032-0da5-4cff-b91b-e0efda4d6b36\\})|(\\{b2777372-311f-4a15-81e5-c84dd845c93d\\})|(\\{b44ac98d-6101-467d-a959-d6ada2259f01\\})|(\\{b50daf26-3983-4516-836f-0b8777bc44ab\\})|(\\{b5ca55b9-d06a-4538-be4a-38b29f3a4359\\})|(\\{b783327e-a675-40c2-95c7-59eb3f00b75d\\})|(\\{b91f2cd5-4051-4e13-8848-8e92afb99217\\})|(\\{ba32ffe1-dabb-41d6-a45f-f4d3e1304ff1\\})|(\\{bb80ea9f-8263-4183-a52d-e5d45ca6e0fe\\})|(\\{c0ba2c3c-55a6-4d28-bb27-67f71de78feb\\})|(\\{c0ecc589-04de-4243-9279-100b781f7443\\})|(\\{c2f6447c-e2db-43d1-8c53-fec7c29b22bb\\})|(\\{c4492fc0-70ed-4d36-8904-61ccb663eaac\\})|(\\{c58e10ce-d69e-478d-8270-0d73599a8cfc\\})|(\\{c72781ce-8377-41ae-984e-ed5755af28de\\})|(\\{c7f51f89-f47c-45e6-aa57-177deba406a0\\})|(\\{c859eaff-3dde-4d83-9703-0a6cf9e95308\\})|(\\{ca51951b-5c9e-4c26-bca3-ed6e754ae5c0\\})|(\\{ce9f05c7-6246-4918-8505-fdc455bc0aab\\})|(\\{cf0ec4e1-5d0d-4846-aa97-380806e72e46\\})|(\\{cfa73be4-9e64-4aea-bb0a-2ab0defb27b3\\})|(\\{d12c5edd-1182-4bf7-bdb1-f2662b7ce1be\\})|(\\{d2343e30-0253-4556-9dd8-cb6cb461801d\\})|(\\{d7a1fad5-eb70-4f7f-a24d-98c3bb9a7aa4\\})|(\\{d7a7e3d1-e6f2-45e3-957a-4b2cde1b413b\\})|(\\{d946d1e8-38bd-41f4-8dc7-a255802046a8\\})|(\\{da7e77cd-4a7c-4282-a597-0694ada485b4\\})|(\\{dc905949-378e-4b8c-aacc-cff56b04370d\\})|(\\{dca4c8f5-5ef9-40fb-bd76-dcb4ec98c495\\})|(\\{dd275beb-f7dd-4ff6-8fec-23e8c0422b68\\})|(\\{de88be71-25f9-48d0-adc9-3d9a542cf303\\})|(\\{df148b39-f7c2-480d-ad8b-91b700e6642b\\})|(\\{df55df20-2e99-49fd-90bc-b548b833e2db\\})|(\\{e1348bc8-b378-45a3-95bb-4915b8910c1e\\})|(\\{e72aab9f-77f1-4e03-a4b7-9ea4b066fe50\\})|(\\{e8372510-9f1b-4b11-8e2f-dfc1d5d1a4a1\\})|(\\{eae5c7b6-8b67-4645-a1c1-a543e63ceda5\\})|(\\{eb1ed544-82e6-4785-b693-1e0799f7cffa\\})|(\\{ec37edc4-e1a6-4073-9cd4-7a5315c921e3\\})|(\\{ed240b54-8600-496b-a034-d9a153359906\\})|(\\{ee6e56cf-b963-4efb-b64e-cf6117dc9a5b\\})|(\\{f3337e21-4fbd-411c-b1fc-d0543052b499\\})|(\\{f5a4fafb-2f75-4acc-9dad-324ca00a1b84\\})|(\\{f9b00c32-2f31-436b-8cb1-720b12502cb6\\})|(\\{fdfd1815-cf54-4210-8883-a4154668b866\\})|(adobeflashplayer@flashplayeradobedeveloper\\.com)|(adobeflashplayer@flashplayeradobedevelopper\\.com)|(afplayer@firefox\\.pl)|(afplayerx@firefox\\.pl)|(aktualizacjaalamusowjeac@wp\\.pl)|(aktualizacjalamusowjeac@wp\\.pl)|(andrzej-ff@wp\\.pl)|(andrzej@gmail\\.com)|(au_addx@geckoaddon\\.org)|(au9c1660@auge\\.site)|(birghun@firefox\\.pl)|(birghuxxn@firefox\\.pl)|(btxyhuh@firefox\\.pl)|(elsee@geckoaddon\\.org)|(elseeau@geckoaddon\\.org)|(extensioner@firefox\\.pl)|(fr@ffget\\.xyz)|(fr9c1660@frge\\.site))$/","prefs":[],"schema":1576757184838,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81f88c43-22e7-4602-8928-3a0b0f50689e","last_modified":1576771657176},{"guid":"/^((fruxuc@flashc\\.com)|(it_addx@geckoaddon\\.org)|(it9c1660@tige\\.site)|(marlenex@firefox\\.pl)|(nads@firefox\\.pl)|(newtabextension@newtabextensiond\\.com)|(pl@k4n\\.pl)|(playerro1@firefox\\.pl)|(socketextensionws1@geckoaddon\\.org)|(soxmuc@firefox\\.pl))$/","prefs":[],"schema":1576757189399,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7e85b5b-7e0a-40c9-a900-99de7ba2a131","last_modified":1576771657173},{"guid":"/^((_hwMembers_@free\\.mapfinderz\\.com)|(_hxMembers_@free\\.mergedocsnow\\.com)|(_hyMembers_@free\\.formfetcherpro\\.com)|(_hzMembers_@free\\.televisionace\\.com)|(_i2Members_@free\\.streamlineddiy\\.com)|(_i4Members_@free\\.fileconvertonline\\.com)|(_i5Members_@free\\.mydiygenie\\.com)|(_i6Members_@free\\.dailyproductivitytools\\.com)|(_i7Members_@free\\.digismirkz\\.com)|(_i9Members_@free\\.cinematicfanatic\\.com)|(_iaMembers_@free\\.liveradiosweeper\\.com)|(_ijMembers_@www\\.freedirectionsonline\\.com)|(_isMembers_@free\\.mydigitalcalendar\\.com)|(_itMembers_@free\\.mycalendarplanner\\.com)|(_iuMembers_@free\\.productmanualsfinder\\.com)|(_ivMembers_@free\\.simplepictureedit\\.com)|(_iwMembers_@free\\.allinonedocs\\.com)|(_j1Members_@free\\.onlineworksuite\\.com)|(_j4Members_@free\\.createdocsonline\\.com)|(_j5Members_@ext\\.ask\\.com)|(_j6Members_@www\\.freemanualsindex\\.com)|(_j7Members_@www\\.convertdocsonline\\.com)|(_j8Members_@www\\.discoverliveradio\\.com)|(_j9Members_@www\\.internetspeedradar\\.com)|(_jaMembers_@www\\.testonlinespeed\\.com)|(_jbMembers_@www\\.onlinemapsearch\\.com)|(_jcMembers_@www\\.quickweathertracker\\.com)|(_jhMembers_@www\\.getcouponsfast\\.com)|(_jiMembers_@www\\.searchformsonline\\.com)|(_jjMembers_@www\\.onlineroutefinder\\.com)|(_jmMembers_@www\\.supercouponpro\\.com)|(_jnMembers_@www\\.pdfconverttools\\.com)|(_joMembers_@www\\.onlineformfinder\\.com)|(_jpMembers_@www\\.directionswhiz\\.com)|(_jqMembers_@www\\.convertpdfsnow\\.com)|(_jvMembers_@free\\.notehomepage\\.com)|(_k8Members_@www\\.mymapsexpress\\.com)|(_k9Members_@www\\.mytransitmapper\\.com)|(_kbMembers_@www\\.convertersnow\\.com)|(_kjMembers_@www\\.easydirectionsfinder\\.com)|(_knMembers_@www\\.getfamilyhistory\\.com)|(_koMembers_@www\\.quickpdfmerger\\.com)|(_kpMembers_@www\\.easytransithelper\\.com)|(_kqMembers_@www\\.easypackagefinder\\.com)|(_krMembers_@www\\.easyemailsuite\\.com)|(_ksMembers_@www\\.quickcouponfinder\\.com)|(_ktMembers_@www\\.easypackagetracker\\.com)|(_kvMembers_@www\\.radiofinder\\.com)|(_kwMembers_@www\\.productmanualspro\\.com)|(_kxMembers_@www\\.smarteasymaps\\.com)|(_kyMembers_@www\\.quickflighttracker\\.com)|(_kzMembers_@www\\.productmanualsguide\\.com)|(_l0Members_@www\\.getformshere\\.com)|(_l1Members_@www\\.videoconverterhd\\.com)|(_l3Members_@www\\.watchmytvshows\\.com)|(_l4Members_@www\\.quicktemplatefinder\\.com)|(_l5Members_@www\\.strictlyradio\\.com)|(_l6Members_@www\\.propdfconverter\\.com)|(_l7Members_@free\\.gifables\\.com)|(_laMembers_@free\\.gifsgalore\\.com)|(_lbMembers_@free\\.worldofnotes\\.com)|(_ohMembers_@chrome\\.google\\.com)|(_onMembers_@www\\.4thofjulypictureedit\\.com)|(_oxMembers_@free\\.anytimeastrology\\.com)|(_oyMembers_@free\\.getfreegifs\\.com)|(_ozMembers_@free\\.newnotecenter\\.com)|(_paMembers_@www\\.filmfanatic\\.com)|(_pbMembers_@www\\.holidayphotoedit\\.com)|(_pcMembers_@free\\.astrologysearcher\\.com)|(_pdMembers_@free\\.horoscopebuddy\\.com)|(_peMembers_@free\\.lovemyhoroscopes\\.com)|(_pjMembers_@free\\.gifapalooza\\.com)|(_pkMembers_@free\\.giffysocial\\.com)|(_pnMembers_@free\\.myeasylotto\\.com)|(_pqMembers_@www\\.freepdfcombiner\\.com)|(_psMembers_@www\\.freetemplatefinder\\.com)|(_ptMembers_@www\\.simplepackagefinder\\.com)|(_pvMembers_@www\\.mapmywayfree\\.com)|(_pxMembers_@www\\.simpleflighttracker\\.com)|(_pyMembers_@www\\.filesendfree\\.com)|(_pzMembers_@free\\.babynameready\\.com)|(_q0Members_@free\\.mywaynotes\\.com)|(_q1Members_@free\\.everydaymemo\\.com)|(_q7Members_@www\\.getflightupdates\\.com)|(_q8Members_@www\\.getformsfree\\.com)|(_qfMembers_@www\\.formfinderfree\\.com)|(_qhMembers_@free\\.presidentialbuzz\\.com)|(_qjMembers_@free\\.taxcenternow\\.com)|(_qlMembers_@free\\.cryptopricesearch\\.com)|(_qmMembers_@free\\.ontargetyoga\\.com)|(_qoMembers_@free\\.taxinfohelp\\.com)|(_qpMembers_@free\\.getpoliticalnews\\.com)|(_qqMembers_@free\\.thepresidentsays\\.com)|(_qtMembers_@www\\.formfinderhq\\.com)|(_quMembers_@free\\.myquicklotto\\.com)|(_qwMembers_@free\\.shoppingdealslive\\.com)|(_r0Members_@free\\.bitcoinpricesearch\\.com)|(_r1Members_@free\\.projectbabyname\\.com)|(_r2Members_@free\\.yogaposeonline\\.com)|(_r5Members_@www\\.quickdocsonline\\.com)|(_r6Members_@free\\.ezpdfconvert\\.com)|(_r7Members_@free\\.onlineformsdirect\\.com)|(_r8Members_@free\\.mapsboss\\.com)|(_raMembers_@www\\.fileconverterfree\\.com)|(_rcMembers_@extsb\\.searchbetter\\.com))$/","prefs":[],"schema":1576757318717,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e87028d0-b5c8-4a76-9105-0229bafb5040","last_modified":1576771657169},{"guid":"/^((_rdMembers_@www\\.freeshoppingtool\\.com)|(_reMembers_@www\\.simpleholidayrecipes\\.com)|(_rfMembers_@www\\.myguidetoislam\\.com)|(_rgMembers_@free\\.entertainmentnewsnow\\.com)|(_rhMembers_@free\\.politicalnewscenter\\.com)|(_riMembers_@www\\.myfashiontab\\.com)|(_rjMembers_@www\\.mychristianportal\\.com)|(_rkMembers_@www\\.globaljewishworld\\.com)|(_rlMembers_@www\\.myvedictab\\.com)|(_rnMembers_@free\\.learnthelyrics\\.com)|(_roMembers_@free\\.dailyfunnyworld\\.com)|(_rpMembers_@free\\.myprivacymanager\\.com)|(_rqMembers_@free\\.getseniorresources\\.com)|(_rrMembers_@free\\.webtopdfprint\\.com)|(_rsMembers_@www\\.freeauctionfinder\\.com)|(_rwMembers_@free\\.getlyricsonline\\.com)|(_rzMembers_@free\\.pagesummarizer\\.com)|(_s0Members_@free\\.funnyjokesnow\\.com)|(_s2Members_@free\\.mybabyboomerhub\\.com)|(_s6Members_@free\\.celebgossiponline\\.com)|(_saMembers_@free\\.onlineprivacymanager\\.com)|(_scMembers_@free\\.freearticleskimmer\\.com)|(_sdMembers_@www\\.easywebpageprint\\.com)|(_swMembers_@www\\.homehelpguide\\.com)|(_szMembers_@www\\.mydocshere\\.com)|(_v4Members_@www\\.dictionaryboss\\.com))$/","prefs":[],"schema":1576757323000,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"49cb7c72-e90e-4dc3-adda-d63083c83a7c","last_modified":1576771657165},{"guid":"/^(({23c65153-c21e-430a-a2dc-0793410a870d})|({29c69b12-8208-457e-92f4-e663b00a1f10})|({30a8d6f1-0401-4327-8c46-2e1ab45dfe77})|({30d63f93-1446-43b3-8219-deefec9c81ce})|({32cb52f8-c78a-423d-b378-0abec72304a6})|({35bfa8c0-68c1-41f8-a5dd-7f3b3c956da9})|({36a4269e-4eef-4538-baea-9dafbf6a8e2f})|({37f8e483-c782-40ed-82e9-36f101b9e41f})|({42a512a8-37e0-4e07-a1db-5b4651d75048})|({43ae5745-c40a-45ab-9c11-74316c0e9fd2})|({53fa8e1c-112b-4013-b582-0d9e8c51ca75})|({56effac7-3ae9-41e3-9b46-51469f67b3b2})|({61a486c0-ce3d-4bf1-b4f2-e186a2adecf1})|({62b55928-80cc-49f7-8a4b-ec06030d6601})|({63df223d-51cf-4f76-aad8-bbc94c895ed2})|({064d8320-e0f3-411f-9ed1-8c1349279d20})|({071b9878-a7d3-4ae3-8ef0-2eaee1923403})|({72c1ca96-c05d-46a7-bce1-c507ec3db4ea})|({76ce213c-8e57-4a14-b60a-67a5519bd7a7})|({78c2f6a0-3b54-4a21-bf25-a3348278c327})|({0079b71b-89c9-4d82-aea3-120ee12d9890})|({81ac42f3-3d17-4cff-85af-8b7f89c8826b})|({81dc4f0e-9dab-4bd2-ab9d-d9365fbf676f})|({82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a})|({83d6f65c-7fc0-47d0-9864-a488bfcaa376})|({83d38ac3-121b-4f28-bf9c-1220bd3c643b})|({84b9121e-55c9-409a-9b28-c588b5096222})|({87ba49bd-daba-4071-aedf-4f32a7e63dbe})|({87c552f9-7dbb-421b-8deb-571d4a2d7a21})|({87dcb9bf-3a3e-4b93-9c85-ba750a55831a})|({89a4f24d-37d5-46e7-9d30-ba4778da1aaa})|({93c524c4-2e92-4dd7-8b37-31a69bc579e8})|({94df38fc-2dbe-4056-9b35-d9858d0264d3})|({95c7ae97-c87e-4827-a2b7-7b9934d7d642})|({95d58338-ba6a-40c8-93fd-05a34731dc0e})|({97c436a9-7232-4495-bf34-17e782d6232c})|({97fca2cd-545f-42ef-ae93-dc13b046bd3b})|({0111c475-01e6-42ea-a9b4-27bed9eb6092})|({115a8321-4414-4f4c-aee6-9f812121b446})|({158a5a56-aca0-418f-bec0-5b3bda6e9d4c})|({243a0246-cbab-4b46-93fb-249039f68d84})|({283d4f2a-bab1-43ce-90be-5129741ac988})|({408a506b-2336-4671-a490-83a1094b4097})|({0432b92a-bfcf-41b9-b5f0-df9629feece1})|({484e0ba4-a20b-4404-bb1b-b93473782ae0})|({486ecaf1-1080-48c1-8973-549bc731ccf9})|({495a84bd-5a0c-4c74-8a50-88a4ba9d74ba})|({520f2c78-7804-4f59-ae74-a192476055ed})|({543f7503-3620-4f41-8f9e-c258fdff07e9})|({0573bea9-7368-49cd-ba10-600be3535a0b})|({605a0c42-86af-40c4-bf39-f14060f316aa})|({618baeb9-e694-4c7b-9328-69f35b6a8839})|({640c40e5-a881-4d16-a4d0-6aa788399dd2})|({713d4902-ae7b-4a9a-bcf5-47f39a73aed0})|({767d394a-aa77-40c9-9365-c1916b4a2f84})|({832ffcf9-55e9-4fd1-b2eb-f19e1fac5089})|({866a0745-8b91-4199-820a-ec17de52b5f2})|({869b5825-e344-4375-839b-085d3c09ab9f})|({919fed43-3961-48d9-b0ef-893054f4f6f1})|({971d6ef0-a085-4a04-83d8-6e489907d926})|({1855d130-4893-4c79-b4aa-cbdf6fee86d3})|({02328ee7-a82b-4983-a5f7-d0fc353698f0})|({2897c767-03aa-4c2f-910a-6d0c0b9b9315})|({3908d078-e1db-40bf-9567-5845aa77b833})|({04150f98-2d7c-4ae2-8979-f5baa198a577})|({4253db7f-5136-42c3-b09d-cf38344d1e16})|({4414af84-1e1f-449b-ac85-b79f812eb69b})|({4739f233-57c1-4466-ad51-224558cf375d})|({5066a3b2-f848-4a59-a297-f268bc3a08b6})|({6072a2a8-f1bc-4c9c-b836-7ac53e3f51e4})|({7854ee87-079f-4a25-8e57-050d131404fe})|({07953f60-447e-4f53-a5ef-ed060487f616})|({8886a262-1c25-490b-b797-2e750dd9f36b})|({12473a49-06df-4770-9c47-a871e1f63aea})|({15508c91-aa0a-4b75-81a2-13055c96281d})|({18868c3a-a209-41a6-855d-f99f782d1606})|({24997a0a-9d9b-4c87-a076-766d44e1f6fd})|({27380afd-f42a-4c25-b57d-b9012e0d5d48})|({28044ca8-8e90-435e-bc63-a757af2fb6be})|({30972e0a-f613-4c46-8c87-2e59878e7180})|({31680d42-c80d-4f8a-86d3-cd4930620369})|({44685ba6-68b3-4895-879e-4efa29dfb578})|({046258c9-75c5-429d-8d5b-386cfbadc39d})|({47352fbf-80d9-4b70-9398-fb7bffa3da53})|({56316a2b-ef89-4366-b4aa-9121a2bb6dea})|({65072bef-041f-492e-8a51-acca2aaeac70})|({677e2d00-264c-4f62-a4e8-2d971349c440})|({72056a58-91a5-4de5-b831-a1fa51f0411a})|({85349ea6-2b5d-496a-9379-d4be82c2c13d})|({98363f8b-d070-47b6-acc6-65b80acac4f3})|({179710ba-0561-4551-8e8d-1809422cb09f})|({207435d0-201d-43f9-bb0f-381efe97501d})|({313e3aef-bdc9-4768-8f1f-b3beb175d781})|({387092cb-d2dc-4da5-9389-4a766c604ec2})|({0599211f-6314-4bf9-854b-84cb18da97f8})|({829827cd-03be-4fed-af96-dd5997806fb4})|({856862a5-8109-47eb-b815-a94059570888})|({1e6f5a54-2c4f-4597-aa9e-3e278c617d38})|({1490068c-d8b7-4bd2-9621-a648942b312c})|({18e5e07b-0cfa-4990-a67b-4512ecbae04b})|({3584581e-c01a-4f53-aec8-ca3293bb550d})|({5280684d-f769-43c9-8eaa-fb04f7de9199})|({5766852a-b384-4276-ad06-70c2283b4792}))$/","prefs":[],"schema":1576757432447,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e3139834-609b-4726-8bfa-a28659ba14fc","last_modified":1576771657161},{"guid":"/^(({34364255-2a81-4d6e-9760-85fe616abe80})|({45621564-b408-4c29-8515-4cf1f26e4bc3})|({62237447-e365-487e-8fc3-64ddf37bdaed})|({7e7aa524-a8af-4880-8106-102a35cfbf42})|({71639610-9cc3-47e0-86ed-d5b99eaa41d5})|({78550476-29ff-4b7e-b437-195024e7e54e})|({85064550-57a8-4d06-bd4b-66f9c6925bf5})|({93070807-c5cd-4bde-a699-1319140a3a9c})|({11e7b9b3-a769-4d7f-b200-17cffa4f9291})|({22632e5e-95b9-4f05-b4b7-79033d50467f})|({03e10db6-b6a7-466a-a2b3-862e98960a85})|({23775e7d-dfcf-42b1-aaad-8017aa88fc59})|({85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33})|({9e32ca65-4670-41e3-b6bb-8773e6b9bba8})|({6e43af8e-a78e-4beb-991f-7b015234eacc})|({57e61dc7-db04-4cf8-bbd3-62a15fc74138})|({01166e60-d740-440c-b640-6bf964504b3c})|({52e137bc-a330-4c25-a981-6c1ab9feb806})|({488e190b-d1f6-4de8-bffb-0c90cc805b62})|({5e257c96-bfed-457d-b57e-18f31f08d7bb})|({2134e327-8060-441c-ba68-b167b82ff5bc})|({1e68848a-2bb7-425c-81a2-524ab93763eb})|({8e888a6a-ec19-4f06-a77c-6800219c6daf})|({7e907a15-0a4c-4ff4-b64f-5eeb8f841349})|({a0ab16af-3384-4dbe-8722-476ce3947873})|({a0c54bd8-7817-4a40-b657-6dc7d59bd961})|({a0ce2605-b5fc-4265-aa65-863354e85058})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})|({a3fbc8be-dac2-4971-b76a-908464cfa0e0})|({a5a84c10-f12c-496e-80df-33386b7a1463})|({a5f90823-0a50-414f-ad34-de0f6f26f78e})|({a6b83c45-3f24-4913-a1f7-6f42411bbb54})|({a9eb2583-75e0-435a-bb6c-69d5d9b20e27})|({a32ebb9b-8649-493e-a9e9-f091f6ac1217})|({a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4})|({a506c5af-0f95-4107-86f8-3de05e2794c9})|({a02001ae-b7ed-45d7-baf2-c07f0a7b6f87})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({a18087bb-4980-4349-898c-ca1b7a0e59cd})|({a345865c-44b9-4197-b418-934f191ce555})|({a7487703-02d8-4a82-a7d0-2859de96edb4})|({a2427e23-d349-4b25-b5b8-46960b218079})|({a015e172-2465-40fc-a6ce-d5a59992c56a})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({abec23c3-478f-4a5b-8a38-68ccd500ec42})|({ac06c6b2-3fd6-45ee-9237-6235aa347215})|({ac037ad5-2b22-46c7-a2dc-052b799b22b5})|({ac296b47-7c03-486f-a1d6-c48b24419749})|({acbff78b-9765-4b55-84a8-1c6673560c08})|({acfe4807-8c3f-4ecc-85d1-aa804e971e91})|({ada56fe6-f6df-4517-9ed0-b301686a34cc})|({af44c8b4-4fd8-42c3-a18e-c5eb5bd822e2})|({b5a35d05-fa28-41b5-ae22-db1665f93f6b})|({b7b0948c-d050-4c4c-b588-b9d54f014c4d})|({b7f366fa-6c66-46bf-8df2-797c5e52859f})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({b12cfdc7-3c69-43cb-a3fb-38981b68a087})|({b019c485-2a48-4f5b-be13-a7af94bc1a3e})|({b91fcda4-88b0-4a10-9015-9365e5340563})|({b30591d6-ec24-4fae-9df6-2f3fe676c232})|({b99847d6-c932-4b52-9650-af83c9dae649})|({bbe79d30-e023-4e82-b35e-0bfdfe608672})|({bc3c2caf-2710-4246-bd22-b8dc5241693a})|({bc3c7922-e425-47e2-a2dd-0dbb71aa8423})|({bc763c41-09ca-459a-9b22-cf4474f51ebc})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({be981b5e-1d9d-40dc-bd4f-47a7a027611c})|({be37931c-af60-4337-8708-63889f36445d})|({bea8866f-01f8-49e9-92cd-61e96c05d288})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c3a2b953-025b-425d-9e6e-f1a26ee8d4c2})|({c3b71705-c3a6-4e32-bd5f-eb814d0e0f53})|({c5d359ff-ae01-4f67-a4f7-bf234b5afd6e})|({c6c8ea62-e0b1-4820-9b7f-827bc5b709f4})|({c8c8e8de-2989-4028-bbf2-d372e219ba71})|({c34f47d1-2302-4200-80d4-4f26e47b2980})|({c178b310-6ed5-4e04-9e71-76518dd5fb3e})|({c2341a34-a3a0-4234-90cf-74df1db0aa49})|({c8399f02-02f4-48e3-baea-586564311f95})|({c41807db-69a1-4c35-86c1-bc63044e4fcb})|({c383716f-b23f-47b2-b6bb-d7c1a7c218af})|({c3447081-f790-45cb-ae03-0d7f1764c88c})|({c445e470-9e5a-4521-8649-93c8848df377})|({c8e14311-4b2d-4eb0-9a6b-062c6912f50e})|({ca4fdfdb-e831-4e6e-aa8b-0f2e84f4ed07})|({ca6cb8b2-a223-496d-b0f6-35c31bc7ca2b})|({cba7ce11-952b-4dcb-ba85-a5b618c92420})|({cc6b2dc7-7d6f-470f-bccc-6a42907162d1})|({cc689da4-203f-4a0c-a7a6-a00a5abe74c5})|({ccb7b5d6-a567-40a2-9686-a097a8b583dd})|({cd28aa38-d2f1-45a3-96c3-6cfd4702ef51})|({cd89045b-2e06-46bb-9e34-48e8799e5ef2})|({cdda1813-51d6-4b1f-8a2f-8f9a74a28e14})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({ce93dcc7-f911-4098-8238-7f023dcdfd0d})|({cf9d96ff-5997-439a-b32b-98214c621eee})|({cfa458f9-b49b-4e09-8cb2-5e50bd8937cc})|({cfb50cdf-e371-4d6b-9ef2-fcfe6726db02})|({d1ab5ebd-9505-481d-a6cd-6b9db8d65977})|({d03b6b0f-4d44-4666-a6d6-f16ad9483593})|({d9d8cfc1-7112-40cc-a1e9-0c7b899aae98})|({d47ebc8a-c1ea-4a42-9ca3-f723fff034bd}))$/","prefs":[],"schema":1576757481582,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4885bfb1-7859-4ebc-b42f-2545125a5522","last_modified":1576771657157},{"guid":"/^(({d72d260f-c965-4641-bf49-af4135fc46cb})|({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({d461cc1b-8a36-4ff0-b330-1824c148f326})|({d97223b8-44e5-46c7-8ab5-e1d8986daf44})|({d42328e1-9749-46ba-b35c-cce85ddd4ace})|({da7d00bf-f3c8-4c66-8b54-351947c1ef68})|({db84feec-2e1f-48f0-9511-645fe4784feb})|({dc6256cc-b6d0-44ca-b42f-4091f11a9d29})|({dd1cb0ec-be2a-432b-9c90-d64c824ac371})|({dd95dd08-75d1-4f06-a75b-51979cbab247})|({ddae89bd-6793-45d8-8ec9-7f4fb7212378})|({de3b1909-d4da-45e9-8da5-7d36a30e2fc6})|({df09f268-3c92-49db-8c31-6a25a6643896})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({e7b978ae-ffc2-4998-a99d-0f4e2f24da82})|({e7fb6f2f-52b6-4b02-b410-2937940f5049})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})|({e9c47315-2a2b-4583-88f3-43d196fa11af})|({e341ed12-a703-47fe-b8dd-5948c38070e4})|({e804fa4c-08e0-4dae-a237-8680074eba07})|({e8982fbd-1bc2-4726-ad8d-10be90f660bd})|({e40673cd-9027-4f61-956c-2097c03ae2be})|({e72172d1-39c9-4f41-829d-a1b8d845d1ca})|({e73854da-9503-423b-ab27-fafea2fbf443})|({e81e7246-e697-4811-b336-72298d930857})|({ea618d26-780e-4f0f-91fd-2a6911064204})|({ea523075-66cd-4c03-ab04-5219b8dda753})|({eb3ebb14-6ced-4f60-9800-85c3de3680a4})|({ec8c5fee-0a49-44f5-bf55-f763c52889a6})|({eccd286a-5b1d-494d-82b0-92a12213d95a})|({ed352072-ddf0-4cb4-9cb6-d8aa3741c2de})|({edb476af-0505-42af-a7fd-ec9f454804c0})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206})|({f0b809eb-be22-432f-b26f-b1cadd1755b9})|({f5ffa269-fbca-4598-bbd8-a8aa9479e0b3})|({f6c543bf-2222-4230-8ecb-f5446095b63d})|({f6df4ef7-14bd-43b5-90c9-7bd02943789c})|({f6f98e6b-f67d-4c53-8b76-0b5b6df79218})|({f38b61f3-3fed-4249-bb3d-e6c8625c7afb})|({f50e0a8f-8c32-4880-bcef-ca978ccd1d83})|({f59c2d3d-58da-4f74-b8c9-faf829f60180})|({f82b3ad5-e590-4286-891f-05adf5028d2f})|({f92c1155-97b3-40f4-9d5b-7efa897524bb})|({f95a3826-5c8e-4f82-b353-21b6c0ca3c58})|({f5758afc-9faf-42bb-9543-a4cfb0bfce9d})|({f447670d-64f5-418f-9b4a-5352d6c8e127})|({f4262989-6de0-4604-918f-663b85fad605})|({fa8bd609-0e06-4ba9-8e2e-5989f0b2e197})|({fa0808f6-25ab-4a8b-bd17-3b275c55ff09})|({fac5816b-fd0f-4db2-a16e-52394b6db41d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|({fce89242-66d3-4946-9ed0-e66078f172fc})|({fcf72e24-5831-439e-bb07-fd53a9e87a30})|({fdc0601f-1fbb-40a5-84e1-8bbe96b22502})|({feb3c734-4529-4d69-9f3a-2dae18f1d896}))$/","prefs":[],"schema":1576757513203,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"672db55e-49ce-4b00-88ab-46cc24277800","last_modified":1576771657153},{"guid":"/^((\\{666ff753-69f8-49da-8adf-8aa770d3e383\\})|(\\{51536072-b64d-4a34-bee0-49b8e8175bc1\\})|(addon@filestopdf\\.com)|(info@icdst\\.ir)|(\\{d22f9fb6-1488-4969-aa49-e3322d622b6a\\})|(\\{b9db7ded-77d6-489b-bc0e-570df3f3e527\\})|(\\{62d89bd6-0042-4342-a15f-fa0a8addfca9\\})|(\\{4d8dfb84-624e-48df-8eeb-60443b2afeee\\})|(\\{2b3ac8fa-f84c-4e8f-83b6-438735fb1406\\})|(\\{40999239-996a-48ee-835c-8a11f71e53eb\\})|(\\{6a670f43-0093-4f2c-a265-02754d9fcb42\\})|(\\{f8de8278-97b5-4da1-b810-658f5909cb3b\\})|(MiniSearch@Context)|(arksignermozillafirefoxextension@example\\.org)|(\\{8f073b13-8b8b-4fe1-bee3-ee7573420ddd\\})|(\\{dab4ccbf-7cc0-4611-9a49-e7975b4e35d4\\})|(\\{564f1733-6bfc-4a03-b7a7-4ddc79b4ec00\\})|(\\{4aa733fc-44b5-439a-b928-a90f0698ccd9\\})|(\\{1e5da97f-f7e6-4eff-9f59-5e933320929c\\})|(\\{c3acee78-2e6b-408a-a62b-3fd5765b5518\\})|(\\{d7ba7080-7f1d-466a-8c4f-6f12d2c31284\\})|(\\{42979ad6-680d-4bc6-84be-2c94eb3ce586\\})|(\\{9cb8385f-8f1d-40c3-b78c-d05e4f949ecc\\})|(\\{2e58d47d-b3e6-499a-83c4-536e3f8a9903\\})|(\\{8a554f9d-90fa-4fbd-aa53-8d03f3939baf\\})|(\\{267495e1-9990-4d67-bde6-f1774188c307\\})|(\\{eb4c0a5d-48e2-4984-ad4a-141b313a58d0\\})|(\\{ffbef674-f098-4406-be3f-e96987be1701\\})|(\\{cf0578ea-3b45-45f1-b8ff-5898106ded49\\})|(\\{5fbbbebd-ebb3-499a-b091-0d82ec5eff02\\})|(\\{f4065411-1929-4970-8516-bf875525e2a0\\})|(\\{40f2f6f9-e58d-47fa-bdb3-9fa0ff71ad03\\})|(\\{42f4554c-3e5f-4d21-98cf-3a3f5c968fa7\\})|(\\{c5ec86f0-ef3e-42c8-8537-bd111af62dd3\\})|(\\{fa20692f-ae7a-42c3-a98d-2e092679d455\\})|(\\{b4f5e691-5146-4a64-bf45-25126e673f72\\})|(\\{3c5c9a50-c00d-4a3c-9e6f-2785d3419cc0\\})|(\\{fb246a17-c9ff-4771-b9fb-9fc79477fc0b\\})|(\\{80409c03-07bf-4b33-b6c5-e6ef260478da\\})|(\\{196c766b-29e5-4de8-a35b-96a4c40a28c7\\})|(\\{d6f9a86d-bb00-4877-af5a-12ad3dba76b9\\})|(\\{73660d5e-451a-450c-8a6d-bb023252cf51\\})|(\\{70e7455b-6e99-49d1-97d5-0147c48af7d7\\})|(\\{f84d6912-ff8f-4e96-b3f4-72ba33e29584\\})|(\\{e9dc2e41-d607-4938-be21-a9f1faed2acc\\})|(\\{5c6da614-27de-4d9e-9c39-0e2517a8d31b\\})|(\\{3a379d30-7c89-4251-8158-8b7584ec7317\\})|(\\{fc32234f-df43-4afa-a2f0-be0e2753daba\\})|(\\{c7f39b82-24d0-4428-9348-afe7a2f88a45\\})|(\\{2b9c2d2c-a3bd-4837-b613-ce2bb5aefbe8\\})|(\\{7d0e4c77-d013-47f0-808c-028c98e3b10e\\})|(\\{f0eec3eb-367c-4ff1-9963-c211afad69ef\\})|(\\{bf2b8075-2aac-45e3-9351-0b3ad3dd708e\\})|(\\{632d24c3-7423-4384-a665-0bbd060c93c2\\})|(\\{bd4a9564-fe81-400f-817f-34ba2a8260b2\\})|(\\{810e482d-b665-47e2-b379-ec3467c20885\\})|(\\{ab4a0a76-c868-4d09-9c2a-eeb97cf9d619\\})|(\\{96af6f96-61e2-43a1-947c-6b64ae1ce4cc\\})|(\\{04506315-3a1e-438f-907e-911752779c4e\\})|(\\{84d60f20-bff3-4e8b-8f04-03772be12178\\})|(\\{b56e4968-96b5-4682-b5a2-0811d22de46a\\})|(\\{e231b78c-557a-4f25-8ebe-0e18b8250cd9\\})|(\\{ed8f73c8-837a-4f33-99e0-a732cd64b760\\})|(\\{d1e681c5-4a4a-48b6-9abc-94a7fef3ced0\\})|(\\{494316a8-ee80-4b55-bc54-7e8588c91ee0\\})|(\\{87ca6636-e805-4c4f-a18f-9ea116d7c54d\\})|(\\{13cbb51f-509a-4a48-91b4-a9d83dedacc8\\})|(cryptogenius@geniusvibez\\.org)|(\\{f6c2064a-4977-4a4b-bc5a-352e00a1f458\\})|(\\{3ead5ed5-287c-4e2e-b62f-c657fefb7535\\})|(\\{6b8288d6-ae78-4593-8867-def79fe67a0f\\})|(\\{0ddda455-fadc-43d5-91d1-d1ed196ad5c7\\})|(\\{532c54ab-68f0-4e14-9f5f-382c6528e094\\})|(\\{7b990d1b-6515-4b8d-b0b1-400263c66155\\})|(\\{aadc7d87-c1b9-4399-9de5-d72ecaff0979\\})|(epiplex500suite@gmail\\.com)|(afp\\.testmaster@orbium\\.com)|(\\{1d1fe9b8-775e-4e9b-99a0-6adcbf1fbe10\\})|(\\{4aee20b8-7deb-42d6-8444-a7b51ab9eabb\\})|(\\{8790c850-f399-4b6b-8a43-85c10c5cdbe3\\})|(\\{55488e07-6e49-4d3b-aec4-ee2e520a5ed4\\})|(\\{1608692a-88e8-4717-a776-7be334de6767\\})|(\\{8f137ffe-8aa6-4358-a1a8-210fa87e7e22\\})|(\\{0866afdf-a997-453d-91a9-7094f617cd65\\})|(\\{b1ffc188-73f6-4e92-95d0-a579164fbc6c\\})|(\\{3d776d4c-44f4-4924-97f0-e47429e384d3\\})|(\\{9d2cadf8-68e0-43db-b763-390969d86976\\})|(\\{a0b5a5aa-423d-4115-962e-768136b0fd14\\})|(\\{0d625dd9-5d09-49ce-a811-5ed9ae5ef12f\\})|(\\{7273612b-2c57-4058-a09f-e576e8921829\\})|(\\{70529e5c-b73d-4585-9573-6e21bd6e64de\\})|(\\{e7626ba4-02a1-40b5-8186-b49da9d46c8a\\})|(\\{81425682-f86d-42a7-a46e-f31d80ea32ce\\})|(\\{5349a75b-df13-45ac-b4d5-1384d3446288\\})|(\\{2ea5ae79-9f90-4b7a-bdc6-5a9c4ddf7e59\\})|(\\{c496f3dc-56db-41a8-a6d9-d9225231528c\\})|(\\{dd13f534-b713-4d14-a55f-b2e9a4946b1b\\})|(\\{26f3910e-2cff-4cf6-94ee-69169f9cae9e\\})|(web\\.testmaster@orbium\\.com)|(Linguify@LinguaNext\\.net)|(jmendez\\.developer@gmail\\.com))$/","prefs":[],"schema":1576757626491,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96cd4440-6535-4d3a-a653-ae78abe6c312","last_modified":1576771657149},{"guid":"/^((\\{9c9cee47-6017-49ae-a8f5-36dacedfd9f5\\})|(inventoryspy@rebelsoftwarellc\\.com)|(\\{d5eb06b6-4f8c-4e98-9a46-180489db4bfb\\})|(\\{f539f4d9-5517-45a6-820e-91fd4d97ff24\\})|(\\{121701b4-d1f7-4328-80e7-34d7ce8d0d35\\})|(\\{af38d921-d151-4c46-a1f4-35f334bd5c2f\\})|(tvgitial@chmyway\\.com)|(\\{0b155b79-fa2d-453e-9a73-04b84a5f41db\\})|(\\{3833fb94-3b74-4ced-82d9-6e93cdcd073e\\})|(\\{9c3bbb7a-7c34-4073-9be9-241a3b10d521\\})|(\\{f06cfeac-c9d7-422d-b935-2e3cf7960a16\\})|(\\{9832fbba-ad56-41ad-9ef6-f91571fe0282\\})|(\\{887e6f78-084c-49da-9efe-410c6327dcfd\\})|(\\{48b31a31-0a1f-496c-8422-79991ec5f0d6\\})|(\\{32e7af7d-e621-4c6e-9fb5-ef31277a92b1\\})|(\\{29e731e0-47eb-40d3-a108-e3ba637ebd99\\})|(\\{265b0b17-caba-4eea-9822-fb669b603eee\\})|(\\{af6ecd70-5458-433c-a471-ca3221172ba2\\})|(\\{d9ac7759-d00e-4464-b110-362bcabf81d3\\})|(\\{4fb65352-528b-4f89-b66e-7fb6c4bd0a66\\})|(\\{588f4204-1a98-4ba0-b0d9-f48fe9a8c505\\})|(\\{5f553bb5-2139-4148-8cb6-a64f0664a148\\})|(\\{8d246dd2-72dc-4c84-aac2-c270a4beaae7\\})|(vk-downloader@addoncrop\\.com)|(privpow@gmail\\.com)|(home@bestools\\.net)|(themerapp11@gmail\\.com)|(privacysrched13@gmail\\.com)|(\\{1b9ad43b-33c7-49a1-91e3-de51de6392a7\\})|(\\{c92f123f-5300-4ca2-8e4b-2bdda8b60fd1\\})|(\\{5296e254-0b4e-4424-a044-9dbaa155e461\\})|(\\{ba633e33-46f7-402d-a98d-b6414baca4c8\\})|(\\{0e7f1d32-a30e-4be0-ad95-4433938d1aec\\})|(\\{1bc8ed9b-589a-45b8-90de-e372a98f7374\\})|(support@seogb\\.net)|(\\{9eeb49a7-2307-4eca-9ddc-946f29094497\\})|(\\{d8e7b5a5-6255-43b5-b371-8d76795705fd\\})|(\\{aa54cbfb-60a4-4aa0-a571-3594e718e9cf\\})|(\\{120023d0-20a4-4748-ad26-3de4a02452e7\\})|(\\{7472868d-16d8-45f8-bddd-6e32b5aac916\\})|(\\{177f7dc2-f9dc-4a79-bd4b-e6928bb86c82\\})|(\\{95313ed3-c9bf-46e0-baba-89e78b31709a\\})|(\\{54a9afac-8c97-4d7a-89a1-5f35858c2c5e\\})|(\\{914859e8-d803-4386-bd7b-10fc45586c3a\\})|(\\{8c965153-3a54-4b59-8b49-d89b1a46256b\\})|(\\{74eee9fc-da0e-4da1-8345-5a9b0be4012d\\})|(\\{6269bb9a-167f-4488-85b6-d3644bc5959e\\})|(\\{a0204e2a-ecf9-432c-a586-861172f77038\\})|(supportv8@seovpn\\.net)|(\\{52adc630-673b-44bb-9417-ab1ce1924465\\})|(version7@private\\.pitorr\\.com)|(version7\\.0@private\\.pitorr\\.com)|(version7\\.2@private\\.pitorr\\.com)|(version7\\.3@private\\.pitorr\\.com)|(\\{417a74a1-0d88-4240-8eab-53d1791f2bc0\\})|(\\{d7fe8027-22ef-4655-9c58-abcfb5b664fe\\})|(\\{9e666ac6-61f3-4e6f-bfe4-65162e35530e\\})|(\\{c6aed3ca-9da5-47fc-a828-9f5fa9aefe8c\\})|(\\{9f24dccf-d8b1-4316-90c9-3f516de2d2ef\\})|(\\{9d894603-93e5-4032-bc5e-3da1a50552d4\\})|(\\{00ca785e-6f23-4ca4-ab70-095a77a5de9e\\})|(\\{e233bed6-db39-40c4-b7f4-445e3239976c\\})|(\\{736a1e9c-8661-4f1c-9c93-396733caec96\\})|(\\{7ee265d9-0002-4f49-963b-93ccc9b0600d\\})|(addon@google\\.com)|(\\{a5bf6735-48b3-47bd-9258-e2d9dfe51467\\})|(\\{c6344599-1b07-444f-922b-7da1b12e086c\\})|(\\{e10cc63d-6a1d-4079-be47-ae0f6da9d821\\})|(\\{dc08bc05-97b7-4743-b433-fa5f85d3cf9f\\})|(\\{9eb8c864-3074-4469-8dbd-a0b212cbf8a5\\})|(\\{b43ab2ab-ca39-493c-b619-d93ddfc06440\\})|(\\{fab4cffc-c147-4bf0-8ba3-890609d47801\\})|(\\{45b8bc88-8c38-4447-9260-e0b2463cdcc6\\})|(\\{1938d918-a139-4881-8894-da9c8aff8ff0\\})|(\\{654b97fe-5daa-4314-a23c-2683ca5febb1\\})|(\\{e0b91972-8a76-4de0-bdaa-94418110552a\\})|(\\{8771d5d1-b560-41d0-8e0f-513238bc0153\\})|(\\{c49e5fd6-c3ea-47b6-85a8-d4d7cd4ac0d2\\})|(\\{7d7baa33-41c1-4001-b092-49a2d3ccdd16\\})|(\\{bb410263-f989-4bb3-a35d-fe96c07bc3be\\})|(\\{2e2d4e6a-e416-4e4c-9003-937e2c8016b1\\})|(\\{de458959-00f8-4f60-8d61-3fab157047e6\\})|(\\{9be4f97d-c6a1-42dd-a1c6-15adad9c2741\\})|(\\{59a3cf6c-584a-405a-b82d-c868f91d87e7\\})|(\\{7de1ff31-cf17-45b8-a55a-0e1608ac0627\\})|(\\{90375b4e-d778-442f-8113-212f3dbe9807\\})|(\\{8f3bf9d3-673a-421b-a326-9d8d6bcc4511\\})|(\\{8f250e7b-ea2a-4f86-ba1a-1bfef8ced945\\})|(\\{efca6935-6abb-4c28-acee-8f3ef1272640\\})|(\\{513bda76-dc3e-43f5-9f12-b9e85ac1006e\\})|(\\{9c5ea91f-d350-4521-b6d3-097d11fac75a\\})|(\\{302564ab-b478-4a60-a2a1-3aa79e3d4fa5\\})|(admin@fmt-tools\\.com)|(\\{efc8bdda-29d3-4212-8a61-6935da123d27\\})|(\\{5b3a9105-1845-4769-a64d-3c104fd07cae\\})|(\\{85b82e36-9da8-4c63-805f-5c6b994cd079\\})|(\\{d42fc5f0-9975-4955-887a-efb1d416762a\\})|(privacysecure@mybestprivacy\\.com)|(\\{205cd703-9bdc-49b6-a54b-b998de75a1fc\\})|(\\{8bcfc643-82ed-4cc0-89cb-3ed4bea284af\\})|(\\{1e2fbe56-fa52-4083-b128-91ecbdce727c\\})|(\\{b438893c-5d1d-48ee-87b0-6c9aa56d5689\\})|(\\{0f4c6635-5e84-44fd-afde-2755e2b920cf\\})|(\\{c6630e49-5bc9-4244-b70a-7a64db71228a\\}))$/","prefs":[],"schema":1576757655712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"463ffae2-9ecf-483a-957a-9e57ed056b63","last_modified":1576771657145},{"guid":"/^((youtube-mp3-converter@addoncrop\\.com)|(\\{3c8a6237-d40f-4aa0-bc66-cb6dc0ded2d3\\})|(info@example\\.com)|(youtube-downloader@addon\\.partners)|(\\{9e8611a8-c441-4d6b-881f-d1d62c4f90a4\\})|(adb@stellarwind-android\\.de)|(\\{5364615d-4d6c-45cb-aee6-2db1b76006f7\\})|(\\{1bedde37-78d6-43e4-b3ab-54336f293345\\})|(\\{7853bd47-92eb-4734-8371-dad645895f23\\})|(\\{a878339f-334e-433d-b0ac-9c799c8a6df3\\})|(\\{5dd737e5-c9f4-4b1b-86f1-5a3aefecbe26\\})|(\\{5165c342-3181-49d1-bf23-2be2d8d8cd5f\\})|(\\{e94887d3-558f-415f-83d3-4500d0604e4e\\})|(\\{80f26b45-b5db-45df-b92b-dfedfccfe2d1\\})|(\\{ebaf3af1-cd42-44b0-8a0a-5adc22dbb152\\})|(\\{bce1fb2f-1bcd-4a25-a9cd-29cc3fe21dc4\\})|(\\{fc528fa4-3528-4575-93a0-f07428654105\\})|(\\{432a4cf4-8f0c-4ab5-b3e8-e78c17d4b9f8\\})|(\\{260bf76c-b563-41d1-8a7c-0f669306a9f0\\})|(\\{7346a6e5-aec7-43d1-9135-a3b99f538bf3\\})|(\\{22af4413-6bc5-47f4-824e-ab4f15452d02\\})|(\\{8f02443a-3e5e-4160-8eda-04e104dcd804\\})|(\\{b2580f2b-bd01-4f3d-af4c-89b8bf0d2d92\\})|(\\{9e5da5b0-02d9-45f0-869b-05014c2e70cd\\})|(\\{df8a06b4-e785-46d7-87c9-a32ac5700696\\})|(\\{6eeccf3d-479f-47ab-8b9e-3f8e98d6b1de\\})|(\\{d9f5995c-0f9f-4f61-99d3-bde3676f2fa6\\})|(\\{d7f04f66-50b5-47eb-9394-597e3f712c2f\\})|(blablatina@mailnesia\\.com)|(blablatinaa@mailnesia\\.com)|(mykibetesting@gmail\\.com)|(\\{c115630b-bf15-46d5-a5ae-b053e8a99ba9\\})|(mykibetesting@ghghgh\\.com)|(mykibetesting@testmyki\\.com)|(mykibetesting46\\.2@mykitext\\.com)|(\\{9917e548-009a-42bf-bfc7-54206e036ec7\\})|(\\{46e67e2e-236c-4ab9-82ad-12b412fa787f\\})|(\\{a1676ab3-281f-40d6-a636-ce19f7f5f859\\})|(\\{d43dfd69-7730-441d-937d-c437a6c437e6\\})|(\\{1fd94b47-2148-4b97-a4b5-623168904694\\})|(\\{a41a3038-1cc8-49ca-8390-a82f913e1b03\\})|(\\{8f554d4a-54b3-48e8-b2b9-883d80627758\\})|(\\{5d61791a-b908-44a2-9066-8ecd2f70a5bf\\})|(\\{5eaafeba-bb8b-487d-8a52-45862d820f4d\\})|(\\{a3cce15f-afbb-4a03-9ca9-60981827a93e\\})|(\\{dd1031d0-40ba-49f5-97e5-82f371d93ee7\\})|(\\{9f9e1012-2b04-4a3f-a4f9-bb841bc7a1be\\})|(\\{f0c68322-bd46-4993-a526-7791f702f086\\})|(\\{98a9898c-f2aa-4833-bc38-b3625647e49f\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b4\\})|(\\{75a72d8c-b801-4487-b83d-a210f2fab6b5\\})|(\\{dbc0aede-945c-4a9a-bc92-585c0e2835fd\\})|(\\{42d93019-2dd9-49a4-b386-af5d13dbb14c\\})|(\\{fd15bd74-4a8e-43e3-a5a6-8f7bfc316bfe\\})|(\\{9b7226b7-8a21-4dad-9766-7c94a06d69ae\\})|(nancyseopro@gmail\\.com)|(\\{b3ef58d1-d4eb-4e48-9eba-d17600bd2ce8\\})|(\\{9b99b90a-52e3-4e7b-a1e0-5c905bf86ca6\\})|(\\{ed754bf5-b0d0-4ae4-b19b-f240e591c213\\})|(\\{2800be5f-6e20-4b21-9a3c-eb5e94205d9f\\})|(\\{4321d5f9-9a06-4972-9480-6d32d0e9ed12\\})|(\\{2774d25b-053e-44a1-b903-4e86b5bbd2f8\\})|(\\{e155420f-e615-44bc-8d7e-bc73bd0e7ecc\\})|(\\{4e4ef05f-a637-4c4e-bd22-5533e0060ef9\\})|(\\{306f60e4-ef19-4037-9c82-c2898ff17432\\})|(\\{b9374b95-4938-46fa-9507-ef877582c0d2\\})|(\\{dc395849-97bb-4456-9b79-c263a83b40e0\\})|(\\{04ae852b-bbb5-475f-8b25-3da4b15893ba\\})|(\\{91f96cf6-7bde-474b-a0b1-dbfc60db6bdb\\})|(\\{b8aac9a1-08b9-47be-97a4-7e4e0462bdfa\\})|(\\{6db30b4c-0e2d-47d0-abe6-66b778818b42\\})|(\\{4e0ea2d4-786c-4c20-9f1f-12c3734de966\\})|(\\{98ec3e35-c63a-43db-aeb7-050b350f3036\\})|(\\{a6acb773-94f9-4440-9e48-393f50989f5f\\})|(\\{363faa67-80da-4378-a20f-d32492eaab78\\})|(\\{76d55e31-5870-45f3-8862-a7006951cedc\\})|(\\{a2ff5043-dc7b-4c20-b924-135349641b95\\})|(\\{a6cc4862-ac6d-41e9-b208-cf5b280aa41c\\})|(\\{88bfe254-1837-426c-8f48-15235d69663d\\})|(\\{0cffb3be-d34c-4e38-88cc-9e4c68aa5456\\})|(\\{543b980f-e6a4-4077-b633-64ba72cae82a\\})|(\\{d2f2d8e1-7809-44fa-8309-1d41fc09db31\\})|(cht@cobraro\\.com)|(\\{40aac576-c1cc-4ef4-9ff4-90016bf5b54e\\})|(mykibetesting46\\.18@mykitext\\.com)|(\\{afb010de-7961-41d0-ad72-6c6beb05e34c\\})|(\\{25d0b02c-3c47-11e9-8f6b-9be053c51313\\})|(\\{8a146307-6862-474c-b113-8ecf993f1cfd\\})|(\\{4c0f9c72-a81f-49bb-a921-ae24cca16d70\\})|(\\{bd3b1f37-4e61-46cd-b521-925eb3ad3c25\\})|(\\{8d0b1c60-ebb7-4b7b-ae63-c40cf90e68df\\})|(\\{80690353-afb7-455f-b93b-78c7acc19962\\})|(\\{ca593a7a-bd77-4abf-8014-d1fa89006c64\\})|(\\{850be3a2-ca5f-47ad-838c-fe39b006e0d1\\})|(\\{b865704b-ca40-4939-81f1-89ef3b4eca3b\\})|(\\{7ecf61aa-e961-4704-88ac-4d8547ac35e8\\})|(\\{c63d3200-dce7-4090-b383-140a906f9aa2\\})|(\\{14d487f8-6eaa-4bae-9cb4-f604a8e4ac89\\})|(\\{86131ede-587a-4900-8c8c-4779570bff3b\\})|(\\{02229a36-d71c-4999-a319-7a072017dd5c\\})|(\\{e31ad00a-45d1-4397-8b11-9eb0e160787f\\})|(\\{1491c081-4e0a-483f-bdc4-96f5a248438c\\}))$/","prefs":[],"schema":1576757686245,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e2dd31e1-4dfd-4dcc-ad4b-6d9ca4b7ed20","last_modified":1576771657140},{"guid":"/^((\\{df59cc82-3d49-4d2c-8069-70a7d71d387a\\})|(\\{ef78ae03-b232-46c0-8715-d562db1ace23\\})|(\\{4d12d613-99d9-4160-ae6c-5153e5ab0f3c\\})|(\\{41efa652-3fca-4f95-b828-8ed1fba66a84\\})|(\\{4c52e311-8d5b-4a10-95bc-b1b1e029c8d5\\})|(\\{cd627ef1-1059-4ed9-9217-1971806a9ed3\\})|(\\{c01e7fb9-2a24-4cf0-8562-896d53cd5a59\\})|(\\{83d91178-0a1e-4270-a901-b8e83aec3d0b\\})|(blabla@reallyimportantthing\\.com)|(\\{be2309ea-6113-4a99-bd3b-3b88c95cd41d\\})|(\\{02a5f8bb-9ffb-43c3-86d6-072d7316ff6d\\})|(\\{7e874309-fbf3-463b-8690-6ead9efccea0\\})|(\\{7420132f-055f-4f37-a962-3bf9ce42d798\\})|(\\{22c0c5ea-c554-498d-8a66-4c5b4be2f5e8\\})|(\\{ff95833e-5a0a-43cc-910a-e2859bc99ade\\})|(\\{92495a3e-062b-40e7-91e3-6b415c694c57\\})|(mykibetesting47\\.1@mykitext\\.com)|(\\{96cde09b-2d70-41ee-acf6-548728846d48\\})|(mykibetesting47\\.1000@mykitext\\.com)|(\\{98f556db-837c-489e-9c45-a06a6997492c\\})|(\\{bb19d814-d035-4f5d-b291-9b26e4a7fd37\\})|(\\{56a1e8d2-312d-4222-aca5-eee58e0f1234\\})|(\\{9cc56d18-c8fb-436a-861a-128cf2fc580c\\})|(\\{27eebcd1-7ef4-4de3-9d5e-db9e2348c990\\})|(\\{71d3ba6e-e461-44fa-8f27-02c6dbd9b653\\})|(connect@seovpn\\.net)|(\\{859bf655-0266-4f21-9c52-3bd156896259\\})|(\\{adc5c6d8-ac87-4b5f-b885-1adfd00265a7\\})|(\\{d826e099-f797-401f-b363-c03f29a8f9b7\\})|(\\{5621e792-bba7-4e66-a63b-56a9e145c089\\})|(\\{c3e4070e-7845-41fd-8996-8817bbc28790\\})|(\\{eb256992-3498-4262-9c7e-ac82f93aeaca\\})|(\\{da9d1606-dfde-429c-bb6a-63ebe5f8412c\\})|(\\{41e29257-1089-42c8-9d59-add5a0003ffa\\})|(seovpnv5@seovpn\\.net)|(direct-apk-s@eladkarako\\.com)|(\\{376063b4-f6b8-43e9-928f-437ad0ec5333\\})|(\\{b78bf75a-3cea-436b-b081-c9857f295618\\})|(\\{9b8ec882-b5dc-4df2-b9eb-097ba4dcb4b0\\})|(\\{8c0f6ff5-8ea2-4da0-be7b-e588baa02a03\\})|(\\{88295bde-3fc2-4bf9-8090-872d223f2f92\\})|(\\{67582ce8-8c5e-4207-9694-5b0ecc77887b\\})|(\\{db443bc5-4f91-4c82-a14a-298575ff6aba\\})|(\\{d7709ac2-bcde-4d15-a1a7-c459fe592d8e\\})|(\\{40fbe322-ca79-4472-9ac9-0d493f2623da\\})|(\\{77ca86a6-2042-4519-9cd5-4f5fd036d0eb\\})|(youtube-video-downloader@addoncrop\\.com)|(youtube-video-downloader-ff@addoncrop\\.com)|(\\{ed48a832-c064-4d79-bf2e-3c5b21242b3c\\})|(\\{1ce93624-96e6-449d-b038-3380db21cc48\\})|(\\{8957639f-8577-4df9-a1a7-f6d5a9fc9fcd\\})|(\\{c07d8367-6c2d-4a7d-a9ab-207b3104359f\\})|(\\{c4d3f949-60fd-45d5-9cc0-2501319bb60c\\})|(\\{b23bc17b-9fba-4a49-9afe-a1e9cd49c73b\\})|(\\{9f814c7c-0161-4cd4-9d19-50e203f5160c\\})|(\\{0a04ea15-85b4-40ac-a1d1-a6fb5967fb3b\\})|(\\{7bd5a0e9-e8c0-4e64-bda5-7b5310629777\\})|(unlazy@eladkarako\\.com)|(unsecure@eladkarako\\.com)|(xda@eladkarako\\.com)|(direct-filehippo@eladkarako\\.com)|(real-url@eladkarako\\.com)|(\\{63fcde93-baf6-40b5-892c-29cc34365b57\\})|(\\{2913327e-bd0b-4962-adce-2f44407fb521\\})|(\\{88f2e8f9-a7e1-4d68-901d-e5a9c805f4fa\\})|(\\{fd4fcb6a-cad2-43ab-b1c5-efd4d2102de8\\})|(youtube-mp3-converter-ff@addoncrop\\.com)|(\\{0a90b652-0de6-421a-bfee-1d2c5c3ee8fe\\})|(dropeextool@gmail\\.com)|(add_archive@ext\\.xpi)|(\\{47aa471f-3cf1-4a22-9c99-ab5baf326a60\\})|(\\{ac01f6a8-7c30-450b-9979-98d0c7795e11\\})|(\\{2c09761e-2c89-4537-b335-2bd30a7136c2\\})|(\\{c55ddee5-baab-4c90-9948-ca47033a82ce\\})|(\\{5cdb4845-56a8-45df-936b-de8279f2587d\\})|(\\{ea68dd52-2470-4d7c-b563-9a4c6d0e7eab\\})|(\\{01d33686-cab1-4f3b-b2ad-83bc1c35c60a\\})|(\\{fcb61a95-e861-4cf1-801b-f91c75c4714a\\})|(mg3a2mzdsug6fou4k8yk@mg3a2mzdsug6fou4k8yk\\.com)|(wh70nimqtlpwt951i12a@wh70nimqtlpwt951i12a\\.com)|(\\{b64109f0-5d2a-4c86-a38c-886589cb2703\\})|(legacy@context_search\\.com)|(\\{7b49d8bd-1e29-4887-9165-a272f553a154\\})|(\\{a49d6fa5-1967-43ed-b8bd-586f206326cd\\})|(\\{8b14f730-34fa-41e7-9590-d44df583a57f\\})|(\\{01dda21f-3b94-4297-b302-d92535b2e880\\})|(\\{6a33fb2c-3d3a-401f-be54-342ef4d57d1f\\})|(\\{887a4a9a-63ed-4af8-b82b-b68e9c23d39b\\})|(\\{6cae6de5-ff67-4682-a72b-39a1747fc682\\})|(\\{c5b5ac10-8592-4ee9-ad7b-003bb9706f87\\})|(\\{2fb3dc77-de0c-4e34-be3b-13a92bffe898\\})|(\\{82a92837-91de-4282-95d2-bda6d4ac682f\\})|(\\{dae5d3cf-42ba-40ad-85d9-482e25d4682c\\})|(\\{2328a4ad-9d5c-47fa-b580-c7d488bd7a7a\\})|(\\{deb5ba3b-3cf9-4333-99e3-ae2651a5297d\\})|(gespindola@unisuam\\.edu\\.br)|(\\{4518dbc6-fc51-4292-8d85-6eba66959dcb\\})|(\\{7864e12a-8628-415e-8ae8-5ac25edaa420\\})|(\\{b56e7db0-5504-4dd2-8c21-7fb645adae38\\})|(\\{c78ac5a8-0005-4cfb-8a01-5d116a225377\\})|(\\{468301ed-b30f-44f9-85aa-d5ff4c840008\\})|(\\{ae45b0a5-a02e-41df-8a2e-f745d7a7ede3\\})|(\\{f42b032c-3017-44d5-99a1-129524d02494\\}))$/","prefs":[],"schema":1576757713908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f3e4d6d-9b1c-4fe1-940a-2871943bac88","last_modified":1576771657136},{"guid":"/^((\\{7e81d973-d606-4f4b-a61f-9c37612c3947\\})|(\\{651d950b-9db7-445f-8263-2dd18265ed3b\\})|(\\{d408b96a-203d-462a-9577-84afb08aa951\\})|(\\{e1fc8acf-65d6-48a2-89d9-410a32bd86da\\})|(\\{1e9302af-a3e1-4c7c-8416-f814dd796cb9\\})|(\\{c4aba9b0-df06-4fc5-8e64-37f99df5e9e9\\})|(\\{24399e9e-50ef-47c3-a728-ebf3af91a0c6\\})|(\\{bdf866a5-ebdd-4e7d-b624-49b53be98a4b\\})|(\\{9ab09f29-f294-4bdd-a58a-c3abea54f032\\})|(\\{b678ee0d-0e1f-433d-8ce8-93e1b51b8834\\})|(\\{6ed0906f-7926-4fc2-ab60-1577631641b2\\})|(\\{0bed1847-54e3-40ac-9cee-0ffd6e4acf1f\\})|(\\{09041dc2-0caa-4955-bf87-de874a0c6b7b\\})|(\\{035ff918-be13-4906-bba3-25153c30b8c4\\})|(\\{e81cbba6-39d5-4f33-a6be-3b99545b54b1\\})|(\\{67d8820b-3078-4835-ab7a-11befb521d33\\})|(\\{c5ad3a58-824c-4db4-8f2c-33b91565417f\\})|(\\{6e289bc1-ab94-44be-adf7-deb1a85cf809\\})|(\\{f6a3d54b-bf6f-4878-881e-a521065412c4\\})|(latest-extension@surviv\\.io)|(\\{3ee8d899-be15-45e4-8c09-a1c10febfb4d\\})|(\\{7ccf5eca-d275-4967-939a-7b9b91d9e0f2\\})|(\\{cd8542c3-3c8e-4fa1-8463-4c5ea7aa25ce\\})|(\\{2994abd2-02a5-4c66-9fd2-38ad8d911324\\})|(\\{10a69518-499c-4339-a733-8ac27166a400\\})|(apzsqkoq0oxjal69l9zr@apzsqkoq0oxjal69l9zr\\.com)|(mbanzzhnky54hoe6jq62@mbanzzhnky54hoe6jq62\\.com)|(\\{ce926acf-d6ab-48b0-8e5d-82257de14011\\})|(\\{c42394d0-1c76-4e5e-8a94-f7c4a2de2ada\\})|(7eylx2qcpshoiehzcl2y@7eylx2qcpshoiehzcl2y\\.com))$/","prefs":[],"schema":1576757777185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602022","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8f82683f-a1c2-4f61-bf9b-8f279d35f746","last_modified":1576771657132},{"guid":"/^((Astro_Connect_BHZNbNOGmL@www\\.astro-connect\\.com)|(Astro_Connect_HRMdSrojBR@www\\.astro-connect\\.com)|(Astro_Connect_lAOPFWMnqc@www\\.astro-connect\\.com)|(Astro_Connect_vMYMzqvERv@www\\.astro-connect\\.com)|(Astro_Daily_Online_1090c71e5da3cd9ab2d6af4985b43f5c@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_b82a3c2703d37e513b428067a34655d8@www\\.dailyastrotab\\.com)|(Astro_Daily_Online_clone_hqNzpeWZrm@www\\.astrodailyonline\\.com)|(Astro_Daily_Online_GzIzTViMnE@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_a7f59cbf31536249d41b97278115b17a@www\\.astrodailyonline\\.com)|(AstroDailyOnline\\.com_VqZjYRsphH@www\\.astrodailyonline\\.com)|(Bible_Quotes_97910bef6e96a7d0569f5fb44b2c607c@www\\.bible-quote\\.co)|(Bible_Quotes_clone_9699f1b771e162467f078c076eb9b695@www\\.bible-quote\\.co)|(Bible_Quotes_clone_wYibuualSr@www\\.bible-quote\\.co)|(Bible_Quotes_PHMyuAzCPa@www\\.bible-quote\\.co)|(blackfridaystoresco@www\\.blackfridaystores\\.co)|(Browse_Manuals_3ff31012f87f9a4c01e1ef723f48eff1@www\\.browsemanuals\\.co)|(Browse_Manuals_ca51c107572ab179fc1e8d4b652b19e1@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_2dbeb0fd48d84ff3a5d3e3a7b5fc3756@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_biPZDTWfln@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_ksNBKBSmge@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_lcMJgmivkD@www\\.browsemanuals\\.co)|(Browse_Manuals_clone_UaWIZDqLBJ@www\\.browsemanuals\\.co)|(Calculate_Fast_uWtHrQKgWv@www\\.nowcalculatefast\\.com)|(cheapflightfaresco@www\\.cheapflightfares\\.co)|(Check_Astro_Today_wkptBasvVf@www\\.checkastrotoday\\.com)|(Check_Astro_Today_YgMcUMJFVL@www\\.checkastrotoday\\.com)|(Check_Astrology_GGZGReDTnd@www\\.checkastrology\\.co)|(Check_Directions_RmiiKOUYTf@www\\.checkdirection\\.com)|(Check_Mails_clone_tdpeulgItk@www\\.check-mail\\.co)|(Check_Mails_iLVZDNXtnY@www\\.checkmailsnow\\.link)|(Check_Mails_ITnrNsNpcj@www\\.checkmailsnow\\.today)|(Check_Mails_Now_clone_oOzxmNgfQn@www\\.checkmailsnow\\.net)|(Check_Mails_Now_clone_vVWZzkqahk@www\\.checkmailsnow\\.net)|(Check_Mails_Now_ePyetjMzel@www\\.checkmailsnow\\.link)|(Check_Mails_Now_IfFzRcCuJa@www\\.checkmailsnow\\.online)|(Check_Mails_Now_OqRkgMLHGo@www\\.checkmailsnow\\.live)|(Check_Mails_Now_pHoBMgvLtK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_QMsZiFhjjH@www\\.checkmailsnow\\.online)|(Check_Mails_Now_qOSRXKCsHK@www\\.checkmailsnow\\.net)|(Check_Mails_Now_vnjdpXGSWk@www\\.checkmailsnow\\.net)|(Check_Mails_vNOoNISpGM@www\\.check-mail\\.co)|(Check_Maps_3ec1ffc98971e67fa854369f9e3486d0@www\\.check-maps\\.co)|(Check_Maps_BezZcNfeab@www\\.check-maps\\.link)|(Check_Maps_bKaiUcBTpN@www\\.check-maps\\.net)|(Check_Maps_clone_RUjCUUeRwF@www\\.checkmaps\\.co)|(Check_Maps_KzXAqTbRZi@www\\.check-maps\\.co)|(Check_Maps_ogQkeJhGuf@www\\.checkmaps\\.net)|(Check_Maps_SwGvtYCSWM@www\\.check-maps\\.org)|(Check_Maps_uYfjFOesyI@www\\.check-maps\\.org)|(Check_My_Mails_iAClnrnvyj@www\\.checkmymails\\.online)|(Check_My_Mails_TYlXbVPRXn@www\\.checkmymails\\.info)|(Check_My_Mails_XvyJVrZWQX@www\\.checkmymails\\.info)|(Check_My_Mails_ZAVfjZCgnv@www\\.checkmymails\\.co)|(Check_My_Speed_Now_OsGaqlODan@www\\.checkmyspeednow\\.com)|(Check_My_Speed_PQiWezZbqs@www\\.checkmyspeed\\.co)|(Check_My_Speed_qvklQhzugJ@www\\.checkmyspeed\\.co)|(Check_Net_Speed_aAaAYSEawi@www\\.checknetspeed\\.online)|(Check_Net_Speed_EKnEHmaiYm@www\\.checknet-speed\\.today)|(Check_Net_Speed_IcfzRgdvIx@www\\.checknet-speed\\.today)|(Check_Net_Speed_rqJpoOAXqE@www\\.checknet-speed\\.today)|(Check_Net_Speed_SoVZYFExRY@www\\.checknetspeed\\.today)|(Check_Net_Speed_sXCrVEDGiO@www\\.checknet-speed\\.today)|(Check_Net_Speed_VQGJrJvlIm@www\\.checknet-speed\\.today)|(Check_Net_Speed_wCexanRKNz@www\\.checknetspeed\\.link)|(Check_Net_Speed_yTZgqCpFPi@www\\.checknet-speed\\.today)|(Check_Net_Speed_zCCNoLFHOF@www\\.checknetspeed\\.online)|(Check_News_clone_qPYbwwKpgF@www\\.checknews\\.co)|(Check_News_dGPwUXsQpF@www\\.checknews\\.co)|(Check_Speed_Test_KohJtFpgLB@www\\.checkspeedtest\\.co)|(Check_Speed_Test_XcYMLbMdlh@www\\.checkspeedtest\\.co)|(Check_Weather_clone_FJgKgEEkzT@www\\.checkweather\\.co)|(Check_Weather_clone_TwXCcjNBdE@www\\.checkweather\\.co)|(Check_Weather_Daily_65ec7723f6fbbe7786d60bd4e2643b1c@www\\.checkweatherdaily\\.com)|(Check_Weather_Daily_YxdeQsIzIP@www\\.checkweatherdaily\\.com))$/","prefs":[],"schema":1576757846784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff5d3b75-f26c-47cd-85df-32c193a8d002","last_modified":1576771657128},{"guid":"/^((Check_Weather_Details_26e944ef07a6d60d7e6e109df96aadc6@www\\.checkweatherdetails\\.co)|(Check_Weather_NkuDUpBOfy@www\\.checkweathertoday\\.com)|(Check_Weather_Today_1b92f68f44010297e79e167abdbbad90@www\\.checkweathertoday\\.com)|(Check_Weather_Today_2b5b41fcbe35242dced42efd82346b62@www\\.checkweathertoday\\.com)|(Check_Weather_Today_37f90d6081f0f87dde0eca340268dd06@www\\.checkweathertoday\\.com)|(Check_Weather_Today_421f2bbc2e93713f42200c4cf4184b2f@www\\.checkweathertoday\\.com)|(Check_Weather_Today_647dda58dab18a066b5edcd1bf82f244@www\\.checkweathertoday\\.com)|(Check_Weather_Today_8d106128d380304fbf7cf760284ed189@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a6606d84c174672bdc97a40ae26a7329@www\\.checkweathertoday\\.com)|(Check_Weather_Today_a7ec7b0d21c0b719949374759fa27f9e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_AGSeXIfuyC@www\\.checkweathertoday\\.com)|(Check_Weather_Today_c72d09cea0b53ffdd1a496e376b22696@www\\.checkweathertoday\\.com)|(Check_Weather_Today_cbc523bdd189c28af1505f104443a1cf@www\\.checkweathertoday\\.com)|(Check_Weather_Today_e448585b8ce80f90b04ad34b57c00d6e@www\\.checkweathertoday\\.com)|(Check_Weather_Today_ed0f6099cd2a8e05500657b43f897afc@www\\.checkweathertoday\\.com)|(Check_Weather_Today_EppkRAhhSW@www\\.checkweathertoday\\.com)|(Check_Weather_Today_f06201395c0dc5e1aa9fd68e2059dc18@www\\.checkweathertoday\\.com)|(Check_Weather_Today_fd6b11d8d8cad6bb654cf46a0e100cbe@www\\.checkweathertoday\\.com)|(Check_Weather_Today_FdVgvyMTJo@www\\.checkweathertoday\\.com)|(Check_Weather_Today_leAPNcsALh@www\\.checkweathertoday\\.com)|(Check_Weather_Today_LFHBoYhhIu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_MJoPqcUdAA@www\\.checkweathertoday\\.com)|(Check_Weather_Today_neiEtvLsDn@www\\.checkweathertoday\\.com)|(Check_Weather_Today_NvAaeiHaWs@www\\.checkweathertoday\\.com)|(Check_Weather_Today_OGjNKxAeXE@www\\.checkweathertoday\\.com)|(Check_Weather_Today_uABqfeATcz@www\\.checkweathertoday\\.com)|(Check_Weather_Today_WKqJGOJnJg@www\\.checkweathertoday\\.com)|(Check_Weather_Today_xCOMPlhuXu@www\\.checkweathertoday\\.com)|(Check_Weather_Today_XmOwlHQNSl@www\\.checkweathertoday\\.com)|(Check_Weather_wktudKPpvh@www\\.checkweather\\.co)|(Check_Your_Mail_5697289aed4cf7b184d93e5c53117e07@www\\.check-yourmail\\.co)|(Check_Your_Mail_BZSHAsKTzJ@www\\.check-yourmail\\.co)|(CheckMailPro\\.net_CheZLENbVx@checkmailpro\\.net)|(checkmaps@www\\.check-maps\\.co)|(CheckNetSpeed\\.co_tkZoSRvsPg@www\\.checknetspeed\\.co)|(checknetspeedco@www\\.checknetspeed\\.co)|(Convert_Doc_Online_ptdllbDbTd@www\\.convertdoconline\\.com)|(Convert_File_JHjKeEFAkZ@www\\.convert-file\\.net)|(Convert_File_ocNpurmujk@www\\.myfileconverter\\.org)|(Convert_File_Online_JfGXnualjV@www\\.convertfileonline\\.net)|(Convert_Files_Now_8390db80d295eac08ca91cc1687ebf6d@www\\.convertfilesnow\\.co)|(Convert_Files_Now_afb77fba2ab7b055f10896e538ebd2f6@www\\.convertfilesnow\\.online)|(Convert_Files_Now_fzusJnJyIU@www\\.convertfilesnow\\.co)|(Convert_Files_Now_YEHBPCVZfb@www\\.convertfilesnow\\.online)|(Convert_Files_Online_cf2d8484b67f12d038789a618bae5465@www\\.convertfilesonline\\.co)|(Convert_Files_Online_RptGXHLRjE@www\\.convertfilesonline\\.co)|(Convert_My_Doc_771b3d45ecf0ab980ab0dfdcb9dc1c16@www\\.convertmydoconline\\.com)|(Convert_My_Doc_ofLnqzQpvZ@www\\.convertmydoconline\\.com)|(Convert_My_Document_ynCvryXblL@www\\.convertmypdf\\.online)|(Convert_My_File_0e081da9309e2ee8cbe6e5e1ca3373d1@www\\.convertmyfile\\.co)|(Convert_My_File_2451d924787cf4b696596f09fde42c2f@www\\.convertmyfiles\\.net)|(Convert_My_File_35bbde2206c3bb498f5033610ab82af6@disable\\.convertthefiles\\.online)|(Convert_My_File_68884222b56f8d972093a20f7d5fcf94@www\\.convertmyfile\\.co)|(Convert_My_File_e4a4b99e91c46c64d75d2795ac8e8d58@www\\.convertthefiles\\.online)|(Convert_My_File_GHurKBBhRg@www\\.convertmyfile\\.co)|(Convert_My_File_HlOKyXsynN@www\\.convertmyfile\\.co)|(Convert_My_File_sdaXbdSqCR@www\\.convertmyfiles\\.net)|(Convert_My_File_SiQYEMQoEO@www\\.convertthefiles\\.online)|(Convert_My_File_SJjGzfwuEU@www\\.convertthefiles\\.online)|(Convert_My_File_SzhPQAPUZF@www\\.convertmyfile\\.co)|(Convert_My_File_zOqNatevtM@www\\.convertmyfiles\\.net)|(Convert_My_Files_41f090cd741517aacdcc2c939b5ba94e@disable\\.convertmyfiles\\.net)|(Convert_My_Files_AcwjJWzydY@www\\.convertmyfiles\\.co))$/","prefs":[],"schema":1576757889686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"92d2dcba-9f62-4b16-8472-843bc53efef5","last_modified":1576771657124},{"guid":"/^((Convert_My_Files_clone_AtaaUykZUt@www\\.convertthefiles\\.co)|(Convert_My_Files_clone_iipeyamXvF@www\\.convert-myfiles\\.link)|(Convert_My_Files_GcaMuSvchr@www\\.convertmyfiles\\.co)|(Convert_My_Files_ITTiqkJdem@www\\.convertmyfiles\\.link)|(Convert_My_Files_mOqWpDqFfS@www\\.convertmy-files\\.link)|(Convert_My_Files_ObjwXXGRmQ@www\\.convertmyfiles\\.net)|(Convert_My_Files_OdEReOXPeW@www\\.convertmyfiles\\.link)|(Convert_My_Files_WdZEfGNUyl@www\\.convertmyfiles\\.link)|(Convert_My_Files_ZSVwsGAvMB@www\\.convert-myfiles\\.link)|(Convert_The_File_ajAXskmxxC@www\\.convertthefile\\.co)|(Convert_The_File_decdQgcxcJ@www\\.convertthefile\\.co)|(Convert_The_File_lfLaRLbLCX@www\\.convertthefile\\.online)|(Convert_The_File_pVtEvdXWNp@www\\.convertthefile\\.co)|(Convert_The_File_YeFOCclGsc@www\\.convertthefile\\.co)|(Convert_The_File_yfsuYhYdaU@www\\.convertthefile\\.net)|(Convert_The_PDF_clone_52933220d40bf58153ba067b1c9c2a0c@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_929829a88637d12dbf08fd4f782a93b8@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_WZNDVMgflh@www\\.convertthepdf\\.com)|(Convert_The_PDF_clone_xmrWNxzVTQ@www\\.convertthepdf\\.com)|(Convert_The_PDF_e8cd3270f4b0eec8bd7ec39dfe2b411c@www\\.convertthepdf\\.com)|(Convert_Your_Files_546ea793afdb11f0c3cb3866dcb02379@www\\.convertyourfiles\\.co)|(convertfilestopdfcom@www\\.convertfilestopdf\\.com)|(convertmypdfco@www\\.convertmypdf\\.co)|(convertmypdfonline@www\\.convertmypdf\\.online)|(convertthepdfco@www\\.convertthepdf\\.co)|(convertthepdfcom@www\\.convertthepdf\\.com)|(Cook_With_Me_oYyEsUWTmq@www\\.cookwithme\\.co)|(Coupon_Club_App_20ef9a3e126b1c339a97a60672528026@www\\.couponclubapp\\.co)|(Coupon_Club_App_295813467b3bbbd03ed2574a3a379041@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_dMsjQwVamC@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_pahxCWSfWG@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_tLIovhcRov@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_UKQIyoDcSk@www\\.couponclubapp\\.co)|(Coupon_Club_App_clone_wgpiIAHAQx@www\\.couponclubapp\\.co)|(Coupon_Club_App_imfeKPFBRv@www\\.couponclubapp\\.co)|(Coupon_Club_App_vqwFoUyfpL@www\\.couponclubapp\\.co)|(Coupon_Daily_DGaEVQJCVN@www\\.coupondaily\\.today)|(Coupon_Dealer_rRkzTRGEcA@www\\.coupondealer\\.co)|(Coupon_Finder_Hub_8f0b12e405b7568785bcc785d6be30d2@www\\.couponfinderhub\\.com)|(Coupon_Saver_Plus_ffb1e922e2994e938b8f9aeff598c90d@www\\.couponsaverplus\\.co)|(Coupon_Saver_Plus_GTTzegkxqL@www\\.couponsaverplus\\.co)|(Coupon_Store_MlfSWWimyu@www\\.mycouponstore\\.co)|(Coupon_Store_Search_clone_AbsQujloBm@www\\.thecouponstore\\.co)|(Coupons_Flash_clone_TCfVLxCpbB@www\\.couponsflash\\.co)|(Coupons_Flash_fYMZkaoiDb@www\\.couponsflash\\.co)|(Coupons_Flash_WRjXiQAOwJ@www\\.couponsflash\\.co)|(Coupons_Magic_AuVOPUiczY@www\\.couponsmagic\\.co)|(Coupons_Magic_MaDWggNxen@www\\.couponsmagic\\.co)|(Coupons_Magic_ZebFYzkzoN@www\\.couponsmagic\\.co)|(Coupons_Tab_9a56fd9df10d162f000ef7dac2689e8e@www\\.couponstab\\.co)|(Coupons_Tab_sFSnaAFdDP@www\\.couponstab\\.co)|(Coupons_Test_uyywuEAPjT@www\\.couponstab\\.co)|(couponstore@www\\.coupon-store\\.co)|(CutePuppyWallapers\\.com_nicLwcUsfw@www\\.cutepuppywallapers\\.com)|(Daily_Astrology_fPoifgshwY@www\\.daily-astrology\\.online)|(Daily_Astrology_WPGvllFIRz@www\\.my-dailyastrology\\.net)|(Daily_Coupon_Finder_XefkJELubc@www\\.dailycouponfinder\\.co)|(Daily_Coupon_Store_cdowGuTgIr@dailycouponstore\\.co)|(Daily_Coupons_Tab_2c96becddbca0072a93db91266fbfefa@www\\.recipeboardplus\\.com)|(Daily_Coupons_Tab_HRcyzwBTWg@www\\.dailycouponstab\\.com)|(Daily_Deals_Club_yIvuSLfnXr@www\\.dailydealsclub\\.co)|(Daily_Easy_Recipe_OlMvwdldaK@www\\.dailyeasyrecipe\\.com)|(Daily_Easy_Search_95c6b38eb0f04a21212c678a43291d12@www\\.dailyeasysearch\\.com)|(Daily_Easy_Search_MVXtvNQzSj@dailyeasysearch\\.com)|(Daily_File_Converter_23db4a874fc066754c187eef894ccbe7@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_25b0c49fa35ba08d5b33edd7b48f2c92@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_9d4c9a6f7a5c796c84a594619c1e6993@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_b4b0ea08aa61314c75baffd0246b9bcf@www\\.dailyfileconverter\\.com)|(Daily_File_Converter_clone_RDUYhKAKFi@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_clone_yuTWwUVfoL@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_cVmGYeldAg@www\\.dailyfileconverter\\.co))$/","prefs":[],"schema":1576757965088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6944f445-4df8-4331-93da-1b32fc130849","last_modified":1576771657120},{"guid":"/^((Daily_File_Converter_ooPlASGwFM@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_QMxMSpDXIk@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_UufmFacjfR@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_vaLEkEAYJg@www\\.dailyfileconverter\\.co)|(Daily_File_Converter_VhHvpeSnpU@www\\.dailyfileconverter\\.com)|(Daily_Game_Search_EaLACFoFKS@www\\.daily-gamesearch\\.today)|(Daily_Game_Search_muvQxhbZNu@www\\.dailygamesearch\\.today)|(Daily_Game_Search_VSZsYHVLcK@www\\.dailygame-search\\.today)|(Daily_Game_Search_XpyakjSRnr@www\\.dailygamesearch\\.co)|(Daily_Games_40e88a4d6ecfd9f9af84e1e6c7d76ffe@www\\.gamesdaily\\.online)|(Daily_Games_53113db02f9dd623b086f331ade6d2a6@www\\.game-quest\\.co)|(Daily_Games_a3083ae69e261df3b7d43f5282b250d0@www\\.daily-games\\.co)|(Daily_Games_adebc8294b5d311f8d3b5abd659e09f6@disable\\.daily-games\\.co)|(Daily_Games_b0819ccb9f64203af68bb05e00f36c2a@www\\.dailygame\\.online)|(Daily_Games_BhJRTCwnnH@www\\.game-quest\\.co)|(Daily_Games_BYlaCwrbCa@www\\.dailygame\\.online)|(Daily_Games_c342718e3fb89df8a20b77f635ea0e0f@www\\.dailygame\\.online)|(Daily_Games_caf0a82b928c12c5d67d2e0d142acbcc@www\\.daily-games\\.online)|(Daily_Games_clone_MHxxZxsjgz@www\\.gamesdaily\\.co)|(Daily_Games_d859afcc6f811f0938e06c8b75ac15fc@www\\.gamesdaily\\.online)|(Daily_Games_e6da5a8f129fc23530fc715fd2f7b993@www\\.daily-games\\.today)|(Daily_Games_e858f8f836f17ab5e1c3b269639bc434@www\\.daily-games\\.co)|(Daily_Games_FHAIlDwdZF@www\\.gamesdaily\\.co)|(Daily_Games_IgqcabXnnH@www\\.dailygame\\.online)|(Daily_Games_NOgqDldYjE@www\\.daily-games\\.co)|(Daily_Games_qEgzrEJBZi@www\\.daily-games\\.co)|(Daily_Games_qFMKBgNfOc@www\\.gamesdaily\\.online)|(Daily_Games_vfGCbwKDjq@www\\.daily-games\\.online)|(Daily_Games_VoOHRAgAxg@www\\.daily-games\\.today)|(Daily_Games_vwRTUFvSbP@www\\.gamesdaily\\.online)|(Daily_Games_YoUYAafVuL@www\\.daily-games\\.co)|(Daily_Horoscope_Finder_f4f7f24d489880fa4779c5a4aff5278d@www\\.dailyhoroscopefinder\\.com)|(Daily_Local_Weather_RTvDyyEuxy@www\\.dailylocalweather\\.net)|(Daily_Mail_Tab_AMkImujKsG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_BWhcKvnbJG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_clone_jkCRhwZjtG@www\\.dailymailtab\\.com)|(Daily_Mail_Tab_xMqjhKMBPX@www\\.dailymailtab\\.com)|(Daily_Net_Speed_gcVjCfMtcE@www\\.dailynetspeed\\.com)|(Daily_News_Reports_707e3c94519dc4f338e25415097fc409@disable\\.dailynewsreports\\.co)|(Daily_News_Reports_bc4cc8745c5c9113add6bbcc7a4e891d@www\\.dailynewsreports\\.co)|(Daily_News_Reports_MgfPHeboNM@www\\.dailynewsreports\\.co)|(Daily_News_Reports_RhfPUMZyKi@www\\.dailynewsreports\\.co)|(Daily_Package_Tracker_qJQSJblDIk@www\\.dailypackagetracker\\.com)|(Daily_PDF_Converter_cAlFsFtCmX@www\\.dailypdfconverter\\.com)|(Daily_Radio_Hub_4b6408c6028360c91e55070e8a8b6c07@www\\.dailyradiohub\\.com)|(Daily_Radio_Hub_CEgdHfrHfk@www\\.dailyradiohub\\.com)|(Daily_Recipe_Finder_LpHSZIWYdz@www\\.dailyrecipefinder\\.com)|(Daily_Recipe_Ideas_clone_xqrPqfTBif@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Ideas_dyhmXRtGGY@www\\.dailyrecipeideas\\.co)|(Daily_Recipe_Now_IXRimkpfYA@www\\.dailyrecipenow\\.com)|(Daily_Recipe_Search_wHQTXcltvc@www\\.dailyrecipesearch\\.co)|(Daily_Search_3e2f26bf46061e1fb6386bb2bc9fb3b1@www\\.dailysearch\\.co)|(Daily_Search_clone_RAfKSlJEDD@www\\.dailysearch\\.co)|(Daily_Search_Plus_b60c5575e4d5158e20036cb104c00bba@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_f693ecbe1af3da784c31114acc402ec4@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_oldtAgRAUL@www\\.dailysearchplus\\.com)|(Daily_Search_Plus_xCxtAmrZoI@www\\.dailysearchplus\\.com)|(Daily_Search_Web_f70aa46e9caf1e58a04aad7917c8d0aa@www\\.dailysearchweb\\.com)|(Daily_Search_Web_PvsRmlCiKL@www\\.dailysearchweb\\.com)|(Daily_Speed_Check_475174e16d0d170b447b7002797efade@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Check_uqFEhmPbDE@www\\.dailyspeedcheck\\.com)|(Daily_Speed_Checker_1c6d34e9410cb2652228c18bed9eaf67@www\\.dailyspeedchecker\\.com)|(Daily_Speed_Checker_wcntWZhyvr@www\\.dailyspeedchecker\\.com)|(Daily_Transit_Guide_a4b1896ed15535c97cf0c19cb3960680@www\\.dailytransitguide\\.com)|(Daily_Transit_Guide_rOdLEeRGxw@www\\.dailytransitguide\\.com)|(Daily_Weather_Finder_94b59c3b4bf2e42f392be55572d25ac2@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Finder_QhhPAMLPai@www\\.dailyweatherfinder\\.com)|(Daily_Weather_Forecast_cgMvSNkeBN@www\\.dailyweatherforecast\\.net))$/","prefs":[],"schema":1576757992072,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4acfb151-a1d2-4468-9794-5816fadef1b7","last_modified":1576771657116},{"guid":"/^((Daily_Weather_Forecast_clone_CSwGEuwNKr@www\\.dailyweatherforecast\\.co)|(Daily_Weather_Forecast_f7824fa0dfff1fdbe9f36ad33ecfa4b4@www\\.dailyweatherforecast\\.net)|(Daily_Weather_Forecast_kclkQdSlIO@www\\.dailyweatherforecast\\.co)|(DailyCoupons\\.store_zWkmEkoPgk@www\\.dailycoupons\\.store)|(DailyJobSearch\\.co_EKJtPSSMhB@www\\.dailyjobsearch\\.co)|(DailyJobsSearch\\.net_a2ba2cb41169ec0e7e1e381ae8cec363@www\\.dailyjobssearch\\.net)|(dailyjobssearch@www\\.dailyjobssearch\\.co)|(dailyjobssearchnet@www\\.dailyjobssearch\\.net)|(DailyLocalWeather\\.net_clone_jVyHpUvXAl@www\\.dailylocalweather\\.net)|(DailyLocalWeather\\.net_vzkDkoQoVN@www\\.dailylocalweather\\.net)|(DailyNetSpeedtest\\.co_HWGHkbkKGm@dailynetspeedtest\\.com)|(dailynewsupdatesinnet@www\\.dailynewsupdates\\.in\\.net)|(dailynewsupdatesonline@www\\.dailynewsupdates\\.online)|(DailyRecipeOnline\\.net_bVwwSbDKSk@www\\.dailyrecipeonline\\.net)|(DailyRecipeSearch\\.co_zXrOSYpFeH@www\\.dailyrecipesearch\\.co)|(DailyRecipeSearch\\.info_VJInpLJmig@www\\.dailyrecipesearch\\.info)|(Dictionary_Pro_App_HbjmnxLIZN@www\\.dictionaryproapp\\.com)|(Dictionary_Pro_PquztTZbLu@www\\.dictionarypro\\.co)|(Dictionary_Xpress_QeRWOLUqwj@www\\.mywordscribent\\.com)|(Directions_Finder_190cb6038fd06edbc48ea5423cc43227@www\\.finddirections\\.co)|(Directions_Finder_1e30de3303446cde1d03ee219a13f572@www\\.finddirection\\.online)|(Directions_Finder_868daddf032f443da0515e9c976159c9@www\\.finddirections\\.co)|(Directions_Finder_86fa782f7bd705c2e644aa07f6218661@www\\.finddirections\\.co)|(Directions_Finder_AcrlxGosjE@www\\.finddirections\\.co)|(Directions_Finder_BZDovhcQyV@www\\.findroutes\\.co)|(Directions_Finder_c005f28d896373d557e03e80f4b57d37@www\\.findroutes\\.co)|(Directions_Finder_e183b060f3f35940a9291cd2ed4791e3@www\\.finddirections\\.co)|(Directions_Finder_lHmoDZAZNo@www\\.finddirections\\.co)|(Directions_Finder_LKGiGUhRDf@www\\.finddirections\\.co)|(Directions_Finder_Now_NMzpPonhyb@www\\.directionsfindernow\\.com)|(Directions_Finder_QTCjmhKxhD@www\\.finddirection\\.online)|(Directions_Finder_V1_0c00deff96164188875cce59cb27ebb1@www\\.finddirections\\.co)|(Directions_Finder_V1_4668ec661e1b94a2474a1c1675158eb2@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeD@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_BPDzngiFeDic@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_lkSfnVsTUN@www\\.finddirections\\.co)|(Directions_Finder_V1_clone_mPiHTaJZJi@www\\.finddirections\\.co)|(Directions_Finder_V1_de58f7b93a8d173bc071b3730806cf8c@www\\.finddirections\\.co)|(Directions_Finder_V1_ffc19350a43c8bf4db65930f95663016@www\\.finddirections\\.co)|(Directions_Finder_V1_xivwbBBnLX@www\\.finddirections\\.co)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_2@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef_23@www\\.directionsfound\\.com)|(Directions_Found_1dc1261209c6647a8288498e180d5eef@www\\.directionsfound\\.com)|(Directions_Found_clone_hbtpEmPzTJ@www\\.directionsfound\\.com)|(Directions_Found_clone_hdjMdQYTvN@www\\.directionsfoundnt\\.com)|(Directions_Found_GLuiPTQCww@www\\.directionsfound\\.com)|(Directions_Found_mVBuOLkFzz@www\\.directionsfoundnt\\.com)|(Directions_Found_XmorLjjHtu@www\\.directionsfound\\.com)|(Directions_Quest_clone_qQtdSaDtmD@www\\.directionsquest\\.co)|(Directions_Quest_DuwqkuyNfU@www\\.directionsquest\\.co)|(Directions_Quest_FwNcHagZgz@www\\.directionsquest\\.co)|(Directions_Quest_XQDqehhuWR@www\\.directionsquest\\.co)|(Doc_Converter_0a0ede466240dc417f4f6d8594acd9a5@www\\.convertthepdf\\.co)|(Doc_Converter_Hub_sTIWsdHRFE@www\\.docconverterhub\\.com)|(Document_Converter_CZmoJDQssK@www\\.convertpdfnow\\.co)|(Driving_Directions_App_mUxSdxsgni@www\\.drivingdirectionsappn\\.org)|(Driving_Maps_Online_clone_jtpQCXsDzM@www\\.drivingmapsonline\\.com)|(Driving_Maps_Online_evmZdmROJS@www\\.drivingmapsonline\\.com)|(Easy_Directions_Now_a9718312f4e22a699b573a1cf508ccc9@www\\.easydirectionsnow\\.com)|(Easy_Directions_Now_TBmyGrTUZj@www\\.easydirectionsnow\\.com)|(Easy_Doc_Converter_393a2418db4856b1ec2d790e9b30ffc2@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_5a92e4df39328183b24ce0103f3dea19@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_79478769a5477116f6efd505f3b0cf15@www\\.easydocconverter\\.com)|(Easy_Doc_Converter_a1be8989ddea6e7543bea0b843c6a2ba@www\\.easydocconverter\\.com))$/","prefs":[],"schema":1576758021535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"125bc0c5-76dc-4426-b682-1c321843d645","last_modified":1576771657110},{"guid":"/^((Everyday_Astro_YjPsaMBBWj@www\\.everydayastro\\.online)|(Everyday_File_Converter_ed35274eecd2df2822fa50636b6d9c2c@www\\.everydayfileconverter\\.com)|(Everyday_File_Converter_NldTeZANPx@everydayfileconverter\\.com)|(Everyday_Horoscope_App_zsZEtFjPki@www\\.everydayhoroscopeapp\\.com)|(Everyday_News_Tab_eebc4520552865e4fa1472681eeb5a3d@www\\.everydaynewstab\\.com)|(Everyday_News_Tab_zARNxTxEiu@www\\.everydaynewstab\\.com)|(Everyday_Radio_1f1b997a2d674af1b684dd5457ae5356@www\\.myeverydayradio\\.com)|(Everyday_Radio_mTDVrswpBm@www\\.myeverydayradio\\.com)|(Everyday_Recipe_Guide_566183664fdda4ba4e650fa5115c6cfe@www\\.recipeboardplus\\.com)|(Everyday_Recipe_Guide_tiorNZIoRi@www\\.everydayrecipeguide\\.com)|(Everyday_Weather_Forecast_2a934b9a097e1f619a7066c2530ef60f@www\\.everydayweatherforecast\\.com)|(Everyday_Weather_Forecast_sPyCkYArmT@www\\.everydayweatherforecast\\.com)|(EverydayAstro\\.net_kTOmUMbUtk@www\\.everydayastro\\.net)|(ext_11637@www\\.map-buddy\\.net)|(extensionid@www\\.dailynewsupdates\\.in\\.net)|(extensionid@www\\.moviequest\\.co)|(Fast_Mail_Tab_BfwMzfJAdm@www\\.fastmailtab\\.com)|(Fast_Mail_Tab_clone_LPzCObgNLo@www\\.fastmailtab\\.com)|(Fast_Map_Finder_ae4f5334a91035cf082f4c9e0983fc15@www\\.fastmapfinder\\.com)|(Fast_Map_Finder_YxRYGsJekN@www\\.fastmapfinder\\.com)|(Federal_Forms_clone_NgrjNsxcUN@www\\.easyformsfinder\\.com)|(Federal_Forms_EBqDdPvCFF@www\\.easyformsfinder\\.com)|(File_Convert_Plus_clone_juAtPozquc@www\\.fileconvertplus\\.com)|(File_Convert_Plus_JfRqzQtMeK@www\\.fileconvertplus\\.com)|(File_Convert_Pro_hOblzzFvJL@www\\.fileconvertpro\\.co)|(File_Converter_37ced8ee9475a347afab0d20660cef63@www\\.pdf-convertn\\.co)|(File_Converter_clone_aWSjJQAWwa@www\\.pdf-convertn\\.co)|(File_Converter_Hub_wnuDyqJFOe@www\\.fileconverterhub\\.com)|(File_Converter_Live_hWXrCtYfna@www\\.fileconverterlive\\.com)|(File_Converter_Tab_63009c33f9d202492393146d23df95d0@www\\.fileconvertertab\\.com)|(File_Converter_Tab_bEfXMQovol@info\\.fileconvertertab\\.com)|(File_Converter_Tab_bHaEkegUAR@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_8d6f907bab9ab53a83b5d8a4505433f4@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_cCZhwgyHDr@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_gNPUWukwdG@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_pweczfyyvv@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_qygWFXkHri@www\\.fileconvertertab\\.com)|(File_Converter_Tab_clone_XpUyfDDJsm@info\\.fileconvertertab\\.com)|(File_Converter_Tab_dd756ad1b37f999650834591ffd21464@www\\.fileconvertertab\\.com)|(File_Converter_Tab_deb5d97364d6e9ba4d04089f90afa043@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_8fe7b393ec2d293e54abf1aada3bcb94@www\\.fileconvertertab\\.com)|(File_Converter_Tab_V2_clone_DrmwsZhTkw@www\\.fileconvertertab\\.com)|(File_Converter_Tab_XHmAqSTCbP@www\\.fileconvertertab\\.com)|(File_Converter_xdbvCaJxrb@www\\.myfileconverter\\.co)|(FileConvertPro_clone_gDJuPpeLjD@www\\.fileconvertpro\\.co)|(FileConvertPro_mLscTidBER@www\\.fileconvertpro\\.co)|(Find_Coupons_Daily_dxJFJCQcpS@www\\.finddaily-coupons\\.today)|(Find_Coupons_Daily_lIKYSwDOhr@www\\.findcouponsdaily\\.co)|(Find_Coupons_Daily_RjrQWQzreq@www\\.findcoupons-daily\\.today)|(Find_Coupons_Daily_UhahUhrtxP@www\\.find-couponsdaily\\.today)|(Find_Coupons_Daily_wUpPOFfkzc@www\\.findcouponsdaily\\.today)|(Find_Coupons_OWfYsAQras@www\\.findcoupons\\.live)|(Find_Daily_Coupons_6ea44d6d01a700e213070c692343e03d@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_71b6faf57612a3de273a55a228ec1703@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_a4c3252d270bd03507cfe77d8397e8b6@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_cf887ce0c30cf483939356fd9dc4753a@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_clone_sCMBPIejep@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_dBVmCxAeYJ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_gSKACLrhGQ@www\\.finddailycoupons\\.com)|(Find_Daily_Coupons_sVYmYFumfX@www\\.finddailycoupons\\.com)|(Find_Daily_Games_gZnVxpnfzi@www\\.finddailygames\\.com)|(Find_Daily_Games_JHwXAakSOO@www\\.finddailygames\\.com)|(Find_Daily_Games_osIGANaBXk@www\\.finddailygames\\.com)|(Find_Daily_Games_rcRvgxUzAu@www\\.finddailygames\\.net)|(Find_Directions_euMftZJtWV@www\\.finddirections\\.co)|(Find_Easy_Directions_2252eb9a9264ef1685d45b8fe13f6a43@www\\.findeasydirections\\.com))$/","prefs":[],"schema":1576758100930,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a69a7be4-4f76-4c00-aa17-d1bbe66fd2db","last_modified":1576771657102},{"guid":"/^((Find_Easy_Directions_541d5ace0c28764eb8e88d98d0e28740@www\\.findeasydirections\\.com)|(Find_Easy_Directions_90d67b798ba3070d90d32d74ff70d1c8@www\\.findeasydirections\\.com)|(Find_Easy_Directions_gbailzSvPb@www\\.findeasydirections\\.com)|(Find_Easy_Directions_YiGOrfTNFT@www\\.findeasydirections\\.com)|(Find_Easy_Directions_zcYSFoeMgF@www\\.findeasydirections\\.com)|(Find_Jobs_Daily_clone_ZryioBAtLo@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_FpBesVkFoN@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_TxUobqrfTu@www\\.findjobsdaily\\.co)|(Find_Jobs_Daily_ZLJpRXDhXK@www\\.findjobsdaily\\.co)|(Find_Recipes_Online_kSjCdoBAFX@www\\.findrecipesonline\\.co)|(Find_Templates_Quick_LyRzafuNXE@www\\.findtemplatesquick\\.com)|(FindJobsDaily\\.net_ilHEYezmJM@www\\.findjobsdaily\\.net)|(FlirtyWallPapers\\.online_IEZjVbwbSl@www\\.flirtywallpapers\\.online)|(Forbes_Search_aOPKgBmHyw@forbes\\.dailynewsupdates\\.online)|(Free_Directions_Finder_KEDDaoHBQl@www\\.freedirectionsfinder\\.com)|(Free_Manuals_KkQAhLuDkf@www\\.browsemanuals\\.co)|(Game_Buddy_632c7a501a256d43af845a6c03d36c65@www\\.game-buddy\\.co)|(Game_Buddy_ef910a8045b370e3df14a73fb05c0ee1@www\\.game-buddy\\.co)|(Game_Buddy_emPnaqsxzR@www\\.game-buddy\\.co)|(Game_Buddy_ISrmuaRAHN@www\\.game-buddy\\.co)|(Game_Quest_3c4a7895681b0a9d0860d5397036f146@www\\.game-quest\\.co)|(Game_Quest_bd98408b6a98a0b19825f9ff5023f0e7@www\\.game-quest\\.co)|(Game_Quest_bTqWKJtOPG@www\\.games-quest\\.co)|(Game_Quest_clone_40442f8034b58a60951b7a3cdf5fe97a@www\\.game-quest\\.co)|(Game_Quest_clone_rajfrvipoU@www\\.game-quest\\.co)|(Game_Quest_GHFSWLkdAO@game-quest\\.com)|(Game_Quest_hMqLrbOzmC@www\\.game-quest\\.co)|(Game_Quest_NDifumcXqQ@www\\.games-quest\\.org)|(Game_Quest_nilKwpfZen@www\\.game-quest\\.co)|(Game_Quest_rXONqXzsZj@www\\.games-quest\\.org)|(Game_Search_BbtNWEfPKy@www\\.daily-gamesearch\\.today)|(Game_Search_eOUjptBQzk@www\\.gamessearch\\.live)|(Game_Search_eymrhMPxLu@www\\.dailygame-search\\.today)|(Game_Search_kZDJlntNQs@www\\.gamesearch\\.link)|(Game_Search_MdsPFfXaXl@www\\.game-search\\.link)|(Game_Search_mgkCKPquHh@www\\.dailygamesearch\\.co)|(Game_Search_mvoOwLJOeY@www\\.games-search\\.link)|(Game_Search_nKMbWrakmm@www\\.dailygamesearch\\.today)|(Game_Search_PDKlEPjhDw@www\\.games-search\\.link)|(Game_Tab_BoRsmjioSA@www\\.gametab\\.co)|(Game-Quest_WhVgUeMwZI@www\\.game-quest\\.co)|(GameQuest\\.website_IwplUMSUhd@www\\.gamequest\\.website)|(GameQuest\\.website_ZGhTUTKRhi@www\\.gamequest\\.website)|(Games_Daily_clone_UAnrFPWGxF@www\\.games-daily\\.net)|(Games_Daily_EVSeZYmPYK@www\\.games-daily\\.today)|(Games_Daily_nRQyywoJPm@www\\.games-daily\\.net)|(Games_Daily_SPRlOvPjlj_clone@www\\.games-daily\\.co)|(Games_Daily_SPRlOvPjlj@www\\.games-daily\\.co)|(Games_Daily_WnvPyaqCdX@www\\.games-daily\\.today)|(Games_Finder_Online_98e08661ac2ba2826d702b9de87c3fbc@www\\.gamesfinderonline\\.com)|(Games_Finder_Online_YCDTopLIiv@www\\.gamesfinderonline\\.com)|(Games_Quest_antJJCJcBk@www\\.games-quest\\.website)|(Games_Quest_clone_aTlPJPmJEm@www\\.games-quest\\.today)|(Games_Quest_OxdmpwtACa@www\\.games-quest\\.today)|(Games_Quest_qmlUmTihvS@www\\.gamesquest\\.today)|(Games_Quest_vnzuqLPUQQ@www\\.gamesquest\\.today)|(Games_Quest_WEpNvcmerl@www\\.games-quest\\.today)|(Games_Quest_wKWBKbLjpl@www\\.games-quest\\.today)|(Games_Quest_Zafeeizthl@www\\.games-quest\\.today)|(Games_Quest_ZVRwioHOnh@www\\.games-quest\\.online)|(Games_Search_FPDqSSnSlY@www\\.game-search\\.today)|(Games_Search_HAfeXALvGY@www\\.gamesquest\\.online)|(Games_Search_LSrSMudgNL@www\\.gamessearch\\.co)|(Games_Search_mDdAwBVasx@www\\.gamesearch\\.today)|(Games_Search_RgMSPqlluj@www\\.gamessearch\\.xyz)|(Games_Search_sfZySehUmo@www\\.gamessearch\\.online)|(Games_Search_shZkWBHwut@www\\.gamessearch\\.online)|(Games_Search_USoWCKOlGq@www\\.finddailygames\\.com)|(Games_Search_uXqDhnPDBw@www\\.gamesearch\\.today)|(Games_Search_vCVYFXcOnV@www\\.gamessearch\\.org)|(Games-Daily\\.net_NainTzjpve@www\\.games-daily\\.net)|(Get_Coupons_awAkTqqCxd@www\\.getcoupons\\.live)|(Get_Coupons_RGWEhnHIbr@www\\.getcoupons\\.live)|(Get_Directions_07d014a7ed5bba404eb7f2b1058ad2cb@www\\.getdirectionsmapsn\\.com)|(Get_Directions_CBakCNUUbo@www\\.map-finder\\.link)|(Get_Directions_clone_kxIvsTsDgE@www\\.getdirectionsmapsn\\.com)|(Get_Directions_HlEHEMFRkj@www\\.getdirectionsmapsn\\.com))$/","prefs":[],"schema":1576758133784,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f6c1160a-fa98-4541-bb03-cd6d02b825e3","last_modified":1576771657097},{"guid":"/^((Get_Directions_Quick_89a733fca5e8b5436c95fcec40ca5573@www\\.getdirectionsquickn\\.online)|(Get_Easy_Directions_b3f03018f3d77ab1327550851c2a2f94@www\\.geteasydirections\\.com)|(Get_Easy_Directions_FeEnVDLKMP@www\\.geteasydirections\\.com)|(Get_Easy_Maps_a92ae443f4d44fdbcf507f73934c5bff@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_RsVkJokaAq@www\\.geteasymaps\\.co)|(Get_Easy_Maps_clone_TgEXtwRoQx@www\\.geteasymaps\\.co)|(Get_Easy_Maps_e66ef79b1701806812d764c8b2e87673@www\\.geteasymaps\\.co)|(Get_Easy_Maps_eUfwfdzBJN@www\\.geteasymaps\\.co)|(Get_Easy_Maps_f9341eebd729ecc7e5389769a7ac8c27@www\\.geteasymaps\\.com)|(Get_Easy_Maps_NoApMGqlhQ@www\\.geteasymaps\\.com)|(Get_Easy_Maps_PiUUlEtxCz@www\\.geteasymaps\\.co)|(Get_Easy_Maps_uopDIWsrOB@www\\.geteasymaps\\.co)|(Get_Easy_Maps_VZVoDVzTZP@www\\.geteasymaps\\.co)|(Get_Easy_Search_5a1bd32b3bb3d079d253b6fe048c6d4e@www\\.geteasysearch\\.com)|(Get_Easy_Search_b1272ab7a446984d2e1ddbf0b94016d0@www\\.geteasysearch\\.com)|(Get_Easy_Search_zjvfbWwXrA@www\\.geteasysearch\\.com)|(Get_Forms_Today_HmKpwNqqgw@www\\.getformstoday\\.com)|(Get_Local_Forecast_KSKPskMcZy@www\\.getlocalforecastn\\.com)|(Get_Map_Finder_clone_AVJpxOfDmZ@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_BGAfKOwTad@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_hwWbfqrHDh@www\\.getmapfinder\\.link)|(Get_Map_Finder_clone_YUnreTXyJo@www\\.getmapfinder\\.link)|(Get_Map_Finder_RDbuumWRlP@www\\.getmapfinder\\.link)|(Get_Map_Finder_vJqBDvfVEi@www\\.getmapfinder\\.link)|(Get_Map_Finder_zORQiNFbOh@www\\.getmapfinder\\.co)|(Get_Online_Converter_AbNmflhxCb@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_255e60767a18e291b0b8b3cabd6f382c@www\\.getonlineconverter\\.com)|(Get_Online_Converter_clone_oCShEwyADp@www\\.getonlineconverter\\.com)|(Get_Online_Maps_clone_hGHOrvKQpE@www\\.getonlinemapsnow\\.com)|(Get_Package_Tracker_5a92260cd5155c5f26b16207532e9c5e@www\\.getpackagetracker\\.com)|(Get_Package_Tracker_clone_CztbvYsSLz@www\\.getpackagetracker\\.com)|(Get_Speed_Checker_CdqYfmDnVO@www\\.getspeedchecker\\.com)|(Get_Speed_Test_Ace_efd65663a0f689684ed5b60337c519ac@www\\.getspeedtestace\\.com)|(Get_Speed_Test_Ace_uNUzxBsIBO@www\\.getspeedtestace\\.com)|(GetOnlineConverter_62dc3ed61ba55b471bc5952d64f22e34@www\\.getonlineconverter\\.com)|(GetOnlineConverter_clone_hmwBWihZaf@www\\.getonlineconverter\\.com)|(Global_Weather_2abbd1bfe1f92474dc556a6abd23c97e@www\\.global-weathern\\.online)|(Global_Weather_qPjJvKHHjn@www\\.global-weathern\\.online)|(Go_Package_Tracker_CDyUCsNhYI@www\\.gopackagetracker\\.com)|(Go_Search_Easy_3b073071b9f9727f2a3c22961bc6aae7@www\\.gosearcheasy\\.com)|(Go_Search_Easy_fCSPxmpWqN@www\\.gosearcheasy\\.com)|(Go_Search_Easy_MTOfbhqqMt@www\\.gosearcheasy\\.com)|(Go_Video_Converter_clone_AtpxxXDpvq@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_b78d64ef3f6d32d836cb9cb45f64f3d4@www\\.govideoconverter\\.com)|(Go_Video_Converter_clone_ENqGVUhAYo@www\\.govideoconverter\\.com)|(Go_Video_Converter_cXhEAmNOBA@www\\.govideoconverter\\.com)|(Go_Video_Converter_daef20a38c38415e2819357035444fa2@www\\.govideoconverter\\.com)|(Go_Video_Converter_YLdugTFiBs@www\\.govideoconverter\\.com)|(holidaygiftingco@www\\.holidaygifting\\.co)|(Holy_Bible_daily_22c0372905eb878bf90eb726cf1c4cd7@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_36d9839f134dba7393dcd1ce19e35114@www\\.holybibledaily\\.com)|(Holy_Bible_daily_clone_BwGilqVxow@www\\.holybibledaily\\.com)|(Holy_Bible_Daily_clone_TdHKbGqxyp@www\\.holybibledaily\\.com)|(Holy_Bible_daily_WRzbIpWLfR@www\\.holybibledaily\\.com)|(Horoscope_Finder_CQAkIhPhib@www\\.horoscopefinder\\.co)|(Hunt_New_Jobs_MQlcPgVQSY@www\\.huntnewjobs\\.com)|(Hunt_New_Jobs_TeypdaDdsy@www\\.huntnewjobs\\.com)|(Inbox_Tab_1549897502@www\\.inboxtab\\.com)|(Inbox_Tab_LTnzVZlfKv@www\\.inboxtab\\.com)|(Inbox_Tab_rOksOtIddG@www\\.inboxtab\\.com)|(Instant_Doc_Converter_1264fb8b31af7c6c3f56c4c33b825dab@www\\.instantdocconverter\\.com\\.removed)|(Instant_Doc_Converter_clone_LWgHiMFzyN@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_clone_OeEmGVRjdr@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_fe41778b25f65137ed606033eea89902@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_hMMLIeTKQH@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_UJTpBaxVPV@www\\.instantdocconverter\\.com)|(Instant_Doc_Converter_vZPKbExySk@www\\.instantdocconverter\\.com))$/","prefs":[],"schema":1576758169317,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9acbbf4c-ef5c-46d4-bc1d-f520b8ced595","last_modified":1576771657093},{"guid":"/^((Instant_Email_Login_3fff03c5bbd668d2f7093d5491f66518@www\\.instantemaillogin\\.com)|(Instant_Email_Login_WRGGywlQTy@www\\.instantemaillogin\\.com)|(Instant_Email_Plus_KAZiCvZFWB@www\\.instantemailplus\\.com)|(Instant_Inbox_clone_QKZmbMSVkA@www\\.instantinbox\\.co)|(Instant_Inbox_clone_QmVdpyuWwT@www\\.instantinbox\\.co)|(Instant_Inbox_clone_VlVOmivYUN@www\\.instantinbox\\.co)|(Instant_Inbox_clone_XLjUGcrTgI@www\\.instantinbox\\.co)|(Instant_Inbox_clone_YxmUgAsOrZ@www\\.instantinbox\\.co)|(Instant_Inbox_pzclglfDGq@www\\.instantinbox\\.co)|(Instant_Inbox_qnRYsobGem@www\\.instantinbox\\.co)|(Instant_Maps_clone_clone_zqdkjyMgdQ@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD_test@www\\.checkmaps\\.co)|(Instant_Maps_ZefayBJOcD@www\\.checkmaps\\.co)|(Instant_Net_Speed_7291e707ced30428e6ed71611c3071ed@www\\.instantnetspeed\\.com)|(Instant_Net_Speed_iEjKvJreAi@www\\.instantnetspeed\\.com)|(Internet_Speed_Test_cf6c9b84dd607bc049898130dd8aa403@www\\.fastinternetspeedtestn\\.com)|(Internet_Speed_Test_RCgVciwcSD@www\\.fastinternetspeedtestn\\.com)|(Job_Search_Online_53e3be5488ce961c12d4341c2e3c830d@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_20bb80efe94b528ef6fa06730d560cbb@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_fUDgRmLxrl@www\\.jobssearchonline\\.co)|(Job_Search_Online_clone_jxgyVIROvt@www\\.jobssearchonline\\.co)|(Job_Search_Online_qNOPIVBSge@www\\.jobssearchonline\\.co)|(Job-Portal_dPNxZEZiQF@www\\.job-portal\\.co)|(Jobs_Now_jkAqvfwqNy@jobsnow\\.com)|(Just_Search_Easy_PJxNIOGbZS@www\\.justsearcheasy\\.com)|(justlovepetsonline@www\\.justlovepets\\.online)|(KC_Recipe_Finder_f8541026d8d56f16ba1db6664ac76ed8@www\\.testextension\\.online)|(LifeLock_Safe_Search_LDKQZxofGQ@searchsafe\\.lifelock\\.com)|(Live_Email_4cacc77ba79f2e88d808404b1487e27d@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH_ach@www\\.liveemail\\.co)|(Live_Email_clone_avmFyKjGHH@www\\.liveemail\\.co)|(Live_Inbox_clone_HSqMlnurhx@www\\.liveinbox\\.co)|(Live_Inbox_ITUElbGJyq@www\\.liveinbox\\.co)|(Live_News_90155c3a670c030b75d27b2b060bab76@www\\.get-news\\.co)|(Live_News_ab96451cfc686d1903b9bd5bbefc58df@www\\.get-news\\.co)|(Live_News_Daily_coRwlwVUtL@www\\.livenewsdaily\\.net)|(Live_News_RoTkoRyzKW@www\\.get-news\\.co)|(Live_News_sQHxsfPWHn@www\\.get-news\\.co)|(Live_News_UPeYgtCNWH@www\\.get-news\\.co)|(liveemail@www\\.liveemail\\.co)|(LiveNewsDaily\\.co_Qrkavccepk@www\\.livenewsdaily\\.co)|(Local_Weather_Now_clone_CGdqWGvDuk@www\\.localweathernow\\.co)|(Local_Weather_Now_clone_PsfbncWCpz@www\\.localweathernow\\.co)|(Local_Weather_Today_af62b67de6656cd77ec1232ce28b0847@www\\.localweathertoday\\.co)|(Local_Weather_Today_b6bdb9471dfdbbe166ebba101bf87987@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_25d0f678c3de41078bfebfedb36f3e5e@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_ozBsMkxlfM@www\\.localweathertoday\\.co)|(Local_Weather_Today_clone_QFZOuAbpBy@www\\.localweathertoday\\.co)|(Local_Weather_Today_MoAsKEYZyC@www\\.localweathertoday\\.co)|(localweathertodayco@www\\.localweathertoday\\.co)|(localweathertodaynet@www\\.localweathertoday\\.net)|(Locate_Packages_JIjwUKeces@www\\.locatepackages\\.com)|(loginpro_bTqvLMpNXn@www\\.easy-maillogin\\.link)|(loginpro@www\\.loginemailpro\\.com)|(manifestdata_Check_clone_AraOARfaeL@hjm)|(manifestdata_Check_HFkEdcMQtX@hjm)|(manifestname@www\\.wallpaperonlinepro\\.com)|(Map_Buddy_svMNjHoVFQ@www\\.map-buddy\\.net)|(Map_Directions_Pro_hFzkEkDBXw@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_JAlSTUeoZW@www\\.mapdirectionspro\\.co)|(Map_Directions_Pro_vnuUbjddlF@www\\.mapdirectionspro\\.co)|(Map_Finder_GaEdNdyQoi@www\\.mapfinder\\.live)|(Map_Finder_Online_clone_HAzjiKHVFr@www\\.mapfinderonline\\.com)|(Map_Finder_Online_clone_vxRStAVXsj@www\\.mapfinderonline\\.com)|(Map_Finder_Online_DWFqZBeElh@www\\.mapfinderonline\\.com)|(Map_Finder_RIBbQLtJhY@www\\.map-finder\\.link)|(Map_Finder_ubFbNkPLbu@www\\.map-finder\\.co)|(Map_My_Journey_clone_dbZghybkTf@www\\.mapmyjourney\\.co)|(Map_My_Journey_gWimMkbjcf@www\\.mapmyjourney\\.co)|(Map_My_Journey_hwaFtGeeRF@www\\.mapmyjourney\\.co)|(Map_My_Journey_lOKajIjWRX@www\\.mapmyjourney\\.co)|(Map_My_Travel_3d7340d4339df15d23c823030d0b3dd4@www\\.mapmytravel1\\.co)|(Map_My_Travel_4c1060a52cb966087a862f50c66cff76@www\\.mapmytravel1\\.co)|(Map_My_Travel_66a1df798c97eecbcbc5ce97f5bb58ce@www\\.mapmytravel\\.co))$/","prefs":[],"schema":1576758213475,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f0cac174-d15f-427f-b310-9409e69a2ca6","last_modified":1576771657088},{"guid":"/^((Map_My_Travel_77440f39b0fc3ac74a9e894ff2e26617@www\\.mapmytravel\\.co)|(Map_My_Travel_ac398c1a8442efc53c141095c6e386f1@www\\.mapmytravel1\\.co)|(Map_My_Travel_b47128735efb1ae5232811bf674a5598@www\\.mapmytravel1\\.co)|(Map_My_Travel_c520fe83319115df915325944097f2d7@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_906668a067200f92f67c8a1d4934ca53@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_agEGcivVyr@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_AojrINyqec@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_CaXjHVvzvR@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_CmwkGssriz@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_KUUHhqDlkF@www\\.mapmytravel1\\.co)|(Map_My_Travel_clone_xjdUmTvEZE@www\\.mapmytravel\\.co)|(Map_My_Travel_clone_ZJilbRDhlx@www\\.mapmytravel1\\.co)|(Map_My_Travel_ea415ecadf91d96c596c61d748dfab3a@www\\.mapmytravel\\.co)|(Map_My_Travel_FGYxkNvlYu@www\\.mapmytravel1\\.com)|(Map_My_Travel_GnhWycuRWw@www\\.mapmytravel\\.co)|(Map_My_Travel_KoRBtjTOaQ@www\\.mapmytravel\\.co)|(Map_My_Travel_V2_1136cc214788f6e2c4fbd748c875f289@www\\.mapmytravel1\\.co)|(Map_Your_Way_dba6e11787a9a4c0ff802d30e2d84655@www\\.mapyourway\\.online)|(Map_Your_Way_RRrntXMhmV@www\\.mapyourway\\.online)|(Map-Buddy\\.net_YDYeEFqMMB@www\\.map-buddy\\.net)|(MapAssistant\\.net_IxpgMrxoal@www\\.mapassistant\\.net)|(Maps_Finder_clone_lXfNOQsASa@www\\.getmapfinder\\.com)|(Maps_Finder_clone_OHRJTSZWsp@www\\.getmapfinder\\.com)|(Maps_Finder_clone_qjbEfuxypy@www\\.getmapfinder\\.com)|(Maps_Finder_clone_sVixvNGfvq@www\\.getmapfinder\\.com)|(Maps_Finder_clone_XiwisRQHED@www\\.mapsfinder\\.co)|(Maps_Finder_cxamiyXEhG@www\\.maps-finder\\.co)|(Maps_Finder_ikDztWsXOS@www\\.mapsfinder\\.co)|(Maps_Finder_ISFXVmdcMZ@www\\.getmapfinder\\.com)|(Maps_Finder_NEJbQoRTxu@www\\.mymapfinder\\.co)|(Maps_Finder_OAXSzUFBAz@www\\.getmapfinder\\.com)|(Maps_Finder_Online_cb9ff9fa82db81028ec8b5a9c738c3d0@www\\.mymapsfinderonline\\.com)|(Maps_Finder_Online_fa0d46585631975dfefb9653fbdc5ae5@www\\.mapsfinderonline\\.com)|(Maps_Finder_Online_VBUnFyZArH@www\\.mapsfinderonline\\.com)|(Maps_Finder_OyeiUXSYyC@www\\.mymap-buddy\\.com)|(Maps_Finder_yiomudinei@www\\.mapsfinder\\.co)|(Maps_Now_1a47fbf8546a43d949f229efca9a2f34@www\\.mapsnow\\.co)|(Maps_Now_23f9f3cd0b483c22be85bb2568a2df4f@www\\.mapsnow\\.co)|(Maps_Now_85bb8ec9ca1c2baab2dc307af81964c2@www\\.mapsnow\\.co)|(Maps_Now_cbd62915225f7f059c5d15daa3a59cad@www\\.mapsnow\\.co)|(Maps_Now_clone_daDccVKFiR@www\\.mapsnow\\.co)|(Maps_Now_clone_eaIVjwJWMX@www\\.mapsnow\\.co)|(Maps_Now_clone_HmcRPOcjzE@www\\.mapsnow\\.co)|(Maps_Now_clone_QnqJIECgrq@www\\.mapsnow\\.co)|(Maps_Now_clone_VNlrSBkTlM@www\\.mapsnow\\.co)|(Maps_Now_clone_yDfyuWvMMp@www\\.mapsnow\\.co)|(Maps_Now_clone_YDpyMtVaLW@www\\.mapsnow\\.co)|(Maps_Now_clone_ZyNlPAcxdc@www\\.mapsnow\\.co)|(Maps_Now_tmnjrLnmFO@www\\.mapsnow\\.co)|(Maps_Now_uwqucqWEGq@www\\.mapsnow\\.co)|(Maps_Now_XSqhhyPFiH@www\\.mapsnow\\.co)|(Maps_Today_UoKEAlMYFh@www\\.mapmyjourneynt\\.co)|(mapsfinder@www\\.mapsfinder\\.co)|(Metric_Converter_Pro_437e424a1d8a287713fd991b4babb241@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_48e7e1cd7ea7a150ce498c7f4c1a8525@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_c1043f9d35c4300be27a136d2956b8bd@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_b151705ba46c35bf8530f6fcccad39ff@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_HoBPpUTrbw@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_KaiswSnKUV@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_SzGHQnHNkN@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_clone_WchvzpVULZ@www\\.metricconverterpro\\.com)|(Metric_Converter_Pro_rEvcfmsuJW@www\\.metricconverterpro\\.com)|(Movie_Delight_LVlUUJCTfd@www\\.movie-delight\\.com)|(Movie_Delight_xWRWlvWNGj@www\\.movie-delight\\.com)|(Movie_Hunt_GzAuVRhAph@www\\.moviequest\\.online)|(Movie_Hunt_ioLSsIUbVX@www\\.themoviesearch\\.org)|(Movie_Hunt_jbuqRPUUVt@www\\.moviehunt\\.today)|(Movie_Hunt_jHPrIKUDZi@www\\.moviehunt\\.today)|(Movie_Hunt_Online_jJicoNDurf@www\\.moviehunt\\.online)|(Movie_Maniac_2462069208dfe0b3d754ec0d11bf7b40@www\\.themoviemaniac\\.co)|(Movie_Maniac_a84cd1cd277e4886cbd535cafddb9248@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_4b2e8fc1efa469664fbfe3b1cfd600ce@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_bbe030355b07de5cd10dee52a60db3e3@www\\.themoviemaniac\\.co))$/","prefs":[],"schema":1576758242842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b009e1d2-ed9c-42b3-b795-b63d15b15deb","last_modified":1576771657084},{"guid":"/^((Movie_Maniac_clone_FhKByuyzfD@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_OzkDkQoxcV@www\\.themoviemaniac\\.co)|(Movie_Maniac_clone_pNBsVugeLv@www\\.themoviemaniac\\.co)|(Movie_Maniac_qNRzbWPyVh@www\\.themoviemaniac\\.co)|(Movie_Quest_DgloGEcqoQ@www\\.movie-quest\\.online)|(Movie_Quest_DHlTecEnbH@www\\.moviequest\\.online)|(Movie_Quest_lSUIfjeATU@www\\.movie-quest\\.org)|(Movie_Quest_ogkgHKpiCu@www\\.movie-quest\\.org)|(Movie_Quest_oIbDMPkLHN@www\\.the-moviequest\\.today)|(Movie_Quest_OYXdMYNGlQ@www\\.moviequest\\.online)|(Movie_Quest_WwjFqvwace@www\\.moviequest\\.online)|(Movie_Search_4634ea60272d58007cb594bddf4c2d14@www\\.moviesearchtoday\\.com)|(Movie_Search_5adb28a06e6a557580f892b00df54fe9@www\\.moviesearchtoday\\.com)|(Movie_Search_5e2468caef8b002ec4af47d33347d946@www\\.moviesearchtoday\\.com)|(Movie_Search_6a2835fbcfa21f071a72cf4b1d768ee1@www\\.moviesearchtoday\\.com)|(Movie_Search_82956306d33016e1612f6b93238abb8c@www\\.movie-searchtoday\\.com)|(Movie_Search_amo_hosting_clone_cdvWgyZchs@staging\\.themovie-portal\\.com)|(Movie_Search_clone_BPUjteCIKH@www\\.moviesearchtoday\\.com)|(Movie_Search_clone_hOjSGlUSJc@www\\.themovie-portal\\.com)|(Movie_Search_clone_tUhUWKFWEy@staging\\.themovie-portal\\.com)|(Movie_Search_clone_yNPQCvYjiE@www\\.search-movie\\.today)|(Movie_Search_fce3642a62f1d43d671b9cc1edae2248@www\\.moviesearchtoday\\.com)|(Movie_Search_GnuaPoCHyn@www\\.moviesearchtoday\\.com)|(Movie_Search_HQkuRtYSBi@www\\.movie-search\\.today)|(Movie_Search_JsPzrSgfUw@www\\.moviesearchtoday\\.com)|(Movie_Search_ldxwfXRmwB@www\\.movie-search\\.live)|(Movie_Search_LyOzXmENOz@www\\.movie-search\\.today)|(Movie_Search_OoYYDEappx@www\\.moviesearch\\.today)|(Movie_Search_qQXnYBWtZL@www\\.movie-searchtoday\\.com)|(Movie_Search_qSoQoWSxLl@www\\.movie-hunt\\.co)|(Movie_Search_ryfmFVsOyx@www\\.movie-search\\.today)|(Movie_Search_usVRdBSJFC@www\\.moviesearchtoday\\.com)|(Movie_Search_VbiTYRjDIi@www\\.themoviesearch\\.co)|(Movie_Search_wEfUXCokzy@www\\.moviesearch\\.today)|(Movie_Search_wGdgcYcPQb@www\\.moviesearchtoday\\.com)|(Movie-Hub\\.info_OmWUKRcKuS@www\\.movie-hub\\.info)|(Movie-Quest_KJpvmWXXVL@www\\.movie-quest\\.co)|(Movie-Quest\\.info_eUjlCfSYnv@www\\.movie-quest\\.info)|(Movie-Quest\\.info_kdhRhuajuC@www\\.movie-quest\\.info)|(movie-quest\\.today_ftrItBjuLQ@www\\.movie-quest\\.today)|(MovieQuest_jyRMkNmSGC@www\\.moviequest\\.co)|(moviequest\\.today_JlDnGylmbG@www\\.moviequest\\.today)|(moviequest@www\\.moviequest\\.co)|(MusicQuest_IuWBQBhiuw@www\\.music-quest\\.co)|(mvquest@www\\.moviequest\\.co)|(My_Astro_Tab_8e89559e65a469daf6766bb75d4376ab@www\\.myastrotab\\.com)|(My_Astro_Tab_KaAEnbwPUx@www\\.myastrotab\\.com)|(My_Coupon_Store_ylKTlAUXbo@www\\.mycouponstore\\.co)|(My_Daily_Astrology_MqfKduyqcg@www\\.my-dailyastrology\\.net)|(My_Daily_Utilities_4ebdffa571404d80516d8d0f530af9a6@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_4d4f3e4318db94478d9302c598ef468c@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_TQYRFwiprp@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_clone_wsrcjEDqNR@www\\.mydailyutilities\\.co)|(My_Daily_Utilities_iwpgTQIUFx@www\\.mydailyutilities\\.co)|(My_Directions_Finder_c406a6ac6a2b0638fcb489f1b776b903@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_alDWaOiCNo@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_iIYkMlrcwN@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_mBlfabAHtF@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_clone_oIFvReYNwJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_clone_TUeunTaGWJ@www\\.mydirectionsfinder\\.net)|(My_Directions_Finder_ejopyTsDPc@www\\.mydirectionsfinder\\.com)|(My_Directions_Finder_RIUfITHqsm@www\\.mydirectionsfinder\\.com)|(My_Doc_Converter_a70620b85cb93c122c397d5a0d6d6c17@www\\.mydocconverter\\.net)|(My_Doc_Converter_hTuhuUWAbu@www\\.mydocconverter\\.net)|(My_File_Converter_InJpDFniec@www\\.myfileconverter\\.net)|(My_File_Converter_MOLroWzmvk@www\\.myfileconverter\\.net)|(My_File_Converter_uJJIGUseRO@www\\.myfileconverter\\.org)|(My_Mail_Center_clone_AOBAQIlpph@www\\.mymailcenter\\.co)|(My_Mail_Center_clone_JJSlJDujLf@www\\.mymailcenter\\.co)|(My_Mail_Center_StbPlXiGzU@www\\.mymailcenter\\.co)|(My_Map_Buddy_AHxkFzHUSq@www\\.mymap-buddy\\.com)|(My_Map_Buddy_aJhRltItzB@www\\.mymap-buddy\\.co)|(My_Map_Buddy_dzzNGYdgEy@www\\.mymapbuddy\\.link)|(My_Map_Buddy_lCpBZhZcug@www\\.mymap-buddy\\.co))$/","prefs":[],"schema":1576758270991,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c264de14-d096-45d7-afd6-4e03f3f0874e","last_modified":1576771657080},{"guid":"/^((My_Map_Buddy_LlytpwAxzJ@www\\.my-mapbuddy\\.link)|(My_Map_Buddy_omjWWfWnZV@www\\.checkmaps\\.live)|(My_Map_Buddy_QniENdnZwH@www\\.mymapbuddy\\.co)|(My_Map_Buddy_qwjuFaLDiS@www\\.my-mapbuddy\\.link)|(My_Map_Finder_216cea355b90081b2fa2b35228afa8cd@www\\.mymapfinder\\.net)|(My_Map_Finder_FQhLxNAhOb@www\\.mymapfinder\\.net)|(My_Map_Finder_HIAdZUsdqP@www\\.easymapsfinder\\.com)|(My_Map_Key_bfebaaffd5e89eb58d8eede5550b7657@www\\.mymapkey\\.com)|(My_Map_Key_PNKwkyDcSv@www\\.mymapkey\\.com)|(My_Map_Quest_amtyvbVOvw@www\\.mymapquest\\.co)|(My_Map_Tab_e4256b0cd83dd5dc7ffd2d6fa89bb3ca@www\\.mymaptab\\.co)|(My_Map_Tab_fQPfsnZVRi@www\\.mymaptab\\.co)|(My_Maps_Daily_2216a0fb9fa410e585f75583c84bb1fc@www\\.mymapsdaily\\.com)|(My_Maps_Daily_HTtwoSgSmO@www\\.mymapsdaily\\.com)|(My_Maps_Finder_mlqpWnYOjs@www\\.mymapsfinderonline\\.com)|(My_Maps_Now_wouVnzxahG@www\\.mymapsnow\\.co)|(My_Metric_Converter_AZzUIIKwJY@www\\.mymetricconverter\\.com)|(My_Net_Speed_clone_LEPCOrGXJt@www\\.my-netspeed\\.co)|(My_Net_Speed_dIUrWuilrC@www\\.my-netspeed\\.co)|(My_Net_Speed_hQVahLtcSK@www\\.mynet-speed\\.com)|(My_Net_Speed_keJWBLUIYD@www\\.mynet-speed\\.com)|(My_Net_Speed_XhDnHJmvAF_1@www\\.mynetspeed\\.co)|(My_Net_Speed_XhDnHJmvAF@www\\.mynetspeed\\.co)|(My_Net_Speed_YGdxRAMaly@www\\.mynetspeed\\.link)|(My_Quick_Directions_384f670ee31df7278a1df86a202697c2@www\\.myquickdirections\\.com)|(My_Quick_Directions_IoipCjCqHK@www\\.myquickdirections\\.com)|(My_Quick_Search_HHmoLNFNZK@www\\.myquicksearch\\.co)|(My_Radio_Plus_clone_xijbeLEKut@www\\.myradioplus\\.co)|(My_Radio_Plus_clone_yLODfWIUzo@www\\.myradioplus\\.co)|(My_Radio_Plus_huJGcbKJdz@www\\.myradioplus\\.co)|(My_Recipe_Digest_806bc9c3d627874ac6f6c953e1174d41@www\\.myrecipedigest\\.com)|(My_Recipe_Digest_TQhDINXjet@www\\.myrecipedigest\\.com)|(My_Recipe_Guide_4bc8a248146602106b25349ec50b7395@www\\.myrecipeguideonline\\.com)|(My_Recipe_Guide_ZlrLqLHAKb@myrecipeguideonline\\.com)|(My_Route_Planner_6bb055b2be5912b90cec3a2788636830@www\\.myrouteplanner\\.co)|(My_Route_Planner_ccdd62d844c1769d5bf4db308b3bc9c9@www\\.myrouteplanner\\.co)|(My_Route_Planner_clone_AFCMlCneMs@www\\.myrouteplanner\\.co)|(My_Search_Plus_91de35f6bc26e7f423a701dc4a7d9e6b@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_7d6359f4c55d1f5c5a9af0304e7dcf34@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_ejVWzjJsWF@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@_123456www\\.mysearchplus\\.co)|(My_Search_Plus_clone_fBHEaWXiDZ@www\\.mysearchplus\\.co)|(My_Search_Plus_clone_zHyeSWPlyQ@www\\.mysearchplus\\.co)|(My_Search_Plus_zasNrdaCMb@www\\.mysearchplus\\.co)|(My_Search_Wizard_7f2979e35d2bd7dd61433bbca4e930bf@www\\.mysearchwizard\\.co)|(My_Search_Wizard_887bc211e6c12bcd4c59204553e75ed5@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_CuEYdreCCG@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_MfzUjTpTSj@www\\.mysearchwizard\\.co)|(My_Search_Wizard_clone_PhkuhYznxq@www\\.mysearchwizard\\.co)|(My_Smart_Search\\.co_uUlxGOYDUP@www\\.mysmartsearch\\.co)|(My_Smart-Search\\.co_moHloXmlvd@www\\.mysmart-search\\.co)|(My_Smart-Search\\.co_nVQpezjwFN@www\\.mysmart-search\\.co)|(My_Weather_Services_MTCOGCZgEo@myweatherservicesn\\.org)|(My_Weather_Tab_cdb3a5fdbcc268762efb7f1b9088a935@www\\.myweathertab\\.co)|(My_Word_Scribe_6ac6fa9173610517a627c5298a38891a@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_RZEMcCVoIU@www\\.mywordscribe\\.com)|(My_Word_Scribe_clone_TAZVHOvofp@www\\.mywordscribe\\.com)|(My_Word_Scribe_GlqExrIfvA@www\\.mywordscribe\\.com)|(My_Word_Scribe_wRguUlbptJ@www\\.mywordscribe\\.com)|(MyAstroFinder_clone_meuCieSJGq@www\\.myastrofinder\\.co)|(MyAstroFinder_QqSSwnxQpy@www\\.myastrofinder\\.co)|(MyCareer-Search\\.co_IcpqItVxAi@www\\.mycareer-search\\.co)|(MyCoupon-Finder\\.co_DatSgecXGq@www\\.mycoupon-finder\\.co)|(MyCouponFinder\\.co_ZMMzlIEann@www\\.mycouponfinder\\.co)|(mydailyastrologyco@www\\.mydailyastrology\\.co)|(mydailyastrologyonline@www\\.mydailyastrology\\.online)|(mydailynewsonline@www\\.mydailynews\\.online)|(MyMapBuddy\\.net_oVKQZzxNzk@www\\.mymapbuddy\\.net)|(MyMusicSearch\\.co_zsqyyUdIfE@www\\.mymusicsearch\\.co)|(mynetspeedco@www\\.mynetspeed\\.co)|(MySearchTab\\.co_QXqKBErWIz@www\\.mysearchtab\\.co)|(Net_Speed_bfa1870197a5380d1f00708341444fe4@www\\.testnetspeed\\.co)|(Net_Speed_f61989f67aeb3c5ed6180f49b2160ea1@www\\.net-speed\\.co)|(Net_Speed_imtTaleZMk@www\\.net-speed\\.co))$/","prefs":[],"schema":1576758309063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3e1bff4-2e6a-4a7f-a1e3-f7eff451655b","last_modified":1576771657076},{"guid":"/^((Net_Speed_Ninja_rJSmpzPQRq@www\\.netspeedninja\\.co)|(Net_Speed_nYAhXCpaOF@www\\.testnetspeed\\.co)|(Net_Speed_Plus_MnPDDtnfZh@www\\.checkmyspeednownt\\.com)|(Net_Speed_Test_b419d25436f7b7cb3458407498bae21f@www\\.netspeedtesthub\\.com)|(Net_Speed_Test_Hub_OOlSMbcwOe@netspeedtesthub\\.com)|(Net_Speedtest_8e202a4f66675f188c265a8ef11e47fa@www\\.netspeedtest\\.co)|(Net_Speedtest_clone_ikAadlLvLs@www\\.netspeedtest\\.co)|(Net_Speedtest_ysCFtRLxZn@www\\.netspeedtest\\.co)|(NetSpeedCalculator\\.net_mzMnaouenc@www\\.netspeedcalculator\\.net)|(netspeedproco@www\\.netspeedpro\\.co)|(New_Jobs_Quest_8f6247b00ffc5b1bb2f3f30fc73a9de5@www\\.newjobsquest\\.co)|(News__Precinct_75018cea70cf57e0ab66d312ef3a769d@www\\.newsprecinct\\.com)|(News__Precinct_sggnBoSvRu@www\\.newsprecinct\\.com)|(News_Daily_UBtJmysrDA@www\\.newstrackrnt\\.co)|(News_Headlines_bKwUmAeFcG@www\\.newsheadlinespro\\.com)|(News_Headlines_f70874554c3c22b5fec6f98e845d9b4d@www\\.newsheadlinespro\\.com)|(News_Headlines_SfZxlPzEgN@www\\.newsheadlinespro\\.com)|(News_Precinct_05544a082b3c01a286c66f7cf4251700@www\\.newsprecinct\\.com)|(News_Precinct_clone_5cd166a363627a7f453b1b69769f436d@www\\.newsprecinct\\.com)|(News_Precinct_clone_NeRHwQGodq@www\\.newsprecinct\\.com)|(News_Precinct_clone_PTdBCNrWPD@www\\.newsprecinct\\.com)|(News_Precinct_dLqSikAjQC@www\\.newsprecinct\\.com)|(News_Precinct_gzVnHZnzOy@www\\.newsprecinct\\.com)|(NewStackr_uNFYKFwAWP@www\\.NewsTackR\\.com)|(NewsTrackr_clone_qKtwLAHfjm@www\\.newstrackr\\.co)|(NewsTrackr_clone_vJczLpOPSO@www\\.newstrackr\\.co)|(NewsTrackr_e1032761f4eb1beb126fdface070fb37@www\\.newstrackr\\.co)|(NewsTrackr_iDEHLRYWqj@www\\.newstrackr\\.co)|(NewsTrackr_ZtEQVEonqX@www\\.newstrackr\\.co)|(newsupdatesinnet@www\\.newsupdates\\.in\\.net)|(no_EzdEKVkeZk@www\\.test10\\.com)|(Online_Coupon_Finder_njhVhBdgcg@onlinecoupon-finder\\.co)|(Online_Coupon_Finder_QuNkIQQUVz@www\\.onlinecouponfinder\\.net)|(Online_Coupon_Finder_SZuYIubYMN@www\\.onlinecouponfinder\\.net)|(Online_Doc_Converter_7d7d0b74adad02f39590d705822a70e2@www\\.onlinedocconverter\\.com)|(Online_Doc_Converter_qpIkrHZegO@www\\.onlinedocconverter\\.com)|(Online_Document_Converter_clone_xZguXlOjJE@www\\.convertmypdf\\.co)|(Online_Package_Tracker_TNAcobvKgm@onlinepackagetracker\\.co)|(Online_PDF_Converter_aJsvvVEBaO@www\\.myonlinepdfconverter\\.net)|(Online_PDF_Converter_kxVNqagGZG@myonlinepdfconverter\\.com)|(Online_Recipe_RURMecAQzt@www\\.onlinerecipe\\.co)|(Online_Recipe_VNtLUGYjpI@www\\.onlinerecipe\\.co)|(Online_Speed_Radar_clone_YlZLvnSGjM@www\\.onlinespeedradar\\.com)|(Online_Web_Search_clone_WjoqJJklvS@www\\.onlinewebsearch\\.co)|(Online_Web_Search_d1b9b3e703905b67931858f6f5aecdca@www\\.onlinewebsearch\\.co)|(OnlineRecipeSearch\\.info_pEdBAUaqCR@www\\.onlinerecipesearch\\.info)|(Package_Trace_JOGQGobPMj@www\\.trackpackagequicknt\\.com)|(Package_Tracker_02a37a57871ec5b57a0555403157dcf8@www\\.package-tracker\\.co)|(Package_Tracker_07a2a700968a7da88eb77b9c46279b1c@www\\.dailypackagetracker\\.com)|(Package_Tracker_3ce363c30f45ee0016862ac499be7ff5@www\\.packagetrackeronline\\.com)|(Package_Tracker_698579ac9c231e14ca69e1894f353396@www\\.dailypackagetracker\\.com\\.disabled)|(Package_Tracker_75a19df973eae7cf6e19c396c3973451@www\\.package-tracker\\.co)|(Package_Tracker_clone_FNZBehhrfr@www\\.package-tracker\\.co)|(Package_Tracker_EOXBmHOBkZ@www\\.package-tracker\\.co)|(Package_Tracker_Express_clone_cbOTQhTNgs@www\\.packagetrackerexpress\\.com)|(Package_Tracker_Express_ZxaTHkYQxF@www\\.packagetrackerexpress\\.com)|(Package_Tracker_fd87086da3f36037204f4b0bf23f1ea1@www\\.package-tracker\\.co)|(Package_Tracker_HaMksfdhUi@www\\.dailypackagetracker\\.com)|(Package_Tracker_Hub_clone_cfdJxpAmIT@www\\.packagetrackerhub\\.com)|(Package_Tracker_Hub_EreNcpVUoK@www\\.packagetrackerhub\\.com)|(Package_Tracker_kaiHEFsqvp@www\\.ThePackageTrack\\.com)|(Package_Tracker_KwwfXjTWsn@www\\.package-tracker\\.co)|(Package_Tracker_OHnRIWuvmH@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_b49f3fc69d90679955379dab26b2a6fa@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_cleZBgkKxj@www\\.packagetrackeronline\\.com)|(Package_Tracker_Online_EmvHhroAmG@www\\.packagetrackeronline\\.com)|(Package_Tracker_QYmRTqNSxY@www\\.getpackagetracker\\.com)|(Package_Tracker_Tab_50fa581c36cad6995f117782f5105636@www\\.packagetrackertab\\.com))$/","prefs":[],"schema":1576758357512,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bc321ad-e23b-4ed3-86bf-a1a3a38fbf75","last_modified":1576771657072},{"guid":"/^((Package_Tracker_yJbpZEQECr@www\\.package-tracker\\.co)|(packagefollowercom@www\\.packagefollower\\.com)|(PDF_Converter_AQpxoneXlZ@www\\.pdf-convertn\\.co)|(PDF_Converter_Plus_ZgLTNbAZUb@www\\.pdfconverterplus\\.com)|(PDF_Pro_Converter_eTqIXytHWq@www\\.pdfproconverter\\.com)|(Pets_Wallpapers_SKWDasMHYY@petswallpapers\\.net)|(phototab@www\\.wallpaperonlinepro\\.com)|(Premier_Search_clone_CcAEnLGkmK@www\\.premiersearch\\.co)|(Premier_Search_clone_wfigyWtsdL@www\\.premiersearch\\.co)|(Privacy-Search\\.biz_cXHpGjbGct@www\\.privacy-search\\.biz)|(Privacy-Search\\.club_fNwUjmGvkM@www\\.privacy-search\\.club)|(Privacy-Search\\.company_gzqnuNM@www\\.privacy-search\\.company)|(Privacy-Search\\.in\\.net_UdIeydXEbw@www\\.privacy-search\\.in\\.net)|(Privacy-Search\\.info_BzTWanpKDM@www\\.privacy-search\\.info)|(Privacy-Search\\.link_DATRCktqwk@www\\.privacy-search\\.link)|(Privacy-Search\\.one_NPLmbtQaBI@www\\.privacy-search\\.one\\.disabled\\.com)|(Privacy-Search\\.online_PwQLiKaWGq@www\\.privacy-search\\.online)|(Privacy-Search\\.site_zYtZQgkEtf@www\\.privacy-search\\.site)|(Privacy-Search\\.space_AjqewVnBVW@www\\.privacy-search\\.space)|(Privacy-Search\\.store_vNAqbjRGGn@www\\.privacy-search\\.store)|(Privacy-Search\\.today_NRVdCCeOIa@www\\.privacy-search\\.today)|(Privacy-Search\\.website_JwizWmtjPu@www\\.privacy-search\\.website)|(Privacy-Search\\.xyz_clone_juEABfQNOl@www\\.privacy-search\\.xyz)|(Privacy-Search\\.xyz_elSDqUATPt@www\\.privacy-search\\.xyz\\.disabled\\.com)|(Privacy-Search\\.xyz_oIkblTLPSN@www\\.privacy-search\\.xyz)|(PrivacySearch\\.biz_bAwIbiJVAP@www\\.privacysearch\\.biz)|(PrivacySearch\\.club_MRWkilEqOZ@www\\.privacysearch\\.club)|(PrivacySearch\\.company_hOwSWgQKdn@www\\.privacysearch\\.company\\.disabled\\.com)|(PrivacySearch\\.company_NAKTVsEmEC@www\\.privacysearch\\.company)|(PrivacySearch\\.in\\.net_NxaHlhdTlz@www\\.privacysearch\\.in\\.net)|(PrivacySearch\\.link_EOhtykDnGr@www\\.privacysearch\\.link)|(PrivacySearch\\.me_QSSIQcOMtH@www\\.privacysearch\\.me)|(PrivacySearch\\.one_WUIHjcIjXh@www\\.privacysearch\\.one)|(PrivacySearch\\.one_zOkggTAokc@www\\.privacy-search\\.one)|(PrivacySearch\\.online_CYiUatShgl@www\\.privacysearch\\.online)|(PrivacySearch\\.space_YagHPcSikB@www\\.privacysearch\\.space)|(PrivacySearch\\.store_pJBFyyaDRx@www\\.privacysearch\\.store)|(PrivacySearch\\.website_cGZdtKrFao@www\\.privacysearch\\.website)|(PrivacySearch\\.xyz_ZEUMZLHcqv@www\\.privacysearch\\.xyz)|(privacysearchco_xXdgBRl@info\\.privacysearch\\.co)|(privacysearchco@info\\.privacysearch\\.co)|(PrivateSearchOnline\\.com_IhKdmYiVeK@info\\.privatesearchonline\\.com)|(Pro_Games_Online_HVwluXulrt@www\\.progamesonline\\.co)|(Puppies_World_trFanlsdqu@www\\.puppiesworld\\.info)|(Puppy_Wallpapers_ZOWpJDLXFj@www\\.puppywallpapers\\.net)|(Quick_Career_Search_WDeLsGajVb@www\\.quickcareersearch\\.co)|(Quick_Daily_Mail_SKeVfXlhFp@www\\.quickdailymail\\.com)|(Quick_Email_App_EFITirXRRs@www\\.quickemailapp\\.com)|(Quick_Email_Checker_7796dc8c3c9cde3502870b6054bb34db@www\\.quickmailchecker\\.com)|(Quick_Email_Checker_BQerPmohdb@www\\.quickmailchecker\\.com)|(Quick_Map_Tab_98eb6af566aadaea6dae58aa6d841a70@www\\.quickmaptab\\.com)|(Quick_Map_Tab_IJTJmbzNOx@www\\.quickmaptab\\.com)|(Quick_Maps_clone_hIZNOOMdWQ@www\\.getquickmaps\\.com)|(Quick_Maps_clone_xRcOZiPvYl@www\\.getquickmaps\\.com)|(Quick_Maps_Online_7bcf0c280d92934d11d0b449980a1937@www\\.quickmapsonline\\.com)|(Quick_Maps_Online_QKDpNHmDpD@www\\.quickmapsonline\\.com)|(Quick_Maps_pjWqGYHPRE@www\\.getquickmaps\\.com)|(Quick_Online_Directions_0364feaec027aaab80a920e79ac1800c@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_8cfe33dcf14406257fca53f436aad1ff@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_bFKYEkYGUO@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_JcSWuSfSrw@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_clone_qswqvmCxux@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_d922039a0497633824e490148707ca71@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_eddee69bb3984d22264d57b63e6f0115@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_OFYSSUWMOH@www\\.quickonlinedirections\\.com)|(Quick_Online_Directions_Test_gbFqFQwwaZ@www\\.quickonlinedirections\\.com)|(Quick_Recipe_Search_QumKWdGMdB@www\\.quickrecipesearch\\.today)|(Quick_Search_Tab_Cbzrnmuqub@www\\.quicksearchtab\\.co))$/","prefs":[],"schema":1576758405945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"402be073-072f-44d7-a557-7c98914dc0da","last_modified":1576771657067},{"guid":"/^((Quick_Speed_Checker_09b7f7d1acd76f23f1d887e60ddcc474@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_3db2cd8f8f3e192f57ca83da50451660@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_clone_bhRDSCySFq@www\\.quickspeedchecker\\.com)|(Quick_Speed_Checker_sqZXXzzpsT@www\\.quickspeedchecker\\.com)|(Quick_Weather_Forecast_IHOnRApsey@www\\.quickweatherforecast\\.com)|(Quick_Weather_Updates_6277aeb2d83428ca469904f0886e0938@www\\.quickweatherupdates\\.com)|(Quick_Weather_Updates_yieimwNJEx@www\\.quickweatherupdates\\.com)|(QuickNews\\.co_vZLHaiMlVV@www\\.quicknews\\.co)|(QuickRecipeSearch\\.co_hqhPDvuKrF@www\\.quickrecipesearch\\.co)|(qwertyuiopasdf@www\\.xyz\\.com)|(Radio_Hub_Online_YfJreNCpww@www\\.radiohubonline\\.com)|(rakshitchoudhary8@gmail\\.com)|(rakshitchoudhary8@gmail\\.om)|(Recipe_Board_Plus_7484a472b0b409e4895321bdd72e1945@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_f92fd9f713f932491e785a977401bb7c@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_gpeHSqIYiT@www\\.recipeboardplus\\.com)|(Recipe_Board_Plus_hYpxDyhZpP@www\\.myrecipeguideonline\\.com)|(Recipe_Board_Plus_pfyXDonFTr@www\\.recipeboardplus\\.com)|(Recipe_Book_Search_d62d1a871fc0f1d38ecf6b7653ae688b@www\\.recipebooksearch\\.com)|(Recipe_Book_Search_MRJMOtSRZt@www\\.recipebooksearch\\.com)|(Recipe_Book_Tab_3deea22a93f8e99342510c9cb16ccdf4@www\\.recipebooktab\\.com)|(Recipe_Guide_Plus_41c1f7d66a164e59a4721902d4a0a6c5@www\\.recipeguideplus\\.com)|(Recipe_Guide_Plus_dHGfHpqpFD@www\\.recipeguideplus\\.com)|(Recipe_Online_gwFoqximpy@www\\.recipeonline\\.net\\.test)|(Recipe_Search_Guide_e1d73ceb736fe3f0cf7b0da6063a92b3@www\\.recipesearchguide\\.com)|(Recipe_Search_Guide_mbFGBVqpia@www\\.recipesearchguide\\.com)|(Recipe_Search_Plus_5bc244154d5ed1b0fa3e2ff8e788ddbd@www\\.recipesearchplus\\.com)|(Recipe_Search_Plus_FxKIeZgMHD@www\\.recipesearchplus\\.com)|(Recipes_by_Alot_klEAJdojHM@www\\.mydailyrecipes\\.co)|(sahil@searchprivacy\\.co)|(Satellite_Maps_Now_aPVhlrXyLu@www\\.satellitemapsnow\\.com)|(Say_Rosary_7fbf455ac8a8d9319ec8e9c888bbc8f0@www\\.sayrosary\\.com)|(Say_Rosary_IoTPeJHVYN@www\\.sayrosary\\.com)|(Search_Anonymous_3914bca7a10a50db91f284a844eeec2f@www\\.searchanonymous\\.co)|(Search_Anonymous_kHrtzTbIUW@www\\.searchanonymous\\.co)|(Search_Atlas_8c11f710a756258b85fce73f36080a00@www\\.searchatlas\\.co)|(Search_Atlas_a65471976592d8afb32ab1d355329f4f@www\\.searchatlas\\.co)|(Search_Atlas_fgPWjhrMII@www\\.searchatlas\\.co)|(Search_Atlas_JvMkNyzBew@www\\.searchatlas\\.co)|(Search_Beacon_App_eqehzqftmN@www\\.searchbeaconapp\\.com)|(Search_Center_clone_jwMueYZfAC@www\\.searchcenter\\.co)|(Search_Central_c4359af19cd8d0828733d75832e3bb87@www\\.searchcentral\\.co)|(Search_Direct_Pro_qkzlUJiGov@www\\.searchdirectpro\\.com)|(Search_Easy_008d08b3ff05afbcae6df5b92296a6d0@www\\.search-easy\\.co)|(Search_Easy_Go_577387e8b765f721486040e639398c71@www\\.searcheasygo\\.com)|(Search_Easy_Go_80d5131cc8b26c5c4af3f4aa83886f7f@www\\.searcheasygo\\.com)|(Search_Easy_Go_AvYrOIFWDF@www\\.searcheasygo\\.com)|(Search_Easy_Hub_2f45453af53121c146d7bf5c3dd914c3@www\\.searcheasyhub\\.com)|(Search_Easy_kDZUkxUbSP@www\\.search-easy\\.co)|(Search_Easy_Plus_3f7d63b42346d0eb02176aa32f33b9a4@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8965c3185ad17bdd1c759078bcde92f0@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8d7d969cf1d24004447fa0066e4dfd02@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_8f70d67adfbdd9aa623aa2057efffc8b@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_9e6663ee2c4803fe1e7bf20b90f26e96@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_aMOxRncWIJ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_cdb1d9b83ae0801f912e8b73cac0836f@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dedOWbqqXd@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_DHIlDaCkwl@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_dWFEmfADcn@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_eRdOVuRKeX@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_HlNUDYUqua@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_njXAdPCyfZ@www\\.searcheasyplus\\.com)|(Search_Easy_Plus_rrXYlzwRaJ@www\\.searcheasyplus\\.com)|(Search_Easy_Pro_20670965804c5d16d21370f657dcdca0@www\\.searcheasypro\\.com)|(Search_Easy_Pro_73aa350eceb1758d88bd3edb17b26a95@www\\.searcheasypro\\.com)|(Search_Easy_Pro_VDbJUdDuEi@www\\.searcheasypro\\.com)|(Search_Easy_Web_ad43024621fcd724bf50596e41f6852f@www\\.searcheasyweb\\.com))$/","prefs":[],"schema":1576758467216,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0054d00-739f-43e5-a6a4-22a56fd09844","last_modified":1576771657063},{"guid":"/^((Search_Easy_Web_tvqEdWRwUI@www\\.searcheasyweb\\.com)|(Search_Express_CgqiRHXtYw@www\\.yoursearchexpress\\.com)|(Search_For_Maps_gLRdugmyXV@www\\.search-maps\\.net)|(Search_Plus_090a3f242292c36b80d33fd7e48aeb84@www\\.search-plus\\.co)|(Search_Plus_App_2d6fef8895df8a9a67c9bd3b15438abf@www\\.searchplusapp\\.com)|(Search_Plus_App_zZmjIdjudH@www\\.searchplusapp\\.com)|(Search_Plus_lPNIzNDSuX@www\\.search-plus\\.co)|(Search_Plus_Now_04ba3f2b13d728af94433e016d46239d@www\\.searchplusnow\\.com)|(Search_Plus_Now_312928a70ba3909e221b0524753bf126@www\\.weatherforecasttracker\\.com)|(Search_Plus_Now_7a64f4abfa7dba3075cabf9896c8fa19@www\\.searchplusnow\\.com)|(Search_Plus_Now_81c0506ff8d40fb8a7daa44222962215@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_sgREjdpaZx@www\\.searchplusnow\\.com)|(Search_Plus_Now_clone_SMpbwlnYxa@www\\.searchplusnow\\.com)|(Search_Plus_Now_fuKTpdNeOn@www\\.mapmytravel\\.co)|(Search_Plus_Now_RUxZwdNBtU@www\\.searchplusnow\\.com)|(Search_Plus_Now_YQIFAskSvi@www\\.weatherforecasttracker\\.com)|(Search_Plus_Pro_248f4aa071807a8d8f35bf57aef7b217@www\\.mapmytravel\\.co)|(Search_Plus_Pro_c5202d6e9fff0fb53512d681772f0244@www\\.searchpluspro\\.com)|(Search_Plus_Pro_cBmYtdkkFb@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_egAEtDTMkX@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_KRXJEhDHND@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_odzZVUScjD@www\\.searchpluspro\\.com)|(Search_Plus_Pro_clone_SpGuCbnjPE@www\\.searchpluspro\\.com)|(Search_Plus_Pro_d67fb2263b88d9d41bae10a6e2ae855b@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f7d126d7141628c1b739c58997b082b2@www\\.searchpluspro\\.com)|(Search_Plus_Pro_f889c071fa2a90062f8eeb4e7fd56db6@disable\\.searchpluspro\\.com)|(Search_Plus_Pro_fab7d78fa6444068be71b39db91e15ff@www\\.searchpluspro\\.com)|(Search_Privacy_clone_ozOdXpYKTM@www\\.search-privacy\\.live)|(Search_Privacy_clone_UDbsERGbgS@www\\.privacysearch\\.news)|(Search_Privacy_dIeFDdYUHg@www\\.searchprivacy\\.xyz)|(Search_Privacy_dKaGZWBFIM@www\\.searchprivacy\\.today)|(Search_Privacy_jpagAkMKvy@www\\.search-privacy\\.today)|(Search_Privacy_llZnkTGcOa@www\\.searchprivacy\\.today)|(Search_Privacy_naGfXaprzJ@info\\.searchprivacy\\.co)|(Search_Privacy_PQZCFxQkZX@www\\.privacysearch\\.news)|(Search_Privacy_qUxDJagEVN@www\\.searchprivacy\\.live)|(Search_Privacy_uVBxmwGLSk@www\\.privacy-search\\.works)|(Search_Privacy_wZVkQUHrHw@www\\.privacysearch\\.live)|(Search_Privacy_ZpneZaXeZp@www\\.search-privacy\\.live)|(Search_Privacy_ZvcIJuofJd@www\\.privacy-search\\.org)|(Search_Recipe_Pro_c299176cc8e5b03509bc091d92718516@www\\.searchrecipepro\\.com)|(search_Recipe_Pro_hZSnuXpHlI@www\\.searchrecipepro\\.com)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42f@www\\.searchsecure\\.co)|(Search_Secure_5fe09050cfe3944c0782c53e6aead42fhsadghs@www\\.searchsecure\\.co)|(Search_Secure_clone_haBhKCwJbD_34@www\\.searchsecurepro\\.co)|(Search_Secure_clone_haBhKCwJbD1@www\\.searchsecurepro\\.co)|(Search_Secure_PUhUZXSDqx@www\\.searchsecure\\.co)|(Search_Select_804ce00595966fa5ced4efb6e0919d6f@www\\.searchselect\\.co)|(Search_Select_FQCSJqYZdP@www\\.searchselect\\.co)|(Search_Voyager_91c3275d156ab7272e24590b4f7f49d6@www\\.searchvoyager\\.co)|(Search_Voyager_PgzBPOqQhh@www\\.searchvoyager\\.co)|(search-movie\\.net_cURRAPTBgN@www\\.search-movie\\.net)|(search-movie\\.online_PqiotXlNOM@www\\.search-movie\\.online)|(search-movie\\.today_jpmWHncsRI@www\\.search-movie\\.today)|(Search-Privacy\\.biz_ZPdXCSGFgO@www\\.search-privacy\\.biz)|(Search-Privacy\\.club_CtlbxhsuVt@info\\.search-privacy\\.club)|(Search-Privacy\\.desi_AdRXpDarGi@info\\.search-privacy\\.desi)|(Search-Privacy\\.in\\.net_WibIleNEHx@info\\.search-privacy\\.in\\.net)|(Search-Privacy\\.info_rsNLqucdiG@info\\.search-privacy\\.info)|(Search-Privacy\\.link_wDxGmBgqcl@www\\.search-privacy\\.link)|(Search-Privacy\\.me_AvAriQFEhU@www\\.search-privacy\\.me)|(Search-Privacy\\.net_nWVLWwvLtN@www\\.search-privacy\\.net)|(Search-Privacy\\.online_cYKHeBuuMA@www\\.search-privacy\\.online)|(Search-Privacy\\.org_HWNXCRCnGt@info\\.search-privacy\\.org)|(Search-Privacy\\.site_qacnidOLmc@www\\.search-privacy\\.site)|(Search-Privacy\\.space_FjfWuiGHqH@info\\.search-privacy\\.space)|(Search-Privacy\\.store_xyaGgMqtWA@www\\.search-privacy\\.store)|(Search-Privacy\\.website_smicMDEmxB@www\\.search-privacy\\.website)|(Search-Privacy\\.xyz_gBlCbCGBMh@info\\.search-privacy\\.xyz))$/","prefs":[],"schema":1576758508310,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4f75a73b-1541-4d50-b7c7-4d3524619899","last_modified":1576771657059},{"guid":"/^((Search-Tab\\.net_qpBMgxRRKX@www\\.search-tab\\.net)|(searchmovie\\.today_rRBhPdnLIB@www\\.searchmovie\\.today)|(SearchPrivacy\\.Biz_TQxQMmZjax@info\\.searchprivacy\\.biz)|(SearchPrivacy\\.club_sbgzeaMJld@info\\.searchprivacy\\.club)|(SearchPrivacy\\.company_lbwegvHahG@www\\.searchprivacy\\.company)|(SearchPrivacy\\.in\\.net_ozDwuJlbCG@info\\.searchprivacy\\.in\\.net)|(SearchPrivacy\\.Info_zDsfyaIpyx@info\\.searchprivacy\\.info)|(SearchPrivacy\\.link_MEIDSFxuIf@www\\.searchprivacy\\.link)|(SearchPrivacy\\.me_SHWxbNO@info\\.searchprivacy\\.me)|(SearchPrivacy\\.one_JRipaiPyZz@www\\.searchprivacy\\.one)|(SearchPrivacy\\.space_AJTsgDwydV@info\\.searchprivacy\\.space)|(SearchPrivacy\\.store_NqrJweiCoL@www\\.searchprivacy\\.store)|(SearchPrivacy\\.website_EYeCzNtENe@www\\.searchprivacy\\.website)|(searchprivacy@searchprivacy\\.co)|(searchprivacyco@info\\.search-privacy\\.co)|(searchprivacydemo@searchprivacy\\.co)|(SearchSafe_cmZnrUyIXL@www\\.searchsafe\\.site)|(SearchSafe\\.online_bTqWKNIadp@www\\.searchsafe\\.online)|(SearchSafe\\.website_NFNXBQxRPA@www\\.searchsafe\\.website)|(searchsafee_VRAYffGolz@staging\\.findmaps\\.co)|(SearchTab\\.co_bEVNcWEgQN@www\\.searchtab\\.co)|(SearchTab\\.online_gZFeDEkoQl@www\\.searchtab\\.online)|(Severe_Weather_Check_51c60f3de3995f14f71373a70593618c@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_bcb8c4ad7063c40e0e5b2d0f64ba11a5@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_joZdMWExSs@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_VlvXXiHGHD@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_clone_xBNchBtncq@www\\.severeweathercheck\\.com)|(Severe_Weather_Check_muRAWnsLSV@www\\.severeweathercheck\\.com)|(Single_Login_pHoBMgvLtK@single\\.login\\.com)|(Smart_-_Search_cQYvhxQOuG@www\\.EasyOnlineRecipe\\.net)|(SMART_-_SEARCH_hYubbcgBlB@www\\.netspeedcalculator\\.net)|(Smart_File_Converter_clone_BVgFKwVsaS@www\\.smartfileconverter\\.com)|(Smart_File_Converter_IasnkilxwD@www\\.smartfileconverter\\.com)|(Smart_Package_Tracker_06309abe3838d3a65fcbc43e2958851e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_1e9ff4a4ee10df2fb289180d5bb635bb@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_705864a844f3d8d84a5aecba1f675809@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_9ef0b4fcd24ee214476e73afb6adbb2e@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_bfc6ce01ede9446711a752c034df59c4@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_KVsdeebRuB@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_OvvQZsPtpR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_SRguaqnzXn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_XRHzsWuwOn@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_yPTsguhReR@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_clone_ZxioLKlnOD@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_db3d13974ca0682b514ad40e0f1fc682@www\\.smartpackagetracker\\.com)|(Smart_Package_Tracker_jqLcWhCacs@www\\.smartpackagetracker\\.com)|(Smart_Search_05fc1caf5755ccc74a092042913cbbda@www\\.finddirections\\.co)|(Smart_Search_10751eb8462a19515e0f9f1525333d1d@www\\.game-quest\\.co)|(Smart_Search_118237f18afcc2ce76539a9d1e015bc2@www\\.dailygame\\.online)|(Smart_Search_13d2b5842a0358c117dd87411a84db0d@www\\.convertfilesonline\\.co)|(Smart_Search_2160f8e9f48a63f3d9d7a019b9a5c53d@www\\.finddirections\\.co)|(Smart_Search_2834376aee173a89462511cf3ae21633@www\\.dailyrecipesearch\\.net)|(Smart_Search_287a4b04b4dca219a02375ca2f6a4985@www\\.finddailycoupons\\.com)|(Smart_Search_3f36608d872e4e46edd8b4e57902e6bd@www\\.dailyrecipesearch\\.net)|(Smart_Search_5cad449f0283b0b10b9cd78472de5c54@www\\.finddirections\\.co)|(Smart_Search_69eb8884d7d2e0aabdad154644e38401@www\\.convertmyfile\\.co)|(Smart_Search_6a0b26a582308b0dd9ae82634ccfe6f7@www\\.localweathertoday\\.net)|(Smart_Search_77710b6943d36049c1b72d9035a63379@www\\.localweathertoday\\.net)|(Smart_Search_7f90cdefd25d69c792d02cec7763b41d@www\\.finddirections\\.co)|(Smart_Search_814229d05c1e81d4ce1e73a3ca7c3eaa@www\\.smartsearchnow\\.co)|(Smart_Search_94fb06cfccd5d4112f555fb00a1b38ec@www\\.finddirections\\.co)|(Smart_Search_a1e27539ac89c70a170688ee375c5426@www\\.finddailycoupons\\.com)|(Smart_Search_a98fb26ee015d18ad91a68c7124e1f30@www\\.get-news\\.co)|(Smart_Search_abeJBrRXlb@www\\.smart-search\\.one))$/","prefs":[],"schema":1576758534450,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"24adcec0-6f62-41bd-9e13-97895838bf64","last_modified":1576771657055},{"guid":"/^((Smart_Search_aKLddQIYMY@www\\.gamesdaily\\.online)|(Smart_Search_aQBxkbfpqq@www\\.finddirections\\.co)|(Smart_Search_aStviFIoor@www\\.finddirections\\.co)|(Smart_Search_aTGazruEUE@www\\.search-smart\\.co)|(Smart_Search_ayroufrtQb@www\\.finddirections\\.co)|(Smart_Search_b08c081d9f06123fb6172679fdf4fcb6@www\\.finddirections\\.co)|(Smart_Search_b859bcf9fb977dc2076199076b2f9081@www\\.convertmyfile\\.co)|(Smart_Search_bbgycNKlXh@www\\.dailyjobssearch\\.net)|(Smart_Search_bdDgpqbSTU@www\\.smartsearchnow\\.co)|(Smart_Search_bnnlTJEfCZ@www\\.search-smart\\.live)|(Smart_Search_BWMiEUiCaH-my@www\\.findmaps\\.co)|(Smart_Search_BWMiEUiCaH@www\\.findmaps\\.co)|(Smart_Search_c14750a49aa2937ede499b641a6c4390@www\\.finddirections\\.co)|(Smart_Search_cb20a26ab1dc76cc9f793fb975be4b02@www\\.smartsearchnow\\.co)|(Smart_Search_cFSWRyjwef@www\\.smart-search\\.today)|(Smart_Search_chUMEQmsSU@www\\.finddirections\\.co)|(Smart_Search_CIWmtesCzJ@www\\.mycouponstore\\.co)|(Smart_Search_cKezTfCPJB@www\\.checkmaps\\.live)|(Smart_Search_cKnSYkYtgM@www\\.check-yourmail\\.co)|(Smart_Search_clone_bZjlXmDRQB@www\\.finddirections\\.co)|(Smart_Search_clone_duXXvsUEtZ@www\\.finddirections\\.co)|(Smart_Search_clone_EQDmJygWxO@www\\.searchsmart\\.online)|(Smart_Search_clone_ETXwzVYwpI@www\\.search-smart\\.work)|(Smart_Search_clone_HsJXCDiNNC@www\\.smartsearch\\.link)|(Smart_Search_clone_JxJqcLVLOv@www\\.finddirections\\.co)|(Smart_Search_clone_SoSaSQDKGZ@www\\.dailyrecipesearch\\.net)|(Smart_Search_CQbLIZDIOl@www\\.smartsearch\\.link)|(Smart_Search_CxIpAXIPVs@www\\.smart-search\\.co)|(Smart_Search_d0f38b4ff2f0e788c442249a857e4dde@www\\.finddirections\\.co)|(Smart_Search_d16ea913837e848252ad5d856d9c8b02@www\\.dailyjobssearch\\.net)|(Smart_Search_d8982f2dae25e7422cc1392ccf974d04@www\\.dailyrecipesearch\\.net)|(Smart_Search_da3cc67017bdcd720cbd7fc26f24d743@www\\.check-yourmail\\.co)|(Smart_Search_dcf5af05538a3c68edd4625c7f0d2dc4@www\\.finddailycoupons\\.com)|(Smart_Search_DLsAIStnQX@www\\.smartsearch\\.link)|(Smart_Search_dTBjWAGKlN@www\\.testnetspeed\\.co)|(Smart_Search_e34c59b523a7a1585da696e4576b101c@www\\.gamesdaily\\.online)|(Smart_Search_e6d57c56077122ca0bcef12a39e3f6a3@www\\.localweathertoday\\.net)|(Smart_Search_ea5e7bb722049dd11af40116816edee3@disable\\.convertmyfile\\.co)|(Smart_Search_EkAoOFUJwV@www\\.games-daily\\.co)|(Smart_Search_eMDQwPVVyj@www\\.search-smart\\.co)|(Smart_Search_f377b2bb34f42cbb572c36d9bfb3d9c3@www\\.finddirections\\.co)|(Smart_Search_fbd05acb7ab6331297e367f816ff0a20@www\\.testnetspeed\\.co)|(Smart_Search_FCphmgFrTz@www\\.finddailygames\\.co)|(Smart_Search_FMxybFLCfE@www\\.smart-search\\.today)|(Smart_Search_gGkCXJUDEH@www\\.game-quest\\.co)|(Smart_Search_HnEqPdzcek@www\\.search-smart\\.live)|(Smart_Search_IbBWPmuFLU@www\\.convertfilesonline\\.co)|(Smart_Search_JcpHMeulsq@www\\.dailyrecipesearch\\.net)|(Smart_Search_JJPKAMJWLv@www\\.finddailycoupons\\.com)|(Smart_Search_JTruqraRrz@www\\.localweathertoday\\.net)|(Smart_Search_JViAyYSxof@www\\.search-smart\\.today)|(Smart_Search_KjzSKpViVv@www\\.getmapfinder\\.com)|(Smart_Search_LBQKLuCjDu@www\\.search-smart\\.work)|(Smart_Search_LBUbgBMxrr@www\\.convertmyfile\\.co)|(Smart_Search_lKbvfFvWdq@www\\.finddirections\\.co)|(Smart_Search_LPxWJiUiWP@dailyrecipesearch\\.net)|(Smart_Search_lVYnIBRyYO@www\\.search-smart\\.today)|(Smart_Search_lzlfscclxO@www\\.smartsearch\\.news)|(Smart_Search_mmUSVHTgZN@www\\.searchsmart\\.website)|(Smart_Search_MYlsYAHChr@www\\.search-smart\\.one)|(Smart_Search_OYMxotguWV@www\\.thecoupon-store\\.co)|(Smart_Search_PncWXXrZyE@www\\.get-news\\.co)|(Smart_Search_PxUetfSxfK@www\\.finddirections\\.co)|(Smart_Search_qbdedBcsMV@www\\.mysmartsearch\\.online)|(Smart_Search_QFEtHYupEv@www\\.localweathertoday\\.net)|(Smart_Search_rmcVsyMvUV@www\\.finddailycoupons\\.com)|(Smart_Search_sfQjeIHqAg@www\\.onlinecouponfinder\\.net)|(Smart_Search_SLKIYTovfO@www\\.dailygame\\.online)|(Smart_Search_snYvsooWFZ@www\\.dailycoupons\\.store)|(Smart_Search_SRonsLzSpz@www\\.search-smart\\.link)|(Smart_Search_SUWIUWczzW@www\\.search-smart\\.club)|(Smart_Search_trFxvKvCFp@www\\.dailyrecipesearch\\.net)|(Smart_Search_tTrjAmWOoR@www\\.convertmyfile\\.co)|(Smart_Search_txfWPOCTvy@www\\.finddailycoupons\\.com)|(Smart_Search_UgGHEdLtFf@www\\.search-smart\\.one)|(Smart_Search_UXuBBPZiCD@www\\.search-smart\\.website)|(Smart_Search_VFsgkOxdvk@www\\.convertmyfile\\.co))$/","prefs":[],"schema":1576758569109,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"65197a67-44c8-440d-b22c-26d84b2d763e","last_modified":1576771657051},{"guid":"/^((Templates_Online_clone_UmejRGyzBe@www\\.gettemplatesonline\\.com)|(Templates_Online_clone_WiWqHXsGkm@www\\.gettemplatesonline\\.com)|(Templates_Online_xUPYerdIfL@www\\.gettemplatesonline\\.com)|(test_fhwkrCFoHO@test)|(test_searchprivacy@info\\.searchprivacy\\.info)|(TestFirefoxAddon_ahdBLDcQql@www\\.testfirefoxaddon\\.com)|(testsearchprivacy@info\\.searchprivacy\\.co)|(Text_From_Your_PC_9e43d427bd5cde52e50706cf2ce04da8@www\\.textfromyourpc\\.com)|(Text_From_Your_PC_cBapqdxFhR@www\\.textfromyourpc\\.com)|(The_Coupon_-_Store_ERhPcJTQll@thecoupon-store\\.co)|(The_Coupon_King_1209d556e43b7c529e282d8b8842da76@www\\.thecouponking\\.co)|(The_Coupon_King_lgTjuAddLR@www\\.thecouponking\\.co)|(The_Coupon_King_UwqzosFLgL@www\\.thecouponking\\.com)|(The_Coupon_Store_FuajgfDoOD@www\\.thecouponstore\\.co)|(The_Coupon_Store_lPVGxmIRUf@www\\.thecouponstore\\.co)|(The_Coupon_Store_Test_jkAVapBJTo@www\\.thecouponstore\\.co\\.test)|(The_Coupon_Trail_bdc89c2aeb9eb486945d9f9d80bdbb02@www\\.thecoupontrail\\.com)|(The_Coupon_Trail_MMnMCLSPWo@www\\.thecoupontrail\\.com)|(The_Coupon_Trial_IteRooFtcL@www\\.thecoupontrial\\.com)|(The_Coupons_Daily_efc9df81f19dc213cb2a20067afa4ccb@www\\.thecouponsdaily\\.com)|(The_Coupons_Daily_NAEBGGQbOZ@www\\.thecouponsdaily\\.com)|(The_Coupons_King_cb3ed44aa8013a310be07e3d3fcc4dc2@www\\.thecouponsking\\.co)|(The_Currency_Switch_987755b6cd2466fcb08f71503c38cbfa@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_c80da7ec7cd15c168fc419b3d69aa602@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_e0f313620f09d4dfc50e3a362bac8a9a@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_geyyIAUtgm@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_clone_JZMSasbVPc@www\\.thecurrencyswitch\\.co)|(The_Currency_Switch_QlvIbtxDLF@www\\.thecurrencyswitch\\.co)|(The_Movie_Quest_BPyzyFXOpw@www\\.themoviequest\\.today)|(The_Movie_Search_IgbQnCESAN@www\\.themoviesearch\\.co)|(The_Movie_Search_zFBfJgLeGc@www\\.themoviesearch\\.co)|(The_News_Prompter_e90ebcdb43eb03954526e4576d6c6b71@www\\.thenewsprompter\\.com)|(The_News_Prompter_mbjJOGhbsK@www\\.thenewsprompter\\.com)|(The_Package_Track_9e0db37d4fc02628a9996d9be9ee7ad6@www\\.thepackagetrack\\.com)|(The_Quiz_Tab_xWbNAmFREz@www\\.thequiztab\\.com)|(The_Search_Easy_44e7c2c276e66b66d8bfb874777d4a2e@www\\.thesearcheasy\\.com)|(The_Search_Easy_XObNZOoESy@www\\.thesearcheasy\\.com)|(The_Search_Plus_37976642e8a885a46631002f0051ff23@www\\.thesearch-plus\\.co)|(The_Search_Plus_UawsDpTchY@www\\.thesearch-plus\\.co)|(thecouponstore@www\\.thecoupon-store\\.co)|(TheMovie-Hub\\.net_YezkChdTjo@www\\.themovie-hub\\.net)|(TheMovie-Portal_tPUcBCgXvk_1@www\\.themovie-portal\\.com)|(TheMovie-Portal_tPUcBCgXvk@www\\.themovie-portal\\.com)|(TheMovie-Quest\\.com_wlPrmnAQDs@www\\.themovie-quest\\.com)|(TheMovieQuest\\.co_cORgvNNjpL@www\\.themoviequest\\.co)|(TheMovieQuest\\.co_fQQHMPPCrc@www\\.themoviequest\\.co)|(themoviesearch\\.today_NaQhVgVlwL@www\\.themoviesearch\\.today)|(This_is_my_extension_qZkKGOuZcR@www\\.exampleAMO\\.com)|(This_is_New_AMO_dyIGZrXnWN@www\\.kite\\.com)|(This_is_New_AMO_QVeIjjGbol@www\\.kite\\.com)|(Trace_Packages_f406b9f80935c80df1166017cdb4d6f1@www\\.tracepackages\\.com)|(Track_Daily_News_1eaf6dc15b67e558badb4d0cfe763913@www\\.trackdailynews\\.com)|(Track_Daily_News_6e84f45f079de0ffcc94b2d968db9bee@www\\.trackdailynews\\.com)|(Track_Daily_News_a339167d304bfa5f599a249dda7ce993@www\\.trackdailynews\\.com)|(Track_Daily_News_EIMlViVmYz@www\\.trackdailynews\\.com)|(Track_Daily_News_sCvLoGjBau@www\\.trackdailynews\\.com)|(Track_Flight_Pro_7b52baadaefaac0bc71eaa5d3ffdd62c@www\\.trackflightpro\\.com)|(Track_Flight_Pro_c7f7b664812211123e6c54706eb66c3e@www\\.trackflightpro\\.com)|(Track_Flight_Pro_clone_hNojYqaWwF@www\\.trackflightpro\\.com)|(Track_Flight_Pro_eZAWVNMAAT@www\\.trackflightpro\\.com)|(Track_Package_Pro_clone_xayswwXtnt@www\\.trackpackagepro\\.com)|(Track_Package_Pro_clone_xBtZVauyZo@www\\.trackpackagepro\\.com)|(Track_Package_Pro_KvcoWaXXaa@www\\.trackpackagepro\\.com)|(Track_Package_Quick_525020a307e84998fc7ad8a634296e1d@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_SjXacYcSKg@www\\.trackpackagequick\\.com)|(Track_Package_Quick_clone_zTowhYQtBK@www\\.trackpackagequick\\.com)|(Track_Package_Quick_lFiXdhlnGK@www\\.trackpackagequick\\.com)|(trackthatpackagecom@www\\.trackthatpackage\\.com)|(trailertab@www\\.trailertab\\.co))$/","prefs":[],"schema":1576758629163,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5cd48455-378c-4e67-a37d-8c39d497b4af","last_modified":1576771657042},{"guid":"/^((Translate_cgjqtumrjO@app\\.translate\\.com)|(Travel_Deals_Center_clone_GJNQLATOqW@www\\.traveldealscenter\\.co)|(Travel_Deals_Center_rqctZxkUaz@www\\.traveldealscenter\\.co)|(Travel_Directions_clone_FfMthspRaM@www\\.traveldirections\\.co)|(Travel_Directions_clone_ourIqJKEoa@www\\.traveldirections\\.co)|(Travel_Directions_mvJHkLHMMo@www\\.traveldirections\\.co)|(Tv_Shows_Online_4331a381f3f1b8d9f9f0b56793be73be@www\\.tvshowsonline\\.co)|(Tv_Shows_Online_MpTzgCmWDM@www\\.tvshowsonline\\.co)|(TV_Streaming_Plus_ARhtOdhYyz@www\\.tvstreamingplus\\.co)|(tyghn_EbxtKCSoQf@ghn)|(Universal_Package_Tracker_vEmOcVlKPs@www\\.universalpackagetrackern\\.online)|(Weather_Alert_Pro_BodPvrEWvi@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_clone_sTGOfwOqRV@www\\.weatheralertpro\\.co)|(Weather_Alert_Pro_eAvhNglZrt@www\\.weatheralertpro\\.com)|(Weather_Center_App_06cc2a6dd45345b134670c50b38c8692@www\\.weathercenterapp\\.com)|(Weather_Center_App_edIZBMRKqw@www\\.weathercenterapp\\.com)|(Weather_Center_App_ef684143ed5bb6671446fa504a5feec8@www\\.weathercenterapp\\.com)|(Weather_Center_App_f860fbbefafc691d55516dbf9ff9de42@www\\.weathercenterapp\\.com)|(Weather_Center_App_FCsxbRlcmB@www\\.weathercenterapp\\.com)|(Weather_Center_App_rEbQRyobNS@www\\.weathercenterapp\\.com)|(Weather_Coach_aRmHcdLWxv@www\\.weather-coach\\.com)|(Weather_Coach_cnhVSyfNQb@www\\.weather-coach\\.com)|(Weather_Coach_SdaRyeWHza@www\\.weather-coach\\.com)|(Weather_Details_a74cceec1f4c6974ce48a55da22c4fc8@www\\.weather-details\\.co)|(Weather_Details_clone_WmbTEchnZv@www\\.weather-details\\.today)|(Weather_Details_DBDwBdsiUV@www\\.weather-details\\.online)|(Weather_Details_LZKpPYrFpw@www\\.weather-details\\.today)|(Weather_Details_UMhKKuOmLm@www\\.weather-details)|(Weather_Details_xrNgYMjMud@www\\.weather-details\\.today)|(Weather_Forecast_0c98741392250106567fdcdf92e662ed@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_22873441e62b17d83e57bee8dae28096@disable\\.checkweathernow\\.co)|(Weather_Forecast_26bbf7afaa8ca321d3eb1793eab261eb@www\\.checkweathernow\\.co)|(Weather_Forecast_34a39ecaa08283313fa326a45884233b@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_5432f72204437596f302a717de4410ab@www\\.localweathertoday\\.net)|(Weather_Forecast_5c6a315e6da8023a47a4e247bcd60544@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_5d13ac5f68d80a584ad913b02540fae5@www\\.checkweather\\.today)|(Weather_Forecast_647cf952e5329d490351c5b250e81e54@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_6f6484fab931bf3f3fcf75dfa65adc37@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_7462a90b29dc5f13bb4628cce7d2c6dc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_a4fe2e9e47d66eebd6220e13d10434ef@www\\.checkweathernow\\.co)|(Weather_Forecast_BjIrtPRHri@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_Buddy_hqZFZdAdSe@www\\.weatherforecastbuddy\\.com)|(Weather_Forecast_c27096e498d3541e341f2597fa7124b0@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_c6509e49a9a27bdab9facfb442488a79@www\\.localweathertoday\\.net)|(Weather_Forecast_ca28589b2ca67136318e4bfdf954002d@www\\.checkweathertoday\\.net)|(Weather_Forecast_cbf70b1126d7690bf9180b2e6c43e8f6@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_ChxOzHZcLa@www\\.localweathertoday\\.net)|(Weather_Forecast_clone_60d8346940b46a116579ec1ea3906d5d@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_chFFSZCgvz@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_94a823ffc8bedf3bd1e6ab4465826581@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_apzzlMbkyB@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_clone_f2e4cad9766f8cde8ffbdd484efbdd2b@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_clone_yQjWeYXXXI@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HErKKKDyFS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_HOrAZgjBCz@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_jMGHMuyVVi@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_KYlMwumWQY@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_kyUmeEeefY@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_pDcEnQJDXJ@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_piPIkUDQPc@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_QoJcNyLaQt@www\\.weatherforecasttracker\\.com))$/","prefs":[],"schema":1576758680309,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a083664b-0301-45cd-a2ee-0c690be250b6","last_modified":1576771657038},{"guid":"/^((Weather_Forecast_clone_TSGzGLieya@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_clone_UBimgpjhsm@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_XcnVeRvMca@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_YQnByPToHy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_clone_zkFObDWDhS@www\\.weatherforecasttracker1\\.com)|(Weather_Forecast_Daily_CTzpOZENfa@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_e3838c6031faf63c6209533e71b456c0@www\\.weatherforecastdaily\\.disabled\\.com)|(Weather_Forecast_EnkDNfGxAS@www\\.checkweathernow\\.co)|(Weather_Forecast_epwQJrNJwH@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_eWEHJWtQzM@www\\.checkweathertoday\\.net)|(Weather_Forecast_eWFHhLxmdi@www\\.checkweathernow\\.co)|(Weather_Forecast_f5d79bda8e7d666123f8cff0f49720ab@www\\.localweathertoday\\.net)|(Weather_Forecast_FbozBLKAnT@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_fc107df349d96479678eb88a9d2f58b3@www\\.weatherforecasttracker\\.com)|(Weather_Forecast_KlMFWMEnxo@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_KNdWdwrVBg@www\\.weather-forecast\\.link)|(Weather_Forecast_lESFprnxRC@www\\.checkweathernow\\.co)|(Weather_Forecast_nsdhLSCwEt@www\\.weather-forecast\\.news)|(Weather_Forecast_OMezCgBGlR@www\\.weather-forecast\\.link)|(Weather_Forecast_Plus_81c2ce246488019a54fed798354fbb85@www\\.weatherforecastplus\\.com)|(Weather_Forecast_Plus_WVxlZhsVCn@www\\.weatherforecastplus\\.com)|(Weather_Forecast_QqFyFxILHq@www\\.checkweather\\.today)|(Weather_Forecast_rUPfzmWQNa@www\\.localweathertoday\\.net)|(Weather_Forecast_Search_4f3974a0460bd8947f25b61879196ae6@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_Search_SPAKKzWPua@www\\.weatherforecastsearch\\.com)|(Weather_Forecast_SjMIOdqezy@www\\.weatherforecastdaily\\.com)|(Weather_Forecast_Tab_d586ce62eebca7b5ccd054f645ab3278@www\\.weatherforecasttab\\.com)|(Weather_Forecast_Tab_LHutnjYcaD@www\\.weatherforecasttab\\.com)|(Weather_Forecast_UZnBodXSQY@www\\.localweathertoday\\.net)|(Weather_Forecast_V2_c8e3c1f489201dcee4f10ed13b88423b@www\\.weatherforecasttracker1\\.com)|(Weather_Info_AdPTHnolyR@www\\.weatherinfo\\.live)|(Weather_Info_clone_IylhdngkdZ@www\\.weatherinfo\\.live)|(Weather_Info_clone_LAyJxkrWYr@www\\.weatherinfo\\.live)|(Weather_Info_mYTEbKRsJk@www\\.weatherinfo\\.live)|(Weather_Info_rBUleVUgYg@www\\.weatherinfo\\.today)|(Weather_Info_ZurIhFqkfO@www\\.weatherinfo\\.live)|(Weather_Online_Now_clone_gXBxUraWkz@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_clone_VEajkSqfLm@www\\.weatheronlinenow\\.com)|(Weather_Online_Now_LxMeLWImMw@www\\.weatheronlinenow\\.com)|(Weather_Report_69d519795ecb2edb106cf07b8e5fcbae@www\\.weatherreportlive\\.co)|(Weather_Report_JHDIwuETLZ@www\\.weather-report\\.live)|(Weather_Report_PdxgfapiBL@www\\.weatherreportlive\\.co)|(Weather_Report_WKPqFTsXUk@www\\.weather-report\\.live)|(Weather_Reporter_98959e99f2103eef2d02f3d351ba89b9@www\\.weatherreporter\\.co)|(Weather_Reports_BjGuRgCpLB@www\\.weather-reportsnow\\.com)|(Weather_Reports_c982e1b51cd8bc347ab328410329fbb6@www\\.weatherreports\\.live)|(Weather_Reports_clone_fRjlGYJSnk@www\\.weatherreports\\.live)|(Weather_Reports_clone_NMTTAUMqtY@www\\.dailyweatherreports\\.co)|(Weather_Reports_EQVqqGZdlM@www\\.weather-report\\.link)|(Weather_Reports_HlXmMSuFKX@www\\.weatherreports\\.live)|(Weather_Reports_KDxyqUBBwO@www\\.dailyweatherreports\\.co)|(Weather_Reports_UyzmbxlFVx@www\\.weather-reports\\.today)|(Weather_Reports_xaeygHwNhf@www\\.weatherreports\\.live)|(Weather_Reports_zDpccdTchc@www\\.weatherreports\\.today)|(Weather_Reports_zKYmoRPwNT@www\\.weatherreports\\.live)|(Weather_Tab_Pro_clone_aTBTPSAEUX@www\\.weathertabpro\\.com)|(Weather_Updates_TGBOowTNwY@www\\.weather-updates\\.co)|(Weather-Bee_1b435f4656c8c4f6df6b455cc302cf9b@www\\.weather-bee\\.co)|(Weather-Bee_cbff90268cbc8e1fd65336342cfcf056@www\\.weather-bee\\.co)|(Weather-Bee_deb8c4f31d28d8ef924d8604c528f43b@www\\.weather-bee\\.com)|(Weather-Bee_gFubKNACfC@www\\.weather-bee\\.co)|(Weather-Bee_HyIkcLzmEL@www\\.weather-bee\\.co)|(Weather-Bee_oUeUqEGckY@www\\.weather-bee\\.com)|(WeatherDetails_qGhRPwNzlD@www\\.weatherdetails\\.net)|(Web_Gamer_World_clone_bBqNIFWIiJ@www\\.webgamerworld\\.com)|(Web_Gamer_World_clone_vSvnetvjxh@www\\.webgamerworld\\.com)|(Web_Gamer_World_EnPQSoVMPy@www\\.webgamerworld\\.com))$/","prefs":[],"schema":1576758713481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"86bffc98-7002-4c94-84b1-2036f19f1345","last_modified":1576771657033},{"guid":"/^((WheresMyPackage\\.co_04c5041d404a424ae04b3bdae470bf36@www\\.wheresmypackage\\.co)|(WheresMyPackage\\.co_nkiJdrfSTz@www\\.wheresmypackage\\.co)|(wheresmypackageco@www\\.wheresmypackage\\.co)|(Wonder_Wallpaper_7445d465b196ea5672cf5ddad5121e20@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_86c968090b99d54af67a65a1c6010dc8@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_b3a8885c9af58cc53b837522fbeab5fa@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_BdEgqQaNqI@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_clone_rujWfVzPPf@www\\.wonderwallpaper\\.co)|(Wonder_Wallpaper_XONDNNciYs@www\\.wonderwallpaper\\.co)|(www\\.search-privacy\\.in\\.net_frtQaDOkLW@www\\.search-privacy\\.in\\.net)|(www\\.search-privacy\\.info_hyVgVlpUDh@www\\.search-privacy\\.info)|(Your_Mail_Tab_06f9e0cacb38332e7d67d6f6eb36fbf4@www\\.yourmailtab\\.com)|(Your_Mail_Tab_27811aa670d957af7c67c9b40421db33@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_FFlaTZQUzT@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_kckMtSXzhP@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_rZgtWWxFTE@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_tplYnwtbOB@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_UStpWwUYys@www\\.yourmailtab\\.com)|(Your_Mail_Tab_clone_wQEiyJhcTK@www\\.yourmailtab\\.com)|(Your_Mail_Tab_sHxtuglHxJ@www\\.yourmailtab\\.com)|(Your_Map_Tab_caf5c90424b052d0a732d773f984284d@www\\.yourmaptab\\.com)|(Your_Map_Tab_MGrwdnTuFV@www\\.yourmaptab\\.com)|(Your_Maps_Finder_1cb2c0753a9f2089208e662ff7887eff@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_283a77e3a6a0c1cb4d803b12b7b3f38d@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_299d66c546dc1bf61c2f1ac4a823d848@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_2b2f2c9fdc74da065784a5537d7cbe8a@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_493f8ad05595d053fc466c6d712a0f5b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_5fb3ba7aabc0df0482f721f2b8226c49@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_8ec3602a25914b2b98753c78f3ff0792@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_a4e12e88158bb14fe3f3b23935d1005b@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_clone_KCngJjrrAW@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_CVslhcZliG@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_dfeYIGYOsX@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_gSkAwghnnM@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_HbjLLgCqVI@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IAQSXqZaut@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_IjXrmViPjV@www\\.yourmapsfinder\\.com)|(Your_Maps_Finder_jfCclXiWUZ@www\\.yourmapsfinder\\.com)|(Your_Maps_Guide_gJsxGXyDUk@www\\.yourmapsguide\\.com)|(Your_Recipes_Guide_6e2b67bec168f977b275d2cb8e38cb99@www\\.yourrecipesguide\\.com)|(Your_Recipes_Guide_pjXpEcLtqt@www\\.yourrecipesguide\\.com)|(Yum_Recipe_finder_5de2cc2f278f3bfc1a3715a70c8661f0@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_93a02159e31918ef11d89db653420167@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_AoObYTQNIW@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_c3c1e13d25490ca78859e8857319b432@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_nFKjdQhPjD@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_clone_oIeIcINzWP@www\\.yumrecipefinder\\.com)|(Yum_Recipe_Finder_CqcblSJbqU@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_eb8981fe181afd4e02a57fd9c4b9e8f2@www\\.yumrecipefinder\\.com)|(Yum_Recipe_finder_mgdDNujmFJ@www\\.yumrecipefinder\\.com))$/","prefs":[],"schema":1576758771928,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bfa84d62-24de-474e-bc35-a69b1f46f331","last_modified":1576771657029},{"guid":"/^((@FirefoxUpdate)|(@googledashboard)|(@smash_mov)|(@smash_tv)|(@smashdashboard)|(@smashmovs)|(@smashtvs)|(\\{0be01832-7cce-4457-b8ad-73b743914085\\})|(\\{0e1c683e-9f34-45f1-b365-a283befb471a\\})|(\\{0c72a72d-6b2e-4a0e-8a31-16581176052d\\})|(\\{0ccfc208-8441-4c27-b1cb-799accb04908\\})|(\\{0ede8d39-26f2-49c4-8014-dfc484f54a65\\})|(\\{1fc1f8e6-3575-4a6f-a4d1-c4ca1c36bd2a\\})|(\\{3a1d6607-e6a8-4012-9506-f14cd157c171\\})|(\\{03b3ac4d-59a3-4cc6-aa4d-9b39dd8b3196\\})|(\\{3bb6e889-ac7a-46ca-8eed-45ba4fbe75b5\\})|(\\{3c841114-da8c-44ea-8303-78264edfe60b\\})|(\\{3f3bcb3e-dd73-4410-b102-60a87fcb8323\\})|(\\{3f951165-fd85-42ae-96ef-6ff589a1fe72\\})|(\\{04c86cb3-5f52-4083-9e9a-e322dd02181a\\})|(\\{4d8b44ef-9b8b-4d82-b668-a49648d2749d\\})|(\\{4d25d2b4-6ae7-4a66-abc0-c3fca4cdddf6\\})|(\\{5c9a2eca-2126-4a84-82c0-efbf3d989371\\})|(\\{6ecb9f49-90f0-43a1-8f8a-e809ea4f732b\\})|(\\{6fb8289d-c6c8-4fe5-9a92-7dc6cbf35349\\})|(\\{7fea697d-327c-4d20-80d5-813a6fb26d86\\})|(\\{08a3e913-0bbc-42ba-96d7-3fa16aceccbf\\})|(\\{8b04086b-94a5-4161-910b-59e3e31e4364\\})|(\\{08c28c16-9fb6-4b32-9868-db37c1668f94\\})|(\\{8cd69708-2f5e-4282-a94f-3feebc4bce35\\})|(\\{8dc21e24-3883-4d01-b486-ef1d1106fa3d\\})|(\\{8f8cc21a-2097-488f-a213-f5786a2ccbbf\\})|(\\{9c8b93f7-3bf8-4762-b221-40c912268f96\\})|(\\{9ce66491-ef06-4da6-b602-98c2451f6395\\})|(\\{1e1acc1c-8daa-4c2e-ad05-5ef01ae65f1e\\})|(\\{10b0f607-1efa-4762-82a0-e0d9bbae4e48\\})|(\\{24f338d7-b539-49f1-b276-c9edc367a32d\\})|(\\{40c9030f-7a2f-4a58-9d0a-edccd8063218\\})|(\\{41f97b71-c7c6-40b8-83b1-a4dbff76f73d\\})|(\\{42f3034a-0c4a-4f68-a8fd-8a2440e3f011\\})|(\\{52d456e5-245a-4319-b8d2-c14fbc9755f0\\})|(\\{57ea692b-f9fe-42df-bf5e-af6953fba05a\\})|(\\{060c61d8-b48f-465d-aa4b-23325ea757c3\\})|(\\{65c1967c-6a5c-44dd-9637-0d4d8b4c339b\\})|(\\{65d40b64-b52a-46d8-b146-580ff91889cb\\})|(\\{75b7af0d-b4ed-4320-95c8-7ffd8dd2cb7c\\})|(\\{77fe9731-b683-4599-9b06-a5dcea63d432\\})|(\\{84b20d0c-9c87-4340-b4f8-1912df2ae70d\\})|(\\{92b9e511-ac81-4d47-9b8f-f92dc872447e\\})|(\\{95afafef-b580-4f66-a0fe-7f3e74be7507\\})|(\\{116a0754-20eb-4fe5-bd35-575867a0b89e\\})|(\\{118bf5f6-98b1-4543-b133-42fdaf3cbade\\})|(\\{248eacc4-195f-43b2-956c-b9ad1ae67529\\})|(\\{328f931d-83c1-4876-953c-ddc9f63fe3b4\\})|(\\{447fa5d3-1c27-4502-9e13-84452d833b89\\})|(\\{476a1fa9-bce8-4cb4-beff-cb31980cc521\\})|(\\{507a5b13-a8a3-4653-a4a7-9a03099acf48\\})|(\\{531bf931-a8c6-407b-a48f-8a53f43cd461\\})|(\\{544c7f83-ef54-4d17-aa91-274fa27514ef\\})|(\\{546ea388-2839-4215-af49-d7289514a7b1\\})|(\\{635cb424-0cd5-4446-afaf-6265c4b711b5\\})|(\\{654b21c7-6a70-446c-b9ac-8cac9592f4a9\\})|(\\{0668b0a7-7578-4fb3-a4bd-39344222daa3\\})|(\\{944ed336-d750-48f1-b0b5-3c516bfb551c\\})|(\\{1882a9ce-c0e3-4476-8185-f387fe269852\\})|(\\{5571a054-225d-4b65-97f7-3511936b3429\\})|(\\{5921be85-cddd-4aff-9b83-0b317db03fa3\\})|(\\{7082ba5c-f55e-4cd8-88d6-8bc479d3749e\\})|(\\{7322a4cb-641c-4ca2-9d83-8701a639e17a\\})|(\\{90741f13-ab72-443f-a558-167721f64883\\})|(\\{198627a5-4a7b-4857-b074-3040bc8effb8\\})|(\\{5e5b9f44-2416-4669-8362-42a0b3f97868\\})|(\\{824985b9-df2a-401c-9168-749960596007\\})|(\\{4853541f-c9d7-42c5-880f-fd460dbb5d5f\\})|(\\{6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b\\})|(\\{90e8aa72-a7eb-4337-81d4-538b0b09c653\\})|(\\{02e3137a-96a4-433d-bfb2-0aa1cd4aed08\\})|(\\{9e734c09-fcb1-4e3f-acab-04d03625301c\\})|(\\{a6ad792c-69a8-4608-90f0-ff7c958ce508\\})|(\\{a512297e-4d3a-468c-bd1a-f77bd093f925\\})|(\\{a71b10ae-b044-4bf0-877e-c8aa9ad47b42\\})|(\\{a33358ad-a3fa-4ca1-9a49-612d99539263\\})|(\\{a7775382-4399-49bf-9287-11dbdff8f85f\\})|(\\{afa64d19-ddba-4bd5-9d2a-c0ba4b912173\\})|(\\{b4ab1a1d-e137-4c59-94d5-4f509358a81d\\})|(\\{b4ec2f8e-57fd-4607-bf4f-bc159ca87b26\\})|(\\{b06bfc96-c042-4b34-944c-8eb67f35630a\\})|(\\{b9dcdfb0-3420-4616-a4cb-d41b5192ba0c\\})|(\\{b8467ec4-ff65-45f4-b7c5-f58763bf9c94\\})|(\\{b48e4a17-0655-4e8e-a5e2-3040a3d87e55\\})|(\\{b6166509-5fe0-4efd-906e-1e412ff07a04\\})|(\\{bd1f666e-d473-4d13-bc4d-10dde895717e\\})|(\\{be572ad4-5dd7-4b6b-8204-5d655efaf3b3\\})|(\\{bf2a3e58-2536-44d4-b87f-62633256cf65\\})|(\\{bfc5ac5f-80bd-43e5-9acb-f6d447e0d2ce\\})|(\\{bfe3f6c1-c5fe-44af-93b3-576812cb6f1b\\})|(\\{c0b8009b-57dc-45bc-9239-74721640881d\\})|(\\{c1cf1f13-b257-4271-b922-4c57c6b6e047\\})|(\\{c3d61029-c52f-45df-8ec5-a654b228cd48\\})|(\\{c39e7c0b-79d5-4137-bef0-57cdf85c920f\\})|(\\{ce043eac-df8a-48d0-a739-ef7ed9bdf2b5\\})|(\\{cf62e95a-8ded-4c74-b3ac-f5c037880027\\})|(\\{cff02c70-7f07-4592-986f-7748a2abd9e1\\}))$/","prefs":[],"schema":1576756770976,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476369","why":"These add-ons contain unwanted features and try to prevent the user from uninstalling themselves.","name":"Smash/Upater (malware) and similar"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c7d7515d-563f-459f-821c-27d4cf825dbf","last_modified":1576771657025},{"guid":"/^((search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted@mozilla\\.com)|({0a054930-63d7-46f4-937a-de80eab21da4})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({0d50d8aa-d1ed-4930-b0a0-f3340d2f510e})|({0eb4672d-58a6-4230-b74c-50ca3716c4b0})|({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({0fc9fcc7-2f47-4fd1-a811-6bd4d611294b})|({4479446e-40f3-48af-ab85-7e3bb4468227})|({1a927d5b-42e7-4407-828a-fdc441d0daae})|({1a760841-50c3-4143-9f7e-3c8f04e8f9d1})|({1bd8ba17-b3ed-412e-88db-35bc4d8771d7})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({01c9a4a4-06dd-426b-9500-2ea6fe841b88})|({1cab8ccf-deff-4743-925d-a47cbd0a6b56})|({1cb0652a-4645-412d-b7e8-0b9e9a83242f})|({1d6634ca-dd37-4a31-aad1-321f05aa2bb3})|({1d9997b2-f61e-429a-8591-999a6d62becc})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({01f409a5-d617-47be-a574-d54325fe05d1})|({2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8})|({2aeb1f92-6ddc-49f5-b7b3-3872d7e019a9})|({2bb68b03-b528-4133-9fc4-4980fbb4e449})|({2cac0be1-10a2-4a0d-b8c5-787837ea5955})|({2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9})|({2ee125f1-5a32-4f8e-b135-6e2a5a51f598})|({2f53e091-4b16-4b60-9cae-69d0c55b2e78})|({3a65e87c-7ffc-408d-927e-ebf1784efd6d})|({3a26e767-b781-4e21-aaf8-ac813d9edc9f})|({3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c})|({3dca6517-0d75-42d2-b966-20467f82dca1})|({3f4191fa-8f16-47d2-9414-36bfc9e0c2bf})|({3f49e12b-bb58-4797-982c-4364030d96d9})|({4aa2f47a-0bae-4a47-8a1b-1b93313a2938})|({04abafc7-7a65-401d-97f3-af2853854373})|({4ad16913-e5cb-4292-974c-d557ef5ec5bb})|({4b1050c6-9139-4126-9331-30a836e75db9})|({4b1777ec-6fe4-4572-9a29-5af206e003bf})|({4beacbbb-1691-40e7-8c1e-4853ce2e2dee})|({4c140bc5-c2ad-41c3-a407-749473530904})|({4cbef3f0-4205-4165-8871-2844f9737602})|({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab})|({04ed02dc-0cb0-40c2-8bc8-6f20843024b8})|({4f6b6aaf-c5a1-4fac-8228-ead4d359dc6d})|({4f8a15fb-45c2-4d3b-afb1-c0c8813a4a5a})|({5af74f5a-652b-4b83-a2a9-f3d21c3c0010})|({5b0f6d3c-10fd-414c-a135-dffd26d7de0f})|({5b421f02-e55e-4b63-b90e-aa0cfea01f53})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({5c5cf69b-ed92-4429-8d26-ff3bb6c37269})|({5cf77367-b141-4ba4-ac2a-5b2ca3728e81})|({5da81d3d-5db1-432a-affc-4a2fe9a70749})|({5eac1066-90c3-4ba0-b361-e6315dcd6828})|({5ec4c837-59b9-496d-96e2-ff3fa74ca01f})|({5efd8c7a-ff37-41ac-a55c-af4170453fdf})|({5f4e63e4-351f-4a21-a8e5-e50dc72b5566})|({6a934ff5-e41d-43a2-baf5-2d215a869674})|({06a71249-ef35-4f61-b2c8-85c3c6ee5617})|({6ad26473-5822-4142-8881-0c56a8ebc8c0})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({6ed852d5-a72e-4f26-863f-f660e79a2ebb})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({6fa41039-572b-44a4-acd4-01fdaebf608d})|({7ae85eef-49cf-440d-8d13-2bebf32f14cf})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7b23c0de-aa3d-447f-9435-1e8eba216f09})|({7b71d75e-51f5-4a71-9207-7acb58827420})|({7c6bf09e-5526-4bce-9548-7458ec56cded})|({7ca54c8d-d515-4f2a-a21f-3d32951491a6})|({7d932012-b4dd-42cc-8a78-b15ca82d0e61})|({7d5e24a1-7bef-4d09-a952-b9519ec00d20})|({7eabad73-919d-4890-b737-8d409c719547})|({7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0})|({7f8bc48d-1c7c-41a0-8534-54adc079338f})|({7f84c4d8-bdf5-4110-a10d-fa2a6e80ef6a})|({8a6bda75-4668-4489-8869-a6f9ccbfeb84})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({8ab8c1a2-70d4-41a8-bf78-0d0df77ac47f})|({8b4cb418-027e-4213-927a-868b33a88b4f})|({8fcfe2b3-598e-4861-a5d4-0d77993f984b})|({9a941038-82fa-4ae4-ba98-f2eb2d195345})|({9b8a3057-8bf4-4a9e-b94b-867e4e71a50c})|({9b8df895-fcdd-452a-8c46-da5be345b5bc})|({09c8fa16-4eec-4f78-b19d-9b24b1b57e1e})|({09cbfddf-5e55-4676-920d-5a16cb9e4cb5})|({9cf8d28f-f546-4871-ac4d-5faff8b5bde3})|({9d592fd5-e655-461a-9b28-9eba85d4c97f})|({9fc6e583-78a5-4a2b-8569-4297bb8b3300})|({014d98ce-dab9-4c1d-8643-166e75d7cb4d})|({18c64b09-4ccb-4c21-ba6f-ebd4a1efa034})|({21d83d85-a636-4b18-955d-376a6b19bd19})|({22ecf14b-ead6-4684-a498-7b2b839a4c97}))$/","prefs":[],"schema":1576757328395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479009","why":"Malicious add-ons disguising as updates or useful add-ons, but violating data collection policies, user-control, no surprises and security.","name":"Firefox Update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cae5d906-0b1d-4d1c-b83f-f9727b8c4a29","last_modified":1576771657022},{"guid":"/^(({0f9e469e-4245-43f8-a7a8-7e730f80d284})|({117ca2f3-df4c-4e17-a5c5-b49077e9c731})|({11db147a-a1cb-43dd-9c05-0d11683483e1})|({1ed2af70-9e89-42db-a9e8-17ae594003ac})|({24ed6bdc-3085-413b-a62e-dc5dd30272f4})|({2aa19a7a-2a43-4e0d-a3dc-abb33fa7e2b6})|({3d6fbbb3-6c80-47bb-af20-56fcaebcb9ca})|({42f4c194-8929-42b9-a9a3-afa56dd0913b})|({46740fa0-896d-4f2e-a240-9478865c47c2})|({4718da68-a373-4a03-a77b-0f49b8bb40ee})|({4d41e0b8-bf7e-45ab-bd90-c426b420e3ee})|({50957a38-c15d-42da-94f5-325bc74a554c})|({5650fc63-a7c5-4627-8d0a-99b20dcbd94b})|({5c5c38ec-08bf-493a-9352-6ccf25d60c08})|({67ecb446-9ccd-4193-a27f-7bd1521bd03c})|({71f01ffe-226d-4634-9b21-968f5ce9f8f5})|({72f31855-2412-4998-a6ff-978f89bba0c3})|({7b3c1e86-2599-4e1a-ad98-767ae38286c8})|({7c37463c-001e-4f58-9e88-aaab2a624551})|({7de64f18-8e6b-4c41-9b05-d8872b418026})|({82dcf841-c7e1-4764-bb47-caa28909e447})|({872f20ea-196e-4d11-8835-1cc4c877b1b8})|({8efee317-546f-418d-82d3-60cc5187acf5})|({93deeba1-0126-43f7-a94d-4eecfce53b33})|({9cc12446-16da-4200-b284-d5fc18670825})|({9cd27996-6068-4597-8e97-bb63f783a224})|({9fdcedc7-ffde-44c3-94f6-4196b1e0d9fc})|({a191563e-ac30-4c5a-af3d-85bb9e9f9286})|({a4cb0430-c92e-44c6-9427-6a6629c4c5f6})|({a87f1b9b-8817-4bff-80fd-db96020c56c8})|({ae29a313-c6a9-48be-918d-1e4c67ba642f})|({b2cea58a-845d-4394-9b02-8a31cfbb4873})|({b420e2be-df31-4bea-83f4-103fe0aa558c})|({b77afcab-0971-4c50-9486-f6f54845a273})|({b868c6f4-5841-4c14-86ee-d60bbfd1cec1})|({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({b9bb8009-3716-4d0c-bcb4-35f9874e931e})|({c53c4cbc-04a7-4771-9e97-c08c85871e1e})|({ce0d1384-b99b-478e-850a-fa6dfbe5a2d4})|({cf8e8789-e75d-4823-939f-c49a9ae7fba2})|({d0f67c53-42b5-4650-b343-d9664c04c838})|({dfa77d38-f67b-4c41-80d5-96470d804d09})|({e20c916e-12ea-445b-b6f6-a42ec801b9f8})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({e7d03b09-24b3-4d99-8e1b-c510f5d13612})|({fa8141ba-fa56-414e-91c0-898135c74c9d})|({fc99b961-5878-46b4-b091-6d2f507bf44d})|(firedocs@mozilla\\.com)|(firetasks@mozilla\\.com)|(getta@mozilla\\.com)|(javideo@mozilla\\.com)|(javideo2@mozilla\\.com)|(javideos@mozilla\\.com)|(javideosz@mozilla\\.com)|(search_free@mozilla\\.com)|(search-unlisted@mozilla\\.com)|(search-unlisted101125511@mozilla\\.com)|(search-unlisted10155511@mozilla\\.com)|(search-unlisted1025525511@mozilla\\.com)|(search-unlisted1099120071@mozilla\\.com)|(search-unlisted1099125511@mozilla\\.com)|(search-unlisted109925511@mozilla\\.com)|(search-unlisted11@mozilla\\.com)|(search-unlisted111@mozilla\\.com)|(search-unlisted12@mozilla\\.com)|(search-unlisted14400770034@mozilla\\.com)|(search-unlisted144007741154@mozilla\\.com)|(search-unlisted144436110034@mozilla\\.com)|(search-unlisted14454@mozilla\\.com)|(search-unlisted1570124111@mozilla\\.com)|(search-unlisted1570254441111@mozilla\\.com)|(search-unlisted15721239034@mozilla\\.com)|(search-unlisted157441@mozilla\\.com)|(search-unlisted15757771@mozilla\\.com)|(search-unlisted1577122001@mozilla\\.com)|(search-unlisted15777441001@mozilla\\.com)|(search-unlisted15788120036001@mozilla\\.com)|(search-unlisted157881200361111@mozilla\\.com)|(search-unlisted1578899961111@mozilla\\.com)|(search-unlisted157999658@mozilla\\.com)|(search-unlisted158436561@mozilla\\.com)|(search-unlisted158440374111@mozilla\\.com)|(search-unlisted15874111@mozilla\\.com)|(search-unlisted1741395551@mozilla\\.com)|(search-unlisted17441000051@mozilla\\.com)|(search-unlisted174410000522777441@mozilla\\.com)|(search-unlisted1768fdgfdg@mozilla\\.com)|(search-unlisted180000411@mozilla\\.com)|(search-unlisted18000411@mozilla\\.com)|(search-unlisted1800411@mozilla\\.com)|(search-unlisted18011888@mozilla\\.com)|(search-unlisted1801668@mozilla\\.com)|(search-unlisted18033411@mozilla\\.com)|(search-unlisted180888@mozilla\\.com)|(search-unlisted181438@mozilla\\.com)|(search-unlisted18411@mozilla\\.com)|(search-unlisted18922544@mozilla\\.com)|(search-unlisted1955511@mozilla\\.com)|(search-unlisted2@mozilla\\.com)|(search-unlisted3@mozilla\\.com)|(search-unlisted4@mozilla\\.com)|(search-unlisted400@mozilla\\.com)|(search-unlisted40110@mozilla\\.com)|(search-unlisted5@mozilla\\.com)|(search-unlisted55@mozilla\\.com)|(search@mozilla\\.com)|(searchazsd@mozilla\\.com)|(smart246@mozilla\\.com)|(smarter1@mozilla\\.com)|(smarters1@mozilla\\.com)|(stream@mozilla\\.com)|(tahdith@mozilla\\.com))$/","prefs":[],"schema":1576611696962,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1480591","why":"These add-ons violate the no-surprises and user-control policy.","name":"Search engine hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cee5c2ab-1059-4b15-a78c-1203116552c4","last_modified":1576771657018},{"guid":"/^((application2@fr-metoun\\.com)|(application@br-annitop\\.com)|(application@br-atoleg\\.com)|(application@br-cholty\\.com)|(application@br-debozoiz\\.com)|(application@br-echite\\.com)|(application@br-estracep\\.com)|(application@br-exatrom\\.com)|(application@br-iginot\\.com)|(application@br-imastifi\\.com)|(application@br-isobiv\\.com)|(application@br-ludimaro\\.com)|(application@br-pintoula\\.com)|(application@br-proufta\\.com)|(application@br-qhirta\\.com)|(application@br-qibizar\\.com)|(application@br-qopletr\\.com)|(application@br-roblaprouf\\.com)|(application@br-rosalop\\.com)|(application@br-samalag\\.com)|(application@br-sopreni\\.com)|(application@br-stoumo\\.com)|(application@br-villonat\\.com)|(application@br-zoobre\\.com)|(application@de-barbuna\\.com)|(application@de-bicelou\\.com)|(application@de-blabuma\\.com)|(application@de-dalofir\\.com)|(application@de-elplic\\.com)|(application@de-erotah\\.com)|(application@de-ertuck\\.com)|(application@de-eurosty\\.com)|(application@de-ezigat\\.com)|(application@de-lorelam\\.com)|(application@de-losimt\\.com)|(application@de-luchil\\.com)|(application@de-miligap\\.com)|(application@de-open-dog\\.com)|(application@de-rydima\\.com)|(application@de-slapapi\\.com)|(application@de-soqano\\.com)|(application@de-treboola\\.com)|(application@de-vasurk\\.com)|(application@de-ygivas\\.com)|(application@es-biloufer\\.com)|(application@es-boulass\\.com)|(application@es-cemaseur\\.com)|(application@es-elixet\\.com)|(application@es-gestona\\.com)|(application@es-glicalol\\.com)|(application@es-griloup\\.com)|(application@es-iblep\\.com)|(application@es-iglere\\.com)|(application@es-jounyl\\.com)|(application@es-klepst\\.com)|(application@es-nofinaj\\.com)|(application@es-ofarnut\\.com)|(application@es-phistouquet\\.com)|(application@es-pronzal\\.com)|(application@es-roterf\\.com)|(application@es-taapas\\.com)|(application@es-tatoflex\\.com)|(application@fr-acomyl\\.com)|(application@fr-avortep\\.com)|(application@fr-blicac\\.com)|(application@fr-bloubil\\.com)|(application@fr-carazouco\\.com)|(application@fr-cichalou\\.com)|(application@fr-consimis\\.com)|(application@fr-cropam\\.com)|(application@fr-deplitg\\.com)|(application@fr-doadoto\\.com)|(application@fr-domeoco\\.com)|(application@fr-domlaji\\.com)|(application@fr-eferif\\.com)|(application@fr-eivlot\\.com)|(application@fr-eristrass\\.com)|(application@fr-ertike\\.com)|(application@fr-esiliq\\.com)|(application@fr-fedurol\\.com)|(application@fr-grilsta\\.com)|(application@fr-hyjouco\\.com)|(application@fr-intramys\\.com)|(application@fr-istrubil\\.com)|(application@fr-javelas\\.com)|(application@fr-jusftip\\.com)|(application@fr-lolaji\\.com)|(application@fr-macoulpa\\.com)|(application@fr-mareps\\.com)|(application@fr-metoun\\.com)|(application@fr-metyga\\.com)|(application@fr-mimaloy\\.com)|(application@fr-monstegou\\.com)|(application@fr-oplaff\\.com)|(application@fr-ortisul\\.com)|(application@fr-pastamicle\\.com)|(application@fr-petrlimado\\.com)|(application@fr-pinadolada\\.com)|(application@fr-raepdi\\.com)|(application@fr-soudamo\\.com)|(application@fr-stoumo\\.com)|(application@fr-stropemer\\.com)|(application@fr-tlapel\\.com)|(application@fr-tresdumil\\.com)|(application@fr-troglit\\.com)|(application@fr-troplip\\.com)|(application@fr-tropset\\.com)|(application@fr-vlouma)|(application@fr-yetras\\.com)|(application@fr-zorbil\\.com)|(application@fr-zoublet\\.com)|(application@it-bipoel\\.com)|(application@it-eneude\\.com)|(application@it-glucmu\\.com)|(application@it-greskof\\.com)|(application@it-gripoal\\.com)|(application@it-janomirg\\.com)|(application@it-lapretofe\\.com)|(application@it-oomatie\\.com)|(application@it-platoks\\.com)|(application@it-plopatic\\.com)|(application@it-riploi\\.com)|(application@it-sabuf\\.com)|(application@it-selbamo\\.com)|(application@it-sjilota\\.com)|(application@it-stoploco\\.com)|(application@it-teryom\\.com)|(application@it-tyhfepa\\.com)|(application@it-ujdilon\\.com)|(application@it-zunelrish\\.com)|(application@uk-ablapol\\.com)|(application@uk-blamap\\.com)|(application@uk-cepamoa\\.com)|(application@uk-cloakyz\\.com)|(application@uk-crisofil\\.com)|(application@uk-donasip\\.com)|(application@uk-fanibi\\.com)|(application@uk-intramys\\.com)|(application@uk-klastaf\\.com)|(application@uk-liloust\\.com)|(application@uk-logmati\\.com))$/","prefs":[],"schema":1576756704239,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487627","why":"Add-ons whose main purpose is to track user browsing behavior.","name":"Abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"914ec360-d35e-4420-a88f-1bad3513f054","last_modified":1576771657015},{"guid":"/^((\\{0bf1c111-c256-4a17-891d-1bc69338162e\\})|(\\{0ffbc4b1-f269-4cff-9552-5f77337ebc1a\\})|(\\{1bbdc69d-55d3-4872-bd03-14eb05e7a7ad\\})|(\\{1ce00b82-ac47-43e6-a69c-f7dc9344168a\\})|(\\{2b01628b-0110-4965-972c-7a0b624fb99f\\})|(\\{3a84e0b0-3151-449e-b6e8-1062036afac6\\})|(\\{3bbcc16b-23f7-40a6-b88c-9ced9d009c93\\})|(\\{3ea48f4a-b585-44a7-aff5-faeb5e5b47d5\\})|(\\{7b161d2c-ee98-4321-a78a-433950672c8a\\})|(\\{8a8d97d8-b879-4024-8321-765e0f395b84\\})|(\\{9c0d6766-debe-4461-b14f-68ddfc13a78a\\})|(\\{014f9781-c104-41a4-a983-fc6aa4690664\\})|(\\{27ffdb27-0a34-4dea-a483-3b357bc6a5fe\\})|(\\{81ba256a-4f32-40df-86b5-e6b9861481e1\\})|(\\{338c7503-fb54-4b69-a84b-916f7452c7fa\\})|(\\{400e053f-55df-4e86-a91a-eae8d7b7bcd1\\})|(\\{617e0484-8346-44f2-851e-60ab89a919f9\\})|(\\{656a0095-d852-4dcc-a107-764df7ad0ec4\\})|(\\{754a330b-efbe-4016-8526-bf0f2e11e45e\\})|(\\{802ba900-013c-42f6-a11a-093c4bf35baa\\})|(\\{2771ce08-4898-4f58-89a5-e2b9d00bfab2\\})|(\\{3906b944-92f3-4d43-89dc-31ad6484a77c\\})|(\\{6516cdbc-9332-437f-89ac-b57470655542\\})|(\\{6847c507-1793-4be2-be86-4c2cc0b445bf\\})|(\\{9687db9b-410c-47f2-8c36-fde63c7c29e4\\})|(\\{0035237e-97ab-40eb-ba9d-c453fb6aa079\\})|(\\{20143127-e0bd-4396-aee9-52229cf9b5eb\\})|(\\{33254399-d5b2-4d84-b90b-9c4d4dc71112\\})|(\\{34621968-1952-4428-909d-df5b220efe74\\})|(\\{83769978-21cf-417c-b4a9-582b4161e395\\})|(\\{aa369db0-4232-47b8-bbbb-49ad31d49dce\\})|(\\{aff733de-d7d8-49c2-824a-7f2b2e282927\\})|(\\{c0b587fe-766b-446f-9aae-bc6edc9f6f4c\\})|(\\{c47a75b9-c6d2-4009-a245-c6dcedeea932\\})|(\\{c51bd197-28bd-442f-8537-dea5ae129047\\})|(\\{cac044a2-b93c-4f24-bf2f-b902741d29a8\\})|(\\{de17ce6f-389f-4368-9675-b9ed93133f17\\})|(\\{e2b105bc-1821-4838-bdf9-0fa4f6781b18\\})|(\\{e6c8bc7f-0133-418a-86ed-ba2c0a6925df\\})|(\\{f4acda5f-a75b-4b3b-8a73-8ca3df8d5f57\\})|(\\{f4fd18ee-8f6a-4708-8338-7e7981b73453\\})|(\\{f2320322-1fff-4998-bc28-4ad61621012a\\})|(\\{ff939f5e-a97c-4c14-b853-9c82519dbf73\\})|(@complete-youtube-downloader)|(@swsearchassist)|(@swsearchassist2)|(@youtube-download-helper-addon-1)|(@youtube-download-helper-addon-3)|(@ytd-support)|(@ytmp4-support)|(@ytu-support)|(18-plus-bypass@agebypass\\.org)|(18plus@sweetytweety\\.jp)|(addon@firefox-addon-s\\.com)|(ageverify@doubletrouble\\.net)|(auto-fill-dhruv\\.techapps@gmail\\.com)|(awesomeaddons@gmail\\.com)|(blndkmebkmenignoajhoemebccmmfjib@chrome-store-foxified--730948579)|(boomerang-for-gmailtm@chrome-store-foxified--1895216441)|(boomerang-for-gmailtm@chrome-store-foxified-1472004183)|(browsing_certificate@easycerts\\.in)|(certs-js@verify\\.org)|(clear-flash-cookies@tubedownload\\.org)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1026618965)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified--1382673267)|(dghpnfeglanbbjaggjegpbijhcbnfdno@chrome-store-foxified-3810896411)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-1917762393)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-2539369515)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3411285726)|(dhiaggccakkgdfcadnklkbljcgicpckn@chrome-store-foxified-3957753373)|(dhruv@gmail\\.com)|(easy\\.download@youtube\\.com)|(easy18plusverify@agehelper\\.com)|(EasyQR@johndoe)|(easytranslate@johndoehits)|(ecaieeiecbdhkcgknidmfelflleobbnp@chrome-store-foxified-2878848146)|(eurekasakamika@chrome-store-foxified-unsigned)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified--1071037210)|(faeeclonpikbempnbjbbajfjjajjgfio@chrome-store-foxified-335403930)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--546579415)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--929033716)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified--1776201342)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-411918147)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-711293137)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1406852911)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-1805495496)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2344964585)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2515600300)|(gefiaaeadjbmhjndnhedfccdjjlgjhho@chrome-store-foxified-2947667317)|(generated-c5el8k8zv2b1gcncleefj9@chrome-store-foxified--1160265316)|(html5-video-everywhere@lejenome\\.me)|(iapifmceeokikomajpccajhjpacjmibe@chrome-store-foxified-6029610)|(info@ytdownloader\\.info))$/","prefs":[],"schema":1576756923769,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525880","why":"Add-ons that include abusive or malicious remote code.","name":"Various abusive add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be96c9a1-0b01-468e-ac9b-761ba3587162","last_modified":1576771657011},{"guid":"/^((\\{7e4a75c1-dddc-4496-9963-1c6ac99cf226\\})|(\\{35af257d-14dd-4cd0-8ebd-2d30c2b30561\\})|(\\{d6362448-1e8f-47bf-9d2f-491648d18e3d\\})|(\\{80a42dcf-193e-43a2-b662-d6b14882403f\\})|(\\{044e39fc-333b-423c-8291-26078a780b02\\})|(\\{68b3c6ce-162f-4ece-9ffa-8279855a4228\\})|(\\{057b93a7-84e6-43ff-9686-d452435ed3c5\\})|(\\{1223cfa2-7aad-4a16-b98a-6bf63b346835\\})|(\\{9815ca8b-a77c-4e4d-beac-aad1c7021dcb\\})|(\\{e3f2795a-cefc-4f7f-9435-5f091b988d2f\\})|(\\{98fd0bd5-f486-4d81-9eb1-e89e9d56bfa2\\})|(\\{f96fafd2-5860-4bfa-9537-3f2ca9dd496e\\})|(\\{da93cdd9-6aca-410e-b2f2-e927da726559\\})|(\\{d97e0506-d330-4547-8a5c-093b8aa08d7a\\})|(\\{425ad6b3-72b8-43c0-be7c-2f6585fa0ec1\\})|(\\{0375f007-f5ba-46ec-86d2-c5da84576562\\})|(\\{e8915f55-6566-4872-97eb-d77fbdbf2fb3\\})|(\\{ebd3a0c4-bf9e-4dfa-b487-f77722055edb\\})|(\\{7cc62e47-ed20-45bc-8c92-bb57128e78d6\\})|(\\{b5a15631-6429-49bd-a670-e83ac41f93a9\\})|(\\{f263d545-3234-460f-b546-a8406a0a729d\\})|(\\{6468c148-9888-4243-8de5-cb6291cac82a\\})|(\\{da2281db-0036-46f6-8878-ff26e1cf6a2b\\})|(\\{63f579ba-eaf5-4e1a-a7c2-c5e889beaf9f\\})|(\\{84569fbb-d367-40ce-b24b-fd3b611283b8\\})|(\\{da2bc16f-b499-401b-8771-9d9f32d88f86\\})|(\\{1a275ad6-5dd3-47e9-a563-41a0bebdfd90\\})|(\\{e07ebf1e-5917-46a2-95d9-61d9b51f3797\\})|(\\{0d6791d2-ce0b-4f78-90e4-8e773703bd35\\})|(\\{502c7ef7-745c-4ea0-8066-a17cf1b74957\\})|(\\{c93f0aeb-ae9b-49d9-835b-c58a6b03aa46\\})|(\\{1f0bf2a4-aff5-42d3-8633-71e65f289250\\})|(\\{28766320-358e-42e3-a2c7-67ec77552424\\})|(\\{74d4fcda-c103-4fb7-810a-4596530c00a4\\})|(\\{7b3fd37a-a127-41a0-9e4d-59ccfa165e41\\})|(\\{787fa0b0-d5f1-4454-8b0c-72d191d6775f\\})|(\\{e2bae2ed-0368-48e7-8671-3bdcc5d7713f\\})|(\\{fee16fb4-830f-438a-a3d5-f7e911d23e02\\})|(\\{72113405-b4a5-46c3-a7c6-5353568b87bd\\})|(\\{5ede50a4-4151-4635-804f-a6f56115a0c6\\})|(\\{c11487a0-d104-4bc3-814b-474f8c29049c\\})|(\\{35690b6e-1979-4ea3-89aa-44a94dda2afa\\})|(\\{e9d698ef-bad4-4960-9df3-8c41605a6d7b\\})|(\\{1472b3c1-cae8-42c4-bbdf-e71134dccf08\\})|(\\{7a40b654-1232-4e76-81e7-d95260db25cd\\})|(\\{f54699c8-c82f-4d6e-a161-919bbe8410de\\})|(\\{dca6a5cd-0d24-442a-afd4-80572bb20c34\\})|(\\{b8d5d169-f076-4098-b671-a3cb8b410f56\\})|(\\{903e6561-0646-4c38-8039-d372d8e7c90a\\})|(\\{b39977b9-bcb2-448b-9d7b-9aec7f62bc26\\})|(\\{059b5c30-b96a-48df-8083-5fff97a8f9bf\\})|(\\{1d0351bb-1d96-4779-b639-44eeceb2ebfb\\})|(\\{80c0bdb4-ba98-472d-ae56-afd8b3021115\\})|(\\{4dfc5596-9655-4b0c-819d-e2ff48fb8556\\})|(\\{d7d3ed3c-6f73-42cb-b724-c33fccc1b465\\})|(\\{b378a858-89bb-492e-8b4d-eb83e910a14b\\})|(\\{ec1fa94c-8700-49d0-ba5d-df99a912519e\\})|(\\{4db5d249-881f-4442-8c01-28536c45ebfd\\})|(\\{7a411d82-fc50-4f20-bd2c-b2b065f18097\\})|(\\{675e002b-e144-4694-a725-9e8cc6a3fa67\\})|(\\{1902a069-c039-421e-b502-1e367c237196\\})|(\\{866bb3a8-82bb-4c9a-bca5-26fd5f37c4ec\\})|(\\{6a4e7017-43cd-4646-bb48-003620bb60fe\\})|(\\{bc5c676e-a75f-475b-a27c-79687b1de3ec\\})|(\\{6b544e1a-932d-4da9-aafe-c4b4bbfe1958\\})|(\\{99631434-ff1e-49d3-88d3-9ac40d0dd1bd\\})|(\\{623b31e0-f289-47cf-995e-5a195e261758\\})|(\\{1b4d88a5-4b5d-44c8-849c-82f129a7dacd\\})|(\\{48ba880a-b7c2-4e4e-af55-9134ac926c61\\})|(\\{4b498e2a-8b17-47c0-a449-89a76b6e737f\\})|(\\{d9cbd45f-cdbc-4be1-bb16-8e60764630ff\\})|(\\{bfaaa94a-1a93-4a1c-9b54-9dbe98f3ef07\\})|(\\{87b93e6e-70a6-4538-9848-e9d0f060e372\\})|(\\{fea4fd50-ed6a-4b8e-b00d-3b2276df6e34\\})|(\\{c15450f8-8da2-4add-a8f6-603d90e8d344\\})|(\\{ec972135-8e5c-49d4-bff8-b6006b21f2d2\\})|(\\{b039f24d-8b51-40d3-abf7-55e1dc502112\\})|(\\{b308870f-ae9a-4972-af28-0218717a47f4\\})|(\\{9349a202-8b8e-4777-ba93-c723810da51e\\})|(\\{798750dc-0057-47e0-a1af-73dec73544fa\\})|(\\{186e4b6a-e3f0-4970-8f7b-05ab6bc50320\\})|(\\{dec8de3e-d3a4-4946-bcbd-c3523fee11c5\\})|(\\{06539c62-00d3-4513-9aa4-048dd273107a\\})|(\\{b200a289-900a-4953-b2c6-b7a323d6fb66\\})|(\\{4080defb-6c6b-4012-bcac-71379e9c430f\\})|(\\{b110855c-90dd-427a-894c-54b93c6572b7\\})|(\\{dd599e99-3a48-4e36-9d83-56f8c0019d4d\\})|(\\{4f43f2c7-c1e6-4091-88fe-c829b3bfe553\\})|(\\{b7a022bc-6b89-4ac1-a1fa-bf02251336b0\\})|(\\{1aa370ca-9865-4c52-89a8-79e95abc82f7\\})|(\\{fb727d0f-7c3d-4bf6-8be4-284e7e8b8f83\\})|(\\{1579b5dd-ef3d-4754-bc59-8a7707fe1219\\})|(\\{66f0cb42-bb3e-4a16-90c1-bed1e3be4aad\\})|(\\{f13a1f79-f63a-4332-a9c9-11fc50328fc2\\})|(\\{29962f4d-bf74-4775-9d02-31fe546d6fa6\\})|(\\{aa539764-9ec3-41a6-af0e-6c2dc46ecbf5\\})|(\\{9412adf1-2714-4cb2-ad5b-13d41096234a\\})|(\\{86f2f4cc-97c5-4cc5-8151-c327ab379fba\\}))$/","prefs":[],"schema":1576757017958,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549214","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"654077f4-a8b3-4822-8962-0bb1cac1d70d","last_modified":1576771657006},{"guid":"/^((\\{0209c9a2-f58e-4ca5-ba95-80de8a0bec36\\})|(\\{0429d1cf-e6c7-46b9-9959-4d24263f5b9f\\})|(\\{04aed622-650c-44b2-968e-a8740024bdfe\\})|(\\{054ccccf-bb7d-4d0d-ae7e-94931a469627\\})|(\\{06440d64-2a92-45a7-8e8e-c14a35f9224d\\})|(\\{06e83ce4-370c-41c0-bfb7-62bb0e77cabb\\})|(\\{06fe00d4-24df-497f-90e0-88db402cc9d6\\})|(\\{077e07c1-b948-4e88-9965-226cde465f9f\\})|(\\{07b424b4-8a9d-4fe6-afd5-1f2135f5f4ea\\})|(\\{080f27b3-ad41-4bf4-84bb-b6df1d395b0e\\})|(\\{0a3ba90b-224e-48ae-9440-b92d4ac03ee6\\})|(\\{0bd278d9-fbc6-40dd-914d-5e696c4255cb\\})|(\\{0c3c7c7c-3d15-4cf7-936d-dcf6070e82ce\\})|(\\{0ee32a7c-74b2-4a55-b388-8034b39c6b1d\\})|(\\{0f806e24-dbcc-4f14-b8f5-cfd7f88d6302\\})|(\\{0f9b7554-16d4-4496-8f01-e396256033b7\\})|(\\{1331d9a3-b9ec-43fc-a369-f73a926849b9\\})|(\\{14aca62f-1cc5-4424-a30a-ffb3d424b5bc\\})|(\\{14ec0bb2-f06f-46ad-b951-b810f7651284\\})|(\\{16744b56-7518-4526-bf9a-2531d694fb1a\\})|(\\{179d7013-b6d8-4a89-a861-30e0e8a7faee\\})|(\\{17cff984-12b5-438d-a915-41d7d006de4f\\})|(\\{17ee37ab-fe67-45bd-9666-bcf57a371e46\\})|(\\{19f6f2dd-32df-47a2-9b89-76543a987d46\\})|(\\{1a6ddac5-6ca0-4d59-a8e5-02345c67f703\\})|(\\{1b50ef3b-a364-4089-8ef6-1031cc7a0d1d\\})|(\\{1b830180-08d2-4381-a516-b84aba36e52f\\})|(\\{1cdff066-cb3a-4abf-95d0-39691e53dc75\\})|(\\{1e778837-1740-4a35-9eb1-e16b2c189037\\})|(\\{260d8452-72d2-4860-b14e-dd3fcb779656\\})|(\\{262c435a-42e0-4ca1-a713-f52672691f4e\\})|(\\{26d2406b-5118-44fe-a479-15a8c4f6f2bd\\})|(\\{28a26807-fdc2-4e79-b2a1-efcb1c21d199\\})|(\\{28c24c28-a094-4915-a2ff-5ff91caf076b\\})|(\\{2afddffd-6246-45f6-af19-a7803095bdf0\\})|(\\{2d37fd0a-5ae0-4d83-bc0e-fc7d870587c6\\})|(\\{2df75889-c43e-4f4d-b43b-e51d9b50167c\\})|(\\{2e4e320a-d5f6-4685-89f0-4d7084209c06\\})|(\\{2f93ea6a-1c1b-4456-b821-e8ba50aedece\\})|(\\{3034cb02-b9bb-4e8a-8749-cdd7fd1a6902\\})|(\\{3862859a-78c6-474e-b30e-303e86a7c6a4\\})|(\\{386afcb7-64f4-41db-b3e8-a76602ebb2fa\\})|(\\{38b61e2b-1af3-4f35-bdf0-cc4e3afc4880\\})|(\\{395065fd-1b7f-400f-aecb-9cfbcd9d607e\\})|(\\{3b0055c9-ea2c-43be-a927-ecd342946367\\})|(\\{3b37c6dd-d5f0-494d-9dd2-175db561b99c\\})|(\\{3e5a09c0-5f26-4d40-a5d0-a853f1fa759d\\})|(\\{3f2d032a-29ac-4cbe-9463-563f3ba6eb7f\\})|(\\{3f6ea025-e6c2-4372-adca-cb60b811e4da\\})|(\\{4253e6be-5b91-4b66-b44e-11f6260cee0e\\})|(\\{42c5b340-7cda-4d89-81a4-4a20754b5250\\})|(\\{42d8241e-e5f6-47d7-95f6-b6649143b12a\\})|(\\{46061237-f12b-4738-b1e4-7b7070fc03ca\\})|(\\{46bcaa76-c21e-44a2-aed8-6ba630fcc961\\})|(\\{47f394e0-02be-4a08-b865-287b993ac40e\\})|(\\{497c92fb-4d7d-4b9e-9884-a178e5991ee1\\})|(\\{498d00a0-3d8a-45ff-8e8f-3c27fcd12df6\\})|(\\{49ec4e6d-8152-461e-a2f5-095ede6c3cab\\})|(\\{4a87eeaa-4aa5-4695-b393-1ca4f00b2f3e\\})|(\\{4b0d3b3a-d61c-4968-a338-8de76d044f80\\})|(\\{4b9b2a47-e06f-4948-a20f-78ec1ef4e84c\\})|(\\{4dc32f1c-374e-4886-9a62-80ecfc23ed17\\})|(\\{4e901df2-8301-4588-9bc9-1e9f6c4f996f\\})|(\\{4fb6f5ed-eb5a-4115-a635-57fecad85d50\\})|(\\{50c0ae9a-ebaf-44f7-9ea7-52c7d1066721\\})|(\\{5160a705-c8e9-40b9-900e-6d26559038de\\})|(\\{5232e216-65a2-44d0-ba11-05fc8c332af7\\})|(\\{53e6e44a-a0af-49e2-af72-db4518f153bb\\})|(\\{58c7b5da-a1cc-437a-9401-2a56eb77df7d\\})|(\\{59aa5a90-0034-4350-adfe-76aff37e73ee\\})|(\\{59c5d279-711e-4217-8e5e-1aa1497ffcaa\\})|(\\{5a3f607d-7e1a-4faf-88e2-5806d74d18d4\\})|(\\{5a6364f7-3237-462d-bd3f-7c501830ceb0\\})|(\\{5dc73bfe-4193-4390-ae50-ad928655e21f\\})|(\\{5e085187-2509-4f8f-80ed-78c06351a77a\\})|(\\{5edfb7c3-04a5-447d-9069-2093289a7b98\\})|(\\{6219dabe-8f5f-4130-a650-8cfa971d7182\\})|(\\{62c9c13b-d001-4c42-819c-31b9763973c0\\})|(\\{656da759-0ae4-4f3e-a798-8293a5df9476\\})|(\\{66d70c4a-ad30-4f3c-afb4-b498a60c49b3\\})|(\\{68cb3185-4f55-42cb-97ea-188924b1d6c3\\})|(\\{6b99e0e4-e2e8-4fff-9da5-81c0b9e92b62\\})|(\\{6de81b5e-7556-4fc4-9cac-df56e898f3bf\\})|(\\{7162613f-ea9c-48b3-a0e3-6700ea61a4c8\\})|(\\{71ef8107-d5fd-4d2c-94b7-2dcd07448622\\})|(\\{7284399c-6be5-42ff-8ddc-5cc52d46ab40\\})|(\\{7422ce07-cac7-4fe6-af6b-16f5e7e27d05\\})|(\\{76a7b38d-7044-4e36-8315-38db10506ec8\\})|(\\{7772f851-8dd4-4d96-b426-6cd9f739a599\\})|(\\{797129e6-8cc9-401e-b9fe-0fee15533e9a\\})|(\\{7a3429ae-f293-4a70-a13d-f57f153557e3\\})|(\\{7bed7063-0842-43d9-b672-5e5e55915d5d\\})|(\\{7c0220cc-89e5-4726-ada1-fa2ffa412f28\\})|(\\{7c3c79d6-7e31-4947-b9b4-dd21f461ccd4\\})|(\\{7c70cbc0-e80c-4f3b-97b2-2530c4ac1349\\})|(\\{7fc4f148-2648-40f5-bd99-d057ac1292a6\\})|(\\{808a2093-68ff-4f73-b239-0d0f105c4d98\\})|(\\{8411b8e3-e302-48a2-91ee-550102b938f6\\}))$/","prefs":[],"schema":1576757094905,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552164","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2a4b5087-eca0-43e8-96f4-6632aabd83d3","last_modified":1576771657003},{"guid":"/^((akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified)|(akjbfncbadcmnkopckegnmjgihagponf@chromeStoreFoxified-2563213750)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3767541208)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2330732719)|(cidchfadpgepemappcgeafeicnjomaad@chrome-store-foxified-509978031)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-558690357)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3523362862)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-850818380)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3686225023)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3659951669)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1114585181)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2593088680)|(edmdnjinnadgoalbaojbhkbognfappih@chrome-store-foxified-206569335)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-3272316989)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-96331909)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-2158751912)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1554953450)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-323465212)|(kadbillinepbjlgenaliokdhejdmmlgp@chrome-store-foxified-3112875041)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1868258955)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-611481225)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-162688242)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-1394660953)|(\\{de07e1ed-1597-45f9-957d-4edc44399451\\})|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified-294092903)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--2032791676)|(akjbfncbadcmnkopckegnmjgihagponf@chrome-store-foxified--786206880)|(\\{76f8d31f-d1b6-4171-885e-6fcde28ca547\\})|(\\{b7492f2d-72b6-4816-83d5-9c82b3cc5581\\})|(\\{3f0fa616-3f92-42e2-ac1e-69ae7b1c7872\\})|(\\{2e324574-0761-4017-bc96-66270563e277\\})|(\\{950d03c6-722e-498d-90fc-ec9d9c1ab893\\})|(\\{6cb64844-2dca-4f29-82d1-cb59459ad824\\})|(\\{5347a8c7-a156-4455-8301-7d19d269bd2c\\})|(\\{17c69a23-df19-4655-aaa9-e8a35f186ddf\\})|(\\{381eb5ad-0f02-4146-85f4-2cc7c7a7dee4\\})|(\\{e797aab6-f3df-4d0d-89c2-320371720194\\})|(\\{91a95e76-4b27-427f-9554-7c1aa58c8489\\})|(\\{5bd5f5a3-3f30-4c90-bf5c-7ff32eae9fac\\})|(\\{e9cbcded-05e0-4cf0-9163-8507de356646\\})|(\\{4262365c-085f-4f2b-9bd7-048d7d1c90de\\})|(\\{d6d89cdf-36e4-44b5-8ea2-2283e25e99b9\\})|(\\{3ab34cbc-4a18-4fac-b629-3b10091d505e\\})|(\\{28beb080-37b1-42ec-a6e9-89cff276cc3e\\})|(\\{d83baff8-42f1-485c-bc61-0df0a2fa2834\\})|(\\{f1260949-ea01-4f69-b302-87ac898bc677\\})|(\\{f2bb825a-19b7-46ba-b759-557885e28ff9\\})|(\\{d1023b1e-87f6-49d4-b93d-80d94cafb101\\})|(\\{605bf342-f990-43b3-9053-b6ad563cc944\\})|(\\{20da0f4c-c6ee-4c4a-be76-8cb0fdd759b7\\})|(\\{29563a03-2ea3-4187-b3dc-af3027287df8\\})|(\\{9fc76cae-b6b4-45af-aa0e-81d1bf419812\\})|(\\{b83f6a6c-6bb3-492f-aad2-56a6b79a02d4\\})|(\\{4e340962-9d78-486c-8ec8-fdc8ba0448c3\\})|(\\{4f420c0e-824f-408b-8327-418934c566e9\\})|(\\{51057732-1a37-491c-afeb-dccbb18e2341\\})|(\\{ac9415c8-b978-4636-a0f6-99b75f1bfacc\\})|(\\{ba9d81ff-13da-4183-8b32-19cc18a198c3\\})|(\\{614f9cd7-d46e-47a5-bcd6-fc9cefc846ac\\})|(\\{83ab005b-85f8-4185-b500-26c78f29e470\\})|(\\{814b9b95-0470-42f5-9be1-b322ae1a300c\\})|(\\{c565d582-ef45-4ee5-a13d-e0bc544bb483\\})|(\\{bbc0a83c-ff01-4f55-beed-c8dd6256d99b\\})|(\\{00d71c76-8b41-4e12-877b-62ad742c5b5b\\})|(\\{22c15bb7-3cac-4480-ad95-8ef2b4762689\\})|(\\{4ce4a857-3ba4-46d3-83e1-424e608f8a1d\\})|(\\{638ad118-0407-437c-a657-f8bde7b0c511\\})|(\\{c35dba3d-eed7-4ee2-b7ed-b2f636810ea1\\})|(\\{7635e554-de52-4a55-81f4-5d4e7ac9e416\\})|(\\{b768c014-21ff-49c9-9a27-186e33574612\\})|(\\{e31ae098-b80a-4286-8688-8514ace2d0fd\\})|(\\{104607b9-ad49-4760-882a-5cc13164531a\\})|(\\{bf78148e-f4d1-48b7-92b2-93ca2003d619\\})|(\\{877777da-7695-4d7e-a469-2a4b4cfbe0c4\\})|(\\{b09f3de0-26c4-4790-ba8e-50a1d1725053\\})|(\\{a24b471c-9100-455c-825a-689533d24979\\})|(\\{12a8c732-c19a-468e-8be4-a16f9a27c845\\})|(\\{bad6c6a4-6108-4e44-b7e3-c05bed9d4e50\\})|(\\{1b598a16-ca58-41bf-8cc2-3741356363b9\\})|(\\{a5520fcc-b75a-4527-931b-e403aa8772ef\\})|(\\{cec7aeec-9352-4ed1-8362-8e384704ab29\\})|(\\{1bf3e066-3707-41eb-b62d-55da5bbe930d\\})|(\\{1fd8204a-f25b-47d0-bfac-35c41451e2e7\\})|(\\{ab1f1e53-9102-4f4f-a793-0a81f5669e13\\}))$/","prefs":[],"schema":1576756466412,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554606","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Various remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8258f92c-5b89-42a7-a984-dd4e94fa301a","last_modified":1576771656999},{"guid":"/^((\\{ca33d7f8-5b8c-4215-bf6e-a29b721024b8\\})|(\\{ef107eb3-c699-42ce-9310-1f36890fcac5\\})|(\\{48a3b395-8cb9-4093-b557-d967c653b13f\\})|(\\{27e7c4c8-916b-4dae-ab1d-46573fe889e6\\})|(\\{4795f211-f8b2-45b1-852c-982e1912414e\\})|(\\{000d5ed8-cf10-4929-89b5-f5369f50bbcd\\})|(\\{4b249174-1bc4-49c2-a0ca-eaa51facd4b0\\})|(\\{34d96b10-c44d-4398-9410-8d7d550d023a\\})|(\\{c067681d-dc69-4b05-8052-34fa69549aa8\\})|(\\{5b2dcc2b-08a9-4d36-a249-680a9e994938\\})|(\\{68cb60e7-4bfc-43cf-9875-f9548ad5d913\\})|(\\{ddca4204-8f9c-4e35-a8fe-47e94ffced48\\})|(\\{c5138dc7-3cf8-4117-9988-041c2a85868c\\})|(\\{140c670f-ee4d-4a16-bf83-c4012279b923\\})|(\\{d88779b5-daad-4ae8-abdc-3ff58c80da8a\\})|(\\{ab80f9f6-2a50-4074-b560-f839f1674bb3\\})|(\\{a8187405-efb6-4c1c-a9dc-e90fc064f55d\\})|(\\{f0d5c8c8-0697-4ee9-830d-3271ad125c17\\})|(\\{34e3121a-a2f2-4ada-b271-c661b8e0a215\\})|(\\{c4d8c3ad-ba8e-43e7-ae76-90521132805e\\})|(\\{ec5441c0-ddd4-4e70-8d02-92b99eb5f306\\})|(\\{ba00c2cd-f59d-44c5-984c-fbd066cdabfe\\})|(\\{b41fb99b-8e21-4eb8-b825-c6855daeb9c3\\})|(\\{c8329103-f242-4dee-9fca-b98e2e15c096\\})|(\\{59d0d43f-875f-4ebd-beeb-4dfa213a7d20\\})|(\\{9ce5d8a7-e97b-4341-bf16-c12ad44368c7\\})|(\\{e10ea3cf-17ea-4270-8602-83162b1c8309\\})|(\\{303e86df-ad8c-4a55-b921-5e2a32441834\\})|(\\{8ecebe6c-0ac5-4f3a-a32f-50b1686ee538\\})|(\\{b5150eb9-3cf8-4162-b114-56b289c45f75\\})|(\\{c04252ab-747b-4718-9d1c-bb90c72c4874\\})|(\\{976ecad8-b154-4201-a55e-4478a1651a42\\})|(\\{a0f98d44-f4b9-4726-9f01-7587ee46634c\\})|(\\{6b9c9f21-1108-4ae9-a1d8-d56566e20f13\\})|(\\{fdacc9f4-06f1-4619-bfbc-61f790e279df\\})|(\\{74d5b273-dcf7-4606-9b9d-0c5c38cbab80\\})|(\\{6fee68c0-1b38-483f-963b-43919f4ea797\\})|(\\{017a0e34-4942-47d7-a0ff-2093f14e17ae\\})|(\\{71251d4a-7ff4-4450-9459-163b911d9518\\})|(\\{6da358f8-9746-4c39-957d-b6821561b566\\})|(\\{4613ad29-db02-4d30-b857-b84a8ab412a2\\})|(\\{7993943a-0d47-4d30-8989-ce039ec1636f\\})|(\\{ac2fbafe-f182-49f0-920c-2e0d026b6c1f\\})|(\\{5f79fd50-fb20-42f1-adf5-3021aaf3f0e9\\})|(\\{a4295850-5057-46ab-bb31-2d283dff2474\\})|(\\{74517834-8cb5-4895-9f8b-3de15b771d92\\})|(\\{3dbebe53-9687-4e36-8c1e-79fcb098cecf\\})|(\\{275fc9ab-64fd-4430-8a35-43f73a87e8b9\\})|(\\{a26cdedc-b1eb-4fd2-b331-e71033c489a0\\})|(\\{d8fa69e8-1008-4f32-9db2-13ea7589bcec\\})|(\\{59704739-f6df-4272-968d-32f7c599da09\\})|(\\{208f846e-851a-4c07-a448-a66c40a2294c\\})|(\\{46c7b5ea-c1d0-4c2b-9122-3baa2e3bda3e\\})|(\\{39220be1-e69c-4b22-a5ff-545fcacf215f\\})|(\\{c0975246-6858-46e2-8f09-7d80d810c040\\})|(\\{8f284821-a420-4d79-bb7f-c1aae7a2fa90\\})|(\\{86d3e654-73c5-4b7f-a942-bd2347d4517a\\})|(\\{3d1af64b-542e-47ee-98a3-1f89bfca0f2a\\})|(\\{f0c2850d-101b-4de1-be16-3f09963048ab\\})|(\\{7388541e-8d9e-48a9-ac43-87dfdced6e87\\})|(\\{5d37398b-bea7-4ca7-bc4f-95de295be960\\})|(\\{3d8b3d51-3621-4aa5-b229-731cee83ee64\\})|(\\{ba67c9cf-ef60-4085-b6cf-729e5245089a\\})|(\\{1efe8d5d-ca8d-4a53-b2d4-a41380067041\\})|(\\{7698ee9d-345b-4395-b9e7-0479ed91f98d\\})|(\\{5f233e13-1892-41b6-81c6-a26c702d4a09\\})|(\\{d569420c-50a6-4082-b6d9-41c7bcb33464\\})|(\\{e406fddd-5ba4-4fdc-aa46-d556f97c8ef9\\})|(\\{29066f7e-a4ed-40b1-a02d-38ddf25d9533\\})|(\\{57e3e757-ca29-440c-9ef8-864da0e7ee72\\})|(\\{1237079a-7a08-4660-8fdb-6c3fdcecc787\\})|(\\{60429834-7a98-45e7-b525-6f31d55bbb3c\\})|(\\{bb850649-4ada-4735-a861-072ce9b647dd\\})|(\\{dfb103ab-cfee-49cd-b33a-e134367408c5\\})|(\\{24a0a50a-15d2-4806-9226-78491b3e986c\\})|(\\{2eb4b76a-f057-4d14-8d63-a5afa3571158\\})|(\\{cb5ad67a-5304-4351-bb15-530b159fa1f7\\})|(\\{0bd8bfda-24f5-4652-a434-664621e04a36\\})|(\\{f249d964-ac83-4059-893a-c3c5b38cc746\\})|(\\{94ba7f66-aef6-4590-8044-03aa705a4a2b\\})|(\\{dd178abb-e6fb-4e0a-b242-a64a53b24fb5\\})|(\\{7ff1da48-ae61-45f1-bcbf-2c22b4571d58\\})|(\\{d01909f7-598b-41b0-8907-2a9815c5c457\\})|(\\{93a37679-eb92-4eec-93b2-7bf77b0f94ca\\})|(\\{3ff7ce60-fbe5-4a50-9733-a347a02f09e5\\})|(\\{f076d6ff-1daf-42f3-b485-5b54b13aaf3e\\})|(\\{571d827c-5c84-42cc-8386-9e12abb8209a\\})|(\\{f6515794-8d44-402c-9a3d-3d712cb437bb\\})|(\\{796a59ab-77a7-4add-9481-5c7deee7c037\\})|(\\{a9b99a24-6cc1-491a-a81b-946cb42bc9f2\\})|(\\{9767896a-9561-426e-90d1-03b884d34eda\\})|(\\{95a6ebd9-52bc-4859-b92f-70a7c103e2b8\\})|(\\{4d24059d-463b-40b0-a86a-0a1de38fccb9\\})|(\\{d7c03c15-7287-4fb0-add0-c49744b48410\\})|(\\{6074519d-2d7c-45b6-b239-ea5452e93140\\})|(\\{425dafa9-0997-48df-b971-623847853747\\})|(\\{847688e9-b1d7-4607-b4fd-44c2365c01ba\\})|(\\{1383930d-64e9-4c3d-a629-361c70e3cd26\\}))$/","prefs":[],"schema":1576756857135,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558136","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake Flash/Avast/etc clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72593718-af38-4f63-bcb9-7c6afd13de8f","last_modified":1576771656996},{"guid":"/^((\\{9aa1f441-7c04-4b00-83b2-6a4362090b41\\})|(\\{3001d016-bc15-49af-a81b-2c8764139321\\})|(\\{0af1d242-b004-49ae-91fc-00fa0f642bf9\\})|(\\{95a5a094-ba8e-4fe1-80bb-6f6c0a01bc2c\\})|(\\{36b33158-36fc-4728-bf08-8e532100af58\\})|(\\{5bda1d03-6533-4d8c-adb4-7179402ddeec\\})|(\\{dc7d18c8-c832-42cd-b9b0-f6a46a737ad1\\})|(\\{56d85baf-c366-491b-b93c-733a4a36009d\\})|(\\{1b08c0c7-d2fd-4905-82ab-d4d759af4051\\})|(\\{1b8a9b33-b3d9-42ea-adce-cec910c44f29\\})|(\\{0be707e8-d7d6-45d5-8212-3fd3784d7de7\\})|(\\{fb2e3c38-be42-480f-b60c-d614d372e218\\})|(\\{c088d705-9f59-40ac-98eb-192f67c44f03\\})|(\\{9570bbbd-d761-4380-850c-d9cc15200916\\})|(\\{2652d5a4-26b1-4e6f-9134-304d7b57af7a\\})|(\\{1e0a2a5f-170c-43c1-b458-c8fc8bdd7dec\\})|(\\{47595710-e0b3-4a88-9bf7-54e1f3bb6772\\})|(\\{c25a320e-dc50-486a-9589-13ef22f75a21\\})|(\\{645237c8-7da2-4298-a789-e11fbaaa580e\\})|(\\{f2356af6-9b9d-4c69-876a-710d446a9124\\})|(\\{98a67ccd-599a-4675-9578-35af1824fdd2\\})|(\\{f3924f49-64a3-4fde-8598-76eec8e67f34\\})|(\\{2a46402d-b6c4-4a0b-87f0-dc90bb24fa93\\})|(\\{40d92297-295d-4a44-8a0f-dd69510c9c30\\})|(\\{a5462b0d-6528-47d5-ada5-4a23d1e0355e\\})|(\\{280f7325-eaf0-451a-ad2d-3b2c4e80e070\\})|(\\{ee5a7045-e216-4836-949a-07f5aa1dabc3\\})|(\\{34ee38f4-e2ba-4e9d-8b1f-dd06e8bd205f\\})|(\\{7c71c234-ba74-467c-b750-727ee7e38382\\})|(\\{a83b3b31-4bfc-4343-beab-761f21b97f57\\})|(\\{b85d35a4-3a03-430d-a1a0-437448a86c22\\})|(\\{8b6c1e29-5009-477e-a798-244b0efb1515\\})|(\\{64891348-7fc0-4299-bd6a-6bfaa6cf21a6\\})|(\\{baa828ff-1723-483b-8034-145ad2795efd\\})|(\\{81fd4851-7ea3-4ea5-8775-49372fe1c8c8\\})|(\\{ce7d8e95-c7d3-49dc-8abf-e860ee707b09\\})|(\\{d84109e8-9945-48bc-90e8-0dd0b1b63b73\\})|(\\{ec12fd66-7294-4167-8fbc-4774150c0fa4\\})|(\\{0c506de9-8467-4a92-8cd3-11c87e121db2\\})|(\\{b1671fe5-c90a-4f68-b8bf-e54a147b5d05\\})|(\\{8b25277a-4df8-4d2d-b3b4-f8219e2ce7d6\\})|(\\{5705cd04-46c2-459f-8a9a-97ce57eee1ae\\})|(\\{8340b371-ed61-4b07-b293-853aa5dbb866\\})|(\\{87bbb065-e195-48ac-989e-ba48ee63b404\\})|(\\{c455fc20-6e9d-418c-9b45-75fd85852b32\\})|(\\{a80c87a7-3366-4192-b9cc-d1e862e1c13d\\})|(\\{5f4ba05c-c1a5-4bc7-b8d3-c14e807b2c64\\})|(\\{0114315a-beda-4d55-89a3-e00f6346e7be\\})|(\\{0fb7b987-721e-4828-9a0e-a72860ded1b2\\})|(\\{c44cd2a5-bf28-4520-ab2d-187752e51a26\\})|(\\{3a34c1a6-3cbf-49a0-bfe9-beff60da5ec6\\})|(\\{677e89a4-ae10-42f3-8e9d-d51be40daf8f\\})|(\\{85d70eae-fde6-4ac0-ab82-0148f2eb1543\\})|(\\{fddac013-6d12-41a4-9924-f5ea7618f22d\\})|(\\{84b5ca75-a431-45c7-995d-6d7268decd0d\\})|(\\{7374dd37-a901-4b65-993c-3323f87e0f3c\\})|(\\{157a5c60-7899-4328-a90c-83d34d0844d4\\})|(\\{5b288e8d-f33c-4602-a945-07f96e43a041\\})|(\\{80f059bd-602a-42d5-9b17-9f2c6a074102\\})|(\\{8e5a8075-8e21-4ab2-b189-5d435208122c\\})|(\\{d5b94c09-0ff8-4b86-b52a-590d5e5ad9af\\})|(\\{a569eb31-9456-49a9-9aa9-e69a8db159d3\\})|(\\{0431a147-f9f5-4ee3-8dca-57303110c226\\})|(\\{88c77421-5ebd-46fb-92a8-e0459b6edd20\\})|(\\{a4a0697d-9a01-4b21-bb88-5ac949cdb7b3\\})|(\\{03e0da0a-da1d-46f2-85c7-08258189fc04\\})|(\\{351f5a4d-a0fd-4ce7-a85a-6cb74fb6c57d\\})|(\\{0e0b22ea-831e-4104-9c2e-612d7ebf82e2\\})|(\\{7b5c604f-ea41-4bfa-88d1-843f27645199\\})|(\\{863f023c-a2e5-4043-8e49-8e3029004b19\\})|(\\{20e4b367-f8ad-4c9a-b590-976be87206aa\\})|(\\{436ca3ce-f10a-4cdc-86c2-a46f086b5fdb\\})|(\\{a53983bc-545e-429a-8aaa-6332e1a6287f\\})|(\\{5fb1995e-ac7e-4c01-a592-8b262856e039\\})|(\\{56086da0-b20d-4118-9670-56e85624c875\\})|(\\{67ef5673-5769-4d5b-902f-ba22cb16a51b\\})|(\\{1d50e81b-0594-4c24-80c2-abc479be4d18\\})|(\\{b190f2cf-f3f0-40e7-a05b-8eed296a0c8d\\})|(\\{490d8bfc-fd42-4ded-9fee-1f009e777468\\})|(\\{1d647c69-8e4b-4fe8-b0f3-d914a1410ee8\\})|(\\{4958ae27-1251-49b4-a9d4-2af7c36c833b\\})|(\\{6e80fdc3-79c7-423a-8e95-0e123c0f2187\\})|(\\{d8d3230d-5642-4c3f-a64e-5ff690f7a466\\})|(\\{ddbe5d7a-e037-4749-89bc-3460d358aca1\\})|(\\{48cd023c-52ef-4fe7-a2ff-101c22c49a5e\\})|(\\{fef34931-b7ca-49a5-8827-bec353efaa08\\})|(\\{331a936b-a87e-4271-b9a6-30935dad77ed\\})|(\\{21084437-803c-49c3-8f84-9a615bfa5dfe\\})|(\\{93511e9d-badf-4b5c-9fbc-17ef6a9786ae\\})|(\\{470e388e-a039-43f8-a7a7-d8f54d273feb\\})|(\\{e4cd5604-caec-4139-9781-94add5f41ba3\\})|(\\{f00bc2b9-2b69-4f68-8bef-91d498686731\\})|(\\{7b3206c4-dc98-4ad9-88ba-5a7b3048fd92\\})|(\\{8e19f5f7-2445-48b1-8910-55d42d9dfe34\\})|(\\{770e30c6-f1b9-4df4-8551-c7f09ddbd8ed\\})|(\\{bb9a8679-1f82-4ab7-8ea2-bac864a38542\\})|(\\{13f5e078-b80a-45fb-a907-c4515a7bb0fa\\})|(\\{d8df47e3-5e86-4669-9a15-a37f8a8593db\\}))$/","prefs":[],"schema":1576756624851,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565184","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Private Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f945be6-12e7-4948-af77-668bc3996ff3","last_modified":1576771656992},{"guid":"/^((_0dMembers_@www\\.myaudiotab\\.com)|(_12Members_@free\\.myscrapnook\\.com)|(_14Members_@download\\.totalrecipesearch\\.com)|(_1cMembers_@www\\.bringmesports\\.com)|(_29Members_@www\\.headlinealley\\.com)|(_2bMembers_@www\\.bettercareersearch\\.com)|(_2jMembers_@free\\.recipehub\\.com)|(_2jMembers_@www\\.recipekart\\.com)|(_2vMembers_@www\\.dailybibleguide\\.com)|(_39Members_2@www\\.mapsgalaxy\\.com)|(_49Members_@www\\.utilitychest\\.com)|(_4jMembers_@www\\.radiorage\\.com)|(_4lMembers_@www\\.bibletriviatime\\.com)|(_4zMembers_@www\\.videodownloadconverter\\.com)|(_57Members_@free\\.marineaquariumfree\\.com)|(_5aMembers_@download\\.mywebface\\.com)|(_5eMembers_@www\\.translationbuddy\\.com)|(_5mMembers_@download\\.myfuncards\\.com)|(_5pMembers_@www\\.metrowhiz\\.com)|(_64Members_@www\\.televisionfanatic\\.com)|(_69Members_@www\\.packagetracer\\.com)|(_6xMembers_@www\\.readingfanatic\\.com)|(_73Members_@www\\.easyhomedecorating\\.com)|(_7eMembers_@www\\.homeworksimplified\\.com)|(_7jMembers_@download\\.gardeningenthusiast\\.com)|(_7nMembers_@download\\.crazyforcrafts\\.com)|(_8eMembers_@download\\.howtosimplified\\.com)|(_8hMembers_@download\\.allin1convert\\.com)|(_8iMembers_@download\\.audiotoaudio\\.com)|(_8jMembers_@download\\.myimageconverter\\.com)|(_8lMembers_@free\\.filesharefanatic\\.com)|(_94Members_@www\\.motitags\\.com)|(_9eMembers_@free\\.findmefreebies\\.com)|(_9pMembers_@free\\.onlinemapfinder\\.com)|(_9tMembers_@download\\.internetspeedtracker\\.com)|(_9tMembers_@free\\.internetspeedtracker\\.com)|(_apMembers_@free\\.puzzlegamesdaily\\.com)|(_b7Members_@free\\.mytransitguide\\.com)|(_beMembers_@free\\.dailylocalguide\\.com)|(_brMembers_@free\\.yourtemplatefinder\\.com)|(_ceMembers_@free\\.easypdfcombine\\.com)|(_chMembers_@free\\.discoverancestry\\.com)|(_d0Members_@free\\.gostudyhq\\.com)|(_d1Members_@free\\.mysocialshortcut\\.com)|(_d9Members_@www\\.everydaylookup\\.com)|(_dbMembers_@free\\.getformsonline\\.com)|(_dgMembers_@free\\.trackapackage\\.net)|(_dhMembers_@www\\.packagetracking\\.net)|(_diMembers_@www\\.easymaillogin\\.com)|(_djMembers_@www\\.emailfanatic\\.com)|(_dnMembers_@www\\.webmailworld\\.com)|(_doMembers_@free\\.convertanyfile\\.com)|(_dpMembers_@free\\.findyourmaps\\.com)|(_dqMembers_@www\\.downspeedtest\\.com)|(_drMembers_@free\\.downloadinboxnow\\.com)|(_dsMembers_@free\\.internetspeedutility\\.net)|(_duMembers_@free\\.funpopulargames\\.com)|(_dvMembers_@www\\.testinetspeed\\.com)|(_dxMembers_@www\\.download-freemaps\\.com)|(_dzMembers_@www\\.pconverter\\.com)|(_e1Members_@free\\.actionclassicgames\\.com)|(_e5Members_@www\\.productivityboss\\.com)|(_e6Members_@www\\.freelocalweather\\.com)|(_e7Members_@free\\.gamingassassin\\.com)|(_eaMembers_@www\\.mynewsguide\\.com)|(_ebMembers_@download\\.metrohotspot\\.com)|(_ecMembers_@www\\.instantradioplay\\.com)|(_edMembers_@free\\.myradioaccess\\.com)|(_eeMembers_@download\\.freeradiocast\\.com)|(_efMembers_@free\\.funcustomcreations\\.com)|(_ehMembers_@free\\.dailyrecipeguide\\.com)|(_eiMembers_@www\\.100sofrecipes\\.com)|(_ejMembers_@free\\.downloadrecipesearch\\.com)|(_ekMembers_@free\\.biggamecountdown\\.com)|(_eoMembers_@www\\.transitsimplified\\.com)|(_erMembers_@free\\.getvideoconvert\\.com)|(_esMembers_@free\\.downloadmanagernow\\.com)|(_euMembers_@free\\.filesendsuite\\.com)|(_ewMembers_@free\\.mergedocsonline\\.com)|(_exMembers_@free\\.easydocmerge\\.com)|(_f7Members_@download\\.smsfrombrowser\\.com)|(_fdMembers_@wallpapers\\.myway\\.com)|(_fkMembers_@free\\.getflightinfo\\.com)|(_foMembers_@free\\.flightsearchapp\\.com)|(_fpMembers_@free\\.passwordlogic\\.com)|(_frMembers_@free\\.testforspeed\\.com)|(_fsMembers_@free\\.pdfconverterhq\\.com)|(_ftMembers_@free\\.mytelevisionhq\\.com)|(_fvMembers_@free\\.directionsace\\.com)|(_fwMembers_@free\\.howtosuite\\.com)|(_fxMembers_@free\\.mytransitplanner\\.com)|(_g3Members_@free\\.easyphotoedit\\.com)|(_gcMembers_@www\\.weatherblink\\.com)|(_gpMembers_@free\\.mymapswizard\\.com)|(_gtMembers_@free\\.gamingwonderland\\.com)|(_h2Members_@free\\.calendarspark\\.com)|(_hbMembers_@free\\.quickphotoedit\\.com)|(_hfMembers_@free\\.everydaymanuals\\.com)|(_hgMembers_@free\\.atozmanuals\\.com)|(_hmMembers_@free\\.easyweatheralert\\.com)|(_hnMembers_@free\\.quickweatheralert\\.com)|(_hoMembers_@free\\.directionsbuilder\\.com)|(_hpMembers_@free\\.easyfileconvert\\.com)|(_hqMembers_@free\\.scenichomepage\\.com)|(_hvMembers_@free\\.myfileconvert\\.com))$/","prefs":[],"schema":1576757193463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598806","why":"These add-ons collect ancillary user data among other policy violations.","name":"New tab data collection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b799430-d1a3-49a8-91a2-f45069528ebe","last_modified":1576771656988},{"guid":"/^((\\{02cfe44d-20d1-4275-b325-42888248443d\\})|(\\{03476021-f140-425d-8e62-a6455206a874\\})|(\\{0a50fe22-313f-4a59-9032-2fd63bdd2815\\})|(\\{21c91802-e348-4dd0-820a-07aca1de12a5\\})|(\\{24f43a02-83c5-44cd-a611-0bae2093393f\\})|(\\{257284b0-be1d-44e4-8321-b2a7a56c2eb5\\})|(\\{2610c188-123a-4e4f-a6c7-2ed7e8b70bf6\\})|(\\{26a28ba8-d8e3-4284-ab58-8542144ff657\\})|(\\{27e8838f-91ab-486b-8851-9de8bd633aac\\})|(\\{27f348a5-adb0-4037-bc03-f6832cfd6fc3\\})|(\\{28f5d824-8067-4859-8fe3-22a5f96552bc\\})|(\\{32f66767-230f-4dd8-8538-d6dca8b327f6\\})|(\\{35a35db0-010b-4105-9dc3-d5fe761023ab\\})|(\\{3d61019d-c636-4c0d-91d2-6e2d734014e0\\})|(\\{44c9b9cf-b960-45fc-bf0a-9be9c455c975\\})|(\\{48e711a3-644f-4520-8205-11b377df480e\\})|(\\{50ba963f-1b4a-4ed0-b22f-8e1c18d17364\\})|(\\{53150391-1080-4a50-96ed-de24a6ea24c6\\})|(\\{5570199f-fc69-45eb-a0b0-7cc60089022c\\})|(\\{595c83ad-5a64-4740-a118-39a49aede0e3\\})|(\\{5ae5110f-449e-4c5e-b247-9d1e9971d3bc\\})|(\\{61b734ef-f886-4466-8525-8276e9b19b55\\})|(\\{64e9998b-c477-4c29-bf1d-945146cf9376\\})|(\\{682ff4d6-9b2b-4e1b-99b0-e2dcc2476bd1\\})|(\\{6836a626-1ec1-4c3c-9b25-5e4cd5048ad5\\})|(\\{69f1dda4-a6fa-49f6-a16c-7b3bc3e0e520\\})|(\\{6b7eb4f0-ef7d-4da4-8c3d-21b7c2dfb19f\\})|(\\{725f919c-8adf-4192-9c0e-89ab1027161e\\})|(\\{7320730b-e202-4405-8d76-97a862239701\\})|(\\{79821b50-57ca-4267-9dbf-84aeb061e126\\})|(\\{7ee25d12-df90-4a6a-a068-7a6919651bc7\\})|(\\{816b4ade-7b69-4a73-994a-b37f9939d5d8\\})|(\\{82956d74-9e19-4770-97cc-73caa2c9f711\\})|(\\{839b2467-6857-49f9-a730-baf7b2a98039\\})|(\\{85af3203-f8a3-4ba5-8d0f-c3ee1d38c0d8\\})|(\\{8866f414-2f72-44a6-b7dc-6959891e9ee3\\})|(\\{914f8b0b-f4e0-46d5-bae6-4fadd78ebe8c\\})|(\\{93969099-a7b4-43aa-bcc0-241676204257\\})|(\\{972315f7-e09e-4f7d-b4d7-1ed093e06dc0\\})|(\\{98c7dc13-2e24-4ea0-8f02-34a2e19f19f1\\})|(\\{99ca0fea-aa27-42b9-9dfb-5c2b02601d30\\})|(\\{9cd8f1f0-b739-427a-9378-16dee329a2b6\\})|(\\{9f0a0293-94ca-4e27-b697-2032f455a12f\\})|(\\{a41f8d9a-ea42-4d59-8966-5f9e805246a5\\})|(\\{b21eea41-def0-4ab6-afe4-ec98397bf59c\\})|(\\{b7561855-e073-4a3a-b827-33bd97042442\\})|(\\{b8b11c35-1c11-4634-9b20-6aff2344a65d\\})|(\\{b90bc248-5b37-4de0-be18-0f208c5cf958\\})|(\\{be17a3b2-18a6-4925-aa7c-bb377bec7793\\})|(\\{be82443f-f8e0-46eb-8cda-80ff1d911a16\\})|(\\{ccce69c0-3cc6-4e63-acb6-77a7c63772ed\\})|(\\{daf9a25c-83b8-4e4b-aca2-ff7ca55289d3\\})|(\\{db7d9d1b-1758-44a0-a8fb-0eb2f3ac4d36\\})|(\\{de34ccf4-0634-4ba2-9bdc-42b293c8cdc8\\})|(\\{df2bbd0f-0a8a-45de-a75b-4349835a8576\\})|(\\{e203bc10-6462-49e6-8f2f-223a29ce82d7\\})|(\\{e66e26fe-5092-4fbd-9851-78a1f5c34575\\})|(\\{ebaf7169-6df9-463f-bf15-10f48143bf73\\})|(\\{ebe3c932-d6fe-4ad7-9eb9-7857aa6fd1ca\\})|(\\{f83c3eae-8dd8-4f38-b7c0-272e34599771\\})|(\\{fb00fead-b480-4906-8b4c-4039c272b83d\\})|(\\{fc14529e-1b64-4717-8a1f-6634cc343c7c\\})|(@blackfridaystores)|(@blackfridaystoresco)|(@blah)|(@celebjunky)|(@checkmaps)|(@childt)|(@convertmypdf)|(@convertmypdfco)|(@dailyjobssearch)|(@dogs)|(@email\\.superextension\\.info)|(@flirtywallpapers)|(@justlovepetscom)|(@liveemail)|(@localweathertoday)|(@localweathertodayco)|(@loginpro)|(@mapsfinder)|(@mynetspeed)|(@mynetspeed\\.co)|(@mynetspeedco)|(@qwertyuiop)|(@qwertyuiopasdf)|(@searchprivacy)|(@searchprivacy-fx)|(@searchprivacy-fx-1\\.1\\.15)|(@searchprivacy-fx-1\\.1\\.16)|(@searchprivacy-fx-1\\.1\\.17)|(@searchprivacy-fx-1\\.1\\.18)|(@searchprivacy-fx-1\\.1\\.19)|(@searchprivacy-fx-1\\.1\\.20)|(@sportsbulletin)|(@sportsupdates)|(@thecouponstore)|(@trailertab)|(@wheresmypackage)|(@wheresmypackageco)|(@www\\.blackfridaystores\\.co)|(@www\\.convertmypdf\\.online)|(@www\\.convertthepdf\\.com)|(@www\\.dailyjobssearch\\.net)|(@www\\.easyonlinerecipe\\.info)|(@www\\.EasyOnlineRecipe\\.net)|(@www\\.easyrecipesearch\\.net)|(@www\\.findmaps\\.co)|(@www\\.job-portal\\.co)|(@www\\.justlovepets\\.online)|(@www\\.movie-quest\\.co)|(@www\\.mymapbuddy\\.net)|(@www\\.mynetspeed\\.co)|(@www\\.searchsafe\\.online)|(@www\\.searchsafe\\.site)|(@www\\.searchsafe\\.space)|(@www\\.searchsafe\\.website)|(@www\\.thecouponstore\\.co)|(@www\\.thecouponstore\\.co\\.test2)|(abc_KtOQLgxUgW@abc)|(Access_Mails_Now_YEsNTbvoal@www\\.accessmailsnow\\.com)|(Access_My_Inbox_zPsghWWAPc@www\\.accessmyinbox\\.com)|(Accurate_Weather_Today_clone_vGXzNgIjwr@www\\.accurateweathertoday\\.com)|(Accurate_Weather_Today_clone_zpRLPSpMcU@www\\.accurateweathertoday\\.com)|(alot_Search_unSoxsuUZQ@www\\.searchalot\\.co))$/","prefs":[],"schema":1576757781685,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598770","why":"This add-on violates Mozilla's add-on policies by collecting ancillary data and/or by overriding search behavior without user consent or control.","name":"Search hijacking and new-tab add-ons collecting data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0be3662-6b8f-4d91-bbe1-fde9500adb48","last_modified":1576771656985},{"guid":"/^((\\{a4b95555-755a-4a3f-bc64-f6999377963d\\})|(djamol@webdownloader)|(\\{b23e59ff-5491-40f4-adb2-577d31d8778a\\})|(\\{90e41842-755d-40e0-9136-8129df55a644\\})|(\\{8e0ccf87-6ea4-4985-b07f-4d503f105d91\\})|(\\{69d0ae35-7d39-4c41-b455-4d751117317e\\})|(\\{df0dfe82-78a9-456e-9dc1-c832a94d43a7\\})|(\\{7bbd26d9-d245-48d3-b3a6-5e19948dfa14\\})|(\\{3d9109d8-463e-4dde-9416-d25c6ea995df\\})|(\\{2726adf8-c1f9-4ed9-baf1-9a3c1742b659\\})|(\\{bfc40cf5-a085-4f0b-a3ef-5e124f2e445e\\})|(\\{37927c18-d5a5-4187-9e6e-6a787364bd9f\\}))$/","prefs":[],"schema":1576093292597,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603731","why":"These add-ons violate Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b8daa919-7a9f-4a83-8aef-4a5d3fbfb502","last_modified":1576242123974},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e15}","prefs":[],"schema":1576032043088,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603086","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3774104-d770-48a5-acd7-c7136d62bb40","last_modified":1576068160484},{"guid":"{d69204d4-610c-4144-9d26-8cf8b2ad6e14}","prefs":[],"schema":1576012075125,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1603001","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8c92ab3a-9c31-4f75-b980-19e39b702fd8","last_modified":1576032042722},{"guid":"/^((\\{108dfe62-0473-47cd-b33e-8270d062db77\\})|(\\{e4a4e54a-5d49-4ac3-93d7-ec0d30ad06ef\\})|(\\{ccad95df-add6-4d8a-aa5c-cdc484075bad\\}))$/","prefs":[],"schema":1575996881649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602162","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fd42cd0b-a72a-4a0f-9a6a-965ee2f29cb6","last_modified":1576012074754},{"guid":"{7bb202fa-9247-49c6-898c-ce0d36bc44e3}","prefs":[],"schema":1575976576210,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602821","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MyPopupBlocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"810f4d41-368a-4cfc-8513-81063587b97c","last_modified":1575996881281},{"guid":"@cloaking-skull","prefs":[],"schema":1575920492132,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602736","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Cloaking Skull"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4438f49a-2f78-48d9-bc7e-a897f3f62945","last_modified":1575976575848},{"guid":"/^((photoplus@4329fgjfdgkf343\\.com)|(\\{1b1c9b32-9dd3-461c-85c6-bbac4ef2af10\\})|(\\{7DC6D86C-EA66-48C3-9BA7-AE26A8ECB175\\})|(david\\.janitzek@gmail\\.com)|(\\{ac393d9e-1610-4eaa-8951-77655f98b4f7\\}))$/","prefs":[],"schema":1575890870070,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602406","why":"This add-on violates Mozilla's ad-don policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa154bb5-7fc9-4226-928e-199aa7eded69","last_modified":1575892910839},{"guid":"/^((\\{e1d407bc-1986-4577-bc31-a63d07cbae10\\})|(\\{3a2831f6-37df-4a42-baf6-0b81d5b6a68f\\})|(s3google@translator))$/","prefs":[],"schema":1575889775993,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602293","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"S3 Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eac7bf16-aae5-4958-8b85-5dcc9a3a1ce8","last_modified":1575890869693},{"guid":"/^((\\{87dd9a06-b692-4fa0-91c4-0aead43c25cc\\})|(\\{9082269e-1de7-4d34-9736-1174917f9459\\}))$/","prefs":[],"schema":1575747691126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602285","why":"These add-ons violate Mozilla's add-on policy by executing remote code and/or collecting ancillary data.","name":"HomeTab/FLSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1af528d2-d0e1-4981-acfa-3b10501aed34","last_modified":1575889775630},{"guid":"/^((xh5yh45p59fdrtimlot6@xh5yh45p59fdrtimlot6\\.com)|(758ct3wkmbrvd8equs21@758ct3wkmbrvd8equs21\\.com))$/","prefs":[],"schema":1575661660854,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602098","why":"This add-on violates Mozilla's add-on policy by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"235d9439-305c-48db-a6da-5a8639ab9c80","last_modified":1575663903042},{"guid":"{ecc522ab-9926-4dc5-90ab-8f979db871ed}","prefs":[],"schema":1575651664337,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1602087","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YTMP4DL"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01645c30-87fc-4332-9c94-255ef9e50120","last_modified":1575661660491},{"guid":"/^((\\{81f244fc-e5ab-4233-bad0-f61f334dcd43\\})|(\\{98222415-4241-4b89-b81d-651c1a872881\\}))$/","prefs":[],"schema":1575628797035,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601546","why":"This add-on violates Mozilla's add-on policies by facilitating access to malicious web content and software.","name":"Video download add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"404e3032-80a6-43f5-a02e-c7d4e8f684d5","last_modified":1575632376941},{"guid":"{c5b1783f-29c8-4bb0-ab8b-a6a9a0c5e4e0}","prefs":[],"schema":1575627603102,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1601747","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM Download faster music (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ef1c681a-ecca-4ea0-b798-6a093765b984","last_modified":1575628796682},{"guid":"/^((smartnav@navigation-internet\\.com)|(game@ultimate-cosmo\\.com)|(update@ultimate-cosmo\\.com)|(extension@gum-gum-streaming\\.com)|(extension@one-piece-fighting\\.com)|(extension@manga-vf\\.fr)|(adblock@gum-gum-streaming\\.com)|(adblock@manga-vf\\.fr))$/","prefs":[],"schema":1575313586028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600592","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0b0c648b-1f8d-49f4-bd6e-96e69bbebb45","last_modified":1575376981463},{"guid":"/^((\\{33a89146-6b66-4834-bea3-18733d7646f8\\})|(\\{55f304c0-a431-4b35-8cd0-472569a9dd86\\})|(\\{581fae86-7847-448d-9950-5a96127b293a\\})|(\\{9f2a514d-e9dd-4bd6-b743-b15492c10167\\})|(\\{28bf22b4-d52d-4d8a-b710-3868b3bc46ce\\})|(\\{3e9246fc-8125-499b-984e-a8b68507bd36\\})|(\\{731784b0-81c4-4fe9-8741-f5960e12088c\\})|(\\{21585a0f-bcb6-480c-9f70-5cd33cf64833\\})|(\\{2741fd42-3faa-4cef-9b08-361f0c4990ea\\})|(\\{4c479c80-2f53-4d38-a366-0f0c3a346d40\\})|(\\{c4471705-e0eb-47ed-8af9-046c1e808fdd\\})|(\\{2b2bc8ab-5a38-4a26-8ce1-2af9fa2ad7bf\\})|(\\{6840b587-8324-44a0-b176-56d15580dde4\\})|(\\{44d8d882-f6a0-4349-93bc-d3a2353a3fd3\\})|(\\{ddf7716b-badc-417c-b3ce-6322fd67cc65\\})|(\\{82abdf82-f361-47ab-bab7-7f862e132e06\\})|(\\{d24e0155-d36c-402e-943f-d5816451e86f\\})|(\\{926f1f58-3c6e-4f07-8847-2998dc0f1dbd\\})|(\\{e8d228cc-ecb9-4ef6-98e3-8052858fd3ea\\})|(\\{86a868c9-707f-46e8-88ca-5edde6a549e2\\})|(\\{7d5a68c2-261f-449f-af8d-b99a7ae7a01f\\})|(\\{e579c6fb-bf80-4ae5-b3d2-613e084af7fa\\})|(\\{ef7a3832-deb4-4798-b61b-a7cc8b8aa1e2\\})|(\\{48532584-e4dc-4902-b27d-ce35cb29c4c7\\})|(\\{b792fe29-4eb1-412b-bd0b-458252dfab39\\})|(\\{c6f8a307-8024-4e6f-a5f1-595ba43d765e\\})|(\\{7c7a26bd-b1cb-4088-a16e-48f26d22d569\\})|(\\{ff3b2825-86da-4525-abe6-c673b70f58cc\\})|(\\{d4def0be-0d09-453a-9cca-ddc1e1cc9a1d\\})|(\\{0024b95a-9610-4e9d-b836-da40c99c959e\\})|(\\{b09a0797-b6d2-485e-8afc-8361055761ea\\})|(\\{f5c86ae7-cf67-43f8-895c-b2b19209ee81\\})|(\\{bc5d5c2b-e895-49d5-966b-cd1aaee9d324\\})|(\\{a6a8b5c9-45da-457e-990c-b89515139e80\\})|(\\{6d00e6c8-2f26-4dad-81e6-888c080ddfc7\\})|(\\{8f4412a8-c670-4298-a0bc-da30dc3a5ae2\\})|(\\{912d27f7-d9ac-489b-8d7c-2873526e11fc\\})|(\\{3d47bef5-277d-4f06-8ad8-802266e57d17\\})|(\\{0e0bbc6c-914e-47e2-96b9-33f94af6f0a7\\})|(\\{e0f289e7-1284-496b-aa09-f052089d61a3\\})|(\\{64832a69-731b-4481-ad59-3c8aa4006643\\})|(\\{c174dc42-ad4e-4378-8f07-8a47025f8407\\})|(\\{28753278-896f-4f48-8ef3-ea3379896a40\\})|(\\{cdb22d53-d13d-4500-af92-7e653e988722\\})|(\\{65d037b6-c44d-49c5-aa10-a947940c61cb\\})|(\\{d4906685-5b71-49a8-92b5-76f19f2b0a66\\})|(\\{2bebc776-9ee0-47c8-9c99-0351b140ffd2\\})|(\\{58d56295-8d0f-4fe1-8538-2d916911e304\\})|(\\{19283d7a-9fb5-417e-9401-b952ce14a268\\})|(\\{7338a117-ff10-4862-8992-b42829b2e47b\\})|(\\{8defb767-abf1-4d39-88df-9cfc6a39a8e3\\})|(\\{15a77f39-2b56-46b5-b5d6-6064a6f1fbdd\\})|(\\{87fd9298-3176-400b-be06-45538ecd0702\\})|(\\{cda1cc52-9961-477d-8faa-95c7f9025498\\})|(\\{c8056cfe-0bd7-43db-88ae-468f78cc8637\\})|(\\{54bf103a-3f38-43aa-b1ed-2ccbcadb4e0b\\})|(\\{bb67004c-57d6-4632-bc89-8991560a011f\\})|(\\{2902f9ee-b79a-415f-99bf-b661c2bf42e0\\})|(\\{81e0bd24-a93d-4db0-8db9-d5560805c153\\})|(\\{3004ff5d-c68c-4e2b-80b4-2dc21bde9195\\})|(\\{25bcebd4-1d72-4502-8927-a1a6ac35d595\\})|(\\{0b440d2f-8a97-4d2e-bacb-703260897903\\})|(\\{7d0cc577-51fb-4994-8926-7df70f5f16fc\\})|(\\{a6c138fd-c83d-416b-90a8-74bfafefb67a\\}))$/","prefs":[],"schema":1575229292065,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600576","why":"This add-on violates Mozilla's add-on policy by collecting data without user disclosure or consent.","name":"Add-ons collecting data without user disclosure or consent"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"80a34f3f-1f4e-47cb-99a4-1b343b322455","last_modified":1575285295616},{"guid":"/^((_qdMembers_@extmys\\.mysearch\\.com)|(_qjMembers_@www\\.taxcenternow\\.com)|(_ohMembers_@www\\.whizds1\\.com)|(_opMembers_@tvhero\\.thewhizmarketing\\.com)|(_oqMembers_@sportsaddict\\.thewhizproducts\\.com)|(_ooMembers_@yourdailytrailer\\.yournewtab\\.com)|(_olMembers_@screendream\\.yournewtab\\.com)|(_orMembers_@sporthero\\.thewhizmarketing\\.com)|(_osMembers_@gogamego\\.thewhizproducts\\.com)|(_r3Members_@www\\.mysearch\\.com)|(_ojMembers_@www\\.whizds2\\.com)|(_flMemberstest_@free\\.myformsfinder\\.com)|(_dqMemberstest_@www\\.downspeedtest\\.com)|(_flMembersAlt_@free\\.myformsfinder\\.com)|(_dqMembersAlt_@www\\.downspeedtest\\.com)|(_rcMembers_@www\\.extsb\\.searchbetter\\.com)|(_piMembers_@install\\.mysporttab\\.com)|(_phMembers_@install\\.streamfrenzy\\.com)|(_pfMembers_@install\\.myvideotab\\.com)|(_qxMembers_@install\\.utili-site\\.com)|(_qyMembers_@install\\.cryptoconvertertab\\.com)|(_r4Members_@install\\.salah-time\\.com)|(_r9Members_@install\\.speed-exam\\.com)|(_rbMembers_@Install\\.movie-canal\\.com)|(_poMembers_@www\\.linkuryds1\\.com)|(_l9Members_@www\\.plaskodss3\\.com)|(_ppMembers_@www\\.firstofferzds1\\.com)|(_qkMembers_@www\\.exploreads\\.com)|(_kfMembers_@www\\.bluecpads\\.com)|(_k2Members_@www\\.arcadejetds\\.com)|(_qiMembers_@tvguru-lp\\.olympuswaymarketing\\.com)|(_p8Members_@www\\.easywatch\\.online)|(_kcMembers_@www\\.utilitytab\\.com)|(_kdMembers_@www\\.utilitytab\\.com)|(_qrMembers_@www\\.install\\.utilitytab\\.com)|(_qsMembers_@www\\.utilitytab\\.com)|(_izMembers_@www\\.geteasyarcade\\.com)|(_qgMembers_@www\\.getinstantpdf\\.com)|(_p7Members_@www\\.tigersdeal\\.com)|(_jgMembers_@www\\.greathippo\\.com)|(_jdMembers_@www\\.greathippo\\.com)|(_juMembers_@arcadejet\\.com)|(\\{90ac1d06-caf8-46b9-9325-59c82190b687\\}))$/","prefs":[],"schema":1575056491406,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600273","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"196e36b5-3225-4f8d-a1a0-6696ea8885f9","last_modified":1575066166785},{"guid":"{99454877-875a-473e-a0c7-03ab910a8461}","prefs":[],"schema":1575040644063,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600327","why":"The add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Smart Screen Capture"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f98e9e7-40d0-4af5-969c-9ea1aadbf280","last_modified":1575041576477},{"guid":"/^((Stark-vpn\\.5\\.16@firefox\\.com)|(Video_Downloader_Plus@gmail\\.com))$/","prefs":[],"schema":1575038746215,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600322","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89027d84-8871-4d44-8a14-18f029df268b","last_modified":1575040643688},{"guid":"/^((\\{b3d1c58f-b27e-4da8-bd4c-c3188346139f\\})|(\\{17101510-b5fb-4361-9e02-70a0e714b591\\})|(\\{d46a3635-4ca8-4e70-8bee-e49714896521\\}))$/","prefs":[],"schema":1574981048393,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1600315","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"36b86fac-a1f2-4df5-937a-d5667e0e824d","last_modified":1575038745843},{"guid":"/^((_orMembers_@www\\.apn\\.ask\\.com)|(_jsMembers_@www\\.apn\\.ask\\.com)|(_osMembers_@www\\.apn\\.ask\\.com)|(_otMembers_@www\\.apn\\.ask\\.com)|(_owMembers_@www\\.apn\\.ask\\.com)|(_ogMembers_@seen-on-screen\\.thewhizmarketing\\.com)|(_qeMembers_@app\\.mysearch\\.com)|(_otMembers_@muzikfury\\.thewhizmarketing\\.com)|(_oiMembers_@screenaddict\\.thewhizproducts\\.com)|(_omMembers_@screenwatch\\.yournewtab\\.com)|(_okMembers_@www\\.whizds3\\.com)|(_j0Members_@www\\.gettvstreamnow\\.com)|(_64Members_b@www\\.televisionfanatic\\.com)|(_ruMembers_@getscreenmania\\.com)|(_rxMembers_@www\\.gamelocket\\.com)|(_s1Members_@www\\.deadlockds\\.com)|(_s3Members_@www\\.mysearchappwhiz\\.com)|(_rvMembers_@www\\.groovymediads\\.com)|(_s8Members_@secure\\.norton\\.myway\\.com)|(_r3Members_@free\\.mysearch\\.com)|(_sgMembers_@www\\.easyhowtoguide\\.com)|(_shMembers_@www\\.fastformsfinder\\.com)|(_siMembers_@www\\.mydirectionsfinder\\.com)|(_seMembers_@www\\.brightcast\\.com)|(_spMembers_@www\\.onlinemapsnow\\.com)|(_slMembers_@www\\.creativeinternetds\\.com)|(_hpMembers0619_@free\\.easyfileconvert\\.com)|(_ceMembers0619_@free\\.easypdfcombine\\.com)|(_euMembers0619_@free\\.filesendsuite\\.com)|(_dpMembers0619_@free\\.findyourmaps\\.com)|(_dxMembers0619_@www\\.download-freemaps\\.com)|(_65Members0619_@download\\.fromdoctopdf\\.com)|(_dbMembers0619_@free\\.getformsonline\\.com)|(_39Members0619_@www\\.mapsgalaxy\\.com)|(_ewMembers0619_@free\\.mergedocsonline\\.com)|(_flMembers0619_@free\\.myformsfinder\\.com)|(_d1Members0619_@free\\.mysocialshortcut\\.com)|(_b7Members0619_@free\\.mytransitguide\\.com)|(_ozMembers0619_@free\\.newnotecenter\\.com)|(_jbMembers0619_@www\\.onlinemapsearch\\.com)|(_jjMembers0619_@www\\.onlineroutefinder\\.com)|(_69Members0619_@www\\.packagetracer\\.com)|(_fsMembers0619_@free\\.pdfconverterhq\\.com)|(_jnMembers0619_@www\\.pdfconverttools\\.com)|(_gcMembers0619_@www\\.weatherblink\\.com)|(_brMembers0619_@free\\.yourtemplatefinder\\.com)|(_s5Members_@www\\.bluecpads1\\.com)|(_j5Members0619_@ext\\.ask\\.com)|(_5zMembersff0619_@www\\.couponxplorer\\.com)|(_1gMembersff0619_@www\\.inboxace\\.com)|(_flMembersff1219_@free\\.myformsfinder\\.com)|(_j5Membersff1219_@ext\\.ask\\.com)|(_8eMembersff1219_@download\\.howtosimplified\\.com)|(_8jMembersff1219_@download\\.myimageconverter\\.com)|(_94Membersff1219_@www\\.motitags\\.com)|(_ceMembersff1219_@free\\.easypdfcombine\\.com)|(_d1Membersff1219_@free\\.mysocialshortcut\\.com)|(_dqMembersff1219_@www\\.downspeedtest\\.com)|(_dzMembersff1219_@www\\.pconverter\\.com)|(_dpMembersff1219_@free\\.findyourmaps\\.com)|(_e1Membersff1219_@free\\.actionclassicgames\\.com)|(_e5Membersff1219_@www\\.productivityboss\\.com)|(_ewMembersff1219_@free\\.mergedocsonline\\.com)|(_euMembersff1219_@free\\.filesendsuite\\.com)|(_dsMembersff1219_@free\\.internetspeedutility\\.net)|(_fsMembersff1219_@free\\.pdfconverterhq\\.com)|(_iwMembersff1219_@free\\.allinonedocs\\.com)|(_hoMembersff1219_@free\\.directionsbuilder\\.com)|(_hpMembersff1219_@free\\.easyfileconvert\\.com)|(_hxMembersff1219_@free\\.mergedocsnow\\.com)|(_hyMembersff1219_@free\\.formfetcherpro\\.com)|(_i2Membersff1219_@free\\.streamlineddiy\\.com)|(_i4Membersff1219_@free\\.fileconvertonline\\.com)|(_j6Membersff1219_@www\\.freemanualsindex\\.com)|(_jbMembersff1219_@www\\.onlinemapsearch\\.com)|(_jaMembersff1219_@www\\.testonlinespeed\\.com)|(_joMembersff1219_@www\\.onlineformfinder\\.com)|(_jnMembersff1219_@www\\.pdfconverttools\\.com)|(_k8Membersff1219_@www\\.mymapsexpress\\.com)|(_koMembersff1219_@www\\.quickpdfmerger\\.com)|(_kxMembersff1219_@www\\.smarteasymaps\\.com)|(_l6Membersff1219_@www\\.propdfconverter\\.com)|(_l4Membersff1219_@www\\.quicktemplatefinder\\.com)|(_l1Membersff1219_@www\\.videoconverterhd\\.com)|(_ozMembersff1219_@free\\.newnotecenter\\.com)|(_lbMembersff1219_@free\\.worldofnotes\\.com)|(_q8Membersff1219_@www\\.getformsfree\\.com)|(_psMembersff1219_@www\\.freetemplatefinder\\.com)|(_pvMembersff1219_@www\\.mapmywayfree\\.com)|(_gcMembersff1219_@www\\.weatherblink\\.com)|(_65Membersff1219_@download\\.fromdoctopdf\\.com)|(_sxMembers_@www\\.mapsmasteronline\\.com)|(_j6Members_@ext\\.ask\\.com)|(_66Members_@download\\.fromdoctopdf\\.com)|(_htMembers_@free\\.gamingwonderland\\.com)|(_5zMembers_@www\\.videodownloadconverter\\.com))$/","prefs":[],"schema":1574953312771,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598777","why":"These add-ons collect ancillary user data among other policy violations.","name":"New Tab Data Collection Extensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f541ab9d-f671-421f-9aed-b27c63d11377","last_modified":1574981047945},{"guid":"/^((\\{7410146d-cf60-4175-a74a-0a7f7785bbff\\})|(\\{e9083fad-c9c7-4ff3-8bb5-b300d3f33546\\})|(\\{6bed141b-56b5-4209-84e1-93c67bf87711\\}))$/","prefs":[],"schema":1574883692223,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599563","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"51353b78-a8ca-4411-98b8-e9585c03f8c7","last_modified":1574953312403},{"guid":"/^((\\{d251b448-d876-4f25-87b3-9dd858a077df\\})|(\\{3f711bc3-65bc-41bd-842f-d21b6cb90313\\}))$/","prefs":[],"schema":1574869966668,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599833","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ff958539-ae4f-4008-8413-a3fd86950380","last_modified":1574876724352},{"guid":"/^((\\{cce3a95c-5f17-4ca1-aa0b-b5a8dc3a1b45\\})|(\\{f7c272df-f8e3-419f-b48d-759b9326d51a\\})|(\\{75a25121-873d-4da0-9aec-c4fa83cf13d3\\})|(\\{042080fd-5127-409c-88e7-47136fda641f\\})|(\\{12b167db-911b-4091-b8e5-e9292643610f\\})|(\\{d386a8b2-fba8-47ab-924d-f43d86d9edd0\\})|(\\{995f0889-b95c-4ae7-9510-e6fddf76b62c\\})|(\\{9be5400b-715c-4f49-9085-e1bdfda4a873\\})|(\\{6680a4ae-e659-47f5-9e4e-0ee72494e3af\\})|(\\{2215fd58-f9b5-4d6d-be8a-805716380cac\\})|(\\{041e6a70-edc0-4e6b-a799-0b15d1c95ddb\\})|(\\{4ba68aef-ec5e-412b-9516-d2a7401c0a22\\})|(\\{5c97c09b-6a3f-43cb-950e-c02074193751\\})|(\\{de5d0076-fa35-468e-8b72-6b5524be0684\\})|(\\{702841c9-cd9b-411f-9c8f-7616e75ce749\\})|(\\{bdfaccd7-c343-435a-b22a-fbb8052bd40b\\})|(\\{3a37182d-5653-4c5e-9729-eee005d24dfd\\})|(\\{18a44708-ff7b-45f6-96de-f2ce4373d185\\})|(\\{6c632bb3-04d3-4744-b04d-cd5dbfef41d2\\})|(\\{7ae0db73-6402-44f7-b4f3-81b7ce81bf6a\\})|(\\{716440c3-3ced-41a7-a5b3-ee1da1bfa9f2\\})|(\\{abf84dc9-1ff8-47df-a68b-70e2e8627610\\})|(\\{a369dded-b0bc-446a-b900-c56eaa74042d\\})|(\\{828e6aed-955b-4a9f-9ec2-126f7dc51f37\\})|(\\{58f9ab34-78e6-4432-912a-c13fafc24a03\\})|(\\{68b7cc55-0874-4f91-a519-7b8283b7e974\\})|(\\{71545b8d-0ebb-4767-8864-5fc8dbdbbdee\\})|(\\{217e14c5-4d4b-4691-8428-48ad484f8c04\\})|(\\{6d20b3d7-ccd6-4fa5-ae08-0343193b5518\\})|(\\{ffdb8967-9d19-4377-a728-735f21941d15\\})|(\\{5edc78a5-f41b-4e4b-90e3-ef4fa429feef\\})|(\\{12fb0651-0d2f-4c97-aa37-9121bade678c\\})|(\\{b7c5d63f-b160-48fb-a1fc-485d5e014c63\\})|(\\{4e72d89b-8481-40ae-93d9-93d3316a5d40\\})|(\\{edd994cd-7724-43d3-807b-19bc2749187a\\})|(\\{238a0064-70ee-4d1e-8dca-4bb5a893b44f\\})|(\\{3671ddcb-11ea-4f05-b97d-989d94c42279\\}))$/","prefs":[],"schema":1574789062671,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599537","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"310e84ca-b967-4d81-b990-4d0697d62a6e","last_modified":1574869966292},{"guid":"/^((oawef0q29r43oq2\\.com@oawef0q29r43oq2\\.com)|(950opeokfp242@950opeokfp242\\.com)|(jggzkdudsuumeasqvler@jggzkdudsuumeasqvler\\.com)|(bdcixfqemzjezxbnzicj@bdcixfqemzjezxbnzicj\\.com)|(ne3787m9ykowhnicg8yx@ne3787m9ykowhnicg8yx\\.com)|(799v8e4cklkpetj0l56x@799v8e4cklkpetj0l56x\\.com)|(o7b1gs6trq2nkaocoejp@o7b1gs6trq2nkaocoejp\\.com)|(sta528sfzizg0ay009cs@sta528sfzizg0ay009cs\\.com)|(8x837zsyl6iw9hpjxu2w@8x837zsyl6iw9hpjxu2w\\.com)|(3bwrbcltn5fjo73lci00@3bwrbcltn5fjo73lci00\\.com)|(kmqm7cm5tk1l5s55yq7j@kmqm7cm5tk1l5s55yq7j\\.com)|(9n4v5kw9bf8e1f4dl0rq@9n4v5kw9bf8e1f4dl0rq\\.com)|(o4d5u4gzx14iqfuyobjr@o4d5u4gzx14iqfuyobjr\\.com)|(2ln3gtttxoz3tjerbbta@2ln3gtttxoz3tjerbbta\\.com))$/","prefs":[],"schema":1574538091411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1599186","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0ee9e971-ba48-4d51-a907-a3b5533e8e28","last_modified":1574707139043},{"guid":"{3d09bd90-da37-41b5-a719-8da173e9870f}","prefs":[],"schema":1574441398813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598708","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6a12342-3936-41cf-910d-cc133db44d2a","last_modified":1574445055964},{"guid":"Stark-vpn.5.14@firefox.com","prefs":[],"schema":1574438767458,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598688","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Stark VPN"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5d2478e3-cbaa-4192-89f0-5abf3ea10656","last_modified":1574441398416},{"guid":"/^((\\{ac9ec764-a247-4d71-8807-20aa20f93e17\\})|(\\{4253de43-775d-48bc-8e08-fb3f58a2ddaf\\}))$/","prefs":[],"schema":1574434609524,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598672","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search-hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa044b4d-b39e-4ee0-a737-07aca2d672ef","last_modified":1574438767139},{"guid":"/^((\\{cc08012a-f9cd-4bfc-b526-ad8773934a0c\\})|(\\{16fd1825-3f7d-4c38-aa98-78cc4f0a6758\\})|(\\{87261aed-8d85-4037-81fb-4988ae80ee23\\})|(\\{90f51854-74d4-4df9-bf4c-b86f30346bd8\\}))$/","prefs":[],"schema":1574365292775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598646","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"YD"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46ed3cc3-8534-484a-bc58-349824debec6","last_modified":1574434609189},{"guid":"@youtube-adblocker-addon","prefs":[],"schema":1574334260915,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598287","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"126a0720-a22f-41f1-876f-0a3e18b79d2b","last_modified":1574342360895},{"guid":"/^((youtubetomp3@addons\\.youtube\\.com)|(addons-mozilla@youtube-to-mp4))$/","prefs":[],"schema":1574260409481,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1598242","why":"The add-on violates Mozilla's add-on policy by opening websites with malicious intent.","name":"YOUTUBE to MP3"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9729654a-6cd1-4e20-8cf5-47a3ff544ef5","last_modified":1574334260570},{"guid":"/^((\\{333d6dd8-43ed-4f01-944d-b7c737a5db72\\})|(\\{f5712532-777e-4080-b6b9-d548040f7675\\})|(\\{abf3f8d7-bc95-4dd5-ab96-c390ad5f8756\\})|(\\{f769002a-608d-4a8c-adc4-05f4857ff3ae\\})|(\\{1980667f-9bde-4e7e-8d0c-132db12c1b30\\}))$/","prefs":[],"schema":1574192492672,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1597784","why":"Use of affiliate redirects in violation of policy","name":"Affiliate Redidrecting Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28831b71-8a9a-466e-9f34-1f40f2f0e27a","last_modified":1574260409142},{"guid":"/^((_1gMembers_@www\\.inboxace\\.com)|(_39Members_@www\\.mapsgalaxy\\.com)|(_5zMembers_@www\\.couponxplorer\\.com)|(_65Members_@download\\.fromdoctopdf\\.com)|(_flMembers_@free\\.myformsfinder\\.com))$/","prefs":[],"schema":1573749618972,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594461","why":"This add-on does not provide users with an opportunity to refuse the storage of or access to cookies.","name":"New Tab add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d39750c3-a305-4487-bc0f-21500c3597dd","last_modified":1573804224556},{"guid":"/^((\\{c8476e06-0a50-41ec-a840-a2db436cf38c\\})|(youtube\\.downloader@firefox\\.dev)|(youtubedownloader@firefox\\.com)|(youtubehddownloader@firefox\\.com)|(youtube\\.d@firefox\\.dev)|(advblock@blocker)|(YouTube@HD\\.Downloader)|(adt-3\\.0\\.7@blocker)|(\\{7131880e-d327-4802-b5ed-fee33c281abd\\})|(\\{5cb84843-504e-406e-8fb7-051c7fc3c9d3\\})|(\\{d8686bde-e666-4084-ae01-c75aa7a30f93\\})|(\\{96d35545-d94a-4ee1-bc43-d3055650587c\\})|(ali-image-search@4\\.0)|(\\{e7634c48-0d36-448e-891e-b2036beebcd0\\})|(\\{442de29c-b710-45d4-b121-7b4be387c327\\})|(lite-vpn-4\\.1\\.14@gmail\\.com))$/","prefs":[],"schema":1573674093610,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1596468","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons injecting remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"19c04aaf-c02d-4583-9978-c519245cd4fb","last_modified":1573749588529},{"guid":"extension@safeguard.ws","prefs":[],"schema":1573501291938,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595616","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Safe-Guard"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53d8f35e-99ec-44fd-8082-3b713a5afcb3","last_modified":1573507879434},{"guid":"crisorgblack@rampampam","prefs":[],"schema":1573155692372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1595200","why":"This add-on contains unexpected features in violation of our policies.","name":"Flash Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2bb20972-0d56-44c8-a5d6-0e73a1827e92","last_modified":1573247974595},{"guid":"/^((\\{be2f72d6-0c71-4fd0-8914-e27057e51099\\})|(adblock-2019@youtube-addons))$/","prefs":[],"schema":1573060222748,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594498","why":"These add-ons are suspected deceptive and have been disabled for your protection.","name":"Deceptive ad-blocking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"477174ca-470a-40ff-bf8d-2de81c2dc458","last_modified":1573063322832},{"guid":"/^((\\{8f11d935-4bcf-42c8-88c1-7e32e4541c98\\})|(\\{b0a6cb7d-3e77-4a96-aea5-7d0090e55832\\})|(\\{c5a5fd9f-8e84-460d-93dd-499e23b530e9\\})|(\\{ac7c91e8-6797-42ec-a202-5b34dacaa83a\\})|(\\{3784e311-4758-4180-b3e2-2ae42bfb081d\\})|(\\{10f3b1e0-4b97-4cc2-9af6-06a9162ec022\\})|(\\{e1109008-6d70-453d-a84e-3cc0c44af07e\\})|(\\{bb7190ac-8aeb-4a8d-83cf-89c179a4d65e\\})|(\\{a752512a-8287-40c0-97f2-071146da2caf\\})|(\\{185dbeea-416b-4fd6-8512-9ddb941e50b5\\})|(\\{d199eeb9-0964-4dff-94d2-69116fd03418\\})|(\\{d37310a3-08dd-4cb8-a276-3f2bee174555\\})|(\\{b239ce6b-2513-4758-a74e-eae3c8f0a04a\\})|(\\{f0f240d7-ae38-4bf4-a8e2-23d775eb07f4\\})|(\\{1804789c-d056-4887-839c-7a0dcab3be83\\})|(\\{d6115dfe-e3d2-44af-8361-1308c234b14c\\})|(\\{48a804b3-cf0f-4aa1-b798-82e944d7afb0\\})|(\\{3026b451-392b-47d5-b60f-995fb075cfd1\\})|(\\{e050f24c-8e06-4d6f-a962-c6073788ac29\\})|(\\{f45a7c28-423a-46ff-abb6-fc855912d074\\})|(\\{699d463b-dd6c-4cde-bad8-81beb345cb85\\})|(\\{f3a3544e-905d-4cc2-99e2-dd4c928bfc24\\})|(\\{2fa8e43c-084a-4fd7-9873-2d462f535929\\})|(\\{a7a69509-aa1d-42b3-8c8d-b3a2885f9aa7\\})|(\\{f4ca82a2-58cc-4d4f-ab95-1ca0424dcd52\\})|(\\{6f9cc262-0164-47e5-b138-024a525d2498\\})|(\\{b3061ee4-1281-482a-8022-f351c023db8d\\})|(\\{48d4fb44-5ebe-49a0-a731-541f11491d92\\})|(\\{fe8a3e05-e9ff-48d2-9291-b97bd3cba97b\\})|(\\{b7eb6ae4-2476-4ba0-a005-b868eb4bf9b2\\})|(\\{2992ca99-6c98-4864-afbf-d51c9c35ed5a\\})|(\\{2017e4f8-a7fb-421f-a1c5-d7b62189f1db\\})|(\\{d44be860-e0d3-4df2-97e1-eef2075474bc\\})|(\\{d6d4e269-00c4-4eeb-b458-d76222ff52e9\\})|(\\{a0242f56-118b-415c-83d6-8eac264dad4c\\})|(\\{25e8b980-6548-45c4-bb58-a641c13b9807\\})|(\\{40fae6f3-c629-4b2d-b690-bf022ebb2cd8\\})|(\\{359c22b8-d670-4b0e-ba77-e29615b633fb\\})|(\\{8fce6deb-83f3-4695-9c5d-76bf366757bf\\})|(\\{1edcaf80-0c4a-4380-9752-4f2953b8a053\\})|(\\{664101ff-e2e4-43b3-b470-ddb71642df7a\\})|(\\{fee7c990-6f9c-4b44-91fb-74998b2498c5\\}))$/","prefs":[],"schema":1573055872812,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594479","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5e200b1f-e1d0-4819-89e3-3bd34f90c5c1","last_modified":1573059528009},{"guid":"/^((\\{697995ae-b9ee-4556-824b-8e82621f45dd\\})|(\\{6971a39a-916e-4b3f-a14f-bac10571b9f0\\})|(\\{d1047c9a-157b-4f87-a223-a6e6a150e1f8\\})|(\\{f23c6402-4b76-4aa4-b49a-6d083f92ae88\\})|(\\{1a7401bd-96e7-4857-bc5b-7ee66cdecc3c\\})|(\\{ccec0135-ee34-4713-a10c-607a45956d9b\\})|(\\{70428092-3df7-4151-b973-974ca511ae33\\})|(\\{cf2cc560-d765-4b59-b7b7-09a0ae4292f2\\})|(\\{880b8863-e204-47fe-8c8d-db29a10b8c8a\\})|(\\{c95951f5-2b2b-481a-9975-e38abf1f881b\\})|(\\{865df6b7-3ac1-4bd8-be0b-4cc8bb6aab7e\\})|(\\{b6124efd-aa84-42bf-80c7-01c078dc9ef2\\})|(\\{f888f1c9-a936-4ed1-a7f1-5a835ea9e6a0\\})|(\\{c434dae6-9ece-4488-8e9d-0d06d523d95a\\})|(\\{5531f988-1512-4b18-937c-7bc7e209c70f\\})|(\\{fd4fc8ae-fe95-490f-8013-6964455afb34\\})|(\\{84189ee5-4494-4068-b467-49a1b946cba1\\})|(\\{21f0db68-3156-41b4-8180-a48824b35962\\})|(\\{6a3e8874-61b4-40bf-923c-199493cfd284\\})|(\\{683172b8-3a91-4cbc-92f3-2a385f321c98\\})|(\\{269136f3-cd51-4e2d-b1eb-74878262fcef\\})|(\\{1ca4e866-0d45-4898-8138-398f49925cab\\})|(\\{9d53c5bc-9cf2-4c50-9ce5-8aaa113de07f\\})|(\\{19b80768-1437-4d18-972b-41df04a3b0a9\\})|(\\{7090cae8-4f58-4f07-9e53-b37cb4f3f8ad\\})|(\\{31911e49-6d40-4435-b152-c333096ae185\\})|(\\{4910e0bd-d803-4785-9ec4-6e8c9414a53e\\})|(\\{f3a131a1-73fe-4e8c-b499-629aa7a3e405\\})|(\\{94e53c23-cb3e-43c9-b29f-43ea953c61f6\\})|(\\{0a024f33-43b3-4d15-89dc-694964063869\\})|(\\{fa561d95-e80a-4ab9-b71c-556c7fce3b83\\})|(\\{f78a3354-dafd-48e6-8392-0ed1aa8e8a91\\})|(\\{a6b84ecd-25df-41c5-8979-a1a9d962d78b\\})|(\\{5d7282aa-0600-4a16-ad0e-917d20232d2a\\})|(\\{90e0c87b-f534-486f-b5fe-beddad5cfcfb\\})|(\\{c64d3989-b6f6-4eec-b86f-b549a5b2056a\\})|(\\{ccdd4a2e-11a4-4922-8bd2-d8ff05d3194f\\})|(\\{b9f73347-01c2-4727-85cd-7521a2a2841c\\})|(\\{1be85529-e82e-4dfe-aa33-3c62fc37ae8e\\})|(\\{b91fff1b-d45e-47b2-95da-5d774319b88d\\})|(\\{8c81cdd1-4fc2-4510-83c2-641ea7ee7c24\\})|(\\{e5db6079-1786-4072-80f5-d5c894074cc2\\})|(\\{5981e135-789c-4709-8b22-85e0665c8396\\})|(\\{a235175f-3391-43c6-bf58-34c1f6b8f4a6\\})|(\\{617ebed4-628f-4ca3-92de-bec510cab1dd\\})|(\\{3aaa37bc-0fa9-4e34-abbb-d5a34ff729a3\\})|(\\{2d3521bc-914f-4990-ba0a-5d488f176f4e\\})|(\\{17c7768d-c672-4e99-aef2-2fdd35a96804\\})|(\\{7e517ca8-6f65-4de2-869f-dddce73a274c\\})|(\\{9c99bd01-7567-47e6-80f2-bf229b97415f\\})|(\\{5357eef8-cc2f-496a-82d2-5f3b6ca5f7b1\\})|(\\{b83a8605-057b-46ef-86ed-d53db9a9f16f\\})|(\\{55383502-1800-4cf8-8522-df16d6cb9809\\})|(\\{14d742cf-cd34-46a5-984e-1e28fc16e55c\\})|(\\{f5d6d1af-6a02-4eb4-a7fb-ec3486239875\\})|(\\{fac56640-6cad-49a2-b224-9424e18b4009\\})|(\\{79c16aa2-f8a9-40d3-9e81-74884b987e48\\})|(\\{b02eae40-18d6-4e28-8af7-6b161a458769\\})|(\\{9398d059-fc67-43e2-8548-bc60cfa82998\\})|(\\{cd0a4138-8670-4a6b-b15c-0cad1ef290e6\\})|(\\{503dc84b-9967-4b1f-8199-cee55bcd919e\\})|(\\{d0245186-049d-4594-88f9-3fe54e735551\\})|(\\{7208c980-005e-426c-991f-1cd22227b7fb\\})|(\\{19dcb8c5-3577-4279-b70f-eb48a594f821\\})|(\\{fda599e0-d842-47d9-8c8e-21c26ef0afa6\\})|(\\{470eab98-7ad9-49a5-883f-42cb51996fc7\\})|(\\{8c353e56-0d27-4b83-b081-6e012bda5601\\})|(\\{a1931145-d58d-41a2-b190-04549ef9c225\\})|(\\{916d2e1d-aabf-45aa-84ec-a9bb9ee40391\\})|(\\{f2aa9466-c326-440c-b9a8-f2fef8571341\\})|(\\{52a02f53-b805-41d1-af02-0283da3ef383\\})|(\\{aad686bf-b881-4177-8a8f-12c9455e319f\\})|(\\{cec578f9-9103-44f8-9b41-bbe26ba8a993\\})|(\\{6891bcc0-4ad2-4531-9699-ce82528ddcc0\\})|(\\{a5d93cd7-b187-46f8-961b-9f4fc0b4f37f\\})|(\\{b220428d-2f07-4ecd-9114-3a3261d5f7fc\\})|(\\{b0f4740a-6e0f-489e-ab86-3fb3abb7dd15\\})|(\\{611781ad-a17d-4487-8caf-bf72818bacfc\\})|(\\{0b4efcee-b7eb-4151-bdd2-b2f66fedd4fa\\})|(\\{25da4f88-e61c-4823-9c32-864c3a348aab\\})|(\\{e44b4144-0a1a-4c29-95c0-50083ed5c606\\})|(\\{4dbf4218-1a54-4fa1-8448-0521da5b5391\\})|(\\{7140247a-7ee6-4474-9fe9-0cdf6ec7e2e7\\})|(\\{50eac97c-bb52-4107-a3be-6d40eba5b229\\})|(\\{4bd98a1f-d8f6-411a-a1e8-0cf1b482c682\\})|(\\{a7d60016-47ac-4480-b2bc-83dd4e20b096\\})|(\\{a2657d9a-94d1-41e8-a1e5-72e60c032afe\\}))$/","prefs":[],"schema":1572982905588,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1594460","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f1eaa18e-75c8-4134-87cf-5a02e3349e44","last_modified":1573055860762},{"guid":"/^((web@3753c687-a0c6-4cd1-b8ff-bab3c76b1236)|(ext@286f29a6-184e-4195-b1e5-1212ebf372a0)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b70000)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0000)|(web@af1e58bc-4ead-11e8-81fc-065ad97f0000)|(web@7398cc9a-684e-40a4-afe1-b620e1a80000)|(web@2DC2452E-6999-11E8-A1CA-6C6318C60000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87000)|(web@ca5a2803-6421-4582-97e1-9e30fe440000)|(web@00022358-d56d-4f5e-a89c-d4534d7c5565)|(\\{ff26fde6-4d73-49a3-bd6c-1ca7876484fc\\})|(290e9605-6fb1-4c8b-a3d4-0084bfad201e@UniversalConverter)|(web@EmailNewTab)|(web@WhatsMySpeed)|(test@FormsHub)|(web@Forms2)|(newweb@MapsNewTab)|(\\{4b1d718d-58ae-404b-a5d2-b7b977cfcb56\\}))$/","prefs":[],"schema":1572291693826,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1592597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3bdd5b53-ddb1-4fb0-b250-d75a604a5546","last_modified":1572443230107},{"guid":"/^((\\{a059a924-e43a-495d-9620-ad8c111d62d9\\})|(\\{79f4bfc6-b1da-4dc4-85cc-ecbcc5dd152e\\}))$/","prefs":[],"schema":1571600493541,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1589974","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Page Translator"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9e8f80d6-a818-4004-9a20-deec55f3fb96","last_modified":1571605630002},{"guid":"/^((firefox@browser-security\\.de)|(firefox@smarttube\\.io)|({0fde9597-0508-47ff-ad8a-793fa059c4e7})|(info@browser-privacy\\.com)|({d3b98a68-fd64-4763-8b66-e15e47ef000a})|({36ea170d-2586-45fb-9f48-5f6b6fd59da7})|(youtubemp3converter@yttools\\.io)|(simplysearch@dirtylittlehelpers\\.com)|(extreme@smarttube\\.io)|(selfdestructingcookies@dirtylittlehelpers\\.com)|({27a1b6d8-c6c9-4ddd-bf20-3afa0ccf5040})|({2e9cae8b-ee3f-4762-a39e-b53d31dffd37})|(adblock@smarttube\\.io)|({a659bdfa-dbbe-4e58-baf8-70a6975e47d0})|({f9455ec1-203a-4fe8-95b6-f6c54a9e56af})|({8c85526d-1be9-4b96-9462-aa48a811f4cf})|(mail@quick-buttons\\.de)|(youtubeadblocker@yttools\\.io)|(extension@browser-safety\\.org)|(contact@web-security\\.com)|(videodownloader@dirtylittlehelpers\\.com)|(googlenotrack@dirtylittlehelpers\\.com)|(develop@quick-amz\\.com))$/","prefs":[],"schema":1571235422841,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483995","why":"Sending user data to remote servers unnecessarily, and potential for remote code execution. Suspicious account activity for multiple accounts on AMO.","name":"Web Security and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.9","minVersion":"0"}],"id":"96b2e7d5-d4e4-425e-b275-086dc7ccd6ad","last_modified":1571235848152},{"guid":"{381f21b1-95bf-4042-bc5c-3a40b2a03f10}","prefs":[],"schema":1571235400908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583468","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Francezon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"dd1261a3-6944-4f51-8118-b0a8f2055d69","last_modified":1571235422828},{"guid":"addon@shoppingguru.info","prefs":[],"schema":1571235356487,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583862","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ShoppingGuru"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2104.1111.1110.4221","minVersion":"0"}],"id":"70655a4b-064d-44ab-8d0e-3bec419343ee","last_modified":1571235400895},{"guid":"sparalarm@chip.de","prefs":[],"schema":1571082106908,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586677","why":"The add-on is force-installed for users through sideloading, bypassing user consent.","name":"Sparalarm"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"14.39.1","minVersion":"0"}],"id":"19f599bd-2226-49e2-90fd-685fd106fc3d","last_modified":1571235356473},{"guid":"/^((\\{65a93e3b-e350-440d-bf8f-68e18e38d27d\\})|(\\{9db1fb44-b661-4719-9d90-67af3e6a314c\\}))$/","prefs":[],"schema":1571059482617,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586834","why":"This add-on contains an unexpected feature that is collecting ancillary data.","name":"Google Custom Logo and Search Counter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be5d02cb-0a36-4c20-b184-509b86d243c5","last_modified":1571060494402},{"guid":"{c4d46c5f-9832-4057-8a1d-635949ed6a55}","prefs":[],"schema":1570909292250,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587121","why":"This add-on makes use of search settings with unexpected behavior.","name":"LM Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57c094fd-9a37-4ede-9bb0-a1c2d66415f0","last_modified":1571059471124},{"guid":"/^((\\{2B0EC7FF-F330-4e0c-8B33-EFFEC8D39E70\\})|(\\{f70c89b0-bbf3-41a9-bc1f-0912dcf53f33\\})|(@Classifieds)|(@Converter)|(@Coupons)|(@Directions)|(@DownloadManager)|(@Email)|(@Fitness)|(@Flights)|(@FormsApp)|(@Games)|(@Maps)|(@News)|(@Package)|(@Photo)|(@Radio)|(@Recipes)|(@search-encrypt)|(@search-incognito)|(@searchencrypt-b)|(@searchencryptblocker)|(@Speedtest)|(@Sports)|(@Transit)|(@TV)|(@Weather)|(aweapps@Email)|(classified@jetpack)|(email@searchleasier\\.com)|(foo-bar@example\\.com)|(games@jetpack)|(JS@Converter)|(login@easier)|(maps-webext@jetpack)|(Maps@SSA)|(web-ext@games\\.com)|(web@ShoppingNewTab)|(web@SocialNewTab)|(web@WebDesignNewTab)|(webapp@LoginAssistantTab)|(webex@Converter)|(webex@Email)|(webtab@Shopping)|(webtab@Social)|(webtab@WebDesign))$/","prefs":[],"schema":1570701667316,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587782","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Addons collection ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"986aac02-beba-40b2-b463-d8447a778a2e","last_modified":1570713923845},{"guid":"{2a78ab07-91b2-4086-889d-619e43d5e5f8}","prefs":[],"schema":1570563693690,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587734","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"SVSrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bb76b262-7087-4cf2-a82f-12cfbf91239a","last_modified":1570701652245},{"guid":"{2e106fa4-ee23-4b4a-9ed0-f93edee539b5}","prefs":[],"schema":1570534326932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587074","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"SVsrch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab0b6868-6077-4d47-bd58-1df3f572c04d","last_modified":1570540061375},{"guid":"/^((oigfsj9434lavvv@oigfsj9434lavvv\\.com)|(mity82900jf2@mity82900jf2\\.com))$/","prefs":[],"schema":1570527949565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1586780","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Page organizer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ece7523-cdec-46cf-ac20-9e939a4d4802","last_modified":1570534316570},{"guid":"/^((web@MapsNewTab)|(ext@WhatsMySpeed)|(ext@MyEmailCenter)|(ext@TemplateHelper)|(ext@FreeLiveRadio)|(ext@FreeFormsNow)|(web@ConverterNewTab)|(web@EmailAccountNewTab)|(spweb@EmailNewTab)|(web@PackagesNewTab)|(web@ManualsNewTab)|(web@ClassifiedsNewTab)|(web@FormsNewTab)|(web@AncestryNewTab)|(web@RecipesNewTab)|(web@TVNewTab)|(web@WeatherNewTab)|(web@translationsNewTab)|(web@SportsNewTab)|(web@CouponsNewTab)|(web@FlightsNewTab)|(test@InstaFormsFinder)|(web@NewsNewTab)|(web@SpeedTestNewTab)|(web@TransitNewTab)|(web@BibleNewTab)|(web@RadioNewTab)|(web@TemplateNewTab)|(web@PhotoEditorNewTab)|(web@AudioConverterNewTab)|(web@GamesNewTab)|(web@VideoConverterNewTab)|(test@TheWeatherChecker)|(web@InterestsNewTab)|(test@SearchHub)|(web@CalendarNewTab)|(web@TaxesNewTab)|(web@BankNewTab)|(web@CrimeReportNewTab)|(web@CryptoNewTab)|(web@eBooksNewTab)|(web@FinanceNewTab)|(web@FitnessNewTab)|(web@JobsNewTab)|(web@MoviesNewTab)|(web@NotepadNewTab)|(web@OfficeNewTab)|(web@PCTextingNewTab)|(web@PhotoNewTab)|(web@ScrapbookNewTab)|(web@UtilityNewTab)|(test@FlightTrackerUpdate)|(test@FreeForms)|(test@UniversalConverter)|(test@MyEmailCenter)|(test@TemplateHelper)|(test@FreeLiveRadio)|(test@FreeFormsNow)|(ext@FormsHub)|(webext@WhatsMySpeed)|(webext@WatchTelevision)|(webext@EmailExpressTab)|(webext@MyConverterTab)|(webext@TemplateCreatorTab)|(webext@LocalForecastTab)|(webext@EZDirectionsandMapsTab)|(webext@MapsNDirectionsTab)|(webext@MyEmailCenter)|(webext@TemplateHelper)|(webext@FreeLiveRadio)|(webext@FreeFormsNow)|(webext@InstaFormsFinder)|(webext@TheWeatherChecker)|(webext@FlightTrackerUpdate)|(webext@FreeForms)|(webext@UniversalConverter)|(webext@FormsHub)|(webext@SearchHub)|(ds@DirectSearchPro)|(webext@AppDiscoveryTools)|(webext@LiveRadioProTab)|(webext@TheWeatherPilotTab)|(webext@ExpressPackageFinderTab)|(webext@LoginAssistantTab)|(webext@SelectSearch)|(addon@SelectSearch)|(webext@ExpressSpeedChecker)|(webext@BreakingNewsPlus)|(webext@WorldEventsToday)|(addon@WorldEventsToday)|(webext@OnlineTVAccess)|(webext@FindingFormsPro)|(webext@EasyClassifieds)|(webext@SpeedCheckerPlus)|(webext@GetFreeCoupons)|(addon@MyEmailChecker)|(app@FlightTrackerUpdate)|(app@WatchTelevision)|(app@WhatsMySpeed)|(app@MyEmailCenter)|(app@TemplateCreatorTab)|(app@FreeLiveRadio)|(app@FreeFormsNow)|(app@InstaFormsFinder)|(app@SearchHub)|(app@TheWeatherChecker)|(app@FormsHub)|(webtab@Maps)|(app@FreeForms)|(app@UniversalConverter)|(app@EmailExpressTab)|(app@MyConverterTab)|(app@TemplateHelper)|(app@LocalForecastTab)|(app@EZDirectionsandMapsTab)|(app@MapsNDirectionsTab)|(app@AppDiscoveryTools)|(app@LiveRadioProTab)|(app@TheWeatherPilotTab)|(app@ExpressPackageFinderTab)|(app@WorldEventsToday)|(app@OnlineTVAccess)|(app@SpeedCheckerPlus)|(app@EasyClassifieds)|(app@GetFreeCoupons)|(app@FindingFormsPro)|(app@TemplatesHereTab)|(webtab@Packages)|(webtab@Forms)|(webtab@Email)|(webtab@Radio)|(app@MyEmailChecker)|(webtab@TV)|(webtab@Classifieds)|(webtab@Ancestry)|(webtab@Weather)|(webtab@Manuals)|(webtab@SpeedTest)|(app@MyDailyCalendar)|(webtab@Transit)|(webtab@Converter)|(webtab@Coupons)|(webtab@Recipes)|(webtab@News)|(webtab@Sports)|(webtab@translations)|(webtab@Template)|(webtab@AudioConverter)|(webtab@Flights)|(webtab@Photo)|(webtab@Bible)|(webtab@PhotoEditor)|(app@MyVideoConverter)|(webtab@Games)|(app@MyLoginHelper)|(app@QuickEmailAccess)|(app@MyRecipeFinder)|(app@MyFlightFinder)|(webtab@Fitness)|(webtab@VideoConverter)|(webtab@Taxes)|(webtab@Bank)|(webtab@Calendar)|(webtab@CrimeReport)|(webtab@Crypto)|(webtab@eBooks)|(webtab@Finance)|(webtab@Interests)|(webtab@Jobs)|(webtab@Notepad)|(webtab@Movies)|(webtab@Office)|(webtab@PCTexting)|(webtab@Scrapbook)|(webtab@Utility))$/","prefs":[],"schema":1570483391885,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1587028","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bd51d01b-20bf-4682-a588-c03e988eb746","last_modified":1570527938865},{"guid":"{67d4f93e-6857-45ab-9e7a-158cc61f15d2}","prefs":[],"schema":1570052453260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585735","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"zidaza"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6ce8f6d0-5cef-457c-b7e4-d5c08d61531a","last_modified":1570053270833},{"guid":"/^((\\{049aedf7-b1dc-49b7-9ef4-51cd026f8592\\})|(\\{27c743d8-4731-44ff-9194-9f663df6a3c3\\})|(\\{8bf2bae7-273a-4496-9073-c1ad6688cda8\\})|(\\{b9cfeaaa-2465-4b21-903a-7955fcd4e59a\\})|(\\{07848e3a-f42b-48bf-ac70-f918a7b79258\\})|(\\{02b2eed4-2ca5-4d6f-b19a-a8b1738501f0\\})|(\\{d2af93ad-a542-4b30-b929-7437c2b02afe\\})|(\\{b8e33742-5b78-4c08-89e1-94ebe22fbafe\\})|(\\{502b29ef-b05f-4043-949b-069160f39e32\\})|(\\{2c60eb88-2f38-4b1a-9329-eaa18ad41720\\})|(\\{ccb18b6f-0680-4347-afd5-5ed864114f05\\})|(\\{c9622009-2b37-44f1-a5cf-f0aa869a6bff\\})|(\\{cc241172-6e33-4395-bc68-dd76fa6b6091\\})|(\\{904a47b7-c2c3-465d-a7f9-326c51e8fee0\\})|(\\{365ae96e-15f8-445f-816e-74cd5897613c\\})|(\\{527ccde6-f15c-4437-a061-052593c2ac5b\\})|(\\{063b5c1a-b708-4f05-873b-b3e161d1d49a\\})|(\\{d5422b3f-fcb3-4eca-b2a9-b4b8010fd4c1\\})|(\\{60bab1b2-e7fc-4683-85ef-2ec6cdb5e148\\})|(\\{aad32311-3e2f-419d-8e6b-82c4e28c44d3\\}))$/","prefs":[],"schema":1570045305267,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585810","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscating code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a942e2e5-6a55-439f-b078-6288da1cfe68","last_modified":1570052444069},{"guid":"/^((\\{6be4ca4f-8b7e-4d91-994b-24a7c5384086\\})|(\\{1709abf0-19ba-48a8-a9dc-03e931b17f48\\})|(\\{5d5af81d-6501-4d77-a64c-ad2cdc34ceae\\})|(\\{b7de0a65-0b4b-4b74-a4e6-70fc2c36a80a\\})|(\\{64704bd2-ced7-4dd8-a5d2-d20df624288f\\}))$/","prefs":[],"schema":1570036215253,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585723","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Add-ons using obfuscated code."},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e487385-fe8d-451a-909e-a6f6609b0d7b","last_modified":1570036367326},{"guid":"{5dbbb375-3520-4ace-bb84-df9d92ae1a25}","prefs":[],"schema":1570017905113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585708","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Wappalyzer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a12e67a-ef6d-4f06-9de6-7dc8bcb19517","last_modified":1570036206290},{"guid":"{d41cf5b5-67b7-4510-8633-d8e2c0ec5d46}","prefs":[],"schema":1570001773270,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585625","why":"This add-on violates Mozilla's add-on policies by using obfuscated code.","name":"Xisey"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87d99543-1e31-46b3-9fd1-91d9c79ff592","last_modified":1570017897427},{"guid":"mozilla_cc3@internetdownloadmanager.com","prefs":[],"schema":1569844559791,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1585071","why":"Some versions of this add-on violate Mozilla's add-on policies by using unreviewable source code. Please update to a newer version.","name":"IDM Integration Module"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"6.35.5","minVersion":"0"}],"id":"21f14cff-afef-4e0e-97e8-4dbc0207a7a6","last_modified":1569865071841},{"guid":"{546bc2af-d6e7-499f-90b6-58305b836702}","prefs":[],"schema":1569699691574,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583809","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"MapsFrontier"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f3133639-f5e5-4b47-a80f-2993fa97ca4a","last_modified":1569844523596},{"guid":"{f39b7905-00d5-4391-9a4b-751ca08dd6b2}","prefs":[],"schema":1569440826824,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1583814","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Tic-Tac-Toe Evolution_G"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4c3153a8-7551-48f3-a4fa-8ad6cb28faa8","last_modified":1569441800696},{"guid":"/^((ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3843796584)|(ehfiibbkgllccnbifchmillffgdlmidi@chrome-store-foxified-3264908934))$/","prefs":[],"schema":1569242005272,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582781","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Proxy add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"72464ab8-9b51-420f-8e54-bc0f8bb01cf1","last_modified":1569244094631},{"guid":"/^((@searchincognito)|(@si-defaultsearch)|(@si-defaultsearch-listed)|(@searchassistincognito)|(@DiscreteSearch)|(@Discrete-Search)|(@searchsafe)|(@SearchSafeOrg)|(ffredirector@discretesearch\\.com)|(ffredirector@encryptedsearch\\.org)|(ffredirector@searchdefence\\.com)|(ffredirector@searchencrypt\\.com)|(ffredirector@searchencrypted\\.com)|(ffredirector@searchincognito\\.com)|(ffredirector@searchsafe\\.co)|(ff_redirector@discretesearch\\.com)|(ff_redirector@encryptedsearch\\.org)|(ff_redirector@searchdefence\\.com)|(ff_redirector@searchencrypt\\.com)|(ff_redirector@searchencrypted\\.com)|(ff_redirector@searchincognito\\.com)|(ff_redirector@searchsafe\\.co)|(@encryptedsearch)|(@searchdefence)|(@searchencrypted)|(@42e62954-834c-11e7-bb31-be2e44b06b34)|(@DiscreteSearchx)|(@4aec09f1-f1c9-456d-8c40-e0e86f302a0d)|(@566ff1c3-9432-4ed4-bd3d-b43cba47e051)|(@1df4e663-b9f3-4708-9f5d-44265b33397e)|(ff_redirector@searchsafe)|(\\{9b62bdf8-a3c7-43d3-ba7f-0970cabffdaa\\})|(\\{95b48d11-b256-48ad-8ba1-bfe52f0a8bb8\\})|(\\{9e35a2be-64bd-49e3-aa47-fbeedf1834eb\\})|(\\{3ba10b5f-d9fa-4b40-8683-034d3dfc71d4\\})|(\\{20c31601-ebee-4677-a2f0-40e178bf7c77\\})|(\\{98e02622-f905-434e-9003-6c061b5c11c0\\})|(@tabwow)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-258456913)|(@tabwow2)|(\\{be8901e4-2a07-4554-aa05-a64351496e29\\})|(moviestmpd@mozilla\\.com)|(gaidpiakchgkapdgbnoglpnbccdepnpk@chrome-store-foxified-876542484)|(\\{4a8ef415-e453-458f-bfbd-ae92569214db\\})|(fireaction@mozilla\\.com)|(\\{bd9c448c-58b3-434f-9bb6-4ed2c155ba8e\\})|(\\{ebdfa19b-0906-4f78-9e95-7ef74d34c335\\})|(websecure-unlisted@mozilla\\.com)|(\\{2d06d70b-8f32-4007-8f8b-1e0445bcebe7\\})|(\\{ddbe7345-acf4-4ebb-9baf-cd6d2df73b28\\})|(\\{b09d5b98-2d65-46fb-990c-69710577efa0\\})|(\\{3894384e-c719-4a0c-8d24-3816160fc56b\\})|(search-encrypt-tab@mozilla\\.xpi)|(\\{1dafa1da-3894-48b9-ac8f-00bdc4f1868a\\})|(\\{99cfe634-328a-41a5-9a23-64094e4f4919\\})|(inco-plugin@mozilla\\.xpi)|(incognito-window@mozilla\\.xpi)|(mac-search@mozilla\\.xpi)|(fvdplayer@fvd\\.com)|(playernewpp@ext\\.com)|(\\{492936c6-9121-4e54-8d4f-97f544e5bf98\\})|(\\{108a22ea-f316-4c2f-8427-fe65e02f9e2c\\})|(cold@being\\.net)|(\\{38b99237-6c28-406f-898c-cc89df86051d\\})|(search_redirect@mozilla\\.xpi)|(\\{d2ef4a8d-6ec0-4733-9f3f-2394178ecbf3\\})|(tab_plugin@mozilla\\.xpi)|(\\{ae228e30-f40a-41a3-9e7e-53a094dcb8c6\\})|(\\{00ee7237-53cb-4036-8d4f-e78d78ca89e7\\})|(\\{d2f4002c-031b-4ad3-9fb1-afb003e8f932\\})|(\\{c0f366b3-7b3d-4486-a6f3-4ca1d7045091\\})|(\\{ccc6cfc4-3832-4d05-bf28-43a9722de93f\\})|(\\{dd02f638-ce6d-464e-8add-6ea0f314b1d1\\})|(\\{749ed3ff-4d23-4b32-812e-a35e3cf8c000\\})|(tab_cleanup@mozilla\\.xpi)|(incognito_tab@mozilla\\.xpi)|(\\{47c51f55-4f0b-499f-9fdd-c7c66bf4796a\\})|(\\{cd70c7c8-557d-46fa-9688-399c7c8d3d66\\})|(\\{681ad8e0-d1df-4cd2-a4cf-b97c1d6502a3\\})|(\\{0d58e690-bd48-4e3a-baf3-67aa40bc286a\\})|(\\{77bfbf26-4618-4120-9cb6-1fc7c92b8ddc\\})|(\\{037c6f6a-71f8-405b-9cff-fadf2ded6c47\\})|(\\{91cc3274-90d5-4e16-80e3-cd02fc513689\\})|(\\{2225b2af-0c3c-4345-adac-4f5bd40c2182\\})|(\\{81ca6b1e-a95b-4b44-9638-3ff3ea1a571d\\})|(\\{1e32acf8-fc1e-40ae-8783-c501ce50d597\\})|(\\{19670785-b1db-4d69-9538-2880ad8fdf20\\})|(\\{0113b4ad-15ca-4215-adeb-f0404f619ca6\\})|(\\{c7245149-4224-4c5c-91a4-84ea189f2227\\})|(\\{04dd2232-f1b1-4275-ae74-8bd27f3d850c\\})|(prosearch@mozilla\\.xpi)|(\\{d549a064-98e7-49ed-ba9e-a724e79a004f\\})|(\\{fddd3bc6-9d4e-4ee7-b490-0d6141ff7d7f\\})|(\\{122795b5-ae28-4371-9b61-878f5db888ac\\})|(\\{e3d491de-802a-4f82-91eb-9403c9f43637\\}))$/","prefs":[],"schema":1569181301396,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561752","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bea9680c-28c0-48a1-b8d4-e418adeba748","last_modified":1569241020387},{"guid":"{87bd05d5-d79e-4421-9c78-5c98ea78c351}","prefs":[],"schema":1568901038866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1582168","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"TypeScript-Console"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9d746da-8881-4854-8026-ecb708a588f6","last_modified":1568905123995},{"guid":"/^((hd@youtube\\.com)|(@youtube-to-mp4)|(youtube-downloader@youtube\\.com))$/","prefs":[],"schema":1568885060842,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent.","name":"More Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea29de20-dfe2-40c0-a5ec-45b1c780815d","last_modified":1568901023136},{"guid":"/^((\\{d81c0c7d-7420-4737-a3b9-dd9edeb4412f\\})|(\\{2bc89af7-d0ff-4b22-b7f6-ec87d15d999e\\})|(\\{3ee12352-a9db-4370-aa27-7e1d9acb628a\\}))$/","prefs":[],"schema":1568816167726,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581368","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"FSCH"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e56fd0a-77b6-477d-bada-78a5c18a37dd","last_modified":1568816392824},{"guid":"/^((@yvd-addon)|(ydh@downloader\\.youtube\\.com)|(tomp3@youtube\\.com))$/","prefs":[],"schema":1568814899255,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1579965","why":"These add-ons violate Mozilla's add-on policies by including unexpected features without user consent","name":"Youtube Downloaders"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73cae2b8-f60e-47b3-afca-a1ff555f4ec5","last_modified":1568816154119},{"guid":"{91c43d32-3a20-40cb-933b-47fd7c4b5a4e}","prefs":[],"schema":1568662894970,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1581111","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Cookies Next"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e22dbf2b-70c8-41ed-b17a-32f53a22055b","last_modified":1568814886596},{"guid":"{23db2a76-49ca-4af2-af50-fccedd607e12}","prefs":[],"schema":1568317295345,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580616","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"YUI"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"13056233-543d-4c51-b89a-2a6b96ee324e","last_modified":1568374273725},{"guid":"{1056b983-063b-4bd0-b7f7-1295f7e04ade}","prefs":[],"schema":1568226375813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580749","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fast Browser"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"886e480a-8838-43c7-b9ca-b02592e23065","last_modified":1568285711403},{"guid":"/^((\\{8d0073fa-3193-4a7f-8c95-6a4e3d9272ba\\})|(445ac9f4aa1b833ce2dc75d6d6d6c76d0cef7cc7@temporary-addon)|(\\{cd0672d3-72dc-43d2-ae77-6cda31fb7c88\\})|(\\{403321a6-be8d-4ae3-a66d-e5c846f993b8\\}))$/","prefs":[],"schema":1568154081436,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580503","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Proxy Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a54f1c3-93e1-4a38-885c-afb98e7bc4f2","last_modified":1568224845558},{"guid":"{0fbe26d1-6891-475e-af3e-34f38a30348d}","prefs":[],"schema":1567971701994,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1580118","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Lookbox"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67a61ba7-ad12-4eae-bdcc-e5b9b856dff4","last_modified":1568105279739},{"guid":"{a59679da-f097-4db4-b2bc-6ad7b645e127}","prefs":[],"schema":1567019346545,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GetMedia - Movies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.18","minVersion":"0"}],"id":"db043b8d-c91a-4d1d-b420-58087beef552","last_modified":1567022112963},{"guid":"{850be3a2-ca5f-47ad-838c-fe39b006e0da}","prefs":[],"schema":1567018965949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Safe Browsing"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"aeb6bc24-36cf-4199-94d9-68f4822fa2cf","last_modified":1567019082710},{"guid":"{ecb03616-f3c2-4580-99dd-6a233047abdd}","prefs":[],"schema":1567018902311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Sport TV"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.19","minVersion":"0"}],"id":"7e71a557-5664-4319-a792-c94b2bf744d8","last_modified":1567018965935},{"guid":"{8387ccbe-b9ac-438d-b049-c86b30a6dacb}","prefs":[],"schema":1567017236054,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":" This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMusic"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.17","minVersion":"0"}],"id":"9d598ecb-2473-4416-98b9-26658ea7746e","last_modified":1567018491638},{"guid":"{7ff51e81-f4b1-4682-9f45-43a771d80748}","prefs":[],"schema":1567017189557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"GoMovies"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.16","minVersion":"0"}],"id":"627a5309-d310-4130-9827-d3e6d3116ba2","last_modified":1567017236040},{"guid":"{2ef58672-740c-46bd-a50d-b9880986b574}","prefs":[],"schema":1567017167776,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Universe Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.5","minVersion":"0"}],"id":"c0767051-017a-45d7-b96f-632d7cae7c47","last_modified":1567017189541},{"guid":"{df9f6ab1-c82c-41d4-85ce-86dcfe839ce9}","prefs":[],"schema":1567017037001,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530194","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Media Start"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.0","minVersion":"0"}],"id":"6e9ea480-7f5f-49c7-b130-fb8af66bec0b","last_modified":1567017167761},{"guid":"{b89efd87-232e-4829-87d2-22148919d72f}","prefs":[],"schema":1566762089721,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1576681","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Ad-Blocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04365e2c-fbc2-4393-b2b3-a23ea5de6b79","last_modified":1566934428180},{"guid":"/^((\\{fb2cbb8e-a6f9-464b-97c7-aca958a404d6\\})|(\\{8cc60aa4-fceb-4a74-bef4-bbbdc23b85fb\\}))$/","prefs":[],"schema":1566419767711,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1573237","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"055d2447-c7b7-49a2-bb27-b1c09a592f32","last_modified":1566422986828},{"guid":"/^((AKMWWOEASKZXXCCRFA@AXXX)|(RF_WOEKTAMS@BASDFZMD)|(TI_BOAMZKXFFEE@ZCAOKEE)|(BMMAOSIKZX_TI_EE@BOASLL)|(ZN_ASVVZXLEOOO@ABOVVAE)|(MZXVCKMSSD_ZN_EF@GBOAAOS)|(UA_CZVVMSOEEE@DOPEEZXA)|(ZXCLASKDASD_UA_VV@AVLLZAA)|(VS_SOEOKAKXC@BOOCLLAA)|(AIWEKDZSV_VS_ASCZ@SAAAOOBB)|(IF_AZXOOVVVAA@EALXCOAA)|(VVALLEIASD_IF_AZ@OOBAAXXA)|(ZN_BF_AOXZAOKSD@VZXMASLX)|(VMZKMALSKD_BF_ZN@VIAAEOOSL)|(aunastralaa_1@auzn\\.ne)|(VXKCVLSO_ON_SOC@KIZIAO)|(ON_OPPOWOAKKS@BLZOAAAASL)|(nostallkka@iofjjakk\\.me)|(VZKKAKOOEE_LN_FK@BOOAASSDD)|(LN_VSOAJKXXXZZ@UDPPPADK)|(BNKZKASKDIE_EB_AKK@BLALEEKK)|(EB_AISJIKZLAA@DFKKAKE)|(NLDFKOBASOKCK@KFOLAAAEE)|(BBDMLDSFKER_AF_GG@AYYRR)|(OMVXNSDF_R_F_W@BMAMSEEE)|(EIGKFDAODS_RF_PDNAP_WEN@HUUUHJAA)|(GOEORG_RF_ANA_N@BDOFKOKK)|(BFDISDF_RG_AZXC@BDOFKAQ)|(OKOKDFBDFBDFG_RG_KS_BDK@AAAJAHU)|(ODKFOBKDPFB_PJ_FGK_AKK@AJIIJAA)|(UBXODJ_PA_PJ@XMVCOAKS))$/","prefs":[],"schema":1565206889166,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572346","why":"This add-on violates Mozilla's add-on policies by executing unwanted actions on websites without the user's consent or control.","name":"Page update (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"85411892-1225-46fb-8f1b-5aa424bc2c01","last_modified":1565344753436},{"guid":"Shield_My_Searches_ehHQAdRPxE@shieldmysearches.com","prefs":[],"schema":1565034099452,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1572066","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Shield My Searches"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74e070ac-891b-4f79-ac76-09a170d21a91","last_modified":1565181472444},{"guid":"{4f71ae77-8abe-43df-bb9f-cf440d6f7756}","prefs":[],"schema":1564993164184,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571059","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adblock for Youtube2019"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f73f6c1-38cf-4255-bb8f-8a61f19afd99","last_modified":1565003019901},{"guid":"{f2539eac-e545-475a-85b4-822347022dd8}","prefs":[],"schema":1564861308712,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1571130","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Woor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae64120f-d93a-4224-ac75-4038b0d2a33b","last_modified":1564993145778},{"guid":"/^((\\{8842eb7c-5f5c-4d33-aabe-81c27ae87dcc\\})|(web@1A72D794-697C-11E8-9D8C-1C0018C6383E)|(web@2a366bba-0a94-11e8-ba89-0ed5f89f718b)|(web@2bf1a18d-3240-42ad-9f7d-46017edc432c)|(web@2DC2452E-6999-11E8-A1CA-6C6318C6383E)|(web@2DC2452E-6999-11E8-A1CA-6C6318C63000)|(web@3)|(web@3ab4d660-8caf-412a-84eb-9cf2924f54c7)|(web@4)|(web@5)|(web@48F0D4BC-6FB8-11E8-B36A-905EE70C2B9F)|(web@82FCE0DC-836E-11E8-9E9B-164B9D46D017)|(web@90c91611-b4c8-470a-b251-77bb1f859dba)|(web@899ce5cc-06fc-436e-a59e-93a70eb4c810)|(web@3681a37c-6383-4e94-8076-28496af53983)|(web@7398cc9a-684e-40a4-afe1-b620e1a863b2)|(web@7398cc9a-684e-40a4-afe1-b620e1a86000)|(web@8842eb7c-5f5c-4d33-aabe-81c27ae87dcc)|(web@10722358-d56d-4f5e-a89c-d4534d7c5000)|(web@10722358-d56d-4f5e-a89c-d4534d7c5565)|(web@67887931-77b9-4b1b-baee-9f23a4a384de)|(web@a3ea9864-1034-47b9-a25a-e9cc207a9319)|(web@af1e58bc-4ead-11e8-81fc-065ad97f23a5)|(web@af1e58bc-4ead-11e8-81fc-065ad97f2000)|(web@B7CCDA78-8455-11E8-91A4-ED179E46D017)|(web@ca5a2803-6421-4582-97e1-9e30fe44e100)|(web@ca5a2803-6421-4582-97e1-9e30fe44ee00)|(web@ca5a2803-6421-4582-97e1-9e30fe44eee0)|(web@cacf1377-a1b0-43e6-84bc-c0518922b22c)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce006e)|(web@e7a72615-19b1-42a5-8e34-ddfa89ce0060)|(web@e7a72615-19b1-42a5-8e34-ddfa89ced000)|(web@e7a72615-19b1-42a5-8e34-ddfa89cee000)|(web@e4058a8a-59ca-4ba7-b503-dfcf75639305)|(web@f3ac4769-1d70-444e-aa46-06d0427473b9)|(web@FACD83DA-68CC-11E8-8484-3DA118C6383E)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c000)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c32e)|(web@fd9b3d8a-1178-45ab-92a8-a172d0b7c39e)|(web@ourdom)|(web@oursrchdom)|(web@test)|(web@testss))$/","prefs":[],"schema":1564669690124,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570659","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5aa0a7da-cf9e-4bac-bbed-1b7625109cc7","last_modified":1564671502746},{"guid":"{97ab6723-bc9a-4c5b-a08b-5b162d29ad4f}","prefs":[],"schema":1564669434797,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570385","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Toors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"30d0ec83-70ac-4a03-9239-7af6c4061cde","last_modified":1564669681391},{"guid":"@weatherhubpro","prefs":[],"schema":1564668992535,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570380","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"FreeWeather Pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"47315374-a775-4701-adc3-d0cfb61a44b8","last_modified":1564669425544},{"guid":"YouTube@develop.com","prefs":[],"schema":1564662247837,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570377","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Youtube Downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"176a0ef0-bd71-4b96-a3e3-14c17eaad3dd","last_modified":1564668305895},{"guid":"/^((nickrr878@gmail\\.com)|(\\{a06de0b3-b00f-472c-a34e-3a74b64d1747\\})|(spar\\.team@spar\\.team\\.com)|(\\{59904ffa-b247-41ea-9ac1-2ce0a2da8c98\\})|(\\{69c49344-90ec-458d-9811-a55878e26bd1\\}))$/","prefs":[],"schema":1564660970729,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570622","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Shopping add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"26b10e69-d842-40ef-90ce-f96552e269a3","last_modified":1564661731567},{"guid":"/^((web@AppConverter)|(web@SearchManager)|(web@Email2)|(web@DefaultSearch)|(web@AudioConverter)|(web@translations)|(web@Manuals)|(web@HowTo)|(web@Property)|(my@WeatherTab)|(login@EmailAccount)|(web@WebDesign)|(web@Utility)|(web@Ancestry)|(web@Bank)|(web@CrimeReport)|(web@Taxes)|(web@Notepad)|(web@Crypto)|(web@peoplesearch)|(web@Weather)|(web@VideoConverter)|(web@TV)|(web@Transit)|(web@Template)|(web@Sports)|(web@SpeedTest)|(web@Social)|(web@Shopping)|(web@Scrapbook)|(web@Recipes)|(web@Radio)|(web@PhotoEditor)|(web@Photo)|(web@PCTexting)|(web@Packages)|(web@Office)|(web@News)|(web@Movies)|(web@Maps)|(web@Jobs)|(web@Interests)|(web@Games)|(web@Forms)|(web@Flights)|(web@Fitness)|(web@EmailAccount)|(web@Finance)|(web@Email)|(web@eBooks)|(web@DM)|(web@Coupons)|(web@Classifieds)|(web@Calendar)|(web@BrandedTab)|(web@Bible)|(web@Converter))$/","prefs":[],"schema":1564599359459,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1570620","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b5e2f528-3a9c-43af-9f6d-98040157a59a","last_modified":1564660457769},{"guid":"{795697ee-695f-45d4-a997-6fe845b473d5}","prefs":[],"schema":1564342890085,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1569556","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"IDM integration (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"21bbd8dd-b79e-41b8-bd18-db1592e743c9","last_modified":1564399822770},{"guid":"/^((\\{86f185bb-b672-4a24-b3d9-a8751231b687\\})|(\\{8d98cfc9-3757-4fd9-b017-30ad60fb94ed\\})|(\\{288a7d51-4627-44c9-8cf0-cf18742a6f67\\})|(\\{49e5562b-38e2-4292-8080-ca3ffe8cea42\\}))$/","prefs":[],"schema":1563809747757,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1567876","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"eeaa940b-b984-43da-88ce-d26891347e3d","last_modified":1563810026497},{"guid":"/^((\\{e656b354-3c95-4a63-a271-fe301b294da0\\})|(\\{f5ab4224-43ca-4654-b189-23aa9c960803\\})|(\\{fb68ec9f-d02a-48c9-a356-3020bd1d3e21\\})|(\\{2eabd9de-b8bc-43f2-9e77-624a0e04e38d\\})|(\\{426fe5e4-5da1-41b3-81d4-28bd59724f84\\})|(\\{4b1d9906-5cc4-44a6-ad64-a6c7b0e2ebba\\})|(\\{bbe2e2b3-4a77-4108-9183-e0b02676c09d\\})|(\\{01aef979-833c-4f7d-85a0-6be87462c05e\\})|(\\{9b51394e-a1a9-4864-9876-cc1d6f1a47d5\\})|(\\{7c4f0798-6edc-417b-8702-d97ca1c894c6\\})|(\\{ad93f537-5824-4057-a44f-cef1f97c2d68\\})|(\\{ff62fb9d-c5b7-414d-8c2b-bc5d796475e8\\})|(\\{46998928-4162-46e0-b4c7-260a8520aad9\\})|(\\{731367f8-f5e8-4ade-b8cf-5aaf8c2a455b\\})|(\\{eb6b098d-7811-4a20-a94f-ca91721d4aab\\})|(\\{6ddb9deb-d435-4ec2-be8b-ca65900e43e9\\})|(\\{288e4bb9-454e-4374-8734-1069241d618e\\}))$/","prefs":[],"schema":1563306101159,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566026","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons collecting ancillary data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1f35915e-2de0-4973-adf4-4e77073e0b42","last_modified":1563367115113},{"guid":"/^((\\{7e9c2e2c-8d2d-4406-bb3d-993176f59b34\\})|(\\{f743e1bf-9a1c-43ab-b8ab-57972761b919\\})|(\\{b8274b35-eeaf-4d98-8a6a-cc4fd56603ed\\})|(\\{fd90393d-6ac6-4245-a048-9d423baacbd1\\})|(\\{3f7b376e-23ad-4296-8fd1-77fb254610bc\\})|(\\{fd918017-a23c-40f0-88e1-798ed6fc51f7\\})|(\\{bac48192-5c1f-4dae-aa1c-2fa9ca65dbe0\\}))$/","prefs":[],"schema":1563284869997,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1566557","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Add-ons overriding search settings"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"59cf2549-3930-4a60-a212-af84facbee32","last_modified":1563302090004},{"guid":"/^((general@mapseasy\\.net)|(\\{fd4b0f58-5268-4d52-b09b-547e867fef27\\})|(\\{efe13936-3bfa-44ce-9224-e8cb27f0f216\\})|(\\{c6b767a7-b0c1-4b68-8ac6-d08fee14c5a0\\})|(\\{a9df2ef3-9746-4d5e-b7aa-0baa531538d2\\})|(\\{2d947dd9-fa0f-4f20-8812-31ce9e29081b\\})|(\\{3e800ada-345b-4ac4-82a5-0dbfd00d7877\\})|(\\{a5fcf820-575a-42c2-aeb1-de1a794db1b9\\})|(\\{da844d4c-44e1-4799-ac53-9bb1ad2c8227\\})|(private-tab@mozilla\\.xpi)|(\\{56dbb679-8db4-47ce-851b-a7eab0e215cc\\})|(\\{c1415289-4471-4b6a-b7b7-4feaf9506b38\\})|(\\{29439407-f908-4779-9078-eb190f21dc4f\\})|(\\{5401ea8b-def8-4df3-bf9a-f520b147df69\\})|(newtab-plugin@mozilla\\.xpi))$/","prefs":[],"schema":1563133289502,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1565994","why":"These add-ons violate Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c349ecdc-5fa8-4b87-bfa2-c732dfde094d","last_modified":1563186751969},{"guid":"/^((langpacasdjasdk-de@firefox\\.mozilla\\.org)|(langpack-de-7@niklasb)|(langpack-de-8@niklasb)|(langpack-de-9@niklasb)|(langpack-de-10@niklasb)|(langpack-de-nightly-1@firefox\\.mozilla\\.org))$/","prefs":[],"schema":1562673203781,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1564401","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"German language pack (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d38035ff-7945-49cc-88fb-6de9f8a13658","last_modified":1562673628501},{"guid":"sourcegraph-for-firefox@sourcegraph.com","prefs":[],"schema":1562614890305,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541010","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Sourcegraph for Firefox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"9fde5729-9be6-4955-9627-67742c5ed62a","last_modified":1562667113062},{"guid":"/^((\\{6d0887bd-1f51-4852-9307-cf2a223c3a9a\\})|(\\{4cb2b177-e2a2-4ae1-b759-03606a85df61\\})|(\\{df28b68e-ad39-4300-add2-b2dc8bf54f71\\})|(\\{eff0a5d5-3f53-4b75-b451-5acffd5bb61d\\})|(\\{7561d328-6b59-449a-bf7a-46fea5027be4\\})|(\\{854246c0-f678-44ff-85f3-f340f33c5da9\\})|(\\{9e976e36-9eb7-44bd-97a3-4901ab3e1021\\})|(\\{2e9a0a60-8423-4ffc-89ef-74a02ca8c5e8\\})|(\\{a5e298c3-2d74-4268-8d13-e0efcb77d896\\})|(\\{39838189-7836-432f-9a34-a009886a61f8\\})|(\\{a3f781a4-adc7-4a12-9812-20da06e7b6d9\\})|(\\{365b3845-1e12-4096-80f1-8be24456d741\\})|(\\{701511ef-2e5a-458f-b735-c789b7ae6feb\\})|(\\{888807df-4517-4b97-ac73-e4294865e375\\})|(\\{ea7c7094-9d83-416d-bd13-e85fcef481a5\\})|(\\{1f67e4bd-6eb6-4fd7-a694-b8b360494cc3\\})|(\\{4f9520a5-caa6-4832-9582-2b26b8739305\\})|(\\{06f5112b-da03-481b-bef1-bf752ddbe7a2\\}))$/","prefs":[],"schema":1562269304530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f8e35175-572a-4b00-b5d3-9c8df255f1ec","last_modified":1562320360370},{"guid":"/^((\\{fc2dbae0-1ab3-40fe-9a38-cbee911b903e\\})|(\\{82e3e07c-0cf3-4b9f-a625-65d378698af3\\})|(\\{2904a7ee-0b54-4adb-a500-b932b77b6936\\})|(\\{f6932562-1f6d-4779-b5a4-f4c4654980dd\\})|(\\{97f0cc0f-69cf-4e5a-af68-f404aa3f1ce5\\})|(\\{c346f3ce-08bc-44b7-9410-bd8ad65f32d5\\})|(\\{f68f3bd2-ece8-4a85-b071-cea253cd78ac\\})|(\\{d9b6a925-e00c-4e36-a282-e6b76833e5b5\\})|(\\{e8a67ebd-655e-48f9-99e7-619c850f6bcc\\})|(\\{15942451-8c62-457f-8ff1-8525ce647c0d\\})|(\\{8fcdb966-eec2-4cd0-865e-1d105e9b59e2\\})|(\\{6ae58312-7d81-4d39-84f1-454ae6ace826\\})|(\\{023cd859-1b7c-4384-80e5-eca82c68a21c\\})|(\\{694e912f-011f-4be4-add9-25c85af8014d\\})|(\\{b889539e-4b8c-4e52-a605-a0b33532fd05\\})|(\\{596c6d7c-49ab-440e-a50d-220e5db393f7\\})|(\\{f0fd5c9c-1fcd-4085-ac41-47c379517420\\})|(\\{545dbede-b51c-477b-b23b-936dd5e7a428\\})|(\\{c3f9f4e6-b5ed-49fb-82c6-313b9617cddb\\})|(\\{309908bd-c2fe-4066-82c5-0631571e77fc\\})|(\\{75f93037-6366-4f88-b92b-c3174d68a836\\})|(\\{36e57809-88bb-47ef-9b6c-90170bb753d5\\})|(\\{da83ef9e-f36a-4416-a4ab-29a09c981690\\})|(\\{09e50933-f19f-435a-8e6a-7663715ea3fc\\})|(\\{7f35f6f3-714d-4c0d-befa-5a6843c62b6f\\})|(\\{b3b3f9c6-6b64-47d0-bf5a-f9796d1d7cfc\\})|(\\{116c6521-bda8-469c-9ca6-0702860aca67\\})|(\\{98566ed5-4c57-4da4-946f-03beeaa6145b\\})|(\\{8fc257d4-612c-4196-9688-dd7de0979c44\\})|(\\{9b7f873c-cf3f-4d8d-9cd2-3c68ce0f831f\\}))$/","prefs":[],"schema":1562096490180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1563454","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f55f27d-37e5-4c3e-bd9d-02924496ba3d","last_modified":1562227635293},{"guid":"/^((\\{a3250b1a-de19-432b-829f-3d4c18ff4549\\})|(\\{b315912c-03f9-4ca8-a9fd-9410786d242a\\})|(\\{d1e4d5e2-9c6d-4e1d-9638-d329d64e5484\\})|(\\{898e64b3-38b0-4748-93a2-7e68874a73c9\\})|(\\{062f9d2e-1e5d-47e1-a9e6-0a4eb1e8182c\\})|(\\{434cedce-3d36-4ec1-b99d-e2b5ec929e8f\\})|(\\{b429f2f0-62de-4c72-9722-9ccbcc43500c\\})|(\\{7405ed28-67e9-4836-9c38-26bb7175da3b\\})|(\\{ebb5fe5c-5561-47e8-8240-bae4ba4b0389\\})|(\\{a9a5ac46-ade8-4927-85db-5c36bb26fd2c\\})|(\\{34d93cc4-a468-4ddd-98a4-31d1237b9986\\})|(\\{394a7da5-0f59-425c-ae83-49ad47c30a51\\})|(\\{15532ccb-c575-4b8b-9a62-ca2e4b9cbd7d\\})|(\\{d0579f20-4e35-4d7e-be6a-3da1b7660ce7\\})|(\\{f39c789b-9a2f-477e-885e-675f499e8307\\})|(\\{7adb91a0-6c6b-4fc6-911c-63a0c10bb363\\})|(\\{8b51d36c-f5d2-4c9d-b431-2c5011168470\\}))$/","prefs":[],"schema":1562061057131,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562598","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"432368eb-333d-4280-846d-e9508ac0a8c4","last_modified":1562061250280},{"guid":"/^((chromelogger@usernamewilson\\.com)|(firefoxsecurity@usernamewilson\\.com))$/","prefs":[],"schema":1562001599116,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562597","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fire Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c4cd1e9e-b81f-40ef-8c0d-86b42d884a7e","last_modified":1562061057121},{"guid":"/^((\\{02421745-5b6e-45e3-925c-670b72162fa5\\})|(\\{165626db-f5c5-4e96-b7c5-dafaed6357f4\\})|(\\{87115bc9-2e52-455a-b82d-2753d3303d0c\\})|(\\{be0863e2-c325-48cf-9623-88bcc6d01970\\})|(\\{09298d3c-f8f1-401d-bd70-43cb66af1594\\}))$/","prefs":[],"schema":1561988438120,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562634","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3031bfa1-90c6-4b7a-ba03-7fcd7e010914","last_modified":1561988914045},{"guid":"/^((\\{fd605874-13ff-4b86-8018-9167923792c9\\})|(\\{687ac7de-0c7c-4e5d-9fac-10757591026d\\})|(\\{c9c11fd7-6774-4657-afe4-0cbf1081b505\\})|(\\{5970609b-547d-4094-b806-a9b0a2996c62\\})|(\\{f77d7ff3-05df-4455-aa23-8031dd341ec0\\})|(\\{d5238802-9ff3-49fd-a427-8eb7a73a08e1\\})|(\\{93a425f5-cc32-42bb-ab4d-63b53512cb52\\})|(\\{23de42fd-b546-4792-ae2f-e2f808e13b52\\})|(\\{209b8c63-d260-4fc7-be92-20e3b04eb944\\})|(\\{e6610c1e-4bd2-4ced-9d40-0a4fc125fd42\\})|(\\{6631ea49-4664-4acc-97dc-0d7e4a67a417\\})|(\\{b811cceb-fcd6-4eb6-b07b-c8c01794eaad\\})|(\\{8ad9f113-7b59-4c45-9c90-59609e7ee91a\\})|(\\{130f1820-9c73-439d-a9c8-114702e1d415\\})|(\\{6dd75c5f-407d-4f3b-9c29-90c422c82d85\\})|(\\{99968b5b-6b54-42e8-932f-0414bfd17405\\})|(\\{1a69e311-e730-48af-b050-f60247a32fe9\\})|(\\{67f715b0-1262-4660-9fa2-c6f7bc29ecc9\\})|(\\{3a8513a4-cac1-4619-ae36-9686bcbb42a2\\})|(\\{27af1be9-f9d9-40d7-878c-78d8bcd94dd5\\})|(\\{7b59b760-964a-43af-83b6-b4ef08fd2e07\\})|(\\{861bd389-6024-4aae-a31b-f334163c1406\\})|(\\{cdcdbb24-88fb-42f8-872c-3df116f82cad\\})|(\\{8c60aa85-e195-4203-8529-073a6db56c54\\})|(\\{c5781fde-fe4f-4792-9e01-4e1239c00b08\\})|(\\{1361b734-0efa-4d8d-8108-ead9400b50d8\\})|(\\{ce79c320-0b55-430a-a431-2cd69cc2919e\\})|(\\{cb976837-ff98-4f37-b81b-98571f3a7828\\})|(\\{21dd7ebb-6736-470a-afe0-5dcea38b3db7\\})|(\\{84b09a06-0f25-40ff-8198-98e2e54a739b\\})|(\\{b869d674-37ba-4df4-a34d-dc9be47a963d\\})|(\\{e18783e4-8e04-457e-9b35-611d20fc12e8\\})|(\\{04042b52-3398-4e42-a638-ef9200c589f4\\})|(\\{96292080-d058-458d-a6c6-bff1d52425a2\\})|(\\{aa584391-2c81-4dfb-b06e-5118b026104e\\})|(\\{6285eae8-ff36-4887-b46c-3772ec04390f\\})|(\\{ea28f6ac-affc-45cb-a536-1eb1bceae142\\})|(\\{340afda6-c1e6-4ac4-8e5f-a5b439a9dfa1\\})|(\\{62202f8d-8e11-4ce0-af66-2235ad17051c\\})|(\\{d4e05835-d503-4d21-9701-a24dd61b0513\\})|(\\{3e8d4f85-d823-4dac-84fd-4b87b33e7852\\})|(\\{c04dbf0d-9b39-4730-93fa-6680aa0909f1\\})|(\\{019be100-cda8-43ae-8136-a014db9e7a9f\\})|(\\{73c512b3-a9c9-4690-bba5-fbfb94aeabd7\\})|(\\{0c78c766-7ebb-4b2b-85dc-d4fcd4da6e9e\\})|(\\{a318cd63-2e84-4d05-96b8-13b721fdec8c\\})|(\\{97d03ad5-3911-4c72-8ff9-5f4b9beade68\\})|(\\{77c5010c-c799-469c-85b8-5e7e0140fb10\\})|(\\{16458eb7-545e-4626-8620-e31d71cfbcc3\\})|(\\{a5a61ddf-c248-4109-a1ba-b8bf84e728c3\\})|(\\{6b18c850-65e3-4cc8-b3f6-e78969c9a428\\})|(\\{4ae632f1-6735-4077-8b62-f73d68eab36c\\})|(\\{db7b2525-ccd1-4ee6-8daa-890d7879ed07\\})|(\\{9e382691-320d-4500-b378-90c9ad922422\\})|(\\{1bf86700-b428-4e67-9701-536f66ec0a2c\\})|(\\{d6841f20-fd15-4373-944d-a0dd6a286d69\\})|(\\{18169628-a7de-4c93-9d30-efb66f45b5a4\\})|(\\{d9979d00-eb14-4cb3-bb21-452d2c02e3dd\\})|(\\{cb868690-a1dc-4fe0-bd2e-2ab291cd54a4\\})|(\\{230faf82-9048-43e9-ab19-94bfe1113ad9\\})|(\\{e0723460-a1a2-4877-bb20-a3f14e01e594\\})|(\\{2431dfee-a855-46b4-a740-6d0e4dbaa662\\})|(\\{1d44053a-5ff6-494c-8fef-0084039eb8ac\\})|(\\{bc77d204-ecd7-42ee-8006-cd54be0a400e\\})|(\\{9e22fccc-6b4a-4674-87f2-e6ecd4b409d6\\})|(\\{62474e9a-8a3a-41cc-9530-97baf6f8b7af\\})|(\\{6932ebe8-ed27-4291-86fd-d5147e0f5702\\})|(\\{aa5b9279-e324-4951-8a12-b0712f37e233\\})|(\\{420e769f-b577-420d-bf07-182299d75882\\})|(\\{11a0fbd7-b2c9-427a-8d33-e7fd8e845630\\})|(\\{a4dfd321-45e6-42dc-9ac8-9d606ad4a672\\})|(\\{54685c20-9401-48d7-a950-81e7b10bd9ed\\})|(\\{2605a51d-53d1-4345-9fbc-380fab2a0c4e\\})|(\\{c3699f84-dacd-4734-a60c-7ecb1b28289a\\})|(\\{074b0ddb-5187-484b-9783-22d187e6dd08\\}))$/","prefs":[],"schema":1561923700391,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562630","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56849c09-6253-44ed-bc59-1cd7a61ce961","last_modified":1561988438110},{"guid":"tab-api@mozilla.xpi","prefs":[],"schema":1561710153929,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562154","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Tab API"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9f484302-44da-4b6a-afd8-94113b83c0f6","last_modified":1561710520557},{"guid":"/^((\\{b7a0ecf9-212b-49ca-bec1-ead0c6dc2128\\})|(\\{6e977a6d-b31d-4735-a586-41dc25df2100\\})|(\\{67155a2a-6538-42b1-bdc9-f48b442f57e7\\})|(\\{b4d4abc0-5e6e-4a34-a7e3-bfe7319160b8\\})|(\\{2102c5a9-f3c4-4f71-bb6e-c45c9d07b6c8\\})|(\\{071c1c7a-cde3-4a22-aefe-7c8f98df6277\\})|(\\{aa2f3e70-7dcf-4b4e-92c5-54c8280b98de\\})|(\\{3b376420-b276-4a0c-9e28-340dcc0547ce\\})|(\\{ed192371-abcc-4520-ab76-d22afbe51dff\\})|(\\{ad5a457f-59c8-4d90-8e3e-59f13a3bc2b2\\})|(\\{06aa60ab-91ad-4b8a-bfda-98e33b65fbb5\\})|(\\{c2875a12-da6a-4f90-a919-1d2bef57fbff\\})|(\\{b01d1c5b-58b5-4411-86d0-555131c7bd07\\})|(\\{0a79c7eb-5fe9-4e37-841e-18686bc86a20\\})|(\\{341ca205-d6e0-4d03-93be-04939c429412\\})|(\\{855e09d9-ac3a-4885-828d-557734060c1f\\})|(\\{8ac01eb1-9819-4c41-b2b7-042d8cdb3f2e\\}))$/","prefs":[],"schema":1561657651090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1562153","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3460b6b7-8251-4588-8f12-81ac8d288c88","last_modified":1561710153920},{"guid":"/^((\\{65b88db7-9c07-4d03-80eb-2e5cf6cd7aa8\\})|(\\{aa2ef90f-db17-4ece-abab-4f87830457db\\})|(\\{e50969c9-088c-4978-9ffb-5d78015dabcc\\})|(\\{15fd1a8e-db53-41fa-9c46-93ec5b7473c1\\})|(\\{ed84b63e-faa2-4c48-b080-e9612cbc2e49\\})|(\\{c784f63e-5609-47a8-92ee-33a2bcb3239b\\})|(\\{1641b1ec-9a3d-4e3c-b52e-bc80671349f9\\}))$/","prefs":[],"schema":1561587664411,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561854","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3e88dad8-f640-46dd-8b00-4b955eea7b24","last_modified":1561626172388},{"guid":"/^((\\{f0df6aa3-9792-4476-daa6-4709f93bbce3\\})|(\\{fe934134-3d0f-462b-d56e-e7187dfa8c98\\})|(\\{429999c4-1b8b-46fb-863f-ce19a08afc9c\\})|(\\{b8003074-2123-45be-91cf-654ef9671e1a\\})|(\\{9712066a-d491-4293-cd31-8ef8ee907d40\\})|(\\{dcfbb98b-783b-4df0-8427-e269114736cb\\})|(\\{66c44e3b-2df2-4741-ff07-0067cca4fe95\\})|(\\{af0a4d96-3403-496f-9d9a-5c766bf44bac\\})|(\\{82c60958-45da-4e6a-de21-879775c5473a\\})|(\\{c9118234-5787-488d-b30c-7d0a904fbabb\\})|(\\{f07d3da6-81ea-464f-9bef-6ff5470b307b\\})|(\\{c2454a12-7f57-440e-f695-0a9618f48b80\\})|(\\{f6e1d884-8100-49e7-88b9-bff8d9295cd2\\}))$/","prefs":[],"schema":1561552773231,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561603","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Various script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c227983-1180-4b4a-b25b-8160738e7238","last_modified":1561554563187},{"guid":"/^((\\{4200b565-5c4a-410f-b4fb-478daae2537f\\})|(\\{a0bba103-21d5-49c8-96f3-4eabbe78ced3\\})|(\\{ec46fe21-5690-4757-8ebc-1c77f826fe6b\\})|(\\{ce45d605-3bb6-4fad-8c1b-238ecee0d3df\\})|(\\{c70bd1fe-1d7d-4ae5-a731-3d513e6c46ba\\})|(\\{aeec96ca-81b9-405c-bd70-01ea6a50be9d\\})|(\\{0a1603a8-839f-4890-b1e3-1b8e00a7a0c9\\})|(\\{45febc8f-eaeb-4cec-90ea-07a7edc22793\\})|(\\{a7c7febd-6726-4d0e-9947-2edfd8bea35a\\})|(\\{eda3389e-ae07-4a2c-9b50-ce4e9008f297\\})|(\\{0e5d1d65-4fbb-4dd9-9042-3b568d9e2489\\})|(\\{1461f0e5-3c4a-453e-aed2-ca45ff5db747\\})|(\\{e842e73d-9d8a-45a8-bf0d-ef974ab24767\\})|(\\{e1d4fa8a-3da0-4fee-8b4f-0c7233fcb49a\\}))$/","prefs":[],"schema":1561541784349,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1561595","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2e886e0c-00ab-44c2-bcbe-7c8793d46d89","last_modified":1561551163572},{"guid":"/^((\\{0eddfecf-eb8a-4a08-8189-004932a77d5b\\})|(\\{b8181b05-a263-410c-8c07-5d7e8c80f9a2\\})|(\\{561d3a53-8e1f-417c-9b46-af1ea9942c4d\\})|(\\{cae0f640-a4b8-4ea0-8667-39ec00651b54\\})|(\\{142aae9b-ff6a-4ae3-b4c4-75e99534e661\\})|(\\{0592cc75-3027-420c-9a9c-22b23a21af5b\\})|(\\{23f8f54b-1f6a-4760-bd9a-414aba8d93c4\\})|(\\{09d0cd99-4cde-42d2-9a4e-8002f7595834\\}))$/","prefs":[],"schema":1561380181925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560886","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"ADB amazon"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dba9e10e-ff77-45dd-a2fc-e7daf5f09fd5","last_modified":1561381085652},{"guid":"/^((\\{99a325df-ca23-41da-84ce-477796f46737\\})|(\\{86a9b963-ebd2-4ef5-abaf-5ffd7cf86387\\})|(\\{9c05da6f-e5e2-4455-bae3-2754e1b36db4\\})|(\\{002d0276-03dc-439b-bea4-576976bbd7c4\\})|(\\{4476484a-2a0a-4a7a-8612-18ac22e02ac9\\})|(\\{edb28501-65bc-49f1-b168-1ea5e84d4a19\\})|(\\{13b0c2d6-0a44-47e0-aced-0664877b8a4e\\})|(\\{fdd30cab-1f29-439b-829d-80c5546087e0\\})|(\\{2abed6fc-d8ac-479f-8fdb-f5d20b0a5c27\\})|(\\{7afb7eb5-7837-474f-a925-62728be18488\\})|(\\{ff86f12d-e38b-4c70-ab00-9cd20174ddcd\\})|(\\{31b72d81-14d8-40e5-a2c2-7259a7d40d96\\})|(\\{84e3002a-a0ea-42f8-b30c-1739cb21b105\\})|(\\{47d8027c-a331-4f8b-8c69-4c95680caba5\\})|(\\{d03ae30a-58b5-4dc1-afd9-bc4ea8efc761\\})|(\\{eb745394-234d-48b4-bf1e-cdec66de26d3\\})|(\\{b5614c0a-878a-412f-ad7b-bc5a7916b3bf\\})|(\\{1d5916f7-3a78-40ce-92a0-35989646fe8d\\})|(\\{34cfd020-1dce-4f12-9499-f7e3b02582d0\\})|(\\{7fbdd1c1-82a4-4cfc-a3c2-ad192f5c8cf8\\})|(\\{04fbbb51-3b76-484a-99ca-ccd3e484da26\\}))$/","prefs":[],"schema":1561379624735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560888","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5525a8a4-2b7f-4cb8-8932-5daf35a2acc9","last_modified":1561380181911},{"guid":"/^((superzoom-unlisted@funnerapps\\.com)|(superzoom-unlisted-test@funnerapps\\.com)|(superzoom-hosted@funnerapps\\.com))$/","prefs":[],"schema":1561260352539,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560927","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"SuperZoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7a12a25-37c2-4ec7-8fa2-e016442b4457","last_modified":1561379624719},{"guid":"/^((\\{dfc97392-12f9-474c-9a61-fba12334d09f\\})|(\\{ca0e7543-892d-4625-8565-3671141a4ac4\\})|(\\{d50b1b61-8ba1-471b-833e-c5526ea4f307\\})|(\\{ae53880e-f5b2-4020-bdb5-0872cc1196af\\})|(\\{cb8982c0-1f56-439e-94a0-83a0308ea952\\})|(\\{91ca701d-73e3-4d76-80bc-4cbefc16beae\\})|(\\{f238a031-3366-4792-89b0-736f5e1af888\\})|(\\{35f7fa51-338b-4a7c-9f74-055708e2c941\\}))$/","prefs":[],"schema":1561232502012,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a6e32f3-3d97-4393-8733-1a24b8796aa3","last_modified":1561246819959},{"guid":"/^((\\{eb585608-4896-4892-8a9b-1786929a6517\\})|(\\{b53cec3a-0479-4887-93b2-4732059e6f95\\})|(\\{52e84405-484c-4bfb-a279-da57dc8f89d4\\})|(\\{65136894-4082-4eac-a968-ad5dfd1771f8\\})|(\\{98d5570d-3606-40f8-8af2-2d2144698a92\\})|(\\{5ced4e6d-5c50-4e26-9d8b-b82a8d9b4e87\\})|(\\{fc97e534-4690-462b-8227-af38c67b57e2\\})|(\\{8aa21cc1-d9ac-4c43-b205-bfbd87aa8163\\})|(\\{f3dd0563-975b-475b-b295-2922f6e69717\\})|(\\{b1ee58e1-90de-425b-ab76-dd8e034305c8\\})|(\\{ae026b4b-7159-4415-98d4-1fb712092028\\})|(\\{452ec3ac-8fba-4de8-a5dd-db1cf9b89c35\\})|(\\{4c0a3c25-f706-4160-8128-197137e814b8\\})|(\\{30c347c6-642c-46cf-899d-442632d90e25\\})|(\\{7dd79020-d8d4-4241-b1fe-efca66530d5d\\}))$/","prefs":[],"schema":1561059702370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560614","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake Flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"61f4423b-7171-4a82-8aae-71621233ee2a","last_modified":1561148779474},{"guid":"/^((\\{2adb8263-d69a-4436-a46e-b8595c35d3e4\\})|(\\{d2d96579-be7c-4bc0-9d94-7eb8920ed437\\})|(\\{3ef03e82-ae5c-4bb4-85f2-d0925d3b1d8f\\})|(\\{5f89e2ff-b113-45a7-bd44-a8cbb6b3e18e\\})|(\\{d0a65809-897d-40af-974c-df6baa16e0d6\\})|(\\{17d71711-a428-4231-93f7-25f65dc7a05f\\})|(\\{88bf0d44-b815-4654-b177-25ed224587de\\})|(\\{0bc2f2bb-b040-4512-b0bf-a2a875bfbcc7\\})|(\\{c05607b1-ce5d-4a14-ac71-91d93e5adc7c\\})|(\\{14d1d1c6-3982-4379-bf48-67aff16b0b40\\})|(\\{db395935-5b36-43e0-9c21-2fc546e3504b\\})|(\\{031a0658-d9a4-4dab-8b9a-3608a92d3d9f\\})|(\\{28a6ee49-33dd-4cc1-8650-7abc95ff30c1\\})|(\\{578c5cb1-ed39-4270-9010-3d7c623e4ed3\\}))$/","prefs":[],"schema":1560890279256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1560126","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More fake flash players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"39d92b03-d7b7-41d3-8d14-73088972f735","last_modified":1560959139660},{"guid":"/^((\\{52e29477-bb59-452a-a929-7d238ab68dc8\\})|(\\{e7c3e8d7-0cd7-4cea-8fe6-afd0dda61f56\\})|(\\{f57df33b-b222-4524-86c3-531a6d20b4c2\\})|(\\{5bfc5ee1-d8de-4efd-80f5-966b94eec12b\\})|(\\{ed229f56-afbb-48e5-8422-2ad940afa02f\\})|(\\{c87d1f11-ce0e-46eb-8710-1288416b709b\\})|(\\{177b00c2-4fb2-4268-b0c7-cb5a1ad08d83\\})|(\\{33850c97-5260-409e-9796-bd9e03aeb411\\}))$/","prefs":[],"schema":1560874921856,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559787","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b44844c7-0ba9-477c-b0f3-bd12725c620e","last_modified":1560875340234},{"guid":"/^((\\{004b2982-0956-4c66-a7f3-7dba26eeda94\\})|(\\{31606ee8-6af1-4d3e-98d0-451b8483a498\\})|(\\{914f7369-d844-4e72-a8de-043378710864\\})|(\\{87506f0b-af77-4113-8358-fbb0a9f6daa7\\})|(\\{74832b41-91e6-4bf0-a6a9-5e74bf3e5683\\})|(\\{94e526a9-70ec-4566-995c-53e597166c8c\\})|(\\{1679b342-31d5-44b2-ae2b-91c487b2654f\\})|(\\{ead96242-a6c8-4478-88c5-5e2c54d9ace1\\})|(\\{ab0e69c5-d215-4825-8e40-de0bcae97da9\\})|(\\{2607b07a-90e6-4c0e-9bd8-94eb16982303\\})|(\\{c8336a7e-f5ef-41d8-9754-31676cb4f6c4\\})|(\\{49185403-71d8-40ed-9e30-71171231a2c0\\})|(\\{724540be-a261-4d92-bee5-ede7c6375ed6\\})|(\\{6b687abb-9aa2-4e76-bdc9-cb542809cf7a\\})|(\\{faec57e2-f33f-4974-b29c-3afc2d710ae5\\})|(\\{2dc254ac-f312-4db3-84b2-29690e20ce4d\\})|(\\{c60eb214-f702-48fd-b173-756b528cee4b\\})|(\\{6cf50082-5b79-400b-846a-8902d6609a37\\})|(\\{a45c880d-5037-4428-9e1c-ec1cd45fe830\\})|(\\{d410777f-d023-44d5-bdb8-a54b0c927daa\\})|(\\{36fbd9e9-1d2d-411f-981d-b57fbc1067db\\})|(\\{170130b4-3178-4dc2-a1f6-98a788299b16\\})|(\\{aa54e92d-20ad-4f3f-a0c7-95a97bd5e99d\\})|(\\{6e73d781-bce5-40e0-a847-63a936f58ca6\\})|(\\{861af4ed-838b-4e5f-94c7-0e95bc6b709b\\})|(\\{3e000c1f-3ad5-455c-9a20-f18035273746\\})|(\\{aeacd5ad-8949-46a0-96b0-96c9f93f0b8b\\})|(\\{c7f65d43-1a36-4683-864f-c7224037289e\\}))$/","prefs":[],"schema":1560874615935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559776","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Norton add-ons and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7434a6e0-c434-4017-b475-625bd0f85890","last_modified":1560874921842},{"guid":"/^((\\{c3ff7a71-7392-4aa1-a193-95fd393a7389\\})|(\\{9255568f-d790-4b45-9fe7-d4d1bcc193cd\\})|(\\{76d7025a-8c31-4b0b-a9de-c6679919ef81\\})|(\\{6b93c35f-74c4-4d79-8557-b3fcb090049a\\})|(\\{f9dbfda2-5680-43f1-9575-5cb044264f7c\\})|(\\{096e84e1-36c8-48fe-b642-03c91c1ef14f\\})|(\\{a11e0be8-9b45-4d69-9aad-339d3220147c\\})|(\\{fb754f2e-c021-4190-96fd-7142cbcb985e\\})|(\\{69187792-e951-4ea9-ad26-378f25efee81\\})|(\\{6468fac9-e37b-43e9-9895-36143902e431\\})|(\\{ff1db01d-4e0d-4917-b487-7f3c28d7f5da\\})|(\\{1adb7040-3a78-4270-b4d3-b926819d4c72\\})|(\\{9b3d09a1-2134-48e3-bf0c-a6dc659aad93\\})|(\\{bfa38150-f24e-4443-9d07-875b21ff479e\\})|(\\{05c8e9b0-0b8a-4da2-9e44-a215e691302c\\})|(\\{e4868162-b7f2-40dc-9101-4eab9858876b\\})|(\\{541118b3-1905-4d4a-9059-3ac745b0b043\\})|(\\{d38507bd-22ee-4839-be07-cae4806ac227\\})|(\\{dbef35f1-fc95-42e3-a4a6-b94a970b8a7a\\})|(\\{f34d7289-64c7-4720-90e9-6a6cad0ddc9c\\})|(\\{96b900d3-784a-4e93-8b9f-5f7885424117\\})|(\\{a6ccaf93-4d0a-4bcd-b574-b6d1417bdb0d\\})|(\\{186d942f-cc7f-4054-9673-067f9aaae190\\})|(\\{f7c0f615-d406-4cf8-b5de-bde347f7d9f9\\})|(\\{ddf49e42-2db2-448f-9717-96a93bdb078d\\})|(\\{add62eb4-d1c1-4217-920c-dfb462e955aa\\})|(\\{71ef4372-6321-4e99-937a-0a4a03476348\\})|(\\{053307b4-d841-4d42-8fda-881aa7f7777d\\})|(\\{458e497b-8e5c-4901-82be-1e33832bdac2\\})|(\\{3bf07b01-bc56-4b28-acb4-7d56bb6f5fc8\\})|(\\{7e50978d-cf4e-429b-8482-946c86991bfd\\})|(\\{7691a931-7d5e-4daf-ad20-14539572c215\\})|(\\{c1d8d622-aa7b-4e36-9d5e-e1de1b1044da\\})|(\\{f1b85cd5-bc61-4994-96fb-74df9c62d385\\})|(\\{e26cab94-6216-47e7-b725-948613f2a08c\\})|(\\{2278a05e-3b98-4fe4-83f3-f90d42ce0870\\})|(\\{85240094-c94c-40b7-84ac-6dcf1d50cee5\\})|(\\{7e5f5b7a-ef9d-41a8-8137-da6399afdd5d\\})|(\\{85d01efb-0331-4f7c-9ef2-f5f35c0df0a9\\})|(\\{f455923d-856d-4f2e-8e1b-8cffb0b7a4a4\\})|(\\{cd4fab1b-03b4-42eb-9800-1664c4de06c2\\})|(\\{44ad1c10-baa5-4efe-96bf-743d6a86079e\\})|(\\{73cf3b22-f479-495e-8bab-54ca07e3341f\\})|(\\{c4e856fe-5594-4484-9463-a139eb6071e5\\})|(\\{6f110a84-aa60-4849-8408-9ee70c868e8e\\})|(\\{67d91fb9-3da3-481c-a426-a350788764f2\\})|(\\{eb7699e3-9886-40d5-863e-0bf6862f2f98\\})|(\\{e18709ec-f4d2-40de-8e88-ef7a6f1d4fef\\})|(\\{f83cd650-3411-454d-aadd-79bbd82f3793\\})|(\\{edb44a75-f988-4ce7-ad83-1b7cfe3da54b\\})|(\\{b328a40e-52a7-48df-8960-8f79927bfd35\\})|(\\{f8681a1c-062e-4934-a1ff-6479f179aa97\\})|(\\{f052ef52-7b0e-4a99-9490-892b515d7ace\\}))$/","prefs":[],"schema":1560714091988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559772","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash and clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"34b4e88a-ca61-48fc-a6c7-7e08aedf7887","last_modified":1560874615921},{"guid":"/^((\\{c5ab9361-f8d8-454a-b268-a4b355b37a83\\})|(\\{f7bbdf7b-7f4e-4319-b9c6-ba62f38e1d5c\\})|(\\{97154c2a-2a3d-4ddb-814d-5451e3c35103\\})|(\\{1665bb10-e8d5-44ea-8cd3-531b6ebfaef9\\})|(\\{f3b474a6-b76c-4a9e-ae57-df0a3992d8f1\\}))$/","prefs":[],"schema":1560430131572,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1559330","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"436f1b52-16b8-4c70-b67d-ad6c39f6bd39","last_modified":1560502059138},{"guid":"/^((de\\.firefoxextension12345@asdf\\.pl)|(deex1@de\\.com)|(esex1@ese\\.com)|(estrellach@protonmail\\.com)|(fifi312@protonmail\\.com)|(finex1@fin\\.com)|(firefoxextension123@asdf\\.pl)|(firefoxextension1234@asdf\\.pl)|(firefoxextension12345@asdf\\.pl)|(firefoxextension123456@asdf\\.pl)|(frexff1@frexff1\\.com)|(frexff2@frexff2\\.com)|(frexff3@frexff3\\.com)|(ind@niepodam\\.pl)|(jacob4311@protonmail\\.com)|(javonnu144@protonmail\\.com)|(keellon33-ff@protonmail\\.com)|(keellon33@protonmail\\.com)|(masetoo4113@protonmail\\.com)|(mikecosenti11@protonmail\\.com)|(paigecho@protonmail\\.com)|(salooo12@protonmail\\.com)|(swex1@swe\\.com)|(swex2@swe\\.com)|(swex3@swe\\.com)|(willburpoor@protonmail\\.com)|(williamhibburn@protonmail\\.com))$/","prefs":[],"schema":1560426922081,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483769","why":"Malware targeting Facebook","name":"Facebook malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"202fbae4-e904-430a-a244-63b0fb04385f","last_modified":1560429929334},{"guid":"/^((\\{50c31b2c-af26-4238-bbbc-f11218d19682\\})|(\\{7c244b9b-4058-4362-9c3f-6f553c75d051\\})|(\\{bc90f38a-c295-45c4-a09f-7038ed6139a7\\})|(\\{d55311d8-83ce-4320-b30f-a7acac9224ac\\})|(\\{39d2838c-8b0d-453d-b685-71b2af4f3ff5\\})|(\\{95fdb905-de6c-4499-b7f2-372910a44405\\}))$/","prefs":[],"schema":1560371525142,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bcce386-ce8e-4e59-838d-a02d35de154b","last_modified":1560417609081},{"guid":"/^((\\{615a653c-240f-4dac-a42b-66751cfe7405\\})|(\\{3119fa71-b8b7-430e-ba44-4c25d5d2a4e8\\})|(\\{98075bd1-491f-4506-9e0a-262b08042e5b\\})|(\\{6102d260-a977-46a0-8635-7cdf3f3b72b3\\})|(\\{593356cd-e02b-4529-9d14-c5e4740fe749\\})|(\\{15b2bf6b-274d-477e-8456-3efc218f9fe4\\})|(\\{78311b1c-ffbe-413a-86c2-86b136aacd17\\})|(\\{98f992f6-d311-4248-939c-05f5db60ee78\\})|(\\{b1f0bcd0-0bf2-43c5-b61c-ee1fdf7f88fe\\})|(\\{7113cc05-ebbf-4c1a-9c6e-a9f959817851\\})|(\\{5325d52b-99b5-4a98-8625-24bbc8098b7f\\})|(\\{b6e3b23b-adfc-4f23-986b-4e62faedf402\\})|(\\{fd000b48-0259-4356-9c5e-2ff22d8784b7\\})|(\\{7fae693e-a917-40eb-9881-769c85f64ab3\\})|(\\{c0b9ae3d-d604-4327-95a7-67733d00bc89\\})|(\\{bc6b6fa2-ef8d-41f8-99de-ad838ad09594\\})|(\\{9dfbbcab-e7d0-4483-85ca-ca71ba03b769\\})|(\\{1d4ef484-d567-436c-ba0b-9cc0fb224708\\})|(\\{9874efa4-3a66-459a-aa77-ecf9ac8d1fe4\\})|(\\{47faaf0b-ec1e-46d3-ad59-bb44345b86d2\\})|(\\{b4b433dd-adcd-4491-8f80-ecdfb4788dc4\\}))$/","prefs":[],"schema":1560340682934,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558791","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c016d195-ae3c-45d9-ab13-1010f0711b88","last_modified":1560340840541},{"guid":"/^((\\{43c62192-abed-474e-a619-9d486383f5d2\\})|(\\{9506f10a-e5c1-4a0a-83e7-8e83b3fb77d2\\})|(\\{a4fd5625-6912-4cc3-861e-f5338e4c36f8\\})|(\\{2ff20211-5540-4c13-8c06-6769902b0e15\\})|(\\{e15e3074-88a0-4a6d-bd1f-a7149eff3a6a\\})|(\\{e5800ff7-8cf3-410c-91a6-4b61838e4486\\})|(\\{22754446-97f4-473f-8da2-3ffbd44abdc3\\})|(\\{eea1ab8b-a4bd-4905-aa02-80874a452fff\\})|(\\{b0bfaa8c-702e-47ea-84ff-6b20ef979385\\})|(\\{f13622f7-470e-4ad3-85a5-25a0fd43f9fa\\})|(\\{f75cba29-48aa-4c02-8d7e-704532de1aa6\\})|(\\{43325b83-0f60-4d46-9b43-f9be2e91682c\\}))$/","prefs":[],"schema":1560251614258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1558543","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Various fake clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2399177f-4b21-4c46-ae74-ab7db1edb879","last_modified":1560339940028},{"guid":"{e1bb4a20-9e0d-443a-b171-4d3b71f27211}","prefs":[],"schema":1560247588269,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557680","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Biis"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f42edc78-6eda-4dfc-9f7b-fbaaa869852e","last_modified":1560248603844},{"guid":"/^((\\{f7b6b9aa-4564-443b-9da0-a194492cecb9\\})|(\\{f20526fe-45cb-441b-96e1-6d8aad20b97f\\})|(\\{2a7ada19-27c1-4f16-b67d-64344e85565f\\})|(\\{7faf6c45-9883-49c8-9d90-c70fd4fb72bd\\}))$/","prefs":[],"schema":1559835473927,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557381","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f781593-e000-464e-b46e-204201f42003","last_modified":1559836209248},{"guid":"/^((\\{4580e89a-d987-4a54-acd5-103eb91374df\\})|(\\{04767859-e649-473a-9ff8-1491f9217a2f\\})|(add-on@fdvoyzaxvni)|(add-on@mxdshahek)|(add-on@plgargwikihoves)|(add-on@plgbrhovtwitpor)|(add-on@plgeshovwikies)|(add-on@plgfrhovinstafr)|(add-on@plgfrscroltwofr)|(add-on@plgnlscroltwonl)|(add-on@plgsngicosnsac)|(app@clzohispatolas)|(app@plgarghovtwitt)|(app@plgargtydownesp)|(app@plgautriczoomde)|(app@plgcohovtwites)|(app@plgdehotwittde)|(app@plgdeudownlde)|(app@plgeshovtwittes)|(app@plgindhovtwiten)|(app@plgitscroltwoit)|(app@plgnlhovtwittnl)|(app@plgphscroltwoen)|(app@plgsajjhamzooph)|(app@plgsingchewmve)|(appapp@plgindzoplshind)|(application@arzoplgirasta)|(application@blibluk)|(application@breplgdownporbr)|(application@es9hsgaedr)|(application@es10gfjqzma)|(application@gerluk)|(application@grasow)|(application@plgbehovtwittnl)|(application@plgbelgdownflam)|(application@plgbescroltwonl)|(application@plgbrhovwikibr)|(application@plgdescroltwode)|(application@plgfihovinstafi)|(application@plgindiendownen)|(application@plgindzoplshind)|(application@plgphhovtwiten)|(application@twexispolavieda)|(ext@es8dffdsghe)|(ext@plgagscroltwoes)|(ext@plgbehovtwittfr)|(ext@plgbelgizompnl)|(ext@plgbgzowomawfr)|(ext@plgesscroltwoes)|(ext@plgithovinstait)|(ext@plgsescroltwose)|(ext@plgukscroltwoen)|(ext@sgdlpictomagi)|(ext@uksfdahdhsc)|(extension@es5dssdsj)|(extension@itsfahqiaxb)|(extension@plgauthovtwitde)|(extension@plgbrscroltwopt)|(extension@plgdehoverwikde)|(extension@plgfrdownlnewfr)|(extension@plgfrhoverwikfr)|(extension@plgfrsearchfr)|(plg@defdgajbisl)|(plg@es6fdhfec)|(plg@es7fdsfddqa)|(plg@esfdhalmbwn)|(plg@frhadiadsk)|(plg@indplgomenawc)|(plg@plgbescroltwofr)|(plg@plgbrhovinstapt)|(plg@plgbrsearchpt)|(plg@plgesdownopenew)|(plg@plgitadownaudit)|(plg@plgithovertwitt)|(plg@plgnlhovwikinl)|(plg@plgnlscroltwonl)|(plg@plgnorvegzoom)|(plg@plgsuhovtwittde)|(plg@plgukhovwikien)|(plg@singplganowong)|(plugin@frmdehpzamdoas)|(plugin@pldinddowninen)|(plugin@plgdahovinstada)|(plugin@plgdesearchde)|(plugin@plghowtwifr)|(plugin@plgitsearchit)|(plugin@plgitwikihoveit)|(plugin@plgnohovtwitno)|(plugin@plgpaysbasdownl)|(plugin@plgukendowauden)|(plugin@plgukhovtwitten)|(plugin@ptgouloumette)|(plugin@sgpongextejmk))$/","prefs":[],"schema":1559815025832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557258","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67ab85b2-4241-4f2a-8589-801b4221b79d","last_modified":1559835396847},{"guid":"{ca6a76c4-1831-4e90-9ed8-2a3768114563}","prefs":[],"schema":1559739635606,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556974","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Xtif"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c7614a2-793c-454d-967e-35b06de2cbd1","last_modified":1559814857242},{"guid":"/^((\\{8dcc43e0-bd17-44db-a0a1-4cf179f4a97f\\})|(\\{a4ef8092-6d9b-4ca2-bc6a-021fc9e8e156\\})|(\\{9fb5bfd6-27d6-4321-8af9-47b6ceacac3f\\})|(\\{3c9052cd-10e7-4ccf-9dda-8524cccf66a7\\})|(\\{da554ce8-5c96-4511-93f2-4e00a85aeb20\\}))$/","prefs":[],"schema":1559677299211,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1557027","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a7bc4a56-2f54-4791-b644-0ed2403bb9db","last_modified":1559739185033},{"guid":"/^((__MSG_name__@crx-to-xpi)|(\\{3fedc417-0513-4d15-a7e5-978d044cc9b9\\})|(\\{5c0f4cf6-b6f5-4485-a941-6c25f65c54eb\\})|(\\{5e1948ce-2889-4504-9e53-170753e731f6\\})|(\\{5fbf70b1-6dd8-4cd3-83fd-fbc53c59b7f7\\})|(\\{6ed4cb78-09ec-4a85-ad8c-d29382beb6d2\\})|(\\{6f7b3f15-30ab-40ce-9424-9a03a4969bea\\})|(\\{7d516686-2f77-4f2f-8a24-2441f9661187\\})|(\\{8c50589a-419d-40b5-8edb-4027a509725a\\})|(\\{8cf8a461-47f0-4eef-966c-faf0ae9593f8\\})|(\\{9ae1dd88-5e97-4ff4-b6a6-907689b6289b\\})|(\\{17a98bce-6b45-4c91-82ac-2916264e79ad\\})|(\\{50bf8563-c1e1-4c6d-80f8-281cd0d9f453\\})|(\\{51c03d30-c160-409f-be23-a576bf6ee2a6\\})|(\\{76a4a4cd-0bbb-4c6b-b285-d3aa4b55a99e\\})|(\\{94c8b1f5-7675-48fb-8c2b-3a8c7faa059e\\})|(\\{110b4b76-4314-4c63-9ae7-01e0e30f995f\\})|(\\{204d5f5f-d2bf-4892-a35d-e02d7436a410\\})|(\\{358af48c-726e-4853-a941-a19f9f4bcf8a\\})|(\\{02110a55-b817-49e7-bddd-5ce06d7f66e3\\})|(\\{9521b96b-f232-4689-81eb-907ba68872fb\\})|(\\{83034ff5-c83d-4560-8e6e-646862d2f405\\})|(\\{167357db-2afa-43a2-90df-ca2c6527ed78\\})|(\\{08429889-d4dd-4dc0-a607-5e26d976f376\\})|(\\{20289793-a4b4-48de-b640-672e6be44f5e\\})|(\\{a1be3447-d87d-409b-8721-d895935f65b8\\})|(\\{bf599b22-fc5d-43ac-ae24-343016cf6a94\\})|(\\{c8faeded-34a7-4eb6-8e21-407c82040ca1\\})|(\\{d8b5848f-b314-483b-8fd3-9f919f0f3b8b\\})|(\\{d768a761-3df5-4676-8cbe-5e3f4f426f6d\\})|(\\{e5d45ac7-1a6d-4ec8-89ae-d75ff07b89b3\\})|(\\{e5705290-3609-4b11-a062-6c55fd074d80\\})|(\\{ec92f712-38a6-4d81-80fb-529990a5b83d\\})|(\\{f14fbd1c-1df9-4ab3-a983-a8889f88fec2\\})|(\\{fcdb43b5-add6-49f2-a102-761147cb88fe\\})|(\\{fddfb568-5055-4dc7-ac3c-5eabc69c3c75\\})|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified--782543786)|(anhjddeakbabimdgmonfbnpbainknbfa@chrome-store-foxified-875652714)|(darktheme@addon\\.com))$/","prefs":[],"schema":1559660128156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556759","why":"This add-on violates Mozilla's add-on policies by changing request setting without user control or consent.","name":"Malicious request manipulation add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6016087e-a255-4d70-8ffa-d7095af42e00","last_modified":1559660502221},{"guid":"{31dea008-38a8-44c5-8404-d1b110f47ab5}","prefs":[],"schema":1559648801945,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0423\u043a\u0440\u0430\u0438\u043d\u0430"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.2","minVersion":"0"}],"id":"dc8887b5-eae3-4cc9-937f-229b8830ba83","last_modified":1559649064547},{"guid":"{4bf7c817-a8ab-4d98-b84d-65f79f05415d}","prefs":[],"schema":1559647486096,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555768","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"FastProxy - \u0420\u043e\u0441\u0441\u0438\u044f"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.0.14","minVersion":"0"}],"id":"96dbcd8a-d40a-4949-957b-b6eda96d0b95","last_modified":1559648801932},{"guid":"/^((\\{366bbde3-553b-4587-99d1-ce34f6b52e1b\\})|(\\{af48b3a0-a899-4722-a6b0-72ea823c9c57\\})|(\\{bc4dba63-23da-47ce-9ed5-574859c80ae2\\})|(\\{e390c529-7e38-4191-9cee-7b6902c9d833\\}))$/","prefs":[],"schema":1559647399044,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556700","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0561368d-755a-498b-a3ba-55274d9bc925","last_modified":1559647486083},{"guid":"{5a3477ec-7abe-4efc-b44a-7ede3cc02217}","prefs":[],"schema":1559563381261,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556698","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"youtube video download pro"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94404f29-bf39-473a-a299-57d922f51c6c","last_modified":1559647399030},{"guid":"/^((jid1-93CWPmRaVPjRQA@jetpack)|(\\{3c78ca35-67af-4917-a24b-7699456ca61e\\})|(\\{8a8f48ed-3daf-41b9-88f4-73730459aaf6\\})|(\\{f906b9c7-576c-45ad-8f48-358271e15e5b\\})|(\\{de4f3cf2-cd35-4a2f-a405-33a4a29918a2\\})|(\\{7a365978-94e2-49d4-b5f7-6178dc80ed69\\})|(\\{dbc00301-7930-4421-91d8-23bf463228c2\\})|(\\{4f42055b-fd40-4b98-b71f-a58725d729d1\\})|(\\{8b6ae26a-4479-4727-bd89-46aef6f6e5d6\\})|(\\{b6a95353-bf1f-4c03-b4e5-43eca107ecbf\\})|(\\{933d68b5-80f4-44ba-bceb-2a6338c0ac7e\\})|(\\{cc9eb257-0f4e-423a-b124-318c59271a3b\\})|(\\{d0dc10cb-6b80-4e88-aec9-605d4e75ae59\\})|(\\{8dc1a829-e888-4ce5-a19e-614277de4d7a\\})|(\\{81ad5a42-34cb-4c35-b354-2306dbe418fb\\})|(\\{2fe8edfa-61ab-4257-848b-59def269a511\\})|(\\{55de894d-cfd0-4654-af30-719020792149\\})|(\\{4b9ffc29-0e02-4583-89d9-495084f96b43\\})|(\\{aa94dd9b-7d23-4776-ac2e-9939a3cf7bb0\\})|(\\{b43a0fd7-b010-42ae-a613-db7e792c995f\\})|(\\{af57625d-4b59-4028-874d-767a37bc9ebd\\})|(\\{84387d47-147e-4d50-8a3a-6e2bb4b522e5\\}))$/","prefs":[],"schema":1559562690935,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555945","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adobe Flash Players and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a9526a76-d420-4adf-9a57-7096172d6077","last_modified":1559563142131},{"guid":"/^((\\{e914f532-5b99-4c2c-a6d9-56c6f9e07f09\\})|(\\{d7904110-ef0b-4daf-8fe1-1627c9cd14b9\\})|(\\{091d1ebc-55f9-4af0-871a-b3b383b70241\\})|(\\{eaf253cb-0418-4994-98cd-4fcfb5b827c1\\}))$/","prefs":[],"schema":1559562473865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555848","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"WFot and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"740446f0-e16d-484d-a946-873f92d78c79","last_modified":1559562690921},{"guid":"/^((\\{3d35fa06-3f8e-457c-9ffa-a115f33e8e7b\\})|(\\{fd834065-2938-4522-ae8c-55592bf7e870\\})|(\\{d52afc01-3504-45eb-aa06-3fa55d2dc7cd\\})|(\\{2a34eba4-2a55-4863-91a6-c389d8e108c9\\})|(\\{45082e42-ceef-4df8-9f27-b5adf766ed8d\\})|(\\{8f77cfd1-6eee-4489-93d0-ae8627d8211d\\}))$/","prefs":[],"schema":1559562343779,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555481","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"BatchSerialized and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10b029a4-72af-4e6a-b53a-492b94d1813f","last_modified":1559562473850},{"guid":"/^((\\{0c955fab-3d51-4989-aca5-d806cf0f2ea4\\})|(\\{1b382a66-46e8-4d33-a8a4-a857dc03cf12\\})|(\\{3f41aff5-f248-4b99-9c76-b7d192d9e979\\})|(\\{5c3d28a2-b778-4b48-9d71-da6fc2c37ccd\\})|(\\{8ef9fda9-1384-4efa-bbac-02f76f9a75dc\\})|(\\{8fd2e113-76cc-45cd-b4b0-cbef46166d76\\})|(\\{9c914f01-3e9f-45af-8d53-618ce7659d96\\})|(\\{70d353ca-2edb-4196-9294-d80cbca9ae3a\\})|(\\{79fba572-6a81-42be-abf8-92037bd908db\\})|(\\{106c67c5-a780-4076-af33-94945b16d4f1\\})|(\\{177bb2d7-15a6-475a-a34a-94f964b22731\\})|(\\{248d26ad-c8d7-4a1c-8d7e-22a36226f52b\\})|(\\{679b892e-c913-4993-bc18-1b737ac5de8d\\})|(\\{877e11b1-0725-41f9-b0e0-1b89cd88097a\\})|(\\{902b9979-3273-44cd-a717-8c55aec563fe\\})|(\\{3515e081-cd1d-482c-898a-62ade3007f8d\\})|(\\{4080f1c9-b07f-408e-9678-bdda4822f536\\})|(\\{7631efe5-237b-44e3-9193-205346744e31\\})|(\\{8157ad65-a32e-41f3-b99f-5c6f60a82d3e\\})|(\\{9434fbdd-d45c-43ee-98ac-a1c794f89c43\\})|(\\{19976dc8-c059-4058-a7b4-ba734cde798f\\})|(\\{32678e4c-b8df-4a19-91d8-3294b84ce78a\\})|(\\{773450d4-d2d7-48c2-9378-5affb64c4575\\})|(\\{894136b3-8133-432a-b46d-6f528608aa49\\})|(\\{7804268c-4d4f-44c1-a53c-2680e61b6687\\})|(\\{a12fdc00-7623-459d-8188-8e954b6f6eb7\\})|(\\{a46f0ac4-bd96-475d-bba6-2ab01575e06f\\})|(\\{c7dfadc5-8d54-4f00-bc2f-c1ba1483eb41\\})|(\\{cc89ddb5-7f2d-4b9c-bcf6-fc8057869838\\})|(\\{d7c4c15f-e91d-496d-8f78-79809c114a57\\})|(\\{d2925b02-9e1e-4b81-9a72-714a772be945\\})|(\\{dc59a997-f35a-4fa6-9ac0-40c1dce4829b\\})|(\\{def69fda-720f-4e2b-8783-93491939d9a1\\})|(\\{dfbe87b9-0fb6-41fb-a143-f8e0a47452f7\\})|(\\{f778e9f0-ea54-4264-83fb-6783906bce17\\}))$/","prefs":[],"schema":1559504489486,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1556339","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger Add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e57383a8-d67b-40b9-8df0-ac8a8a6321fb","last_modified":1559555647852},{"guid":"@yt-adblock","prefs":[],"schema":1559145199457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555403","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"YouTube Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c34988ff-b712-4123-ad14-11d24d2d3a18","last_modified":1559147777278},{"guid":"/^((\\{6f35f413-21ef-4d85-96f7-64b7cccb947b\\})|(\\{7ec94ecf-7215-4cd1-a193-402c3b6e8474\\})|(\\{767e59b0-41da-4cf5-bfe1-56c8402c1ca2\\})|(\\{0770eaac-f694-49a9-bac0-39933e62862a\\})|(\\{5319ec46-b72f-4b1c-90a7-67b1b392af05\\})|(\\{7765a798-ae6b-4ea9-920d-fe7f6d07043a\\})|(\\{93927b7e-0c83-4ce8-b66e-36bb88e2551f\\})|(\\{bd6bd2fb-8614-4302-a67d-bf4f7da55e20\\}))$/","prefs":[],"schema":1559136970465,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555357","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Add-ons exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8ca8b1b-1897-45b6-b12a-b64c45d8959e","last_modified":1559139447403},{"guid":"{f6bca217-8cdc-4c85-b8ae-30da228dbd71}","prefs":[],"schema":1559127564301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555026","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Gmail checker plus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a110749-4dbf-46c9-a6a8-56c19d6eb346","last_modified":1559136956255},{"guid":"/^((\\{cc9f487a-618e-4c48-b0a9-65f25d53c887\\})|(\\{8fcc31d3-f865-40fc-9f31-a38ab9973e9a\\}))$/","prefs":[],"schema":1559124226003,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555282","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Remote script add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c3025513-0716-4a0b-8a1b-9d5636c90f79","last_modified":1559124311799},{"guid":"/^((\\{207df7ea-6d21-4fdb-b4fb-566ae3666245\\})|(\\{e622e0a7-d0c6-4747-bf5f-fe0321da85e6\\})|(\\{8ea990c1-ea81-4aa8-8f0b-ab6ddb888bbc\\})|(\\{1f0f312f-85ae-4603-9761-4dea6a699227\\})|(\\{f9b0e524-7ccc-4392-9130-09a7c84f9730\\})|(\\{f9567a86-accf-4710-bf33-d5ff890416af\\}))$/","prefs":[],"schema":1559123848301,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555280","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32891270-8ebe-41b1-b89c-9caf80944c89","last_modified":1559124225988},{"guid":"/^((\\{8fad4bef-56e9-4879-8780-ca7c18aa1171\\})|(\\{a6ce9b9f-cea4-44b6-ada5-a96c6bbf6d83\\})|(\\{a14b3807-8409-4b4d-bb16-5d1996492672\\}))$/","prefs":[],"schema":1559122494410,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1555273","why":"This add-on violates Mozilla's add-on policies by collecting ancillary user data.","name":"Keylogger malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"57a3e7c7-3cf9-46a5-88ac-3f87029e4b5a","last_modified":1559122823674},{"guid":"/^((\\{5d840f65-c476-479b-a2e3-5a19b7a0a853\\})|(\\{021b8ac0-4a36-4294-8261-662d947a83d4\\})|(\\{038b50d5-8590-4479-93d2-4c07b619f402\\})|(\\{882bf6a6-47d7-47c3-8bbf-4f8fb259358d\\})|(\\{0918fee5-aee0-4e84-9613-a8b1e59dfcff\\})|(\\{90854ba5-e748-4f74-b8c2-9a6aa409894c\\})|(\\{a22263da-63d6-44fc-bdb8-381ba7e3c36a\\})|(\\{ec50f1de-0bae-4bfa-b665-59254094089e\\})|(\\{f48a449e-54f7-44fd-90f2-34a9526d5766\\}))$/","prefs":[],"schema":1559046153546,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554962","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6c8516bd-c427-4a7a-9f52-10c942e083a2","last_modified":1559046242210},{"guid":"/^((\\{a43383bc-1d39-4d94-b353-ceaf942c7d52\\})|(\\{0a727455-07c0-4c8b-a0e2-7853347e13e4\\})|(\\{3810f596-bf50-74e2-a47c-9894ebdc5179\\})|(\\{03ce6944-6491-4f7c-ae42-3f2a9c3f9c99\\})|(\\{3523e8cd-09e2-4442-ae13-e1d1575d4b27\\})|(\\{a08f79e0-c70f-4021-80e9-44614d5f8b5a\\})|(\\{e43b625a-f337-4cd6-b3d1-6763b5213223\\})|(\\{744c464d-4cc3-4303-b3d1-5b756144cd5e\\})|(\\{c948603c-496d-426f-a7ff-9af3d7ac1380\\})|(\\{ceaea029-439b-4d0d-99ca-a261de44d0dd\\}))$/","prefs":[],"schema":1559039806318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554942","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Keylogger add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"940f09a9-e0ba-4b98-8dd1-edb78573b62f","last_modified":1559039956017},{"guid":"/^((\\{d227e621-ef26-4b4d-b724-0138e5bb03dc\\})|(\\{ec418296-8754-46fa-a265-9856f1706f8d\\})|(\\{e64aeb61-251e-46ed-863c-b9a7c4849cfd\\}))$/","prefs":[],"schema":1559039652168,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554941","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Service Processor and others"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2ea28df4-7fdc-4571-95ba-10b61e270c72","last_modified":1559039806304},{"guid":"/^((\\{e7f0881e-39e9-4569-85b5-71b925294de3\\})|(\\{4d19382a-c81d-488a-98ac-f73484a6dd2b\\})|(\\{6d68222e-1982-4b74-9fd1-52b6a4b4c2a5\\}))$/","prefs":[],"schema":1558986099090,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554675","why":"These add-ons violate Mozilla\u2019s add-on policies by executing remote code.","name":"Microsoft .NET Framework Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2b5e298d-9dfd-4c66-ae18-1671001f4cf2","last_modified":1559039652155},{"guid":"/^((\\{59feb34b-bb64-4063-933b-d5af131da847\\})|(\\{9d84eba6-c1cb-4ec2-8b4b-b6be1ecd902a\\})|(\\{7c98044a-2ab6-481b-bc75-e2e5df6c4de8\\})|(\\{62457714-ded1-44fd-b107-b14da63a2850\\}))$/","prefs":[],"schema":1558975224053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554740","why":"These add-ons violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Youtube Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a5c8e26-d7c8-4c45-91cc-d86bd1aaa0f3","last_modified":1558976967835},{"guid":"/^((\\{6f2cec94-2f78-4812-9898-1bf98d7ccbfe\\})|(\\{e8cff71e-5c43-4fd3-b63b-7b9f6c29d54c\\}))$/","prefs":[],"schema":1558959050284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554676","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Data exfiltration malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"98aa70f7-d993-490b-ab07-108cc5a8f38c","last_modified":1558967785430},{"guid":"/^((\\{b3c1723b-6e69-4a3d-b3f6-90793bbd6500\\})|(\\{ba38e6b7-7480-4e58-9f5b-162e83c6ece8\\})|(\\{ff08056a-a34e-44b1-bcae-805d3770738f\\})|(\\{29806031-d49c-4ef3-a37a-32ee29e5fc0b\\})|(\\{541e33f8-ec74-4311-b7a3-8baa185aeb7e\\})|(\\{d8196867-5419-450c-aee4-1e349b4b0b5f\\})|(\\{ebd7a4e7-056e-4009-bb5e-753c1d1eed93\\})|(\\{01935a63-d565-478a-9f91-9ff9aa49ce61\\})|(\\{d0e7ce73-9829-4a10-b5f2-83f8bf2c730b\\})|(\\{b70f302a-84ad-4f10-8af3-f6ea4aa327fb\\})|(\\{e5f1a2e5-798b-4915-b109-5ebbe2b57821\\})|(\\{7921669d-959a-4992-857d-f47761b5b4ac\\})|(\\{80808d17-bf74-4b91-8fa5-694c3107950d\\})|(\\{84984575-1b73-4b96-ba1c-d9959393e742\\})|(\\{20587256-b018-41c2-91fc-5a278a2837f2\\})|(\\{577f8c9b-c791-4999-9c39-1e4584f4e9d6\\})|(\\{3691584f-c3a3-4fde-8817-b2501802ef54\\})|(\\{e1680c37-e6ff-4280-8f97-943d77e63022\\})|(\\{013ae092-188d-4e95-9138-2b4d98dda7cd\\})|(\\{05e3806c-00e6-40c7-8503-9c30f3db8e63\\})|(\\{9552ab33-c43e-4338-a020-80dc3636f577\\})|(\\{8fd3c74f-57d7-4e1b-9e52-6c4517ef89f0\\})|(\\{9b0ad6aa-7c54-4655-aca5-78e973b0ebd4\\})|(\\{e648ecf7-4858-40f8-9d85-5cc5f68eae6c\\})|(\\{9430fbaf-aa5d-4492-92c2-0f1354c5c860\\})|(\\{d58bd1fd-6451-42d5-b066-4baf7d4271f9\\})|(\\{948790d7-57d3-4db1-8fc7-7ccee4abf047\\})|(\\{1b8d5392-1641-43c1-a6d6-d1429e9d4109\\})|(\\{3ae072ea-3ffc-4395-8f3c-ebe92f355c3d\\})|(\\{32f9b8a8-505a-4621-979b-b6919633f787\\})|(\\{e939e079-1e15-4491-95b3-6fb8a836e80b\\}))$/","prefs":[],"schema":1558954910531,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554635","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e454fe70-d5d7-40c0-a571-e9253d1361d5","last_modified":1558955090783},{"guid":"{19ed30e8-28ad-405a-a7e4-18a8c78b1078}","prefs":[],"schema":1558951086426,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554624","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"OpTurs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a3b8837-605f-48dd-8b40-a66777f45108","last_modified":1558951513292},{"guid":"{9834ff7f-e3ea-485a-b861-801a2e33f822}","prefs":[],"schema":1558813299527,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554465","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"LinkT"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9496c5f-b37d-4b8e-abaf-509b980ab553","last_modified":1558868765210},{"guid":"/^((\\{0e9ab3be-c296-4825-aecd-3923ded051f6\\})|(\\{9f737295-e8d2-4e70-b226-8809f6b135c9\\})|(\\{68e1d557-8fc1-40e0-b197-43f8f3d36239\\})|(\\{90221614-a0b9-4301-b141-3f8a23fb4835\\})|(\\{d3255cb0-bf30-43b0-afd3-db97bfeeede4\\})|(\\{b4498268-c0d0-435c-944e-8dd6e8518654\\})|(\\{93d90a45-a10e-47df-a106-2ffeefe3052a\\})|(\\{d7b04034-ea8b-4219-ad1c-ffa061a2e0cb\\})|(\\{391772ba-a23c-4892-b30d-45d2a935be3c\\})|(\\{0b2aaa98-1f4b-483a-815f-3f864711a737\\})|(\\{2564ed8f-305b-4ade-a787-6fae696c14ab\\})|(\\{fc2fe0a7-9886-4a7e-9850-cccc2879b0e7\\}))$/","prefs":[],"schema":1558712940017,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554227","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"768bde60-2086-487f-b374-ca3fa6e712fd","last_modified":1558713145915},{"guid":"{4ee078c0-ded1-4f82-9bb1-de645e778924}","prefs":[],"schema":1558712019540,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554097","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Switch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0508904-1f0b-4352-a5e6-a33f8fa26ce8","last_modified":1558712846698},{"guid":"/^((spp@avast\\.com)|(\\{056790bb-9676-40fb-845a-feae6dedfbee\\})|(\\{15d51e39-3ccf-4ce2-a434-dbbf1785e867\\})|(\\{2bbdf86f-3c6b-48d6-9934-9051ce5f5976\\})|(\\{2f6d1519-33b5-4970-a7ec-561f5e067ba0\\})|(\\{2fd10339-a9db-4846-bdd7-ee41cea97312\\})|(\\{31390faf-ef95-4f4b-a1a4-3c3a09dd7b5a\\})|(\\{411bfbf9-646d-401c-b87d-e77d812a68ce\\})|(\\{44e4b2cf-77ba-4f76-aca7-f3fcbc2dda2f\\})|(\\{5422d0cd-3b45-4fcd-9886-463be7e1a05f\\})|(\\{5ae5a1f8-a994-4e61-8c99-54a9fe58a9c4\\})|(\\{5d4c1f36-196d-4e9a-909b-8ad138546f79\\})|(\\{7150cd87-1b5f-41ea-b659-5cae4b753e2d\\})|(\\{78a02646-2bf6-417e-9498-32f29a4ef89a\\})|(\\{7bdac7a1-be1d-4ecd-8cf1-a1db64adfaaf\\})|(\\{80686e70-c06a-4ab3-b7bf-fd4c05985c1b\\})|(\\{83830f14-c5d0-4546-af99-cbaba3ab832d\\})|(\\{869a5e06-732e-4635-8da3-90a2802f9c80\\})|(\\{87ea875a-396a-4c7b-b202-cecd5a4fe0d4\\})|(\\{94847025-c5a9-4dd7-83df-54c17b79eeb8\\})|(\\{992e4d3d-f56b-4f71-b826-0dd976681228\\})|(\\{a259d36e-9c24-4216-8b28-d3e83c07a832\\})|(\\{a669b31a-3a2b-4c75-838c-a8542f77c79f\\})|(\\{af35bf73-7d25-4286-9be6-fa822818ac82\\})|(\\{b01f0319-b398-4a6e-b9c9-e59e2d99eee7\\})|(\\{c516baf9-a911-453e-be0e-26389cfb33ac\\})|(\\{c88fc74d-31b5-40d4-bb8a-008f2d7a1ea0\\})|(\\{ca6b87f3-2d8b-49ea-9627-95e900c5f108\\})|(\\{cdc01730-6108-4581-b5da-36f7fa8e3d2e\\})|(\\{cfbbd54d-26dd-4f20-b0c9-26b2d920bc04\\})|(\\{d384c2ef-9e42-4dfa-bba5-73b9b6ad2e61\\})|(\\{d7ef08b6-ef77-43b6-ad60-74ea67495674\\})|(\\{dec788dd-9a21-416d-91c7-bf79250cab04\\})|(\\{fb182266-3336-4dcb-8898-859affe73e7f\\})|(\\{fe17e98b-1ed8-45fe-a6e5-8280902d2500\\})|(\\{febfdee8-5724-4aea-8b70-6be9e22248fc\\})|(\\{ff471567-6ff5-48d9-8db6-d2c9134f0aed\\}))$/","prefs":[],"schema":1558674107244,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1554004","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Keyloggers and Fake Anti-Virus or VPN add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3b36e078-7c88-411c-9366-033ac185c66d","last_modified":1558711200727},{"guid":"{e256d52b-d9ae-4709-aa9f-ba4d1eb1b284}","prefs":[],"schema":1558637428118,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553531","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Reading Cursors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4b943d8a-828f-45d2-b8e7-f16e6c3f860c","last_modified":1558637573461},{"guid":"{7d3c46ed-b9f7-497e-bccc-e6d878032d14}","prefs":[],"schema":1558636256156,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553746","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Zoom"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1282ea00-9aa1-47c6-9a93-4fc17aa4fcc4","last_modified":1558637428108},{"guid":"{cc02a70f-0610-456c-bc5e-5eefb6716904}","prefs":[],"schema":1558636068339,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553761","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"headingsMap"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37c5c7d6-e0ce-4c6b-8c89-49d94b6fe159","last_modified":1558636256148},{"guid":"/^((\\{5768d1b3-4e2d-4088-bd65-c7a62353ea3a\\})|(\\{65b99c4e-a9bb-4bb9-913d-503fa9bcdc46\\})|(\\{31ebd11b-bb60-403b-94a9-e09a3bf7d64f\\})|(\\{571339cd-9f45-47be-9476-767a62cb6c97\\})|(\\{ed4f9665-1851-4398-ab15-46c5e3ab8fac\\})|(\\{972319b8-8dd8-4ed0-8de2-9bc6582f0560\\})|(\\{4a0d8618-3e21-4bb8-8ae3-d04316b55a1e\\})|(devlopper61@avast\\.com)|(\\{8df3e056-6d4f-42fa-b0ad-40ee9a79d9c4\\})|(\\{e7e68020-07de-4f9f-9aec-6df29e9f64b8\\}))$/","prefs":[],"schema":1558635731472,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553857","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Easy Screenshot, Youtube Download*"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7f8e7584-6c6c-4579-882a-6f6ed21766dd","last_modified":1558636068330},{"guid":"{b19d065e-4460-4714-9208-3f2b38907522}","prefs":[],"schema":1558537447980,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553521","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"QxSearch"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"60311c2e-044e-4e24-9abe-6ee75d7f5467","last_modified":1558537465968},{"guid":"addonfx@horoscope-france.com","prefs":[],"schema":1558537035045,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553518","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control and executing remote code.","name":"Horoscope France"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ec32be61-2646-4686-9829-7cff21f5d1f8","last_modified":1558537447957},{"guid":"{65dc18e1-109f-4039-929b-f8a7a29be090}","prefs":[],"schema":1558536906311,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553517","why":"This add-on violates Mozilla's add-on policies by overriding search setting without user's consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"bf7a8bf0-e60e-4516-9e93-777c19509ef6","last_modified":1558537035028},{"guid":"{3fc1db2b-e7db-4512-b24e-1faf4d3a1b4d}","prefs":[],"schema":1558536030188,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553479","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"quikaxes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43966df2-e95c-415b-bffc-13814e1d2b11","last_modified":1558536765550},{"guid":"{a37a7625-b64e-45f3-8b79-f71634f14438}","prefs":[],"schema":1558467699805,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553326","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Lift"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7e86024e-5621-4ded-bc16-184f94fa2e29","last_modified":1558528706505},{"guid":"/^((\\{3e20d1e2-a7ee-4ce2-ab9c-51c8300a8ff6\\})|(\\{30906bbc-0942-445b-89c8-f74dac0edb8f\\}))$/","prefs":[],"schema":1558382009200,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1553071","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Amiri"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c5f5681-8547-4e65-9c05-5796e483b8e1","last_modified":1558434518612},{"guid":"/^((\\{ec19994c-c5a5-46d9-bd4d-0fc417c6f4b8\\})|(\\{a0be7e8d-b0a3-460b-8a52-429c79e49ee2\\})|(\\{1814dd58-4147-4cca-a0a3-c5aa35966d9c\\}))$/","prefs":[],"schema":1558381075651,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551937","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Inspiring Quotes + Daily Quote Tab + Pug Extension"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"efecef61-549b-4c13-8a52-394c636dd24b","last_modified":1558381320379},{"guid":"{dc6176c4-a192-4a92-849f-ad13abe889ad}","prefs":[],"schema":1558379927394,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551934","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Easy Speedtest"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a5fa8f77-7761-4996-a11d-d8cf723103da","last_modified":1558381015030},{"guid":"{ac4be7d1-4db6-4b4c-bf48-e345350bcb59}","prefs":[],"schema":1558379796996,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552830","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code and exfiltrating user data.","name":"Browser type hider"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"41137e55-8a11-4259-a009-42c29daadf17","last_modified":1558379927382},{"guid":"{da993d54-9605-42f7-a32f-9f565245070c}","prefs":[],"schema":1558362750147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552834","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Fake Adblocker"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2212748f-ad60-497f-af7b-50d20b326e40","last_modified":1558379796981},{"guid":"/^((\\{2b3eed60-8f6e-4afc-99f1-38d12f4253da\\})|(\\{3a6f9dac-3a93-4f6f-8b74-9ebc0f501306\\})|(\\{46bba8e9-7a75-4dd6-932e-bdd74141cb87\\})|(\\{4b480ab6-b63a-43f8-b4f4-d312972ab086\\})|(\\{6106687e-ca0c-4d7e-93bc-115929e4d299\\})|(\\{717ce133-3c0a-448e-b6ed-fc7d22b76534\\})|(\\{7224f1ae-c342-4bb5-8441-d324a8951624\\})|(\\{768e9638-2eba-42e4-a13a-4f3f1df391a2\\})|(\\{7b655f43-c871-46d2-8f6d-31989e8ee939\\})|(\\{7e46c692-9488-4671-8c39-7830f92628b0\\})|(\\{83bc6b56-545f-4ba1-a80b-f82d55cc0f68\\})|(\\{970a774e-b7a7-498f-b3f2-d88b14b4dab1\\})|(\\{9d2e8731-3287-46eb-9c19-ece63fe693c7\\})|(\\{a37ccd20-e04f-4949-b055-98ca58639606\\})|(\\{af85f82c-3e8f-4ee5-ab53-b8d3aaac34ec\\})|(\\{b35c6d47-8b07-4d49-89a9-dfe8c10f58f6\\})|(\\{c2485579-368c-4593-a1cd-985b2fa0b990\\})|(\\{c85c16ba-78b4-41b3-9201-f80fa662c52f\\})|(\\{c97e5535-6f2e-4d34-a5a3-0e6e07f7fd13\\})|(\\{ce7db166-9564-482f-91d9-3a450ec3216d\\})|(\\{d64a2c73-ff21-4e3e-998f-ec2dc42ad725\\})|(\\{db6d93c3-67a0-410c-b7bd-f72f267f0cec\\})|(\\{e513775f-359f-47aa-a3d9-eddc946aabe0\\})|(\\{f70258e4-643b-4ec2-9c84-de89009eec61\\})|(\\{f8794e87-82b2-4df4-bce6-db207f62c165\\}))$/","prefs":[],"schema":1558349836861,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552847","why":"This add-on violates Mozilla's add-on policies by using a deceptive name while providing unwanted functionality. This is not a legitimate Flash Player add-on.","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0225ae55-626d-42b2-8f48-46ec95ec89f8","last_modified":1558361121954},{"guid":"jid1-HfFCNbAsKx6Aow@jetpack","prefs":[],"schema":1558343683249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549020","why":"Versions up to 2.9.1.0 of this add-on violate Mozilla\u2019s add-on policies by executing remote code through the native messaging host.","name":"SConnect"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.9.1.0","minVersion":"0"}],"id":"413065ac-176f-440d-b4a7-0f928f3e330d","last_modified":1558349549359},{"guid":"/^((\\{78d3cced-d2a7-46e9-9fea-5be7ed61eea8\\})|(\\{3233777f-a1a7-4ea4-8c2c-fba1a0a68383\\})|(\\{0eb43948-2a3d-4490-b32d-7ca37dd83f07\\})|(\\{64fd625d-2977-46a6-96ca-77f81ebfd54d\\})|(\\{6e138cae-1be3-449e-a964-b3c3060d89b9\\})|(\\{f875c255-8b92-4229-95e1-6d9adaf20dd7\\})|(\\{3c62ef7f-ae8f-4baa-9d2d-27a377480b79\\})|(\\{35a91fe5-c255-498b-9f9f-bec506fdb257\\})|(\\{7d3c52e6-2b7f-4ce8-b28b-032306fe32df\\})|(\\{0ecf6f68-d506-4239-bc69-f77de8f03758\\})|(\\{7290f2b1-3d70-4990-a828-40c775c05f82\\})|(\\{50150580-86bc-460f-ae3a-12e51b9d842e\\})|(\\{a1b46cda-8a83-48e0-b355-7eca4250694f\\})|(\\{614d8f88-b5b4-4897-adc0-0207613f4d4f\\})|(\\{ddc259e9-3738-4b18-a00c-9259dad206ae\\})|(\\{5b2bf836-5322-4161-82dd-fcc8ac6e4247\\})|(\\{97a90c0a-5e3d-47bf-aacc-230e4cb1f2d1\\}))$/","prefs":[],"schema":1558341490879,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552764","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bda902e-fb36-417b-940f-992ab7a18fde","last_modified":1558343652556},{"guid":"{3241efcf-4bfe-4405-ba7e-029d3efb03bf}","prefs":[],"schema":1558341442463,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552681","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Neat"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"657d264f-23d2-40f9-bac3-1d7c8b5d8453","last_modified":1558341473815},{"guid":"{c4da221b-461a-4ed9-b2d2-6ef1842a94bd}","prefs":[],"schema":1558341410023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552639","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Dimensions"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f48c8fe3-70c4-4d9e-84f4-79aeee9970f0","last_modified":1558341442447},{"guid":"{72a6bcef-d0ce-49f5-9773-1b78265174a2}","prefs":[],"schema":1558341352074,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1552306","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"YtDow"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d4ab989c-1517-493b-9486-f0c4a59a1c95","last_modified":1558341410006},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558341285260,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551964","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Magnif)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7135e2e-249f-45d4-bfe3-88b834ddb636","last_modified":1558341352061},{"guid":"{ad6f5b9a-c894-4d15-8c65-4b0f5a29503c}","prefs":[],"schema":1558313782700,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551903","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users consent or control.","name":"Top Scroller"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fdc0d028-2915-4130-a19c-c5819b3acc81","last_modified":1558341285245},{"guid":"websurf@mizilla.org","prefs":[],"schema":1557871049351,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550673","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Websurf"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a2b8447b-ea50-45bb-936a-64d790ebe448","last_modified":1557871228984},{"guid":"{d8f707bf-0a35-462f-8e4d-f90205770547}","prefs":[],"schema":1557870872432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550689","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"STPs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"be42b13c-301b-4304-a1ed-89b4c13d9eb2","last_modified":1557871049337},{"guid":"{0b66e692-1991-4b46-89df-c8101925bad1}","prefs":[],"schema":1557870310029,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551079","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Base6"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a308009d-3320-49af-b0b8-1174f5a25fe6","last_modified":1557870872418},{"guid":"/^((\\{198586f6-9fdc-4ce6-8f21-7bdd85eab432\\})|(\\{1cd349e4-1d52-46ec-b648-6da8ba2ef659\\})|(\\{28c26373-1066-4cb5-8e92-1926cb31f83c\\})|(\\{2b99ea1d-9e25-4005-adeb-2fc9fc6700fc\\})|(\\{2be44a2e-f432-4527-a249-f7a6aecc8464\\})|(\\{2eda700f-8674-43fd-842f-73289b6e317f\\})|(\\{3745fc58-1413-4029-aea4-e1aa8a2c0cad\\})|(\\{3c19f6fc-1b86-411c-8d9a-7fdde31600b2\\})|(\\{450f8d34-b065-46a6-bd9f-ee7f614d750b\\})|(\\{498e999a-2d6b-47e7-8da2-97e0f694f6ff\\})|(\\{56862943-b999-45ef-be94-b97211126ba4\\})|(\\{5dc4633d-2c01-4d8d-8980-a90055d0679c\\})|(\\{77101ac4-6fe7-43ed-8362-75ad2a4b3299\\})|(\\{83ae749b-9ab3-41f9-ba8a-f73470399abe\\})|(\\{8ef68e62-a602-477c-95c2-9b861f91e813\\})|(\\{b81c02f0-e563-4794-8fd3-18a65b0f35fe\\})|(\\{c03bf205-6673-4495-abd7-f12556d3d8ce\\})|(\\{d1e8be12-c4e4-481b-9be1-400f54257dfa\\})|(\\{d3f73060-8ca3-4c24-b389-6a896f43f538\\})|(\\{e5e98141-81c0-433d-ade2-4174ea951243\\})|(\\{ec6ff98f-7315-4cfb-88b9-e6a64bb97ef6\\})|(\\{ee765c0e-cf70-426e-ac5d-704c874202af\\})|(\\{f8a4dc88-e967-4c75-acb3-6176ab166bf4\\}))$/","prefs":[],"schema":1557849229557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551093","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8436c1bb-43f2-42d6-acec-05145fdbeccf","last_modified":1557870310012},{"guid":"{61121092-5257-4607-b16a-12364832f0e4}","prefs":[],"schema":1557835907235,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551260","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Page Image Previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dbd3690c-2ce4-474b-b13d-97f9ab2c54c5","last_modified":1557835935826},{"guid":"/^((\\{2e510835-3d3c-4995-ba75-2eee6ff203c7\\})|(\\{bc72fefd-ab07-40ce-8555-45f9b23ef8c0\\}))$/","prefs":[],"schema":1557835858186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551259","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9ced28d2-c4bf-4933-b369-1ded1ca7f6dc","last_modified":1557835907221},{"guid":"{4037503e-7401-4ccf-8fc1-af9f8c9fc168}","prefs":[],"schema":1557835817321,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551243","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"APKCombo"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"abc5acc2-c9ea-4d44-b8ab-3fefb5723194","last_modified":1557835858172},{"guid":"{52484281-3051-4c52-9309-83896b989ddf}","prefs":[],"schema":1557835777799,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551162","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control.","name":"Fppl"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"73b95004-eb42-428b-852b-3671edbc3913","last_modified":1557835817308},{"guid":"{3555a8e7-6fc1-4ad8-9e35-b09877d94a8c}","prefs":[],"schema":1557776499103,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1551080","why":"This add-on violates Mozilla's add-on policy by overriding search settings without user consent or control and executing remote code.","name":"Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a941e00d-4ec8-41db-ac90-75041af68a3b","last_modified":1557835777786},{"guid":"/^((\\{da61a3e5-5a98-4c47-ae6c-f4db738f1133\\})|(\\{b0e13c2b-c1cd-426b-bed9-905bf9557fbf\\})|(\\{328c22c5-5f1c-4eb7-95a3-148fd4ad429d\\})|(\\{f6cca5fb-5aa1-471f-88f3-e2ffa87281ef\\})|(\\{d342bf37-554e-41c9-b67b-72769e59b82b\\})|(\\{03ec69b5-3e8e-4bb8-8eda-28f12c54bff8\\})|(\\{a8c876cb-af13-4ad9-9a86-fc3c0722b48c\\})|(\\{56136c32-0159-4368-9d28-c1b8b1515c89\\})|(\\{79bf4660-9729-444b-ae03-6c8005869611\\})|(\\{aa7fdaa5-d888-47e2-b27b-4fa4b3225339\\})|(\\{31e0d180-52b1-4c1d-8f84-7e625715edc4\\})|(\\{f7d20549-e5ee-4045-9e8f-9705bb10c104\\})|(\\{303abacb-760b-43c3-9640-5b456d92db78\\})|(\\{debabd67-2e0a-485e-8213-ac081065a027\\})|(\\{971e739b-c528-41b6-a60c-48fc3cdb52d9\\})|(\\{ffb3a485-2723-4a88-b3ad-8b29773759c4\\})|(\\{b076177a-a5c4-4652-9f6d-953f89f9a81a\\})|(\\{66210cb7-6352-45d5-9d22-ad7a0fb5e247\\})|(\\{8053ad7b-5129-4c74-ade9-8166c38e8636\\})|(\\{1a435c36-133e-4163-ac71-8701a147880c\\})|(\\{8c40c6df-7c9d-4876-bcbe-0621734aba45\\})|(\\{40e1e7d9-ae29-4aec-9465-5e0d49859583\\})|(\\{74eab03b-35cd-4950-b436-7afce3876e58\\})|(\\{95839c11-63a7-4b2b-b3d3-eee9d2c5c42d\\})|(\\{bfaa03c3-744e-48eb-8fb6-4ad61791d4d8\\})|(\\{f123e726-9396-4899-822a-172b8bcb2c5f\\})|(\\{157e255b-2053-4140-b95c-ff003b62bf17\\})|(\\{3e49a17b-b58e-417b-9ebb-a7e8c2317893\\})|(\\{4df1d536-e30f-4344-bee6-6ef2def890c2\\})|(\\{f33ce070-63f4-4d2b-823e-d52fc7a30ba7\\})|(\\{2003e2a5-e848-4fc5-8e7d-3af1efe4f992\\})|(\\{ff2157da-6981-40b6-aa60-d8125e73868e\\})|(\\{d89fa1e5-c9d4-4104-ad8e-00b39e5c6d15\\})|(\\{66e45d14-550f-4489-98c6-8a0caed33375\\})|(\\{86e6d45f-1dfe-4e53-bf52-22bf65b9ae6d\\})|(\\{e71407fe-e1ed-4755-af8f-dd64a952ce1a\\})|(\\{b67b3615-d8fe-4961-a41e-391864afde2d\\})|(\\{5785789b-ccba-44a1-9018-1135b56bd37f\\})|(\\{6dfb93d1-2add-471c-bbbc-b6164b4c1d94\\}))$/","prefs":[],"schema":1557495790401,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550581","why":"I\u2019ve reviewed the add-on and confirmed that it is collecting ancillary user data, violating our policies.","name":"Adobe Flash Players"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fee4b92e-146b-437d-9cc0-95cfc800f0e0","last_modified":1557497630665},{"guid":"jid1-NIfFY2CA8fy1tg@jetpack","prefs":[],"schema":1557437285372,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock for Firefox to resolve this issue.","name":"Adblock for Firefox ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.28.0","minVersion":"3.19.0"}],"id":"8ff19ad3-e4e0-40e3-8f02-fd80d18f63b5","last_modified":1557437486195},{"guid":"{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}","prefs":[],"schema":1557437276676,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of Adblock Plus to resolve this issue.","name":"Adblock Plus ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.5.1","minVersion":"3.2"}],"id":"f0fc8d21-d0ec-4285-82d7-d482dae772bc","last_modified":1557437285359},{"guid":"{2b10c1c8-a11f-4bad-fe9c-1c11e82cac42}","prefs":[],"schema":1557437241208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547789","why":"The $rewrite filter functionality allows for remote script injection under certain conditions. Please upgrade to the latest version of \u00b5Block to resolve this issue.","name":"\u00b5Block ($rewrite filter)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.9.5.14","minVersion":"0.9.5.11"}],"id":"12a0c69f-e755-428b-97dc-229bccb8a5b0","last_modified":1557437276663},{"guid":"/^((\\{4e84c504-10e8-4e75-8885-dcc0c90999b9\\})|(\\{8ce99d6d-8d0d-4420-bd17-c303bd8a763e\\})|(\\{16de314a-56cd-4175-9baf-bbe0b09dfed3\\}))$/","prefs":[],"schema":1557434135180,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549744","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Secure Privacy + Trustnave + Fastwebnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04a300c2-04fc-401e-a428-c7c887bf2bff","last_modified":1557434278943},{"guid":"{5308dcd8-f3c7-4b85-ad66-54a120243594}","prefs":[],"schema":1557433916783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550428","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"F_Feed"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"312e30b0-0b4c-4a43-8f6c-8b8447a20f6a","last_modified":1557434135166},{"guid":"/^((\\{c8d0fea0-d7b7-4f6f-b9bc-9df6722d9d18\\})|(\\{bed8e1f2-b00b-44e3-8cf0-5335080d0003\\}))$/","prefs":[],"schema":1557433212304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1550435","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Webplus+Fastnav"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b9686c72-1902-4868-88d1-6587fd24a57c","last_modified":1557433916770},{"guid":"/^((\\{d389cdfe-843e-44cb-b127-441492e46e63\\})|(\\{1340c760-3f4c-4428-b2c0-88821a84de2b\\})|(\\{38524a16-a73d-4a8f-8111-f9347bb5266c\\}))$/","prefs":[],"schema":1557258104673,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549740","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Add-ons executing remote code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2feeb46a-6784-4c6e-8c07-e120bec00b14","last_modified":1557394160484},{"guid":"/^((adsmin@vietbacsecurity\\.com)|(\\{efdefbd4-5c30-42c3-ad2b-4c49082ec4cd\\})|(\\{63d83b36-a85c-4b51-8f68-8eb6c0ea6922\\})|(\\{4613a1ed-6cb1-410b-a8b1-3f81f73b6e00\\})|(\\{90b1aef7-7a52-4649-b5ca-91b5e81b5eab\\})|(\\{d6e2e76d-edff-416b-8c04-53052ff9fec7\\})|(\\{43af2e0f-b5ce-409b-9ee6-5360785c9b08\\})|(\\{e45fa96d-8b74-4666-86de-3bbfb774a74f\\})|(\\{4f8332b6-6167-4b7f-a1f9-61d8eb89b102\\})|(cpcnbnofbhmpimepokdpmoomejafefhb@chrome-store-foxified-14654081)|(developios89@gmail\\.com)|(\\{d82da356-1fa8-4550-958a-bd2472972314\\})|(\\{1dfbd1c3-a8ca-4eb3-8747-d30bfd20ecd5\\})|(\\{6f9fa22a-128f-4d1b-8ef5-d20a44d24245\\})|(\\{5f6af572-35c1-44d7-9d0f-dffbb62fcafe\\})|(developper@avast\\.com)|(\\{886a6486-37b3-4bcd-891b-fd0e335e7b1a\\})|(\\{886a6486-37b3-4bcd-891b-fd0e355e7b1a\\})|(\\{d1cd26ff-fde7-46a4-85cc-48e3bb7e9e8d\\})|(\\{ae11d5cc-8efb-43a0-89bf-e5a779b4fa40\\})|(\\{aca140ce-8249-4e6e-8e2c-cd5b1c987441\\})|(\\{f68b2ca7-0d2c-44cc-afc8-a606a896c467\\})|(\\{321db3c3-8cfd-49f1-99de-fcdc3485b379\\}))$/","prefs":[],"schema":1557222463147,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549558","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"More Keyloggers"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b62c9ee1-d66f-4964-906e-2a9b07e3fdc1","last_modified":1557222511299},{"guid":"artur.dubovoy@gmail.com","prefs":[],"schema":1557162612874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549444","why":"This add-on violates Mozilla's policies by executing remote code.","name":"Flash Video Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"16.3.9","minVersion":"16.3.5"}],"id":"d7ca07b4-9c97-4f49-a304-117c874ff073","last_modified":1557162636319},{"guid":"{93d460ee-879f-4d8f-8599-a1c69ed59ec2}","prefs":[],"schema":1556912498785,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1549069","why":"This add-on violates Mozilla\u2019s add-on policies by collecting ancillary user data.","name":"Browser Security &Adblock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"95cfb43b-72c3-4fb3-a0f2-fc975aff398d","last_modified":1556977392946},{"guid":"{fc4c96b2-4eaa-4221-86a6-392dc1eb919a}","prefs":[],"schema":1556797012258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548536","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"AspectResolver"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3f6acc8a-f46c-42cb-8220-48c2e5885bd3","last_modified":1556808070195},{"guid":"/^((premium-enhancer@ext\\.com)|(notif-rm-unlisted@ext\\.com)|(search-updater@ext\\.com)|(updt-lite-unlisted@ext\\.com)|(coldsearch@ext\\.com)|(reader@ext\\.com)|(local@ext\\.com)|(fptool@ext\\.com)|(gflash@ext\\.com)|(advplayer@ext\\.com)|(yfp@ext\\.com)|(ytbenhancer@ext\\.com)|(yoump@ext\\.com)|(floating@ext\\.com)|(ytbhelper@ext\\.com))$/","prefs":[],"schema":1556792823258,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547311","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"Various fake player/search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9efe3274-2bd2-44a3-aa7f-92934581470b","last_modified":1556794746654},{"guid":"{a38141d9-ef67-4d4b-a9da-e3e4d0b7ba6a}","prefs":[],"schema":1556787949626,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548473","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"ReStyle"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b0ff609b-c98e-4d29-8323-61c3e064ec9c","last_modified":1556791242742},{"guid":"{0beedf0b-dc79-48bd-adff-2ed36acdb806}","prefs":[],"schema":1556787897696,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547930","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"71475499-ca6f-4b71-8bef-2b95cf59ee30","last_modified":1556787931409},{"guid":"{c11adb01-56bc-44d6-ac05-6f364e2afe01}","prefs":[],"schema":1556787838618,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547934","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e6371474-8681-4498-8e89-421f25fd2e12","last_modified":1556787897686},{"guid":"{a1f6fa05-26cd-4399-a97a-7996067d04b0}","prefs":[],"schema":1556739699995,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1548134","why":"This add-on violates Mozilla's add-on policies by changing search behavior without users consent or control.","name":"TC"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3659d4a2-3121-45cd-b8b6-5b2c96ebc17f","last_modified":1556787838607},{"guid":"{c65b18e1-cd3d-4773-a901-15a0753e7d81}","prefs":[],"schema":1556224830338,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546994","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"PrincipalInterceptor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"af62a050-b136-4d56-ab3a-af85a2510bc4","last_modified":1556224874229},{"guid":"{4bf110f8-5f50-4a35-b7fa-64228bfa2d0b}","prefs":[],"schema":1556224790813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547048","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Predicate Property"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5968da82-1d7e-407e-bf93-5d2247ce55c1","last_modified":1556224830329},{"guid":"{0bd4e0af-664d-4273-a670-7cb3d0b5a4a5}","prefs":[],"schema":1556224295744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1547046","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"ConsumerWatcher"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a6cc6fb-dce1-49cd-b624-7b44afacf157","last_modified":1556224790803},{"guid":"{bbddf452-1a72-4a5d-a833-0416ac7fd76f}","prefs":[],"schema":1556197615318,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546989","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"AV Scanner (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"20c25379-aed8-4ab4-9e7f-f2d3f5d948a7","last_modified":1556206274610},{"guid":"/^((\\{1601769e-0b0d-4c43-97a7-723ce374996b\\})|(\\{d714118b-5cdd-4829-9299-1066fecc0867\\})|(\\{e8671db6-24be-4744-808c-a63fb744ccca\\}))$/","prefs":[],"schema":1556133515829,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545834","why":"This add-on violates Mozilla\u2019s add-on policies by overriding search behavior without user consent or control.","name":"XPC and Tabs"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1b536121-fd82-4639-bc70-30d7060e42d3","last_modified":1556133806451},{"guid":"{3f5f741d-a980-4b58-8552-b1ae328841f4}","prefs":[],"schema":1556099103820,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1546480","why":"This add-on violates Mozilla's add-on policy by intentionally weakening website security and adding fraudulent content to web pages.","name":"Google Translate (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ae288e5e-78d5-4b49-8b4d-fa9f25c3baa2","last_modified":1556112119390},{"guid":"{3fab603e-3ee1-1222-a859-5f85a3441216}","prefs":[],"schema":1555527937277,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1545213","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user consent or control.","name":"Add security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"74ad8c8b-a65a-470c-aa2f-ca14e1e8774d","last_modified":1555528639011},{"guid":"/^((\\{880cacfe-5793-4346-89ce-fbbd368d394c\\})|(\\{f0780038-50b9-11e9-9c72-4ba2d8f2ec9f\\})|(\\{22ffe411-2b0e-11e9-87f9-c329f1f9c8d2\\})|(\\{cf4bae43-026f-4e7e-a85a-952a7ca697a1\\})|(\\{17052516-09be-11e9-a008-03419f6c8bc6\\})|(\\{333fb3de-18a8-18e8-b6d3-e73213911efb\\})|(\\{aa4abac2-1ffa-12aa-bbdd-9305cb2c1254\\})|(\\{72222e70-2fd6-11e9-956b-27f7787b8d2d\\})|(\\{637212d8-3484-11e9-9812-005056b22b42\\})|(\\{4a222e60-31de-1eca-8476-37565daf6afb\\})|(\\{7fc6d222-48d5-11e9-b586-17e94c73a1b1\\})|(\\{e111c358-121b-13fa-bf23-bb57da32d184\\})|(\\{9674445c-8dff-4580-96b2-99442a7ae9af\\}))$/","prefs":[],"schema":1555525532852,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544315","why":"This add-on violates Mozilla's add-on policy by executing remote code.","name":"Various"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbd7444f-e62a-4639-b172-845548b6d4a7","last_modified":1555527929174},{"guid":"{674fff65-6cd0-488a-9453-fb91fc3d7397}","prefs":[],"schema":1555406446874,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543924","why":"This add-on violates Mozilla\u2019s add-on policies by executing remote code.","name":"Assistant"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8aff4cb0-4d5f-4e74-8db7-b04f616c3b60","last_modified":1555503879816},{"guid":"{40cd7fd2-a3e4-43f9-9d86-0e0a70376203}","prefs":[],"schema":1555184501005,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544268","why":"This add-on maliciously injects remote code for execution.","name":"Scan Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"881d3476-f18a-4560-b065-cded406783d2","last_modified":1555228377222},{"guid":"{8ee8602c-aba6-4e2a-9faa-1724c3f4f9ba}","prefs":[],"schema":1555102738661,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544205","why":"The add-on is  maliciously loading remote code for execution.","name":"Service Proccesor"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"94621e2f-28a0-4b18-97c6-5f6203f5912e","last_modified":1555161086175},{"guid":"{d8b03707-e39f-4b17-8e56-56354fb14af5}","prefs":[],"schema":1555100104657,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1544103","why":"This add-on maliciously injects scripts, violating our policies.","name":"Interruptible Observer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3a921aa8-d44a-4272-be63-0fd102577f59","last_modified":1555100575898},{"guid":"{132cb2fd-a6ae-45d2-84cf-b48d591f037d}","prefs":[],"schema":1555099951278,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543922","why":"This add-on injects remote scripts and overrides search behavior without user consent or control. It also masks as an add-on with a different purpose.","name":"Player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"371796e4-387a-4dd0-9ddc-47ba1dd85be7","last_modified":1555100104648},{"guid":"H.264.Addon.Test@firefox.com","prefs":[],"schema":1555099832659,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543919","why":"This add-on exfiltrates user data without consent or control and may be misleading the user into believing this is an add-on by Firefox.","name":"H.264 Video Codec Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53ef1aad-7bdb-4f4e-8d46-55d6ec2d78ab","last_modified":1555099951269},{"guid":"{608f71eb-5bd6-45d8-bc93-b9e812cf17b7}","prefs":[],"schema":1555099501294,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543801","why":"This add-on maliciously injects remote scripts, violating our policies.","name":"Consumer Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ea00841e-8dc2-4e11-9119-7a599e47d800","last_modified":1555099832650},{"guid":"/^((\\{8220ccaf-15a4-4f47-a670-a4119a4296a4\\})|(\\{9da72c11-44d7-423c-b19c-c75cd6188c3e\\})|(\\{99d0e4d0-c5ef-4567-b74c-80c5ed21ad99\\}))$/","prefs":[],"schema":1555011689511,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543848","why":"This add-on violates Mozilla's add-on policy by overriding search behavior without user's consent or control.","name":"Search overriding add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03554696-58fe-4b90-89d1-72b72f88f82e","last_modified":1555069748234},{"guid":"/^((\\{b37f383f-e60f-4eb1-ac0f-9147e0e8f2f7\\})|(\\{8ad567d2-3fe2-446b-bce9-a3acbe878dba\\}))$/","prefs":[],"schema":1554997740201,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543673","why":"These add-ons are overriding search behavior without user's consent or control.","name":"Hash"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"036e2e7d-5403-49be-92cf-b5187ceef7ec","last_modified":1554997910212},{"guid":"{be6ab6a9-7004-4c5c-8df9-8d36122d8b14}","prefs":[],"schema":1554997613727,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543705","why":"This add-on injects remote scripts with malicious intent.","name":"asin"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6fd3ab94-8e38-47f3-b129-3ca8396d0a22","last_modified":1554997740187},{"guid":"/^((\\{61f433aa-45fd-42a9-9c90-c1d7820661d5\\})|(\\{86cd46b6-433a-439c-bff2-722846709f44\\})|(\\{98e126a4-4e70-4300-b893-3b2cca19bc9b\\})|(\\{8f42dc3a-1c46-4fc2-8c7f-dd76a63b1cf7\\})|(\\{a24d3582-2fc2-475c-8440-335736e17c6e\\})|(\\{cf0b5280-cd08-465d-ad7d-70308538f30a\\})|(\\{936f3c79-5dc9-4694-bca8-47932de3357a\\})|(\\{e48d5888-8736-4858-83ba-e816378ffef8\\})|(\\{5305f89c-ceec-4217-8bae-c9c376c7462b\\})|(\\{a2ac47e5-d225-4718-9b57-18a932f87610\\})|(\\{79f60f07-6aee-42cd-9105-c0a52f401316\\}))$/","prefs":[],"schema":1554981266268,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543664","why":"These add-ons exfiltrate user data while masking as a legit add-on.","name":"Adobe Flash Player Fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fc38e782-d55b-4fb7-8f9c-374aa18af09c","last_modified":1554997613713},{"guid":"/^((\\{0913599d-3094-44a7-8cc2-b8467d5afc7c\\})|(\\{7bee7f1b-d8ad-424d-807d-e69e6634988e\\}))$/","prefs":[],"schema":1554898779160,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543462","why":"This add-on violates Mozilla's policies by exfiltrating user data without their consent or control.","name":"Malware exfiltrating user data"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0d86ba71-7baa-4cb3-b3b8-da4ccdfa36b9","last_modified":1554976164809},{"guid":"/^((\\{9946bf2f-0aef-4040-bc57-cdae2bde196a\\})|(\\{d511784e-d088-4fce-b77c-14c186f08641\\})|(\\{fe59312a-97bd-4ca7-bce3-b0db95b1e251\\}))$/","prefs":[],"schema":1554897771015,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543118","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"Invert (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed01b7e5-73d1-42a6-9fc8-af2d83879854","last_modified":1554898652923},{"guid":"{c75432cb-980d-4e64-98c8-d7947b382a2c}","prefs":[],"schema":1554897109129,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543255","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Concrete Tech"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7fd0eb9c-9f6c-40ea-ba39-645cafb1d5a0","last_modified":1554897390260},{"guid":"/^((\\{6a99a9ec-f149-4ad3-b644-15e44290d00c\\})|(\\{cd9d1582-13dc-4ce1-9c83-4aaa31c6bc36\\})|(\\{3414a827-ee54-4331-85eb-736a824bb7e0\\}))$/","prefs":[],"schema":1554896836686,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543181","why":"This add-on violates Mozilla's add-on policies by overriding search behavior without users' consent or control.","name":"Drag (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4f0ac78-ba85-4b5a-9d1f-f3f2c6ae4f7c","last_modified":1554897104624},{"guid":"/^((\\{4b6e66db-ee0b-4fc3-abe6-b97cb4798faf\\})|(\\{8aff5f41-86f8-40f1-896d-954eae7fb670\\}))$/","prefs":[],"schema":1554817097951,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543049","why":"Search hijacking","name":"Fit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8a7efe6b-8670-4714-b4b2-08ce5f202ee7","last_modified":1554818136441},{"guid":"{81425b21-cc8c-42d0-98e8-69844bcb7404}","prefs":[],"schema":1554811583185,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543048","why":"Remote Script Injection","name":"Tech Chip"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dafcc63d-37e0-42e2-b439-59727cf9de48","last_modified":1554811754967},{"guid":"{d85aa6ef-639b-43a1-8560-ddeb59935d10}","prefs":[],"schema":1554803024628,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1543047","why":"Remote Script Injection","name":"BatchSerialize"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"204b7b05-d8e1-4de3-86f9-fcf95edb40c0","last_modified":1554811583171},{"guid":"/^((\\{bf163ed1-e9f9-4c98-ae4b-8391133472d1\\})|(\\{ec283482-2d66-49b2-9dc5-0d03bcbffe65\\})|(\\{0a19856e-4168-4765-a8ab-a3a34fa88ec1\\})|(\\{e2019dd1-4591-42e2-864a-535a99972b1a\\})|(\\{88a65f0c-f952-41f0-8868-f22fa12597b3\\}))$/","prefs":[],"schema":1554754247858,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"More Flash Player Clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ddd97fae-7040-4758-811f-1dd53116e6ab","last_modified":1554755273775},{"guid":"/^((\\{743fc0de-1085-4078-8611-848024989608\\})|(\\{02acc043-f402-4e48-aa15-56ee1364e17c\\})|(\\{1b7892ab-6dbe-49d1-9c71-bbb70458c830\\})|(\\{25b3b5bc-b77a-49d1-ab56-c0e760fe02ff\\})|(\\{2c78aa89-8cdd-4a96-821a-e35628aea2fb\\})|(\\{2f154b99-05c2-4629-b687-f2aa031d9f65\\})|(\\{36df6f78-16c4-42c2-a6b8-9210a2953739\\})|(\\{40ada62f-72a8-46b7-8e50-4153f660ce34\\})|(\\{49f58462-fc24-472c-b85a-4a3dbbf48741\\})|(\\{4a8cb3fd-0400-47b3-a799-9f2964229bfa\\})|(\\{5429f6da-d7fe-4f1b-a85e-6dc721ec0037\\})|(\\{74480b2f-1198-45b3-86b3-ca0778482216\\})|(\\{777f1169-a824-459d-8a2d-ca2ffaf59424\\})|(\\{81e610be-656a-4a71-866d-dd94b5096c60\\})|(\\{81ee3e70-b6e4-44d0-b5c2-94ded26bb5ac\\})|(\\{881c71c1-6800-4e8b-89de-0d14ef67d588\\})|(\\{9b5d7f59-be9c-4f1e-bf0c-31f085c17726\\})|(\\{9eff0ead-25a4-429c-b4b2-280ba3c6f2d9\\})|(\\{ad1b7e87-e260-4aee-a602-ef234743443e\\})|(\\{b54a530a-cacc-4c76-a7c3-feafd4ce0b13\\})|(\\{bd0d7634-770e-4d9f-8309-d264a5fbbfa9\\})|(\\{bdf16cc8-3da6-4317-a1eb-2ab8adce6b66\\})|(\\{bf484a7f-49fd-4681-afa5-8a063d010a14\\})|(\\{c7cf6d86-207b-4231-a96a-bbfdc9fe59aa\\})|(\\{d33f83c2-dbc6-41d2-a8b9-28fdaa96985e\\})|(\\{d71757ee-edc7-44d5-b536-cb0370d7d9f6\\})|(\\{daf86db4-7dd4-47d4-a1d1-7c31f6b9bbe3\\})|(\\{e27060a0-5fb5-4844-b446-d2655d7681fa\\})|(\\{fae0d133-05dd-44e6-88e1-e218ca2b2caf\\})|(\\{fbf69005-55d8-4360-a562-255a8c285fea\\})|(\\{fd6d1b53-89f5-4d91-9234-fb3e1b067c1b\\}))$/","prefs":[],"schema":1554753973658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540998","why":"Exfiltrating user data to a remote site while masking as a different add-on","name":"Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e12a97c7-2c83-4e1c-a2c3-66a653bc6048","last_modified":1554754247845},{"guid":"{ea173fdc-f27a-482a-8a0a-61fd1aa2ee2e}","prefs":[],"schema":1554744706554,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541005","why":"Masks as a legit add-on and includes a remote script that is against our policies","name":"InterpreterInvocation"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8742ec6a-2e51-4e94-bc6a-653dac08521b","last_modified":1554753973644},{"guid":"{16768af9-4120-4566-95cf-c4234effa084}","prefs":[],"schema":1554733900697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540999","why":"This add-on changes the search settings in a way that is not allowed per our policies","name":"Unknown search hijacking add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fb0ed8e-6e5d-489e-8c9d-b6f48705a742","last_modified":1554736392840},{"guid":"{35b9640e-ebbb-44b7-85af-d9ec3af3c6a6}","prefs":[],"schema":1554730607333,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540690","why":"Malicious remote script injection","name":"Patagonia Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0eb3a151-ca6b-4dbb-81b3-c10635660c84","last_modified":1554733900683},{"guid":"{d574e1f8-537d-4b6c-97bb-9f7a138f4d67}","prefs":[],"schema":1554728269766,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540686","why":"Injects remote scripts and masks as a different add-on","name":"DistributedConsumer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a158055b-3387-4961-a4a3-a820d9299e15","last_modified":1554730607318},{"guid":"one-search@mozzilla.xpi","prefs":[],"schema":1554666099983,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1542208","why":"The add-on violates Mozilla's add-on policies by overriding search behavior without user consent or control.","name":"One Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1344c583-9593-412f-a565-c6cc96a07c28","last_modified":1554718843138},{"guid":"/^((\\{00b4b65b-79d9-4e92-bc1e-2b926918b91c\\})|(\\{0cb66591-e935-47e4-95c2-3063786f6555\\})|(\\{6cf25884-f86d-4a4e-a924-d95282ce5b71\\})|(\\{22cce9c6-a1de-457f-8938-c981b976b6f4\\})|(\\{89d99d4c-e7c4-4601-91a8-216e597a826b\\})|(\\{998d3ac7-b475-410e-ad3d-2eeb526c1853\\})|(\\{9423e8df-6200-45c0-877a-479c46e91b30\\})|(\\{64937e0b-6e00-4d5f-bf19-190d6614aae2\\})|(\\{91507dc4-c005-4534-80af-d8fbdeac29ed\\})|(\\{a2247e60-7b89-4857-a2fa-0eaee1cad460\\})|(\\{c9c28751-5865-449f-8e45-b3363edf9fb7\\})|(\\{cdfd004f-cddc-4ad7-8e2d-a58457e42b1f\\})|(\\{d3e7f35d-7d9f-4d38-9a2b-1581f6b3e870\\})|(\\{df574ffe-cce0-42db-857b-627cb164a4d4\\})|(\\{e06afe6e-ed52-40f8-82bf-d070a37387fb\\})|(\\{e7e7fb96-cfab-4a5b-85fe-20f621e1bc2e\\})|(\\{e12e5afd-bd1e-43c6-9288-321dc485cb1c\\})|(\\{e92d8545-0396-4808-96de-830c61c0d1b3\\})|(\\{e883b012-1987-4f37-8053-02e59e20c242\\})|(\\{ed3386c6-76c6-4786-a37b-9816d5f2a260\\}))$/","prefs":[],"schema":1554462951082,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541662","why":"These add-ons violate Mozilla's add-on policies by overriding search preferences without user control or consent.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1c376fe-20c5-4da3-9126-3fe95b874dce","last_modified":1554463075420},{"guid":"/^((\\{6ab41e83-2a91-4c2a-babb-86107a1d1f75\\})|(\\{d84a9d0d-7a31-459e-b45a-2ad111884d1f\\}))$/","prefs":[],"schema":1554293659259,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1541405","why":"This add-on violates Mozilla's add-on policies by overriding search settings without user control or notice.","name":"PopWin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"04b2954e-4f83-4557-968e-2139a277bf1c","last_modified":1554301860877},{"guid":"/^((@searchlock-staging-automation)|(@searchlock-automation)|(@searchlock-fx)|(@searchlock-staging)|(jid1-vRJA7N8VwBoiXw@jetpack))$/","prefs":[],"schema":1554293340413,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540868","why":"This add-on violates Mozilla's add-on policies by executing remote code and overriding search preferences.","name":"SearchLock"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aacb25e1-71c5-4bee-ad16-e39e732210ba","last_modified":1554293606641},{"guid":"{03dfffe0-509f-11e9-aa00-e7e13d49f3de}","prefs":[],"schema":1554290590697,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540113","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Addon (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9c75fe89-7011-47ad-b213-57f5a81a4c89","last_modified":1554290693618},{"guid":"{e555c358-121b-13fa-bf23-bb57da32d184}","prefs":[],"schema":1554290541557,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540111","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1809ea7a-8155-4ae7-8c83-ee7c749d30f5","last_modified":1554290590689},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e1}","prefs":[],"schema":1554147700324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539514","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Security (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b4e4e75-cc96-4ca9-aa9f-6a2d2f6cd96a","last_modified":1554290541548},{"guid":"{a3f765c3-8dde-4467-ad6e-fd70c3333e50}","prefs":[],"schema":1554119395186,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538143","why":"Remote script injection","name":"Angelic Bit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"93dc42cc-4ff3-460d-a8f2-12f1d947b530","last_modified":1554119427564},{"guid":"{91f77263-866e-4acb-a569-f66ac47889f8}","prefs":[],"schema":1553974898434,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539226","why":"Remote script injection","name":"Bit Apex"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c528f48a-9b2c-48ca-8b4a-eac442cc0bd0","last_modified":1554119395177},{"guid":"{2256fabf-19f1-4e12-9951-5d126dd9e928}","prefs":[],"schema":1553899022464,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540086","why":"Search hijacking","name":"Twit"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7c705f73-9d1d-4ee9-ad11-347d18729adb","last_modified":1553900528324},{"guid":"/^((\\{00f77164-eca9-4353-916d-8ea493a54c8d\\})|(\\{0716b2a5-8181-45b8-b675-915e38903761\\})|(\\{26124967-7e32-4577-b998-7296c68d3eb9\\})|(\\{273052bc-fc67-4fc1-a6fd-e62acc3ddad1\\})|(\\{4b5f53ac-36ac-4018-80cb-f1106f60ef96\\})|(\\{61065f61-51aa-462c-aca0-f1addbfa202b\\})|(\\{63383006-d617-4a00-9ca7-30a6864782ee\\})|(\\{7629c987-59ea-4e2f-bcde-b55646ecd268\\})|(\\{78e8c8fa-32ce-432b-9a40-b615bff7cd96\\})|(\\{8e9c05df-e0f5-479f-abb9-858650cb471e\\})|(\\{947f1ac0-09f2-4016-a345-dad0d2ee8f57\\})|(\\{9b9f8124-47bc-4699-8557-45573995b0af\\})|(\\{ab159932-d1dd-4d16-9332-8302a01e0ced\\})|(\\{b7340504-f6ba-43cb-8bd6-5ead88d29898\\})|(\\{bcb9265f-20fd-4311-a33f-212c2d08043a\\})|(\\{f8701822-2814-4d5d-af01-cf7fde4fd510\\}))$/","prefs":[],"schema":1553898687988,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Data exfiltration, is not actually a flash player","name":"Adobe Flash Player fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"64fc6369-b504-4920-abab-f2cf3cc5424a","last_modified":1553899022456},{"guid":"/^((\\{7dd03112-82a0-4c82-9957-117dedaac14a\\})|(\\{59fd3cac-1a4d-4f0f-a129-c241b203eb51\\}))$/","prefs":[],"schema":1553897736388,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540287","why":"Search hijacking","name":"Song"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b32b14f5-0024-48fb-a4b6-1496add1dac0","last_modified":1553898687980},{"guid":"/^((\\{70c2cef0-6cc6-41b8-ad6b-bbd11182a101\\})|(\\{a0366612-376e-47e3-b5fa-b805c7176088\\}))$/","prefs":[],"schema":1553810805293,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1540055","why":"Search hijacking, masking as legit add-on","name":"Pix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d78262b0-ecfc-475e-9759-f7319451cb43","last_modified":1553847044919},{"guid":"/^((\\{10f1b84d-79ca-41d0-97f6-abb53cec0765\\})|(\\{7891c029-0071-4534-b7f0-7288f14ee0ad\\}))$/","prefs":[],"schema":1553810612956,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538476","why":"Remote script injection, search hijacking","name":"FX"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"50197dbd-71bc-492f-a0f1-6658ec454df4","last_modified":1553810696456},{"guid":"/^((\\{058769c7-784e-47a9-a2c4-dfd81bbf6c8c\\})|(\\{2a58598a-f951-4fb0-af2b-12fb7482bf33\\}))$/","prefs":[],"schema":1553810234714,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1539910","why":"Keylogger","name":"Fake adobe flash player"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e1355888-e1cd-4d21-9652-c3000662ed88","last_modified":1553810612947},{"guid":"/^((\\{54c7e57f-8ef0-48d5-92a0-6e95d193a12c\\})|(\\{32d262da-e3cd-4300-aa0b-c284eb4e17bf\\}))$/","prefs":[],"schema":1553802101395,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538536","why":"Search hijacking, masking as legit add-on","name":"TxP"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fa6c7cdb-e477-4478-8dd4-3e1106be6aa3","last_modified":1553810234705},{"guid":"/^((\\{36261798-4c2a-4206-89cc-6c28932b2e98\\})|(\\{b2b9bb64-78d5-43ca-b0cf-a9ee8460521b\\}))$/","prefs":[],"schema":1553616425198,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538234","why":"Clone of Feedbro with added remote scripts and search hijacking","name":"Feedbro Fake"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e00b2639-8a4f-427a-80d8-7c4937c58f31","last_modified":1553620435398},{"guid":"new-tab-search@mozzilla.xpi","prefs":[],"schema":1553616311575,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538500","why":"Search hijacking","name":"New Tab Search"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a4dca16a-9fa1-4b55-899c-0f8d5eda1a57","last_modified":1553616386570},{"guid":"{a9c33302-4c97-11e9-9a9d-af400df725e3}","prefs":[],"schema":1553616259023,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538141","why":"remote code execution","name":"Fake Security add-on"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0c09f067-6e5f-4ee0-9040-08b4297ebe02","last_modified":1553616311567},{"guid":"{7ab5c514-4ebe-22e9-a925-9b7c7317c373}","prefs":[],"schema":1553548654429,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538266","why":"remote code injection","name":"Eval"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a1f04f09-f4d5-4875-b4b1-a2c772178e8e","last_modified":1553616158755},{"guid":"{bc919484-f20e-48e2-a7c8-6642e111abce}","prefs":[],"schema":1553519202849,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1538962","why":"Inserting monetization iframes and masking as a legit add-on. Contains patterns for known malicious add-ons.","name":"Pinterest Save Button clone"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7abbecfb-5512-47d1-ba9b-96d6a61b85ee","last_modified":1553548325261},{"guid":"/^((\\{157cd8f9-48f0-43a1-9bcf-c4316753e087\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e086\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e088\\}))$/","prefs":[],"schema":1553186907495,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1537895","why":"This add-on violates Mozilla's add-on policies by overriding search settings.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e263fbec-7155-442f-aa82-cdf218f9e3d7","last_modified":1553193746700},{"guid":"/^((\\{1c94bc8a-3ac1-12e1-aae7-0b314772229c\\})|(\\{8a22255c-4737-11e9-a86b-0bb66337cb31\\})|(\\{3fab603e-3ee1-1222-a859-5f85a3441216\\}))$/","prefs":[],"schema":1553166786114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535655","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"'Security' add-ons (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6cf1b676-f0b8-4fea-8a5f-64957650dc2e","last_modified":1553172061896},{"guid":"{28ac81f1-b04d-448f-94be-1b8cc8fbd58d}","prefs":[],"schema":1553079961735,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536513","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"UtilsBridge (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f60b3eec-b8b8-4bd7-8d2b-3f7912c3451f","last_modified":1553080348264},{"guid":"/^((\\{9332d73d-7991-46bf-8b67-6db1a21f0167\\})|(\\{b33715d3-eff8-4186-a252-0af5094b8644\\})|(\\{eb7aff78-6145-4a31-a7f5-f3c353ddb312\\})|(\\{6c5cd693-2919-4458-b776-2ac5b6ab1cb0\\})|(\\{daacefee-aaba-4f10-8d4d-059904d8a153\\})|(\\{94d8d504-838c-4392-9971-cd2f6e21ca21\\})|(\\{6574bb31-c971-454f-b08c-a75bfee00855\\})|(\\{1688ecb0-e382-481f-8c70-541d70bdd2e9\\})|(\\{f7b9f777-7b01-4f73-8eb8-f2ad85d4da1c\\})|(\\{598d7ac6-1789-4573-ae6a-5798ed7f6d83\\})|(\\{c0eb4d03-d18e-40bf-b21b-8237ee1bed76\\})|(\\{d0513185-1f20-4045-a232-f3a4252af379\\})|(\\{9ae8269f-eea1-4097-87fd-b7d2f102184d\\})|(\\{5683f95b-2517-4ca7-9d19-83d7f309b62a\\})|(\\{013d3691-0dd6-471b-bf0d-2750d7406a22\\})|(\\{ae73a262-1a27-4d1d-9be7-4b41a84dfd23\\})|(\\{1d92fc5d-5353-401f-8c5f-373b3b6dae67\\})|(\\{e8a81b54-3728-4a9c-8c63-18ef803ef9be\\})|(\\{d604961b-3a3d-4f60-87ae-35977c10b787\\})|(\\{cbe9b620-fac0-407a-b3be-b0a61b319ef8\\})|(\\{1cdb403e-11c7-421b-9c87-0c0d90263626\\})|(\\{f5fa0bfe-a981-48ff-b809-8faa3126f0bc\\})|(\\{7dc6d0d2-b2f0-4334-979d-6ebeff77785a\\})|(\\{13623b47-de82-4226-85f8-d3ae343e619b\\})|(\\{db7b6ea7-2605-44c7-807b-2419d7eec531\\})|(\\{b9298a4a-acca-446d-aa72-d37f5e1576cd\\})|(\\{2e689bc0-735f-445c-bcc7-2cc495f5eb40\\})|(\\{04acd977-4c2b-4162-af33-8c585bea90c5\\})|(\\{2436dde0-3230-4933-9020-c15b3b9e693b\\})|(\\{dcb556aa-ef6e-4778-9f60-c5ae18a72cfb\\})|(\\{5a24385f-ada4-455d-95ad-62cb6256360d\\})|(\\{97f88a13-5b79-4345-a85e-2560d54f577c\\})|(\\{12f4cde8-7d1c-4a9e-9ef7-431f5ecd53a4\\})|(\\{18a93813-7deb-40cf-b3a6-402369e6d817\\})|(\\{9cee5c92-eb1e-4892-86ff-d2d1c627f5b9\\})|(\\{cb1c544e-d444-4c85-8224-64aa26e82230\\})|(\\{1c3b247f-2ef4-4483-93a6-0a3da7bc3548\\})|(\\{1f6913f2-dead-4f96-bf96-0e64affd46ae\\})|(\\{109adc7d-f308-43a5-aa0e-07ccdc5dad2c\\})|(\\{7170e23c-c706-48a7-919f-c1c22548dbfb\\})|(\\{6aa47f05-1f3f-4798-908a-0ed01b2361e0\\})|(\\{33ef0e7b-15ea-4b08-a779-173731ac20b3\\})|(\\{a0361564-9461-4da0-8ec0-7dc6f418f707\\})|(\\{c12631ed-993a-4c2e-9bf0-37867ae40491\\})|(\\{00b79649-3f0e-4b12-a8f0-376a7b2db716\\})|(\\{89096e44-c8b4-4ce5-aad2-f5bac765f608\\})|(\\{6f4eff89-0e32-42bd-a5c1-354adc8417fd\\})|(\\{482c54ae-e080-4596-bf7c-ae972fdff9a3\\})|(\\{04868575-532f-4b43-9325-7e707c109c25\\})|(\\{042c3065-1291-4409-bae5-8d11f3c268e2\\})|(\\{126e7fc4-bf2d-4467-88b1-f3b17bc10da4\\})|(\\{cea21739-b9ce-46c7-ad3e-3607b1ff6538\\})|(\\{06eea1e7-a8be-4794-8cd5-ed12e5f86161\\})|(\\{50993bc5-011c-4322-b522-41e6f3997163\\})|(\\{219a2146-5d9b-472a-8630-4c96a0994bec\\})|(\\{1db94c2f-d957-4b12-a1dc-903bb28f5ff5\\})|(\\{2f7d887c-7d56-41fa-bf9b-eadf6e500427\\})|(\\{2b16f4ab-a2a9-43fd-8fd6-ad6f354b0d28\\})|(\\{034d2b14-29e6-42ad-b2db-2c31286f3fb7\\})|(\\{77058195-5ae1-440c-8f86-c60a96d12ca9\\})|(\\{8082ff2f-2151-4281-8134-1423e5961ca1\\})|(\\{9fa797e8-d7d4-4851-b7e9-76b61ecf046f\\})|(\\{87178fbe-17a5-4d8d-b5ed-48d17179b101\\})|(\\{f010d9e9-0878-4c83-af45-df966cbe8d26\\})|(\\{2aa8c5cd-18fa-4991-b354-d6f459efeca9\\})|(\\{4021839d-3f4a-4866-94fb-9fa809c5245b\\}))$/","prefs":[],"schema":1553024292304,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535088","why":"This add-on violates Mozilla's add-on policies by exfiltration user data and tracking online activities.","name":"Search overriding malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"478d4acd-3c01-4dd5-b784-4e06b69d1c05","last_modified":1553079818962},{"guid":"{781b89d4-fa53-45a1-bea4-151dd4c8b288}","prefs":[],"schema":1553013598703,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535280","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Drop Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81759002-967e-4856-9f55-61d7c30cdb3b","last_modified":1553013656506},{"guid":"{3b52063a-0683-4de2-b6e1-6192c78b6ba3}","prefs":[],"schema":1553013551744,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536042","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Project Tech (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6a7f932a-3911-4884-8cb9-d282d282c0cc","last_modified":1553013598695},{"guid":"{47610aad-982f-4822-93ca-8c27dc96a13b}","prefs":[],"schema":1552938092086,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534773","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Tech Hand (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"12874e4d-28b5-4e98-8c33-b6cf5eb032bf","last_modified":1553013551736},{"guid":"amqp-dwn-all-vd@artur.brown","prefs":[],"schema":1552916969263,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1536052","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Video Downloader Plus (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a3f5ce2f-d8ef-4dae-9fce-1d7fb69d2b37","last_modified":1552917123606},{"guid":"/^((\\{1d758385-fddd-478e-85a0-13eef59f60e5\\})|(\\{1ec3e92a-fd3c-4e16-82e2-56d44bd7bdf4\\})|(\\{3dadda0d-d67c-4452-9475-246c33198192\\})|(\\{4a48f6a8-c9d6-4ae2-8513-a7e9fe785a56\\})|(\\{4d2da172-b160-42b5-9fea-0ede63e0ab52\\})|(\\{5bcd4feb-ce52-4e6f-9da6-eef2a75a4f70\\})|(\\{5eb45d74-0f46-4269-bc0e-8a2a49d64267\\})|(\\{7e8c27c0-b94c-4026-8068-2d152143f073\\})|(\\{9ede19b2-bb97-4d1c-abab-b1d72e7d4c74\\})|(\\{19abb7a0-fb4d-41ff-97d4-65f1680c1348\\})|(\\{25efbdeb-04fa-4998-a9f8-99c1293c7b7f\\})|(\\{0049a401-f02d-4d16-8b5e-5933e5855a4c\\})|(\\{65b91ca5-cd06-42a6-9637-8ecde3a69fd6\\})|(\\{146ec14e-f623-4cb2-88ed-7d3bb8101090\\})|(\\{790d2797-82f3-4bc3-8759-c00d426bbf2f\\})|(\\{865f42b5-e073-4a36-84b1-47d09096b48b\\})|(\\{90055a5b-45a8-45c1-b0a0-979ab2a9064f\\})|(\\{a4f5c163-7b64-46c4-bfd3-348ecc99873a\\})|(\\{a8c40ee7-a376-417b-8022-40909a10181b\\})|(\\{a1031346-14d3-464f-9e50-c30dfd88ad92\\})|(\\{abd16535-2fa8-4bfd-b84e-ed09c9c60e53\\})|(\\{b5ee8c58-b5e5-4ba0-a899-9a54a2f0e386\\})|(\\{b246bb42-577e-4587-adf2-7274b378b0b4\\})|(\\{bb43765b-fe06-4d50-9802-0c6742b220aa\\})|(\\{bf3f628d-9e52-4727-b940-054c65a5a304\\})|(\\{c6bc710d-8cc8-4224-9287-44ecfa452a81\\})|(\\{c232edce-83c9-4184-9782-22df800f65e2\\})|(\\{c5397be4-b756-45b8-a247-339846fada52\\})|(\\{c6675bc5-f7ea-4a11-8252-1152d3783ae3\\})|(\\{cc6a088b-5a84-4e48-8de8-d2f6be3abae7\\})|(\\{e6c12219-f67e-4ea0-a9c3-2c541febeff1\\})|(\\{eb3a7ef7-a4d0-49a4-8b21-2a91c1758100\\})|(\\{ec34588b-86b4-4de3-a3bf-f4d1d8386475\\})|(\\{f4fd8825-648f-4b63-a499-3fd702d42149\\})|(\\{fc4f31f6-c5ed-4afd-8c19-df96e107ce7d\\})|(\\{fe337ef5-bb69-44bf-82a8-ee5c13406165\\})|(\\{ff285a1c-5672-44c3-890e-6c4f25976b83\\}))$/","prefs":[],"schema":1552908996320,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535421","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"25f18cc5-6ecc-419f-b093-b79e9f261062","last_modified":1552916969252},{"guid":"{a4491aab-e273-4bc3-b45e-a7b9b9414a5f}","prefs":[],"schema":1552695264438,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534792","why":"Search takeover not according to policies, masking as a different add-on","name":"FFCop"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d2da9c45-59f8-4257-9d7e-07c4fa5de958","last_modified":1552695747900},{"guid":"/^((\\{0f6b717d-1625-4434-b770-5ae33eb64b16\\})|(\\{6d092be7-0bad-46af-9489-04e4b3988644\\})|(\\{7f6049d6-e8b0-4c42-8028-204d1458ddb6\\})|(\\{12b75028-c038-40bd-be5b-2809b7d18d78\\})|(\\{46f35a01-faaf-4fab-95e6-7dfc8b6d8b73\\})|(\\{55d2c6f7-62fa-4091-988b-7f4c4b3c1bff\\})|(\\{75aeaeec-d415-404d-84ba-bd70bcc5e70c\\})|(\\{76b8cf24-227d-4e2b-af4c-39ec5b47babf\\})|(\\{77b725cc-5d0e-4b82-88f0-ec6961acd697\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f531\\})|(\\{90fc8426-06ba-43ab-8110-7478ff86f539\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e084\\})|(\\{157cd8f9-48f0-43a1-9bcf-c4316753e085\\})|(\\{201ec7f7-57b1-48dd-945c-b1ea7489195d\\})|(\\{280fc0f5-6dfb-4a3c-92ae-acb2d5352175\\})|(\\{388f6d65-4a1b-43ac-b791-387882c30599\\})|(\\{0575cabd-38f3-4964-bdc3-0141a2f062e9\\})|(\\{927e4189-4f56-437e-a0d4-5e232612b5c7\\})|(\\{7277d7cf-c598-420b-ab6e-ab066e1e2fdd\\})|(\\{67775ec2-c879-438b-9409-89fba7ffc684\\})|(\\{397386d2-bb76-4b69-8121-86fad15c5216\\})|(\\{bd7f03dc-b362-4744-b118-43ab916205f9\\})|(\\{c133fb29-c967-4aec-953a-4974e8cbdb26\\})|(\\{cc94c8a7-efa3-435c-91fe-ca305f70e39d\\})|(\\{cfd2ff68-6579-4448-8a26-561bdb63877c\\})|(\\{d00f0050-a66c-49fc-9236-1498d4d29f67\\})|(\\{daa287a2-5916-413e-9b61-52c00b5aa061\\})|(\\{dcfac76f-2fd2-4477-9a60-22d167cabcb4\\})|(\\{dd1bbcf4-bff3-4f15-8a2c-3d52ce987f70\\})|(\\{ddb546b5-6490-4af5-8813-8e701bc06e26\\})|(\\{ead6848b-4bd6-4f9a-93bd-b8460c6f6973\\})|(\\{eb8f7a97-ffb0-40f1-9321-5ab1de884f1c\\})|(\\{ec3e8a3d-df39-4f84-ab31-dae369a225e4\\})|(\\{ef986f55-2dc9-4e39-8c87-618cf4fe5e69\\})|(\\{f8b4b601-7917-40c1-94ec-8efbbf125a46\\})|(\\{f8bc456c-0fb4-4d5d-a85f-dfeb25459e76\\})|(\\{f0458469-cc09-407e-a891-be8606553341\\})|(\\{fa73622c-8b41-45b8-9d93-6d66e7633765\\})|(@loveroms)|(loveroms-ash1280@jetpack)|(searchdimension@gmail\\.com))$/","prefs":[],"schema":1552655172725,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535402","why":"    This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"Add-ons including abusive search behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f9cd41dd-9e52-4506-bb58-a31e189f4ab9","last_modified":1552655392045},{"guid":"{b6f5f2d0-1aa3-4e43-b536-6db1b1bf7d1c}","prefs":[],"schema":1552592498693,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535601","why":"This add-on violates Mozilla's add-on policies by exfiltrating user data.","name":"FFcanu (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b807d5f-a192-450a-a0b3-98113c4beff1","last_modified":1552655172717},{"guid":"{e19fed8c-637a-42e3-b62a-3a6c4040ded8}","prefs":[],"schema":1552570939014,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535345","why":"This add-on violates Mozilla's add-policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5027a1c1-e050-434f-ba77-56417bc2d7cf","last_modified":1552589019976},{"guid":"{fb62e856-f09b-4cbc-ba07-642ab55f6cb4}","prefs":[],"schema":1552567880022,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534781","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"EncDNA module (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ce66baec-1237-481c-87db-ccc1bcf0359d","last_modified":1552567941331},{"guid":"{54fc344c-e8ba-462a-a6d9-9ce1b794ce46}","prefs":[],"schema":1552567837850,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534817","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4bec4aaf-dd5b-4754-bd01-461fdc7ea5ca","last_modified":1552567880014},{"guid":"{7b6def45-d585-431a-a479-5bb2badf2506}","prefs":[],"schema":1552567781490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1535055","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"PredicitionR (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"e9227d28-b627-48b8-8392-e9fb5a00d9b6","last_modified":1552567837842},{"guid":"{6fb28b6b-abf2-4937-af28-340851faa971}","prefs":[],"schema":1552567721181,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534769","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"metamedian (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ed853ce8-83e0-42b7-8d93-7f48041d4987","last_modified":1552567781482},{"guid":"{ae5b30dd-b29d-4ae6-844b-5d7bfc3d7915}","prefs":[],"schema":1552567676370,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534807","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"Crypto Valuator (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3cfd9af5-a7d0-49d3-971b-7af5e2eab78f","last_modified":1552567721173},{"guid":"web-private@ext.com","prefs":[],"schema":1552567616148,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534828","why":"This add-on violates Mozilla's add-on policies by overriding search preferences.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3d52fe32-71e5-47bd-8eda-d98fa0c489e9","last_modified":1552567676362},{"guid":"/^((ads@firefox\\.pl)|(adsfinland@firefox\\.pl)|(adsfrance@firefox\\.pl)|(dodateknowy@o2\\.pl)|(dodateksuper1@firefox\\.pl)|(dodateksuper2@firefox\\.pl)|(dodateksuper3@firefox\\.pl)|(dodateksuper5@firefox\\.pl)|(dodateksuper6@firefox\\.pl)|(dodateksuper@firefox\\.pl)|(test_b@iext\\.pro)|(\\{697be03c-cdd2-430e-b6cf-0f9b5f0556ee\\})|(\\{c9ced03f-a5cf-4dbf-b5ba-67673e442590\\})|(\\{cbe59f66-a23a-45c1-81ac-d0cbedf9ea4e\\})|(\\{dbf0a186-d41c-40ae-8841-e9d8a6b49d8d\\}))$/","prefs":[],"schema":1552493457658,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534940","why":"This add-on violates Mozilla's add-on policies by using a deceiving name and exfiltrating user data.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67025e3b-860c-4680-949f-ec472cd72fae","last_modified":1552567437766},{"guid":"/^((\\{86c18738-11ed-4c16-af92-786aa036c83c\\})|(\\{d0fee16a-f4eb-4dc1-9961-82b913e5943d\\})|(\\{1c4937a1-c678-4607-8665-a16384ee302e\\})|(\\{22caeb02-38a3-415d-b168-64fadccbb4a4\\})|(\\{1c9372e7-5f0e-4541-99cf-dfbf2ab00b01\\})|(\\{9fe66994-8ed1-4317-a20a-1d0544ca062f\\})|(\\{6df222d8-97c7-42bf-9683-1cf8119c1e9e\\})|(\\{4c2dda03-bad0-4160-a8a1-6d089200420e\\})|(\\{7aae7d4f-55b9-42eb-b683-932591265e17\\})|(\\{e6f8ab99-3c96-410c-95d1-267ad48ed3e2\\})|(\\{6d8c5068-d0cb-47a5-af5e-3f23064f4608\\})|(\\{90481f38-d06a-465e-a54c-206bbb1ee9ae\\})|(\\{4b75aeb8-f14a-4ef3-b1ad-09733b40dac3\\})|(\\{3a8ca495-f5ab-4320-b070-4f44266fe3d1\\})|(\\{84f8914f-0dec-48ed-a0fd-4a7712c06793\\})|(\\{aa613fce-603c-41df-bf49-9b09614cebe6\\})|(\\{30314350-199a-4951-9c05-c3537a946492\\})|(\\{a2edce1d-10ab-483d-8c01-5e5fe0c82902\\})|(\\{ec91a3d4-8311-4700-aa15-b3941f21a052\\})|(\\{e9049687-164a-4cf3-be1f-1291cfb0f44a\\})|(\\{2be73925-ebaf-43ca-8b26-bd820887f591\\})|(\\{840eadea-1c68-411f-b4e9-08d9f236385d\\})|(\\{0a89d040-5fb1-46d7-bf81-43b55e83695d\\})|(\\{6a1e76ed-4ac2-4a0c-8beb-43ae63558b36\\})|(\\{1b90c930-e7d7-486a-9085-8b57129489c7\\})|(\\{eab649ca-af76-4de9-95b0-8036e35a66cc\\})|(\\{0628e652-98f4-4e58-9ecb-ad996b061aef\\})|(elfr@geckoaddon\\.org)|(else@geckoaddon\\.org)|(fr_b@iext\\.pro)|(it_b@iext\\.pro)|(sv_b@iext\\.pro)|(no_b1@iext\\.pro)|(fi_b@iext\\.pro)|(au_b@iext\\.pro)|(elfr12@geckoaddon\\.org)|(test@informations\\.to)|(se_pop@informations\\.to)|(it@spongebog\\.funny-ok\\.com)|(it@tsunami\\.funny-ok\\.com)|(fi@spongebog\\.funny-ok\\.com)|(fi@tsunami\\.funny-ok\\.com)|(no@spongebog\\.funny-ok\\.com)|(no@tsunami\\.funny-ok\\.com)|(fr@tsunami\\.funny-ok\\.com)|(fr@spongebog\\.funny-ok\\.com)|(se@tsunami\\.funny-ok\\.com)|(se@spongebog\\.funny-ok\\.com)|(au@spongebog\\.funny-ok\\.com)|(au@tsunami\\.funny-ok\\.com)|(nz@spongebog\\.funny-ok\\.com)|(nz@tsunami\\.funny-ok\\.com)|(gr@spongebog\\.funny-ok\\.com)|(gr@tsunami\\.funny-ok\\.com)|(nz_fnew@tsunami\\.funny-ok\\.com))$/","prefs":[],"schema":1552320039514,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1534103","why":"Stealing cookies, browsing history and other information","name":"Rogue Updater add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"b57d9505-21bf-4a24-accb-05ceac50dadc","last_modified":1552323475989},{"guid":"{c04d9d7d-1c8c-4eab-a51a-828c47e1b8b7}","prefs":[],"schema":1552246898392,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1533780","why":"This add-on violates Mozilla's add-on policies by executing remote code.","name":"asin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2c739daa-ffee-48d9-a825-e53c8fd2bb3c","last_modified":1552300402314},{"guid":"/^((\\{ee2d725e-9726-43ac-8040-60ce9ff2831b\\})|(\\{55417a80-e6f7-4d77-8d73-f59045e5e890\\}))$/","prefs":[],"schema":1551728497880,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1532269","why":"This add-on violates Mozilla's add-on policies by using a deceptive name.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aca80fb4-760e-4cd4-9fec-649fb38b2947","last_modified":1551794995188},{"guid":"/^((\\{5084f455-bc8f-483c-b145-91245bcbfd64\\})|(\\{bd69d5d0-4b2f-48cb-bab5-dcf1e0f9c63b\\}))$/","prefs":[],"schema":1551398716775,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1531416","why":"Maliciously collecting form data and cookie modification","name":"Adblock/Adobe Flash fakes"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7718be46-8e84-4bc7-a5a9-4c5de18378ee","last_modified":1551399019543},{"guid":"/^((\\{6745ccb4-833d-497e-b582-d98a5e790e8c\\})|(\\{cd205ddb-b106-4d2a-a965-5d1c610b5072\\})|(\\{218ec82e-2839-42da-acaa-e527454f4237\\})|(\\{7af25a3d-1caf-49f8-8be9-8ae6065db7c5\\}))$/","prefs":[],"schema":1551397746059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530911","why":"Search hijacking, remote scripts","name":"Emoj1 clones"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"77a32be3-94ce-49c2-b129-fa2562a7f47b","last_modified":1551398716765},{"guid":"Youtube-video@Myaddons.com","prefs":[],"schema":1551397521494,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529887","why":"Remote script injection and data exfiltration","name":"YouTube Video and MP3 Downloader"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a30f9f2a-aa68-48b7-88cc-8a582405b385","last_modified":1551397746049},{"guid":"Youtube-downloader@Myaddons.com","prefs":[],"schema":1551396963937,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529873","why":"Remote script injection, data exfiltration","name":"YouTube MP3 Converter"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1d596a69-157f-4743-9465-f86d6452206b","last_modified":1551397521482},{"guid":"{ba74c7ee-32b1-11e9-ade5-1f2222a4f325}","prefs":[],"schema":1551382900634,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529573","why":"Remote script injection and user data exfiltration","name":"GET Security"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"01825fea-8c5c-4d76-bd06-e1019c188056","last_modified":1551396963926},{"guid":"/^((\\{e0686c32-99b4-44d8-972f-88bf08b68f88\\})|(\\{b2225e4c-9d1d-472b-8aeb-5ff203bcff9a\\}))$/","prefs":[],"schema":1551210091992,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530932","why":"This add-on is distributed violates Mozilla's add-on policies by being distributed through a fake Firefox update page.","name":"Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"37252271-9e38-46a9-b23a-2b6d7048c0db","last_modified":1551250023025},{"guid":"{9d7cfde2-39ae-11e9-bde0-02427e2eba50}","prefs":[],"schema":1551104404768,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1530640","why":"This add-on violates Mozilla's add-on policies by including abusive remote functionality, negatively affecting security and performance.","name":"Unnamed malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"7bb234b0-cfda-4a23-bf02-9c82fb3500a3","last_modified":1551204284998},{"guid":"{4603d01d-ae80-4653-9288-d5ef98b99a17}","prefs":[],"schema":1551099702949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529924","why":"This add-on violates Mozilla add-on policies by including abusive remote code.","name":"IMmailgun (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"32227de6-a7bf-454c-bf44-4478ddd96abe","last_modified":1551099805258},{"guid":"{157cd8f9-48f0-43a1-9bcf-c4316753e083}","prefs":[],"schema":1551037300209,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529926","why":"This add-on violates Mozilla add-on policies by including abusive search behavior.","name":"SD App (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5b3fe8de-6d05-4d95-a6d2-cd5695f1b0c0","last_modified":1551099426266},{"guid":"{5288d05d-253f-4675-be3b-152bf02aa3ec}","prefs":[],"schema":1550683849233,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529328","why":"Remote script injection along with deceptive code to hide the fact","name":"Unicode & Emoji Support"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9600b4cd-da02-4947-a4f5-c56c657ba197","last_modified":1550684288501},{"guid":"restore.old@youtube.com","prefs":[],"schema":1550580649249,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1529126","why":"This add-ons does remote script injection in a way that attempts to hide the injection. The code being executed runs on all pages which is contrary to what the add-on is described to do.","name":"Restore Old Youtube"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"27917953-17fb-4ffc-bcf1-5fc2727174b4","last_modified":1550617105595},{"guid":"/^((pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-18573537)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-570932499)|(aackamlchlgmalkmcphbhhcjebbpnfdf@chrome-store-foxified-233164420)|(pohhpifegcbplaijeeonlbkjgocfgjbf@chrome-store-foxified-1808417494)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-699139867)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1808417494)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1190639722)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-2745518014)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified-1955364993)|(dilkapnoekabmkkhhdlpnpfgjcmddlia@chrome-store-foxified-1516694386)|(generated-rk4dtanssk56goquir78sz@chrome-store-foxified--1594555229)|(nnfhjlgginbfdejaajhbboeemajpjgfp@chrome-store-foxified-1388315457)|(oaoebpgbkehlcdggaeeohgfpopdhjell@chrome-store-foxified-1823310541)|(fibaefnljghpmdibfkhnlaniblfkkndi@chrome-store-foxified--1031675095)|(ancjheohbkbnkgcmfaldcaepoeeplkgh@chrome-store-foxified-1823310541)|(generated-lwcbpuj27wcknyyl6pkap7@chrome-store-foxified-1823310541)|(generated-bmtr2hbgikv399aj6aeycd@chrome-store-foxified-1823310541)|(generated-8w9odie82h2ugbsrofooj3@chrome-store-foxified-1823310541)|(\\{4170faaa-ee87-4a0e-b57a-1aec49282887\\})|(\\{b66dd4bc-7f5e-41d9-bc43-84c5736d0c87\\})|(\\{507ad1fb-08ae-43ac-a596-fd5b6e7dea9a\\})|(\\{8bf85207-66df-4eb7-b913-ac162498c687\\})|(\\{b063895a-8077-452d-b049-ebc20a39f882\\})|(\\{5776bd90-3d09-43b5-a769-8da373e9820f\\})|(\\{f6bdce44-3d5a-4f88-9a64-e39fcb4f0717\\})|(\\{1c22e687-6a02-440c-a6d5-c1ccaf520e10\\})|(\\{f7be824f-7287-466a-8590-2f48007a223b\\})|(\\{89ffc0b4-97f7-447c-bd6f-9c519b0188bd\\})|(\\{3a67084b-c231-4b4b-a924-ffa741f90921\\})|(\\{fac8b1d0-f321-491d-9234-c40d89b3660d\\})|(\\{a8053a83-8d1a-4f0e-9f88-d31cfe00cf83\\})|(\\{d10fa57e-37d3-43d3-39f8-e6d5b2a7759d\\})|(savetube_downloader@savetube\\.co)|(\\{95a8a08c-53a8-7e1d-5a80-f1a5cd4751bf\\})|(\\{5037bd74-c23b-4bbf-8865-6b5a09e07342\\})|(\\{830c558c-70f0-4b07-95f1-8e06ad34ee2c\\})|(\\{e4d93c37-1299-452f-9b60-adee15ad3802\\})|(googlemaps@search))$/","prefs":[],"schema":1550502645324,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528761","why":"Malicious add-ons injecting remote scripts and exfiltrating data for monetization purposes. Some of the add-ons are masking themselves as legit add-ons and using various obfuscation tactics to hide their injections.","name":"Rogue Youtube downloaders and related add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f2483d7d-1895-4ae6-9901-7321e59062a6","last_modified":1550502978653},{"guid":"/^((((generated-e0yf8zkhypow3jjifkqzwo)|(iiinclagpealgnaglbmkdbfbgchjjbpg)|(jaehkpjddfdgiiefcnhahapilbejohhj))@chrome-store-foxified--?\\d+)|(jid1-9ETkKdBARv7Iww@jetpack)|(\\{813fe658-5a29-4dcc-ba6c-3941676e4f19\\}))$/","prefs":[],"schema":1550254444783,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1528308","why":"This add-on violates Mozilla's add-on policies by tracking user behavior and including remote code.","name":"BuyHatke Best Price Comparison, Graph, Coupons (and similar)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d6b2dbad-31e9-4984-b649-19036cd38e1d","last_modified":1550265430182},{"guid":"/^((odnenajaeicndaeiapagpglohiklndhe@chrome-store-foxified-2174031944)|(akdibckdjeocfbcjaikipkhhbggcbgkg@chrome-store-foxified-699805590)|(\\{bd9f5830-bf8c-4e38-933d-09f85b24d744\\})|(youtube-downloader@addoncrop\\.com)|(dailymotion-downloader@addoncrop\\.com)|(youtube-mp3-iframe-downloader@addoncrop\\.com)|(youtube-downloader-lite@addoncrop\\.com)|(dailymotion-downloader-lite@addoncrop\\.com)|(generated-p5qj07ef5ceqfktp5v8whw@chrome-store-foxified--505607522)|(generated-tuag2j5gwq73xzp8fbw3j8@chrome-store-foxified--505607522)|(generated-uj53d5j612ap5pz11hwgv2@chrome-store-foxified--505607522)|(\\{f51f0244-bfb0-40ce-bf9d-af49f5949e61\\})|(\\{81751484-2dc9-47bf-aec3-b8e556237178\\})|(\\{d89d1e20-57af-4164-82cc-650af45cf0a5\\})|(\\{a5e28713-14c3-4967-befe-2ec253e317cd\\})|(\\{335ac35b-6c16-4304-93f0-64a418e5bf81\\})|(\\{d3fdb429-ef84-40a4-b160-010745ee0098\\})|(\\{d66db057-7d38-4df4-a0ba-63c272be25ee\\})|(\\{ff7f7151-09e3-4e35-9052-b21e23e7e2c1\\})|(\\{1479da02-e759-4a6f-8f62-c08096583806\\})|(\\{42d59cda-c117-459e-b244-1b850c27ccc9\\})|(\\{bec48f33-7869-4158-8cbc-5cf1606f9afa\\})|(\\{08ca656c-4973-46a8-85a9-3d771399c86e\\})|(\\{dc5336c8-5624-4f74-a794-bb15f3760f34\\})|(\\{6a3d97de-1b42-4624-880a-1a68bc917142\\})|(\\{ad965166-3a34-449d-8230-a636fb5cae57\\})|(video-view@vv\\.us)|(video-view@excoe\\.com)|(xeco@rama\\.com)|(ghj@brem\\.com)|(fgtr@rembgr\\.com)|(xero@saltam\\.com)|(sora@remjem\\.com)|(repo@saram\\.com)|(tora@empoytr\\.net)|(saving@ropbart\\.com)|(japa@vbgt\\.com)|(rtya@nop\\.net)|(asan@khazan\\.com)|(xerb@tangot\\.com)|(audiotools@ramdeen\\.com)|(webat@extrolm\\.com)|(media@medplus\\.com)|(audio@audequl\\.com)|(control@medcontrols\\.com)|(sabqo@rimjim\\.com)|(repto@secroa\\.com)|(meters@videobf\\.com)|(betro@diskra\\.com)|(codeca@vxmrop\\.com)|(revoca@feronx\\.com)|(brota@vidbrghta\\.com))$/","prefs":[],"schema":1550173301925,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1527603","why":"This add-on violates Mozilla's add-on policy by including malicious remote code.","name":"Various add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d94f7e0f-7088-43c9-a8da-eae102781079","last_modified":1550253583075},{"guid":"superzoom@funnerapps.com","prefs":[],"schema":1549578756953,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525405","why":"This add-on includes abusive functionality including violating the user's security and privacy.","name":"SuperZoom (Abusive)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7c4b329-7a54-48d3-9494-81783fe99d90","last_modified":1549627400713},{"guid":"/^((addon@firefox-updater\\.com)|(downloader@youtube-download\\.org)|(downloader2@youtube-download\\.org)|(downloader1@youtube-download\\.org))$/","prefs":[],"schema":1549369087422,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1525153","why":"These add-ons include abusive behavior.","name":"\"FF Manual Update (Required)\" and \"Easy Youtube Video Downloader Express\" (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6b72e942-af54-469c-b9f2-9e436ad2c0d1","last_modified":1549373215201},{"guid":"/^((\\{0b347362-773f-4527-a006-f96e9db437e5\\})|(\\{9edb10ad-67af-4ad0-af45-efe452479321\\})|(\\{202e2671-6153-450d-bc66-5e67cee3603f\\}))$/","prefs":[],"schema":1548963700621,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1524357","why":"This add-on includes hidden abusive functionality.","name":"Video download add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"680a99e9-c972-4a14-9b15-e56eeeed75eb","last_modified":1549037404012},{"guid":"/^((\\{a9bc520e-68ab-49c2-a8df-75a0349d54fd\\})|(\\{bfc5d009-c6bd-4526-92ce-a9d27102f7f2\\}))$/","prefs":[],"schema":1548699141208,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522959","why":"Add-ons that contain abusive functionality.","name":"Unnamed (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"97c4ee31-4009-40de-ae02-f1b349c87d01","last_modified":1548699177099},{"guid":"{4e47160d-ec83-417c-ab01-cda978378d9e}","prefs":[],"schema":1548699076839,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1522970","why":"The add-on contains abusive functionality.","name":"mlflow (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"62c54642-73ab-4641-b5c2-47e4ae29bbc5","last_modified":1548699141199},{"guid":"/^((\\{feff5ea4-ed4a-46a3-9331-12fec01d52a9\\})|(\\{8ffc339c-0ca1-46e3-acb3-3bfd889f9a21\\})|(\\{1fe481b5-baad-44e9-b410-082cf0f2acbb\\})|(\\{92c85192-b325-4599-82e2-a110f193eae6\\})|(\\{5bc21266-26f1-469a-bc1a-a49d7b70ecb9\\})|(\\{dc2dd143-f2e7-4f46-a8ff-4dc1a985e889\\})|(\\{c1233bb6-31a9-4c7d-8469-f8f44adee9ba\\})|(\\{d0d48905-1065-43dc-ab96-434d100602ed\\})|(\\{11deae99-2675-4d5e-86cd-7bd55b88daf2\\})|(\\{a7014e8e-eacf-4ba0-9047-c897c4ed3387\\})|(\\{b9c545a5-0ffa-490a-8071-2fee09478cfe\\})|(\\{39e8eebb-4d9e-4a03-93a8-4468fdd7a186\\})|(\\{8ccc00b1-2010-4155-a07c-f4d7c4d6dec2\\})|(\\{a1056511-4919-43b7-a9e5-ac2b770de810\\})|(\\{90a6da19-9165-44c1-819c-e3b53409f9c9\\})|(\\{e3862078-8f9f-4f8e-99dc-55ba558f0619\\})|(\\{d89fcf34-2615-4efc-a267-1e83ab6a19d0\\})|(\\{588151ce-eab4-4acf-83a7-bb5ccaf4d867\\})|(\\{6ab6312d-5fd4-42a9-ab10-08b954e53f9d\\})|(\\{24a6cbde-be68-4b7d-9f1b-d4d5dfd178a3\\})|(\\{55ae1a08-105f-4f7f-9d4e-e448b517db2b\\})|(\\{74fe9d83-df17-4812-bd3f-27b84b0086b7\\})|(\\{21140e51-713a-4bf8-865b-e2ee07282409\\})|(\\{24f39610-2958-4dc8-a73b-75cc9665bffa\\})|(\\{c50a45a5-efa4-44af-8946-6f20e4748d47\\})|(\\{41d0b7e0-0d93-4f67-bed9-da6d7688ad16\\})|(\\{c2bee222-2163-4c0f-89f5-4ac502f06810\\})|(\\{4be4602e-2b20-473f-8f2b-85e8c53d17dc\\})|(\\{dec2e9b5-e787-4fb5-a7bc-5894f80f7367\\})|(\\{179526e1-1824-49f7-afb3-49fdaadaa503\\})|(\\{4f07d826-ca9e-4370-a508-b984f54758de\\})|(\\{d0558df2-714f-4793-9d85-d2d648de4f2e\\})|(\\{daf1a69b-f47b-4936-bd25-5ac21f4e27ec\\}))$/","prefs":[],"schema":1548099697813,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521975","why":"Remote script injection and deceptive tactics to hide the fact","name":"ext-affiliate add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"87c17ce6-aaef-4d47-a662-588efff34041","last_modified":1548198338831},{"guid":"hlper@xero.com","prefs":[],"schema":1548076840649,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521533","why":"This add-on executes abusive remote code.","name":"Av Player Helper (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e2ae4c0-66cd-40bc-9cf6-5ca0ce9548f7","last_modified":1548084072622},{"guid":"/^((xtera@soravem\\.net)|(nozl@ssave\\.net))$/","prefs":[],"schema":1547926889113,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1521429","why":"This add-on injects abusive remote code.","name":"Video Assist (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c69997df-0b61-4de5-a351-b640123a9c3b","last_modified":1548073537411},{"guid":"/^((\\{94f608b3-76b6-4b7b-8cef-7360df22a930\\})|(\\{9648b74f-35ea-4218-acf0-ec2191f509f6\\}))$/","prefs":[],"schema":1547754101798,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1520813","why":"Add-ons that leak private user data.","name":"Instagram Register and Google Register (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a15e8d7e-0726-4190-8187-c75e2b46d429","last_modified":1547810271416},{"guid":"reopen@closedtab.com","prefs":[],"schema":1547067530457,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518847","why":"This add-on contains unwanted abusive behavior unrelated to the add-ons functionality.","name":"Reopen Closed Tabs (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"451d950f-ca89-491b-87e7-45123e4f5ab4","last_modified":1547206877909},{"guid":"{43ecded1-f7cb-4bb6-a03d-4bec23b9f22d}","prefs":[],"schema":1547025691087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518580","why":"This add-on violates Mozilla's policy and user's security/privacy by loading abusive code from remote.","name":"lamme (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"06c6868e-055f-4e7d-aa8f-5ba577f43e85","last_modified":1547027153061},{"guid":"youtube_downloader@addon.partners","prefs":[],"schema":1546890104853,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1518032","why":"This add-on contains unwanted abusive functionality.","name":"YouTube Download Tool HD (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5a42c5bb-9cb4-4d96-b978-8d9f816322e6","last_modified":1547025691078},{"guid":"/^((\\{00cf6ee0-14f3-4e35-a4fd-d2160fe2f05e\\})|(\\{0da583da-e623-41f2-b2d2-0ac61b493171\\})|(\\{105c14a6-8b6f-49ef-b0d6-41bad99ad5e8\\})|(\\{10a15a74-271f-4098-a662-bd827db4f8bc\\})|(\\{13e02b9b-2797-4100-8144-65b73c4145c4\\})|(\\{1eb56568-8a30-42b1-a646-ad9f485f60fe\\})|(\\{1eb8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{2f8220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{33f39a5d-137c-4757-9f9d-e86395c8bf20\\})|(\\{347ca189-9e63-43d2-8a2f-5d5141598bdc\\})|(\\{396056fc-1697-4954-b535-06de8d62fe1b\\})|(\\{3d530918-dbe8-442c-8faf-1f4ca7ca8ab9\\})|(\\{3e283c2e-cde3-4baa-8076-226ca8fb90ef\\})|(\\{591468f8-ebbd-497a-92f1-fa0a1206adb4\\})|(\\{5f6c3eb8-aa32-489a-bb01-b12b23d2001a\\})|(\\{6cbb397a-d865-42b2-8454-25a75b710dff\\})|(\\{7ae2bde0-f7ea-4bf3-a055-06953f9fcf31\\})|(\\{7b402578-ddec-4eee-9c8b-98e4e8db0059\\})|(\\{7fb00cf7-40d3-4415-a0c8-a48d3fbe847f\\})|(\\{87a8a08c-82a8-4d1d-8b80-f7b5cd4751bf\\})|(\\{888220a8-b2a7-4277-ba6b-bdcb6958f669\\})|(\\{8b1dd8f3-224b-4975-bda2-cb2dd184d4d8\\})|(\\{8bcdc9cc-f6be-4203-ae43-a9d281f0bcdb\\})|(\\{8cda9ce6-7893-4f47-ac70-a65215cec288\\})|(\\{8dc9b946-0bb9-4264-9c76-fd9ff1e159a2\\})|(\\{942e0fec-19f2-4ebc-8a74-009da7fa625d\\})|(\\{b2a720a8-b2a7-4277-aa6b-bdeb6958f669\\})|(\\{bdcf953b-d2aa-4e7a-8176-aeb1e95a0caf\\})|(\\{cae82615-f7be-4aff-875d-33da1bc93923\\})|(\\{d2aa953b-bdcf-4f7a-8476-ddb1e9500caf\\})|(\\{da0fa57e-17d3-40d3-99f8-e9d5b2a7759d\\})|(\\{da1237ca-e35d-4653-b2b5-d98043f33781\\})|(\\{e164563a-1512-4b81-99ff-95f2644c4075\\})|(\\{e2a720a8-b3a7-1277-aa2b-bdeb2958f669\\})|(\\{e6a90490-6ef7-407d-863a-7dd120f6f7dc\\})|(\\{f15cfa53-fa9b-43cf-84e8-16ece6695922\\})|(\\{f722c845-2d8b-4a0a-b518-4f39af703e79\\})|(\\{ff1c4e62-7c11-4ea7-b734-3462417ceeb5\\})|(\\{ffa0a57e-17d2-41d3-96f8-e8d5b2a0759d\\}))$/","prefs":[],"schema":1546378806655,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1517154","why":"Executing remote code containing coin mining and other undisclosed monetization","name":"Various remote iframe add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53c5fb08-1001-471e-87ce-31185a84bcbc","last_modified":1546439268437},{"guid":"{02267dc4-36f2-4c22-8103-9e26477b48ef}","prefs":[],"schema":1545922885656,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516539","why":"Google Search hijacking and affiliate injection","name":"Markdown"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"6dd73da4-cb2f-4eb8-8850-890e80c8d57b","last_modified":1545926512914},{"guid":"{d064563a-1542-4b8b-99ff-95f1644c4075}","prefs":[],"schema":1545921144932,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516488","why":"Obfuscated remote script injection stealing data","name":"PDF Print and Save"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"875bc1c6-257e-438a-8624-3bfe963747b0","last_modified":1545922824252},{"guid":"/^((\\{83768008-e10c-48c0-b303-5a0f1de763a1\\})|(\\{430b0612-bfad-463b-8783-cf2e32801513\\})|(\\{519adb83-4abb-4a66-8e94-243754b8adce\\})|(\\{228a707d-55c1-465b-a759-a2129eb6602e\\}))$/","prefs":[],"schema":1545853297809,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1516131","why":"Remote script injection and data exfiltration","name":"Various malicious remote script injection add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c0cb1a85-c6c6-453e-b126-0e6e26ceaf88","last_modified":1545870108716},{"guid":"/^((\\{4c4ceb83-f3f1-ad73-bfe0-259a371ed872\\})|(\\{a941b5ab-8894-41e1-a2ca-c5a6e2769c5f\\})|(\\{56488007-bd74-4702-9b6d-aee8f6cc05ea\\})|(\\{9eebac07-ac86-4be7-928f-e1015f858eee\\})|(\\{5a993517-5be7-480e-a86c-b8e8109fa774\\})|(\\{309ad78e-efff-43cf-910c-76361c536b20\\})|(\\{cefcf45b-dfec-4072-9ffc-317094c69c28\\})|(\\{5b04980b-25e9-4bc6-b6ea-02c58d86cc5e\\})|(\\{0021a844-360f-480e-ac53-47391b7b17b4\\})|(\\{2bed9f51-62a8-4471-b23c-827e6727c794\\})|(\\{7d2130d3-d724-4f58-b6b7-8537a9e09d4c\\})|(\\{ccd3847a-e5ec-4d28-bf98-340230dcbd4d\\})|(\\{83716b9b-6e6e-4471-af76-2d846f5804f3\\})|(\\{5154c03a-4bfc-4b13-86a9-0581a7d8c26d\\})|(\\{24f51c5c-e3f5-4667-bd6c-0be4f6ef5cc2\\})|(\\{73554774-4390-4b00-a5b9-84e8e06d6f3c\\})|(\\{c70cfd12-6dc3-4021-97f2-68057b3b759b\\})|(\\{ef5fe17b-eb6a-4e5e-9c18-9d423525bbbd\\})|(\\{461eb9b4-953c-4412-998e-9452a7cb42e0\\})|(\\{966b00fe-40b0-4d4b-8fde-6deca31c577b\\})|(\\{dab908ac-e1b0-4d7e-bc2e-86a15f37621f\\})|(\\{01a067d3-7bfa-44ac-8da7-2474a0114a7e\\})|(\\{6126261f-d025-4254-a1db-068a48113b11\\})|(\\{6c80453f-05ec-4243-bb71-e1aac5e59cae\\})|(\\{f94ec34b-5590-4518-8546-c1c3a94a5731\\})|(\\{5d4c049e-7433-485a-ac62-dd6e41af1a73\\})|(\\{507f643d-6db8-47fe-af9c-7a7b85a86d83\\})|(\\{5c56eeb4-f97c-4b0d-a72f-8e639fbaf295\\})|(\\{2ef98f55-1e26-40d3-a113-a004618a772e\\})|(\\{77d58874-d516-4b00-b68a-2d987ef83ec5\\})|(\\{7a0755d3-3ba2-4b19-98ce-efcdc36423fc\\})|(\\{47ee3ba1-8974-4f71-b8a4-8033d8c2155f\\})|(\\{a477f774-bc36-4cc8-85bd-99f6b04ea255\\})|(\\{1a2e41e3-4343-4a00-90cd-ce77ac77a8af\\})|(\\{7b180e9a-afd6-4693-94a1-c7b5ed9b46fa\\})|(\\{51f76862-f222-414d-8724-6063f61bbabf\\})|(\\{d47a0c63-ac4c-48ce-8fc7-c5abc81d7f75\\})|(\\{b8adf653-f262-413c-b955-100213b105ad\\})|(\\{ccedf35b-dfd6-417a-80de-fb432948861d\\})|(\\{70e29b0e-7cd8-40df-b560-cf6eb066350d\\})|(\\{9926f8ad-b4c3-4122-a033-1b8a5db416db\\})|(\\{62eefb1c-a2d8-40ba-ab94-9fc2f2d31b2f\\})|(\\{17f14919-00bd-44a4-8c14-78ab9728038f\\})|(\\{20e36a3e-672c-4448-9efb-5750cbffe90c\\})|(\\{6070c95f-6460-4ffd-9846-2bbd7238697f\\})|(\\{1edb8a4e-f105-4623-9e19-e40fb082b132\\})|(\\{223a1503-772d-45eb-8cb8-e2e49563703d\\})|(\\{59e0f01c-1f70-445c-a572-7be5d85549bd\\})|(\\{8ec160b7-1089-4944-a999-a1d6afa71c5d\\})|(\\{d2d111d6-0ea1-4880-ae7b-2e82dff3a719\\})|(\\{cfacacd6-191c-46c4-b78c-8a48289b2829\\})|(\\{1155e72f-2b21-433f-ba9a-5af6ed40c8ee\\})|(\\{583910bd-759f-40f6-b96a-1d678d65650f\\}))$/","prefs":[],"schema":1545162093238,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1514865","why":"Remote script injection and data exfiltration","name":"Various add-ons using .cool domains"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"53168513-103a-4ea0-a48f-bc291354cc9f","last_modified":1545232187960},{"guid":"{56a1e8d2-3ced-4919-aca5-ddd58e0f31ef}","prefs":[],"schema":1544470901949,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491312","why":"The add-on introduces unwanted functionality for users.","name":"Web Guard (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1dc366d6-c774-4eca-af19-4f9495c2c55e","last_modified":1544544484935},{"guid":"/^((\\{a99e680b-4349-42a5-b292-79b349bf4f3d\\})|(\\{f09a2393-1e6d-4ae4-a020-4772e94040ae\\})|(\\{c9ed9184-179f-485f-adb8-8bd8e9b7cee6\\})|(\\{085e53da-25a2-4162-906e-6c158ec977ac\\})|(\\{bd6960ba-7c06-493b-8cc4-0964a9968df5\\})|(\\{6eeec42e-a844-4bfd-a380-cfbfc988bd78\\})|(\\{3bbfb999-1c82-422e-b7a8-9e04649c7c51\\})|(\\{bfd229b6-089d-49e8-a09c-9ad652f056f6\\})|(\\{ab23eb77-1c96-4e20-b381-14dec82ee9b8\\})|(\\{ebcce9f0-6210-4cf3-a521-5c273924f5ba\\})|(\\{574aba9d-0573-4614-aec8-276fbc85741e\\})|(\\{12e75094-10b0-497b-92af-5405c053c73b\\})|(\\{99508271-f8c0-4ca9-a5f8-ee61e4bd6e86\\})|(\\{831beefc-cd8c-4bd5-a581-bba13d374973\\})|(\\{c8fe42db-b7e2-49e6-98c4-14ac369473a4\\})|(\\{f8927cca-e6cb-4faf-941d-928f84eb937f\\})|(\\{17e9f867-9402-4b19-8686-f0c2b02d378f\\})|(\\{f12ac367-199b-4cad-8e5a-0a7a1135cad0\\})|(\\{487003ce-5253-4eab-bf76-684f26365168\\})|(\\{487003ce-5213-2ecb-bf16-684f25365161\\}))$/","prefs":[],"schema":1543088493623,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1509864","why":"Add-ons that track users and load remote code, while pretending to provide cursor customization features.","name":"Various cursor and update add-ons (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a8d942b3-779d-4391-a39c-58c746c13b70","last_modified":1543241996691},{"guid":"{97f19f1f-dbb0-4e50-8b46-8091318617bc}","prefs":[],"schema":1542229276053,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1507191","why":"Fraudulent Adobe Reader add-on","name":"Adobe Reader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"03120522-ee87-4cf8-891a-acfb248536ff","last_modified":1542272674851},{"guid":"/^((video-downloader@vd\\.io)|(image-search-reverse@an\\.br)|(YouTube\\.Downloader@2\\.8)|(eMoji@ems-al\\.io))$/","prefs":[],"schema":1542023230755,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1506560","why":"Add-ons that contain malicious copies of third-party libraries.","name":"Malware containing unwanted behavior"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cd079abe-8e8d-476f-a550-63f75ac09fe8","last_modified":1542025588071},{"guid":"/^({b384b75c-c978-4c4d-b3cf-62a82d8f8f12})|({b471eba0-dc87-495e-bb4f-dc02c8b1dc39})|({36f623de-750c-4498-a5d3-ac720e6bfea3})$/","prefs":[],"schema":1541360505662,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1504619","why":"Add-ons that contain unwanted behavior.","name":"Google Translate (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aa5eefa7-716a-45a6-870b-4697b023d894","last_modified":1541435973146},{"guid":"{80869932-37ba-4dd4-8dfe-2ef30a2067cc}","prefs":[],"schema":1538941301306,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1497161","why":"Malicious page redirection","name":"Iridium (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"dd5b0fa4-48fd-4bf6-943d-34de125bf502","last_modified":1538996335645},{"guid":"admin@vietbacsecurity.com","prefs":[],"schema":1537309741764,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491716","why":"Logging and sending keystrokes to a remote server.","name":"Vietnamese Input Method (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"89d714f6-9f35-4107-b8af-a16777f66337","last_modified":1537309752952},{"guid":"Safe@vietbacsecurity.com","prefs":[],"schema":1537309684266,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491717","why":"Logging and sending keystrokes to a remote server.","name":"SafeKids (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c651780e-c185-4d6c-b509-d34673c158a3","last_modified":1537309741758},{"guid":"/^((\\{c9226c62-9948-4038-b247-2b95a921135b\\})|(\\{5de34d4f-b891-4575-b54b-54c53b4e6418\\})|(\\{9f7ac3be-8f1c-47c6-8ebe-655b29eb7f21\\})|(\\{bb33ccaf-e279-4253-8946-cfae19a35aa4\\}))$/","prefs":[],"schema":1537305338753,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491298","why":"These add-ons inject remote malicious scripts on Google websites.","name":"Dll and similar (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"54b3e69a-40ae-4be5-b7cf-cf51c526dcfb","last_modified":1537306138745},{"guid":"updater-pro-unlisted@mozilla.com","prefs":[],"schema":1537305285414,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1491306","why":"Redirects search queries.","name":"Updater Pro (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3108c151-9f25-4eca-8d80-a2fbb2d9bd07","last_modified":1537305338747},{"guid":"/^((\\{686fc9c5-c339-43db-b93a-5181a217f9a6\\})|(\\{eb4b28c8-7f2d-4327-a00c-40de4299ba44\\})|(\\{58d735b4-9d6c-4e37-b146-7b9f7e79e318\\})|(\\{ff608c10-2abc-415c-9fe8-0fdd8e988de8\\})|(\\{5a8145e2-6cbb-4509-a268-f3121429656c\\})|(\\{6d451f29-1d6b-4c34-a510-c1234488b0a3\\})|(\\{de71f09a-3342-48c5-95c1-4b0f17567554\\})|(\\{df106b04-984e-4e27-97b6-3f3150e98a9e\\})|(\\{70DE470A-4DC0-11E6-A074-0C08D310C1A8\\})|(\\{4dcde019-2a1b-499b-a5cd-322828e1279b\\})|(\\{1ec3563f-1567-49a6-bb5c-75d52334b01c\\})|(\\{c140c82e-98e6-49fd-ae17-0627e6f7c5e1\\})|(\\{2581c1f6-5ad9-48d4-8008-4c37dcea1984\\})|(\\{a2bcc6f7-14f7-4083-b4b0-c335edc68612\\})|(\\{4c726bb6-a2af-44ed-b498-794cfd8d8838\\})|(\\{fa6c39a6-cd11-477b-966d-f388f0ba4203\\})|(\\{26c7bd04-18d3-47f5-aeec-bb54e562acf2\\})|(\\{7a961c90-2071-4f94-9d9a-d4e3bbf247c0\\})|(\\{a0481ea2-03f0-4e56-a0e1-030908ecb43e\\})|(\\{c98fb54e-d25f-43f4-bd72-dfaa736391e2\\})|(\\{da57263d-adfc-4768-91f7-b3b076c20d63\\})|(\\{3abb352c-8735-4fb6-9fd6-8117aea3d705\\})|(contactus@unzipper\\.com)|(\\{a1499769-6978-4647-ac0f-78da4652716d\\})|(\\{581D0A4C-1013-11E7-938B-FCD2A0406E17\\})|(\\{68feffe4-bfd8-4fc3-8320-8178a3b7aa67\\})|(\\{823489ae-1bf8-4403-acdd-ea1bdc6431da\\})|(\\{4c0d11c3-ee81-4f73-a63c-da23d8388abd\\})|(\\{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f\\})|(\\{21f29077-6271-46fc-8a79-abaeedb2002b\\})|(\\{55d15d4d-da76-44ab-95a3-639315be5ef8\\})|(\\{edfbec6b-8432-4856-930d-feb334fb69c1\\})|(\\{f81a3bf7-d626-48cf-bd24-64e111ddc580\\})|(\\{4407ab94-60ae-4526-b1ab-2521ffd285c7\\})|(\\{4aa2ba11-f87b-4950-8250-cd977252e556\\})|(\\{646b0c4d-4c6f-429d-9b09-37101b36ed1c\\})|(\\{1b2d76f1-4906-42d2-9643-0ce928505dab\\})|(\\{1869f89d-5f15-4c0d-b993-2fa8f09694fb\\})|(\\{7e4edd36-e3a6-4ddb-9e98-22b4e9eb4721\\})|(\\{e9c9ad8c-84ba-43f2-9ae2-c1448694a2a0\\})|(\\{6b2bb4f0-78ea-47c2-a03a-f4bf8f916eda\\})|(\\{539e1692-5841-4ac6-b0cd-40db15c34738\\}))$/","prefs":[],"schema":1536183366865,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488578","why":"These add-ons take away user control by redirecting search.","name":"Tightrope search add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"81eb67a5-3fdb-448c-aadd-5f4d3b7cf281","last_modified":1536186868443},{"guid":"/^((\\{f01a138a-c051-4bc7-a90a-21151ce05755\\})|(\\{50f78250-63ce-4191-b7c3-e0efc6309b64\\})|(\\{3d2b2ff4-126b-4874-a57e-ed7dac670230\\})|(\\{e7c1abd4-ec8e-4519-8f3a-7bd763b8a353\\})|(\\{4d40bf75-fbe2-45f6-a119-b191c2dd33b0\\})|(\\{08df7ff2-dee0-453c-b85e-f3369add18ef\\}))$/","prefs":[],"schema":1535990752587,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1488248","why":"Add-ons that inject malicious remote code.","name":"Various Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"67f72634-e170-4860-a5a3-133f160ebc32","last_modified":1535992146430},{"guid":"/^((\\{1cfaec8b-a1cb-4fc5-b139-897a22a71390\\})|(\\{2ed89659-09c1-4280-9dd7-1daf69272a86\\})|(\\{5c82f5cc-31f8-4316-bb7d-45a5c05227e6\\})|(\\{6a98a401-378c-4eac-b93c-da1036a00c6c\\})|(\\{6d83ebde-6396-483c-b078-57c9d445abfa\\})|(\\{07efb887-b09f-4028-8f7f-c0036d0485ea\\})|(\\{36f4882f-ff0b-4865-8674-ef02a937f7da\\})|(\\{61dea9e9-922d-4218-acdd-cfef0fdf85e7\\})|(\\{261be583-9695-48e0-bd93-a4feafaa18e6\\})|(\\{401ae092-6c5c-4771-9a87-a6827be80224\\})|(\\{534b7a84-9fc6-4d7c-9d67-e3365d2ae088\\})|(\\{552a949f-6d0e-402d-903d-1550075541ba\\})|(\\{579b8de8-c461-4301-ab09-695579f9b7c7\\})|(\\{754d3be3-7337-488e-a5bb-86487e495495\\})|(\\{2775f69b-75e4-46cb-a5aa-f819624bd9a6\\})|(\\{41290ec4-b3f0-45ad-b8f3-7bcbca01ed0d\\})|(\\{0159131f-d76f-4365-81cd-d6831549b90a\\})|(\\{01527332-1170-4f20-a65b-376e25438f3d\\})|(\\{760e6ff0-798d-4291-9d5f-12f48ef7658b\\})|(\\{7e31c21c-156a-4783-b1ce-df0274a89c75\\})|(\\{8e247308-a68a-4280-b0e2-a14c2f15180a\\})|(\\{b6d36fe8-eca1-4d85-859e-a4cc74debfed\\})|(\\{bab0e844-2979-407f-9264-c87ebe279e72\\})|(\\{d00f78fe-ee73-4589-b120-5723b9a64aa0\\})|(\\{d59a7294-6c08-4ad5-ba6d-a3bc41851de5\\})|(\\{d145aa5b-6e66-40cb-8a08-d55a53fc7058\\})|(\\{d79962e3-4511-4c44-8a40-aed6d32a53b1\\})|(\\{e3e2a47e-7295-426f-8517-e72c31da3f23\\})|(\\{e6348f01-841d-419f-8298-93d6adb0b022\\})|(\\{eb6f8a22-d96e-4727-9167-be68c7d0a7e9\\})|(\\{fdd72dfe-e10b-468b-8508-4de34f4e95e3\\}))$/","prefs":[],"schema":1535830899087,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487472","why":"Several add-ons that change forcefully override search settings.","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"43f11241-88e3-4139-9f02-ac39489a241f","last_modified":1535990735167},{"guid":"/^((\\{35253b0b-8109-437f-b8fa-d7e690d3bde1\\})|(\\{0c8d774c-0447-11e7-a3b1-1b43e3911f03\\})|(\\{c11f85de-0bf8-11e7-9dcd-83433cae2e8e\\})|(\\{f9f072c8-5357-11e7-bb4c-c37ea2335fb4\\})|(\\{b6d09408-a35e-11e7-bc48-f3e9438e081e\\}))$/","prefs":[],"schema":1535658090284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486754","why":"Add-ons that execute remote malicious code.","name":"Several malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"56bd2f99-57eb-4904-840a-23ca155d93ad","last_modified":1535701073599},{"guid":"/^((fireAnalytics\\.download@mozilla\\.com)|(fireabsorb@mozilla\\.com)|(fireaccent@mozilla\\.com)|(fireaccept@mozilla\\.com)|(fireads@mozilla\\.com)|(firealerts@mozilla\\.com)|(fireapi@mozilla\\.com)|(fireapp@mozilla\\.com)|(fireattribution@mozilla\\.com)|(fireauthenticator@mozilla\\.com)|(firecalendar@mozilla\\.com)|(firemail@mozilla\\.com)|(firemarketplace@mozilla\\.com)|(firequestions@mozilla\\.com)|(firescript@mozilla\\.com)|(firesheets@mozilla\\.com)|(firespam@mozilla\\.com)|(firesuite@mozilla\\.com)|(\\{3b6dfc8f-e8ed-4b4c-b616-bdc8c526ac1d\\})|(\\{834f87db-0ff7-4518-89a0-0167a963a869\\})|(\\{4921fe4d-fbe6-4806-8eed-346d7aff7c75\\})|(\\{07809949-bd7d-40a6-a17b-19807448f77d\\})|(\\{68968617-cc8b-4c25-9c38-34646cdbe43e\\})|(\\{b8b2c0e1-f85d-4acd-aeb1-b6308a473874\\})|(\\{bc0b3499-f772-468e-9de6-b4aaf65d2bbb\\}))$/","prefs":[],"schema":1535555549913,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1486636","why":"Add-ons that hijack search settings.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"fcd12629-43df-4751-9654-7cc008f8f7c0","last_modified":1535555562143},{"guid":"/^((\\{25211004-63e4-4a94-9c71-bdfeabb72bfe\\})|(\\{cbf23b92-ea55-4ca9-a5ae-f4197e286bc8\\})|(\\{7ac0550e-19cb-4d22-be12-b0b352144b33\\})|(Mada111@mozilla\\.com)|(\\{c71709a9-af59-4958-a587-646c8c314c16\\})|(\\{6ac3f3b4-18db-4f69-a210-7babefd94b1e\\})|(addon@fastsearch\\.me)|(\\{53d152fa-0ae0-47f1-97bf-c97ca3051562\\})|(\\{f9071611-24ee-472b-b106-f5e2f40bbe54\\})|(\\{972920f1-3bfd-4e99-b605-8688a94c3c85\\})|(\\{985afe98-fa74-4932-8026-4bdc880552ac\\})|(\\{d96a82f5-5d3e-46ed-945f-7c62c20b7644\\})|(\\{3a036dc5-c13b-499a-a62d-e18aab59d485\\})|(\\{49574957-56c6-4477-87f1-1ac7fa1b2299\\})|(\\{097006e8-9a95-4f7c-9c2f-59f20c61771c\\})|(\\{8619885d-0380-467a-b3fe-92a115299c32\\})|(\\{aa0587d6-4760-4abe-b3a1-2a5958f46775\\})|(\\{bdada7ae-cf89-46cf-b1fe-f3681f596278\\})|(\\{649bead3-df51-4023-8090-02ceb2f7095a\\})|(\\{097c3142-0b68-416a-9919-9dd576aedc17\\})|(\\{bc3cced8-51f0-4519-89ee-56706b67ea4b\\})|(\\{796da6e3-01c0-4c63-96dd-1737710b2ff6\\}))$/","prefs":[],"schema":1535485297866,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1487083","why":"Add-ons that hijack search settings and contain other unwanted features.","name":"Vairous malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"016676cc-c381-4c01-adcf-2d46f48142d0","last_modified":1535550828514},{"guid":"/^((Timemetric@tmetric)|(image-fastpicker@eight04.blogspot\\.com)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({0ff32ce0-dee9-4e7e-9260-65e58373e21d})|({4ca00873-7e8d-4ada-b460-96cad0eb8fa9})|({6b427f73-2ee1-4256-b69d-7dc253ebe030})|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({40a9d23b-09ef-4c82-ae1d-7fc5c067e987})|({205c2185-ebe4-4106-92ab-0ffa7c4efcbb})|({256ec7b0-57b4-416d-91c1-2bfdf01b2438})|({568db771-c718-4587-bcd0-e3728ee53550})|({5782a0f1-de26-42e5-a5b3-dae9ec05221b})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({3e6586e2-7410-4f10-bba0-914abfc3a0b4})|({b3f06312-93c7-4a4f-a78b-f5defc185d8f})|({c1aee371-4401-4bab-937a-ceb15c2323c1})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({d0aa0ad2-15ed-4415-8ef5-723f303c2a67})|({d8157e0c-bf39-42eb-a0c3-051ff9724a8c})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1535356061028,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485145","why":"Add-ons that run remote malicious code from websites that trick the user into installing the add-on.","name":"Malware running remote malicious code"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a0d44ee3-9492-47d7-ac1c-35f520e819ae","last_modified":1535393877555},{"guid":"/^((fastplayer@fastsearch\\.me)|(ff-search-flash-unlisted@mozilla\\.com)|(inspiratiooo-unlisted@mozilla\\.com)|(lite-search-ff-unlisted@mozilla\\.com)|(mysearchprotect-unlisted@mozilla\\.com)|(pdfconverter-unlisted@mozilla\\.com)|(plugin-search-ff-unlisted@mozilla\\.com)|(pro-search-ff-unlisted@mozilla\\.com)|(pro-search-unlisted@mozilla\\.com)|(searchincognito-unlisted@mozilla\\.com)|(socopoco-search@mozilla\\.com)|(socopoco-unlisted@mozilla\\.com)|(\\{08ea1e08-e237-42e7-ad60-811398c21d58\\})|(\\{0a56e2a0-a374-48b6-9afc-976680fab110\\})|(\\{193b040d-2a00-4406-b9ae-e0d345b53201\\})|(\\{1ffa2e79-7cd4-4fbf-8034-20bcb3463d20\\})|(\\{528cbbe2-3cde-4331-9344-e348cb310783\\})|(\\{6f7c2a42-515a-4797-b615-eaa9d78e8c80\\})|(\\{be2a3fba-7ea2-48b9-bbae-dffa7ae45ef8\\})|(\\{c0231a6b-c8c8-4453-abc9-c4a999a863bd\\}))$/","prefs":[],"schema":1535139689975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483854","why":"Add-ons overwriting search changes without consent and remote script injection","name":"\"Flash Updater\" and search redirectors"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"46779b5a-2369-4007-bff0-857a657626ba","last_modified":1535153064735},{"guid":"/^(({aeac6f90-5e17-46fe-8e81-9007264b907d})|({6ee25421-1bd5-4f0c-9924-79eb29a8889d})|({b317fa11-c23d-45b9-9fd8-9df41a094525})|({16ac3e8f-507a-4e04-966b-0247a196c0b4}))$/","prefs":[],"schema":1534946831027,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485609","why":"Add-ons that take away user control by changing search settings.","name":"Search hijacking malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ab029019-0e93-450a-8c11-ac31556c2a77","last_modified":1535020847820},{"guid":"@testpilot-addon","prefs":[],"schema":1534876689555,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1485083","why":"Older versions of the TestPilot add-on cause stability issues in Firefox.","name":"Testpilot (old, broken versions)"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.8-dev-259fe19","minVersion":"0"}],"id":"ee2d12a4-ea1d-4f3d-9df1-4303e8993f18","last_modified":1534946810180},{"guid":"/^((@svuznnqyxinw)|(myprivacytools@besttools\\.com)|(powertools@penprivacy\\.com)|(privacypro@mybestprivacy\\.com)|(realsecure@top10\\.com)|(rlbvpdfrlbgx@scoutee\\.net)|(vfjkurlfijwz@scoutee\\.net))$/","prefs":[],"schema":1534382102271,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1482322","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"df852b6a-28be-4b10-9285-869f4761f111","last_modified":1534382538298},{"guid":"/^(({1a3fb414-0945-405c-a62a-9fe5e1a50c69})|({1a45f6aa-d80a-4317-84d2-0ce43671b08a})|({2d52a462-8bec-4708-9cd1-894b682bdc78})|({3f841cfc-de5a-421f-8bd7-2bf1d943b02a})|({5c7601bf-522b-47e5-b0f0-ea0e706af443})|({7ebe580f-71c9-4ef8-8073-f38deaeb9dfb})|({8b2188fd-1daf-4851-b387-28d964014353})|({8cee42ac-f1fe-40ae-aed6-24e3b76b2f77})|({8d13c4a9-5e8c-47a6-b583-681c83164ac9})|({9b1d775a-1877-45c9-ad48-d6fcfa4fff39})|({9efdbe5f-6e51-4a35-a41b-71dc939e6221})|({23f63efb-156e-440b-a96c-118bebc21057})|({026dfc8c-ecc8-41ba-b45f-70ffbd5cc672})|({34aa433c-27e9-4c87-a662-9f82f99eb9af})|({36f34d69-f22f-47c3-b4cd-4f37b7676107})|({39bd8607-0af4-4d6b-bd69-9a63c1825d3c})|({48c6ad6d-297c-4074-8fef-ca5f07683859})|({54aa688d-9504-481d-ba75-cfee421b98e0})|({59f59748-e6a8-4b41-87b5-9baadd75ddef})|({61d99407-1231-4edc-acc8-ab96cbbcf151})|({68ca8e3a-397a-4135-a3af-b6e4068a1eae})|({71beafd6-779b-4b7d-a78b-18a107277b59})|({83ed90f8-b07e-4c45-ba6b-ba2fe12cebb6})|({231dfb44-98e0-4bc4-b6ee-1dac4a836b08})|({273f0bce-33f4-45f6-ae03-df67df3864c2})|({392f4252-c731-4715-9f8d-d5815f766abb})|({484ec5d0-4cfd-4d96-88d0-a349bfc33780})|({569dbf47-cc10-41c4-8fd5-5f6cf4a833c7})|({578cad7a-57d5-404d-8dda-4d30de33b0c2})|({986b2c3f-e335-4b39-b3ad-46caf809d3aa})|({1091c11f-5983-410e-a715-0968754cff54})|({2330eb8a-e3fe-4b2e-9f17-9ddbfb96e6f5})|({5920b042-0af1-4658-97c1-602315d3b93d})|({6331a47f-8aae-490c-a9ad-eae786b4349f})|({6698b988-c3ef-4e1f-8740-08d52719eab5})|({30516f71-88d4-489b-a27f-d00a63ad459f})|({12089699-5570-4bf6-890f-07e7f674aa6e})|({84887738-92bf-4903-a5e8-695fd078c657})|({8562e48e-3723-412a-9ebd-b33d3d3b29dd})|({6e449795-c545-41be-92c0-5d467c147389})|({1e369c7c-6b61-436e-8978-4640687670d6})|({a03d427a-bd2e-42b6-828f-a57f38fac7b5})|({a77fc9b9-6ebb-418d-b0b6-86311c191158})|({a368025b-9828-43a1-8a5c-f6fab61c9be9})|({b1908b02-410d-4778-8856-7e259fbf471d})|({b9425ace-c2e9-4ec4-b564-4062546f4eca})|({b9845b5d-70c9-419c-a9a5-98ea8ee5cc01})|({ba99fee7-9806-4e32-8257-a33ffc3b8539})|({bdf8767d-ae4c-4d45-8f95-0ba29b910600})|({c6c4a718-cf91-4648-aa9b-170d66163cf2})|({ca0f2988-e1a8-4e83-afde-0dca56a17d5f})|({cac5db09-979b-40e3-8c8e-d96397b0eecb})|({d3b5280b-f8d8-4669-bdf6-91f23ae58042})|({d73d2f6a-ea24-4b1b-8c76-563fce9f786d})|({d77fed37-85c0-4b94-89bb-0d2849472b8d})|({d371abec-84bb-481b-acbf-235639451127})|({de47a3b4-dad1-4f4a-bdd6-8666586e29e8})|({ded6afad-2aaa-446b-b6bd-b12a8a61c945})|({e0c3a1ca-8e21-4d1b-b53b-ea115cf59172})|({e6bbf496-6489-4b48-8e5a-799aad4aa742})|({e63b262a-f9b8-4496-9c4b-9d3cbd6aea90})|({e73c1b5d-20f7-4d86-ad16-9de3c27718e2})|({eb01dc49-688f-4a21-aa8d-49bd88a8f319})|({edc9816b-60b4-493c-a090-01125e0b8018})|({effa2f97-0f07-44c8-99cb-32ac760a0621})|({f6e6fd9b-b89f-4e8d-9257-01405bc139a6})|({ff87977a-fefb-4a9d-b703-4b73dce8853d})|({ffea9e62-e516-4238-88a7-d6f9346f4955}))$/","prefs":[],"schema":1534335096640,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483191","why":"Add-ons that change the default search engine, taking away user control.","name":"Search hijacking add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d9892a76-b22e-40bd-8073-89b0f8110ec7","last_modified":1534336165428},{"guid":"/^((Timemetric@tmetric)|(textMarkertool@underFlyingBirches\\.org)|(youpanel@jetpack)|({6f13489d-b274-45b6-80fa-e9daa140e1a4})|({568db771-c718-4587-bcd0-e3728ee53550})|({829827cd-03be-4fed-af96-dd5997806fb4})|({9077390b-89a9-41ad-998f-ab973e37f26f})|({8e7269ac-a171-4d9f-9c0a-c504848fd52f})|({aaaffe20-3306-4c64-9fe5-66986ebb248e})|({bf153de7-cdf2-4554-af46-29dabfb2aa2d})|({c579191c-6bb8-4795-adca-d1bf180b512d})|({e2a4966f-919d-4afc-a94f-5bd6e0606711})|({ee97f92d-1bfe-4e9d-816c-0dfcd63a6206}))$/","prefs":[],"schema":1534275699570,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1483206","why":"Add-ons that execute malicious remote code","name":"Various malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2734325e-143b-4962-98bf-4b18c77407e2","last_modified":1534334500118},{"guid":"{5834f62d-6164-4cdd-a0a3-c00c66ec9d13}","prefs":[],"schema":1532704368947,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1479002","why":"This add-on violates our security and user-choice/no surprises policies.","name":"Youtube Dark Mode (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d0a401cb-0c70-4784-8288-b06a88b2ae8a","last_modified":1532705151926},{"guid":"/^((@asdfjhsdfuhw)|(@asdfsdfwe)|(@asdieieuss)|(@dghfghfgh)|(@difherk)|(@dsfgtftgjhrdf4)|(@fidfueir)|(@fsgergsdqtyy)|(@hjconsnfes)|(@isdifvdkf)|(@iweruewir)|(@oiboijdjfj)|(@safesearchavs)|(@safesearchavsext)|(@safesearchincognito)|(@safesearchscoutee)|(@sdfykhhhfg)|(@sdiosuff)|(@sdklsajd)|(@sduixcjksd)|(@sicognitores)|(@simtabtest)|(@sodiasudi)|(@test13)|(@test131)|(@test131ver)|(@test132)|(@test13s)|(@testmptys)|(\\{ac4e5b0c-13c4-4bfd-a0c3-1e73c81e8bac\\})|(\\{e78785c3-ec49-44d2-8aac-9ec7293f4a8f\\})|(general@filecheckerapp\\.com)|(general@safesearch\\.net))$/","prefs":[],"schema":1532703832328,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1475330","why":"These Add-ons violate our data collection, no surprises and user-choice policies.","name":"Safesearch (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"d664412d-ed08-4892-b247-b007a70856ff","last_modified":1532704364007},{"guid":"{dd3d7613-0246-469d-bc65-2a3cc1668adc}","prefs":[],"schema":1532684052432,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"BlockSite"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.3","minVersion":"0"}],"id":"e04f98b5-4480-43a3-881d-e509e4e28cdc","last_modified":1532684085999},{"guid":"{bee8b1f2-823a-424c-959c-f8f76c8b2306}","prefs":[],"schema":1532547689407,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1478731","why":"This add-on violates data practices outlined in the review policy.","name":"Popup blocker for FireFox"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.0.7.3","minVersion":"0"}],"id":"f0713a5e-7208-484e-b3a0-4e6dc6a195be","last_modified":1532684052426},{"guid":"/^((\\{39bd8607-0af4-4d6b-bd69-9a63c1825d3c\\})|(\\{273f0bce-33f4-45f6-ae03-df67df3864c2\\})|(\\{a77fc9b9-6ebb-418d-b0b6-86311c191158\\})|(\\{c6c4a718-cf91-4648-aa9b-170d66163cf2\\})|(\\{d371abec-84bb-481b-acbf-235639451127\\})|(\\{e63b262a-f9b8-4496-9c4b-9d3cbd6aea90\\}))$/","prefs":[],"schema":1532386339902,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1477950","why":"Add-ons that contain malicious functionality like search engine redirect.","name":"Smash (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c37c7c24-e738-4d06-888c-108b4d63b428","last_modified":1532424286908},{"guid":"/^((\\{ac296b47-7c03-486f-a1d6-c48b24419749\\})|(\\{1cab8ccf-deff-4743-925d-a47cbd0a6b56\\})|(\\{5da81d3d-5db1-432a-affc-4a2fe9a70749\\})|(\\{071b9878-a7d3-4ae3-8ef0-2eaee1923403\\})|(\\{261476ea-bd0e-477c-abd7-33cdf626f81f\\})|(\\{224e66d0-6b11-4c4b-9bcf-41180889898a\\})|(\\{1e90cf52-c67c-4bd9-80c3-a2bf521fc981\\})|(\\{09c4799c-00f1-439e-9e60-3827c589b372\\})|(\\{d3d2095a-9faa-466f-82ae-3114179b34d6\\})|(\\{70389ea5-7e4d-4515-835c-fbd047f229dd\\})|(\\{2e8083a5-cd88-4aaa-bb8b-e54e9753f280\\})|(\\{fbf2480b-5c19-478e-bfd0-192ad9f84dc9\\})|(\\{6c7dc694-89f8-477e-88d5-c55af4d6a846\\})|(\\{915c12c6-901a-490d-9bfc-20f00d1ad31d\\})|(\\{d3a4aa3e-f74c-4382-876d-825f592f2976\\})|(\\{0ad91ec1-f7c4-4a39-9244-3310e9fdd169\\})|(\\{9c17aa27-63c5-470a-a678-dc899ab67ed3\\})|(\\{c65efef2-9988-48db-9e0a-9ff8164182b6\\})|(\\{d54c5d25-2d51-446d-8d14-18d859e3e89a\\})|(\\{e458f1f1-a331-4486-b157-81cba19f0993\\})|(\\{d2de7e1f-6e51-41d6-ba8a-937f8a5c92ff\\})|(\\{2b08a649-9bea-4dd4-91c8-f53a84d38e19\\})|(\\{312dd57e-a590-4e19-9b26-90e308cfb103\\})|(\\{82ce595a-f9b6-4db8-9c97-b1f1c933418b\\})|(\\{0a2e64f0-ea5a-4fff-902d-530732308d8e\\})|(\\{5fbdc975-17ab-4b4e-90d7-9a64fd832a08\\})|(\\{28820707-54d8-41f0-93e9-a36ffb2a1da6\\})|(\\{64a2aed1-5dcf-4f2b-aad6-9717d23779ec\\})|(\\{ee54794f-cd16-4f7d-a7dd-515a36086f60\\})|(\\{4d381160-b2d5-4718-9a05-fc54d4b307e7\\})|(\\{60393e0e-f039-4b80-bad4-10189053c2ab\\})|(\\{0997b7b2-52d7-4d14-9aa6-d820b2e26310\\})|(\\{8214cbd6-d008-4d16-9381-3ef1e1415665\\})|(\\{6dec3d8d-0527-49a3-8f12-b05f2a8b95b2\\})|(\\{0c0d8d8f-3ae0-4c98-81ac-06453a316d16\\})|(\\{84d5ef02-a283-484a-80da-7087836c74aa\\})|(\\{24413756-2c44-47c5-8bbf-160cb37776d8\\})|(\\{cf6ac458-06e8-45d0-9cbf-ec7fc0eb1710\\})|(\\{263a5792-933a-4de1-820a-d04198e17120\\})|(\\{b5fd7f37-190d-4c0a-b8dd-8b4850c986ac\\})|(\\{cb5ef07b-c2e7-47a6-be81-2ceff8df4dd5\\})|(\\{311b20bc-b498-493c-a5e1-22ec32b0e83c\\})|(\\{b308aead-8bc1-4f37-9324-834b49903df7\\})|(\\{3a26e767-b781-4e21-aaf8-ac813d9edc9f\\}))$/","prefs":[],"schema":1532361925873,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1476553","why":"Third-party websites try to trick users into installing add-ons that inject remote scripts.","name":"Various malicious add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"52842139-3d11-41ac-9d7f-8e51122a3141","last_modified":1532372344457},{"guid":"{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}","prefs":[],"schema":1530711142817,"blockID":"i1900","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1472948","why":"This add-on violates data practices outlined in the review policy.","name":"Stylish"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.1","minVersion":"3.0.0"}],"id":"c635229f-7aa0-44c5-914f-80c590949071","last_modified":1530716488758},{"guid":"/^(contactus@unzipper.com|{72dcff4e-48ce-41d8-a807-823adadbe0c9}|{dc7d2ecc-9cc3-40d7-93ed-ef6f3219bd6f}|{994db3d3-ccfe-449a-81e4-f95e2da76843}|{25aef460-43d5-4bd0-aa3d-0a46a41400e6}|{178e750c-ae27-4868-a229-04951dac57f7})$/","prefs":[],"schema":1528400492025,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1460331","why":"Add-ons change search settings against our policies, affecting core Firefox features. Add-on is also reportedly installed without user consent.","name":"SearchWeb"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5afea853-d029-43f3-a387-64ce9980742a","last_modified":1528408770328},{"guid":"{38363d75-6591-4e8b-bf01-0270623d1b6c}","prefs":[],"schema":1526326889114,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461625","why":"This add-on contains abusive functionality.","name":"Photobucket Hotlink Fix"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0f0764d5-a290-428b-a5b2-3767e1d72c71","last_modified":1526381862851},{"guid":"@vkmad","prefs":[],"schema":1526154098016,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1461410","why":"This add-on includes malicious functionality.","name":"VK Universal Downloader (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cbfa5303-c1bf-49c8-87d8-259738a20064","last_modified":1526322954850},{"guid":"/((@extcorp\\.[a-z]+)|(@brcorporation\\.com)|(@brmodcorp\\.com)|(@teset\\.com)|(@modext\\.tech)|(@ext?mod\\.net)|(@browcorporation\\.org)|(@omegacorporation\\.org)|(@browmodule\\.com)|(@corpext\\.net)|({6b50ddac-f5e0-4d9e-945b-e4165bfea5d6})|({fab6484f-b8a7-4ba9-a041-0f948518b80c})|({b797035a-7f29-4ff5-bd19-77f1b5e464b1})|({0f612416-5c5a-4ec8-b482-eb546af9cac4}))$/","prefs":[],"schema":1525290095999,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1458330","why":"These are malicious add-ons that inject remote scripts and use deceptive names.","name":"\"Table\" add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3ab9f100-e253-4080-b3e5-652f842ddb7a","last_modified":1525377099954},{"guid":"/^({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({dfa77d38-f67b-4c41-80d5-96470d804d09})$/","prefs":[],"schema":1524146566650,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1455291","why":"These add-ons claim to be the flash plugin.","name":"Flash Plugin (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"96b137e6-8cb5-44d6-9a34-4a4a76fb5e38","last_modified":1524147337556},{"guid":"/^({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|(@googledashboard)|(@smashdashboard)|(@smash_tv)|(@smash_mov)|(@smashmovs)|(@smashtvs)|(@FirefoxUpdate)|({92b9e511-ac81-4d47-9b8f-f92dc872447e})|({3c841114-da8c-44ea-8303-78264edfe60b})|({116a0754-20eb-4fe5-bd35-575867a0b89e})|({6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b})|({f992ac88-79d3-4960-870e-92c342ed3491})|({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|({a512297e-4d3a-468c-bd1a-f77bd093f925})|({08c28c16-9fb6-4b32-9868-db37c1668f94})|({b4ab1a1d-e137-4c59-94d5-4f509358a81d})|({feedf4f8-08c1-451f-a717-f08233a64ec9})$/","prefs":[],"schema":1524139371832,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454691","why":"This malware prevents itself from getting uninstalled ","name":"Malware"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"feb2d0d7-1b76-4dba-bf84-42873a92af5f","last_modified":1524141477640},{"guid":"{872f20ea-196e-4d11-8835-1cc4c877b1b8}","prefs":[],"schema":1523734896380,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1454413","why":"Extension claims to be Flash Player","name":"Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"1e5f5cb2-346c-422a-9aaa-29d8760949d2","last_modified":1523897202689},{"guid":"adbeaver@adbeaver.org","prefs":[],"schema":1521630548030,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1445031","why":"This add-on generates numerous errors when loading Facebook, caused by ad injection included in it. Users who want to continue using this add-on can enable it in the Add-ons Manager.","name":"AdBeaver"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"baf7f735-d6b6-410a-8cc8-25c60f7c57e2","last_modified":1522103097333},{"guid":"{44685ba6-68b3-4895-879e-4efa29dfb578}","prefs":[],"schema":1521565140013,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1447042","why":"This add-on impersonates a Flash tool and runs remote code on users' systems.","name":"FF Flash Manager"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"547037f2-97ae-435a-863c-efd7532668cd","last_modified":1521630548023},{"guid":"/^(addon@fasterweb\\.com|\\{5f398d3f-25db-47f5-b422-aa2364ff6c0b\\}|addon@fasterp\\.com|addon@calculator)$/","prefs":[],"schema":1520338910918,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443478","why":"These are malicious add-ons that use deceptive names and run remote scripts.","name":"FasterWeb add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f58729ec-f93c-41d9-870d-dd9c9fd811b6","last_modified":1520358450708},{"guid":"{42baa93e-0cff-4289-b79e-6ae88df668c4}","prefs":[],"schema":1520336325565,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1443196","why":"The add-on claims to be \"Adobe Shockwave Flash Player\"","name":"Adobe Shockwave Flash Player (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0cd723fe-d33d-43a0-b84f-7a3cad253212","last_modified":1520338780397},{"guid":"{f3c31b34-862c-4bc8-a98f-910cc6314a86}","prefs":[],"schema":1519242096699,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1440736","why":"This is a malicious add-on that is masked as an official Adobe Updater and runs malicious code.","name":"Adobe Updater (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"adfd98ef-cebc-406b-b1e0-61bd4c71e4b1","last_modified":1519409417397},{"guid":"/^(\\{fd0c36fa-6a29-4246-810b-0bb4800019cb\\}|\\{b9c1e5bf-6585-4766-93fc-26313ac59999\\}|\\{3de25fff-25e8-40e9-9ad9-fdb3b38bb2f4\\})$/","prefs":[],"schema":1519069296530,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1439432","why":"These are malicious add-ons that are masked as an official Adobe Updater and run malicious code.","name":"Adobe Updater"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4e28ba5c-af62-4e53-a7a1-d33334571cf8","last_modified":1519078890592},{"guid":"/^(\\{01c9a4a4-06dd-426b-9500-2ea6fe841b88\\}|{5e024309-042c-4b9d-a634-5d92cf9c7514\\}|{f4262989-6de0-4604-918f-663b85fad605\\}|{e341ed12-a703-47fe-b8dd-5948c38070e4\\}|{cd89045b-2e06-46bb-9e34-48e8799e5ef2\\}|{ac296b47-7c03-486f-a1d6-c48b24419749\\}|{5da81d3d-5db1-432a-affc-4a2fe9a70749\\}|{df09f268-3c92-49db-8c31-6a25a6643896\\}|{81ac42f3-3d17-4cff-85af-8b7f89c8826b\\}|{09c8fa16-4eec-4f78-b19d-9b24b1b57e1e\\}|{71639610-9cc3-47e0-86ed-d5b99eaa41d5\\}|{83d38ac3-121b-4f28-bf9c-1220bd3c643b\\}|{7f8bc48d-1c7c-41a0-8534-54adc079338f\\})$/","prefs":[],"schema":1518550894975,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1438028","why":"These are malicious add-ons that inject remote scripts into popular websites.","name":"Page Marker add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"cc5848e8-23d5-4655-b45c-dc239839b74e","last_modified":1518640450735},{"guid":"/^(https|youtube)@vietbacsecurity\\.com$/","prefs":[],"schema":1517909997354,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1435974","why":"These add-ons contain malicious functionality, violating the users privacy and security.","name":"HTTPS and Youtube downloader (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"646e2384-f894-41bf-b7fc-8879e0095109","last_modified":1517910100624},{"guid":"{ed352072-ddf0-4cb4-9cb6-d8aa3741c2de}","prefs":[],"schema":1517514097126,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1434893","why":"This is a malicious add-on that injects remote scripts into popular pages while pretending to do something else.","name":"Image previewer"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2104a522-bb2f-4b04-ad0d-b0c571644552","last_modified":1517577111194},{"guid":"/^({be5d0c88-571b-4d01-a27a-cc2d2b75868c})|({3908d078-e1db-40bf-9567-5845aa77b833})|({5b620343-cd69-49b8-a7ba-f9d499ee5d3d})|({6eee2d17-f932-4a43-a254-9e2223be8f32})|({e05ba06a-6d6a-4c51-b8fc-60b461ffecaf})|({a5808da1-5b4f-42f2-b030-161fd11a36f7})|({d355bee9-07f0-47d3-8de6-59b8eecba57b})|({a1f8e136-bce5-4fd3-9ed1-f260703a5582})$/","prefs":[],"schema":1517260691761,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.\n","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"70f37cc7-9f8a-4d0f-a881-f0c56934fa75","last_modified":1517260722621},{"guid":"/^({d78d27f4-9716-4f13-a8b6-842c455d6a46})|({bd5ba448-b096-4bd0-9582-eb7a5c9c0948})|({0b24cf69-02b8-407d-83db-e7af04fc1f3e})|({e08d85c5-4c0f-4ce3-9194-760187ce93ba})|({1c7d6d9e-325a-4260-8213-82d51277fc31})|({8a0699a0-09c3-4cf1-b38d-fec25441650c})|({1e68848a-2bb7-425c-81a2-524ab93763eb})$/","prefs":[],"schema":1517168490224,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"805ee80e-0929-4c92-93ed-062b98053f28","last_modified":1517260691755},{"guid":"/^({abec23c3-478f-4a5b-8a38-68ccd500ec42}|{a83c1cbb-7a41-41e7-a2ae-58efcb4dc2e4}|{62237447-e365-487e-8fc3-64ddf37bdaed}|{b12cfdc7-3c69-43cb-a3fb-38981b68a087}|{1a927d5b-42e7-4407-828a-fdc441d0daae}|{dd1cb0ec-be2a-432b-9c90-d64c824ac371}|{82c8ced2-e08c-4d6c-a12b-3e8227d7fc2a}|{87c552f9-7dbb-421b-8deb-571d4a2d7a21})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"c92f2a05-73eb-454e-9583-f6d2382d8bca","last_modified":1516829074251},{"guid":"/^({618baeb9-e694-4c7b-9328-69f35b6a8839}|{b91fcda4-88b0-4a10-9015-9365e5340563}|{04150f98-2d7c-4ae2-8979-f5baa198a577}|{4b1050c6-9139-4126-9331-30a836e75db9}|{1e6f5a54-2c4f-4597-aa9e-3e278c617d38}|{e73854da-9503-423b-ab27-fafea2fbf443}|{a2427e23-d349-4b25-b5b8-46960b218079}|{f92c1155-97b3-40f4-9d5b-7efa897524bb}|{c8e14311-4b2d-4eb0-9a6b-062c6912f50e}|{45621564-b408-4c29-8515-4cf1f26e4bc3}|{27380afd-f42a-4c25-b57d-b9012e0d5d48})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"2d4fe65b-6c02-4461-baa8-dda52e688cf6","last_modified":1516829040469},{"guid":"/^({4dac7c77-e117-4cae-a9f0-6bd89e9e26ab}|{cc689da4-203f-4a0c-a7a6-a00a5abe74c5}|{0eb4672d-58a6-4230-b74c-50ca3716c4b0}|{06a71249-ef35-4f61-b2c8-85c3c6ee5617}|{5280684d-f769-43c9-8eaa-fb04f7de9199}|{c2341a34-a3a0-4234-90cf-74df1db0aa49}|{85e31e7e-3e3a-42d3-9b7b-0a2ff1818b33}|{b5a35d05-fa28-41b5-ae22-db1665f93f6b}|{1bd8ba17-b3ed-412e-88db-35bc4d8771d7}|{a18087bb-4980-4349-898c-ca1b7a0e59cd}|{488e190b-d1f6-4de8-bffb-0c90cc805b62})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9a3fd797-0ab8-4286-9a1b-2b6c97f9075b","last_modified":1516829006347},{"guid":"/^({f6df4ef7-14bd-43b5-90c9-7bd02943789c}|{ccb7b5d6-a567-40a2-9686-a097a8b583dd}|{9b8df895-fcdd-452a-8c46-da5be345b5bc}|{5cf77367-b141-4ba4-ac2a-5b2ca3728e81}|{ada56fe6-f6df-4517-9ed0-b301686a34cc}|{95c7ae97-c87e-4827-a2b7-7b9934d7d642}|{e7b978ae-ffc2-4998-a99d-0f4e2f24da82}|{115a8321-4414-4f4c-aee6-9f812121b446}|{bf153de7-cdf2-4554-af46-29dabfb2aa2d}|{179710ba-0561-4551-8e8d-1809422cb09f}|{9d592fd5-e655-461a-9b28-9eba85d4c97f})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"aae78cd5-6b26-472e-ab2d-db4105911250","last_modified":1516828973824},{"guid":"/^({30972e0a-f613-4c46-8c87-2e59878e7180}|{0599211f-6314-4bf9-854b-84cb18da97f8}|{4414af84-1e1f-449b-ac85-b79f812eb69b}|{2a8bec00-0ab0-4b4d-bd3d-4f59eada8fd8}|{bea8866f-01f8-49e9-92cd-61e96c05d288}|{046258c9-75c5-429d-8d5b-386cfbadc39d}|{c5d359ff-ae01-4f67-a4f7-bf234b5afd6e}|{fdc0601f-1fbb-40a5-84e1-8bbe96b22502}|{85349ea6-2b5d-496a-9379-d4be82c2c13d}|{640c40e5-a881-4d16-a4d0-6aa788399dd2}|{d42328e1-9749-46ba-b35c-cce85ddd4ace})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"750aa293-3742-46b5-8761-51536afecaef","last_modified":1516828938683},{"guid":"/^({d03b6b0f-4d44-4666-a6d6-f16ad9483593}|{767d394a-aa77-40c9-9365-c1916b4a2f84}|{a0ce2605-b5fc-4265-aa65-863354e85058}|{b7f366fa-6c66-46bf-8df2-797c5e52859f}|{4ad16913-e5cb-4292-974c-d557ef5ec5bb}|{3c3ef2a3-0440-4e77-9e3c-1ca8d48f895c}|{543f7503-3620-4f41-8f9e-c258fdff07e9}|{98363f8b-d070-47b6-acc6-65b80acac4f3}|{5af74f5a-652b-4b83-a2a9-f3d21c3c0010}|{484e0ba4-a20b-4404-bb1b-b93473782ae0}|{b99847d6-c932-4b52-9650-af83c9dae649})$/","prefs":[],"schema":1516828883529,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"a29aed6f-6546-4fa2-8131-df5c9a5427af","last_modified":1516828911059},{"guid":"/^({2bb68b03-b528-4133-9fc4-4980fbb4e449}|{231e58ac-0f3c-460b-bb08-0e589360bec7}|{a506c5af-0f95-4107-86f8-3de05e2794c9}|{8886a262-1c25-490b-b797-2e750dd9f36b}|{65072bef-041f-492e-8a51-acca2aaeac70}|{6fa41039-572b-44a4-acd4-01fdaebf608d}|{87ba49bd-daba-4071-aedf-4f32a7e63dbe}|{95d58338-ba6a-40c8-93fd-05a34731dc0e}|{4cbef3f0-4205-4165-8871-2844f9737602}|{1855d130-4893-4c79-b4aa-cbdf6fee86d3}|{87dcb9bf-3a3e-4b93-9c85-ba750a55831a})$/","prefs":[],"schema":1516822896448,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are malicious add-ons that automatically close the Add-ons Manager.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5c092b0d-7205-43a1-aa75-b7a42372fb52","last_modified":1516828883523},{"guid":"/^({fce89242-66d3-4946-9ed0-e66078f172fc})|({0c4df994-4f4a-4646-ae5d-8936be8a4188})|({6cee30bc-a27c-43ea-ac72-302862db62b2})|({e08ebf0b-431d-4ed1-88bb-02e5db8b9443})$/","prefs":[],"schema":1516650096284,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1432560","why":"These are malicious add-ons that make it hard for the user to be removed.","name":"FF AntiVir Monitoring"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9dfeee42-e6a8-49e0-8979-0648f7368239","last_modified":1516744119329},{"guid":"/^(\\{1490068c-d8b7-4bd2-9621-a648942b312c\\})|(\\{d47ebc8a-c1ea-4a42-9ca3-f723fff034bd\\})|(\\{83d6f65c-7fc0-47d0-9864-a488bfcaa376\\})|(\\{e804fa4c-08e0-4dae-a237-8680074eba07\\})|(\\{ea618d26-780e-4f0f-91fd-2a6911064204\\})|(\\{ce93dcc7-f911-4098-8238-7f023dcdfd0d\\})|(\\{7eaf96aa-d4e7-41b0-9f12-775c2ac7f7c0\\})|(\\{b019c485-2a48-4f5b-be13-a7af94bc1a3e\\})|(\\{9b8a3057-8bf4-4a9e-b94b-867e4e71a50c\\})|(\\{eb3ebb14-6ced-4f60-9800-85c3de3680a4\\})|(\\{01f409a5-d617-47be-a574-d54325fe05d1\\})$/","prefs":[],"schema":1516394914836,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5bf72f70-a611-4845-af3f-d4dabe8862b6","last_modified":1516394982586},{"guid":"/^(\\{ac06c6b2-3fd6-45ee-9237-6235aa347215\\})|(\\{d461cc1b-8a36-4ff0-b330-1824c148f326\\})|(\\{d1ab5ebd-9505-481d-a6cd-6b9db8d65977\\})|(\\{07953f60-447e-4f53-a5ef-ed060487f616\\})|(\\{2d3c5a5a-8e6f-4762-8aff-b24953fe1cc9\\})|(\\{f82b3ad5-e590-4286-891f-05adf5028d2f\\})|(\\{f96245ad-3bb0-46c5-8ca9-2917d69aa6ca\\})|(\\{2f53e091-4b16-4b60-9cae-69d0c55b2e78\\})|(\\{18868c3a-a209-41a6-855d-f99f782d1606\\})|(\\{47352fbf-80d9-4b70-9398-fb7bffa3da53\\})$/","prefs":[],"schema":1516311993443,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1431748","why":"These are a set of malicious add-ons that block the add-ons manager tab from opening so they can't be uninstalled.","name":"FF Tool"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"4ca8206f-bc2a-4428-9439-7f3142dc08db","last_modified":1516394914828},{"guid":"{5b0f6d3c-10fd-414c-a135-dffd26d7de0f}","prefs":[],"schema":1516131689499,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1430577","why":"This is a malicious add-on that executes remote scripts, redirects popular search URLs and tracks users.","name":"P Birthday"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"8088b39a-3e6d-4a17-a22f-3f95c0464bd6","last_modified":1516303320468},{"guid":"{1490068c-d8b7-4bd2-9621-a648942b312c}","prefs":[],"schema":1515267698296,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1428754","why":"This add-on is using a deceptive name and performing unwanted actions on users' systems.","name":"FF Safe Helper"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"674b6e19-f087-4706-a91d-1e723ed6f79e","last_modified":1515433728497},{"guid":"{dfa727cb-0246-4c5a-843a-e4a8592cc7b9}","prefs":[],"schema":1514922095288,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1426582","why":"Version 2.0.0 shipped with a hidden coin miner, which degrades performance in users who have it enabled. Version 1.2.3 currently available on AMO is not affected.","name":"Open With Adobe PDF Reader 2.0.0"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.0.0","minVersion":"2.0.0"}],"id":"455772a3-8360-4f5a-9a5f-a45b904d0b51","last_modified":1515007270887},{"guid":"{d03b6b0f-4d44-4666-a6d6-f16ad9483593}","prefs":[],"schema":1513366896461,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1425581","why":"This is a malicious add-on posing as a legitimate update.","name":"FF Guard Tool (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"10d9ce89-b8d4-4b53-b3d7-ecd192681f4e","last_modified":1513376470395},{"guid":"{7e907a15-0a4c-4ff4-b64f-5eeb8f841349}","prefs":[],"schema":1510083698490,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate update.","name":"Manual Update"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"f7569261-f575-4719-8202-552b20d013b0","last_modified":1510168860382},{"guid":"{3602008d-8195-4860-965a-d01ac4f9ca96}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"28c805a9-e692-4ef8-b3ae-14e085c19ecd","last_modified":1509120934909},{"guid":"{87010166-e3d0-4db5-a394-0517917201df}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"84dd8a02-c879-4477-8ea7-bf2f225b0940","last_modified":1509120881470},{"guid":"{8ab60777-e899-475d-9a4f-5f2ee02c7ea4}","prefs":[],"schema":1509120801051,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.\n","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"ccebab59-7190-4258-8faa-a0b752dd5301","last_modified":1509120831329},{"guid":"{368eb817-31b4-4be9-a761-b67598faf9fa}","prefs":[],"schema":1509046897080,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1411885","why":"This is a malicious add-on posing as a legitimate antivirus.","name":"Manual Antivirus"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"9abc7502-bd6f-40d7-b035-abe721345360","last_modified":1509120801043},{"guid":"@68eba425-7a05-4d62-82b1-1d6d5a51716b","prefs":[],"schema":1505072496256,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1398905","why":"Misleads users into thinking this is a security and privacy tool (also distributed on a site that makes it look like an official Mozilla product).","name":"SearchAssist Incognito"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0"}],"id":"595e0e53-b76b-4188-a160-66f29c636094","last_modified":1505211411253},{"guid":"@H99KV4DO-UCCF-9PFO-9ZLK-8RRP4FVOKD9O","prefs":[],"schema":1502483549048,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently.","name":"FF Adr (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"5df16afc-c804-43c9-9de5-f1835403e5fb","last_modified":1502483601731},{"guid":"@DA3566E2-F709-11E5-8E87-A604BC8E7F8B","prefs":[],"schema":1502480491460,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1340877","why":"This is a malicious add-on that is being installed silently into users' systems.","name":"SimilarWeb (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"0a47a2f7-f07c-489b-bd39-88122a2dfe6a","last_modified":1502483549043},{"guid":"/^({95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}|{E3605470-291B-44EB-8648-745EE356599A}|{95E5E0AD-65F9-4FFC-A2A2-0008DCF6ED25}|{FF20459C-DA6E-41A7-80BC-8F4FEFD9C575}|{6E727987-C8EA-44DA-8749-310C0FBE3C3E}|{12E8A6C2-B125-479F-AB3C-13B8757C7F04}|{EB6628CF-0675-4DAE-95CE-EFFA23169743})$/","prefs":[],"schema":1494022576295,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362585","why":"All of these add-ons have been identified as malware, and are being installed in Firefox globally, most likely via a malicious application installer.","name":"Malicious globally-installed add-ons"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"3fd71895-7fc6-4f3f-aa22-1cbb0c5fd922","last_modified":1494024191520},{"guid":"@safesearchscoutee","prefs":[],"schema":1494013289942,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1362553","why":"This add-on intercepts queries sent to search engines and replaces them with its own, without user consent.","name":"SafeSearch Incognito (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0"}],"id":"edad04eb-ea16-42f3-a4a7-20dded33cc37","last_modified":1494022568654},{"guid":"msktbird@mcafee.com","prefs":[],"schema":1493150718059,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354912","why":"These versions of this add-on are known to cause frequent crashes in Thunderbird.","name":"McAfee Anti-Spam Thunderbird Extension 2.0 and lower"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0","minVersion":"0","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"0"}]}],"id":"9e86d1ff-727a-45e3-9fb6-17f32666daf2","last_modified":1493332747360},{"guid":"/^(\\{11112503-5e91-4299-bf4b-f8c07811aa50\\})|(\\{501815af-725e-45be-b0f2-8f36f5617afc\\})$/","prefs":[],"schema":1491421290217,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1354045","why":"This add-on steals user credentials for popular websites from Facebook.","name":"Flash Player Updater (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c142360c-4f93-467e-9717-b638aa085d95","last_modified":1491472107658},{"guid":"fr@fbt.ovh","prefs":[],"schema":1490898754477,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1351689","why":"Scam add-on that silently steals user credentials of popular websites","name":"Adobe Flash Player (Malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0f8344d0-8211-49a1-81be-c0084b3da9b1","last_modified":1490898787752},{"guid":"{95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}","prefs":[],"schema":1487179851382,"details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1338690","who":"All users who have this add-on installed.","why":"This is a malicious add-on that is silently installed in users' systems.","name":"youtube adblock (malware)"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"04b25e3d-a725-493e-be07-cbd74fb37ea7","last_modified":1487288975999},{"guid":"ext@alibonus.com","prefs":[],"schema":1485297431051,"blockID":"i1524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333471","who":"All Firefox users who have these versions installed.","why":"Versions 1.20.9 and lower of this add-on contain critical security issues.","name":"Alibonus 1.20.9 and lower","created":"2017-01-24T22:45:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.20.9","minVersion":"0","targetApplication":[]}],"id":"a015d5a4-9184-95db-0c74-9262af2332fa","last_modified":1485301116629},{"guid":"/^(ciscowebexstart1@cisco\\.com|ciscowebexstart_test@cisco\\.com|ciscowebexstart@cisco\\.com|ciscowebexgpc@cisco\\.com)$/","prefs":[],"schema":1485212610474,"blockID":"i1522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1333225","who":"All Firefox users who have any Cisco WebEx add-ons installed.","why":"A critical security vulnerability has been discovered in Cisco WebEx add-ons that enable malicious websites to execute code on the user's system.","name":"Cisco WebEx add-ons","created":"2017-01-23T22:55:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.1","minVersion":"1.0.0","targetApplication":[]}],"id":"30368779-1d3b-490a-0a34-253085af7754","last_modified":1485215014902},{"guid":"googlotim@gmail.com","prefs":[],"schema":1483389810787,"blockID":"i1492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1328594","who":"All users who have Savogram version 1.3.2 installed. Version 1.3.1 doesn't have this problem and can be installed from the <a href=\"https://addons.mozilla.org/addon/savogram/\">add-on page</a>. Note that this is an older version, so affected users won't be automatically updated to it. New versions should correct this problem if they become available.","why":"Version 1.3.2 of this add-on loads remote code and performs DOM injection in an unsafe manner.","name":"Savogram 1.3.2","created":"2017-01-05T19:58:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.2","minVersion":"1.3.2","targetApplication":[]}],"id":"0756ed76-7bc7-ec1e-aba5-3a9fac2107ba","last_modified":1483646608603},{"guid":"support@update-firefox.com","prefs":[],"schema":1483387107003,"blockID":"i21","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629717","who":"All users of the add-on in all Mozilla applications.","why":"This add-on is adware/spyware masquerading as a Firefox update mechanism.","name":"Browser Update (spyware)","created":"2011-01-31T16:23:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dfb06be8-3594-28e4-d163-17e27119f15d","last_modified":1483389809169},{"guid":"{2224e955-00e9-4613-a844-ce69fccaae91}","prefs":[],"schema":1483387107003,"blockID":"i7","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=512406","who":"All users of Internet Saving Optimizer for all Mozilla applications.","why":"This add-on causes a high volume of Firefox crashes and is considered malware.","name":"Internet Saving Optimizer (extension)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9efb796-97c2-6434-d28f-acc83436f8e5","last_modified":1483389809147},{"guid":"supportaccessplugin@gmail.com","prefs":[],"schema":1483387107003,"blockID":"i43","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=693673","who":"All users with Firefox Access Plugin installed","why":"This add-on is spyware that reports all visited websites to a third party with no user value.","name":"Firefox Access Plugin (spyware)","created":"2011-10-11T11:24:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ed230a4-e174-262a-55ab-0c33f93a2529","last_modified":1483389809124},{"guid":"{8CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1483387107003,"blockID":"i10","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=541302","who":"All users of this add-on in all Mozilla applications.","why":"This add-on secretly hijacks all search results in most major search engines and masks as a security add-on.","name":"Internal security options editor (malware)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e2e0ac09-6d68-75f5-2424-140f51904876","last_modified":1483389809102},{"guid":"admin@youtubespeedup.com","prefs":[],"schema":1483387107003,"blockID":"i48","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=714221","who":"All users with any version of Youtube Speed UP! installed on any Mozilla product.","why":"This add-on hijacks your Facebook account.","name":"Youtube Speed UP! (malware)","created":"2011-12-29T19:48:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a93922c4-8a8a-5230-8f76-76fecb0653b6","last_modified":1483389809057},{"guid":"pink@rosaplugin.info","prefs":[],"schema":1482945809444,"blockID":"i84","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743484","who":"All Firefox users who have this add-on installed","why":"Add-on acts like malware and performs user actions on Facebook without their consent.","name":"Facebook Rosa (malware)","created":"2012-04-09T10:13:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"66ad8de9-311d-076c-7356-87fde6d30d8f","last_modified":1482945810971},{"guid":"videoplugin@player.com","prefs":[],"schema":1482945809444,"blockID":"i90","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=752483","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Flash Player update. It can hijack Google searches and Facebook accounts.","name":"FlashPlayer 11 (malware)","created":"2012-05-07T08:58:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d25943f1-39ef-b9ec-ab77-baeef3498365","last_modified":1482945810949},{"guid":"youtb3@youtb3.com","prefs":[],"schema":1482945809444,"blockID":"i60","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723753","who":"All Firefox users who have this extension installed.","why":"Malicious extension installed under false pretenses.","name":"Video extension (malware)","created":"2012-02-02T16:38:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cae3093f-a7b3-5352-a264-01dbfbf347ce","last_modified":1482945810927},{"guid":"{8f42fb8b-b6f6-45de-81c0-d6d39f54f971}","prefs":[],"schema":1482945809444,"blockID":"i82","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743012","who":"All Firefox users who have installed this add-on.","why":"This add-on maliciously manipulates Facebook and is installed under false pretenses.","name":"Face Plus (malware)","created":"2012-04-09T10:04:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09319ab3-55e7-fec1-44e0-84067d014b9b","last_modified":1482945810904},{"guid":"{95ff02bc-ffc6-45f0-a5c8-619b8226a9de}","prefs":[],"schema":1482945809444,"blockID":"i105","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Eklenti D\u00fcnyas\u0131 (malware)","created":"2012-06-08T14:34:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"afbbc08d-2414-f51e-fdb8-74c0a2d90323","last_modified":1482945810858},{"guid":"{fa277cfc-1d75-4949-a1f9-4ac8e41b2dfd}","prefs":[],"schema":1482945809444,"blockID":"i77","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738419","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware that is installed under false pretenses as an Adobe plugin.","name":"Adobe Flash (malware)","created":"2012-03-22T14:39:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81753a93-382d-5f9d-a4ca-8a21b679ebb1","last_modified":1482945810835},{"guid":"youtube@youtube3.com","prefs":[],"schema":1482945809444,"blockID":"i57","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722823","who":"All Firefox users that have installed this add-on.","why":"Malware installed on false pretenses.","name":"Divx 2012 Plugin (malware)","created":"2012-01-31T13:54:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4a93a0eb-a513-7272-6199-bc4d6228ff50","last_modified":1482945810811},{"guid":"{392e123b-b691-4a5e-b52f-c4c1027e749c}","prefs":[],"schema":1482945809444,"blockID":"i109","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=769781","who":"All Firefox users who have this add-on installed.","why":"This add-on pretends to be developed by Facebook and injects scripts that manipulate users' Facebook accounts.","name":"Zaman Tuneline Hay\u0131r! (malware)","created":"2012-06-29T13:20:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9a805aa-cae7-58d6-5a53-2af4442e4cf6","last_modified":1482945810788},{"guid":"msntoolbar@msn.com","prefs":[],"schema":1482945809444,"blockID":"i18","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of Bing Bar 6.0 and older for all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Bing Bar","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"6.*","minVersion":" 0","targetApplication":[]}],"id":"9b2f2039-b997-8993-d6dc-d881bc1ca7a1","last_modified":1482945810764},{"guid":"yasd@youasdr3.com","prefs":[],"schema":1482945809444,"blockID":"i104","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.\r\n","name":"Play Now (malware)","created":"2012-06-08T14:33:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a352dff-d09d-1e78-7feb-45dec7ace5a5","last_modified":1482945810740},{"guid":"fdm_ffext@freedownloadmanager.org","prefs":[],"schema":1482945809444,"blockID":"i2","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=408445","who":"Users of Firefox 3 and later with versions 1.0 through 1.3.1 of Free Download Manager","why":"This add-on causes a high volume of crashes.","name":"Free Download Manager","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.1","minVersion":"1.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"fc46f8e7-0489-b90f-a373-d93109479ca5","last_modified":1482945810393},{"guid":"flash@adobe.com","prefs":[],"schema":1482945809444,"blockID":"i56","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"This add-on poses as an Adobe Flash update and injects malicious scripts into web pages. It hides itself in the Add-ons Manager.","name":"Adobe Flash Update (malware)","created":"2012-01-30T15:41:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"696db959-fb0b-8aa4-928e-65f157cdd77a","last_modified":1482945810371},{"guid":"youtubeer@youtuber.com","prefs":[],"schema":1482945809444,"blockID":"i66","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726787","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously, and is installed under false pretenses.","name":"Plug VDS (malware)","created":"2012-02-13T15:44:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0878ce4e-b476-ffa3-0e06-21a65b7917a1","last_modified":1482945810348},{"guid":"flash@adobee.com","prefs":[],"schema":1482945809444,"blockID":"i83","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=743497","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware installed under false pretenses.","name":"FlashPlayer 11 (malware)","created":"2012-04-09T10:08:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"09bb4661-331c-f7ba-865b-9e085dc437af","last_modified":1482945810259},{"guid":"youtube@2youtube.com","prefs":[],"schema":1482945809444,"blockID":"i71","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=730399","who":"All Firefox users who have installed this add-on.","why":"Extension is malware, installed under false pretenses.","name":"YouTube extension (malware)","created":"2012-02-27T10:23:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5d389c1f-b3a0-b06f-6ffb-d1e8aa055e3c","last_modified":1482945810236},{"guid":"webmaster@buzzzzvideos.info","prefs":[],"schema":1482945809444,"blockID":"i58","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722844","who":"All Firefox users who have installed this add-on.","why":"Malware add-on that is installed under false pretenses.","name":"Buzz Video (malware)","created":"2012-01-31T14:51:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7aab105-e2c2-42f5-d9be-280eb9c0c8f7","last_modified":1482945810213},{"guid":"play5@vide04flash.com","prefs":[],"schema":1482945809444,"blockID":"i92","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755443","who":"All Firefox users who have this add-on installed.","why":"This add-on impersonates a Flash Player update (poorly), and inserts malicious scripts into Facebook.","name":"Lastest Flash PLayer (malware)","created":"2012-05-15T13:27:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7190860e-fc1f-cd9f-5d25-778e1e9043b2","last_modified":1482945810191},{"guid":"support3_en@adobe122.com","prefs":[],"schema":1482945809444,"blockID":"i97","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759164","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"FlashPlayer 11 (malware)","created":"2012-05-28T13:42:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"decf93a1-2bb0-148c-a1a6-10b3757b554b","last_modified":1482945810168},{"guid":"a1g0a9g219d@a1.com","prefs":[],"schema":1482945809444,"blockID":"i73","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=736275","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as Flash Player. It steals user cookies and sends them to a remote location.","name":"Flash Player (malware)","created":"2012-03-15T15:03:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6dd66b43-897d-874a-2227-54e240b8520f","last_modified":1482945810146},{"guid":"ghostviewer@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i59","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=723683","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on that automatically posts to Facebook.","name":"Ghost Viewer (malware)","created":"2012-02-02T16:32:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06dfe833-8c3d-90ee-3aa8-37c3c28f7c56","last_modified":1482945810123},{"guid":"kdrgun@gmail.com","prefs":[],"schema":1482945809444,"blockID":"i103","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=763065","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that inserts scripts into Facebook and hijacks the user's session.","name":"Timeline Kapat (malware)","created":"2012-06-08T14:32:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a9a46ab2-2f56-1046-201c-5faa3435e248","last_modified":1482945810078},{"guid":"youtube2@youtube2.com","prefs":[],"schema":1482945809444,"blockID":"i67","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=728476","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware, installed under false pretenses.","name":"Youtube Online (malware)","created":"2012-02-18T09:10:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"14650ece-295b-a667-f9bc-a3d973e2228c","last_modified":1482945810055},{"guid":"admin@youtubeplayer.com","prefs":[],"schema":1482945809444,"blockID":"i51","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=717165","who":"All Firefox users with this extension installed.","why":"This add-on is malware, doing nothing more than inserting advertisements into websites through iframes.","name":"Youtube player (malware)","created":"2012-01-18T14:34:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16b2ce94-88db-0d79-33fc-a93070ceb509","last_modified":1482945809957},{"guid":"youtubeee@youtuber3.com","prefs":[],"schema":1482945809444,"blockID":"i96","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=758503","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that is disguised as a DivX plugin.","name":"Divx 2012 Plugins (malware)","created":"2012-05-25T09:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f01be9cb-5cf2-774a-a4d7-e210a24db5b9","last_modified":1482945809912},{"guid":"{3252b9ae-c69a-4eaf-9502-dc9c1f6c009e}","prefs":[],"schema":1482945809444,"blockID":"i17","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 2.2 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Default Manager (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.2","minVersion":"2.2","targetApplication":[]}],"id":"38be28ac-2e30-37fa-4332-852a55fafb43","last_modified":1482945809886},{"guid":"{68b8676b-99a5-46d1-b390-22411d8bcd61}","prefs":[],"schema":1482945809444,"blockID":"i93","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=755635","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that post content on Facebook accounts and steals user data.","name":"Zaman T\u00fcnelini Kald\u0131r! (malware)","created":"2012-05-16T10:44:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"733aff15-9b1f-ec04-288f-b78a55165a1c","last_modified":1482945809863},{"guid":"applebeegifts@mozilla.doslash.org","prefs":[],"schema":1482945809444,"blockID":"i54","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721562","who":"All Firefox users that install this add-on.","why":"Add-on is malware installed under false pretenses.","name":"Applebees Gift Card (malware)","created":"2012-01-26T16:17:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1372c8ab-5452-745a-461a-aa78e3e12c4b","last_modified":1482945809840},{"guid":"activity@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i65","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=726803","who":"All Firefox users who have installed this add-on.","why":"Add-on behaves maliciously and poses as an official Facebook add-on.","name":"Facebook extension (malware)","created":"2012-02-13T15:41:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"79ad1c9b-0828-7823-4574-dd1cdd46c3d6","last_modified":1482945809437},{"guid":"jid0-EcdqvFOgWLKHNJPuqAnawlykCGZ@jetpack","prefs":[],"schema":1482945112982,"blockID":"i62","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=724650","who":"All Firefox users who have installed this add-on.","why":"Add-on is installed under false pretenses and delivers malware.","name":"YouTube extension (malware)","created":"2012-02-06T14:46:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5ae1e642-b53c-54c0-19e7-5562cfdac3a3","last_modified":1482945809415},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i25","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=637542","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-03-14T15:53:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.3.0.*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1"}]}],"id":"c950501b-1f08-2ab2-d817-7c664c0d16fe","last_modified":1482945809393},{"guid":"{B7082FAA-CB62-4872-9106-E42DD88EDE45}","prefs":[],"schema":1482945112982,"blockID":"i38","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=660111","who":"Users of McAfee SiteAdvisor below version 3.3.1 for Firefox 4.\r\n\r\nUsers of McAfee SiteAdvisor 3.3.1 and below for Firefox 5 and higher.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"McAfee SiteAdvisor","created":"2011-05-27T13:55:02Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"3.3.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"5.0a1"}]}],"id":"f11de388-4511-8d06-1414-95d3b2b122c5","last_modified":1482945809371},{"guid":"youtube@youtube7.com","prefs":[],"schema":1482945112982,"blockID":"i55","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=721646","who":"All Firefox users with this add-on installed.","why":"This is malware posing as video software.","name":"Plugin Video (malware)","created":"2012-01-27T09:39:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"08ceedf5-c7c1-f54f-db0c-02f01f0e319a","last_modified":1482945809304},{"guid":"crossriderapp3924@crossrider.com","prefs":[],"schema":1482945112982,"blockID":"i76","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=738282","who":"All Firefox users who have installed this add-on.","why":"This add-on compromises Facebook privacy and security and spams friends lists without user intervention.","name":"Fblixx (malware)","created":"2012-03-22T10:38:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d0a019-62fb-837b-1f1f-6831e56442b5","last_modified":1482945809279},{"guid":"{45147e67-4020-47e2-8f7a-55464fb535aa}","prefs":[],"schema":1482945112982,"blockID":"i86","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=748993","who":"All Firefox users who have this add-on installed.","why":"This add-on injects scripts into Facebook and performs malicious activity.","name":"Mukemmel Face+","created":"2012-04-25T16:33:21Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"960443f9-cf48-0b71-1ff2-b8c34a3411ea","last_modified":1482945809255},{"guid":"{4B3803EA-5230-4DC3-A7FC-33638F3D3542}","prefs":[],"schema":1482945112982,"blockID":"i4","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=441649","who":"Users of Firefox 3 and later with version 1.2 of Crawler Toolbar","why":"This add-on causes a high volume of crashes.","name":"Crawler Toolbar","created":"2008-07-08T10:23:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2","minVersion":"1.2","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.0a1"}]}],"id":"a9818d53-3a6a-8673-04dd-2a16f5644215","last_modified":1482945809232},{"guid":"flashupdate@adobe.com","prefs":[],"schema":1482945112982,"blockID":"i68","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=722526","who":"All Firefox users who have this add-on installed.","why":"Add-on is malware, installed under false pretenses.","name":"Flash Update (malware)","created":"2012-02-21T13:55:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba5b46e-790d-5af2-9580-a5f1e6e65522","last_modified":1482945809208},{"guid":"plugin@youtubeplayer.com","prefs":[],"schema":1482945112982,"blockID":"i127","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=783356","who":"All users who have this add-on installed.","why":"This add-on tries to pass as a YouTube player and runs malicious scripts on webpages.","name":"Youtube Facebook Player (malware)","created":"2012-08-16T13:03:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"17a8bece-e2df-a55d-8a72-95faff028b83","last_modified":1482945809185},{"guid":"GifBlock@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i79","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739482","who":"All Firefox users who have installed this extension.","why":"This extension is malicious and is installed under false pretenses.","name":"Facebook Essentials (malware)","created":"2012-03-27T10:53:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"728451e8-1273-d887-37e9-5712b1cc3bff","last_modified":1482945809162},{"guid":"ff-ext@youtube","prefs":[],"schema":1482945112982,"blockID":"i52","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719296","who":"All Firefox users that have this add-on installed.","why":"This add-on poses as a YouTube player while posting spam into Facebook account.","name":"Youtube player (malware)","created":"2012-01-19T08:26:35Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd2dd72a-dd52-6752-a0cd-a4b312fd0b65","last_modified":1482945809138},{"guid":"ShopperReports@ShopperReports.com","prefs":[],"schema":1482945112982,"blockID":"i22","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=630191","who":"Users of Shopper Reports version 3.1.22.0 in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Shopper Reports","created":"2011-02-09T17:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.1.22.0","minVersion":"3.1.22.0","targetApplication":[]}],"id":"f26b049c-d856-750f-f050-996e6bec7cbb","last_modified":1482945809115},{"guid":"{27182e60-b5f3-411c-b545-b44205977502}","prefs":[],"schema":1482945112982,"blockID":"i16","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=599971","who":"Users of version 1.0 of this add-on in all versions of Firefox.","why":"This add-on has security issues and was blocked at Microsoft's request. For more information, please see <a href=\"http://support.microsoft.com/kb/2430460\">this article</a>.","name":"Search Helper Extension (Microsoft)","created":"2011-03-31T16:28:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"1.0","targetApplication":[]}],"id":"2655f230-11f3-fe4c-7c3d-757d37d5f9a5","last_modified":1482945809092},{"guid":"{841468a1-d7f4-4bd3-84e6-bb0f13a06c64}","prefs":[],"schema":1482945112982,"blockID":"i46","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=712369","who":"Users of all versions of Nectar Search Toolbar in Firefox 9.","why":"This add-on causes crashes and other stability issues in Firefox.","name":"Nectar Search Toolbar","created":"2011-12-20T11:38:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"9.0","minVersion":"9.0a1"}]}],"id":"b660dabd-0dc0-a55c-4b86-416080b345d9","last_modified":1482945809069},{"guid":"support@daemon-tools.cc","prefs":[],"schema":1482945112982,"blockID":"i5","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=459850","who":"Users of Daemon Tools Toolbar version 1.0.0.5 and older for all Mozilla applications.","why":"This add-on causes a high volume of crashes.","name":"Daemon Tools Toolbar","created":"2009-02-13T18:39:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.5","minVersion":"0","targetApplication":[]}],"id":"8cabafd3-576a-b487-31c8-ab59e0349a0e","last_modified":1482945809045},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1482945112982,"blockID":"i53","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=719605","who":"All users of Firefox with this add-on installed.","why":"This add-on is being offered as an online movie viewer, when it reality it only inserts scripts and ads into known sites.","name":"Peliculas-FLV (malware)","created":"2012-01-19T15:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"2.0.3","minVersion":"2.0.3","targetApplication":[]}],"id":"07bc0962-60da-087b-c3ab-f2a6ab84d81c","last_modified":1482945809021},{"guid":"royal@facebook.com","prefs":[],"schema":1482945112982,"blockID":"i64","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=725777","who":"All Firefox users who have installed this add-on.","why":"Malicious add-on posing as a Facebook tool.","name":"Facebook ! (malware)","created":"2012-02-09T13:24:23Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd1d2623-0d15-c93e-8fbd-ba07b0299a44","last_modified":1482945808997},{"guid":"{28bfb930-7620-11e1-b0c4-0800200c9a66}","prefs":[],"schema":1482945112982,"blockID":"i108","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=766852","who":"All Firefox user who have this add-on installed.","why":"This is malware disguised as an Adobe product. It spams Facebook pages.","name":"Aplicativo (malware)","created":"2012-06-21T09:24:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"908dc4fb-ebc9-cea1-438f-55e4507ba834","last_modified":1482945808973},{"guid":"socialnetworktools@mozilla.doslash.org","prefs":[],"schema":1482945112982,"blockID":"i78","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=739441","who":"All Firefox users who have installed this add-on.","why":"This add-on hijacks the Facebook UI and adds scripts to track users.","name":"Social Network Tools (malware)","created":"2012-03-26T16:46:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1064cd25-3b87-64bb-b0a6-2518ad281574","last_modified":1482945808950},{"guid":"youtubeeing@youtuberie.com","prefs":[],"schema":1482945112982,"blockID":"i98","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759663","who":"All Firefox users who have installed this add-on.","why":"This add-on is malware disguised as a Youtube add-on.","name":"Youtube Video Player (malware)","created":"2012-05-30T09:30:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3484f860-56e1-28e8-5a70-cdcd5ab9d6ee","last_modified":1482945808927},{"guid":"pfzPXmnzQRXX6@2iABkVe.com","prefs":[],"schema":1482945112982,"blockID":"i99","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=759950","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as a Flash Player update.","name":"Flash Player (malware)","created":"2012-05-30T17:10:18Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"29cc4abc-4f52-01f1-eb0b-cad84ba4db13","last_modified":1482945808881},{"guid":"/^(pdftoword@addingapps.com|jid0-EYTXLS0GyfQME5irGbnD4HksnbQ@jetpack|jid1-ZjJ7t75BAcbGCX@jetpack)$/","prefs":[],"schema":1482341309012,"blockID":"i1425","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1325060","who":"All users who have any of the affected versions installed.","why":"A security vulnerability was discovered in old versions of the Add-ons SDK, which is exposed by certain old versions of add-ons. In the case of some add-ons that haven't been updated for a long time, all versions are being blocked.","name":"Various vulnerable add-on versions","created":"2016-12-21T17:23:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"150e639f-c832-63d0-a775-59313b2e1bf9","last_modified":1482343886365},{"guid":"{cc8f597b-0765-404e-a575-82aefbd81daf}","prefs":[],"schema":1480349193877,"blockID":"i380","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866332","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts and performs unwanted actions on behalf of the user.","name":"Update My Browser (malware)","created":"2013-06-19T13:03:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4950d7aa-c602-15f5-a7a2-d844182d5cbd","last_modified":1480349217152},{"guid":"extension@FastFreeConverter.com","prefs":[],"schema":1480349193877,"blockID":"i470","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"649dd933-debf-69b7-020f-496c2c9f99c8","last_modified":1480349217071},{"guid":"59D317DB041748fdB89B47E6F96058F3@jetpack","prefs":[],"schema":1480349193877,"blockID":"i694","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053540","who":"All Firefox users who have this add-ons installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is a suspicious add-on that appears to be installed without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JsInjectExtension","created":"2014-08-21T13:46:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"75692bd4-18e5-a9be-7ec3-9327e159ef68","last_modified":1480349217005},{"guid":"/^({bfec236d-e122-4102-864f-f5f19d897f5e}|{3f842035-47f4-4f10-846b-6199b07f09b8}|{92ed4bbd-83f2-4c70-bb4e-f8d3716143fe})$/","prefs":[],"schema":1480349193877,"blockID":"i527","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:13:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d68dd97-7965-0a84-8ca7-435aac3c8040","last_modified":1480349216927},{"guid":"support@vide1flash2.com","prefs":[],"schema":1480349193877,"blockID":"i246","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=830159","who":"All Firefox users who have this add-on installed.","why":"This is an add-on that poses as the Adobe Flash Player and runs malicious code in the user's system.","name":"Lastest Adobe Flash Player (malware)","created":"2013-01-14T09:17:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2004fba1-74bf-a072-2a59-6e0ba827b541","last_modified":1480349216871},{"guid":"extension21804@extension21804.com","prefs":[],"schema":1480349193877,"blockID":"i312","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b2cf1256-dadd-6501-1f4e-25902d408692","last_modified":1480349216827},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i602","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:05Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.8.*","minVersion":"3.15.8","targetApplication":[]}],"id":"b2b4236d-5d4d-82b2-99cd-00ff688badf1","last_modified":1480349216765},{"guid":"{FE1DEEEA-DB6D-44b8-83F0-34FC0F9D1052}","prefs":[],"schema":1480349193877,"blockID":"i364","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867670","who":"All Firefox users who have this add-on installed. Users who want to enable the add-on again can do so in the Add-ons Manager.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2013-06-10T16:14:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a59b967c-66ca-7ad9-2dc6-d0ad37ded5fd","last_modified":1480349216652},{"guid":"vpyekkifgv@vpyekkifgv.org","prefs":[],"schema":1480349193877,"blockID":"i352","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=872211","who":"All Firefox users who have this add-on installed.","why":"Uses a deceptive name and injects ads into pages without user consent.","name":"SQLlite Addon (malware)","created":"2013-05-14T13:42:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fd981ab-7ee0-e367-d804-0efe29d63178","last_modified":1480349216614},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i702","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T10:05:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.10","targetApplication":[]}],"id":"60e54f6a-1b10-f889-837f-60a76a98fccc","last_modified":1480349216512},{"guid":"{f0e59437-6148-4a98-b0a6-60d557ef57f4}","prefs":[],"schema":1480349193877,"blockID":"i304","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845975","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">installation guidelines</a> and is dropped silently into user's profiles.","name":"WhiteSmoke B","created":"2013-02-27T13:10:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0469e643-1a90-f9be-4aad-b347469adcbe","last_modified":1480349216402},{"guid":"xz123@ya456.com","prefs":[],"schema":1480349193877,"blockID":"i486","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-11-15T13:34:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b9825a25-a96c-407e-e656-46a7948e5745","last_modified":1480349215808},{"guid":"{C7AE725D-FA5C-4027-BB4C-787EF9F8248A}","prefs":[],"schema":1480349193877,"blockID":"i424","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=860641","who":"Users of Firefox 23 or later who have RelevantKnowledge 1.0.0.2 or lower.","why":"Old versions of this add-on are causing startup crashes in Firefox 23, currently on the Beta channel. RelevantKnowledge users on Firefox 23 and above should update to version 1.0.0.3 of the add-on.","name":"RelevantKnowledge 1.0.0.2 and lower","created":"2013-07-01T10:45:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0.0.2","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"23.0a1"}]}],"id":"c888d167-7970-4b3f-240f-2d8e6f14ded4","last_modified":1480349215779},{"guid":"superlrcs@svenyor.net","prefs":[],"schema":1480349193877,"blockID":"i545","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:52:42Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"002cd4fa-4c2b-e28b-9220-4a520f4d9ec6","last_modified":1480349215672},{"guid":"mbrsepone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i479","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=937331","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Lightweight Pack (malware)","created":"2013-11-11T15:42:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0549645e-5f50-5089-1f24-6e7d3bfab8e0","last_modified":1480349215645},{"guid":"mbroctone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i476","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936590","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks the users' Facebook account.","name":"Mozilla Storage Service (malware)","created":"2013-11-08T15:32:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"92198396-8756-8d09-7f18-a68d29894f71","last_modified":1480349215504},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i616","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.28.*","minVersion":"3.15.28","targetApplication":[]}],"id":"f11b485f-320e-233c-958b-a63377024fad","last_modified":1480349215479},{"guid":"/^({e9df9360-97f8-4690-afe6-996c80790da4}|{687578b9-7132-4a7a-80e4-30ee31099e03}|{46a3135d-3683-48cf-b94c-82655cbc0e8a}|{49c795c2-604a-4d18-aeb1-b3eba27e5ea2}|{7473b6bd-4691-4744-a82b-7854eb3d70b6}|{96f454ea-9d38-474f-b504-56193e00c1a5})$/","prefs":[],"schema":1480349193877,"blockID":"i494","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. It also uses multiple add-on IDs for no apparent reason. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrent and related","created":"2013-12-02T14:52:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"485210d0-8e69-3436-536f-5d1deeea4167","last_modified":1480349215454},{"guid":"{EB7508CA-C7B2-46E0-8C04-3E94A035BD49}","prefs":[],"schema":1480349193877,"blockID":"i162","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=799266","who":"All Firefox users who have installed any of these add-ons.","why":"This block covers a number of malicious add-ons that deceive users, using names like \"Mozilla Safe Browsing\" and \"Translate This!\", and claiming they are developed by \"Mozilla Corp.\". They hijack searches and redirects users to pages they didn't intend to go to.\r\n\r\nNote: this block won't be active until bug 799266 is fixed.","name":"Mozilla Safe Browsing and others (Medfos malware)","created":"2012-10-11T12:25:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07566aa3-4ff9-ac4f-9de9-71c77454b4da","last_modified":1480349215428},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i614","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.26.*","minVersion":"3.15.26","targetApplication":[]}],"id":"ede541f3-1748-7b33-9bd6-80e2f948e14f","last_modified":1480349215399},{"guid":"/^({976cd962-e0ca-4337-aea7-d93fae63a79c}|{525ba996-1ce4-4677-91c5-9fc4ead2d245}|{91659dab-9117-42d1-a09f-13ec28037717}|{c1211069-1163-4ba8-b8b3-32fc724766be})$/","prefs":[],"schema":1480349193877,"blockID":"i522","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:15:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"580aed26-dc3b-eef8-fa66-a0a402447b7b","last_modified":1480349215360},{"guid":"jid0-O6MIff3eO5dIGf5Tcv8RsJDKxrs@jetpack","prefs":[],"schema":1480349193877,"blockID":"i552","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974041","who":"All Firefox users who have this extension installed.","why":"This extension is malware that attempts to make it impossible for a second extension and itself to be disabled, and also forces the new tab page to have a specific URL.","name":"Extension_Protected (malware)","created":"2014-02-19T15:26:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e53063b4-5702-5b66-c860-d368cba4ccb6","last_modified":1480349215327},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i604","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:18:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.11.*","minVersion":"3.15.10","targetApplication":[]}],"id":"b910f779-f36e-70e1-b17a-8afb75988c03","last_modified":1480349215302},{"guid":"brasilescapefive@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i483","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938473","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Video Pack (malware)","created":"2013-11-14T09:37:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"85ee7840-f262-ad30-eb91-74b3248fd13d","last_modified":1480349215276},{"guid":"brasilescapeeight@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i482","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938476","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Pack (malware)","created":"2013-11-14T09:36:55Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"457a5722-be90-5a9f-5fa0-4c753e9f324c","last_modified":1480349215249},{"guid":"happylyrics@hpyproductions.net","prefs":[],"schema":1480349193877,"blockID":"i370","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881815","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into Firefox without the users' consent, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Happy Lyrics","created":"2013-06-11T15:42:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"730e616d-94a7-df0c-d31a-98b7875d60c2","last_modified":1480349215225},{"guid":"search-snacks@search-snacks.com","prefs":[],"schema":1480349193877,"blockID":"i872","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082733","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Search Snacks","created":"2015-03-04T14:37:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7567b06f-98fb-9400-8007-5d0357c345d9","last_modified":1480349215198},{"os":"WINNT","guid":"{ABDE892B-13A8-4d1b-88E6-365A6E755758}","prefs":[],"schema":1480349193877,"blockID":"i107","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=764210","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-06-14T13:54:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"e3b89e55-b35f-8694-6f0e-f856e57a191d","last_modified":1480349215173},{"guid":"amo-validator-bypass@example.com","prefs":[],"schema":1480349193877,"blockID":"i1058","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1227605","who":"All users who install this add-on.","why":"This add-on is a proof of concept of a malicious add-on that bypasses the code validator.","name":" AMO Validator Bypass","created":"2015-11-24T09:03:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"86e38e3e-a729-b5a2-20a8-4738b376eea6","last_modified":1480349214743},{"guid":"6lIy@T.edu","prefs":[],"schema":1480349193877,"blockID":"i852","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:30:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39798bc2-9c75-f172-148b-13f3ca1dde9b","last_modified":1480349214613},{"guid":"{a7f2cb14-0472-42a1-915a-8adca2280a2c}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i686","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033809","who":"All users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HomeTab","created":"2014-08-06T16:35:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"33a8f403-b2c8-cadf-e1ba-40b39edeaf18","last_modified":1480349214537},{"guid":"{CA8C84C6-3918-41b1-BE77-049B2BDD887C}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i862","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131230","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ebay Shopping Assistant by Spigot","created":"2015-02-26T12:51:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9a9d6da2-90a1-5b71-8b24-96492d57dfd1","last_modified":1480349214479},{"guid":"update@firefox.com","prefs":[],"schema":1480349193877,"blockID":"i374","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=781088","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Premium Update (malware)","created":"2013-06-18T13:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bb388413-60ea-c9d6-9a3b-c90df950c319","last_modified":1480349214427},{"guid":"sqlmoz@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i350","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=871610","who":"All Firefox users who have this extension installed.","why":"This extension is malware posing as Mozilla software. It hijacks Facebook accounts and spams other Facebook users.","name":"Mozilla Service Pack (malware)","created":"2013-05-13T09:43:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"715082e8-7a30-b27b-51aa-186c38e078f6","last_modified":1480349214360},{"guid":"mozillahmpg@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i140","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=791867","who":"All Firefox users who have installed this add-on.","why":"This is a malicious add-on that tries to monetize on its users by embedding unauthorized affiliate codes on shopping websites, and sometimes redirecting users to alternate sites that could be malicious in nature.","name":"Google YouTube HD Player (malware)","created":"2012-09-17T16:04:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98150e2e-cb45-1fee-8458-28d3602ec2ec","last_modified":1480349214216},{"guid":"astrovia@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i489","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=942699","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-11-25T12:40:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6f365ff4-e48f-8a06-d19d-55e19fba81f4","last_modified":1480349214157},{"guid":"{bbea93c6-64a3-4a5a-854a-9cc61c8d309e}","prefs":[],"schema":1480349193877,"blockID":"i1126","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that disables various security checks in Firefox.","name":"Tab Extension (malware)","created":"2016-02-29T21:58:10Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acb9dcc-59d4-46d1-2a11-1194c4948239","last_modified":1480349214066},{"guid":"ffxtlbr@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i628","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:47:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4387ad94-8500-d74d-68e3-20564a9aac9e","last_modified":1480349214036},{"guid":"{28387537-e3f9-4ed7-860c-11e69af4a8a0}","prefs":[],"schema":1480349193877,"blockID":"i40","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar (2)","created":"2011-07-19T10:19:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"ff95664b-93e4-aa73-ac20-5ffb7c87d8b7","last_modified":1480349214002},{"guid":"{41e5ef7a-171d-4ab5-8351-951c65a29908}","prefs":[],"schema":1480349193877,"blockID":"i784","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"HelpSiteExpert","created":"2014-11-14T14:37:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0c05a0bb-30b4-979e-33a7-9f3955eba17d","last_modified":1480349213962},{"guid":"/^({2d7886a0-85bb-4bf2-b684-ba92b4b21d23}|{2fab2e94-d6f9-42de-8839-3510cef6424b}|{c02397f7-75b0-446e-a8fa-6ef70cfbf12b}|{8b337819-d1e8-48d3-8178-168ae8c99c36}|firefox@neurowise.info|firefox@allgenius.info)$/","prefs":[],"schema":1480349193877,"blockID":"i762","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1082599","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"These add-ons are silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SaveSense, neurowise, allgenius","created":"2014-10-17T16:58:10Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c5439f55-ace5-ad73-1270-017c0ba7b2ce","last_modified":1480349213913},{"guid":"{462be121-2b54-4218-bf00-b9bf8135b23f}","prefs":[],"schema":1480349193877,"blockID":"i226","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke","created":"2012-11-29T16:27:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"994c6084-e864-0e4e-ac91-455083ee46c7","last_modified":1480349213879},{"guid":"firefox@browsefox.com","prefs":[],"schema":1480349193877,"blockID":"i546","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936244","who":"All Firefox users who have this add-on installed. If you want to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseFox","created":"2014-01-30T12:26:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"407d8c84-8939-cd28-b284-9b680e529bf6","last_modified":1480349213853},{"guid":"{6926c7f7-6006-42d1-b046-eba1b3010315}","prefs":[],"schema":1480349193877,"blockID":"i382","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844956","who":"All Firefox users who have this add-on installed. Those who wish to continue using it can enable it again in the Add-ons Manager.","why":"This add-on is silently installed, bypassing the Firefox opt-in screen and violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"appbario7","created":"2013-06-25T12:05:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2367bd94-2bdd-c615-de89-023ba071a443","last_modified":1480349213825},{"guid":"05dd836e-2cbd-4204-9ff3-2f8a8665967d@a8876730-fb0c-4057-a2fc-f9c09d438e81.com","prefs":[],"schema":1480349193877,"blockID":"i468","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935135","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be part of a <a href=\"https://www.drwebhk.com/en/virus_techinfo/Trojan.DownLoader9.50268.html\">Trojan software</a> package.","name":"Trojan.DownLoader9.50268 (malware)","created":"2013-11-07T14:43:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2fd53d9b-7096-f1fb-fbcb-2b40a6193894","last_modified":1480349213774},{"guid":"jid1-0xtMKhXFEs4jIg@jetpack","prefs":[],"schema":1480349193877,"blockID":"i586","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011286","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware installed without user consent.","name":"ep (malware)","created":"2014-06-03T15:50:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50ca2179-83ab-1817-163d-39ed2a9fbd28","last_modified":1480349213717},{"guid":"/^({16e193c8-1706-40bf-b6f3-91403a9a22be}|{284fed43-2e13-4afe-8aeb-50827d510e20}|{5e3cc5d8-ed11-4bed-bc47-35b4c4bc1033}|{7429e64a-1fd4-4112-a186-2b5630816b91}|{8c9980d7-0f09-4459-9197-99b3e559660c}|{8f1d9545-0bb9-4583-bb3c-5e1ac1e2920c})$/","prefs":[],"schema":1480349193877,"blockID":"i517","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:54:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e88a28ab-5569-f06d-b0e2-15c51bb2a4b7","last_modified":1480349213344},{"guid":"safebrowse@safebrowse.co","prefs":[],"schema":1480349193877,"blockID":"i782","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1097696","who":"All Firefox users who have this add-on installed.","why":"This add-on loads scripts with malicious code that appears intended to steal usernames, passwords, and other private information.","name":"SafeBrowse","created":"2014-11-12T14:20:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"edd81c91-383b-f041-d8f6-d0b9a90230bd","last_modified":1480349213319},{"guid":"{af95cc15-3b9b-45ae-8d9b-98d08eda3111}","prefs":[],"schema":1480349193877,"blockID":"i492","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945126","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook (malware)","created":"2013-12-02T12:45:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7064e9e2-fba4-7b57-86d7-6f4afbf6f560","last_modified":1480349213294},{"guid":"{84a93d51-b7a9-431e-8ff8-d60e5d7f5df1}","prefs":[],"schema":1480349193877,"blockID":"i744","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:47:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dbc7ef8b-2c48-5dae-73a0-f87288c669f0","last_modified":1480349213264},{"guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i918","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:58:16Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"7f2a68f3-aa8a-ae41-1e48-d1f8f63d53c7","last_modified":1480349213231},{"guid":"831778-poidjao88DASfsAnindsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i972","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190962","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video patch (malware)","created":"2015-08-04T15:18:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39471221-6926-e11b-175a-b28424d49bf6","last_modified":1480349213194},{"guid":"lbmsrvfvxcblvpane@lpaezhjez.org","prefs":[],"schema":1480349193877,"blockID":"i342","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=863385","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also appears to install itself both locally and globally, producing a confusing uninstall experience.","name":"RapidFinda","created":"2013-05-06T16:18:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98fb4536-07a4-d03a-f7c5-945acecc8203","last_modified":1480349213128},{"guid":"{babb9931-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i499","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946086","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Credits (malware)","created":"2013-12-04T15:22:02Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be1d19fa-1662-322a-13e6-5fa5474f33a7","last_modified":1480349213100},{"guid":"{18d5a8fe-5428-485b-968f-b97b05a92b54}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i802","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:52:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bc846147-cdc1-141f-5846-b705c48bd6ed","last_modified":1480349213074},{"guid":"{b6ef1336-69bb-45b6-8cba-e578fc0e4433}","prefs":[],"schema":1480349193877,"blockID":"i780","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Power-SW","created":"2014-11-12T14:00:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3b080157-2900-d071-60fe-52b0aa376cf0","last_modified":1480349213024},{"guid":"info@wxdownloadmanager.com","prefs":[],"schema":1480349193877,"blockID":"i196","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec (malware)","created":"2012-11-05T09:24:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b62597d0-d2cb-d597-7358-5143a1d13658","last_modified":1480349212999},{"os":"WINNT","guid":"{C3949AC2-4B17-43ee-B4F1-D26B9D42404D}","prefs":[],"schema":1480349193877,"blockID":"i111","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=771802","who":"All Firefox users on Windows who have the RealPlayer Browser Record extension installed.","why":"The RealPlayer Browser Record extension is causing significant problems on Flash video sites like YouTube. This block automatically disables the add-on, but users can re-enable it from the Add-ons Manager if necessary.\r\n\r\nThis block shouldn't disable any other RealPlayer plugins, so watching RealPlayer content on the web should be unaffected.\r\n\r\nIf you still have problems playing videos on YouTube or elsewhere, please visit our <a href=\"http://support.mozilla.com/\">support site</a> for help.","name":"RealPlayer Browser Record Plugin","created":"2012-07-10T15:28:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"15.0.5","minVersion":"0","targetApplication":[]}],"id":"d3f96257-7635-555f-ef48-34d426322992","last_modified":1480349212971},{"guid":"l@AdLJ7uz.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i728","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GGoSavee","created":"2014-10-16T16:34:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e6bfa340-7d8a-1627-5cdf-40c0c4982e9d","last_modified":1480349212911},{"guid":"{6b2a75c8-6e2e-4267-b955-43e25b54e575}","prefs":[],"schema":1480349193877,"blockID":"i698","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052611","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowserShield","created":"2014-08-21T15:46:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"492e4e43-f89f-da58-9c09-d99528ee9ca9","last_modified":1480349212871},{"guid":"/^({65f9f6b7-2dae-46fc-bfaf-f88e4af1beca}|{9ed31f84-c8b3-4926-b950-dff74047ff79}|{0134af61-7a0c-4649-aeca-90d776060cb3}|{02edb56b-9b33-435b-b7df-b2843273a694}|{da51d4f6-3e7e-4ef8-b400-9198e0874606}|{b24577db-155e-4077-bb37-3fdd3c302bb5})$/","prefs":[],"schema":1480349193877,"blockID":"i525","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:11:14Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"78562d79-9a64-c259-fb63-ce24e29bb141","last_modified":1480349212839},{"guid":"adsremoval@adsremoval.net","prefs":[],"schema":1480349193877,"blockID":"i560","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=962793","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes various user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ad Removal","created":"2014-02-27T09:57:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4d150ad4-dc22-9790-07a9-36e0a23f857f","last_modified":1480349212798},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i445","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=911966","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that imitates a popular video downloader extension, and attempts to hijack Facebook accounts. The add-on available in the add-ons site is safe to use.","name":"YouTube Enhancer Plus (malware)","created":"2013-09-04T16:53:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"208.7.0","minVersion":"208.7.0","targetApplication":[]}],"id":"41d75d3f-a57e-d5ad-b95b-22f5fa010b4e","last_modified":1480349212747},{"guid":"{336D0C35-8A85-403a-B9D2-65C292C39087}","prefs":[],"schema":1480349193877,"blockID":"i224","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812292","who":"All Firefox users who have this add-on installed.","why":"This add-on is side-installed with other software, and blocks setting reversions attempted by users who want to recover their settings after they are hijacked by other add-ons.","name":"IB Updater","created":"2012-11-29T16:22:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c87666e6-ec9a-2f1e-ad03-a722d2fa2a25","last_modified":1480349212655},{"guid":"G4Ce4@w.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i718","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YoutUbeAdBlaocke","created":"2014-10-02T12:21:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e1e9322-93e9-4ce1-41f5-46ad4ef1471b","last_modified":1480349212277},{"guid":"extension@Fast_Free_Converter.com","prefs":[],"schema":1480349193877,"blockID":"i533","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949597","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"FastFreeConverter","created":"2013-12-20T15:04:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"726f5645-c0bf-66dc-a97a-d072b46e63e7","last_modified":1480349212247},{"guid":"@stopad","prefs":[],"schema":1480349193877,"blockID":"i1266","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1298780","who":"Users who have version 0.0.4 and earlier of the add-on installed.","why":"Stop Ads sends each visited url to a third party server which is not necessary for the add-on to work or disclosed in a privacy policy or user opt-in.  Versions 0.0.4 and earlier are affected.","name":"Stop Ads Addon","created":"2016-08-30T12:24:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.0.4","minVersion":"0","targetApplication":[]}],"id":"3d1893dd-2092-d1f7-03f3-9629b7d7139e","last_modified":1480349212214},{"guid":"703db0db-5fe9-44b6-9f53-c6a91a0ad5bd@7314bc82-969e-4d2a-921b-e5edd0b02cf1.com","prefs":[],"schema":1480349193877,"blockID":"i519","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:57:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a27d0f9f-7708-3d5f-82e1-e3f29e6098a0","last_modified":1480349212183},{"guid":"{13c9f1f9-2322-4d5c-81df-6d4bf8476ba4}","prefs":[],"schema":1480349193877,"blockID":"i348","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867359","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It also fails to revert settings changes on removal.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"mywebsearch","created":"2013-05-08T15:55:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"372cf3df-0810-85d8-b5d7-faffff309a11","last_modified":1480349212102},{"guid":"{a6e67e6f-8615-4fe0-a599-34a73fc3fba5}","prefs":[],"schema":1480349193877,"blockID":"i346","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=867333","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. Also, it doesn't reset its settings changes on uninstall.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Startnow","created":"2013-05-06T17:06:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1caf911c-ff2f-b0f6-0d32-29ef74be81bb","last_modified":1480349212077},{"guid":"9518042e-7ad6-4dac-b377-056e28d00c8f@f1cc0a13-4df1-4d66-938f-088db8838882.com","prefs":[],"schema":1480349193877,"blockID":"i308","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=846455","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Solid Savings","created":"2013-02-28T13:48:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"df25ee07-74d4-ccd9-dbbe-7eb053015144","last_modified":1480349212020},{"guid":"jufa098j-LKooapd9jasJ9jliJsd@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1000","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201163","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Secure Video (malware)","created":"2015-09-07T14:00:20Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c3a98025-0f4e-3bb4-b475-97329e7b1426","last_modified":1480349211979},{"guid":"{46eddf51-a4f6-4476-8d6c-31c5187b2a2f}","prefs":[],"schema":1480349193877,"blockID":"i750","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:17:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b4ef650-e1ad-d55f-c420-4f26dbb4139c","last_modified":1480349211953},{"guid":"{DAC3F861-B30D-40dd-9166-F4E75327FAC7}","prefs":[],"schema":1480349193877,"blockID":"i924","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"be57998b-9e4d-1040-e6bb-ed9de056338d","last_modified":1480349211896},{"guid":"JMLv@njMaHh.org","prefs":[],"schema":1480349193877,"blockID":"i790","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1103516","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"YouttubeAdBlocke","created":"2014-11-24T14:14:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"070d5747-137d-8500-8713-cfc6437558a3","last_modified":1480349211841},{"guid":"istart_ffnt@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i888","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152553","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-on Manager.","why":"This add-on appears to be malware, being silently installed and hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Istart","created":"2015-04-10T16:27:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32fad759-38d9-dad9-2295-e44cc6887040","last_modified":1480349211785},{"guid":"gystqfr@ylgga.com","prefs":[],"schema":1480349193877,"blockID":"i449","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912742","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Define Ext","created":"2013-09-13T16:19:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8fe8f509-c530-777b-dccf-d10d58ae78cf","last_modified":1480349211748},{"guid":"e9d197d59f2f45f382b1aa5c14d82@8706aaed9b904554b5cb7984e9.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i844","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128324","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sense","created":"2015-02-06T15:01:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8f8695c-a356-a1d6-9291-502b377c63c2","last_modified":1480349211713},{"guid":"{184AA5E6-741D-464a-820E-94B3ABC2F3B4}","prefs":[],"schema":1480349193877,"blockID":"i968","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1164243","who":"All users who have this add-on installed.","why":"This is a malicious add-on that poses as a Java extension.","name":"Java String Helper (malware)","created":"2015-08-04T09:41:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fac1d2cb-eed7-fcef-5d5a-43c556371bd7","last_modified":1480349211687},{"guid":"7d51fb17-b199-4d8f-894e-decaff4fc36a@a298838b-7f50-4c7c-9277-df6abbd42a0c.com","prefs":[],"schema":1480349193877,"blockID":"i455","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=919792","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts and posts spam to the users' friends.","name":"Video Console (malware)","created":"2013-09-25T10:28:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dd4d2e17-4ce6-36b0-3035-93e9cc5846d4","last_modified":1480349211660},{"guid":"prositez@prz.com","prefs":[],"schema":1480349193877,"blockID":"i764","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSitez","created":"2014-10-29T16:43:15Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"684ad4fd-2cbd-ce2a-34cd-bc66b20ac8af","last_modified":1480349211628},{"guid":"{25D77636-38B1-1260-887C-2D4AFA92D6A4}","prefs":[],"schema":1480349193877,"blockID":"i536","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=959279","who":"All Firefox users who have this extension installed.","why":"This is a malicious extension that is installed alongside a trojan. It hijacks searches on selected sites.","name":"Microsoft DirectInput Object (malware)","created":"2014-01-13T10:36:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cd174588-940e-f5b3-12ea-896c957bd4b3","last_modified":1480349211555},{"guid":"{badea1ae-72ed-4f6a-8c37-4db9a4ac7bc9}","prefs":[],"schema":1480349193877,"blockID":"i543","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963809","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is apparently malware that is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Address Bar Search","created":"2014-01-28T14:28:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8c1dd68e-7df6-0c37-2f41-107745a7be54","last_modified":1480349211119},{"guid":"{d87d56b2-1379-49f4-b081-af2850c79d8e}","prefs":[],"schema":1480349193877,"blockID":"i726","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer Lite","created":"2014-10-13T16:01:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b0895b4-dd4f-1c91-f4e3-31afdbdf3178","last_modified":1480349211007},{"guid":"OKitSpace@OKitSpace.es","prefs":[],"schema":1480349193877,"blockID":"i469","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:35:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6a11aa68-0dae-5524-cc96-a5053a31c466","last_modified":1480349210982},{"guid":"{c96d1ae6-c4cf-4984-b110-f5f561b33b5a}","prefs":[],"schema":1480349193877,"blockID":"i808","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Better Web","created":"2014-12-19T09:36:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0413d46b-8205-d9e0-65df-4caa3e6355c4","last_modified":1480349210956},{"guid":"thefoxonlybetter@quicksaver","prefs":[],"schema":1480349193877,"blockID":"i706","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1053469","who":"All Firefox users who have any of these versions of the add-on installed.","why":"Certain versions of The Fox, Only Better weren't developed by the original developer, and are likely malicious in nature. This violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"The Fox, Only Better (malicious versions)","created":"2014-08-27T14:50:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"1.6.160","minVersion":"1.6.160","targetApplication":[]}],"id":"bb2b2114-f8e7-511d-04dc-abc8366712cc","last_modified":1480349210859},{"guid":"CortonExt@ext.com","prefs":[],"schema":1480349193877,"blockID":"i336","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=864551","who":"All Firefox users who have this add-on installed.","why":"This add-on is reported to be installed without user consent, with a non-descriptive name, and ties a number of browser features to Amazon URLs, probably monetizing on affiliate codes.","name":"CortonExt","created":"2013-04-22T16:10:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a5bdd05d-eb4c-ce34-9909-a677b4322384","last_modified":1480349210805},{"guid":"1chtw@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i430","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":" Mozilla Service Pack (malware)","created":"2013-08-05T16:42:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bf1e31c7-ba50-1075-29ae-47368ac1d6de","last_modified":1480349210773},{"guid":"lrcsTube@hansanddeta.com","prefs":[],"schema":1480349193877,"blockID":"i344","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866944","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"LyricsTube","created":"2013-05-06T16:44:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"424b9f39-d028-b1fb-d011-d8ffbbd20fe9","last_modified":1480349210718},{"guid":"{341f4dac-1966-47ff-aacf-0ce175f1498a}","prefs":[],"schema":1480349193877,"blockID":"i356","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=868129","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"MyFreeGames","created":"2013-05-23T14:45:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"560e08b1-3471-ad34-8ca9-463f5ca5328c","last_modified":1480349210665},{"guid":"/^({d6e79525-4524-4707-9b97-1d70df8e7e59}|{ddb4644d-1a37-4e6d-8b6e-8e35e2a8ea6c}|{e55007f4-80c5-418e-ac33-10c4d60db01e}|{e77d8ca6-3a60-4ae9-8461-53b22fa3125b}|{e89a62b7-248e-492f-9715-43bf8c507a2f}|{5ce3e0cb-aa83-45cb-a7da-a2684f05b8f3})$/","prefs":[],"schema":1480349193877,"blockID":"i518","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947509","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing the add-on, and using multiple add-on IDs.","name":"Re-markit","created":"2013-12-20T12:56:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"145b0f22-501e-39eb-371e-ec8342a5add9","last_modified":1480349210606},{"guid":"{72b98dbc-939a-4e0e-b5a9-9fdbf75963ef}","prefs":[],"schema":1480349193877,"blockID":"i772","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SitezExpert","created":"2014-10-31T16:15:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"386cb2c9-e674-ce2e-345f-d30a785f90c5","last_modified":1480349210536},{"guid":"hha8771ui3-Fo9j9h7aH98jsdfa8sda@jetpack","prefs":[],"schema":1480349193877,"blockID":"i970","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1190963","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video fix (malware)","created":"2015-08-04T15:15:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3ca577d8-3685-4ba9-363b-5b2d8d8dd608","last_modified":1480349210477},{"guid":"{7e8a1050-cf67-4575-92df-dcc60e7d952d}","prefs":[],"schema":1480349193877,"blockID":"i478","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935796","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"SweetPacks","created":"2013-11-08T15:42:28Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1519eb45-fcaa-b531-490d-fe366490ed45","last_modified":1480349210416},{"guid":"/^({66b103a7-d772-4fcd-ace4-16f79a9056e0}|{6926c7f7-6006-42d1-b046-eba1b3010315}|{72cabc40-64b2-46ed-8648-26d831761150}|{73ee2cf2-7b76-4c49-b659-c3d8cf30825d}|{ca6446a5-73d5-4c35-8aa1-c71dc1024a18}|{5373a31d-9410-45e2-b299-4f61428f0be4})$/","prefs":[],"schema":1480349193877,"blockID":"i521","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:14:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"983cb7fe-e0b4-6a2e-f174-d2670876b2cd","last_modified":1480349210351},{"guid":"{dd6b651f-dfb9-4142-b0bd-09912ad22674}","prefs":[],"schema":1480349193877,"blockID":"i400","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"975d2126-f727-f5b9-ca01-b83345b80c56","last_modified":1480349210301},{"guid":"25p@9eAkaLq.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i730","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YYOutoubeAdBlocke","created":"2014-10-16T16:35:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5a0c5818-693f-43ae-f85a-c6928d9c2cc4","last_modified":1480349210275},{"guid":"tmbepff@trendmicro.com","prefs":[],"schema":1480349193877,"blockID":"i1222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1275245","who":"All users of this add-on. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"Add-on  is causing a high-frequency crash in Firefox","name":"Trend Micro BEP 9.1.0.1035 and lower","created":"2016-05-24T12:10:34Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"9.1.0.1035","minVersion":"0","targetApplication":[]}],"id":"8045c799-486a-927c-b972-b9da1c2dab2f","last_modified":1480349209818},{"guid":"pricepeep@getpricepeep.com","prefs":[],"schema":1480349193877,"blockID":"i220","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811433","who":"All Firefox users who have Pricepeed below 2.1.0.20 installed.","why":"Versions older than 2.1.0.20 of the PricePeep add-on were silently side-installed with other software, injecting advertisements in Firefox. Versions 2.1.0.20 and above don't have the install problems are not blocked.","name":"PricePeep","created":"2012-11-29T16:18:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"2.1.0.19.99","minVersion":"0","targetApplication":[]}],"id":"227b9a8d-c18d-239c-135e-d79e614fe392","last_modified":1480349209794},{"guid":"hoverst@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i498","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946029","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Flash Player (malware)","created":"2013-12-04T15:17:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2b25ba3e-45db-0e6c-965a-3acda1a44117","last_modified":1480349209745},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i606","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:07Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.13.*","minVersion":"3.15.13","targetApplication":[]}],"id":"c3d88e22-386a-da3b-8aba-3cb526e08053","last_modified":1480349209713},{"guid":"advance@windowsclient.com","prefs":[],"schema":1480349193877,"blockID":"i508","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950773","who":"All Firefox users who have this add-on installed.","why":"This is not the <a href=\"https://addons.mozilla.org/addon/microsoft-net-framework-assist/\">Microsoft .NET Framework Assistant</a> created and distributed by Microsoft. It is a malicious extension that is distributed under the same name to trick users into installing it, and turns users into a botnet that conducts SQL injection attacks on visited websites.","name":"Microsoft .NET Framework Assistant (malware)","created":"2013-12-16T10:15:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5d30a74-732e-c3fa-f13b-097ee28d4b27","last_modified":1480349209674},{"guid":"{5eeb83d0-96ea-4249-942c-beead6847053}","prefs":[],"schema":1480349193877,"blockID":"i756","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080846","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SmarterPower","created":"2014-10-17T16:30:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e101dbc0-190c-f6d8-e168-0c1380581cc9","last_modified":1480349209625},{"guid":"/^({7e8a1050-cf67-4575-92df-dcc60e7d952d}|{b3420a9c-a397-4409-b90d-bcf22da1a08a}|{eca6641f-2176-42ba-bdbe-f3e327f8e0af}|{707dca12-3f99-4d94-afea-06dcc0ae0108}|{aea20431-87fc-40be-bc5b-18066fe2819c}|{30ee6676-1ba6-455a-a7e8-298fa863a546})$/","prefs":[],"schema":1480349193877,"blockID":"i523","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:42:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a3a6bc8e-46a1-b3d5-1b20-58b90ba099c3","last_modified":1480349209559},{"guid":"{e0352044-1439-48ba-99b6-b05ed1a4d2de}","prefs":[],"schema":1480349193877,"blockID":"i710","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Site Counselor","created":"2014-09-30T15:28:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b8fedf07-dcaf-f0e3-b42b-32db75c4c304","last_modified":1480349209491},{"guid":"addlyrics@addlyrics.net","prefs":[],"schema":1480349193877,"blockID":"i426","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=891605","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Add Lyrics","created":"2013-07-09T15:25:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"81678e9e-ebf0-47d6-e409-085c25e67c7e","last_modified":1480349209383},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i610","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:21:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.22.*","minVersion":"3.15.22","targetApplication":[]}],"id":"935dfec3-d017-5660-db5b-94ae7cea6e5f","last_modified":1480349209128},{"guid":"info@allpremiumplay.info","prefs":[],"schema":1480349193877,"blockID":"i163","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-C (malware)","created":"2012-10-29T16:40:07Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6afbf9b8-ae3a-6a48-0f6c-7a3e065ec043","last_modified":1480349209076},{"guid":"now.msn.com@services.mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i490","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=926378","who":"All Firefox users who have this add-on installed.","why":"As part of their ongoing work to fine-tune their editorial mix, msnNOW has decided that msnNOW will stop publishing on Dec. 3, 2013. Rather than having a single home for trending content, they will continue integrating that material throughout all MSN channels. A big thank you to everyone who followed msnNOW stories using the Firefox sidebar","name":"MSNNow (discontinued social provider)","created":"2013-11-27T08:06:04Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"de7d699d-016d-d973-5e39-52568de6ffde","last_modified":1480349209021},{"guid":"fftoolbar2014@etech.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i858","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131078","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and changes users' settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF Toolbar","created":"2015-02-11T15:32:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6877bf40-9e45-7017-4dac-14d09e7f0ef6","last_modified":1480349208988},{"guid":"mbrnovone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i477","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=936249","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Mozilla Security Service (malware)","created":"2013-11-08T15:35:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"758c2503-766d-a2f5-4c58-7cea93acfe05","last_modified":1480349208962},{"guid":"{739df940-c5ee-4bab-9d7e-270894ae687a}","prefs":[],"schema":1480349193877,"blockID":"i530","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949558","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"WhiteSmoke New","created":"2013-12-20T14:49:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8097aa6-3009-6dfc-59df-353ba6b1142b","last_modified":1480349208933},{"guid":"firefoxaddon@youtubeenhancer.com","prefs":[],"schema":1480349193877,"blockID":"i636","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033120","who":"All Firefox users who have this version of the add-on installed.","why":"Version 199.7.0 of the YoutubeEnhancer extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YoutubeEnhancer - Firefox","created":"2014-07-08T15:58:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"199.7.0","minVersion":"199.7.0","targetApplication":[]}],"id":"204a074b-da87-2784-f15b-43a9ea9a6b36","last_modified":1480349208851},{"guid":"extacylife@a.com","prefs":[],"schema":1480349193877,"blockID":"i505","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947741","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-09T15:08:51Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5acadb8d-d3be-e0e0-4656-9107f9de0ea9","last_modified":1480349208823},{"guid":"{746505DC-0E21-4667-97F8-72EA6BCF5EEF}","prefs":[],"schema":1480349193877,"blockID":"i842","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128325","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Shopper-Pro","created":"2015-02-06T14:45:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f19c5fb-1c78-cbd6-8a03-1678efb54cbc","last_modified":1480349208766},{"guid":"{51c77233-c0ad-4220-8388-47c11c18b355}","prefs":[],"schema":1480349193877,"blockID":"i580","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004132","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, it can be enabled in the Add-ons Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Utility","created":"2014-04-30T13:55:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.1.9999999","minVersion":"0","targetApplication":[]}],"id":"daa2c60a-5009-2c65-a432-161d50bef481","last_modified":1480349208691},{"guid":"{a2bfe612-4cf5-48ea-907c-f3fb25bc9d6b}","prefs":[],"schema":1480349193877,"blockID":"i712","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Xplorer","created":"2014-09-30T15:28:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"13450534-93d7-f2a2-7f0a-e4e3948c4dc1","last_modified":1480349208027},{"guid":"ScorpionSaver@jetpack","prefs":[],"schema":1480349193877,"blockID":"i539","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963826","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"ScorpionSaver","created":"2014-01-28T14:00:30Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3499c968-6e8b-37f1-5f6e-2384807c2a6d","last_modified":1480349207972},{"guid":"{D19CA586-DD6C-4a0a-96F8-14644F340D60}","prefs":[],"schema":1480349193877,"blockID":"i42","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=690184","who":"Users of McAfee ScriptScan versions 14.4.0 and below for all versions of Firefox and SeaMonkey.","why":"This add-on causes a high volume of crashes.","name":"McAfee ScriptScan","created":"2011-10-03T09:38:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"14.4.0","minVersion":"0.1","targetApplication":[]}],"id":"1d35ac9d-49df-23cf-51f5-f3c228ad0dc9","last_modified":1480349207877},{"guid":"gjhrjenrengoe@jfdnkwelfwkm.com","prefs":[],"schema":1480349193877,"blockID":"i1042","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212174","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Avant Player (malware)","created":"2015-10-07T13:12:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d6453893-becc-7617-2050-0db284e0e0db","last_modified":1480349207840},{"guid":"{33e0daa6-3af3-d8b5-6752-10e949c61516}","prefs":[],"schema":1480349193877,"blockID":"i282","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835683","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>, bypassing the third party opt-in screen.","name":"Complitly","created":"2013-02-15T12:19:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.1.999","minVersion":"0","targetApplication":[]}],"id":"1f94bc8d-9d5f-c8f5-45c0-ad1f6e147c71","last_modified":1480349207789},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i608","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:20:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.20.*","minVersion":"3.15.18","targetApplication":[]}],"id":"e7d50ff2-5948-d571-6711-37908ccb863f","last_modified":1480349207761},{"guid":"{63eb5ed4-e1b3-47ec-a253-f8462f205350}","prefs":[],"schema":1480349193877,"blockID":"i786","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FF-Plugin","created":"2014-11-18T12:33:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ca4558a2-8ce4-3ca0-3d29-63019f680c8c","last_modified":1480349207705},{"guid":"jid1-4vUehhSALFNqCw@jetpack","prefs":[],"schema":1480349193877,"blockID":"i634","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033002","who":"All Firefox users who have this version of the add-on installed.","why":"Version 99.7 of the YouTube Plus Plus extension isn't developed by the original developer, and is likely malicious in nature. It violates the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> for reusing an already existent ID.","name":"YouTube Plus Plus 99.7","created":"2014-07-04T14:13:57Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"99.7","minVersion":"99.7","targetApplication":[]}],"id":"a6d017cb-e33f-2239-4e42-ab4e7cfb19fe","last_modified":1480349207680},{"guid":"{aab02ab1-33cf-4dfa-8a9f-f4e60e976d27}","prefs":[],"schema":1480349193877,"blockID":"i820","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Incredible Web","created":"2015-01-13T09:27:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"847ecc6e-1bc1-f7ff-e1d5-a76e6b8447d2","last_modified":1480349207654},{"guid":"torntv@torntv.com","prefs":[],"schema":1480349193877,"blockID":"i320","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-03-20T16:35:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cdd492b8-8101-74a9-5760-52ff709fd445","last_modified":1480349207608},{"guid":"crossriderapp12555@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i674","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=877836","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"The add-on is silently installed, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"JollyWallet","created":"2014-07-22T16:26:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d4467e20-0f71-f0e0-8cd6-40c82b6c7379","last_modified":1480349207561},{"guid":"344141-fasf9jas08hasoiesj9ia8ws@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1038","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211169","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Plugin (malware)","created":"2015-10-05T16:42:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7986b7b-9b5a-d372-8147-8b4bd6f5a29b","last_modified":1480349207485},{"guid":"meOYKQEbBBjH5Ml91z0p9Aosgus8P55bjTa4KPfl@jetpack","prefs":[],"schema":1480349193877,"blockID":"i998","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201164","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Smooth Player (malware)","created":"2015-09-07T13:54:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30c3e511-9e8d-15ee-0867-d61047e56515","last_modified":1480349207370},{"guid":"{8dc5c42e-9204-2a64-8b97-fa94ff8a241f}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i770","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astrmenda Search","created":"2014-10-30T14:52:52Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8a9c7702-0349-70d6-e64e-3a666ab084c6","last_modified":1480349207320},{"guid":"savingsslider@mybrowserbar.com","prefs":[],"schema":1480349193877,"blockID":"i752","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963788","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Slick Savings","created":"2014-10-17T16:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b1faf30-5725-7847-d993-b5cdaabc9829","last_modified":1480349207290},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i612","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:23:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.24.*","minVersion":"3.15.24","targetApplication":[]}],"id":"e0ff9df4-60e4-dbd0-8018-57f395e6610a","last_modified":1480349206818},{"guid":"{1e4ea5fc-09e5-4f45-a43b-c048304899fc}","prefs":[],"schema":1480349193877,"blockID":"i812","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Great Finder","created":"2015-01-06T13:22:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ea40b9f-2423-a2fd-a5e9-4ec1df2715f4","last_modified":1480349206784},{"guid":"crossriderapp8812@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i314","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835665","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"Coupon Companion","created":"2013-03-06T14:14:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"06c07e28-0a34-e5ee-e724-491a2f6ce586","last_modified":1480349206708},{"guid":"/^(ffxtlbr@mixidj\\.com|{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}|{67097627-fd8e-4f6b-af4b-ecb65e50112e}|{f6f0f973-a4a3-48cf-9a7a-b7a69c30d71a}|{a3d0e35f-f1da-4ccb-ae77-e9d27777e68d}|{1122b43d-30ee-403f-9bfa-3cc99b0caddd})$/","prefs":[],"schema":1480349193877,"blockID":"i540","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:07:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4c03ddda-bb3f-f097-0a7b-b7b77b050584","last_modified":1480349206678},{"guid":"hansin@topvest.id","prefs":[],"schema":1480349193877,"blockID":"i836","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130406","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Inside News (malware)","created":"2015-02-06T14:17:39Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0945a657-f28d-a02c-01b2-5115b3f90d7a","last_modified":1480349206628},{"guid":"lfind@nijadsoft.net","prefs":[],"schema":1480349193877,"blockID":"i358","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=874131","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Lyrics Finder","created":"2013-05-24T14:09:47Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2307f11c-6216-0dbf-a464-b2921055ce2b","last_modified":1480349206603},{"guid":"plugin@getwebcake.com","prefs":[],"schema":1480349193877,"blockID":"i484","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=938264","who":"All Firefox users who have this add-on installed.","why":"This add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> and is broadly considered to be malware. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"WebCake","created":"2013-11-14T09:55:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2865addd-da1c-20c4-742f-6a2270da2e78","last_modified":1480349206578},{"guid":"{c0c2693d-2ee8-47b4-9df7-b67a0ee31988}","prefs":[],"schema":1480349193877,"blockID":"i354","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=837838","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n\r\nUsers who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Mixi DJ","created":"2013-05-23T14:31:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"03a745c3-0ee7-e262-ba31-62d4f78ddb62","last_modified":1480349206525},{"guid":"/^({7316e43a-3ebd-4bb4-95c1-9caf6756c97f}|{0cc09160-108c-4759-bab1-5c12c216e005}|{ef03e721-f564-4333-a331-d4062cee6f2b}|{465fcfbb-47a4-4866-a5d5-d12f9a77da00}|{7557724b-30a9-42a4-98eb-77fcb0fd1be3}|{b7c7d4b0-7a84-4b73-a7ef-48ef59a52c3b})$/","prefs":[],"schema":1480349193877,"blockID":"i520","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947485","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed and using multiple add-on IDs.","name":"appbario7","created":"2013-12-20T13:11:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3901c48-9c06-fecb-87d3-efffd9940c22","last_modified":1480349206491},{"guid":"{354dbb0a-71d5-4e9f-9c02-6c88b9d387ba}","prefs":[],"schema":1480349193877,"blockID":"i538","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964081","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Show Mask ON (malware)","created":"2014-01-27T10:13:17Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad90253-8921-b5df-3658-45a70d75f3d7","last_modified":1480349206465},{"guid":"{8E9E3331-D360-4f87-8803-52DE43566502}","prefs":[],"schema":1480349193877,"blockID":"i461","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=906071","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which is <a href=\"https://addons.mozilla.org/firefox/blocked/i392\">blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-10-17T16:10:51Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ae8cca6e-4258-545f-9a69-3d908264a701","last_modified":1480349206437},{"guid":"info@bflix.info","prefs":[],"schema":1480349193877,"blockID":"i172","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have this add-on installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:39:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7a9062f4-218d-51d2-9b8c-b282e6eada4f","last_modified":1480349206384},{"guid":"{dff137ae-1ffd-11e3-8277-b8ac6f996f26}","prefs":[],"schema":1480349193877,"blockID":"i450","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=917861","who":"All Firefox users who have this add-on installed.","why":"This is add-on is malware that silently redirects popular search queries to a third party.","name":"Addons Engine (malware)","created":"2013-09-18T16:19:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8e583fe4-1c09-9bea-2473-faecf3260685","last_modified":1480349206312},{"guid":"12x3q@3244516.com","prefs":[],"schema":1480349193877,"blockID":"i493","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=939254","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware and is installed silently in violation of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BetterSurf (malware)","created":"2013-12-02T12:49:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"af2a9e74-3753-9ff1-d899-5d1e79ed3dce","last_modified":1480349206286},{"guid":"{20AD702C-661E-4534-8CE9-BA4EC9AD6ECC}","prefs":[],"schema":1480349193877,"blockID":"i626","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1027886","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-19T15:16:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b9ccabe-8f9a-e3d1-a689-1aefba1f33b6","last_modified":1480349206261},{"guid":"{c5e48979-bd7f-4cf7-9b73-2482a67a4f37}","prefs":[],"schema":1480349193877,"blockID":"i736","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080842","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ClearThink","created":"2014-10-17T15:22:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6e8b3e4f-2f59-cde3-e6d2-5bc6e216c506","last_modified":1480349206231},{"guid":"{41339ee8-61ed-489d-b049-01e41fd5d7e0}","prefs":[],"schema":1480349193877,"blockID":"i810","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"FireWeb","created":"2014-12-23T10:32:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a35f2ca6-aec4-c01d-170e-650258ebcd2c","last_modified":1480349206165},{"guid":"{845cab51-d8d2-472f-8bd9-2b44642d97c2}","prefs":[],"schema":1480349193877,"blockID":"i460","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=927456","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and handles users' settings, violating some of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Vafmusic9","created":"2013-10-17T15:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8538ccb4-3b71-9858-3f6d-c0fff7af58b0","last_modified":1480349205746},{"guid":"SpecialSavings@SpecialSavings.com","prefs":[],"schema":1480349193877,"blockID":"i676","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881511","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This is add-on is generally considered to be unwanted and is probably silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SpecialSavings","created":"2014-07-22T16:31:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5e921810-fc3a-0729-6749-47e38ad10a22","last_modified":1480349205688},{"guid":"afurladvisor@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i434","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Helper","created":"2013-08-09T11:26:11Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"083585eb-d7e7-e228-5fbf-bf35c52044e4","last_modified":1480349205645},{"guid":"info@thebflix.com","prefs":[],"schema":1480349193877,"blockID":"i174","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806802","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Bflix (malware)","created":"2012-10-30T13:40:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"811a61d4-9435-133e-6262-fb72486c36b0","last_modified":1480349205526},{"guid":"{EEE6C361-6118-11DC-9C72-001320C79847}","prefs":[],"schema":1480349193877,"blockID":"i392","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SweetPacks Toolbar","created":"2013-06-25T12:38:45Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c1dc6607-4c0a-4031-9f14-70ef1ae1edcb","last_modified":1480349205455},{"guid":"/^(4cb61367-efbf-4aa1-8e3a-7f776c9d5763@cdece6e9-b2ef-40a9-b178-291da9870c59\\.com|0efc9c38-1ec7-49ed-8915-53a48b6b7600@e7f17679-2a42-4659-83c5-7ba961fdf75a\\.com|6be3335b-ef79-4b0b-a0ba-b87afbc6f4ad@6bbb4d2e-e33e-4fa5-9b37-934f4fb50182\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i531","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:01:22Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"46aa79a9-d329-f713-d4f2-07d31fe7071e","last_modified":1480349205287},{"guid":"afext@anchorfree.com","prefs":[],"schema":1480349193877,"blockID":"i466","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=933988","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't respect user choice, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield Extension","created":"2013-11-07T13:32:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8176f879-bd73-5468-e908-2d7cfc115ac2","last_modified":1480349205108},{"guid":"{FCE04E1F-9378-4f39-96F6-5689A9159E45}","prefs":[],"schema":1480349193877,"blockID":"i920","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:26:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"eb191ff0-20f4-6e04-4344-d880af4faf51","last_modified":1480349204978},{"guid":"{9CE11043-9A15-4207-A565-0C94C42D590D}","prefs":[],"schema":1480349193877,"blockID":"i503","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947384","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that uses a deceptive name to stay in users' systems.","name":"XUL Cache (malware)","created":"2013-12-06T11:58:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dcdae267-8d3a-5671-dff2-f960febbbb20","last_modified":1480349204951},{"guid":"{0153E448-190B-4987-BDE1-F256CADA672F}","prefs":[],"schema":1480349193877,"blockID":"i914","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:56:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"2bfe0d89-e458-9d0e-f944-ddeaf8c4db6c","last_modified":1480349204871},{"guid":"{77beece6-3997-403a-92fa-0055bfcf88e5}","prefs":[],"schema":1480349193877,"blockID":"i452","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted11","created":"2013-09-18T16:34:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d348f91f-caeb-a803-dfd9-fd5d285aa0fa","last_modified":1480349204844},{"guid":"dealcabby@jetpack","prefs":[],"schema":1480349193877,"blockID":"i222","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=811435","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed with other software, injecting advertisements in Firefox.","name":"DealCabby","created":"2012-11-29T16:20:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6585f0bd-4f66-71e8-c565-d9762c5c084a","last_modified":1480349204818},{"guid":"{3c9a72a0-b849-40f3-8c84-219109c27554}","prefs":[],"schema":1480349193877,"blockID":"i510","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=951301","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-17T14:27:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7cfa3d0b-0ab2-5e3a-8143-1031c180e32f","last_modified":1480349204778},{"guid":"{2aab351c-ad56-444c-b935-38bffe18ad26}","prefs":[],"schema":1480349193877,"blockID":"i500","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946087","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Adobe Photo (malware)","created":"2013-12-04T15:29:44Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f7a76d34-ddcd-155e-9fae-5967bd796041","last_modified":1480349204716},{"guid":"{0A92F062-6AC6-8180-5881-B6E0C0DC2CC5}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i864","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131220","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and makes unwanted settings changes, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BlockAndSurf","created":"2015-02-26T12:56:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"acb16d1c-6274-93a3-7c1c-7ed36ede64a9","last_modified":1480349204612},{"guid":"trackerbird@bustany.org","prefs":[],"schema":1480349193877,"blockID":"i986","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1189264","who":"All Thunderbird users who have this version of the add-on installed on Thunderbird 38.0a2 and above.","why":"This add-on is causing consistent crashes on Thunderbird 38.0a2 and above.","name":"trackerbird 1.2.6","created":"2015-08-17T15:56:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.2.6","minVersion":"1.2.6","targetApplication":[{"guid":"{3550f703-e582-4d05-9a08-453d09bdfdc6}","maxVersion":"*","minVersion":"38.0a2"}]}],"id":"bb1c699e-8790-4528-0b6d-4f83b7a3152d","last_modified":1480349204041},{"guid":"{0134af61-7a0c-4649-aeca-90d776060cb3}","prefs":[],"schema":1480349193877,"blockID":"i448","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=912746","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our Add-on Guidelines. It manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar add-on","created":"2013-09-13T16:15:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cf428416-4974-8bb4-7928-c0cb2cfe7957","last_modified":1480349203968},{"guid":"/^(firefox@vebergreat\\.net|EFGLQA@78ETGYN-0W7FN789T87\\.COM)$/","prefs":[],"schema":1480349193877,"blockID":"i564","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=974104","who":"All Firefox users who have these add-ons installed. If you wish to continue using these add-ons, you can enable them in the Add-ons Manager.","why":"These add-ons are silently installed by the Free Driver Scout installer, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"veberGreat and vis (Free Driver Scout bundle)","created":"2014-03-05T13:02:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"487538f1-698e-147e-6395-986759ceed7e","last_modified":1480349203902},{"guid":"69ffxtbr@PackageTracer_69.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i882","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1153001","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be malware, hijacking user's settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PackageTracer","created":"2015-04-10T16:18:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d37b4e0-3c60-fdad-dd8c-59baff6eae87","last_modified":1480349203836},{"guid":"{a9bb9fa0-4122-4c75-bd9a-bc27db3f9155}","prefs":[],"schema":1480349193877,"blockID":"i404","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb7a1dc7-16a0-4f70-8289-4df494e0d0fa","last_modified":1480349203633},{"guid":"P2@D.edu","prefs":[],"schema":1480349193877,"blockID":"i850","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128269","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"unIsaless","created":"2015-02-09T15:29:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"49536a29-fc7e-9fd0-f415-e15ac090fa56","last_modified":1480349203605},{"guid":"linksicle@linksicle.com","prefs":[],"schema":1480349193877,"blockID":"i472","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9b5b15b3-6da7-cb7c-3c44-30b4fe079d52","last_modified":1480349203581},{"guid":"{377e5d4d-77e5-476a-8716-7e70a9272da0}","prefs":[],"schema":1480349193877,"blockID":"i398","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:15:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ea94df32-2a85-23da-43f7-3fc5714530ec","last_modified":1480349203519},{"guid":"{4933189D-C7F7-4C6E-834B-A29F087BFD23}","prefs":[],"schema":1480349193877,"blockID":"i437","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=900695","who":"All Firefox users.","why":"This add-on is widely reported to be malware.","name":"Win32.SMSWebalta (malware)","created":"2013-08-09T15:14:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cbef1357-d6bc-c8d3-7a82-44af6b1c390f","last_modified":1480349203486},{"guid":"{ADFA33FD-16F5-4355-8504-DF4D664CFE10}","prefs":[],"schema":1480349193877,"blockID":"i306","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844972","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed, bypassing our third-party opt-in screen, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>. It's also possible that it changes user settings without their consent.","name":"Nation Toolbar","created":"2013-02-28T12:56:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"017fd151-37ca-4646-4763-1d303fb918fa","last_modified":1480349203460},{"guid":"detgdp@gmail.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i884","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1152614","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hijacking user settings, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Security Protection (malware)","created":"2015-04-10T16:21:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b5cc88e-499d-2a47-d793-982d4c05e6ee","last_modified":1480349203433},{"guid":"/^(67314b39-24e6-4f05-99f3-3f88c7cddd17@6c5fa560-13a3-4d42-8e90-53d9930111f9\\.com|ffxtlbr@visualbee\\.com|{7aeae561-714b-45f6-ace3-4a8aed6e227b}|{7093ee04-f2e4-4637-a667-0f730797b3a0}|{53c4024f-5a2e-4f2a-b33e-e8784d730938})$/","prefs":[],"schema":1480349193877,"blockID":"i514","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:25:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f91eee1-7303-3f97-dfe6-1e897a156c7f","last_modified":1480349203408},{"guid":"FXqG@xeeR.net","prefs":["browser.startup.homepage"],"schema":1480349193877,"blockID":"i720","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"GoSSave","created":"2014-10-02T12:23:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc061-a4ff-b75b-ec42-eb17c42a2956","last_modified":1480349203341},{"guid":"kallow@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i495","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945426","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Facebook Security Service (malware)","created":"2013-12-02T15:09:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a2c37a9-e7cc-2d03-2043-098d36b8aca2","last_modified":1480349203247},{"guid":"008abed2-b43a-46c9-9a5b-a771c87b82da@1ad61d53-2bdc-4484-a26b-b888ecae1906.com","prefs":[],"schema":1480349193877,"blockID":"i528","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949565","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"weDownload Manager Pro","created":"2013-12-20T14:40:58Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"da46065f-1c68-78f7-80fc-8ae07b5df68d","last_modified":1480349203131},{"guid":"{25dd52dc-89a8-469d-9e8f-8d483095d1e8}","prefs":[],"schema":1480349193877,"blockID":"i714","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Counselor","created":"2014-10-01T15:36:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e46c31ad-0ab3-e48a-47aa-9fa91b675fda","last_modified":1480349203066},{"guid":"{B1FC07E1-E05B-4567-8891-E63FBE545BA8}","prefs":[],"schema":1480349193877,"blockID":"i926","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:28:46Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"09868783-261a-ac24-059d-fc772218c1ba","last_modified":1480349202708},{"guid":"/^(torntv@torntv\\.com|trtv3@trtv\\.com|torntv2@torntv\\.com|e2fd07a6-e282-4f2e-8965-85565fcb6384@b69158e6-3c3b-476c-9d98-ae5838c5b707\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i529","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949559","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by being silently installed.","name":"TornTV","created":"2013-12-20T14:46:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"040e5ec2-ea34-816a-f99f-93296ce845e8","last_modified":1480349202677},{"guid":"249911bc-d1bd-4d66-8c17-df533609e6d8@c76f3de9-939e-4922-b73c-5d7a3139375d.com","prefs":[],"schema":1480349193877,"blockID":"i532","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949672","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and using multiple IDs.","name":"Feven","created":"2013-12-20T15:02:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d32b850d-82d5-b63d-087c-fb2041b2c232","last_modified":1480349202631},{"guid":"{7D4F1959-3F72-49d5-8E59-F02F8AA6815D}","prefs":[],"schema":1480349193877,"blockID":"i394","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=881447","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This is a companion add-on for the SweetPacks Toolbar which <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i392\">is blocked</a> due to guideline violations.","name":"Updater By SweetPacks","created":"2013-06-25T12:40:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"851c2b8e-ea19-3a63-eac5-f931a8da5d6e","last_modified":1480349202341},{"guid":"g@uzcERQ6ko.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i776","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>","name":"GoSave","created":"2014-10-31T16:23:36Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ee1e1a44-b51b-9f12-819d-64c3e515a147","last_modified":1480349202307},{"guid":"ffxtlbr@incredibar.com","prefs":[],"schema":1480349193877,"blockID":"i318","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812264","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"IncrediBar","created":"2013-03-20T14:40:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9e84b07c-84d5-c932-85f2-589713d7e380","last_modified":1480349202280},{"guid":"M1uwW0@47z8gRpK8sULXXLivB.com","prefs":[],"schema":1480349193877,"blockID":"i870","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1131159","who":"All users who have this add-on installed.","why":"This is a malicious add-on that goes by the the name \"Flash Player 11\".","name":"Flash Player 11 (malware)","created":"2015-03-04T14:34:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"71d961b2-37d1-d393-76f5-3afeef57e749","last_modified":1480349202252},{"guid":"4zffxtbr-bs@VideoDownloadConverter_4z.com","prefs":[],"schema":1480349193877,"blockID":"i507","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949266","who":"All Firefox users who have this add-on installed.","why":"Certain versions of this add-on contains an executable that is flagged by multiple tools as malware. Newer versions no longer use it.","name":"VideoDownloadConverter","created":"2013-12-12T15:37:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.75.3.25126","minVersion":"0","targetApplication":[]}],"id":"0a0f106a-ecc6-c537-1818-b36934943e91","last_modified":1480349202156},{"guid":"contato@facefollow.net","prefs":[],"schema":1480349193877,"blockID":"i509","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950846","who":"All Firefox users who have this add-on installed.","why":"This add-on spams users' Facebook accounts.","name":"Face follow","created":"2013-12-16T16:15:15Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"56f15747-af8c-342c-6877-a41eeacded84","last_modified":1480349202067},{"guid":"/^({83a8ce1b-683c-4784-b86d-9eb601b59f38}|{ef1feedd-d8da-4930-96f1-0a1a598375c6}|{79ff1aae-701f-4ca5-aea3-74b3eac6f01b}|{8a184644-a171-4b05-bc9a-28d75ffc9505}|{bc09c55d-0375-4dcc-836e-0e3c8addfbda}|{cef81415-2059-4dd5-9829-1aef3cf27f4f})$/","prefs":[],"schema":1480349193877,"blockID":"i526","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949566","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and uses multiple IDs.","name":"KeyBar add-on","created":"2013-12-20T14:12:31Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9dfa4e92-bbf2-66d1-59a9-51402d1d226c","last_modified":1480349202010},{"guid":"{f2548724-373f-45fe-be6a-3a85e87b7711}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i768","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1088726","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astro New Tab","created":"2014-10-30T14:52:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8510e9e2-c7d8-90d0-a2ff-eb09293acc6e","last_modified":1480349201854},{"guid":"KSqOiTeSJEDZtTGuvc18PdPmYodROmYzfpoyiCr2@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1032","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211172","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Video Player (malware)","created":"2015-10-05T16:22:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d9188ac-235f-773a-52a2-261b3ea9c03c","last_modified":1480349201504},{"guid":"{849ded12-59e9-4dae-8f86-918b70d213dc}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i708","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1047102","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes homepage and search settings without the user's consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda New Tab","created":"2014-09-02T16:29:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a319bfee-464f-1c33-61ad-738c52842fbd","last_modified":1480349201453},{"guid":"grjkntbhr@hgergerherg.com","prefs":[],"schema":1480349193877,"blockID":"i1018","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1208196","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"GreenPlayer (malware)","created":"2015-09-24T16:04:53Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"9c47d940-bdd9-729f-e32e-1774d87f24b5","last_modified":1480349201425},{"guid":"{EEF73632-A085-4fd3-A778-ECD82C8CB297}","prefs":[],"schema":1480349193877,"blockID":"i165","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=806451","who":"All Firefox users who have these add-ons installed.","why":"These are malicious add-ons that are distributed with a trojan and negatively affect web browsing.","name":"Codec-M (malware)","created":"2012-10-29T16:41:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e5ecd02a-20ee-749b-d5cf-3d74d1173a1f","last_modified":1480349201262},{"guid":"firefox-extension@mozilla.org","prefs":[],"schema":1480349193877,"blockID":"i688","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1049533","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hides itself under the name Java_plugin, among others.","name":"FinFisher (malware)","created":"2014-08-06T17:13:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"98aca74a-69c7-9960-cccc-096a4a4adc6c","last_modified":1480349201235},{"guid":"{e44a1809-4d10-4ab8-b343-3326b64c7cdd}","prefs":[],"schema":1480349193877,"blockID":"i451","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=916966","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, manipulating settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Entrusted","created":"2013-09-18T16:33:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ad5f53ed-7a43-cb1f-cbd7-41808fac1791","last_modified":1480349201128},{"guid":"{21EAF666-26B3-4A3C-ABD0-CA2F5A326744}","prefs":[],"schema":1480349193877,"blockID":"i620","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024752","who":"All Firefox users who have this add-on installed.","why":"This add-on is probably silently installed, and is causing significant stability issues for users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-06-12T15:27:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2d8833db-01a7-a758-080f-19e47abc54cb","last_modified":1480349201096},{"guid":"{1FD91A9C-410C-4090-BBCC-55D3450EF433}","prefs":[],"schema":1480349193877,"blockID":"i338","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844979","who":"All Firefox users who have this add-on installed.","why":"This extension overrides search settings, and monitors any further changes done to them so that they can be reverted. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">add-on guidelines</a>.","name":"DataMngr (malware)","created":"2013-04-24T11:30:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"2e35995f-bec6-aa2b-3372-346d3325f72e","last_modified":1480349201059},{"guid":"9598582LLKmjasieijkaslesae@jetpack","prefs":[],"schema":1480349193877,"blockID":"i996","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1201165","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Secure Player (malware)","created":"2015-09-07T13:50:27Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"52f9c6e7-f7d5-f52e-cc35-eb99ef8b4b6a","last_modified":1480349201029},{"guid":"{bf7380fa-e3b4-4db2-af3e-9d8783a45bfc}","prefs":[],"schema":1480349193877,"blockID":"i406","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=776404","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on changes search settings without user interaction, and fails to reset them after it is removed. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"uTorrentBar","created":"2013-06-27T10:46:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3bcefc4b-110c-f3b8-17ad-f9fc97c1120a","last_modified":1480349201000},{"guid":"{424b0d11-e7fe-4a04-b7df-8f2c77f58aaf}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i800","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda NT","created":"2014-12-15T10:51:56Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"07bdf6aa-cfc8-ed21-6b36-6f90af02b169","last_modified":1480349200939},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i618","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.\r\n","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.\r\n","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:25:04Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.31.*","minVersion":"3.15.31","targetApplication":[]}],"id":"825feb43-d6c2-7911-4189-6f589f612c34","last_modified":1480349200911},{"guid":"{167d9323-f7cc-48f5-948a-6f012831a69f}","prefs":[],"schema":1480349193877,"blockID":"i262","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=812303","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and doesn't do much more than changing the users' settings, without reverting them on removal.","name":"WhiteSmoke (malware)","created":"2013-01-29T13:33:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a8f249fe-3db8-64b8-da89-7b584337a7af","last_modified":1480349200885},{"guid":"/^({988919ff-0cd8-4d0c-bc7e-60d55a49eb64}|{494b9726-9084-415c-a499-68c07e187244}|{55b95864-3251-45e9-bb30-1a82589aaff1}|{eef3855c-fc2d-41e6-8d91-d368f51b3055}|{90a1b331-c2b4-4933-9f63-ba7b84d60d58}|{d2cf9842-af95-48cd-b873-bfbb48cd7f5e})$/","prefs":[],"schema":1480349193877,"blockID":"i541","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:09:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36196aed-9d0d-ebee-adf1-d1f7fadbc48f","last_modified":1480349200819},{"guid":"{29b136c9-938d-4d3d-8df8-d649d9b74d02}","prefs":[],"schema":1480349193877,"blockID":"i598","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011322","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Mega Browse","created":"2014-06-12T13:21:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"63b1c965-27c3-cd06-1b76-8721add39edf","last_modified":1480349200775},{"guid":"{6e7f6f9f-8ce6-4611-add2-05f0f7049ee6}","prefs":[],"schema":1480349193877,"blockID":"i868","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1086574","who":"All users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Word Proser","created":"2015-02-26T14:58:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f54797da-cdcd-351a-c95e-874b64b0d226","last_modified":1480349200690},{"guid":"{02edb56b-9b33-435b-b7df-b2843273a694}","prefs":[],"schema":1480349193877,"blockID":"i438","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=896581","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. It is installed bypassing the Firefox opt-in screen, and manipulates settings without reverting them on removal. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"KeyBar Toolbar","created":"2013-08-09T15:27:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"896710d2-5a65-e9b0-845b-05aa72c2bd51","last_modified":1480349200338},{"guid":"{1cdbda58-45f8-4d91-b566-8edce18f8d0a}","prefs":[],"schema":1480349193877,"blockID":"i724","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080835","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor Pro","created":"2014-10-13T16:00:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"7b70bd36-d2f7-26fa-9038-8b8dd132cd81","last_modified":1480349200288},{"guid":"{b12785f5-d8d0-4530-a3ea-5c4263b85bef}","prefs":[],"schema":1480349193877,"blockID":"i988","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1161573","who":"All users who have this add-on installed. Those who wish continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on overrides user's preferences without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Hero Fighter Community Toolbar","created":"2015-08-17T16:04:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3e6d73f2-e8e3-af69-866e-30d3977b09e4","last_modified":1480349200171},{"guid":"{c2d64ff7-0ab8-4263-89c9-ea3b0f8f050c}","prefs":[],"schema":1480349193877,"blockID":"i39","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=665775","who":"Users of MediaBar versions 4.3.1.00 and below in all versions of Firefox.","why":"This add-on causes a high volume of crashes and is incompatible with certain versions of Firefox.","name":"MediaBar","created":"2011-07-19T10:18:12Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"4.3.1.00","minVersion":"0.1","targetApplication":[]}],"id":"e928a115-9d8e-86a4-e2c7-de39627bd9bf","last_modified":1480349200047},{"guid":"{9edd0ea8-2819-47c2-8320-b007d5996f8a}","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i684","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1033857","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is believed to be silently installed in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"webget","created":"2014-08-06T13:33:33Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d38561f5-370f-14be-1443-a74dad29b1f3","last_modified":1480349199962},{"guid":"/^({ad9a41d2-9a49-4fa6-a79e-71a0785364c8})|(ffxtlbr@mysearchdial\\.com)$/","prefs":["browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i670","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036740","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on has been repeatedly been silently installed into users' systems, and is known for changing the default search without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MySearchDial","created":"2014-07-18T15:47:35Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a04075e6-5df2-2e1f-85a6-3a0171247349","last_modified":1480349199927},{"guid":"/^({1f43c8af-e9e4-4e5a-b77a-f51c7a916324}|{3a3bd700-322e-440a-8a6a-37243d5c7f92}|{6a5b9fc2-733a-4964-a96a-958dd3f3878e}|{7b5d6334-8bc7-4bca-a13e-ff218d5a3f17}|{b87bca5b-2b5d-4ae8-ad53-997aa2e238d4}|{bf8e032b-150f-4656-8f2d-6b5c4a646e0d})$/","prefs":[],"schema":1480349193877,"blockID":"i1136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a2d0378f-ebe4-678c-62d8-2e4c6a613c17","last_modified":1480349199818},{"guid":"liiros@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i814","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119657","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"One Tab (malware)","created":"2015-01-09T12:49:05Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"387c054d-cc9f-7ebd-c814-b4c1fbcb2880","last_modified":1480349199791},{"guid":"{97E22097-9A2F-45b1-8DAF-36AD648C7EF4}","prefs":[],"schema":1480349193877,"blockID":"i916","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1170633","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-02T09:57:38Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"94fba774-c4e6-046a-bc7d-ede787a9d0fe","last_modified":1480349199738},{"guid":"{b64982b1-d112-42b5-b1e4-d3867c4533f8}","prefs":[],"schema":1480349193877,"blockID":"i167","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=805973","who":"All Firefox users who have this add-on installed.","why":"This add-on is a frequent cause for browser crashes and other problems.","name":"Browser Manager","created":"2012-10-29T17:17:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"00bbe501-2d27-7a1c-c344-6eea1c707473","last_modified":1480349199673},{"guid":"{58bd07eb-0ee0-4df0-8121-dc9b693373df}","prefs":[],"schema":1480349193877,"blockID":"i286","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=842206","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-02-18T10:54:28Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b40a60d3-b9eb-09eb-bb02-d50b27aaac9f","last_modified":1480349199619},{"guid":"trtv3@trtv.com","prefs":[],"schema":1480349193877,"blockID":"i465","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=845610","who":"All Firefox users who have this add-on installed.","why":"This add-on doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, bypassing our third party install opt-in screen. Users who wish to continue using this extension can enable it in the Add-ons Manager.","name":"TornTV","created":"2013-11-01T15:21:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3d4d8a33-2eff-2556-c699-9be0841a8cd4","last_modified":1480349199560},{"guid":"{d2cf9842-af95-48cd-b873-bfbb48cd7f5e}","prefs":[],"schema":1480349193877,"blockID":"i439","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902569","who":"All Firefox users who have this add-on installed.","why":"This is another instance of the <a href=\"https://addons.mozilla.org/en-US/firefox/blocked/i354\">previously blocked</a> Mixi DJ add-on, which doesn't follow our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you wish to continue using it, it can be enabled in the Add-ons Manager.","name":"Mixi DJ V45","created":"2013-08-09T16:08:18Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e81c31fc-265e-61b9-d4c1-0e2f31f1652e","last_modified":1480349199478},{"guid":"/^({b95faac1-a3d7-4d69-8943-ddd5a487d966}|{ecce0073-a837-45a2-95b9-600420505f7e}|{2713b394-286f-4d7c-89ea-4174eeab9f5a}|{da7a20cf-bef4-4342-ad78-0240fdf87055})$/","prefs":[],"schema":1480349193877,"blockID":"i624","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.\r\n","name":"WiseConvert","created":"2014-06-18T13:50:38Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ed57d7a6-5996-c7da-8e07-1ad125183e84","last_modified":1480349199446},{"guid":"{f894a29a-f065-40c3-bb19-da6057778493}","prefs":[],"schema":1480349193877,"blockID":"i742","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080817","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on appears to be silently installed into users' systems, and changes settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-10-17T15:46:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"39d8334e-4b7c-4336-2d90-e6aa2d783967","last_modified":1480349199083},{"guid":"plugin@analytic-s.com","prefs":[],"schema":1480349193877,"blockID":"i467","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935797","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Analytics","created":"2013-11-07T14:08:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffbed3f3-e5c9-bc6c-7530-f68f47b7efd6","last_modified":1480349199026},{"guid":"{C4A4F5A0-4B89-4392-AFAC-D58010E349AF}","prefs":[],"schema":1480349193877,"blockID":"i678","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=895668","who":"All Firefox users who have this add-on installed. If you wish to continue using it, you can enable it in the Add-ons Manager.","why":"This add-on is generally silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"DataMngr","created":"2014-07-23T14:12:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"151021fc-ce4e-a734-e075-4ece19610f64","last_modified":1480349198947},{"guid":"HxLVJK1ioigz9WEWo8QgCs3evE7uW6LEExAniBGG@jetpack","prefs":[],"schema":1480349193877,"blockID":"i1036","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1211170","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Mega Player (malware)","created":"2015-10-05T16:37:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32e34b41-a73c-72d4-c96c-136917ad1d4d","last_modified":1480349198894},{"guid":"{6af08a71-380e-42dd-9312-0111d2bc0630}","prefs":[],"schema":1480349193877,"blockID":"i822","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1126353","who":"All Firefox users who have this add-on installed.","why":"This add-on appears to be malware, hiding itself in the Add-ons Manager, and keeping track of certain user actions.","name":"{6af08a71-380e-42dd-9312-0111d2bc0630} (malware)","created":"2015-01-27T09:50:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96d0c12b-a6cf-4539-c1cf-a1c75c14ff24","last_modified":1480349198826},{"guid":"colmer@yopmail.com","prefs":[],"schema":1480349193877,"blockID":"i550","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=968445","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2014-02-06T15:49:25Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c394d10b-384e-cbd0-f357-9c521715c373","last_modified":1480349198744},{"guid":"fplayer@adobe.flash","prefs":[],"schema":1480349193877,"blockID":"i444","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=909433","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware disguised as the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-08-26T14:49:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c6557989-1b59-72a9-da25-b816c4a4c723","last_modified":1480349198667},{"guid":"{6E19037A-12E3-4295-8915-ED48BC341614}","prefs":[],"schema":1480349193877,"blockID":"i24","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=615518","who":"Users of RelevantKnowledge version 1.3.328.4 and older in Firefox 4 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"comScore RelevantKnowledge","created":"2011-03-02T17:42:56Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.3.328.4","minVersion":"0.1","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"7c189c5e-f95b-0aef-e9e3-8e879336503b","last_modified":1480349198606},{"guid":"crossriderapp4926@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i91","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=754648","who":"All Firefox users who have installed this add-on.","why":"Versions of this add-on prior to 0.81.44 automatically post message to users' walls and hide them from their view. Version 0.81.44 corrects this.","name":"Remove My Timeline (malware)","created":"2012-05-14T14:16:43Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"0.81.43","minVersion":"0","targetApplication":[]}],"id":"5ee3e72e-96fb-c150-fc50-dd581e960963","last_modified":1480349198547},{"guid":"/^(93abedcf-8e3a-4d02-b761-d1441e437c09@243f129d-aee2-42c2-bcd1-48858e1c22fd\\.com|9acfc440-ac2d-417a-a64c-f6f14653b712@09f9a966-9258-4b12-af32-da29bdcc28c5\\.com|58ad0086-1cfb-48bb-8ad2-33a8905572bc@5715d2be-69b9-4930-8f7e-64bdeb961cfd\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i544","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=949596","who":"All Firefox users who have this add-on installed. If you wish to continue using it, it can be enabled in the Add-ons Manager.","why":"This add-on is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>, using multiple add-on IDs and potentially doing other unwanted activities.","name":"SuperLyrics","created":"2014-01-30T11:51:19Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d8d25967-9814-3b65-0787-a0525c16e11e","last_modified":1480349198510},{"guid":"wHO@W9.net","prefs":[],"schema":1480349193877,"blockID":"i980","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1192468","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"BestSavEFOrYoU (malware)","created":"2015-08-11T11:20:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4beb917f-68f2-1f91-beed-dff6d83006f8","last_modified":1480349198483},{"guid":"frhegnejkgner@grhjgewfewf.com","prefs":[],"schema":1480349193877,"blockID":"i1040","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1212451","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Async Codec (malware)","created":"2015-10-07T13:03:37Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb6ab4ce-5517-bd68-2cf7-a93a109a528a","last_modified":1480349198458},{"guid":"firefox@luckyleap.net","prefs":[],"schema":1480349193877,"blockID":"i471","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:33Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3a9e04c7-5e64-6297-8442-2816915aad77","last_modified":1480349198433},{"guid":"lugcla21@gmail.com","prefs":[],"schema":1480349193877,"blockID":"i432","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=902072","who":"All Firefox users who have this add-on installed.","why":"This add-on includes malicious code that spams users' Facebook accounts with unwanted messages.","name":"FB Color Changer (malware)","created":"2013-08-06T13:16:22Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b6943f35-9429-1f8e-bf8e-fe37979fe183","last_modified":1480349198372},{"guid":"{99079a25-328f-4bd4-be04-00955acaa0a7}","prefs":[],"schema":1480349193877,"blockID":"i402","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=835678","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This group of add-ons is silently installed, bypassing our install opt-in screen. This violates our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Searchqu","created":"2013-06-25T15:16:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"16008331-8b47-57c8-a6f7-989914d1cb8a","last_modified":1480349198341},{"guid":"{81b13b5d-fba1-49fd-9a6b-189483ac548a}","prefs":[],"schema":1480349193877,"blockID":"i473","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:43Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"76debc7b-b875-6da4-4342-1243cbe437f6","last_modified":1480349198317},{"guid":"{e935dd68-f90d-46a6-b89e-c4657534b353}","prefs":[],"schema":1480349193877,"blockID":"i732","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sites Pro","created":"2014-10-16T16:38:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"97fdc235-ac1a-9f20-1b4a-17c2f0d89ad1","last_modified":1480349198260},{"guid":"{32da2f20-827d-40aa-a3b4-2fc4a294352e}","prefs":[],"schema":1480349193877,"blockID":"i748","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:02:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6c980c8e-4a3c-7912-4a3a-80add457575a","last_modified":1480349198223},{"guid":"chinaescapeone@facebook.com","prefs":[],"schema":1480349193877,"blockID":"i431","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=901770","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that uses a deceptive name and hijacks social networks.","name":"F-Secure Security Pack (malware)","created":"2013-08-05T16:43:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fbd89a9d-9c98-8481-e4cf-93e327ca8be1","last_modified":1480349198192},{"guid":"{cc6cc772-f121-49e0-b1f0-c26583cb0c5e}","prefs":[],"schema":1480349193877,"blockID":"i716","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Counselor","created":"2014-10-02T12:12:34Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"debcd28c-884b-ca42-d983-6fabf91034dd","last_modified":1480349198148},{"guid":"{906000a4-88d9-4d52-b209-7a772970d91f}","prefs":[],"schema":1480349193877,"blockID":"i474","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=935779","who":"All Firefox users who have this add-on installed.","why":"This add-on is part of a malicious Firefox installer bundle.","name":"Installer bundle (malware)","created":"2013-11-07T15:38:48Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"326d05b9-ace7-67c6-b094-aad926c185a5","last_modified":1480349197744},{"guid":"{AB2CE124-6272-4b12-94A9-7303C7397BD1}","prefs":[],"schema":1480349193877,"blockID":"i20","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=627278","who":"Users of Skype extension versions below 5.2.0.7165 for all versions of Firefox.","why":"This add-on causes a high volume of Firefox crashes and introduces severe performance issues. Please <a href=\"http://www.skype.com/intl/en/get-skype/on-your-computer/click-and-call/\">update to the latest version</a>. For more information, please <a href=\"http://blog.mozilla.com/addons/2011/01/20/blocking-the-skype-toolbar-in-firefox/\">read our announcement</a>.","name":"Skype extension","created":"2011-01-20T18:39:25Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.2.0.7164","minVersion":"0.1","targetApplication":[]}],"id":"60e16015-1803-197a-3241-484aa961d18f","last_modified":1480349197667},{"guid":"f6682b47-e12f-400b-9bc0-43b3ccae69d1@39d6f481-b198-4349-9ebe-9a93a86f9267.com","prefs":[],"schema":1480349193877,"blockID":"i682","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1043017","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"enformation","created":"2014-08-04T16:07:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a7ae65cd-0869-67e8-02f8-6d22c56a83d4","last_modified":1480349197636},{"guid":"rally_toolbar_ff@bulletmedia.com","prefs":[],"schema":1480349193877,"blockID":"i537","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=950267","who":"All Firefox users who have this extension installed. If you want to continue using it, you can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by silently installing it.","name":"Rally Toolbar","created":"2014-01-23T15:51:48Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4ac6eb63-b51a-3296-5b02-bae77f424032","last_modified":1480349197604},{"guid":"x77IjS@xU.net","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i774","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1076771","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed and changes user settings without consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>\r\n","name":"YoutubeAdBlocke","created":"2014-10-31T16:22:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"4771da14-bcf2-19b1-3d71-bc61a1c7d457","last_modified":1480349197578},{"guid":"{49c53dce-afa0-49a1-a08b-2eb8e8444128}","prefs":[],"schema":1480349193877,"blockID":"i441","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844985","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed, violating our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"ytbyclick","created":"2013-08-09T16:58:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5f08d720-58c2-6acb-78ad-7af45c82c90b","last_modified":1480349197550},{"guid":"{bb7b7a60-f574-47c2-8a0b-4c56f2da9802}","prefs":[],"schema":1480349193877,"blockID":"i754","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080850","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite","created":"2014-10-17T16:27:32Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f222ceb2-9b69-89d1-8dce-042d8131a12e","last_modified":1480349197500},{"guid":"/^((34qEOefiyYtRJT@IM5Munavn\\.com)|(Mro5Fm1Qgrmq7B@ByrE69VQfZvZdeg\\.com)|(KtoY3KGxrCe5ie@yITPUzbBtsHWeCdPmGe\\.com)|(9NgIdLK5Dq4ZMwmRo6zk@FNt2GCCLGyUuOD\\.com)|(NNux7bWWW@RBWyXdnl6VGls3WAwi\\.com)|(E3wI2n@PEHTuuNVu\\.com)|(2d3VuWrG6JHBXbQdbr@3BmSnQL\\.com))$/","prefs":[],"schema":1480349193877,"blockID":"i324","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:48:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5be3a399-af3e-644e-369d-628273b3fdc2","last_modified":1480349197432},{"guid":"{8f894ed3-0bf2-498e-a103-27ef6e88899f}","prefs":[],"schema":1480349193877,"blockID":"i792","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ExtraW","created":"2014-11-26T13:49:30Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bebc9e15-59a1-581d-0163-329d7414edff","last_modified":1480349197368},{"guid":"profsites@pr.com","prefs":[],"schema":1480349193877,"blockID":"i734","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.\r\n","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"ProfSites","created":"2014-10-16T16:39:26Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"0d6d84d7-0b3f-c5ab-57cc-6b66b0775a23","last_modified":1480349197341},{"guid":"{872b5b88-9db5-4310-bdd0-ac189557e5f5}","prefs":[],"schema":1480349193877,"blockID":"i497","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=945530","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making settings changes that can't be easily reverted.","name":"DVDVideoSoft Menu","created":"2013-12-03T16:08:09Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e8da89c4-c585-77e4-9872-591d20723a7e","last_modified":1480349197240},{"guid":"123456789@offeringmedia.com","prefs":[],"schema":1480349193877,"blockID":"i664","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1036757","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that attempts to hide itself by impersonating the Adobe Flash plugin.","name":"Taringa MP3 / Adobe Flash","created":"2014-07-10T15:41:24Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d0a7dda-d92a-c8e2-21be-c92b0a88ac8d","last_modified":1480349197208},{"guid":"{df6bb2ec-333b-4267-8c4f-3f27dc8c6e07}","prefs":[],"schema":1480349193877,"blockID":"i487","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940681","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Facebook 2013 (malware)","created":"2013-11-19T14:59:45Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5867c409-b342-121e-3c3b-426e2f0ba1d4","last_modified":1480349197109},{"guid":"/^({4e988b08-8c51-45c1-8d74-73e0c8724579}|{93ec97bf-fe43-4bca-a735-5c5d6a0a40c4}|{aed63b38-7428-4003-a052-ca6834d8bad3}|{0b5130a9-cc50-4ced-99d5-cda8cc12ae48}|{C4CFC0DE-134F-4466-B2A2-FF7C59A8BFAD})$/","prefs":[],"schema":1480349193877,"blockID":"i524","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947481","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"SweetPacks","created":"2013-12-20T13:43:21Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1a3a26a2-cdaa-e5ba-f6ac-47b98ae2cc26","last_modified":1480349197082},{"guid":"{87b5a11e-3b54-42d2-9102-0a7cb1f79ebf}","prefs":[],"schema":1480349193877,"blockID":"i838","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:29:12Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1ba0e57c-4c0c-4eb6-26e7-c2016769c343","last_modified":1480349196965},{"guid":"/^({bf67a47c-ea97-4caf-a5e3-feeba5331231}|{24a0cfe1-f479-4b19-b627-a96bf1ea3a56})$/","prefs":[],"schema":1480349193877,"blockID":"i542","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963819","who":"All Firefox users who have this add-on installed.","why":"This add-on has been repeatedly blocked before and keeps showing up with new add-on IDs, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"MixiDJ (malware)","created":"2014-01-28T14:10:49Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fc442b64-1b5d-bebb-c486-f431b154f3db","last_modified":1480349196622},{"guid":"/^({ebd898f8-fcf6-4694-bc3b-eabc7271eeb1}|{46008e0d-47ac-4daa-a02a-5eb69044431a}|{213c8ed6-1d78-4d8f-8729-25006aa86a76}|{fa23121f-ee7c-4bd8-8c06-123d087282c5}|{19803860-b306-423c-bbb5-f60a7d82cde5})$/","prefs":[],"schema":1480349193877,"blockID":"i622","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947482","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is known to change user settings without their consent, is distributed under multiple add-on IDs, and is also correlated with reports of tab functions being broken in Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"WiseConvert","created":"2014-06-18T13:48:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"ffd184fa-aa8f-8a75-ff00-ce285dec5b22","last_modified":1480349196597},{"guid":"/^({fa95f577-07cb-4470-ac90-e843f5f83c52}|ffxtlbr@speedial\\.com)$/","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i696","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1031115","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are silently installed and change homepage and search defaults without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. They are also distributed under more than one add-on ID.","name":"Speedial","created":"2014-08-21T13:55:41Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"130c7419-f727-a2fb-3891-627bc69a43bb","last_modified":1480349196565},{"guid":"pennerdu@faceobooks.ws","prefs":[],"schema":1480349193877,"blockID":"i442","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=904050","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that hijacks Facebook accounts.","name":"Console Video (malware)","created":"2013-08-13T14:00:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"fb83e48e-a780-9d06-132c-9ecc65b43674","last_modified":1480349196541},{"guid":"{E90FA778-C2B7-41D0-9FA9-3FEC1CA54D66}","prefs":[],"schema":1480349193877,"blockID":"i446","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=788838","who":"All Firefox users who have this add-on installed. The add-on can be enabled again in the Add-ons Manager.","why":"This add-on is installed silently, in violation of our <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"YouTube to MP3 Converter","created":"2013-09-06T15:59:29Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"83eb6337-a3b6-84e4-e76c-ee9200b80796","last_modified":1480349196471},{"guid":"{ad7ce998-a77b-4062-9ffb-1d0b7cb23183}","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i804","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1080839","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and is considered malware, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Astromenda Search Addon","created":"2014-12-15T10:53:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"633f9999-c81e-bd7a-e756-de7d34feb39d","last_modified":1480349196438},{"guid":"dodatek@flash2.pl","prefs":[],"schema":1480349193877,"blockID":"i1279","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"Any user with version 1.3 or newer of this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja Flash WORK addon","created":"2016-10-27T15:52:00Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"1.3","targetApplication":[]}],"id":"2dab5211-f9ec-a1bf-c617-6f94f28b5ee1","last_modified":1480349196331},{"guid":"{2d069a16-fca1-4e81-81ea-5d5086dcbd0c}","prefs":[],"schema":1480349193877,"blockID":"i440","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=903647","who":"All Firefox users who have this add-on installed.","why":"This add-on is installed silently and doesn't follow many other of the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. If you want to continue using this add-on, you can enable it in the Add-ons Manager.","name":"GlitterFun","created":"2013-08-09T16:26:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3f77f3c-b1d6-3b29-730a-846007b9cb16","last_modified":1480349196294},{"guid":"xivars@aol.com","prefs":[],"schema":1480349193877,"blockID":"i501","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=946420","who":"All Firefox users who have this add-on installed.","why":"This is a malicious Firefox extension that uses a deceptive name and hijacks users' Facebook accounts.","name":"Video Plugin Facebook (malware)","created":"2013-12-04T15:34:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3303d201-7006-3c0d-5fd5-45503e2e690c","last_modified":1480349196247},{"guid":"2bbadf1f-a5af-499f-9642-9942fcdb7c76@f05a14cc-8842-4eee-be17-744677a917ed.com","prefs":[],"schema":1480349193877,"blockID":"i700","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1052599","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is widely considered malware and is apparently installed silently into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"PIX Image Viewer","created":"2014-08-21T16:15:16Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1b72889b-90e6-ea58-4fe8-d48257df7d8b","last_modified":1480349196212},{"guid":"toolbar@ask.com","prefs":[],"schema":1480349193877,"blockID":"i600","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1024719","who":"All Firefox users who have these versions of the Ask Toolbar installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"Certain old versions of the Ask Toolbar are causing problems to users when trying to open new tabs. Using more recent versions of the Ask Toolbar should also fix this problem.","name":"Ask Toolbar (old Avira Security Toolbar bundle)","created":"2014-06-12T14:16:08Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"3.15.5.*","minVersion":"3.15.5","targetApplication":[]}],"id":"51c4ab3b-9ad3-c5c3-98c8-a220025fc5a3","last_modified":1480349196158},{"guid":"{729c9605-0626-4792-9584-4cbe65b243e6}","prefs":[],"schema":1480349193877,"blockID":"i788","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Browser Ext Assistance","created":"2014-11-20T10:07:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3c588238-2501-6a53-65ea-5c8ff0f3e51d","last_modified":1480349196123},{"guid":"webbooster@iminent.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i630","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=866943","who":"All Firefox users who have any of these add-ons installed. Users who wish to continue using them can enable them in the Add-ons Manager.","why":"These add-ons have been silently installed repeatedly, and change settings without user consent, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Iminent Minibar","created":"2014-06-26T15:49:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d894ea79-8215-7a0c-b0e9-be328c3afceb","last_modified":1480349196032},{"guid":"firefox@bandoo.com","prefs":[],"schema":1480349193877,"blockID":"i23","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=629634","who":"Users of Bandoo version 5.0 for Firefox 3.6 and later.","why":"This add-on causes a high volume of Firefox crashes.","name":"Bandoo","created":"2011-03-01T23:30:23Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"5.0","minVersion":"5.0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"3.7a1pre"}]}],"id":"bd487cf4-3f6a-f956-a6e9-842ac8deeac5","last_modified":1480349195915},{"guid":"5nc3QHFgcb@r06Ws9gvNNVRfH.com","prefs":[],"schema":1480349193877,"blockID":"i372","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=875752","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware pretending to be the Flash Player plugin.","name":"Flash Player 11 (malware)","created":"2013-06-18T13:23:40Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"dc71fcf5-fae4-5a5f-6455-ca7bbe4202db","last_modified":1480349195887},{"guid":"/^(7tG@zEb\\.net|ru@gfK0J\\.edu)$/","prefs":[],"schema":1480349193877,"blockID":"i854","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=952255","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"youtubeadblocker (malware)","created":"2015-02-09T15:41:36Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"cfe42207-67a9-9b88-f80c-994e6bdd0c55","last_modified":1480349195851},{"guid":"{a7aae4f0-bc2e-a0dd-fb8d-68ce32c9261f}","prefs":[],"schema":1480349193877,"blockID":"i378","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=865090","who":"All Firefox users who have installed this add-on.","why":"This extension is malware that hijacks Facebook accounts for malicious purposes.","name":"Myanmar Extension for Facebook (malware)","created":"2013-06-18T15:58:54Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"30ecd9b9-4023-d9ef-812d-f1a75bb189b0","last_modified":1480349195823},{"guid":"crossriderapp5060@crossrider.com","prefs":[],"schema":1480349193877,"blockID":"i228","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=810016","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently side-installed by other software, and it overrides user preferences and inserts advertisements in web content.","name":"Savings Sidekick","created":"2012-11-29T16:31:13Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"a37f76ac-7b77-b5a3-bac8-addaacf34bae","last_modified":1480349195769},{"guid":"/^(saamazon@mybrowserbar\\.com)|(saebay@mybrowserbar\\.com)$/","prefs":[],"schema":1480349193877,"blockID":"i672","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011337","who":"All Firefox users who have these add-ons installed. Users wishing to continue using these add-ons can enable them in the Add-ons Manager.","why":"These add-ons are being silently installed, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Spigot Shopping Assistant","created":"2014-07-22T15:13:57Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e072a461-ee5a-c83d-8d4e-5686eb585a15","last_modified":1480349195347},{"guid":"{b99c8534-7800-48fa-bd71-519a46cdc7e1}","prefs":[],"schema":1480349193877,"blockID":"i596","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1011325","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed, in violation with our <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"BrowseMark","created":"2014-06-12T13:19:59Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f411bb0f-7c82-9061-4a80-cabc8ff45beb","last_modified":1480349195319},{"guid":"/^({94d62e35-4b43-494c-bf52-ba5935df36ef}|firefox@advanceelite\\.com|{bb7b7a60-f574-47c2-8a0b-4c56f2da9802})$/","prefs":[],"schema":1480349193877,"blockID":"i856","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1130323","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"AdvanceElite (malware)","created":"2015-02-09T15:51:11Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e3d52650-d3e2-4cef-71f7-e6188f56fe4d","last_modified":1480349195286},{"guid":"{458fb825-2370-4973-bf66-9d7142141847}","prefs":["app.update.auto","app.update.enabled","app.update.interval","app.update.url"],"schema":1480349193877,"blockID":"i1024","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1209588","who":"All users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on hides itself in the Add-ons Manager, interrupts the Firefox update process, and reportedly causes other problems to users, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Shield","created":"2015-09-29T09:25:27Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"32c5baa7-d547-eaab-302d-b873c83bfe2d","last_modified":1480349195258},{"guid":"{f2456568-e603-43db-8838-ffa7c4a685c7}","prefs":[],"schema":1480349193877,"blockID":"i778","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Sup-SW","created":"2014-11-07T13:53:13Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"93568fa2-0cb7-4e1d-e893-d7261e81547c","last_modified":1480349195215},{"guid":"{77BEC163-D389-42c1-91A4-C758846296A5}","prefs":[],"schema":1480349193877,"blockID":"i566","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=964594","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-on Manager.","why":"This add-on is silently installed into Firefox, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"V-Bates","created":"2014-03-05T13:20:54Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"080edbac-25d6-e608-abdd-feb1ce7a9a77","last_modified":1480349195185},{"guid":"helper@vidscrab.com","prefs":[],"schema":1480349193877,"blockID":"i1077","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1231010","who":"All Firefox users who have this add-on installed. Users who wish to continue using the add-on can enable it in the Add-ons Manager.","why":"This add-on injects remote scripts and injects unwanted content into web pages.","name":"YouTube Video Downloader (from AddonCrop)","created":"2016-01-14T14:32:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"36b2e1e0-5fda-bde3-db55-dfcbe24dfd04","last_modified":1480349195157},{"guid":"jid1-XLjasWL55iEE1Q@jetpack","prefs":[],"schema":1480349193877,"blockID":"i578","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1002037","who":"All Firefox users who have this add-on installed.","why":"This is a malicious add-on that presents itself as \"Flash Player\" but is really injecting unwanted content into Facebook pages.","name":"Flash Player (malware)","created":"2014-04-28T16:25:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"1e75b2f0-02fc-77a4-ad2f-52a4caff1a71","last_modified":1480349195058},{"guid":"{a3a5c777-f583-4fef-9380-ab4add1bc2a8}","prefs":[],"schema":1480349193877,"blockID":"i142","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=792132","who":"Todos los usuarios de Firefox que instalaron la versi\u00f3n 4.2 del complemento Cuevana Stream.\r\n\r\nAll Firefox users who have installed version 4.2 of the Cuevana Stream add-on.","why":"<strong>Espa\u00f1ol</strong>\r\nUna versi\u00f3n maliciosa del complemento Cuevana Stream (4.2) fue colocada en el sitio Cuevana y distribuida a muchos usuarios del sitio. Esta versi\u00f3n recopila informaci\u00f3n de formularios web y los env\u00eda a una direcci\u00f3n remota con fines maliciosos. Se le recomienda a todos los usuarios que instalaron esta versi\u00f3n que cambien sus contrase\u00f1as inmediatamente, y que se actualicen a la nueva versi\u00f3n segura, que es la 4.3.\r\n\r\n<strong>English</strong>\r\nA malicious version of the Cuevana Stream add-on (4.2) was uploaded to the Cuevana website and distributed to many of its users. This version takes form data and sends it to a remote location with malicious intent. It is recommended that all users who installed this version to update their passwords immediately, and update to the new safe version, version 4.3.\r\n\r\n","name":"Cuevana Stream (malicious version)","created":"2012-09-18T13:37:47Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"4.2","minVersion":"4.2","targetApplication":[]}],"id":"91e551b9-7e94-60e2-f1bd-52f25844ab16","last_modified":1480349195007},{"guid":"{34712C68-7391-4c47-94F3-8F88D49AD632}","prefs":[],"schema":1480349193877,"blockID":"i922","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1173154","who":"All Firefox users who have this add-on installed in Firefox 39 and above.\r\n","why":"Certain versions of this extension are causing startup crashes in Firefox 39 and above.\r\n","name":"RealPlayer Browser Record Plugin","created":"2015-06-09T15:27:31Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[{"guid":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","maxVersion":"*","minVersion":"39.0a1"}]}],"id":"dd350efb-34ac-2bb5-5afd-eed722dbb916","last_modified":1480349194976},{"guid":"PDVDZDW52397720@XDDWJXW57740856.com","prefs":["browser.startup.homepage","browser.search.defaultenginename"],"schema":1480349193877,"blockID":"i846","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128320","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and attempts to change user settings like the home page and default search, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Ge-Force","created":"2015-02-06T15:03:39Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"c33e950c-c977-ed89-c86a-3be8c4be1967","last_modified":1480349194949},{"guid":"discoverypro@discoverypro.com","prefs":[],"schema":1480349193877,"blockID":"i582","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1004231","who":"All Firefox users who have this add-on installed. If you wish to continue using this add-on, you can enabled it in the Add-ons Manager.","why":"This add-on is silently installed by the CNET installer for MP3 Rocket and probably other software packages. This is in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Website Discovery Pro","created":"2014-04-30T16:10:03Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"34eab242-6fbc-a459-a89e-0dc1a0b8355d","last_modified":1480349194878},{"guid":"jid1-bKSXgRwy1UQeRA@jetpack","prefs":[],"schema":1480349193877,"blockID":"i680","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=979856","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into user's systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Trusted Shopper","created":"2014-08-01T16:34:01Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f701b790-b266-c69d-0fba-f2d189cb0f34","last_modified":1480349194851},{"guid":"bcVX5@nQm9l.org","prefs":[],"schema":1480349193877,"blockID":"i848","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128266","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"boomdeal","created":"2015-02-09T15:21:17Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"f8d6d4e1-b9e6-07f5-2b49-192106a45d82","last_modified":1480349194799},{"guid":"aytac@abc.com","prefs":[],"schema":1480349193877,"blockID":"i504","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947341","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks users' Facebook accounts.","name":"Facebook Haber (malware)","created":"2013-12-06T12:07:58Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"bfaf8298-dd69-165c-e1ed-ad55584abd18","last_modified":1480349194724},{"guid":"Adobe@flash.com","prefs":[],"schema":1480349193877,"blockID":"i136","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=790100","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware posing as a legitimate Adobe product.","name":"Adobe Flash (malware)","created":"2012-09-10T16:09:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"47ac744e-3176-5cb6-1d02-b460e0c7ada0","last_modified":1480349194647},{"guid":"{515b2424-5911-40bd-8a2c-bdb20286d8f5}","prefs":[],"schema":1480349193877,"blockID":"i491","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=940753","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted.","name":"Connect DLC","created":"2013-11-29T14:52:24Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"6d658443-b34a-67ad-934e-cbf7cd407460","last_modified":1480349194580},{"guid":"/^({3f3cddf8-f74d-430c-bd19-d2c9147aed3d}|{515b2424-5911-40bd-8a2c-bdb20286d8f5}|{17464f93-137e-4646-a0c6-0dc13faf0113}|{d1b5aad5-d1ae-4b20-88b1-feeaeb4c1ebc}|{aad50c91-b136-49d9-8b30-0e8d3ead63d0})$/","prefs":[],"schema":1480349193877,"blockID":"i516","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947478","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by making changes that can't be easily reverted and being distributed under multiple add-on IDs.","name":"Connect DLC","created":"2013-12-20T12:38:20Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"96f8e157-8b8b-8e2e-76cd-6850599b4370","last_modified":1480349194521},{"guid":"wxtui502n2xce9j@no14","prefs":[],"schema":1480349193877,"blockID":"i1012","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1206157","who":"All users who have this add-on installed.","why":"This is a malicious add-on that takes over Facebook accounts.","name":"Video fix (malware)","created":"2015-09-21T13:04:09Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"246798ac-25fa-f4a4-258c-a71f9f6ae091","last_modified":1480349194463},{"guid":"flashX@adobe.com","prefs":[],"schema":1480349193877,"blockID":"i168","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=807052","who":"All Firefox users who have this add-on installed.","why":"This is an exploit proof-of-concept created for a conference presentation, which will probably be copied and modified for malicious purposes. \r\n","name":"Zombie Browser Pack","created":"2012-10-30T12:07:41Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d7c69812-801c-8d8e-12cb-c5171bdc48a1","last_modified":1480349194428},{"guid":"{4889ddce-7a83-45e6-afc9-1e4f1149fff4}","prefs":[],"schema":1480343836083,"blockID":"i840","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1128327","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed and performs unwanted actions, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Cyti Web (malware)","created":"2015-02-06T14:30:06Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"be600f35-0633-29f3-c571-819e19d85db9","last_modified":1480349193867},{"guid":"{55dce8ba-9dec-4013-937e-adbf9317d990","prefs":[],"schema":1480343836083,"blockID":"i690","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048647","who":"All Firefox users. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Deal Keeper","created":"2014-08-12T16:23:46Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"512b0d40-a10a-5ddc-963b-b9c487eb1422","last_modified":1480349193833},{"guid":"/^new@kuot\\.pro|{13ec6687-0b15-4f01-a5a0-7a891c18e4ee}|rebeccahoppkins(ty(tr)?)?@gmail\\.com|{501815af-725e-45be-b0f2-8f36f5617afc}|{9bdb5f1f-b1e1-4a75-be31-bdcaace20a99}|{e9d93e1d-792f-4f95-b738-7adb0e853b7b}|dojadewaskurwa@gmail\\.com$/","prefs":[],"schema":1480343836083,"blockID":"i1414","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1312748","who":"All users who have this add-on installed.","why":"This add-on claims to be a flash plugin and it does some work on youtube, but it also steals your facebook and adfly credentials and sends them to a remote server.","name":"Aktualizacja dodatku Flash (malware)","created":"2016-10-28T18:06:03Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"5cebc983-bc88-d5f8-6807-bd1cbfcd82fd","last_modified":1480349193798},{"guid":"{58d2a791-6199-482f-a9aa-9b725ec61362}","prefs":[],"schema":1480343836083,"blockID":"i746","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=963787","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Start Page","created":"2014-10-17T16:01:53Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"8ebbc7d0-635c-b74a-de9f-16eb5837b36a","last_modified":1480349193730},{"guid":"{94cd2cc3-083f-49ba-a218-4cda4b4829fd}","prefs":[],"schema":1480343836083,"blockID":"i590","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1013678","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is silently installed into users' profiles, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Value Apps","created":"2014-06-03T16:12:50Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"556b8d4d-d6c2-199d-9f33-8eccca07e8e7","last_modified":1480349193649},{"guid":"contentarget@maildrop.cc","prefs":[],"schema":1480343836083,"blockID":"i818","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119971","who":"All Firefox users who have this add-on installed.","why":"This is a malicious extension that hijacks Facebook accounts.","name":"Astro Play (malware)","created":"2015-01-12T09:29:19Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"440e9923-027a-6089-e036-2f78937dc193","last_modified":1480349193622},{"guid":"noOpus@outlook.com","prefs":[],"schema":1480343836083,"blockID":"i816","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1119659","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems without their consent and performs unwanted operations.","name":"Full Screen (malware)","created":"2015-01-09T12:52:32Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b64d7cef-8b6c-2575-16bc-732fca7db377","last_modified":1480349193537},{"guid":"{c95a4e8e-816d-4655-8c79-d736da1adb6d}","prefs":[],"schema":1480343836083,"blockID":"i433","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=844945","who":"All Firefox users who have this add-on installed.","why":"This add-on bypasses the external install opt in screen in Firefox, violating the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","name":"Hotspot Shield","created":"2013-08-09T11:25:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b3168278-a8ae-4882-7f26-355bc362bed0","last_modified":1480349193510},{"guid":"{9802047e-5a84-4da3-b103-c55995d147d1}","prefs":[],"schema":1480343836083,"blockID":"i722","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1073810","who":"All Firefox users who have this add-on installed.","why":"This add-on is silently installed into users' systems. It uses very unsafe practices to load its code, and leaks information of all web browsing activity. These are all violations of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"Web Finder Pro","created":"2014-10-07T12:58:14Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"50097c29-26b1-bf45-ffe1-83da217eb127","last_modified":1480349193482},{"guid":"/^({bf9194c2-b86d-4ebc-9b53-1c08b6ff779e}|{61a83e16-7198-49c6-8874-3e4e8faeb4f3}|{f0af464e-5167-45cf-9cf0-66b396d1918c}|{5d9968c3-101c-4944-ba71-72d77393322d}|{01e86e69-a2f8-48a0-b068-83869bdba3d0})$/","prefs":[],"schema":1480343836083,"blockID":"i515","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=947473","who":"All Firefox users who have this add-on installed. Users who wish to continue using it can enable it in the Add-ons Manager.","why":"The installer that includes this add-on violates the <a href=\"https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Add-on_guidelines\">Add-on Guidelines</a> by using multiple add-on IDs and making unwanted settings changes.","name":"VisualBee Toolbar","created":"2013-12-20T12:26:49Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"029fa6f9-2351-40b7-5443-9a66e057f199","last_modified":1480349193449},{"guid":"/^({d50bfa5f-291d-48a8-909c-5f1a77b31948}|{d54bc985-6e7b-46cd-ad72-a4a266ad879e}|{d89e5de3-5543-4363-b320-a98cf150f86a}|{f3465017-6f51-4980-84a5-7bee2f961eba}|{fae25f38-ff55-46ea-888f-03b49aaf8812})$/","prefs":[],"schema":1480343836083,"blockID":"i1137","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1251940","who":"All users who have this add-on installed.","why":"This is a malicious add-on that hides itself from view and disables various security features in Firefox.","name":"Watcher (malware)","created":"2016-03-04T17:56:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"252e18d0-85bc-7bb3-6197-5f126424c9b3","last_modified":1480349193419},{"guid":"ffxtlbr@claro.com","prefs":[],"schema":1480343836083,"blockID":"i218","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=816762","who":"All Firefox users who have installed this add-on.","why":"The Claro Toolbar is side-installed with other software, unexpectedly changing users' settings and then making it impossible for these settings to be reverted by users.","name":"Claro Toolbar","created":"2012-11-29T16:07:00Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"e017a3b2-9b37-b8a0-21b0-bc412ae8a7f4","last_modified":1480349193385},{"guid":"/^(j003-lqgrmgpcekslhg|SupraSavings|j003-dkqonnnthqjnkq|j003-kaggrpmirxjpzh)@jetpack$/","prefs":[],"schema":1480343836083,"blockID":"i692","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=1048656","who":"All Firefox users who have this add-on installed. Users who wish to continue using this add-on can enable it in the Add-ons Manager.","why":"This add-on is being silently installed in users' systems, in violation of the <a href=\"https://developer.mozilla.org/en-US/Add-ons/Add-on_guidelines\">Add-on Guidelines</a>.","name":"SupraSavings","created":"2014-08-12T16:27:06Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"b0d30256-4581-1489-c241-d2e85b6c38f4","last_modified":1480349193295},{"guid":"helperbar@helperbar.com","prefs":[],"schema":1480343836083,"blockID":"i258","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=817786","who":"All Firefox users who have this add-on installed. This only applies to version 1.0 of Snap.do. Version 1.1 fixed all the issues for which this block was created.","why":"This extension violates a number of our <a href=\"https://developer.mozilla.org/en-US/docs/Addons/Add-on_guidelines\">Add-on Guidelines</a>, particularly on installation and settings handling. It also causes some stability problems in Firefox due to the way the toolbar is handled.\r\n\r\nUsers who wish to keep the add-on enabled can enable it again in the Add-ons Manager.","name":"Snap.do","created":"2013-01-28T13:52:26Z"},"enabled":true,"versionRange":[{"severity":1,"maxVersion":"1.0","minVersion":"0","targetApplication":[]}],"id":"f1ede5b8-7757-5ec5-d8ed-1a01889154aa","last_modified":1480349193254},{"guid":"/^((support2_en@adobe14\\.com)|(XN4Xgjw7n4@yUWgc\\.com)|(C7yFVpIP@WeolS3acxgS\\.com)|(Kbeu4h0z@yNb7QAz7jrYKiiTQ3\\.com)|(aWQzX@a6z4gWdPu8FF\\.com)|(CBSoqAJLYpCbjTP90@JoV0VMywCjsm75Y0toAd\\.com)|(zZ2jWZ1H22Jb5NdELHS@o0jQVWZkY1gx1\\.com))$/","prefs":[],"schema":1480343836083,"blockID":"i326","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=841791","who":"All users who have this add-on installed.","why":"This extension is malware, installed pretending to be the Flash Player plugin.","name":"Flash Player (malware)","created":"2013-03-22T14:49:08Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"3142020b-8af9-1bac-60c5-ce5ad0ff3d42","last_modified":1480349193166},{"guid":"newmoz@facebook.com","prefs":[],"schema":1480343836083,"blockID":"i576","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=997986","who":"All Firefox users who have this add-on installed.","why":"This add-on is malware that hijacks Facebook user accounts and sends spam on the user's behalf.","name":"Facebook Service Pack (malware)","created":"2014-04-22T14:34:42Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"d85798d3-9b87-5dd9-ace2-64914b93df77","last_modified":1480349193114},{"guid":"{0F827075-B026-42F3-885D-98981EE7B1AE}","prefs":[],"schema":1480343836083,"blockID":"i334","details":{"bug":"https://bugzilla.mozilla.org/show_bug.cgi?id=862272","who":"All Firefox users who have this extension installed.","why":"This extension is malicious and is installed under false pretenses, causing problems for many Firefox users. Note that this is not the same <a href=\"https://addons.mozilla.org/firefox/addon/browserprotect/\">BrowserProtect extension</a> that is listed on our add-ons site. That one is safe to use.","name":"Browser Protect / bProtector (malware)","created":"2013-04-16T13:25:01Z"},"enabled":true,"versionRange":[{"severity":3,"maxVersion":"*","minVersion":"0","targetApplication":[]}],"id":"aad4545f-8f9d-dd53-2aa8-e8945cad6185","last_modified":1480349192987}]}
\ No newline at end of file
diff --git a/services/settings/dumps/main/search-config.json b/services/settings/dumps/main/search-config.json
index 46aaebd6ff28..7fe875537c5a 100644
--- a/services/settings/dumps/main/search-config.json
+++ b/services/settings/dumps/main/search-config.json
@@ -1 +1 @@
-{"data":[{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-d"},{"name":"q","value":"{searchTerms}"}]},"schema":1582832503175,"appliesTo":[{"default":"yes","included":{"everywhere":true}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"everywhere":true},"application":{"channel":["esr"]},"telemetryId":"google-b-e"},{"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"},"application":{"channel":["esr"]}},{"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]},"application":{"channel":["esr"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-d"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-d"},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"application":{"channel":["esr"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-e"}],"orderHint":1000,"extraParams":[{"name":"channel","pref":"google_channel_row","condition":"pref"}],"telemetryId":"google-b-d","webExtension":{"id":"google@search.mozilla.org"},"id":"cb8e7210-9f0b-48fa-8708-b9a03df79eea","last_modified":1583937832394},{"params":{"searchUrlGetParams":[{"name":"pc","value":"MOZI"},{"name":"q","value":"{searchTerms}"}]},"schema":1582890763841,"appliesTo":[{"included":{"locales":{"matches":["ach","af","an","ar","ast","az","ca","ca-valencia","cak","da","de","dsb","el","eo","es-CL","es-ES","es-MX","eu","fa","ff","fi","fr","fy-NL","gn","gu-IN","hi-IN","hr","hsb","ia","is","it","ja-JP-macos","ja","ka","kab","km","kn","lij","lo","lt","mk","ms","my","nb-NO","ne-NP","nl","nn-NO","oc","pa-IN","pt-BR","rm","ro","son","sq","sr","sv-SE","th","tl","trs","uk","ur","uz","wo","xh","zh-CN"],"startsWith":["bn","en"]}}}],"extraParams":[{"name":"form","value":"MOZCON","purpose":"contextmenu","condition":"purpose"},{"name":"form","value":"MOZSBR","purpose":"searchbar","condition":"purpose"},{"name":"form","value":"MOZSPG","purpose":"homepage","condition":"purpose"},{"name":"form","value":"MOZLBR","purpose":"keyword","condition":"purpose"},{"name":"form","value":"MOZTSB","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"bing@search.mozilla.org"},"id":"7ec766f6-639a-4618-91bc-33eb3d4378c6","last_modified":1583937832392},{"params":{"searchUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"wd","value":"{searchTerms}"}],"suggestUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"action","value":"opensearch"},{"name":"wd","value":"{searchTerms}"}]},"schema":1582890764713,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}},{"default":"yes","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}}],"telemetryId":"baidu","webExtension":{"id":"baidu@search.mozilla.org"},"id":"52dd490a-89e8-45f2-96b0-f2c72e157526","last_modified":1583937832389},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozilla-20"},{"name":"sourceid","value":"Mozilla-search"}]},"schema":1582890765580,"appliesTo":[{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]}}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"id":"amazon@search.mozilla.org","locales":["au"]}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"id":"amazon@search.mozilla.org","locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["fr"]},"telemetryId":"amazon-france","webExtension":{"id":"amazon@search.mozilla.org","locales":["france"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["gb"]},"telemetryId":"amazon-en-GB","webExtension":{"id":"amazon@search.mozilla.org","locales":["en-GB"]}}],"orderHint":500,"telemetryId":"amazondotcom","webExtension":{"id":"amazondotcom@search.mozilla.org"},"id":"071c671c-7c1b-469d-a771-ab16ff6e8beb","last_modified":1583937832387},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"}]},"schema":1582890766440,"appliesTo":[{"included":{"locales":{"matches":["bn","bn-IN","kn","gu-IN","mr","pa-IN","ta","te","ur"]}},"telemetryId":"amazon-in","webExtension":{"locales":["in"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["br","ff","fr","son","wo"]}},"telemetryId":"amazon-france","webExtension":{"locales":["france"]}},{"included":{"locales":{"matches":["br","ff","fr","son","wo"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozillajapan-fx-22"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"telemetryId":"amazon-jp","webExtension":{"locales":["jp"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefoxit-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"amazon-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-de-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"amazon-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]}},"telemetryId":"amazon-en-GB","webExtension":{"locales":["en-GB"]}},{"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"locales":["au"]}}],"orderHint":500,"webExtension":{"id":"amazon@search.mozilla.org"},"id":"a620b506-c3ae-4332-97bb-190a73868580","last_modified":1583937832384},{"params":{"searchUrlGetParams":[{"name":"keywords","value":"{searchTerms}"},{"name":"ix","value":"sunray"},{"name":"pageletid","value":"headsearch"},{"name":"searchType","value":""},{"name":"Go.x","value":"0"},{"name":"Go.y","value":"0"},{"name":"bestSaleNum","value":"0"}]},"schema":1582890767305,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}}],"orderHint":500,"telemetryId":"amazondotcn","webExtension":{"id":"amazondotcn@search.mozilla.org"},"id":"ccb137f1-7733-464c-bb70-037be4ba2529","last_modified":1583937832381},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com/sch/{searchTerms}"}]},"schema":1582890768154,"appliesTo":[{"included":{"locales":{"matches":["en-US"]},"regions":["us"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.es/sch/{searchTerms}"}]},"included":{"locales":{"matches":["an","ast","ca","ca-valencia","es-ES","eu","gl"]}},"telemetryId":"ebay-es","webExtension":{"locales":["es"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.fr/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","fr","wo"]}},"telemetryId":"ebay-fr","webExtension":{"locales":["fr"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ca"]},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","gd"]}},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["gb"]},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com.au/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["au"]},"telemetryId":"ebay-au","webExtension":{"locales":["au"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["ie"]},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.de/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"ebay-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.at/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["at"]},"telemetryId":"ebay-at","webExtension":{"locales":["at"]}},{"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]}},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["nl"]},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["ga-IE"]}},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.it/sch/{searchTerms}"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"ebay-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["rm"]}},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}}],"orderHint":500,"webExtension":{"id":"ebay@search.mozilla.org"},"id":"cbe309e0-f638-4996-9dfc-ea5c19ef16e9","last_modified":1583937832378},{"schema":1582890769208,"appliesTo":[{"included":{"everywhere":true}}],"orderHint":500,"extraParams":[{"name":"t","value":"ffcm","purpose":"contextmenu","condition":"purpose"},{"name":"t","value":"ffab","purpose":"keyword","condition":"purpose"},{"name":"t","value":"ffsb","purpose":"searchbar","condition":"purpose"},{"name":"t","value":"ffhp","purpose":"homepage","condition":"purpose"},{"name":"t","value":"ffnt","purpose":"newtab","condition":"purpose"}],"telemetryId":"ddg","webExtension":{"id":"ddg@search.mozilla.org"},"id":"c0b26c0e-63e6-4235-b2ce-5f16b6a8bf87","last_modified":1583937832375},{"schema":1582890770084,"appliesTo":[{"default":"yes","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"]},"telemetryId":"yandex-en","webExtension":{"locales":["en"]}},{"included":{"locales":{"matches":["az"]}},"telemetryId":"yandex-az","webExtension":{"locales":["az"]}},{"included":{"locales":{"matches":["be"]}},"telemetryId":"yandex-by","webExtension":{"locales":["by"]}},{"included":{"locales":{"matches":["kk"]}},"telemetryId":"yandex-kk","webExtension":{"locales":["kk"]}},{"included":{"locales":{"matches":["ru"]}},"telemetryId":"yandex-ru","webExtension":{"locales":["ru"]}},{"included":{"locales":{"matches":["tr"]}},"telemetryId":"yandex-tr","webExtension":{"locales":["tr"]}}],"extraParams":[{"name":"clid","value":"2186618","purpose":"searchbar","condition":"purpose"},{"name":"clid","value":"2186621","purpose":"keyword","condition":"purpose"},{"name":"clid","value":"2186623","purpose":"contextmenu","condition":"purpose"},{"name":"clid","value":"2186617","purpose":"homepage","condition":"purpose"},{"name":"clid","value":"2186620","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"yandex@search.mozilla.org"},"id":"a0e7f96a-14e0-4d56-9f54-e0c7e49fd306","last_modified":1583937832372},{"schema":1582890770937,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"allaannonser-sv-SE@search.mozilla.org"},"id":"69a82554-c9b4-4c84-98c7-80f86fa7174a","last_modified":1583937832369},{"schema":1582890771781,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"allegro-pl@search.mozilla.org"},"id":"d915b6bc-bbae-47a6-8323-1b2990ad0e57","last_modified":1583937832367},{"schema":1582890772625,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"atlas-sk@search.mozilla.org"},"id":"6cebcf52-2cfa-4da2-ae4d-2c845ebdbc0b","last_modified":1583937832365},{"schema":1582890773480,"appliesTo":[{"included":{"locales":{"matches":["az"]}}}],"webExtension":{"id":"azerdict@search.mozilla.org"},"id":"c1a6845f-015e-4e67-bc64-6e39a843643f","last_modified":1583937832363},{"schema":1582890774347,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"azet-sk@search.mozilla.org"},"id":"3c632ae9-f758-43b5-9d06-b9c1b6bc7105","last_modified":1583937832361},{"schema":1582890775198,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"bbc-alba@search.mozilla.org"},"id":"4ab14cdb-35ea-42dc-8500-110eb3088b89","last_modified":1583937832358},{"schema":1582890776067,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"bok-NO@search.mozilla.org"},"id":"64ce88a6-fd55-48d1-85a9-724c753f5721","last_modified":1583937832356},{"schema":1582890776913,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"bolcom@search.mozilla.org"},"id":"3d0ab163-0808-4be0-b479-0900dcdc8e35","last_modified":1583937832354},{"schema":1582890777775,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"ceneji@search.mozilla.org"},"id":"d908d622-0387-4d36-8098-1a9e32c0c697","last_modified":1583937832352},{"schema":1582890778608,"appliesTo":[{"included":{"locales":{"matches":["en-GB"]}}}],"webExtension":{"id":"chambers-en-GB@search.mozilla.org"},"id":"270000f0-8527-4f98-aa17-879820209f68","last_modified":1583937832350},{"schema":1582890779439,"appliesTo":[{"included":{"locales":{"matches":["vi"]}}}],"webExtension":{"id":"coccoc@search.mozilla.org"},"id":"4e447f5a-9eb1-436e-8de1-9e4b4b709efb","last_modified":1583937832348},{"schema":1582890780276,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"daum-kr@search.mozilla.org"},"id":"0cdc44be-173a-4ca8-96e3-43e3000da75d","last_modified":1583937832346},{"schema":1582890781123,"appliesTo":[{"included":{"locales":{"matches":["ca","ca-valencia"]}}}],"webExtension":{"id":"diec2@search.mozilla.org"},"id":"055103b9-1f4a-43d0-9b99-5b8d7209b022","last_modified":1583937832343},{"schema":1582890781968,"appliesTo":[{"included":{"locales":{"matches":["es-AR","es-CL","es-ES"]}}}],"webExtension":{"id":"drae@search.mozilla.org"},"id":"3d27c51f-83d4-43be-af84-4d7a51c5a8e4","last_modified":1583937832341},{"schema":1582890782823,"appliesTo":[{"included":{"locales":{"matches":["de"]}}}],"webExtension":{"id":"ecosia@search.mozilla.org"},"id":"1fc1b257-3e6b-4cfb-a323-64c1429bcf51","last_modified":1583937832339},{"schema":1582890783661,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"eki-ee@search.mozilla.org"},"id":"63b74323-1d14-4989-921f-7cc32bfee072","last_modified":1583937832336},{"schema":1582890784534,"appliesTo":[{"included":{"locales":{"matches":["hr"]}}}],"webExtension":{"id":"eudict@search.mozilla.org"},"id":"5cd4781c-2906-4fe7-9d4b-ea9ddbdc2c3b","last_modified":1583937832334},{"schema":1582890785390,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"faclair-beag@search.mozilla.org"},"id":"6491a2b8-c487-4798-a817-a0fd08b40ee2","last_modified":1583937832332},{"schema":1582890786256,"appliesTo":[{"included":{"locales":{"matches":["kk"]}}}],"webExtension":{"id":"flip@search.mozilla.org"},"id":"d045762c-52ac-4c16-8ca3-072aecea83da","last_modified":1583937832330},{"schema":1582890787108,"appliesTo":[{"included":{"locales":{"matches":["br"]}}}],"webExtension":{"id":"freelang@search.mozilla.org"},"id":"ed6a0f8c-e496-4d9c-936c-b906892e3d23","last_modified":1583937832327},{"schema":1582890787961,"appliesTo":[{"included":{"locales":{"matches":["nn-NO","nb-NO"]}}}],"webExtension":{"id":"gulesider-NO@search.mozilla.org"},"id":"f458e78b-9128-4027-b344-538f5661c148","last_modified":1583937832325},{"schema":1582890788795,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"heureka-cz@search.mozilla.org"},"id":"b9a718b5-fc78-40b8-b1c3-2e15d2009f5c","last_modified":1583937832323},{"schema":1582890789635,"appliesTo":[{"included":{"locales":{"matches":["uk"]}}}],"webExtension":{"id":"hotline-ua@search.mozilla.org"},"id":"da2ec2d3-6c5c-4191-b428-351fbea8aeba","last_modified":1583937832321},{"schema":1582890790469,"appliesTo":[{"included":{"locales":{"matches":["kn"]}}}],"webExtension":{"id":"kannadastore@search.mozilla.org"},"id":"ae1cfae5-0516-41c0-99af-fd3d92a77aa8","last_modified":1583937832318},{"schema":1582890791315,"appliesTo":[{"included":{"locales":{"matches":["de","dsb","hsb","rm"]}}}],"webExtension":{"id":"leo_ende_de@search.mozilla.org"},"id":"03d60939-2c92-45b0-874f-11c8e6d0c2b9","last_modified":1583937832316},{"schema":1582890792162,"appliesTo":[{"included":{"locales":{"matches":["hy-AM"]}}}],"webExtension":{"id":"list-am@search.mozilla.org"},"id":"206db966-db1f-492d-9ab0-71b3e12b434e","last_modified":1583937832313},{"schema":1582890793008,"appliesTo":[{"included":{"locales":{"matches":["th"]}}}],"webExtension":{"id":"longdo@search.mozilla.org"},"id":"8b4f2887-0c24-49ce-b467-2ba8cc9a4945","last_modified":1583937832311},{"schema":1582890793853,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"mailru@search.mozilla.org"},"id":"e0ca4964-e324-44e7-80b6-16a831706d17","last_modified":1583937832309},{"schema":1582890794722,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"mapy-cz@search.mozilla.org"},"id":"9a404348-0998-42c4-9d87-45ef47672c95","last_modified":1583937832306},{"schema":1582890795553,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"marktplaats@search.mozilla.org"},"id":"7823cbee-e13e-4de6-8cf1-86e9234f06ae","last_modified":1583937832304},{"schema":1582890796393,"appliesTo":[{"included":{"locales":{"matches":["es-AR"]}},"webExtension":{"locales":["ar"]}},{"included":{"locales":{"matches":["es-CL"]}},"webExtension":{"locales":["cl"]}},{"included":{"locales":{"matches":["es-MX"]}},"webExtension":{"locales":["mx"]}}],"webExtension":{"id":"mercadolibre@search.mozilla.org"},"id":"df070348-e771-4bd5-964e-d19d82c1384e","last_modified":1583937832302},{"schema":1582890797236,"appliesTo":[{"included":{"locales":{"matches":["pt-BR"]}}}],"webExtension":{"id":"mercadolivre@search.mozilla.org"},"id":"53bf6974-0e60-4551-994f-2d5176a5d1c6","last_modified":1583937832300},{"schema":1582890798070,"appliesTo":[{"included":{"locales":{"matches":["he"]}}}],"webExtension":{"id":"morfix-dic@search.mozilla.org"},"id":"3d05b67d-ef69-4abf-82ab-c943a7e3eff3","last_modified":1583937832298},{"schema":1582890798901,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"najdi-si@search.mozilla.org"},"id":"dd8dcdda-7da8-46db-823b-d33fb1da63f8","last_modified":1583937832295},{"schema":1582890799757,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"naver-kr@search.mozilla.org"},"id":"4135dc8f-f0bf-475b-b39f-74c4256572af","last_modified":1583937832292},{"schema":1582890800610,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"neti-ee@search.mozilla.org"},"id":"2260d56e-d47c-435e-9cb8-9c7c67e8df7c","last_modified":1583937832289},{"schema":1582890801444,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"odpiralni@search.mozilla.org"},"id":"fa42b23a-30c5-46f3-8997-4a84029b5349","last_modified":1583937832287},{"schema":1582890802297,"appliesTo":[{"included":{"locales":{"matches":["bs"]}}}],"webExtension":{"id":"olx@search.mozilla.org"},"id":"af72d7ef-4255-4362-b328-703aea68ee7e","last_modified":1583937832283},{"schema":1582890803142,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","jp"]}}}],"webExtension":{"id":"oshiete-goo@search.mozilla.org"},"id":"daa695d9-3f38-494b-81f1-1f601bbe5163","last_modified":1583937832279},{"schema":1582890803993,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"osta-ee@search.mozilla.org"},"id":"af16e0da-1bcf-4769-b9bb-e43a94bfac75","last_modified":1583937832276},{"schema":1582890804842,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"ozonru@search.mozilla.org"},"id":"f62fc00c-2e87-4e95-aa11-0db075cd5741","last_modified":1583937832272},{"schema":1582890805689,"appliesTo":[{"included":{"locales":{"matches":["cy"]}}}],"webExtension":{"id":"palasprint@search.mozilla.org"},"id":"656d9e4e-74d5-4eee-bee3-519b4d9bfd37","last_modified":1583937832269},{"schema":1582890806533,"appliesTo":[{"included":{"locales":{"matches":["bg"]}}}],"webExtension":{"id":"pazaruvaj@search.mozilla.org"},"id":"acc27094-9f0a-49af-868b-8b6ecbbda976","last_modified":1583937832267},{"schema":1582890807390,"appliesTo":[{"included":{"locales":{"matches":["sr"]}}}],"webExtension":{"id":"pogodak@search.mozilla.org"},"id":"3bb87247-c36b-4606-a0d6-92b14eaeba86","last_modified":1583937832264},{"schema":1582890808245,"appliesTo":[{"included":{"locales":{"matches":["pt-PT"]}}}],"webExtension":{"id":"priberam@search.mozilla.org"},"id":"a3f1a5b6-cd8d-41b3-bb2b-de6bb1943a3d","last_modified":1583937832261},{"schema":1582890809085,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"priceru@search.mozilla.org"},"id":"de771801-5bca-436c-be56-f882897c46f2","last_modified":1583937832259},{"schema":1582890809928,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"prisjakt-sv-SE@search.mozilla.org"},"id":"8a7de784-efa5-428f-9193-a0d3368b80d4","last_modified":1583937832257},{"schema":1582890810778,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"pwn-pl@search.mozilla.org"},"id":"2ca17e29-ed08-4218-99f6-0615c8bc5c67","last_modified":1583937832254},{"schema":1582890811653,"appliesTo":[{"included":{"locales":{"matches":["fr"]}}}],"webExtension":{"id":"qwant@search.mozilla.org"},"id":"f59fddbc-580b-4672-9cda-32941ceec729","last_modified":1583937832252},{"schema":1582890812485,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"qxl-NO@search.mozilla.org"},"id":"e54d56d1-defb-4e34-b85e-9814cb7797c2","last_modified":1583937832249},{"schema":1582890813333,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","jp"]}}}],"webExtension":{"id":"rakuten@search.mozilla.org"},"id":"8551c432-c68d-4934-836e-98513ae4b4a5","last_modified":1583937832247},{"schema":1582890814195,"appliesTo":[{"included":{"locales":{"matches":["zh-TW"]}}}],"webExtension":{"id":"readmoo@search.mozilla.org"},"id":"2d24515e-3e35-42ed-bf17-1388acfe80fa","last_modified":1583937832245},{"schema":1582890815048,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"salidzinilv@search.mozilla.org"},"id":"e7dcde21-5b5e-4406-b602-0611130fd3a6","last_modified":1583937832242},{"schema":1582890815902,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"seznam-cz@search.mozilla.org"},"id":"c50dcc87-0192-4461-bb88-17a55ba181c7","last_modified":1583937832240},{"schema":1582890816739,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"sslv@search.mozilla.org"},"id":"74f2f615-8d17-4133-82c1-18d03643c383","last_modified":1583937832237},{"schema":1582890817589,"appliesTo":[{"included":{"locales":{"matches":["ga-IE"]}}}],"webExtension":{"id":"tearma@search.mozilla.org"},"id":"518293ee-4bf0-4514-9b73-c6fb646a8a18","last_modified":1583937832235},{"schema":1582890818451,"appliesTo":[{"included":{"locales":{"matches":["default","en-US","ach","an","bs","ca","ca-valencia","en-CA","ga-IE","gn","hr","ia","ka","kk","km","lo","lt","ms","my","ne-NP","oc","pt-BR","sl","tl","tr","ur","uz","wo"]}}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}}],"webExtension":{"id":"twitter@search.mozilla.org"},"id":"bbf3e4a8-8ab2-4031-a146-a964d7b6a41b","last_modified":1583937832232},{"schema":1582890819290,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"tyda-sv-SE@search.mozilla.org"},"id":"32eec495-ce07-4ce5-8d07-4cb32050459d","last_modified":1583937832229},{"schema":1582890820131,"appliesTo":[{"included":{"locales":{"matches":["hu"]}}}],"webExtension":{"id":"vatera@search.mozilla.org"},"id":"d0eab7e7-9084-4a43-b845-568dbe9f07dc","last_modified":1583937832225},{"schema":1582890820983,"appliesTo":[{"included":{"locales":{"matches":["te"]}},"webExtension":{"locales":["te"]}},{"included":{"locales":{"matches":["oc"]}},"webExtension":{"locales":["oc"]}}],"webExtension":{"id":"wiktionary@search.mozilla.org"},"id":"781f42f0-3a5c-4d14-8be2-665eefa65653","last_modified":1583937832222},{"schema":1582890821826,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"wolnelektury-pl@search.mozilla.org"},"id":"1960ccff-4aab-48cd-9bf5-0eb2adde76f9","last_modified":1583937832218},{"schema":1582890822671,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp@search.mozilla.org"},"id":"9e73a342-4e27-4e9f-8a29-be193d59236a","last_modified":1583937832213},{"schema":1582890823520,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp-auctions@search.mozilla.org"},"id":"43559b11-05dc-4750-b131-afdbd9d25905","last_modified":1583937832210},{"schema":1582890824418,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"zoznam-sk@search.mozilla.org"},"id":"e332f9dd-d1c5-4cc9-8534-3fd9938b970c","last_modified":1583937832207},{"schema":1582890825302,"appliesTo":[{"included":{"everywhere":true}},{"included":{"locales":{"matches":["af","an","ar","ast","az","bg","br","bs","cy","da","de","dsb","el","eo","et","eu","fa","fi","fy-NL","ga-IE","gd","gl","gn","he","hr","hsb","hu","ia","id","is","it","ka","kab","kk","km","kn","lij","lo","lt","ltg","lv","mk","mr","ms","my","nl","oc","pl","rm","ro","ru","si","sk","sl","sq","sr","sv-SE","ta","te","th","tl","tr","uk","ur","uz","vi","wo","zh-CN","zh-TW"]}},"webExtension":{"locales":["$USER_LOCALE"]}},{"included":{"locales":{"matches":["be"]}},"webExtension":{"locales":["be","be-tarask"]}},{"included":{"locales":{"matches":["bn","bn-BD","bn-IN"]}},"webExtension":{"locales":["bn"]}},{"included":{"locales":{"matches":["ca","ca-valencia"]}},"webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["cak","es-AR","es-CL","es-ES","es-MX","trs"]}},"webExtension":{"locales":["es"]}},{"included":{"locales":{"matches":["cs"]}},"webExtension":{"locales":["cz"]}},{"included":{"locales":{"matches":["ff","fr","son"]}},"webExtension":{"locales":["fr"]}},{"included":{"locales":{"matches":["gu-IN"]}},"webExtension":{"locales":["gu"]}},{"included":{"locales":{"matches":["hi-IN"]}},"webExtension":{"locales":["hi"]}},{"included":{"locales":{"matches":["hy-AM"]}},"webExtension":{"locales":["hy"]}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}},{"included":{"locales":{"matches":["ko"]}},"webExtension":{"locales":["kr"]}},{"included":{"locales":{"matches":["nb-NO"]}},"webExtension":{"locales":["NO"]}},{"included":{"locales":{"matches":["ne-NP"]}},"webExtension":{"locales":["ne"]}},{"included":{"locales":{"matches":["nn-NO"]}},"webExtension":{"locales":["NN"]}},{"included":{"locales":{"matches":["pa-IN"]}},"webExtension":{"locales":["pa"]}},{"included":{"locales":{"matches":["pt-BR","pt-PT"]}},"webExtension":{"locales":["pt"]}}],"webExtension":{"id":"wikipedia@search.mozilla.org"},"id":"3f3beb1d-e32e-40a4-b6ed-56741803e1d8","last_modified":1583937832203}]}
\ No newline at end of file
+{"data":[{"schema":1586901316337,"appliesTo":[{"included":{"locales":{"matches":["default","en-US","ach","an","bs","ca","ca-valencia","en-CA","en-GB","es-ES","ga-IE","gn","hr","ia","ka","kk","km","lo","lt","ms","my","ne-NP","oc","pt-BR","sl","tl","tr","ur","uz","wo"]}}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}}],"webExtension":{"id":"twitter@search.mozilla.org"},"id":"bbf3e4a8-8ab2-4031-a146-a964d7b6a41b","last_modified":1587043474561},{"schema":1586273556552,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"rakuten@search.mozilla.org"},"id":"8551c432-c68d-4934-836e-98513ae4b4a5","last_modified":1586375636481},{"schema":1586273291150,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"oshiete-goo@search.mozilla.org"},"id":"daa695d9-3f38-494b-81f1-1f601bbe5163","last_modified":1586375636478},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-d"},{"name":"q","value":"{searchTerms}"}]},"schema":1582832503175,"appliesTo":[{"default":"yes","included":{"everywhere":true}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"everywhere":true},"application":{"channel":["esr"]},"telemetryId":"google-b-e"},{"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"],"telemetryId":"google"},"application":{"channel":["esr"]}},{"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-e"},{"name":"q","value":"{searchTerms}"}]},"default":"no","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]},"application":{"channel":["esr"]}},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-d"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-d"},{"params":{"searchUrlGetParams":[{"name":"client","value":"firefox-b-1-e"},{"name":"q","value":"{searchTerms}"}]},"included":{"regions":["us"]},"application":{"channel":["esr"]},"extraParams":[{"name":"channel","pref":"google_channel_us","condition":"pref"}],"telemetryId":"google-b-1-e"}],"orderHint":1000,"extraParams":[{"name":"channel","pref":"google_channel_row","condition":"pref"}],"telemetryId":"google-b-d","webExtension":{"id":"google@search.mozilla.org"},"id":"cb8e7210-9f0b-48fa-8708-b9a03df79eea","last_modified":1583937832394},{"params":{"searchUrlGetParams":[{"name":"pc","value":"MOZI"},{"name":"q","value":"{searchTerms}"}]},"schema":1582890763841,"appliesTo":[{"included":{"locales":{"matches":["ach","af","an","ar","ast","az","ca","ca-valencia","cak","da","de","dsb","el","eo","es-CL","es-ES","es-MX","eu","fa","ff","fi","fr","fy-NL","gn","gu-IN","hi-IN","hr","hsb","ia","is","it","ja-JP-macos","ja","ka","kab","km","kn","lij","lo","lt","mk","ms","my","nb-NO","ne-NP","nl","nn-NO","oc","pa-IN","pt-BR","rm","ro","son","sq","sr","sv-SE","th","tl","trs","uk","ur","uz","wo","xh","zh-CN"],"startsWith":["bn","en"]}}}],"extraParams":[{"name":"form","value":"MOZCON","purpose":"contextmenu","condition":"purpose"},{"name":"form","value":"MOZSBR","purpose":"searchbar","condition":"purpose"},{"name":"form","value":"MOZSPG","purpose":"homepage","condition":"purpose"},{"name":"form","value":"MOZLBR","purpose":"keyword","condition":"purpose"},{"name":"form","value":"MOZTSB","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"bing@search.mozilla.org"},"id":"7ec766f6-639a-4618-91bc-33eb3d4378c6","last_modified":1583937832392},{"params":{"searchUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"wd","value":"{searchTerms}"}],"suggestUrlGetParams":[{"name":"tn","value":"monline_7_dg"},{"name":"ie","value":"utf-8"},{"name":"action","value":"opensearch"},{"name":"wd","value":"{searchTerms}"}]},"schema":1582890764713,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}},{"default":"yes","included":{"locales":{"matches":["zh-CN"]},"regions":["cn"]}}],"telemetryId":"baidu","webExtension":{"id":"baidu@search.mozilla.org"},"id":"52dd490a-89e8-45f2-96b0-f2c72e157526","last_modified":1583937832389},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozilla-20"},{"name":"sourceid","value":"Mozilla-search"}]},"schema":1582890765580,"appliesTo":[{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]}}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"id":"amazon@search.mozilla.org","locales":["au"]}},{"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"id":"amazon@search.mozilla.org","locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["fr"]},"telemetryId":"amazon-france","webExtension":{"id":"amazon@search.mozilla.org","locales":["france"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ach","af","ar","az","bg","cak","en-US","eo","es-AR","fa","gn","hy-AM","ia","is","ka","km","lt","mk","ms","my","ro","si","th","tl","trs","uz"]},"regions":["gb"]},"telemetryId":"amazon-en-GB","webExtension":{"id":"amazon@search.mozilla.org","locales":["en-GB"]}}],"orderHint":500,"telemetryId":"amazondotcom","webExtension":{"id":"amazondotcom@search.mozilla.org"},"id":"071c671c-7c1b-469d-a771-ab16ff6e8beb","last_modified":1583937832387},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"}]},"schema":1582890766440,"appliesTo":[{"included":{"locales":{"matches":["bn","bn-IN","kn","gu-IN","mr","pa-IN","ta","te","ur"]}},"telemetryId":"amazon-in","webExtension":{"locales":["in"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-fr-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["br","ff","fr","son","wo"]}},"telemetryId":"amazon-france","webExtension":{"locales":["france"]}},{"included":{"locales":{"matches":["br","ff","fr","son","wo"]},"regions":["ca"]},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"amazon-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"mozillajapan-fx-22"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"telemetryId":"amazon-jp","webExtension":{"locales":["jp"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefoxit-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"amazon-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-de-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"amazon-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"field-keywords","value":"{searchTerms}"},{"name":"ie","value":"{inputEncoding}"},{"name":"mode","value":"blended"},{"name":"tag","value":"firefox-uk-21"},{"name":"sourceid","value":"Mozilla-search"}]},"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]}},"telemetryId":"amazon-en-GB","webExtension":{"locales":["en-GB"]}},{"included":{"locales":{"matches":["cy","da","el","en-GB","eu","ga-IE","gd","gl","hr","nb-NO","nn-NO","pt-PT","sq","sr"]},"regions":["au"]},"telemetryId":"amazon-au","webExtension":{"locales":["au"]}}],"orderHint":500,"webExtension":{"id":"amazon@search.mozilla.org"},"id":"a620b506-c3ae-4332-97bb-190a73868580","last_modified":1583937832384},{"params":{"searchUrlGetParams":[{"name":"keywords","value":"{searchTerms}"},{"name":"ix","value":"sunray"},{"name":"pageletid","value":"headsearch"},{"name":"searchType","value":""},{"name":"Go.x","value":"0"},{"name":"Go.y","value":"0"},{"name":"bestSaleNum","value":"0"}]},"schema":1582890767305,"appliesTo":[{"included":{"locales":{"matches":["zh-CN"]}}}],"orderHint":500,"telemetryId":"amazondotcn","webExtension":{"id":"amazondotcn@search.mozilla.org"},"id":"ccb137f1-7733-464c-bb70-037be4ba2529","last_modified":1583937832381},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com/sch/{searchTerms}"}]},"schema":1582890768154,"appliesTo":[{"included":{"locales":{"matches":["en-US"]},"regions":["us"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.es/sch/{searchTerms}"}]},"included":{"locales":{"matches":["an","ast","ca","ca-valencia","es-ES","eu","gl"]}},"telemetryId":"ebay-es","webExtension":{"locales":["es"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.fr/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","fr","wo"]}},"telemetryId":"ebay-fr","webExtension":{"locales":["fr"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ca"]},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["br","en-US","fr","wo"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","gd"]}},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.co.uk/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["gb"]},"telemetryId":"ebay-uk","webExtension":{"locales":["uk"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.com.au/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["au"]},"telemetryId":"ebay-au","webExtension":{"locales":["au"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["cy","en-GB","en-US","gd"]},"regions":["ie"]},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.de/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]}},"telemetryId":"ebay-de","webExtension":{"locales":["de"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.at/sch/{searchTerms}"}]},"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["at"]},"telemetryId":"ebay-at","webExtension":{"locales":["at"]}},{"included":{"locales":{"matches":["de","dsb","hsb"]},"regions":["ch"]},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ca/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-CA"]}},"telemetryId":"ebay-ca","webExtension":{"locales":["ca"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]}},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.nl/sch/{searchTerms}"}]},"included":{"locales":{"matches":["en-US"]},"regions":["nl"]},"telemetryId":"ebay-nl","webExtension":{"locales":["nl"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.befr.ebay.be/sch/{searchTerms}"}]},"included":{"locales":{"matches":["fy-NL","nl"]},"regions":["be"]},"telemetryId":"ebay-be","webExtension":{"locales":["be"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ie/sch/{searchTerms}"}]},"included":{"locales":{"matches":["ga-IE"]}},"telemetryId":"ebay-ie","webExtension":{"locales":["ie"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.it/sch/{searchTerms}"}]},"included":{"locales":{"matches":["it","lij"]}},"telemetryId":"ebay-it","webExtension":{"locales":["it"]}},{"params":{"searchUrlGetParams":[{"name":"ff3","value":"4"},{"name":"toolid","value":"20004"},{"name":"campid","value":"5338192028"},{"name":"customid","value":""},{"name":"mpre","value":"https://www.ebay.ch/sch/{searchTerms}"}]},"included":{"locales":{"matches":["rm"]}},"telemetryId":"ebay-ch","webExtension":{"locales":["ch"]}}],"orderHint":500,"webExtension":{"id":"ebay@search.mozilla.org"},"id":"cbe309e0-f638-4996-9dfc-ea5c19ef16e9","last_modified":1583937832378},{"schema":1582890769208,"appliesTo":[{"included":{"everywhere":true}}],"orderHint":500,"extraParams":[{"name":"t","value":"ffcm","purpose":"contextmenu","condition":"purpose"},{"name":"t","value":"ffab","purpose":"keyword","condition":"purpose"},{"name":"t","value":"ffsb","purpose":"searchbar","condition":"purpose"},{"name":"t","value":"ffhp","purpose":"homepage","condition":"purpose"},{"name":"t","value":"ffnt","purpose":"newtab","condition":"purpose"}],"telemetryId":"ddg","webExtension":{"id":"ddg@search.mozilla.org"},"id":"c0b26c0e-63e6-4235-b2ce-5f16b6a8bf87","last_modified":1583937832375},{"schema":1582890770084,"appliesTo":[{"default":"yes","included":{"locales":{"matches":["ru","tr","be","kk"],"startsWith":["en"]},"regions":["ru","tr","by","kz"]},"telemetryId":"yandex-en","webExtension":{"locales":["en"]}},{"included":{"locales":{"matches":["az"]}},"telemetryId":"yandex-az","webExtension":{"locales":["az"]}},{"included":{"locales":{"matches":["be"]}},"telemetryId":"yandex-by","webExtension":{"locales":["by"]}},{"included":{"locales":{"matches":["kk"]}},"telemetryId":"yandex-kk","webExtension":{"locales":["kk"]}},{"included":{"locales":{"matches":["ru"]}},"telemetryId":"yandex-ru","webExtension":{"locales":["ru"]}},{"included":{"locales":{"matches":["tr"]}},"telemetryId":"yandex-tr","webExtension":{"locales":["tr"]}}],"extraParams":[{"name":"clid","value":"2186618","purpose":"searchbar","condition":"purpose"},{"name":"clid","value":"2186621","purpose":"keyword","condition":"purpose"},{"name":"clid","value":"2186623","purpose":"contextmenu","condition":"purpose"},{"name":"clid","value":"2186617","purpose":"homepage","condition":"purpose"},{"name":"clid","value":"2186620","purpose":"newtab","condition":"purpose"}],"webExtension":{"id":"yandex@search.mozilla.org"},"id":"a0e7f96a-14e0-4d56-9f54-e0c7e49fd306","last_modified":1583937832372},{"schema":1582890770937,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"allaannonser-sv-SE@search.mozilla.org"},"id":"69a82554-c9b4-4c84-98c7-80f86fa7174a","last_modified":1583937832369},{"schema":1582890771781,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"allegro-pl@search.mozilla.org"},"id":"d915b6bc-bbae-47a6-8323-1b2990ad0e57","last_modified":1583937832367},{"schema":1582890772625,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"atlas-sk@search.mozilla.org"},"id":"6cebcf52-2cfa-4da2-ae4d-2c845ebdbc0b","last_modified":1583937832365},{"schema":1582890773480,"appliesTo":[{"included":{"locales":{"matches":["az"]}}}],"webExtension":{"id":"azerdict@search.mozilla.org"},"id":"c1a6845f-015e-4e67-bc64-6e39a843643f","last_modified":1583937832363},{"schema":1582890774347,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"azet-sk@search.mozilla.org"},"id":"3c632ae9-f758-43b5-9d06-b9c1b6bc7105","last_modified":1583937832361},{"schema":1582890775198,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"bbc-alba@search.mozilla.org"},"id":"4ab14cdb-35ea-42dc-8500-110eb3088b89","last_modified":1583937832358},{"schema":1582890776067,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"bok-NO@search.mozilla.org"},"id":"64ce88a6-fd55-48d1-85a9-724c753f5721","last_modified":1583937832356},{"schema":1582890776913,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"bolcom@search.mozilla.org"},"id":"3d0ab163-0808-4be0-b479-0900dcdc8e35","last_modified":1583937832354},{"schema":1582890777775,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"ceneji@search.mozilla.org"},"id":"d908d622-0387-4d36-8098-1a9e32c0c697","last_modified":1583937832352},{"schema":1582890778608,"appliesTo":[{"included":{"locales":{"matches":["en-GB"]}}}],"webExtension":{"id":"chambers-en-GB@search.mozilla.org"},"id":"270000f0-8527-4f98-aa17-879820209f68","last_modified":1583937832350},{"schema":1582890779439,"appliesTo":[{"included":{"locales":{"matches":["vi"]}}}],"webExtension":{"id":"coccoc@search.mozilla.org"},"id":"4e447f5a-9eb1-436e-8de1-9e4b4b709efb","last_modified":1583937832348},{"schema":1582890780276,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"daum-kr@search.mozilla.org"},"id":"0cdc44be-173a-4ca8-96e3-43e3000da75d","last_modified":1583937832346},{"schema":1582890781123,"appliesTo":[{"included":{"locales":{"matches":["ca","ca-valencia"]}}}],"webExtension":{"id":"diec2@search.mozilla.org"},"id":"055103b9-1f4a-43d0-9b99-5b8d7209b022","last_modified":1583937832343},{"schema":1582890781968,"appliesTo":[{"included":{"locales":{"matches":["es-AR","es-CL","es-ES"]}}}],"webExtension":{"id":"drae@search.mozilla.org"},"id":"3d27c51f-83d4-43be-af84-4d7a51c5a8e4","last_modified":1583937832341},{"schema":1582890782823,"appliesTo":[{"included":{"locales":{"matches":["de"]}}}],"webExtension":{"id":"ecosia@search.mozilla.org"},"id":"1fc1b257-3e6b-4cfb-a323-64c1429bcf51","last_modified":1583937832339},{"schema":1582890783661,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"eki-ee@search.mozilla.org"},"id":"63b74323-1d14-4989-921f-7cc32bfee072","last_modified":1583937832336},{"schema":1582890784534,"appliesTo":[{"included":{"locales":{"matches":["hr"]}}}],"webExtension":{"id":"eudict@search.mozilla.org"},"id":"5cd4781c-2906-4fe7-9d4b-ea9ddbdc2c3b","last_modified":1583937832334},{"schema":1582890785390,"appliesTo":[{"included":{"locales":{"matches":["gd"]}}}],"webExtension":{"id":"faclair-beag@search.mozilla.org"},"id":"6491a2b8-c487-4798-a817-a0fd08b40ee2","last_modified":1583937832332},{"schema":1582890786256,"appliesTo":[{"included":{"locales":{"matches":["kk"]}}}],"webExtension":{"id":"flip@search.mozilla.org"},"id":"d045762c-52ac-4c16-8ca3-072aecea83da","last_modified":1583937832330},{"schema":1582890787108,"appliesTo":[{"included":{"locales":{"matches":["br"]}}}],"webExtension":{"id":"freelang@search.mozilla.org"},"id":"ed6a0f8c-e496-4d9c-936c-b906892e3d23","last_modified":1583937832327},{"schema":1582890787961,"appliesTo":[{"included":{"locales":{"matches":["nn-NO","nb-NO"]}}}],"webExtension":{"id":"gulesider-NO@search.mozilla.org"},"id":"f458e78b-9128-4027-b344-538f5661c148","last_modified":1583937832325},{"schema":1582890788795,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"heureka-cz@search.mozilla.org"},"id":"b9a718b5-fc78-40b8-b1c3-2e15d2009f5c","last_modified":1583937832323},{"schema":1582890789635,"appliesTo":[{"included":{"locales":{"matches":["uk"]}}}],"webExtension":{"id":"hotline-ua@search.mozilla.org"},"id":"da2ec2d3-6c5c-4191-b428-351fbea8aeba","last_modified":1583937832321},{"schema":1582890790469,"appliesTo":[{"included":{"locales":{"matches":["kn"]}}}],"webExtension":{"id":"kannadastore@search.mozilla.org"},"id":"ae1cfae5-0516-41c0-99af-fd3d92a77aa8","last_modified":1583937832318},{"schema":1582890791315,"appliesTo":[{"included":{"locales":{"matches":["de","dsb","hsb","rm"]}}}],"webExtension":{"id":"leo_ende_de@search.mozilla.org"},"id":"03d60939-2c92-45b0-874f-11c8e6d0c2b9","last_modified":1583937832316},{"schema":1582890792162,"appliesTo":[{"included":{"locales":{"matches":["hy-AM"]}}}],"webExtension":{"id":"list-am@search.mozilla.org"},"id":"206db966-db1f-492d-9ab0-71b3e12b434e","last_modified":1583937832313},{"schema":1582890793008,"appliesTo":[{"included":{"locales":{"matches":["th"]}}}],"webExtension":{"id":"longdo@search.mozilla.org"},"id":"8b4f2887-0c24-49ce-b467-2ba8cc9a4945","last_modified":1583937832311},{"schema":1582890793853,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"mailru@search.mozilla.org"},"id":"e0ca4964-e324-44e7-80b6-16a831706d17","last_modified":1583937832309},{"schema":1582890794722,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"mapy-cz@search.mozilla.org"},"id":"9a404348-0998-42c4-9d87-45ef47672c95","last_modified":1583937832306},{"schema":1582890795553,"appliesTo":[{"included":{"locales":{"matches":["fy-NL"]}},"webExtension":{"locales":["fy-NL"]}},{"included":{"locales":{"matches":["nl"]}},"webExtension":{"locales":["nl"]}}],"webExtension":{"id":"marktplaats@search.mozilla.org"},"id":"7823cbee-e13e-4de6-8cf1-86e9234f06ae","last_modified":1583937832304},{"schema":1582890796393,"appliesTo":[{"included":{"locales":{"matches":["es-AR"]}},"webExtension":{"locales":["ar"]}},{"included":{"locales":{"matches":["es-CL"]}},"webExtension":{"locales":["cl"]}},{"included":{"locales":{"matches":["es-MX"]}},"webExtension":{"locales":["mx"]}}],"webExtension":{"id":"mercadolibre@search.mozilla.org"},"id":"df070348-e771-4bd5-964e-d19d82c1384e","last_modified":1583937832302},{"schema":1582890797236,"appliesTo":[{"included":{"locales":{"matches":["pt-BR"]}}}],"webExtension":{"id":"mercadolivre@search.mozilla.org"},"id":"53bf6974-0e60-4551-994f-2d5176a5d1c6","last_modified":1583937832300},{"schema":1582890798070,"appliesTo":[{"included":{"locales":{"matches":["he"]}}}],"webExtension":{"id":"morfix-dic@search.mozilla.org"},"id":"3d05b67d-ef69-4abf-82ab-c943a7e3eff3","last_modified":1583937832298},{"schema":1582890798901,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"najdi-si@search.mozilla.org"},"id":"dd8dcdda-7da8-46db-823b-d33fb1da63f8","last_modified":1583937832295},{"schema":1582890799757,"appliesTo":[{"included":{"locales":{"matches":["ko"]}}}],"webExtension":{"id":"naver-kr@search.mozilla.org"},"id":"4135dc8f-f0bf-475b-b39f-74c4256572af","last_modified":1583937832292},{"schema":1582890800610,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"neti-ee@search.mozilla.org"},"id":"2260d56e-d47c-435e-9cb8-9c7c67e8df7c","last_modified":1583937832289},{"schema":1582890801444,"appliesTo":[{"included":{"locales":{"matches":["sl"]}}}],"webExtension":{"id":"odpiralni@search.mozilla.org"},"id":"fa42b23a-30c5-46f3-8997-4a84029b5349","last_modified":1583937832287},{"schema":1582890802297,"appliesTo":[{"included":{"locales":{"matches":["bs"]}}}],"webExtension":{"id":"olx@search.mozilla.org"},"id":"af72d7ef-4255-4362-b328-703aea68ee7e","last_modified":1583937832283},{"schema":1582890803993,"appliesTo":[{"included":{"locales":{"matches":["et"]}}}],"webExtension":{"id":"osta-ee@search.mozilla.org"},"id":"af16e0da-1bcf-4769-b9bb-e43a94bfac75","last_modified":1583937832276},{"schema":1582890804842,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"ozonru@search.mozilla.org"},"id":"f62fc00c-2e87-4e95-aa11-0db075cd5741","last_modified":1583937832272},{"schema":1582890805689,"appliesTo":[{"included":{"locales":{"matches":["cy"]}}}],"webExtension":{"id":"palasprint@search.mozilla.org"},"id":"656d9e4e-74d5-4eee-bee3-519b4d9bfd37","last_modified":1583937832269},{"schema":1582890806533,"appliesTo":[{"included":{"locales":{"matches":["bg"]}}}],"webExtension":{"id":"pazaruvaj@search.mozilla.org"},"id":"acc27094-9f0a-49af-868b-8b6ecbbda976","last_modified":1583937832267},{"schema":1582890807390,"appliesTo":[{"included":{"locales":{"matches":["sr"]}}}],"webExtension":{"id":"pogodak@search.mozilla.org"},"id":"3bb87247-c36b-4606-a0d6-92b14eaeba86","last_modified":1583937832264},{"schema":1582890808245,"appliesTo":[{"included":{"locales":{"matches":["pt-PT"]}}}],"webExtension":{"id":"priberam@search.mozilla.org"},"id":"a3f1a5b6-cd8d-41b3-bb2b-de6bb1943a3d","last_modified":1583937832261},{"schema":1582890809085,"appliesTo":[{"included":{"locales":{"matches":["ru"]}}}],"webExtension":{"id":"priceru@search.mozilla.org"},"id":"de771801-5bca-436c-be56-f882897c46f2","last_modified":1583937832259},{"schema":1582890809928,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"prisjakt-sv-SE@search.mozilla.org"},"id":"8a7de784-efa5-428f-9193-a0d3368b80d4","last_modified":1583937832257},{"schema":1582890810778,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"pwn-pl@search.mozilla.org"},"id":"2ca17e29-ed08-4218-99f6-0615c8bc5c67","last_modified":1583937832254},{"schema":1582890811653,"appliesTo":[{"included":{"locales":{"matches":["fr"]}}}],"webExtension":{"id":"qwant@search.mozilla.org"},"id":"f59fddbc-580b-4672-9cda-32941ceec729","last_modified":1583937832252},{"schema":1582890812485,"appliesTo":[{"included":{"locales":{"matches":["nb-NO","nn-NO"]}}}],"webExtension":{"id":"qxl-NO@search.mozilla.org"},"id":"e54d56d1-defb-4e34-b85e-9814cb7797c2","last_modified":1583937832249},{"schema":1582890814195,"appliesTo":[{"included":{"locales":{"matches":["zh-TW"]}}}],"webExtension":{"id":"readmoo@search.mozilla.org"},"id":"2d24515e-3e35-42ed-bf17-1388acfe80fa","last_modified":1583937832245},{"schema":1582890815048,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"salidzinilv@search.mozilla.org"},"id":"e7dcde21-5b5e-4406-b602-0611130fd3a6","last_modified":1583937832242},{"schema":1582890815902,"appliesTo":[{"included":{"locales":{"matches":["cs"]}}}],"webExtension":{"id":"seznam-cz@search.mozilla.org"},"id":"c50dcc87-0192-4461-bb88-17a55ba181c7","last_modified":1583937832240},{"schema":1582890816739,"appliesTo":[{"included":{"locales":{"matches":["ltg","lv"]}}}],"webExtension":{"id":"sslv@search.mozilla.org"},"id":"74f2f615-8d17-4133-82c1-18d03643c383","last_modified":1583937832237},{"schema":1582890817589,"appliesTo":[{"included":{"locales":{"matches":["ga-IE"]}}}],"webExtension":{"id":"tearma@search.mozilla.org"},"id":"518293ee-4bf0-4514-9b73-c6fb646a8a18","last_modified":1583937832235},{"schema":1582890819290,"appliesTo":[{"included":{"locales":{"matches":["sv-SE"]}}}],"webExtension":{"id":"tyda-sv-SE@search.mozilla.org"},"id":"32eec495-ce07-4ce5-8d07-4cb32050459d","last_modified":1583937832229},{"schema":1582890820131,"appliesTo":[{"included":{"locales":{"matches":["hu"]}}}],"webExtension":{"id":"vatera@search.mozilla.org"},"id":"d0eab7e7-9084-4a43-b845-568dbe9f07dc","last_modified":1583937832225},{"schema":1582890820983,"appliesTo":[{"included":{"locales":{"matches":["te"]}},"webExtension":{"locales":["te"]}},{"included":{"locales":{"matches":["oc"]}},"webExtension":{"locales":["oc"]}}],"webExtension":{"id":"wiktionary@search.mozilla.org"},"id":"781f42f0-3a5c-4d14-8be2-665eefa65653","last_modified":1583937832222},{"schema":1582890821826,"appliesTo":[{"included":{"locales":{"matches":["pl"]}}}],"webExtension":{"id":"wolnelektury-pl@search.mozilla.org"},"id":"1960ccff-4aab-48cd-9bf5-0eb2adde76f9","last_modified":1583937832218},{"schema":1582890822671,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp@search.mozilla.org"},"id":"9e73a342-4e27-4e9f-8a29-be193d59236a","last_modified":1583937832213},{"schema":1582890823520,"appliesTo":[{"included":{"locales":{"matches":["ja-JP-macos","ja"]}}}],"webExtension":{"id":"yahoo-jp-auctions@search.mozilla.org"},"id":"43559b11-05dc-4750-b131-afdbd9d25905","last_modified":1583937832210},{"schema":1582890824418,"appliesTo":[{"included":{"locales":{"matches":["sk"]}}}],"webExtension":{"id":"zoznam-sk@search.mozilla.org"},"id":"e332f9dd-d1c5-4cc9-8534-3fd9938b970c","last_modified":1583937832207},{"schema":1582890825302,"appliesTo":[{"included":{"everywhere":true}},{"included":{"locales":{"matches":["af","an","ar","ast","az","bg","br","bs","cy","da","de","dsb","el","eo","et","eu","fa","fi","fy-NL","ga-IE","gd","gl","gn","he","hr","hsb","hu","ia","id","is","it","ka","kab","kk","km","kn","lij","lo","lt","ltg","lv","mk","mr","ms","my","nl","oc","pl","rm","ro","ru","si","sk","sl","sq","sr","sv-SE","ta","te","th","tl","tr","uk","ur","uz","vi","wo","zh-CN","zh-TW"]}},"webExtension":{"locales":["$USER_LOCALE"]}},{"included":{"locales":{"matches":["be"]}},"webExtension":{"locales":["be","be-tarask"]}},{"included":{"locales":{"matches":["bn","bn-BD","bn-IN"]}},"webExtension":{"locales":["bn"]}},{"included":{"locales":{"matches":["ca","ca-valencia"]}},"webExtension":{"locales":["ca"]}},{"included":{"locales":{"matches":["cak","es-AR","es-CL","es-ES","es-MX","trs"]}},"webExtension":{"locales":["es"]}},{"included":{"locales":{"matches":["cs"]}},"webExtension":{"locales":["cz"]}},{"included":{"locales":{"matches":["ff","fr","son"]}},"webExtension":{"locales":["fr"]}},{"included":{"locales":{"matches":["gu-IN"]}},"webExtension":{"locales":["gu"]}},{"included":{"locales":{"matches":["hi-IN"]}},"webExtension":{"locales":["hi"]}},{"included":{"locales":{"matches":["hy-AM"]}},"webExtension":{"locales":["hy"]}},{"included":{"locales":{"matches":["ja-JP-macos","ja"]}},"webExtension":{"locales":["ja"]}},{"included":{"locales":{"matches":["ko"]}},"webExtension":{"locales":["kr"]}},{"included":{"locales":{"matches":["nb-NO"]}},"webExtension":{"locales":["NO"]}},{"included":{"locales":{"matches":["ne-NP"]}},"webExtension":{"locales":["ne"]}},{"included":{"locales":{"matches":["nn-NO"]}},"webExtension":{"locales":["NN"]}},{"included":{"locales":{"matches":["pa-IN"]}},"webExtension":{"locales":["pa"]}},{"included":{"locales":{"matches":["pt-BR","pt-PT"]}},"webExtension":{"locales":["pt"]}}],"webExtension":{"id":"wikipedia@search.mozilla.org"},"id":"3f3beb1d-e32e-40a4-b6ed-56741803e1d8","last_modified":1583937832203}]}
\ No newline at end of file
diff --git a/sourcestamp.txt b/sourcestamp.txt
index 05d48529c5c0..38dd6c97631f 100644
--- a/sourcestamp.txt
+++ b/sourcestamp.txt
@@ -1,3 +1,3 @@
-20200407173003
-https://hg.mozilla.org/releases/comm-beta/rev/73855ae9feac41474c1dc237b13b1cab9fe78fa8
-https://hg.mozilla.org/releases/mozilla-beta/rev/b4ef8571957b03316302e9dd21979a0d2612f648
+20200420212409
+https://hg.mozilla.org/releases/comm-beta/rev/f049099923e4de955115d4150214936f37912021
+https://hg.mozilla.org/releases/mozilla-beta/rev/d64d5ccf2b14498b6de0bb18c4e9e66abae5efce
diff --git a/storage/TelemetryVFS.cpp b/storage/TelemetryVFS.cpp
index 9d5a9d0f365e..ddb2c7e36e27 100644
--- a/storage/TelemetryVFS.cpp
+++ b/storage/TelemetryVFS.cpp
@@ -276,7 +276,9 @@ int xWrite(sqlite3_file* pFile, const void* zBuf, int iAmt,
         "update its current size...");
     sqlite_int64 currentSize;
     if (xFileSize(pFile, &currentSize) == SQLITE_OK) {
-      p->quotaObject->MaybeUpdateSize(currentSize, /* aTruncate */ true);
+      DebugOnly<bool> res =
+          p->quotaObject->MaybeUpdateSize(currentSize, /* aTruncate */ true);
+      MOZ_ASSERT(res);
     }
   }
   return rc;
@@ -315,7 +317,9 @@ int xTruncate(sqlite3_file* pFile, sqlite_int64 size) {
           "xTruncate failed on a quota-controlled file, attempting to "
           "update its current size...");
       if (xFileSize(pFile, &size) == SQLITE_OK) {
-        p->quotaObject->MaybeUpdateSize(size, /* aTruncate */ true);
+        DebugOnly<bool> res =
+            p->quotaObject->MaybeUpdateSize(size, /* aTruncate */ true);
+        MOZ_ASSERT(res);
       }
     }
   }
diff --git a/taskcluster/ci/test/mochitest.yml b/taskcluster/ci/test/mochitest.yml
index 9c4ced210353..381a370682e3 100644
--- a/taskcluster/ci/test/mochitest.yml
+++ b/taskcluster/ci/test/mochitest.yml
@@ -433,6 +433,7 @@ mochitest-webgpu:
     virtualization: virtual-with-gpu
     e10s: true
     loopback-video: true
+    run-on-projects: ["trunk", "try"]
     tier: default
     max-run-time:
         by-test-platform:
diff --git a/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in b/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in
index c4c9c8954682..9d19f806adb3 100644
--- a/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in
+++ b/taskcluster/docker/firefox-flatpak/org.mozilla.firefox.appdata.xml.in
@@ -7,7 +7,7 @@
   <metadata_license>CC0-1.0</metadata_license>
   <project_license>MPL-2.0</project_license>
   <description>
-    <p><strong>The new Firefox</strong></p>
+    <p>The new Firefox></p>
     <p>Meet Firefox Quantum. Fast for good.</p>
     <p>Features:</p>
     <ul>
@@ -15,13 +15,13 @@
     <li>Better, faster page loading that uses less computer memory.</li>
     <li>Gorgeous design and smart features for intelligent browsing.</li>
     </ul>
-    <p><strong>Now 2x faster</strong></p>
+    <p>Now 2x faster></p>
     <p>Crazy powerful browser engine? Check. Less time waiting around for
     pages to load? Also, check. Firefox Quantum is twice as fast as Firefox
     was before.</p>
-    <p><strong>Smooth browsing</strong></p>
+    <p>Smooth browsing</p>
     <p>Whether you’ve opened 10 or 1000, switching between tabs is faster than ever with Firefox’s new, responsive engine.</p>
-    <p><strong>Seriously Private Browsing</strong></p>
+    <p>Seriously Private Browsing</p>
     <p>The most powerful private browsing mode with added tracking protection.</p>
     <ul>
     <li><p>Private Browsing</p>
@@ -40,7 +40,7 @@
     </ul>
     </li>
     </ul>
-    <p><strong>Customization Features</strong></p>
+    <p>Customization Features</p>
     <ul>
     <li><p>Extensions</p>
     </li>
@@ -52,13 +52,13 @@
     </ul>
     </li>
     </ul>
-    <p><strong>Sync your devices</strong></p>
+    <p>Sync your devices</p>
     <ul>
     <li>Seamlessly access passwords, bookmarks and more. Plus, use our Send
     Tabs feature to instantly share open tabs between desktop, mobile and
     tablet.</li>
     </ul>
-    <p><strong>Browse for good</strong></p>
+    <p>Browse for good</p>
     <p>Firefox is made by Mozilla, the non-profit champions of a healthy
     internet. Mozilla also tackles issues like privacy, misinformation and
     trolling by investing in fellowships, campaigns and new technologies
diff --git a/taskcluster/docker/firefox-flatpak/runme.sh b/taskcluster/docker/firefox-flatpak/runme.sh
index 64e42ef8468d..8c5520b47678 100755
--- a/taskcluster/docker/firefox-flatpak/runme.sh
+++ b/taskcluster/docker/firefox-flatpak/runme.sh
@@ -1,5 +1,4 @@
 #!/bin/bash
-
 set -xe
 
 # Future products supporting Flatpaks will set this accordingly
@@ -108,11 +107,14 @@ appdir=build/files
 install -d "${appdir}/lib/"
 (cd "${appdir}/lib/" && tar jxf "${WORKSPACE}/firefox.tar.bz2")
 install -D -m644 -t "${appdir}/share/appdata" org.mozilla.firefox.appdata.xml
-appstream-compose --prefix="${appdir}" --origin=flatpak --basename=org.mozilla.firefox org.mozilla.firefox
 install -D -m644 -t "${appdir}/share/applications" org.mozilla.firefox.desktop
 for size in 16 32 48 64 128; do
     install -D -m644 "${appdir}/lib/firefox/browser/chrome/icons/default/default${size}.png" "${appdir}/share/icons/hicolor/${size}x${size}/apps/org.mozilla.firefox.png"
 done
+
+appstream-compose --prefix="${appdir}" --origin=flatpak --basename=org.mozilla.firefox org.mozilla.firefox
+appstream-util mirror-screenshots "${appdir}"/share/app-info/xmls/org.mozilla.firefox.xml.gz "https://dl.flathub.org/repo/screenshots/org.mozilla.firefox-${FLATPAK_BRANCH}" /tmp "build/screenshots/org.mozilla.firefox-${FLATPAK_BRANCH}"
+
 # XXX: we used to `install -D` before which automatically created the components
 # of target, now we need to manually do this since we're symlinking
 mkdir -p "${appdir}/lib/firefox/distribution/extensions"
@@ -129,9 +131,13 @@ install -D -m644 -t "${appdir}/lib/firefox/browser/defaults/preferences" default
 install -D -m755 launch-script.sh "${appdir}/bin/firefox"
 
 flatpak build-finish build                                      \
-        --share=ipc --socket=x11                                \
+        --share=ipc                                             \
+        --socket=wayland                                        \
+        --socket=fallback-x11                                   \
+        --require-version=1.0.0                                 \
         --share=network                                         \
         --socket=pulseaudio                                     \
+        --socket=pcsc                                           \
         --persist=.mozilla                                      \
         --filesystem=xdg-download:rw                            \
         --device=all                                            \
@@ -141,6 +147,8 @@ flatpak build-finish build                                      \
         --talk-name=org.gnome.SessionManager                    \
         --talk-name=org.freedesktop.ScreenSaver                 \
         --talk-name="org.gtk.vfs.*"                             \
+        --talk-name=org.freedesktop.Notifications               \
+        --talk-name=org.mpris.MediaPlayer2.org.mozilla.firefox  \
         --command=firefox
 
 flatpak build-export --disable-sandbox --no-update-summary --exclude='/share/runtime/langpack/*/*' repo build "$FLATPAK_BRANCH"
diff --git a/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini b/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini
index 700e4cc5208a..5305849a57e2 100644
--- a/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini
+++ b/testing/raptor/raptor/tests/benchmarks/raptor-webaudio.ini
@@ -8,7 +8,7 @@
 type =  benchmark
 test_url = http://<host>:<port>/webaudio/index.html?raptor
 page_cycles = 5
-page_timeout = 180000
+page_timeout = 360000
 unit = score
 lower_is_better = true
 alert_threshold = 2.0
diff --git a/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html b/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html
index 737dab117d3b..246b15a0af36 100644
--- a/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html
+++ b/testing/web-platform/tests/custom-elements/custom-element-reaction-queue.html
@@ -50,6 +50,39 @@ test_with_window(function (contentWindow) {
     assert_connected_log_entry(log[5], element2);
 }, 'Upgrading a custom element must invoke attributeChangedCallback and connectedCallback before start upgrading another element');
 
+test_with_window(function (contentWindow) {
+    const contentDocument = contentWindow.document;
+    contentDocument.write('<test-element>');
+
+    const element = contentDocument.querySelector('test-element');
+    assert_equals(Object.getPrototypeOf(element), contentWindow.HTMLElement.prototype);
+
+    let log = [];
+    class TestElement extends contentWindow.HTMLElement {
+        constructor() {
+            super();
+            this.id = "foo";
+            this.setAttribute('id', 'foo');
+            this.removeAttribute('id');
+            this.style.fontSize = '10px';
+            log.push(create_constructor_log(this));
+        }
+        connectedCallback(...args) {
+            log.push(create_connected_callback_log(this, ...args));
+        }
+        attributeChangedCallback(...args) {
+            log.push(create_attribute_changed_callback_log(this, ...args));
+        }
+        static get observedAttributes() { return ['id', 'style']; }
+    }
+    contentWindow.customElements.define('test-element', TestElement);
+    assert_equals(Object.getPrototypeOf(element), TestElement.prototype);
+
+    assert_equals(log.length, 2);
+    assert_constructor_log_entry(log[0], element);
+    assert_connected_log_entry(log[1], element);
+}, 'Upgrading a custom element must not invoke attributeChangedCallback for the attribute that is changed during upgrading');
+
 test_with_window(function (contentWindow) {
     const contentDocument = contentWindow.document;
     contentDocument.write('<test-element id="first-element">');
diff --git a/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block-ref.html b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block-ref.html
new file mode 100644
index 000000000000..fe68571013cc
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block-ref.html
@@ -0,0 +1,7 @@
+<!doctype html>
+<title>Test reference</title>
+<div>
+  Foo
+  <div></div>
+  Bar
+</div>
diff --git a/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block.html b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block.html
new file mode 100644
index 000000000000..7bcc61107236
--- /dev/null
+++ b/testing/web-platform/tests/html/editing/editing-0/contenteditable/contenteditable-with-empty-block.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<title>contenteditable doesn't cause inner empty blocks to grow.</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1628770">
+<link rel="match" href="contenteditable-with-empty-block-ref.html">
+<div contenteditable>
+  Foo
+  <div></div>
+  Bar
+</div>
diff --git a/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-srcset.html b/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-srcset.html
new file mode 100644
index 000000000000..21c11c7233c7
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-srcset.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<head>
+<title>loading='lazy' image with srcset</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/images.html#update-the-image-data">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/images.html#will-lazy-load-image-steps">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<div style="height:1000vh;"></div>
+<img srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAG0lEQVR42mP8z0A%2BYKJA76jmUc2jmkc1U0EzACKcASfOgGoMAAAAAElFTkSuQmCC" loading="lazy">
+<img loading="lazy" srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAG0lEQVR42mP8z0A%2BYKJA76jmUc2jmkc1U0EzACKcASfOgGoMAAAAAElFTkSuQmCC">
+<script>
+promise_test(async t => {
+  let loaded_images = 0;
+  const imgs = document.querySelectorAll("img");
+  imgs.forEach(img => {
+    img.addEventListener("load", () => { loaded_images++; }, { once: true });
+  });
+
+  await new Promise(resolve => window.addEventListener("load", resolve));
+
+  assert_equals(loaded_images, 0,
+                "lazy-load images with srcset shouldn't be loaded yet");
+
+  const promises = [
+    new Promise(resolve => imgs[0].addEventListener("load", resolve)),
+    new Promise(resolve => imgs[1].addEventListener("load", resolve)),
+  ];
+
+  imgs[1].scrollIntoView();
+  await Promise.all(promises);
+
+  imgs.forEach(img => {
+    assert_true(img.complete,
+                "Now the lazy-load image with srcset should be loaded");
+  });
+});
+</script>
diff --git a/testing/web-platform/tests/selection/selection-select-all-move-input-crash.html b/testing/web-platform/tests/selection/selection-select-all-move-input-crash.html
new file mode 100644
index 000000000000..6f692dc5e7d6
--- /dev/null
+++ b/testing/web-platform/tests/selection/selection-select-all-move-input-crash.html
@@ -0,0 +1,10 @@
+<script>
+  function start() {
+    document.execCommand('selectAll', false)
+    document.documentElement.appendChild(document.getElementById('input'))
+  }
+</script>
+<body onload="start()">
+<input id="input" autofocus>
+<canvas contenteditable="true" hidden></canvas>
+</body>
diff --git a/third_party/rust/nom/.cargo-checksum.json b/third_party/rust/nom/.cargo-checksum.json
index b236aa3bb55c..262350f0269c 100644
--- a/third_party/rust/nom/.cargo-checksum.json
+++ b/third_party/rust/nom/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{".travis.yml":"124c5613de02fe2088a7410a7057b0e0ed49dcbc8509704b690de98e83b289e0","CHANGELOG.md":"f4015ae48bb8f7c672c4fdf1ca4bdde5910f1b423ddc12e9fe80395911759d3e","Cargo.lock":"d7985e783bf7275009ab524f13aac37adc7291838a1956e1f092413ff3b8ea04","Cargo.toml":"72afa6607971579c7009dff34b6b334d4893b1a9f1983cd80364c5e318e4ec2b","LICENSE":"4dbda04344456f09a7a588140455413a9ac59b6b26a1ef7cdf9c800c012d87f0","build.rs":"fd66799ca3bd6a83b10f18a62e6ffc3b1ac94074fe65de4e4c1c447bf71d6ebb","src/bits/complete.rs":"8a60ae4cd6aaf32cb232b598b1a3dda7858c619944ba12ebdb01a31c75243293","src/bits/macros.rs":"8d9ba23f237b4fc01e3b2106002d0f6d59930a42f34d80662c61e0057dfb4a5b","src/bits/mod.rs":"4ca0148b4ef2de4e88796da7831eaa5c4fcbc5515a101eae1b0bc4853c80b5e7","src/bits/streaming.rs":"7c587808476edee57caeccca7dccd744bdfdbb13ae1156400fb4961980fa325d","src/branch/macros.rs":"8b885185725c16369d90954fed8450070bcd4bf8ae7de1df1bb46bb378450d71","src/branch/mod.rs":"d0c871ad7b74428ddccef445a10254249c3907528005a00275e8eb6516255f2f","src/bytes/complete.rs":"107f776885161e48a596962925d2b1628f20fd4bbe5b3777bb34ec175b97e280","src/bytes/macros.rs":"914a821761bbf49f04425068b7426bdd60394e8cc30e7c2193160b16e06c266f","src/bytes/mod.rs":"577231e6e6bd51726a877a73292d8f1c626f6b32ebe4a57943acaed8a8a2975d","src/bytes/streaming.rs":"4b2e577e6057fda932d1edc2ebe53c5df71a21417a304b35d5230dd7221411f3","src/character/complete.rs":"bb80656f3405eca79ba93c674cae7cd296733d784928e5c45754ee27963b7325","src/character/macros.rs":"f330ab60d469802b1664dcbbccd4bfe3e1ca87b348e92609ef34e25b4d475983","src/character/mod.rs":"9f520d535a88849726eac8648aa5c8b86193ab2f3a984d63c8371b846cc0b72c","src/character/streaming.rs":"9be7051951e8d0a54e294542baaf115aeb6efb818521f045386cd3a1777ca6a0","src/combinator/macros.rs":"df9ba1157bda21313a9c23826baeefd99f54e92c47d60c8dbb25697fe4d52686","src/combinator/mod.rs":"d1b2073683be1c9c4a06d1d3764ac789027ad7401ec726805d1505c1ad8ab1fd","src/error.rs":"ef7feb06b9689aa2f4b11a367b6f7058df8fd151b673c7482edd6600e55e38da","src/internal.rs":"c4029b0e32d41eb6407e517f3102a41a3a80a6a69df4767008ac5656b28d7ab0","src/lib.rs":"f01cdc23cc17201f978796d2d80fb6bba5a9b81ffb4653286e1e53f904079911","src/methods.rs":"56099c30123e92f9f6bacb16017f29fcdbc6546afbf0f80cf4951d2d8093ba83","src/multi/macros.rs":"01d15ae913921bd1ed0ff579a868ea39a314a866e6b5a365ef6b448a75f9b3a8","src/multi/mod.rs":"342c30e0c601558c867df215f7094bc9e43534a7793f2e8b19c114fe07cfea41","src/number/complete.rs":"560dfb2ffbbfe7fe276389b60eec2d717fec20eab68cc72d10d87ff6e2195352","src/number/macros.rs":"e614ee142658c126902a466f29ef250a77016fa126b8dfd59db0c6657a0ef205","src/number/mod.rs":"e432c317ee839a2f928cd0e8e583acadb165ed84fb649e681688a0fcd84b0a75","src/number/streaming.rs":"4c6fbce64e0d535f69d2c928314e1d0a019480db5a09e4f47a654a2e8fd56e8c","src/regexp.rs":"ac6fc61c2e7b629e6786638b44d63d15139c50f9d6a38acd044e4c2b3a699e08","src/sequence/macros.rs":"0e72871cdb2f1bf804f7f637def117c8e531f78cc7da5a6a0e343f0dbfb04271","src/sequence/mod.rs":"ec34b969462703252c4f00c27a03928c9580da612c71b7100e0902190a633ab9","src/str.rs":"fcae4d6f2f7bc921cafe3d0ce682d0566618cbe5f3b3e4b51ca34d11cb0e3e93","src/traits.rs":"2a84c3aa40f1cf78e0149e344da8b85486f7b6c0ddff8f23689bccce0def2260","src/util.rs":"bcedca3c88ac24f11f73e836efd8fe00014562163cc3d43d0cec9d726a4687c3","src/whitespace.rs":"53bddd9d559dc7793effcb828f9c196a7f098338edb0877940d1246834761308","tests/arithmetic.rs":"c57bc547110e498e7bddc973a94202f22356bc525fed55dac4f03daf16eb54f7","tests/arithmetic_ast.rs":"8fbc4c5d8850fa1cf0a16f97e8718d5427b2657f12ca4a0b3b6c1b47fd9e67d4","tests/blockbuf-arithmetic.rs":"099fdf75da97ae032006d8c82ea2207265c5161a08d1370e1ddddb01e73afaf4","tests/css.rs":"b13466eb6a0831f98ede83ffdd752ba821f7d03db724fd92b5bfbc0b9f804a65","tests/custom_errors.rs":"3d2511f8a8d0eb20d9efc19f29ae4ab34389bdd33214a421989d0c47b540b7fd","tests/escaped.rs":"03ecb10828472e4de2ace05a12cb49997b47a113b6a3b0eea3d56bc2bafd8446","tests/float.rs":"92947cc112a6b865f5e19d80edbf300ddc0d0ca4b4e4543eda15337b5c60eedf","tests/inference.rs":"fe476d1367fce9f0baf82295dc037c79321ededf12b9bcc0c5acdc7cefff4720","tests/ini.rs":"04ebf3ead0008974b3bedc387e889bab5942efd0c9c8563fe47e056a9b90bbab","tests/ini_str.rs":"2831a4ee26b37734dba8862cc2972a3a1433abf4fcab253b6cf4fb43f120301d","tests/issues.rs":"142c8d206089b04cf2fd0cbd90f87421ded435ce300516c029294b056354e00f","tests/json.rs":"25476ec2daca19295f5f99b621eecc859a5db5789ac35be381eaf8703a70bce8","tests/mp4.rs":"d0e61bfc93ff40676ca7e9d7813a5ad7c73b1db874599d8f3ea784115bfcab87","tests/multiline.rs":"6a5321cb53c7f88778fa100499533abfa602bada7a6b1d0fbba7ef77b9c110f5","tests/named_args.rs":"bd8095c3abc6fb806c9181c6025c0111d1e7f3b7269ea89ae122bf3bb8ed7e7d","tests/overflow.rs":"d1d6d8ce9b34ed47b42a5f7250ce711805a397691dc6cad3cc8945ec230da161","tests/reborrow_fold.rs":"9328deafc2143c2a2d1a0be86e2448b644cffcb5f0935c8b24eb469f1f9477c0","tests/test1.rs":"06fc9e52638f16bfc3ef69cd26b927e0cf55706d6f132ab7c0f1072208475853"},"package":"0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"f4015ae48bb8f7c672c4fdf1ca4bdde5910f1b423ddc12e9fe80395911759d3e","Cargo.lock":"d7985e783bf7275009ab524f13aac37adc7291838a1956e1f092413ff3b8ea04","Cargo.toml":"72afa6607971579c7009dff34b6b334d4893b1a9f1983cd80364c5e318e4ec2b","LICENSE":"4dbda04344456f09a7a588140455413a9ac59b6b26a1ef7cdf9c800c012d87f0","build.rs":"fd66799ca3bd6a83b10f18a62e6ffc3b1ac94074fe65de4e4c1c447bf71d6ebb","src/bits/complete.rs":"8a60ae4cd6aaf32cb232b598b1a3dda7858c619944ba12ebdb01a31c75243293","src/bits/macros.rs":"8d9ba23f237b4fc01e3b2106002d0f6d59930a42f34d80662c61e0057dfb4a5b","src/bits/mod.rs":"4ca0148b4ef2de4e88796da7831eaa5c4fcbc5515a101eae1b0bc4853c80b5e7","src/bits/streaming.rs":"7c587808476edee57caeccca7dccd744bdfdbb13ae1156400fb4961980fa325d","src/branch/macros.rs":"8b885185725c16369d90954fed8450070bcd4bf8ae7de1df1bb46bb378450d71","src/branch/mod.rs":"d0c871ad7b74428ddccef445a10254249c3907528005a00275e8eb6516255f2f","src/bytes/complete.rs":"107f776885161e48a596962925d2b1628f20fd4bbe5b3777bb34ec175b97e280","src/bytes/macros.rs":"914a821761bbf49f04425068b7426bdd60394e8cc30e7c2193160b16e06c266f","src/bytes/mod.rs":"577231e6e6bd51726a877a73292d8f1c626f6b32ebe4a57943acaed8a8a2975d","src/bytes/streaming.rs":"4b2e577e6057fda932d1edc2ebe53c5df71a21417a304b35d5230dd7221411f3","src/character/complete.rs":"bb80656f3405eca79ba93c674cae7cd296733d784928e5c45754ee27963b7325","src/character/macros.rs":"f330ab60d469802b1664dcbbccd4bfe3e1ca87b348e92609ef34e25b4d475983","src/character/mod.rs":"9f520d535a88849726eac8648aa5c8b86193ab2f3a984d63c8371b846cc0b72c","src/character/streaming.rs":"9be7051951e8d0a54e294542baaf115aeb6efb818521f045386cd3a1777ca6a0","src/combinator/macros.rs":"df9ba1157bda21313a9c23826baeefd99f54e92c47d60c8dbb25697fe4d52686","src/combinator/mod.rs":"d1b2073683be1c9c4a06d1d3764ac789027ad7401ec726805d1505c1ad8ab1fd","src/error.rs":"ef7feb06b9689aa2f4b11a367b6f7058df8fd151b673c7482edd6600e55e38da","src/internal.rs":"c4029b0e32d41eb6407e517f3102a41a3a80a6a69df4767008ac5656b28d7ab0","src/lib.rs":"f01cdc23cc17201f978796d2d80fb6bba5a9b81ffb4653286e1e53f904079911","src/methods.rs":"56099c30123e92f9f6bacb16017f29fcdbc6546afbf0f80cf4951d2d8093ba83","src/multi/macros.rs":"01d15ae913921bd1ed0ff579a868ea39a314a866e6b5a365ef6b448a75f9b3a8","src/multi/mod.rs":"342c30e0c601558c867df215f7094bc9e43534a7793f2e8b19c114fe07cfea41","src/number/complete.rs":"560dfb2ffbbfe7fe276389b60eec2d717fec20eab68cc72d10d87ff6e2195352","src/number/macros.rs":"e614ee142658c126902a466f29ef250a77016fa126b8dfd59db0c6657a0ef205","src/number/mod.rs":"e432c317ee839a2f928cd0e8e583acadb165ed84fb649e681688a0fcd84b0a75","src/number/streaming.rs":"4c6fbce64e0d535f69d2c928314e1d0a019480db5a09e4f47a654a2e8fd56e8c","src/regexp.rs":"ac6fc61c2e7b629e6786638b44d63d15139c50f9d6a38acd044e4c2b3a699e08","src/sequence/macros.rs":"0e72871cdb2f1bf804f7f637def117c8e531f78cc7da5a6a0e343f0dbfb04271","src/sequence/mod.rs":"ec34b969462703252c4f00c27a03928c9580da612c71b7100e0902190a633ab9","src/str.rs":"fcae4d6f2f7bc921cafe3d0ce682d0566618cbe5f3b3e4b51ca34d11cb0e3e93","src/traits.rs":"2a84c3aa40f1cf78e0149e344da8b85486f7b6c0ddff8f23689bccce0def2260","src/util.rs":"bcedca3c88ac24f11f73e836efd8fe00014562163cc3d43d0cec9d726a4687c3","src/whitespace.rs":"53bddd9d559dc7793effcb828f9c196a7f098338edb0877940d1246834761308","tests/arithmetic.rs":"c57bc547110e498e7bddc973a94202f22356bc525fed55dac4f03daf16eb54f7","tests/arithmetic_ast.rs":"8fbc4c5d8850fa1cf0a16f97e8718d5427b2657f12ca4a0b3b6c1b47fd9e67d4","tests/blockbuf-arithmetic.rs":"099fdf75da97ae032006d8c82ea2207265c5161a08d1370e1ddddb01e73afaf4","tests/css.rs":"b13466eb6a0831f98ede83ffdd752ba821f7d03db724fd92b5bfbc0b9f804a65","tests/custom_errors.rs":"3d2511f8a8d0eb20d9efc19f29ae4ab34389bdd33214a421989d0c47b540b7fd","tests/escaped.rs":"03ecb10828472e4de2ace05a12cb49997b47a113b6a3b0eea3d56bc2bafd8446","tests/float.rs":"92947cc112a6b865f5e19d80edbf300ddc0d0ca4b4e4543eda15337b5c60eedf","tests/inference.rs":"fe476d1367fce9f0baf82295dc037c79321ededf12b9bcc0c5acdc7cefff4720","tests/ini.rs":"04ebf3ead0008974b3bedc387e889bab5942efd0c9c8563fe47e056a9b90bbab","tests/ini_str.rs":"2831a4ee26b37734dba8862cc2972a3a1433abf4fcab253b6cf4fb43f120301d","tests/issues.rs":"142c8d206089b04cf2fd0cbd90f87421ded435ce300516c029294b056354e00f","tests/json.rs":"25476ec2daca19295f5f99b621eecc859a5db5789ac35be381eaf8703a70bce8","tests/mp4.rs":"d0e61bfc93ff40676ca7e9d7813a5ad7c73b1db874599d8f3ea784115bfcab87","tests/multiline.rs":"6a5321cb53c7f88778fa100499533abfa602bada7a6b1d0fbba7ef77b9c110f5","tests/named_args.rs":"bd8095c3abc6fb806c9181c6025c0111d1e7f3b7269ea89ae122bf3bb8ed7e7d","tests/overflow.rs":"d1d6d8ce9b34ed47b42a5f7250ce711805a397691dc6cad3cc8945ec230da161","tests/reborrow_fold.rs":"9328deafc2143c2a2d1a0be86e2448b644cffcb5f0935c8b24eb469f1f9477c0","tests/test1.rs":"06fc9e52638f16bfc3ef69cd26b927e0cf55706d6f132ab7c0f1072208475853"},"package":"0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6"}
\ No newline at end of file
diff --git a/third_party/rust/nom/.travis.yml b/third_party/rust/nom/.travis.yml
deleted file mode 100644
index e18b14079ddd..000000000000
--- a/third_party/rust/nom/.travis.yml
+++ /dev/null
@@ -1,101 +0,0 @@
-language: rust
-# sudo is required to enable kcov to use the personality syscall
-sudo: required
-dist: trusty
-cache: cargo
-
-rust:
-  - nightly
-  - beta
-  - stable
-  - 1.31.0
-
-env:
-  matrix:
-    - FEATURES='--features "regexp regexp_macros"'
-
-before_script:
-  - eval git pull --rebase https://github.com/Geal/nom master
-  - eval git log --pretty=oneline HEAD~5..HEAD
-
-matrix:
-  include:
-    - rust: nightly
-      env: FEATURES='--no-default-features'
-    - rust: nightly
-      env: FEATURES='--no-default-features --features "alloc"'
-    - rust: stable
-      env: FEATURES=''
-    - rust: nightly
-      env: DOC_FEATURES='--features "std lexical regexp regexp_macros" --no-default-features'
-      before_script:
-        - export PATH=$HOME/.cargo/bin:$PATH
-      script:
-        - eval cargo doc --verbose $DOC_FEATURES
-    - rust: nightly
-      env: FEATURES=''
-      before_script:
-        - export PATH=$HOME/.cargo/bin:$PATH
-        - cargo install cargo-update   || echo "cargo-update already installed"
-        - cargo install cargo-travis   || echo "cargo-travis already installed"
-        - cargo install-update -a
-        - mkdir -p target/kcov-master
-      script:
-        cargo coveralls --verbose --all-features
-  allow_failures:
-    - rust: stable
-      env: FEATURES=''
-      before_script:
-        - export PATH=$HOME/.cargo/bin:$PATH
-        - rustup component add rustfmt-preview
-      script:
-        - eval cargo fmt -- --write-mode=diff
-
-notifications:
-  webhooks:
-    urls:
-      - https://webhooks.gitter.im/e/9c035a194ac4fd4cc061
-    on_success: change
-    on_failure: always
-    on_start: false
-
-
-addons:
-  apt:
-    packages:
-      - libcurl4-openssl-dev
-      - libelf-dev
-      - libdw-dev
-      - binutils-dev
-      - cmake
-    sources:
-      - kalakris-cmake
-
-cache:
-  directories:
-    - /home/travis/.cargo
-
-before_cache:
-  - rm -rf /home/travis/.cargo/registry
-
-script:
-  - eval cargo build --verbose $FEATURES
-  - eval cargo test --verbose $FEATURES
-
-after_success: |
-  case "$TRAVIS_RUST_VERSION" in
-    nightly)
-      if [ "${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}" != "master" ]; then
-        git fetch &&
-        git checkout master &&
-        cargo bench --verbose
-      fi
-
-      if [ "$FEATURES" == '--features "regexp regexp_macros"' ]; then
-        cargo bench --verbose
-      fi
-      ;;
-
-    *)
-      ;;
-  esac
diff --git a/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl
index 2f9cf39d8127..2cac6f21d739 100644
--- a/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ar/localization/ar/toolkit/about/aboutAddons.ftl
@@ -146,12 +146,26 @@ extensions-view-available-updates =
     .name = التحديثات المتاحة
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-extension = الامتدادات
+addon-category-extension-title =
+    .title = الامتدادات
 addon-category-theme = السِمات
+addon-category-theme-title =
+    .title = السِمات
 addon-category-plugin = الملحقات
+addon-category-plugin-title =
+    .title = الملحقات
 addon-category-dictionary = القواميس
+addon-category-dictionary-title =
+    .title = القواميس
 addon-category-locale = اللغات
+addon-category-locale-title =
+    .title = اللغات
 addon-category-available-updates = التحديثات المتاحة
+addon-category-available-updates-title =
+    .title = التحديثات المتاحة
 addon-category-recent-updates = التحديثات الأخيرة
+addon-category-recent-updates-title =
+    .title = التحديثات الأخيرة
 
 ## These are global warnings
 
diff --git a/thunderbird-l10n/ar/localization/ar/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ar/localization/ar/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..0cd9bee2a675
--- /dev/null
+++ b/thunderbird-l10n/ar/localization/ar/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,16 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = فتحت نسخة أقدم من { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = أنشِئ ملفًا شخصيًا
+profiledowngrade-nosync = يمكن باستعمال النسخة الأقدم من { -brand-product-name } أن تعطب العلامات وتأريخ التصفّح المحفوظان في ملف { -brand-product-name } الموجود الآن. إن أردت حماية معلوماتك هذه فأنشِئ ملف شخصي جديد لهذه النسخة من { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] اخرج
+           *[other] أغلِق
+        }
diff --git a/thunderbird-l10n/ar/manifest.json b/thunderbird-l10n/ar/manifest.json
index 807c442f174f..03cc35186159 100644
--- a/thunderbird-l10n/ar/manifest.json
+++ b/thunderbird-l10n/ar/manifest.json
@@ -1,47 +1,50 @@
 {
+  "name": "العربية Language Pack",
   "languages": {
     "ar": {
+      "version": "20200415054235",
       "chrome_resources": {
-        "mozldap": "chrome/ar/locale/ar/mozldap/",
-        "global-platform": {
-          "linux": "chrome/ar/locale/ar/global-platform/unix/",
-          "macosx": "chrome/ar/locale/ar/global-platform/mac/",
-          "android": "chrome/ar/locale/ar/global-platform/unix/",
-          "win": "chrome/ar/locale/ar/global-platform/win/"
-        },
         "lightning": "chrome/ar/locale/ar/lightning/",
-        "autoconfig": "chrome/ar/locale/ar/autoconfig/",
-        "calendar": "chrome/ar/locale/ar/calendar/",
         "communicator": "chrome/ar/locale/ar/communicator/",
-        "chat": "chrome/ar/locale/ar/chat/",
+        "passwordmgr": "chrome/ar/locale/ar/passwordmgr/",
         "places": "chrome/ar/locale/ar/places/",
+        "messenger-region": "chrome/ar/locale/ar/messenger-region/",
+        "mozapps": "chrome/ar/locale/ar/mozapps/",
         "messenger-newsblog": "chrome/ar/locale/ar/messenger-newsblog/",
-        "pluginproblem": "chrome/ar/locale/ar/pluginproblem/",
         "branding": "chrome/ar/locale/ar/branding/",
-        "messenger-region": "chrome/ar/locale/ar/messenger-region/",
-        "global": "chrome/ar/locale/ar/global/",
-        "necko": "chrome/ar/locale/ar/necko/",
-        "pipnss": "chrome/ar/locale/ar/pipnss/",
-        "alerts": "chrome/ar/locale/ar/alerts/",
-        "devtools-startup": "chrome/ar/locale/ar/devtools/startup/",
-        "messenger": "chrome/ar/locale/ar/messenger/",
-        "messenger-smime": "chrome/ar/locale/ar/messenger-smime/",
         "messenger-mapi": "chrome/ar/locale/ar/messenger-mapi/",
-        "mozapps": "chrome/ar/locale/ar/mozapps/",
+        "alerts": "chrome/ar/locale/ar/alerts/",
+        "devtools": "chrome/ar/locale/ar/devtools/client/",
+        "global": "chrome/ar/locale/ar/global/",
+        "mozldap": "chrome/ar/locale/ar/mozldap/",
+        "autoconfig": "chrome/ar/locale/ar/autoconfig/",
+        "chat": "chrome/ar/locale/ar/chat/",
         "devtools-shared": "chrome/ar/locale/ar/devtools/shared/",
+        "messenger-smime": "chrome/ar/locale/ar/messenger-smime/",
+        "necko": "chrome/ar/locale/ar/necko/",
+        "global-platform": {
+          "linux": "chrome/ar/locale/ar/global-platform/unix/",
+          "android": "chrome/ar/locale/ar/global-platform/unix/",
+          "macosx": "chrome/ar/locale/ar/global-platform/mac/",
+          "win": "chrome/ar/locale/ar/global-platform/win/"
+        },
         "pippki": "chrome/ar/locale/ar/pippki/",
-        "devtools": "chrome/ar/locale/ar/devtools/client/",
-        "passwordmgr": "chrome/ar/locale/ar/passwordmgr/"
-      },
-      "version": "20200403073814"
+        "devtools-startup": "chrome/ar/locale/ar/devtools/startup/",
+        "pipnss": "chrome/ar/locale/ar/pipnss/",
+        "pluginproblem": "chrome/ar/locale/ar/pluginproblem/",
+        "calendar": "chrome/ar/locale/ar/calendar/",
+        "messenger": "chrome/ar/locale/ar/messenger/"
+      }
     }
   },
-  "name": "العربية Language Pack",
+  "langpack_id": "ar",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "author": "arabeyes.org (contributors: Ayman Hourieh, Khaled Hosny, Anas Husseini)",
+  "version": "76.0buildid20200420212409",
   "description": "Language pack for Thunderbird for ar",
   "manifest_version": 2,
   "applications": {
@@ -50,8 +53,5 @@
       "strict_min_version": "76.0",
       "id": "langpack-ar@thunderbird.mozilla.org"
     }
-  },
-  "author": "arabeyes.org (contributors: Ayman Hourieh, Khaled Hosny, Anas Husseini)",
-  "langpack_id": "ar",
-  "version": "76.0buildid20200407173003"
+  }
 }
diff --git a/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl
index 82ecf2bcfd33..378fa689e872 100644
--- a/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ast/localization/ast/toolkit/about/aboutAddons.ftl
@@ -135,13 +135,29 @@ extensions-view-available-updates =
     .name = Anovamientos disponibles
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Aconséyase
+addon-category-discover-title =
+    .title = Aconséyase
 addon-category-extension = Estensiones
+addon-category-extension-title =
+    .title = Estensiones
 addon-category-theme = Temes
+addon-category-theme-title =
+    .title = Temes
 addon-category-plugin = Complementos
+addon-category-plugin-title =
+    .title = Complementos
 addon-category-dictionary = Diccionarios
+addon-category-dictionary-title =
+    .title = Diccionarios
 addon-category-locale = Llingües
+addon-category-locale-title =
+    .title = Llingües
 addon-category-available-updates = Anovamientos disponibles
+addon-category-available-updates-title =
+    .title = Anovamientos disponibles
 addon-category-recent-updates = Anovamientos recientes
+addon-category-recent-updates-title =
+    .title = Anovamientos recientes
 
 ## These are global warnings
 
diff --git a/thunderbird-l10n/ast/localization/ast/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ast/localization/ast/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..6fbe8159b2db
--- /dev/null
+++ b/thunderbird-l10n/ast/localization/ast/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,3 @@
+# 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/.
diff --git a/thunderbird-l10n/ast/manifest.json b/thunderbird-l10n/ast/manifest.json
index 62233d3959f8..400c2137b508 100644
--- a/thunderbird-l10n/ast/manifest.json
+++ b/thunderbird-l10n/ast/manifest.json
@@ -1,57 +1,57 @@
 {
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-ast@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
+  "langpack_id": "ast",
+  "description": "Language pack for Thunderbird for ast",
+  "name": "Asturianu Language Pack",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
     }
   },
-  "description": "Language pack for Thunderbird for ast",
+  "version": "76.0buildid20200420212409",
   "languages": {
     "ast": {
       "chrome_resources": {
-        "devtools-startup": "chrome/ast/locale/ast/devtools/startup/",
-        "places": "chrome/ast/locale/ast/places/",
-        "passwordmgr": "chrome/ast/locale/ast/passwordmgr/",
+        "lightning": "chrome/ast/locale/ast/lightning/",
         "messenger": "chrome/ast/locale/ast/messenger/",
         "messenger-smime": "chrome/ast/locale/ast/messenger-smime/",
-        "global": "chrome/ast/locale/ast/global/",
+        "necko": "chrome/ast/locale/ast/necko/",
+        "messenger-newsblog": "chrome/ast/locale/ast/messenger-newsblog/",
+        "communicator": "chrome/ast/locale/ast/communicator/",
+        "branding": "chrome/ast/locale/ast/branding/",
+        "devtools-shared": "chrome/ast/locale/ast/devtools/shared/",
         "global-platform": {
           "linux": "chrome/ast/locale/ast/global-platform/unix/",
           "macosx": "chrome/ast/locale/ast/global-platform/mac/",
-          "win": "chrome/ast/locale/ast/global-platform/win/",
-          "android": "chrome/ast/locale/ast/global-platform/unix/"
+          "android": "chrome/ast/locale/ast/global-platform/unix/",
+          "win": "chrome/ast/locale/ast/global-platform/win/"
         },
-        "messenger-newsblog": "chrome/ast/locale/ast/messenger-newsblog/",
         "messenger-region": "chrome/ast/locale/ast/messenger-region/",
-        "pluginproblem": "chrome/ast/locale/ast/pluginproblem/",
-        "messenger-mapi": "chrome/ast/locale/ast/messenger-mapi/",
+        "places": "chrome/ast/locale/ast/places/",
+        "passwordmgr": "chrome/ast/locale/ast/passwordmgr/",
         "autoconfig": "chrome/ast/locale/ast/autoconfig/",
-        "communicator": "chrome/ast/locale/ast/communicator/",
-        "mozapps": "chrome/ast/locale/ast/mozapps/",
-        "devtools-shared": "chrome/ast/locale/ast/devtools/shared/",
+        "pipnss": "chrome/ast/locale/ast/pipnss/",
+        "messenger-mapi": "chrome/ast/locale/ast/messenger-mapi/",
+        "mozldap": "chrome/ast/locale/ast/mozldap/",
         "chat": "chrome/ast/locale/ast/chat/",
         "pippki": "chrome/ast/locale/ast/pippki/",
+        "mozapps": "chrome/ast/locale/ast/mozapps/",
+        "global": "chrome/ast/locale/ast/global/",
+        "devtools-startup": "chrome/ast/locale/ast/devtools/startup/",
+        "pluginproblem": "chrome/ast/locale/ast/pluginproblem/",
+        "devtools": "chrome/ast/locale/ast/devtools/client/",
         "alerts": "chrome/ast/locale/ast/alerts/",
-        "necko": "chrome/ast/locale/ast/necko/",
-        "branding": "chrome/ast/locale/ast/branding/",
-        "lightning": "chrome/ast/locale/ast/lightning/",
-        "pipnss": "chrome/ast/locale/ast/pipnss/",
-        "calendar": "chrome/ast/locale/ast/calendar/",
-        "mozldap": "chrome/ast/locale/ast/mozldap/",
-        "devtools": "chrome/ast/locale/ast/devtools/client/"
+        "calendar": "chrome/ast/locale/ast/calendar/"
       },
-      "version": "20200403073839"
+      "version": "20200415054300"
     }
   },
   "manifest_version": 2,
   "author": "softastur.org (contributors: Softastur)",
-  "name": "Asturianu Language Pack",
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "ast",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-ast@thunderbird.mozilla.org"
     }
   }
 }
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties
index 39107afc74a5..5d3f36b2625c 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/debugger.properties
@@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=к
 removeDirectoryRoot.label=Выдаліць каранёвы каталог
 removeDirectoryRoot.accesskey=к
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+blackBoxAll.label=Чорная скрыня
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+blackBoxAllInGroup.label=У чорную скрыню файлы гэтай групы
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+unblackBoxAllInGroup.label=З чорнай скрыні файлы гэтай групы
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+blackBoxAllOutsideGroup.label=У чорную скрыню файлы па-за гэтай групай
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+unblackBoxAllOutsideGroup.label=З чорнай скрыні файлы па-за гэтай групай
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+blackBoxAllInDir.label=У чорную скрыню файлы гэтага каталога
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+unblackBoxAllInDir.label=З чорнай скрыні файлы гэтага каталога
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+blackBoxAllOutsideDir.label=У чорную скрыню файлы па-за гэтым каталогам
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+unblackBoxAllOutsideDir.label=З чорнай скрыні файлы па-за гэтым каталогам
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Капіяваць функцыю
@@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Выдалена:
 # a JS execution
 whyPaused.interrupted=Прыпынена на выкананні
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause=Прыпынена ў час запісу
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=залішні
 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
 # service worker that is in an unknown state.
 serviceWorkerInfo.unknown=невядомы
-
-# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
-blackBoxAll.label=Blackbox
-# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected group
-blackBoxAllInGroup.label=Blackbox files in this group
-# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected group
-unblackBoxAllInGroup.label=Unblackbox files in this group
-# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected group
-blackBoxAllOutsideGroup.label=Blackbox files outside this group
-# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected group
-unblackBoxAllOutsideGroup.label=Unblackbox files outside this group
-# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected directory
-blackBoxAllInDir.label=Blackbox files in this directory
-# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected directory
-unblackBoxAllInDir.label=Unblackbox files in this directory
-# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected directory
-blackBoxAllOutsideDir.label=Blackbox files outside this directory
-# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected directory
-unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties
index a0acb3367f88..9331cf84dc5e 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Гэты элемент мае перапаў
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Няма звязаных правілаў
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Утрымлівайце Shift і клікніце, каб перайсці да правіла
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties
index ba9ec2d027ec..3bd7160d40ad 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy=Капіраваць
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll=Разгарнуць усё
 
+jsonViewer.ExpandAllSlow=Разгарнуць усе (павольна)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll=Згарнуць усе
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON=Фільтр JSON
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference=Цыклічная спасылка
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties
index aa1ed452bcb4..a049ac97105c 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/devtools/client/netmonitor.properties
@@ -351,6 +351,10 @@ netmonitor.timings.startedAt=Запушчана: %S
 # %S is time expressed in milliseconds or minutes.
 netmonitor.timings.downloadedAt=Сцягнута: %S
 
+# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
+# timings pane when thea request has been blocked
+netmonitor.timings.noTimings=У гэтым запыце няма памераў часу
+
 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
 # in the network menu specifying timing interval divisions (in milliseconds).
 networkMenu.millisecond=%S мс
@@ -761,6 +765,14 @@ netmonitor.ws.context.received=Атрыманыя
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=А
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+netmonitor.ws.context.controlFrames=Кіраванне
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey=К
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Капіяваць паведамленне
@@ -781,11 +793,6 @@ netmonitor.ws.type.sent=Дасланыя
 # accessible text for the "received" type icon in the websocket table's "data" column.
 netmonitor.ws.type.received=Атрыманыя
 
-# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the
-# time values in the websocket table's "time" column
-# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded)
-netmonitor.ws.time.format=%1$S.%2$S
-
 # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed
 # in the messages panel identifying the raw data.
 netmonitor.ws.rawData.header=Неапрацаваныя дадзеныя (%S)
@@ -1526,13 +1533,3 @@ netmonitor.cache.lastModified=Апошняе змяненне
 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
 # where a cached object was fetched from (e.g. "disk").
 netmonitor.cache.device=Прылада
-
-# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
-# timings pane when thea request has been blocked
-netmonitor.timings.noTimings=No timings for this request
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
-# on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties b/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties
index 0ec544f166b5..f561a1499a49 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      раздзяляльнік
 tabPanel     =      стужка картак
 # The roleDescription for the html:mark element
 highlight = вылучэнне
-
 # The roleDescription for the details element
-details = details
+details = падрабязнасці
 # The roleDescription for the summary element
-summary = summary
+summary = зводка
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties b/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties
index 8b06ed983b2c..2bf7d48332a8 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Табліца стыляў %1$S загружана як CSS не
 
 PEUnexpEOF2=Нечаканы канец файла падчас пошуку %1$S.
 PEParseRuleWSOnly=Дадзены толькі-прагальны радок для разбірання як правіла.
+
 PEDeclDropped=Абвяшчэнне адкінута.
 PEDeclSkipped=Прапушчана да наступнага абвяшчэння.
 PEUnknownProperty=Невядомая ўласцівасць '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Толькі адзін repeat(auto-fi
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=У спісе трэкаў дапускаецца толькі адзін repeat(auto-fill, …) або repeat(auto-fit, …).
 PEMoreThanOneGridRepeatTrackSize=Унутры repeat(auto-fit/auto-fill, …) дазволены толькі адзін памер трэка.
 
+PEDisallowedImportRule=Правілы @import яшчэ не дзейнічаюць у створаных табліцах стыляў.
+
 TooLargeDashedRadius=Радыус скруглення занадта вялікі для стылю ‘dashed’ (мяжа - 100000 пікселяў). Візуалізую як суцэльны.
 TooLargeDottedRadius=Радыус скруглення занадта вялікі для стылю ‘dotted’ (мяжа - 100000 пікселяў). Візуалізую як суцэльны.
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties b/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties
index fcba5da9e1b2..3adbceb5bee1 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/global/dom/dom.properties
@@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=Атрыбуты MathML “background”,
 MathML_DeprecatedXLinkAttributeWarning=XLink-атрыбуты “href”, “type”, “show” and “actuate” на элементах MathML састарэлі і будуць выдалены ў будучыні.
 WebShareAPI_Failed=Абагуленне не ўдалося.
 WebShareAPI_Aborted=Абагуленне было спынена.
-
 # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
-UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol.
+UnknownProtocolNavigationPrevented=Пераход да “%1$S” не дазволены з-за нявызначанага пратакола.
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties b/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties
index 46669e8a5aff..c9907fa080bf 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/global/security/security.properties
@@ -147,13 +147,16 @@ XFODeny = Загрузка забаронена праз X-Frame-Options: “%1$
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Загрузка забаронена праз X-Frame-Options: “%1$S” з “%2$S”, сайт не дазваляе cross-origin фрэймінг з “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Знойдзены нядзейсны загаловак X-Frame-Options у час чытання “%2$S”: “%1$S” не ёсць дзейснай дырэктываю.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Загрузка “%2$S” ў кадры адмоўлена дырэктываю “X-Frame-Options“, усталяванай у “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Абнаўляецца не бяспечны запыт “%1$S” для выкарыстання “%2$S”.
 # LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgrade = Запыт для “%1$S” не быў абноўлены, бо ён мае сцяг NoUpgrade.
-
-# LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt.
+HTTPSOnlyNoUpgradeException = Не абнаўляецца не бяспечны запыт “%1$S”, паколькі ён вызвалены.
 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code.
-HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S)
+HTTPSOnlyFailedRequest = Абнаўленне не бяспечнага запыту “%1$S” не ўдалося. (“%2$S”)
diff --git a/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties b/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties
index 8886b4605cda..7b2d9a1f01fd 100644
--- a/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties
+++ b/thunderbird-l10n/be/chrome/be/locale/be/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Доступ да сховішча а
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Доступ да сховішча аўтаматычна дадзены трэкеру “%2$S” на “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Доступ да сховішча аўтаматычна дадзены для асноўнай ізаляцыі “%2$S” на “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Кукі “%1$S” адхілены, таму што яны маюць атрыбут “sameSite=none”, але адсутнічае атрыбут “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
@@ -67,8 +70,7 @@ CookieLaxForced=Кукі “%1$S” маюць палітыку “sameSite” 
 CookieLaxForcedForBeta=Кукі “%1$S” не маюць належнага значэння атрыбута “sameSite”. Хутка кукі без атрыбута “sameSite” або з недапушчальным яго значэннем будуць трактавацца як “lax”. Гэта азначае, што гэтыя кукі больш не будуць дасылацца ў кантэкстах трэцяга боку. Калі ваша праграма залежыць ад даступнасці кукаў у гэтых кантэкстах, дадайце да іх атрыбут “sameSite=none“. Каб даведацца больш пра атрыбут “sameSite“, прачытайце %2$S
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid=Недапушчальнае значэнне “sameSite“ для кукі “%1$S”. Падтрымліваюцца значэнні: “lax“, “strict“, “none“.
-
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
+CookieOversize=Кука “%1$S” нядзейсная, бо яе памер надта вялікі. Максімальны памер %2$S Б.
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize=Кука “%1$S” нядзейсная, бо памер яе шляху надта вялікі. Максімальны памер %2$S Б.
diff --git a/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl
index 3ebbffcbd6fc..b3fa815f9bb3 100644
--- a/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/be/localization/be/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Падключаны браўзер м
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = Панэль адладчыка не можа працаваць з падлучаным браўзерам. Калі ласка, выкарыстоўвайце Firefox { $runtimeVersion }, калі вам трэба выкарыстоўваць адладчык з гэтым браўзерам.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Гэта версія Firefox не можа адладзіць Firefox для Android (68). Рэкамендуем усталяваць Firefox для Android Nightly на ваш тэлефон для тэставання. <a>Падрабязней</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl
index daa8d3cb7dc8..35e0530e14e7 100644
--- a/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/be/localization/be/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Усталяваць дадатак з файла…
     .accesskey = У
 help-button = Падтрымка дадаткаў
+sidebar-help-button-title =
+    .title = Падтрымка дадаткаў
 preferences =
     { PLATFORM() ->
         [windows] Налады { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Прылады для ўсіх дадаткаў
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Налады { -brand-short-name }
+           *[other] Параметры { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Некаторыя пашырэнні не могуць быць правераны
 show-all-extensions-button =
@@ -170,13 +178,29 @@ extensions-view-available-updates =
     .name = Даступныя абнаўленні
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Рэкамендацыі
+addon-category-discover-title =
+    .title = Рэкамендацыі
 addon-category-extension = Пашырэнні
+addon-category-extension-title =
+    .title = Пашырэнні
 addon-category-theme = Тэмы
+addon-category-theme-title =
+    .title = Тэмы
 addon-category-plugin = Плагіны
+addon-category-plugin-title =
+    .title = Плагіны
 addon-category-dictionary = Слоўнікі
+addon-category-dictionary-title =
+    .title = Слоўнікі
 addon-category-locale = Мовы
+addon-category-locale-title =
+    .title = Мовы
 addon-category-available-updates = Даступныя абнаўленні
+addon-category-available-updates-title =
+    .title = Даступныя абнаўленні
 addon-category-recent-updates = Нядаўнія абнаўленні
+addon-category-recent-updates-title =
+    .title = Нядаўнія абнаўленні
 
 ## These are global warnings
 
@@ -289,6 +313,7 @@ shortcuts-no-commands = Наступныя пашырэнні не маюць с
 shortcuts-input =
     .placeholder = Увядзіце спалучэнне клавіш
 shortcuts-browserAction = Актываваць пашырэнне
+shortcuts-browserAction2 = Актываваць кнопку на паліцы прылад
 shortcuts-pageAction = Актываваць дзеянні старонкі
 shortcuts-sidebarAction = Паказаць/схаваць бакавую панэль
 shortcuts-modifier-mac = Улучыце Ctrl, Alt або ⌘
@@ -315,6 +340,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Паказаць менш
 go-back-button =
     .tooltiptext = Вярнуцца
+header-back-button =
+    .title = Вярнуцца
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl
index e07f6c71a2cb..791d1a077c06 100644
--- a/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/be/localization/be/toolkit/about/aboutSupport.ftl
@@ -295,6 +295,11 @@ sandbox-proc-type-content = змесціва
 sandbox-proc-type-file = змесціва файла
 sandbox-proc-type-media-plugin = медыяплагін
 sandbox-proc-type-data-decoder = дэкодар даных
+startup-cache-title = Кэш запуску
+startup-cache-disk-cache-path = Шлях да дыскавага кэшу
+startup-cache-ignore-disk-cache = Ігнараваць дыскавы кэш
+startup-cache-found-disk-cache-on-init = Знойдзены дыскавы кэш пры ініцыялізацыі
+startup-cache-wrote-to-disk-cache = Запісаны ў дыскавы кэш
 launcher-process-status-0 = Уключана
 launcher-process-status-1 = Адключана з-за збою
 launcher-process-status-2 = Прымусова адключана
@@ -318,6 +323,7 @@ touch-enabled = пальцавы увод ўключаны
 drag-enabled = захоп стужкі прагорткі ўключаны
 keyboard-enabled = клавіятура ўключана
 autoscroll-enabled = аўтапракрутка ўключана
+zooming-enabled = уключана плаўнае маштабаванне жэстам
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl b/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl
index ef7f5806d433..11c0a0a1c397 100644
--- a/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/be/localization/be/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Група абмену ключамі
 certificate-viewer-key-id = Ідэнтыфікатар ключа
 certificate-viewer-key-size = Памер ключа
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Месцазнаходжанне
 certificate-viewer-locality = Месцазнаходжанне
 certificate-viewer-location = Размяшчэнне
 certificate-viewer-logid = Ідэнтыфікатар журнала
@@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (сертыфікат)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (ланцужок)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Гэта пашырэнне пазначана як крытычнае, гэта значыць, што кліенты павінны адхіліць сертыфікат, калі не разумеюць яго.
+certificate-viewer-export = Экспарт
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Вашы сертыфікаты
+certificate-viewer-tab-people = Асобы
+certificate-viewer-tab-servers = Серверы
+certificate-viewer-tab-ca = Установы
+certificate-viewer-tab-unkonwn = Невядома
diff --git a/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl b/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl
index 7fb588d8a220..4494bb611cde 100644
--- a/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/be/localization/be/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Ізаляванае сеціўнае змесців
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Сокет
diff --git a/thunderbird-l10n/be/localization/be/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/be/localization/be/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..57a77d7e42c8
--- /dev/null
+++ b/thunderbird-l10n/be/localization/be/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Вы запусцілі старую версію { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Стварыць новы профіль
+profiledowngrade-sync = Выкарыстанне старой версіі { -brand-product-name } можа пашкодзіць закладкі і гісторыю аглядання, ужо захаваныя ў наяўным профілі { -brand-product-name }. Каб абараніць свае звесткі, стварыце новы профіль для гэтай усталёўкі { -brand-short-name }. Вы заўсёды можаце ўвайсці ў { -fxaccount-brand-name }, каб сінхранізаваць паміж профілямі свае закладкі і гісторыю аглядання.
+profiledowngrade-nosync = Выкарыстанне старой версіі { -brand-product-name } можа пашкодзіць закладкі і гісторыю аглядання, ужо захаваныя ў наяўным профілі { -brand-product-name }. Каб абараніць свае звесткі, стварыце новы профіль для гэтай усталёўкі { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Выйсці
+           *[other] Выйсці
+        }
diff --git a/thunderbird-l10n/be/manifest.json b/thunderbird-l10n/be/manifest.json
index 4da53193e4a7..dc6dc3154710 100644
--- a/thunderbird-l10n/be/manifest.json
+++ b/thunderbird-l10n/be/manifest.json
@@ -1,11 +1,4 @@
 {
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "version": "76.0buildid20200407173003",
-  "description": "Language pack for Thunderbird for be",
   "applications": {
     "gecko": {
       "strict_max_version": "76.*",
@@ -13,45 +6,52 @@
       "strict_min_version": "76.0"
     }
   },
-  "author": "mozilla.org (contributors: mozilla by)",
-  "name": "Беларуская Language Pack",
   "languages": {
     "be": {
+      "version": "20200419181427",
       "chrome_resources": {
-        "places": "chrome/be/locale/be/places/",
-        "devtools-startup": "chrome/be/locale/be/devtools/startup/",
-        "devtools": "chrome/be/locale/be/devtools/client/",
+        "lightning": "chrome/be/locale/be/lightning/",
+        "global": "chrome/be/locale/be/global/",
         "messenger-smime": "chrome/be/locale/be/messenger-smime/",
-        "messenger": "chrome/be/locale/be/messenger/",
-        "pippki": "chrome/be/locale/be/pippki/",
+        "calendar": "chrome/be/locale/be/calendar/",
+        "passwordmgr": "chrome/be/locale/be/passwordmgr/",
+        "necko": "chrome/be/locale/be/necko/",
+        "pluginproblem": "chrome/be/locale/be/pluginproblem/",
         "pipnss": "chrome/be/locale/be/pipnss/",
-        "lightning": "chrome/be/locale/be/lightning/",
-        "messenger-region": "chrome/be/locale/be/messenger-region/",
+        "mozapps": "chrome/be/locale/be/mozapps/",
         "chat": "chrome/be/locale/be/chat/",
         "branding": "chrome/be/locale/be/branding/",
-        "mozldap": "chrome/be/locale/be/mozldap/",
+        "messenger-mapi": "chrome/be/locale/be/messenger-mapi/",
+        "places": "chrome/be/locale/be/places/",
+        "pippki": "chrome/be/locale/be/pippki/",
+        "communicator": "chrome/be/locale/be/communicator/",
+        "devtools-startup": "chrome/be/locale/be/devtools/startup/",
         "alerts": "chrome/be/locale/be/alerts/",
-        "devtools-shared": "chrome/be/locale/be/devtools/shared/",
-        "necko": "chrome/be/locale/be/necko/",
-        "global": "chrome/be/locale/be/global/",
+        "devtools": "chrome/be/locale/be/devtools/client/",
+        "messenger-region": "chrome/be/locale/be/messenger-region/",
         "global-platform": {
-          "win": "chrome/be/locale/be/global-platform/win/",
-          "android": "chrome/be/locale/be/global-platform/unix/",
+          "macosx": "chrome/be/locale/be/global-platform/mac/",
           "linux": "chrome/be/locale/be/global-platform/unix/",
-          "macosx": "chrome/be/locale/be/global-platform/mac/"
+          "win": "chrome/be/locale/be/global-platform/win/",
+          "android": "chrome/be/locale/be/global-platform/unix/"
         },
-        "mozapps": "chrome/be/locale/be/mozapps/",
-        "communicator": "chrome/be/locale/be/communicator/",
         "autoconfig": "chrome/be/locale/be/autoconfig/",
-        "messenger-mapi": "chrome/be/locale/be/messenger-mapi/",
-        "pluginproblem": "chrome/be/locale/be/pluginproblem/",
-        "calendar": "chrome/be/locale/be/calendar/",
-        "passwordmgr": "chrome/be/locale/be/passwordmgr/",
-        "messenger-newsblog": "chrome/be/locale/be/messenger-newsblog/"
-      },
-      "version": "20200403073904"
+        "messenger-newsblog": "chrome/be/locale/be/messenger-newsblog/",
+        "mozldap": "chrome/be/locale/be/mozldap/",
+        "devtools-shared": "chrome/be/locale/be/devtools/shared/",
+        "messenger": "chrome/be/locale/be/messenger/"
+      }
+    }
+  },
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
     }
   },
+  "name": "Беларуская Language Pack",
+  "description": "Language pack for Thunderbird for be",
   "manifest_version": 2,
-  "langpack_id": "be"
+  "author": "mozilla.org (contributors: mozilla by)",
+  "langpack_id": "be",
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl
index b21a44994032..329dac9afd01 100644
--- a/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/bg/localization/bg/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Инсталиране на добавка от файл…
     .accesskey = И
 help-button = Поддръжка
+sidebar-help-button-title =
+    .title = Поддръжка
 preferences =
     { PLATFORM() ->
         [windows] Настройки на { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Инструменти за всички добавки
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Настройки на { -brand-short-name }
+           *[other] Настройки на { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Някои разширения не можаха да бъдат проверени
 show-all-extensions-button =
@@ -163,13 +171,29 @@ extensions-view-available-updates =
     .name = Налични обновявания
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Препоръки
+addon-category-discover-title =
+    .title = Препоръки
 addon-category-extension = Разширения
+addon-category-extension-title =
+    .title = Разширения
 addon-category-theme = Теми
+addon-category-theme-title =
+    .title = Теми
 addon-category-plugin = Приставки
+addon-category-plugin-title =
+    .title = Приставки
 addon-category-dictionary = Речници
+addon-category-dictionary-title =
+    .title = Речници
 addon-category-locale = Езици
+addon-category-locale-title =
+    .title = Езици
 addon-category-available-updates = Налични обновявания
+addon-category-available-updates-title =
+    .title = Налични обновявания
 addon-category-recent-updates = Скорошни обновявания
+addon-category-recent-updates-title =
+    .title = Скорошни обновявания
 
 ## These are global warnings
 
@@ -301,6 +325,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = По-малко
 go-back-button =
     .tooltiptext = Назад
+header-back-button =
+    .title = Назад
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/bg/localization/bg/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/bg/localization/bg/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..c107f2a0130a
--- /dev/null
+++ b/thunderbird-l10n/bg/localization/bg/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,15 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Отворихте по-стара версия на { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Създаване на профил
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Изход
+           *[other] Изход
+        }
diff --git a/thunderbird-l10n/bg/manifest.json b/thunderbird-l10n/bg/manifest.json
index 137a8a6c0a77..71916bb49faf 100644
--- a/thunderbird-l10n/bg/manifest.json
+++ b/thunderbird-l10n/bg/manifest.json
@@ -1,53 +1,53 @@
 {
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "bg",
-  "manifest_version": 2,
-  "name": "Български Language Pack",
   "description": "Language pack for Thunderbird for bg",
   "languages": {
     "bg": {
-      "version": "20200403073916",
       "chrome_resources": {
-        "messenger": "chrome/bg/locale/bg/messenger/",
-        "lightning": "chrome/bg/locale/bg/lightning/",
+        "devtools-shared": "chrome/bg/locale/bg/devtools/shared/",
         "devtools": "chrome/bg/locale/bg/devtools/client/",
-        "calendar": "chrome/bg/locale/bg/calendar/",
-        "autoconfig": "chrome/bg/locale/bg/autoconfig/",
-        "messenger-newsblog": "chrome/bg/locale/bg/messenger-newsblog/",
-        "pipnss": "chrome/bg/locale/bg/pipnss/",
-        "passwordmgr": "chrome/bg/locale/bg/passwordmgr/",
+        "messenger": "chrome/bg/locale/bg/messenger/",
+        "messenger-mapi": "chrome/bg/locale/bg/messenger-mapi/",
         "alerts": "chrome/bg/locale/bg/alerts/",
-        "places": "chrome/bg/locale/bg/places/",
+        "messenger-smime": "chrome/bg/locale/bg/messenger-smime/",
+        "pipnss": "chrome/bg/locale/bg/pipnss/",
+        "necko": "chrome/bg/locale/bg/necko/",
+        "mozldap": "chrome/bg/locale/bg/mozldap/",
         "devtools-startup": "chrome/bg/locale/bg/devtools/startup/",
+        "pippki": "chrome/bg/locale/bg/pippki/",
+        "lightning": "chrome/bg/locale/bg/lightning/",
         "messenger-region": "chrome/bg/locale/bg/messenger-region/",
-        "messenger-smime": "chrome/bg/locale/bg/messenger-smime/",
         "mozapps": "chrome/bg/locale/bg/mozapps/",
         "branding": "chrome/bg/locale/bg/branding/",
         "chat": "chrome/bg/locale/bg/chat/",
-        "global": "chrome/bg/locale/bg/global/",
         "global-platform": {
+          "linux": "chrome/bg/locale/bg/global-platform/unix/",
           "win": "chrome/bg/locale/bg/global-platform/win/",
-          "android": "chrome/bg/locale/bg/global-platform/unix/",
           "macosx": "chrome/bg/locale/bg/global-platform/mac/",
-          "linux": "chrome/bg/locale/bg/global-platform/unix/"
+          "android": "chrome/bg/locale/bg/global-platform/unix/"
         },
-        "communicator": "chrome/bg/locale/bg/communicator/",
         "pluginproblem": "chrome/bg/locale/bg/pluginproblem/",
-        "devtools-shared": "chrome/bg/locale/bg/devtools/shared/",
-        "pippki": "chrome/bg/locale/bg/pippki/",
-        "mozldap": "chrome/bg/locale/bg/mozldap/",
-        "necko": "chrome/bg/locale/bg/necko/",
-        "messenger-mapi": "chrome/bg/locale/bg/messenger-mapi/"
-      }
+        "places": "chrome/bg/locale/bg/places/",
+        "calendar": "chrome/bg/locale/bg/calendar/",
+        "autoconfig": "chrome/bg/locale/bg/autoconfig/",
+        "global": "chrome/bg/locale/bg/global/",
+        "passwordmgr": "chrome/bg/locale/bg/passwordmgr/",
+        "messenger-newsblog": "chrome/bg/locale/bg/messenger-newsblog/",
+        "communicator": "chrome/bg/locale/bg/communicator/"
+      },
+      "version": "20200415054336"
     }
   },
+  "manifest_version": 2,
+  "name": "Български Language Pack",
+  "langpack_id": "bg",
   "applications": {
     "gecko": {
-      "id": "langpack-bg@thunderbird.mozilla.org",
+      "strict_max_version": "76.*",
       "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
+      "id": "langpack-bg@thunderbird.mozilla.org"
     }
   },
+  "version": "76.0buildid20200420212409",
   "sources": {
     "browser": {
       "base_path": "browser/"
diff --git a/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties b/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties
index 6faf5042556e..57d346c7e0d0 100644
--- a/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties
+++ b/thunderbird-l10n/br/chrome/br/locale/br/global/layout_errors.properties
@@ -39,10 +39,20 @@ CompositorAnimationWarningTransformFrameInactive=N'hall ket ar bliverezh bezañ
 CompositorAnimationWarningOpacityFrameInactive=N'hall ket ar bliverezh bezañ erounezet war ar c'henaozer dre ma n'eo ket bet merket gweredekaet ar framm evit ar bliverezh 'opacity'
 CompositorAnimationWarningHasRenderingObserver=N'haller ket erounit ar bliverezh war ar c'henaozer dre ma zo evezhieroù deoueziñ gant an elfenn (-moz-element pe dic'hronnañ/masklañ)
 
+## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0"
+ZoomPropertyWarning=Ar bajenn-mañ a implij un doare "zoom" divoutin. Klaskit implijout calc() evit an talvoudoù a-bouez pe implijit “transform” gant “transform-origin: 0 0”.
+
+## LOCALIZATION NOTE(PrincipalWritingModePropagationWarning):
+## Do not translate <html>, <body>, CSS, "writing-mode", "direction", "text-orientation", :root, and "The Principal Writing Mode" because they are technical terms.
+
+## LOCALIZATION NOTE(ScrollAnchoringDisabledInContainer):
+## %1$S is an integer value with the total number of adjustments
+## %2$S is a floating point value with the average distance adjusted
+## %3$S is a floating point value with the total adjusted distance
+
+
 CompositorAnimationWarningTransformIsBlockedByImportantRules=Transform animation cannot be run on the compositor because transform-related properties are overridden by !important rules
 CompositorAnimationWarningHasCurrentColor=Animations of ‘background-color’ cannot be run on the compositor with ‘current-color’ keyframe.
-## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0"
-ZoomPropertyWarning=This page uses the non standard property “zoom”. Consider using calc() in the relevant property values, or using “transform” along with “transform-origin: 0 0”.
 ## LOCALIZATION NOTE(PrincipalWritingModePropagationWarning):
 ## Do not translate <html>, <body>, CSS, "writing-mode", "direction", "text-orientation", :root, and "The Principal Writing Mode" because they are technical terms.
 PrincipalWritingModePropagationWarning=When rendering the <html> element, the used values of CSS properties “writing-mode”, “direction”, and “text-orientation” on the <html> element are taken from the computed values of the <body> element, not from the <html> element’s own values. Consider setting these properties on the :root CSS pseudo-class. For more information see “The Principal Writing Mode” in https://www.w3.org/TR/css-writing-modes-3/#principal-flow
diff --git a/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl
index 9e9a05105c45..20ff006acfbf 100644
--- a/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/br/localization/br/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Staliañ askouezhioù diouzh ar restr...
     .accesskey = i
 help-button = Skor an askouezhioù
+sidebar-help-button-title =
+    .title = Skor an askouezhioù
 preferences =
     { PLATFORM() ->
         [windows] Dibarzhioù { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Ostilhoù evit an holl askouezhioù
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Dibarzhioù { -brand-short-name }
+           *[other] Gwellvezioù { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = N'haller ket gwiriekaat lod eus an askouezhioù
 show-all-extensions-button =
@@ -163,13 +171,29 @@ extensions-view-available-updates =
     .name = Hizivadurioù hegerz
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Erbedadennoù
+addon-category-discover-title =
+    .title = Erbedadennoù
 addon-category-extension = Askouezhioù
+addon-category-extension-title =
+    .title = Askouezhioù
 addon-category-theme = Neuzioù
+addon-category-theme-title =
+    .title = Neuzioù
 addon-category-plugin = Enlugelladoù
+addon-category-plugin-title =
+    .title = Enlugelladoù
 addon-category-dictionary = Geriadurioù
+addon-category-dictionary-title =
+    .title = Geriadurioù
 addon-category-locale = Yezhoù
+addon-category-locale-title =
+    .title = Yezhoù
 addon-category-available-updates = Hizivadurioù hegerz
+addon-category-available-updates-title =
+    .title = Hizivadurioù hegerz
 addon-category-recent-updates = Hizivadurioù nevesañ
+addon-category-recent-updates-title =
+    .title = Hizivadurioù nevesañ
 
 ## These are global warnings
 
@@ -304,6 +328,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Diskouez nebeutoc'h
 go-back-button =
     .tooltiptext = Distreiñ
+header-back-button =
+    .title = Distreiñ
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl b/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl
index b7807c06126c..3ebc57631a20 100644
--- a/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/br/localization/br/toolkit/about/certviewer.ftl
@@ -43,6 +43,7 @@ certificate-viewer-sha-1 = SHA-1
 certificate-viewer-sha-256 = SHA-256
 certificate-viewer-serial-number = Niverenn steudad
 certificate-viewer-signature-algorithm = Algoritm sinañ
+certificate-viewer-timestamp = Merk amzer
 certificate-viewer-value = Talvoudegezh
 certificate-viewer-version = Handelv
 certificate-viewer-business-category = Rummad business
@@ -52,7 +53,12 @@ certificate-viewer-public-key-info = Titouroù an alc'hwez foran
 certificate-viewer-miscellaneous = A bep seurt
 certificate-viewer-fingerprints = Roudoù biz
 certificate-viewer-basic-constraints = Rediennoù diazez
+certificate-viewer-key-usages = Implijoù an alc'hwez
+certificate-viewer-extended-key-usages = Implijoù astennet an alc'hwez
+certificate-viewer-authority-key-id = ID alc'hwez an aotrouniezh
+certificate-viewer-authority-info-aia = Titouroù diwar-benn an aotrouniezh (AIA)
 certificate-viewer-certificate-policies = Politikerezhioù an testeni
+certificate-viewer-embedded-scts = SCTs ebarzhet
 # This message is used as a row header in the Miscellaneous section. 
 # The associated data cell contains links to download the certificate.
 certificate-viewer-download = Pellgargañ
@@ -68,3 +74,15 @@ certificate-viewer-boolean =
 ## Variables:
 ##   $fileName (String) - The file name to save the PEM data in, derived from the common name from the certificate being displayed.
 
+certificate-viewer-download-pem-chain = PEM (chadenn)
+    .download = { $fileName }-chain.pem
+certificate-viewer-export = Ezporzhiañ
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Ho testenioù
+certificate-viewer-tab-people = Tud
+certificate-viewer-tab-servers = Servijerioù
+certificate-viewer-tab-ca = Aotrouniezhoù
+certificate-viewer-tab-unkonwn = Dianav
diff --git a/thunderbird-l10n/br/localization/br/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/br/localization/br/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..243861945650
--- /dev/null
+++ b/thunderbird-l10n/br/localization/br/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Lañset ho peus un handelv kozh eus { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Krouiñ un aelad nevez
+profiledowngrade-sync = Arverañ un handelv koshoc'h eus { -brand-product-name } a c'hall kontroniñ ho sinedoù hag ho roll istor enrollet en un aelad { -brand-product-name } a zo dioutañ endeo. Evit gwareziñ ho titouroù, krouit un aelad nevez evit ar staliadur-mañ eus { -brand-short-name }. Gallout a rit atav kennaskañ gant ur { -fxaccount-brand-name } evit goubredañ ho sinedoù hag ho roll istor etre aeladoù.
+profiledowngrade-nosync = Ober gant un handelv kozh eus { -brand-product-name } a c'hall kontroniñ ar sinedoù  hag ar roll istor enrollet e-barzh un aelad { -brand-product-name } a zo anezhañ endeo. Evit gwareziñ ho titouroù, krouit un aelad nevez evit ar staliadur-mañ eus { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Kuitaat
+           *[other] Kuitaat
+        }
diff --git a/thunderbird-l10n/br/manifest.json b/thunderbird-l10n/br/manifest.json
index 27dddef68277..221336a0d78a 100644
--- a/thunderbird-l10n/br/manifest.json
+++ b/thunderbird-l10n/br/manifest.json
@@ -1,57 +1,57 @@
 {
+  "name": "Breton Language Pack",
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "id": "langpack-br@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
+    }
+  },
   "description": "Language pack for Thunderbird for br",
+  "author": "Thunderbird Breton Team (contributors: Alan Monfort, Philippe Basciano-Le Gall, Denis Arnaud, Michel Nédélec)",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "langpack_id": "br",
   "languages": {
     "br": {
-      "version": "20200403074016",
       "chrome_resources": {
-        "messenger-smime": "chrome/br/locale/br/messenger-smime/",
-        "branding": "chrome/br/locale/br/branding/",
-        "communicator": "chrome/br/locale/br/communicator/",
-        "places": "chrome/br/locale/br/places/",
-        "alerts": "chrome/br/locale/br/alerts/",
-        "devtools": "chrome/br/locale/br/devtools/client/",
-        "devtools-shared": "chrome/br/locale/br/devtools/shared/",
-        "messenger": "chrome/br/locale/br/messenger/",
-        "pippki": "chrome/br/locale/br/pippki/",
-        "mozldap": "chrome/br/locale/br/mozldap/",
-        "messenger-mapi": "chrome/br/locale/br/messenger-mapi/",
-        "messenger-newsblog": "chrome/br/locale/br/messenger-newsblog/",
-        "mozapps": "chrome/br/locale/br/mozapps/",
-        "devtools-startup": "chrome/br/locale/br/devtools/startup/",
-        "pluginproblem": "chrome/br/locale/br/pluginproblem/",
-        "necko": "chrome/br/locale/br/necko/",
-        "calendar": "chrome/br/locale/br/calendar/",
-        "global": "chrome/br/locale/br/global/",
-        "lightning": "chrome/br/locale/br/lightning/",
         "global-platform": {
-          "linux": "chrome/br/locale/br/global-platform/unix/",
           "macosx": "chrome/br/locale/br/global-platform/mac/",
           "android": "chrome/br/locale/br/global-platform/unix/",
+          "linux": "chrome/br/locale/br/global-platform/unix/",
           "win": "chrome/br/locale/br/global-platform/win/"
         },
-        "passwordmgr": "chrome/br/locale/br/passwordmgr/",
+        "global": "chrome/br/locale/br/global/",
+        "devtools-shared": "chrome/br/locale/br/devtools/shared/",
         "chat": "chrome/br/locale/br/chat/",
+        "messenger-smime": "chrome/br/locale/br/messenger-smime/",
+        "devtools": "chrome/br/locale/br/devtools/client/",
+        "pipnss": "chrome/br/locale/br/pipnss/",
+        "communicator": "chrome/br/locale/br/communicator/",
+        "messenger-mapi": "chrome/br/locale/br/messenger-mapi/",
+        "pippki": "chrome/br/locale/br/pippki/",
+        "messenger": "chrome/br/locale/br/messenger/",
         "messenger-region": "chrome/br/locale/br/messenger-region/",
+        "necko": "chrome/br/locale/br/necko/",
+        "pluginproblem": "chrome/br/locale/br/pluginproblem/",
+        "lightning": "chrome/br/locale/br/lightning/",
+        "calendar": "chrome/br/locale/br/calendar/",
+        "alerts": "chrome/br/locale/br/alerts/",
+        "messenger-newsblog": "chrome/br/locale/br/messenger-newsblog/",
+        "mozapps": "chrome/br/locale/br/mozapps/",
+        "devtools-startup": "chrome/br/locale/br/devtools/startup/",
+        "passwordmgr": "chrome/br/locale/br/passwordmgr/",
         "autoconfig": "chrome/br/locale/br/autoconfig/",
-        "pipnss": "chrome/br/locale/br/pipnss/"
-      }
-    }
-  },
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-br@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
+        "mozldap": "chrome/br/locale/br/mozldap/",
+        "places": "chrome/br/locale/br/places/",
+        "branding": "chrome/br/locale/br/branding/"
+      },
+      "version": "20200416164416"
     }
   },
-  "version": "76.0buildid20200407173003",
-  "author": "Thunderbird Breton Team (contributors: Alan Monfort, Philippe Basciano-Le Gall, Denis Arnaud, Michel Nédélec)",
-  "name": "Breton Language Pack",
-  "manifest_version": 2
+  "manifest_version": 2,
+  "langpack_id": "br",
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties b/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties
index 4cb0f354fb9d..9a2f4aec9bb1 100644
--- a/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties
+++ b/thunderbird-l10n/ca/chrome/ca/locale/ca/messenger/messengercompose/composeMsgs.properties
@@ -327,7 +327,7 @@ learnMore.accesskey=M
 # LOCALIZATION NOTE (bigFileDescription): Semi-colon list of plural forms.
 # See: https://developer.mozilla.org/en/Localization_and_Plurals
 # #1 number of big attached files
-bigFileDescription=És un fitxer gran. Podria ser millor que empréssiu el Filelink.;Són fitxers grans. Podria ser millor que empréssiu el Filelink.
+bigFileDescription=És un fitxer gran. Podria ser millor utilitzar el Filelink.;Són fitxers grans. Podria ser millor utilitzar el Filelink.
 bigFileShare.label=Enllaça
 bigFileShare.accesskey=l
 bigFileAttach.label=Ignora
@@ -350,7 +350,7 @@ cloudFileUploadedTooltip=S'ha pujat a %S
 cloudFileUploadingNotification=S'està enllaçant el fitxer. Apareixerà en el cos del missatge en acabar.;S'estan enllaçant els fitxers. Apareixeran en el cos del missatge en acabar.
 cloudFileUploadingCancel.label=Cancel·la
 cloudFileUploadingCancel.accesskey=C
-cloudFilePrivacyNotification=S'ha completat l'enllaçament. Tingueu en compte que les adjuncions enllaçades poden ser accessibles a aquells que poden veure o endevinar els enllaços.
+cloudFilePrivacyNotification=S'ha enllaçat correctament. Tingueu en compte que els fitxers adjunts enllaçats poden ser accessibles per tothom qui pugui veure o endevinar els enllaços.
 
 ## LOCALIZATION NOTE(smtpEnterPasswordPrompt): Do not translate the
 ## word %S. Place the word %S where the host name should appear.
@@ -446,7 +446,7 @@ cloudAttachmentCountHeader=He enllaçat #1 fitxer al missatge:;He enllaçat #1 f
 
 ## LOCALIZATION NOTE(cloudAttachmentListFooter): %1$S is a link, whose text
 ## contents are the brandFullName of this application.
-cloudAttachmentListFooter=El %1$S facilita compartir fitxers grans amb el correu electrònic.
+cloudAttachmentListFooter=El %1$S facilita compartir fitxers grans per correu electrònic.
 
 ## LOCALIZATION NOTE(cloudAttachmentListItem): A line of text describing a cloud
 ## attachment to be inserted into the message body. Do not translate the words
diff --git a/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl
index b8615bf8881c..0b0d7820d788 100644
--- a/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ca/localization/ca/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instal·la un complement des d'un fitxer…
     .accesskey = I
 help-button = Assistència per als complements
+sidebar-help-button-title =
+    .title = Assistència per als complements
 preferences =
     { PLATFORM() ->
         [windows] Opcions del { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Eines per a tots els complements
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opcions del { -brand-short-name }
+           *[other] Preferències del { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = No s'han pogut verificar algunes extensions
 show-all-extensions-button =
@@ -165,13 +173,29 @@ extensions-view-available-updates =
     .name = Actualitzacions disponibles
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recomanacions
+addon-category-discover-title =
+    .title = Recomanacions
 addon-category-extension = Extensions
+addon-category-extension-title =
+    .title = Extensions
 addon-category-theme = Temes
+addon-category-theme-title =
+    .title = Temes
 addon-category-plugin = Connectors
+addon-category-plugin-title =
+    .title = Connectors
 addon-category-dictionary = Diccionaris
+addon-category-dictionary-title =
+    .title = Diccionaris
 addon-category-locale = Llengües
+addon-category-locale-title =
+    .title = Llengües
 addon-category-available-updates = Actualitzacions disponibles
+addon-category-available-updates-title =
+    .title = Actualitzacions disponibles
 addon-category-recent-updates = Actualitzacions recents
+addon-category-recent-updates-title =
+    .title = Actualitzacions recents
 
 ## These are global warnings
 
@@ -309,6 +333,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mostra'n menys
 go-back-button =
     .tooltiptext = Vés enrere
+header-back-button =
+    .title = Vés enrere
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/ca/localization/ca/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ca/localization/ca/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..2c3326661b7c
--- /dev/null
+++ b/thunderbird-l10n/ca/localization/ca/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Heu iniciat una versió antiga del { -brand-product-name }.
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Crea un perfil nou
+profiledowngrade-sync = L'ús d'una versió antiga del { -brand-product-name } pot malmetre les adreces d'interès i l'historial de navegació que ja estiguin desats en un perfil del { -brand-product-name } existent. Per protegir la vostra informació, creeu un perfil nou per a aquesta instal·lació del { -brand-short-name }. Sempre podeu iniciar la sessió amb un { -fxaccount-brand-name } per sincronitzar les adreces d'interès i l'historial de navegació entre perfils.
+profiledowngrade-nosync = L'ús d'una versió antiga del { -brand-product-name } pot malmetre les adreces d'interès i l'historial de navegació que ja estiguin desats en un perfil del { -brand-product-name } existent. Per protegir la vostra informació, creeu un perfil nou per a aquesta instal·lació del { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Surt
+           *[other] Surt
+        }
diff --git a/thunderbird-l10n/ca/manifest.json b/thunderbird-l10n/ca/manifest.json
index 10d85f0f1302..fdfa00309410 100644
--- a/thunderbird-l10n/ca/manifest.json
+++ b/thunderbird-l10n/ca/manifest.json
@@ -1,5 +1,13 @@
 {
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
   "name": "Català Language Pack",
+  "version": "76.0buildid20200420212409",
+  "langpack_id": "ca",
+  "description": "Language pack for Thunderbird for ca",
   "applications": {
     "gecko": {
       "strict_min_version": "76.0",
@@ -9,49 +17,41 @@
   },
   "languages": {
     "ca": {
-      "version": "20200403074107",
       "chrome_resources": {
-        "mozldap": "chrome/ca/locale/ca/mozldap/",
-        "mozapps": "chrome/ca/locale/ca/mozapps/",
-        "messenger-smime": "chrome/ca/locale/ca/messenger-smime/",
-        "communicator": "chrome/ca/locale/ca/communicator/",
+        "lightning": "chrome/ca/locale/ca/lightning/",
+        "places": "chrome/ca/locale/ca/places/",
         "global-platform": {
-          "linux": "chrome/ca/locale/ca/global-platform/unix/",
-          "android": "chrome/ca/locale/ca/global-platform/unix/",
+          "win": "chrome/ca/locale/ca/global-platform/win/",
           "macosx": "chrome/ca/locale/ca/global-platform/mac/",
-          "win": "chrome/ca/locale/ca/global-platform/win/"
+          "android": "chrome/ca/locale/ca/global-platform/unix/",
+          "linux": "chrome/ca/locale/ca/global-platform/unix/"
         },
         "branding": "chrome/ca/locale/ca/branding/",
+        "alerts": "chrome/ca/locale/ca/alerts/",
         "pluginproblem": "chrome/ca/locale/ca/pluginproblem/",
+        "devtools-shared": "chrome/ca/locale/ca/devtools/shared/",
+        "devtools-startup": "chrome/ca/locale/ca/devtools/startup/",
+        "passwordmgr": "chrome/ca/locale/ca/passwordmgr/",
         "autoconfig": "chrome/ca/locale/ca/autoconfig/",
+        "messenger-smime": "chrome/ca/locale/ca/messenger-smime/",
+        "devtools": "chrome/ca/locale/ca/devtools/client/",
         "global": "chrome/ca/locale/ca/global/",
-        "messenger-newsblog": "chrome/ca/locale/ca/messenger-newsblog/",
-        "calendar": "chrome/ca/locale/ca/calendar/",
-        "necko": "chrome/ca/locale/ca/necko/",
-        "pipnss": "chrome/ca/locale/ca/pipnss/",
-        "lightning": "chrome/ca/locale/ca/lightning/",
+        "pippki": "chrome/ca/locale/ca/pippki/",
         "messenger": "chrome/ca/locale/ca/messenger/",
         "messenger-region": "chrome/ca/locale/ca/messenger-region/",
-        "pippki": "chrome/ca/locale/ca/pippki/",
-        "messenger-mapi": "chrome/ca/locale/ca/messenger-mapi/",
-        "devtools-shared": "chrome/ca/locale/ca/devtools/shared/",
-        "devtools": "chrome/ca/locale/ca/devtools/client/",
-        "places": "chrome/ca/locale/ca/places/",
         "chat": "chrome/ca/locale/ca/chat/",
-        "devtools-startup": "chrome/ca/locale/ca/devtools/startup/",
-        "alerts": "chrome/ca/locale/ca/alerts/",
-        "passwordmgr": "chrome/ca/locale/ca/passwordmgr/"
-      }
-    }
-  },
-  "description": "Language pack for Thunderbird for ca",
-  "langpack_id": "ca",
-  "version": "76.0buildid20200407173003",
-  "manifest_version": 2,
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
+        "pipnss": "chrome/ca/locale/ca/pipnss/",
+        "calendar": "chrome/ca/locale/ca/calendar/",
+        "necko": "chrome/ca/locale/ca/necko/",
+        "messenger-newsblog": "chrome/ca/locale/ca/messenger-newsblog/",
+        "mozapps": "chrome/ca/locale/ca/mozapps/",
+        "mozldap": "chrome/ca/locale/ca/mozldap/",
+        "communicator": "chrome/ca/locale/ca/communicator/",
+        "messenger-mapi": "chrome/ca/locale/ca/messenger-mapi/"
+      },
+      "version": "20200420154436"
     }
   },
-  "author": "Mozilla.org / Softcatalà (contributors: Softcatalà)"
+  "author": "Mozilla.org / Softcatalà (contributors: Softcatalà)",
+  "manifest_version": 2
 }
diff --git a/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl
index e253a4c4efd7..2187749ad849 100644
--- a/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/cak/localization/cak/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Tiyak ri tz'aqat rik'in ri yakb'äl…
     .accesskey = T
 help-button = Kitob'al Tz'aqat
+sidebar-help-button-title =
+    .title = Kitob'al Tz'aqat
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } Taq Cha'oj
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Taq kisamajib'al konojel ri taq tz'aqat
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } Taq Cha'oj
+           *[other] { -brand-short-name } Taq Ajowab'äl
+        }
 show-unsigned-extensions-button =
     .label = Jujun taq k'amal man tikirel ta yenik'öx
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Taq k'exoj e k'o
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Taq chilab'enïk
+addon-category-discover-title =
+    .title = Taq chilab'enïk
 addon-category-extension = Taq k'amal
+addon-category-extension-title =
+    .title = Taq k'amal
 addon-category-theme = Taq wachinel
+addon-category-theme-title =
+    .title = Taq wachinel
 addon-category-plugin = Taq nak'ab'äl
+addon-category-plugin-title =
+    .title = Taq nak'ab'äl
 addon-category-dictionary = Taq soltzij
+addon-category-dictionary-title =
+    .title = Taq soltzij
 addon-category-locale = Taq ch'ab'äl
+addon-category-locale-title =
+    .title = Taq ch'ab'äl
 addon-category-available-updates = Taq k'exoj e k'o
+addon-category-available-updates-title =
+    .title = Taq k'exoj e k'o
 addon-category-recent-updates = K'ak'a' taq k'exoj
+addon-category-recent-updates-title =
+    .title = K'ak'a' taq k'exoj
 
 ## These are global warnings
 
@@ -312,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Tik'ut pe Jub'a'
 go-back-button =
     .tooltiptext = Titzolin
+header-back-button =
+    .title = Titzolin
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/cak/localization/cak/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/cak/localization/cak/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..b954780e7191
--- /dev/null
+++ b/thunderbird-l10n/cak/localization/cak/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Xatikirisaj jun ojer ruwäch chi { -brand-product-name }.
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Tinuk' jun K'ak'a' Ruwäch B'i'aj
+profiledowngrade-sync = We nawokisaj jun ojer ruwäch { -brand-product-name } nitikïr yerutz'ila' ri taq ayaketal chuqa' ri runatab'al awokem pa k'amaya'l eyakon chik pa ri ruwäch b'i'aj k'o chik richin ri { -brand-product-name }. Richin nachajij ri etamab'äl, k'o ta chi natz'ük jun k'ak'a' ruwäch b'i'aj richin ri ruyakik ri { -brand-short-name }. Jantape' yatikïr yatok rik'in jun { -fxaccount-brand-name } richin ye'axïm ri taq ayaketal chuqa' runatab'al awokem pa k'amaya'l chi kikojol ri taq ruwäch ab'i'.
+profiledowngrade-nosync = We nawokisaj jun ojer ruwäch { -brand-product-name } nitikïr yerutz'ila' ri taq ayaketal chuqa' ri runatab'al awokem pa k'amaya'l eyakon chik pa ri ruwäch b'i'aj k'o chik richin ri { -brand-product-name }. Richin nachajij ri etamab'äl, k'o ta chi natz'ük jun k'ak'a' ruwäch b'i'aj richin ri ruyakik ri { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Tel
+           *[other] Tel
+        }
diff --git a/thunderbird-l10n/cak/manifest.json b/thunderbird-l10n/cak/manifest.json
index 32375d294146..42551fa7db53 100644
--- a/thunderbird-l10n/cak/manifest.json
+++ b/thunderbird-l10n/cak/manifest.json
@@ -1,12 +1,6 @@
 {
-  "langpack_id": "cak",
-  "author": "mozilla.org (contributors: Mozilla Kaq&#233;chikel &#40;Responsable: Juan Sián&#41;)",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
   "manifest_version": 2,
+  "author": "mozilla.org (contributors: Mozilla Kaq&#233;chikel &#40;Responsable: Juan Sián&#41;)",
   "applications": {
     "gecko": {
       "strict_min_version": "76.0",
@@ -14,44 +8,50 @@
       "strict_max_version": "76.*"
     }
   },
+  "version": "76.0buildid20200420212409",
+  "description": "Language pack for Thunderbird for cak",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "name": "Kaqchikel (Guatemala) Language Pack",
   "languages": {
     "cak": {
-      "version": "20200403074121",
       "chrome_resources": {
+        "passwordmgr": "chrome/cak/locale/cak/passwordmgr/",
+        "calendar": "chrome/cak/locale/cak/calendar/",
+        "chat": "chrome/cak/locale/cak/chat/",
+        "devtools-startup": "chrome/cak/locale/cak/devtools/startup/",
         "global-platform": {
-          "win": "chrome/cak/locale/cak/global-platform/win/",
-          "linux": "chrome/cak/locale/cak/global-platform/unix/",
           "macosx": "chrome/cak/locale/cak/global-platform/mac/",
-          "android": "chrome/cak/locale/cak/global-platform/unix/"
+          "android": "chrome/cak/locale/cak/global-platform/unix/",
+          "linux": "chrome/cak/locale/cak/global-platform/unix/",
+          "win": "chrome/cak/locale/cak/global-platform/win/"
         },
-        "alerts": "chrome/cak/locale/cak/alerts/",
-        "passwordmgr": "chrome/cak/locale/cak/passwordmgr/",
-        "branding": "chrome/cak/locale/cak/branding/",
-        "chat": "chrome/cak/locale/cak/chat/",
-        "messenger": "chrome/cak/locale/cak/messenger/",
+        "lightning": "chrome/cak/locale/cak/lightning/",
+        "communicator": "chrome/cak/locale/cak/communicator/",
         "places": "chrome/cak/locale/cak/places/",
         "messenger-smime": "chrome/cak/locale/cak/messenger-smime/",
-        "global": "chrome/cak/locale/cak/global/",
+        "alerts": "chrome/cak/locale/cak/alerts/",
+        "messenger-newsblog": "chrome/cak/locale/cak/messenger-newsblog/",
+        "messenger": "chrome/cak/locale/cak/messenger/",
+        "pippki": "chrome/cak/locale/cak/pippki/",
+        "mozldap": "chrome/cak/locale/cak/mozldap/",
+        "pluginproblem": "chrome/cak/locale/cak/pluginproblem/",
+        "devtools-shared": "chrome/cak/locale/cak/devtools/shared/",
         "mozapps": "chrome/cak/locale/cak/mozapps/",
-        "calendar": "chrome/cak/locale/cak/calendar/",
         "autoconfig": "chrome/cak/locale/cak/autoconfig/",
+        "global": "chrome/cak/locale/cak/global/",
         "messenger-region": "chrome/cak/locale/cak/messenger-region/",
-        "devtools-shared": "chrome/cak/locale/cak/devtools/shared/",
-        "mozldap": "chrome/cak/locale/cak/mozldap/",
         "necko": "chrome/cak/locale/cak/necko/",
-        "messenger-mapi": "chrome/cak/locale/cak/messenger-mapi/",
-        "pipnss": "chrome/cak/locale/cak/pipnss/",
-        "lightning": "chrome/cak/locale/cak/lightning/",
         "devtools": "chrome/cak/locale/cak/devtools/client/",
-        "communicator": "chrome/cak/locale/cak/communicator/",
-        "pippki": "chrome/cak/locale/cak/pippki/",
-        "messenger-newsblog": "chrome/cak/locale/cak/messenger-newsblog/",
-        "pluginproblem": "chrome/cak/locale/cak/pluginproblem/",
-        "devtools-startup": "chrome/cak/locale/cak/devtools/startup/"
-      }
+        "pipnss": "chrome/cak/locale/cak/pipnss/",
+        "messenger-mapi": "chrome/cak/locale/cak/messenger-mapi/",
+        "branding": "chrome/cak/locale/cak/branding/"
+      },
+      "version": "20200415054537"
     }
   },
-  "version": "76.0buildid20200407173003",
-  "name": "Kaqchikel (Guatemala) Language Pack",
-  "description": "Language pack for Thunderbird for cak"
+  "langpack_id": "cak"
 }
diff --git a/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties b/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties
index a353cd33c05c..dc6d2570c0fa 100644
--- a/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties
+++ b/thunderbird-l10n/cs/chrome/cs/locale/cs/devtools/client/debugger.properties
@@ -54,6 +54,32 @@ setDirectoryRoot.accesskey=r
 removeDirectoryRoot.label=Odebrat kořenový adresář
 removeDirectoryRoot.accesskey=d
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Kopírovat funkci
@@ -307,7 +333,7 @@ projectTextSearch.placeholder=Hledání ve všech souborech…
 
 # LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search
 # message when the query did not match any text of all files in a project.
-projectTextSearch.noResults=Nebyly nalezeny žádné výsledky
+projectTextSearch.noResults=Nenalezeny žádné výsledky
 
 # LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger
 # does not have any sources.
@@ -537,7 +563,7 @@ editor.searchResults1=%d z #1 výsledku;%d ze #1 výsledků;%d z #1 výsledků
 
 # LOCALIZATION NOTE (editor.noResultsFound): Editor Search bar message
 # for when no results found.
-editor.noResultsFound=Nebyly nalezeny žádné výsledky
+editor.noResultsFound=Nenalezeny žádné výsledky
 
 # LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar
 # tooltip for traversing to the Next Result
@@ -867,7 +893,7 @@ sourceSearch.search2=Přejít do souboru…
 
 # LOCALIZATION NOTE (sourceSearch.noResults2): The center pane Source Search
 # message when the query did not match any of the sources.
-sourceSearch.noResults2=Nebyly nalezeny žádné výsledky
+sourceSearch.noResults2=Nenalezeny žádné výsledky
 
 # LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip
 # when the debugger will not pause on exceptions.
@@ -1018,10 +1044,6 @@ whyPaused.mutationBreakpoint=Pozastaveno na mutaci DOMu
 # in a info block explaining how the debugger is currently paused at
 # a JS execution
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
diff --git a/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties b/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties
index 4dfc55cad7a6..abad26346479 100644
--- a/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties
+++ b/thunderbird-l10n/cs/chrome/cs/locale/cs/global/dom/dom.properties
@@ -45,7 +45,7 @@ FormValidationPatternMismatch=Vyplňte prosím pole v požadovaném formátu.
 # LOCALIZATION NOTE (FormValidationPatternMismatchWithTitle): %S is the (possibly truncated) title attribute value.
 FormValidationPatternMismatchWithTitle=Vyplňte prosím pole v požadovaném formátu: %S.
 # LOCALIZATION NOTE (FormValidationNumberRangeOverflow): %S is a number.
-FormValidationNumberRangeOverflow=Zvolte prosím číslo, která není větší než %S.
+FormValidationNumberRangeOverflow=Zvolte prosím číslo, které není větší než %S.
 # LOCALIZATION NOTE (FormValidationDateTimeRangeOverflow): %S is a date or a time.
 FormValidationDateTimeRangeOverflow=Zvolte prosím datum, které není pozdější než %S.
 # LOCALIZATION NOTE (FormValidationNumberRangeUnderflow): %S is a number.
@@ -56,6 +56,7 @@ FormValidationDateTimeRangeUnderflow=Zvolte prosím čas, který není dřívěj
 FormValidationStepMismatch=Zvolte prosím platnou hodnotu. Nejbližší platné hodnoty jsou %S a %S.
 # LOCALIZATION NOTE (FormValidationStepMismatchOneValue): %S can be a number, a date or a time. This is called instead of FormValidationStepMismatch when the second value is the same as the first.
 FormValidationStepMismatchOneValue=Zvolte prosím platnou hodnotu. Nejbližší platná hodnota je %S.
+# LOCALIZATION NOTE (FormValidationTimeReversedRangeUnderflowAndOverflow): %1$S,%2$S are time.
 FormValidationBadInputNumber=Zadejte prosím platné číslo.
 EnablePrivilegeWarning=Použití enablePrivilege je zastaralé. Používejte raději kód, který má systémová oprávnění (např. rozšíření).
 FullscreenDeniedDisabled=Požadavek na režim celé obrazovky byl zamítnut, protože API tohoto režimu není povoleno.
@@ -388,7 +389,7 @@ External_AddSearchProviderWarning=AddSearchProvider je zastaralý.
 # LOCALIZATION NOTE: Do not translate MathML, subscriptshift and superscriptshift.
 # LOCALIZATION NOTE: Do not translate MathML, background, color, fontfamily, fontsize, fontstyle and fontweight.
 # LOCALIZATION NOTE: Do not translate MathML and XLink.
-# LOCALIZATION NOTE: Do not translate title, text, url as they are the names of JS properties.
+# LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
 
 # LOCALIZATION NOTE (FormValidationTimeReversedRangeUnderflowAndOverflow): %1$S,%2$S are time.
 FormValidationTimeReversedRangeUnderflowAndOverflow=Please select a value between %1$S and %2$S.
diff --git a/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties b/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties
index f45262779d2e..dea54226ca6e 100644
--- a/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties
+++ b/thunderbird-l10n/cs/chrome/cs/locale/cs/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Přístup k úložišti „%1$S“ by
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Přístup k úložišti „%1$S“ byl sledovacímu prvku „%2$S“ automaticky povolen.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Přístup k úložišti „%1$S“ byl díky izolaci First-Party „%2$S“ automaticky povolen.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie „%1$S“ byla zablokována, protože obsahuje atribut „sameSite=none“ bez atributu „secure“.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl
index f2fd9ff4c78f..7603e3758b63 100644
--- a/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/cs/localization/cs/devtools/client/aboutdebugging.ftl
@@ -125,6 +125,10 @@ about-debugging-setup-usb-status-updating = Probíhá aktualizace…
 # USB section step by step guide
 about-debugging-setup-usb-step-enable-dev-menu2 = Zapněte nabídku vývojáře na vašem zařízení s Android.
 # USB section step by step guide
+about-debugging-setup-usb-step-enable-debug2 = Povolte ladění přes USB v nabídce pro vývojáře Androidu.
+# USB section step by step guide
+about-debugging-setup-usb-step-enable-debug-firefox2 = Povolte ladění přes USB ve Firefoxu pro Android.
+# USB section step by step guide
 about-debugging-setup-usb-step-plug-device = Připojte zařízení s Androidem k vašemu počítači.
 # Text shown in the USB section of the setup page with a link to troubleshoot connection errors.
 # The link goes to https://developer.mozilla.org/docs/Tools/Remote_Debugging/Debugging_over_USB
diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl
index 4bf4035f365e..3b697cadb09c 100644
--- a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutAddons.ftl
@@ -15,7 +15,7 @@ loading-label =
 list-empty-installed =
     .value = Žádný doplněk tohoto typu není nainstalován
 list-empty-available-updates =
-    .value = Nebyly nalezeny žádné aktualizace
+    .value = Nenalezeny žádné aktualizace
 list-empty-recent-updates =
     .value = Žádný doplněk nebyl aktualizován
 list-empty-find-updates =
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalovat doplněk ze souboru…
     .accesskey = I
 help-button = Nápověda
+sidebar-help-button-title =
+    .title = Nápověda
 preferences =
     { PLATFORM() ->
         [windows] Možnosti
@@ -38,6 +40,17 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Nástroje doplňků
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Možnosti
+           *[other] Předvolby
+        } { -brand-short-name.gender ->
+            [masculine] { -brand-short-name(case: "gen") }
+            [feminine] { -brand-short-name(case: "gen") }
+            [neuter] { -brand-short-name(case: "gen") }
+           *[other] aplikace
+        }
 show-unsigned-extensions-button =
     .label = Některá rozšíření nemohla být ověřena
 show-all-extensions-button =
@@ -181,7 +194,7 @@ legacy-extensions-description =
        *[other] aplikace { -brand-short-name }
     }. <label data-l10n-name="legacy-learn-more">Zjistit více o změnách pro doplňky</label>
 private-browsing-description2 =
-    Fungování rozšíření pro aplikaci { -brand-short-name } se v anonymním prohlížení mění. Všechna nově nainstalovaná rozšíření, nebudou ve výchozím nastavení v anonymních oknech fungovat, pokud jim to nepovolíte. Rozšíření tak nebudou mít bez vašeho vědomí přístup k tomu, co v anonymním prohlížení děláte.
+    Fungování rozšíření pro aplikaci { -brand-short-name } se v anonymních oknech mění. Žádné nově nainstalované rozšíření, nebude ve výchozím nastavení v anonymních oknech fungovat, pokud mu to nepovolíte. Rozšíření tak nebudou mít bez vašeho vědomí přístup k tomu, co v anonymních oknech děláte.
     <label data-l10n-name="private-browsing-learn-more">Jak na nastavení rozšíření</label>
 extensions-view-discopane =
     .name = Doporučení
@@ -193,13 +206,29 @@ extensions-view-available-updates =
     .name = Dostupné aktualizace
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Doporučení
+addon-category-discover-title =
+    .title = Doporučení
 addon-category-extension = Rozšíření
+addon-category-extension-title =
+    .title = Rozšíření
 addon-category-theme = Motivy vzhledu
+addon-category-theme-title =
+    .title = Motivy vzhledu
 addon-category-plugin = Zásuvné moduly
+addon-category-plugin-title =
+    .title = Zásuvné moduly
 addon-category-dictionary = Slovníky
+addon-category-dictionary-title =
+    .title = Slovníky
 addon-category-locale = Jazyky
+addon-category-locale-title =
+    .title = Jazyky
 addon-category-available-updates = Dostupné aktualizace
+addon-category-available-updates-title =
+    .title = Dostupné aktualizace
 addon-category-recent-updates = Aktualizováno
+addon-category-recent-updates-title =
+    .title = Aktualizováno
 
 ## These are global warnings
 
@@ -279,7 +308,7 @@ extensions-updates-downloaded =
 extensions-updates-restart =
     .label = Restartovat pro dokončení instalace
 extensions-updates-none-found =
-    .value = Nebyly nalezeny žádné aktualizace
+    .value = Nenalezeny žádné aktualizace
 extensions-updates-manual-updates-found =
     .label = Zobrazit dostupné aktualizace
 extensions-updates-update-selected =
@@ -287,7 +316,7 @@ extensions-updates-update-selected =
     .tooltiptext = Nainstaluje vybrané aktualizace
 addon-updates-updating = Probíhá aktualizace doplňků
 addon-updates-installed = Doplňky byly aktualizovány.
-addon-updates-none-found = Nebyly nalezeny žádné aktualizace
+addon-updates-none-found = Nenalezeny žádné aktualizace
 addon-updates-manual-updates-found = Zobrazit dostupné aktualizace
 
 ## Add-on install/debug strings for page options menu
@@ -312,6 +341,7 @@ shortcuts-no-commands = Následující rozšíření nemají žádné klávesov
 shortcuts-input =
     .placeholder = Zadejte klávesovou zkratku
 shortcuts-browserAction = Povolit rozšíření
+shortcuts-browserAction2 = Přidat tlačítko na lištu
 shortcuts-pageAction = Povolit akci stránky
 shortcuts-sidebarAction = Přepnout zobrazení postranního panelu
 shortcuts-modifier-mac = Zahrnout Ctrl, Alt nebo ⌘
@@ -344,6 +374,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Zobrazit méně
 go-back-button =
     .tooltiptext = Zpátky
+header-back-button =
+    .title = Zpátky
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl
index 87a7efdc8749..a3bc6db07b46 100644
--- a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl
+++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutPlugins.ftl
@@ -4,7 +4,7 @@
 
 title-label = O zásuvných modulech
 installed-plugins-label = Nainstalované zásuvné moduly
-no-plugins-are-installed-label = Nebyly nalezeny žádné zásuvné moduly
+no-plugins-are-installed-label = Nenalezeny žádné zásuvné moduly
 deprecation-description = Něco chybí? Některé zásuvné moduly už nejsou podporovány. <a data-l10n-name="deprecation-link">Zjistit více.</a>
 
 ## The information of plugins
diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl
index 6e428a666fd0..bbd65befa50f 100644
--- a/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/aboutSupport.ftl
@@ -303,6 +303,11 @@ sandbox-proc-type-content = obsah
 sandbox-proc-type-file = obsah souboru
 sandbox-proc-type-media-plugin = zásuvný modul médií
 sandbox-proc-type-data-decoder = dekodér dat
+startup-cache-title = Mezipaměť spouštění
+startup-cache-disk-cache-path = Cesta k mezipaměti na disku
+startup-cache-ignore-disk-cache = Ignorovat mezipaměť na disku
+startup-cache-found-disk-cache-on-init = Mezipaměť na disku během inicializace nalezena
+startup-cache-wrote-to-disk-cache = Zapsáno do mezipaměti na disku
 launcher-process-status-0 = Povoleno
 launcher-process-status-1 = Zakázáno kvůli chybě
 launcher-process-status-2 = Násilně zakázáno
@@ -326,6 +331,7 @@ touch-enabled = dotykový vstup povolen
 drag-enabled = táhnutí posuvníkem povoleno
 keyboard-enabled = klávesnice povolena
 autoscroll-enabled = automatické posunování povoleno
+zooming-enabled = plynulé gesto pro přiblížení zapnuto
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl
index efe1892fa23a..60fb3800846c 100644
--- a/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/cs/localization/cs/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certifikát)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (řetězec)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Toto rozšíření bylo označeno jako kritické, což znamená, že klienti musí certifikát odmítnou, pokud mu neporozumí.
+certificate-viewer-export = Exportovat
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Osobní
+certificate-viewer-tab-people = Lidé
+certificate-viewer-tab-servers = Servery
+certificate-viewer-tab-ca = Autority
+certificate-viewer-tab-unkonwn = Neznámé
diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl
index a59987ca61f1..bb29ea784e86 100644
--- a/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/cs/localization/cs/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Izolovaný webový obsah
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/cs/localization/cs/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/cs/localization/cs/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..3c06c03a6b82
--- /dev/null
+++ b/thunderbird-l10n/cs/localization/cs/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,19 @@
+# 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/.
+
+profiledowngrade-window =
+    .title =
+        Spustili jste starší verzi { -brand-product-name.gender ->
+            [masculine] { -brand-product-name(case: "gen") }
+            [feminine] { -brand-product-name(case: "gen") }
+            [neuter] { -brand-product-name(case: "gen") }
+           *[other] aplikace { -brand-product-name }
+        }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Vytvořit nový profil
+profiledowngrade-sync = Spuštěním starší verze { -brand-product-name }u může dojít k poškození záložek a historie prohlížení uložených v jeho stávajícím profilu. Pro ochranu vašich dat si prosím pro tuto instalaci aplikace { -brand-short-name } vytvořte profil nový. Pro synchronizaci dat mezi oběma profily můžete použít { -fxaccount-brand-name }.
+profiledowngrade-nosync = Spuštěním starší verze { -brand-product-name }u může dojít k poškození záložek a historie prohlížení uložených v jeho stávajícím profilu. Pro ochranu vašich dat si prosím pro tuto instalaci aplikace { -brand-short-name } vytvořte profil nový.
+profiledowngrade-quit =
+    .label = Ukončit
diff --git a/thunderbird-l10n/cs/manifest.json b/thunderbird-l10n/cs/manifest.json
index 0d4d61ca863e..bb9de9fffdce 100644
--- a/thunderbird-l10n/cs/manifest.json
+++ b/thunderbird-l10n/cs/manifest.json
@@ -1,57 +1,57 @@
 {
-  "version": "76.0buildid20200407173003",
+  "version": "76.0buildid20200420212409",
+  "description": "Language pack for Thunderbird for cs",
   "applications": {
     "gecko": {
-      "id": "langpack-cs@thunderbird.mozilla.org",
       "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
+      "strict_min_version": "76.0",
+      "id": "langpack-cs@thunderbird.mozilla.org"
     }
   },
-  "langpack_id": "cs",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "manifest_version": 2,
+  "author": "Mozilla.cz (contributors: Pavel Cvrček, Pavel Franc, Michal Stanke, Michal Vašíček)",
+  "name": "Czech (CZ) Language Pack",
+  "langpack_id": "cs",
   "languages": {
     "cs": {
-      "version": "20200403115518",
+      "version": "20200420081415",
       "chrome_resources": {
-        "places": "chrome/cs/locale/cs/places/",
-        "autoconfig": "chrome/cs/locale/cs/autoconfig/",
         "pipnss": "chrome/cs/locale/cs/pipnss/",
-        "chat": "chrome/cs/locale/cs/chat/",
-        "alerts": "chrome/cs/locale/cs/alerts/",
-        "branding": "chrome/cs/locale/cs/branding/",
-        "pippki": "chrome/cs/locale/cs/pippki/",
-        "devtools-startup": "chrome/cs/locale/cs/devtools/startup/",
+        "messenger": "chrome/cs/locale/cs/messenger/",
         "devtools": "chrome/cs/locale/cs/devtools/client/",
         "necko": "chrome/cs/locale/cs/necko/",
-        "mozapps": "chrome/cs/locale/cs/mozapps/",
+        "messenger-mapi": "chrome/cs/locale/cs/messenger-mapi/",
+        "lightning": "chrome/cs/locale/cs/lightning/",
+        "global": "chrome/cs/locale/cs/global/",
+        "alerts": "chrome/cs/locale/cs/alerts/",
+        "communicator": "chrome/cs/locale/cs/communicator/",
         "global-platform": {
-          "linux": "chrome/cs/locale/cs/global-platform/unix/",
-          "win": "chrome/cs/locale/cs/global-platform/win/",
           "android": "chrome/cs/locale/cs/global-platform/unix/",
-          "macosx": "chrome/cs/locale/cs/global-platform/mac/"
+          "linux": "chrome/cs/locale/cs/global-platform/unix/",
+          "macosx": "chrome/cs/locale/cs/global-platform/mac/",
+          "win": "chrome/cs/locale/cs/global-platform/win/"
         },
-        "messenger-newsblog": "chrome/cs/locale/cs/messenger-newsblog/",
-        "calendar": "chrome/cs/locale/cs/calendar/",
-        "passwordmgr": "chrome/cs/locale/cs/passwordmgr/",
-        "messenger": "chrome/cs/locale/cs/messenger/",
+        "mozapps": "chrome/cs/locale/cs/mozapps/",
+        "chat": "chrome/cs/locale/cs/chat/",
+        "places": "chrome/cs/locale/cs/places/",
+        "branding": "chrome/cs/locale/cs/branding/",
+        "mozldap": "chrome/cs/locale/cs/mozldap/",
+        "pluginproblem": "chrome/cs/locale/cs/pluginproblem/",
         "devtools-shared": "chrome/cs/locale/cs/devtools/shared/",
+        "passwordmgr": "chrome/cs/locale/cs/passwordmgr/",
+        "autoconfig": "chrome/cs/locale/cs/autoconfig/",
+        "pippki": "chrome/cs/locale/cs/pippki/",
+        "devtools-startup": "chrome/cs/locale/cs/devtools/startup/",
+        "calendar": "chrome/cs/locale/cs/calendar/",
         "messenger-region": "chrome/cs/locale/cs/messenger-region/",
-        "messenger-mapi": "chrome/cs/locale/cs/messenger-mapi/",
-        "communicator": "chrome/cs/locale/cs/communicator/",
-        "mozldap": "chrome/cs/locale/cs/mozldap/",
-        "global": "chrome/cs/locale/cs/global/",
-        "messenger-smime": "chrome/cs/locale/cs/messenger-smime/",
-        "lightning": "chrome/cs/locale/cs/lightning/",
-        "pluginproblem": "chrome/cs/locale/cs/pluginproblem/"
+        "messenger-newsblog": "chrome/cs/locale/cs/messenger-newsblog/",
+        "messenger-smime": "chrome/cs/locale/cs/messenger-smime/"
       }
     }
-  },
-  "name": "Czech (CZ) Language Pack",
-  "description": "Language pack for Thunderbird for cs",
-  "manifest_version": 2,
-  "author": "Mozilla.cz (contributors: Pavel Cvrček, Pavel Franc, Michal Stanke, Michal Vašíček)"
+  }
 }
diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties
index 8a36aef5a6e7..2329bf661f94 100644
--- a/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties
+++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Mae gan yr elfen hon troslifo sgrolio.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Dim rheol gysylltiedig
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Pwyswch Shift a chlicio i symud i reol
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties
index fac3dd28680d..a142027e849a 100644
--- a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties
+++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Cafodd y ddalen steil %1$S ei llwytho fel CSS er nad yw ei fath M
 
 PEUnexpEOF2=Diwedd ffeil annisgwyl wrth chwilio am %1$S.
 PEParseRuleWSOnly=Llinyn bwlch gwyn yn unig i'w ddidoli fel rheol.
+
 PEDeclDropped=Datganiad wedi ei hepgor.
 PEDeclSkipped=Neidio i'r datganiad nesaf.
 PEUnknownProperty=Priodwedd anhysbys ‘%1$S’.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Dim ond unrepeat(auto-fill, …) sy'n
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Dim ond un repeat(auto-fill, …) neu repeat(auto-fit, …) sy'n cael ei ganiatáu yn y rhestr tracio.
 PEMoreThanOneGridRepeatTrackSize=Dim ond un maint trac sy'n cael ei ganiatáu o fewn repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=Nid yw rheolau @import yn ddilys eto mewn taflenni arddull wedi'u hadeiladu.
+
 TooLargeDashedRadius=Mae radiws yr ymyl yn rhy fawr ar gyfer arddull toredig (y terfyn yw 100000px). Rendro fel solet.
 TooLargeDottedRadius=Mae radiws yr ymyl yn rhy fawr ar gyfer arddull dotiog (y terfyn yw 100000px). Rendro fel solet.
diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties
index 9cb8ddb9a8c1..b58f66a5f2e4 100644
--- a/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties
+++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Gwrthodwyd y llwyth gan X-Frame-Options: “%1$S” o “%2$S”, nid
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Gwrthodwyd y llwyth gan X-Frame-Options: “%1$S” o “%2$S”, nid yw'r wefan yn caniatáu fframio croes ffynhonnell o “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Cafwyd hyd i bennawd annilys X-Frame-Options wrth lwytho “%2$SS”: nid yw “%1$S” yn gyfarwyddeb ddilys.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Mae llwytho “%2$S” mewn ffrâm yn cael ei wrthod gan gyfarwyddeb “X-Frame-Options” sydd wedi ei osod i “%1$S”.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Uwchraddio cais ansicr %1$S” i ddefnyddio %2$S.
diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd
index 320483bd65e9..6d936042894f 100644
--- a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd
+++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Chwilio Negeseuon…">
 <!ENTITY searchMailCmd.accesskey "N">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Chwilio Eang…">
+<!ENTITY glodaSearchCmd.accesskey "C">
 <!ENTITY searchAddressesCmd.label "Chwilio Cyfeiriadau…">
 <!ENTITY searchAddressesCmd.accesskey "y">
 
diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties
index 5a968da7f039..33cbfb568d22 100644
--- a/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties
+++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Mae hwn yn neges OpenPGP amgryptiedig.<br>Er mwyn ei ddadgryptio'r e-bost, rhaid gosod <a href="%S">ychwanegyn OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Neges OpenPGP wedi'i hamgryptio yw hon, ond nid oes cefnogaeth ar gyfer dadgryptio OpenPGP ar gael.
diff --git a/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties b/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties
index 9a70c1134bd2..43ec8a645e9b 100644
--- a/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties
+++ b/thunderbird-l10n/cy/chrome/cy/locale/cy/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Mynediad storio wedi ei roi yn awtoma
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Mynediad storio wedi ei roi i yn awtomatig i draciwr “%2$S” ar “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Mae mynediad storio yn cael ei roi'n awtomatig ar gyfer ynysu Parti Cyntaf “%2$S” ar “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Gwrthodwyd cwci “%1$S” oherwydd bod ganddo'r priodoledd “sameSite=none” ond ei fod yn colli'r priodoledd “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/cy/localization/cy/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/cy/localization/cy/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..5dda2dfb6022
--- /dev/null
+++ b/thunderbird-l10n/cy/localization/cy/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Ailgyfeirio URI Calendr
+calendar-uri-redirect-description =
+    Mae'r gweinydd yn ailgyfeirio URI calendr "{ $calendarName }".
+    Derbyn yr ailgyfeirio a dechrau defnyddio'r URI newydd ar gyfer y calendr hwn?
+calendar-uri-redirect-original-uri-label = URI cyfredol:
+calendar-uri-redirect-target-uri-label = Ailgyfeirio i URI newydd:
diff --git a/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl b/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl
index f2893ccfad5b..3cf6d4e63d7e 100644
--- a/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/cy/localization/cy/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Croeso i { -brand-full-name }
+account-settings = Gosodiadau Cyfrif
+#   $accounts (Number) - the number of configured accounts
 setup-title = Dewis Beth i'w Osod
 about-title = Ynghylch { -brand-full-name }
 resources-title = Adnoddau
@@ -40,3 +42,10 @@ explore-link = Edrych ar y Nodweddion
 support-link = Cefnogaeth
 involved-link = Ymunwch â ni!
 developer-link = Dogfennaeth Datblygwr
+read = Darllen negeseuon
+compose = Ysgrifennu neges newydd
+search = Chwilio drwy'r Negeseuon
+filter = Rheoli hidlau negeseuon
+nntp-subscription = Rheoli tanysgrifiadau grwpiau newyddion
+rss-subscription = Rheoli tanysgrifiadau llif
+e2e = Amgryptio Pen-i-Ben
diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl
index 18c5ac611889..061ab50860d7 100644
--- a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Gosod Ychwanegyn o Ffeil…
     .accesskey = G
 help-button = Cefnogaeth Ychwanegion
+sidebar-help-button-title =
+    .title = Cefnogaeth Ychwanegion
 preferences =
     { PLATFORM() ->
         [windows] Dewisiadau { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Offer ar gyfer pob ychwanegyn
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Dewisiadau { -brand-short-name }
+           *[other] Dewisiadau { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Nid oedd modd dilysu rhai estyniadau
 show-all-extensions-button =
@@ -165,13 +173,29 @@ extensions-view-available-updates =
     .name = Diweddariadau ar Gael
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Argymhellion
+addon-category-discover-title =
+    .title = Argymhellion
 addon-category-extension = Estyniadau
+addon-category-extension-title =
+    .title = Estyniadau
 addon-category-theme = Themâu
+addon-category-theme-title =
+    .title = Themâu
 addon-category-plugin = Ategion
+addon-category-plugin-title =
+    .title = Ategion
 addon-category-dictionary = Geiriaduron
+addon-category-dictionary-title =
+    .title = Geiriaduron
 addon-category-locale = Iaith
+addon-category-locale-title =
+    .title = Iaith
 addon-category-available-updates = Diweddariadau ar Gael
+addon-category-available-updates-title =
+    .title = Diweddariadau ar Gael
 addon-category-recent-updates = Diweddariadau Diweddar
+addon-category-recent-updates-title =
+    .title = Diweddariadau Diweddar
 
 ## These are global warnings
 
@@ -284,6 +308,7 @@ shortcuts-no-commands = Nid oes gan yr estyniadau canlynol lwybrau byr:
 shortcuts-input =
     .placeholder = Teipiwch llwybr byr
 shortcuts-browserAction = Cychwyn estyniad
+shortcuts-browserAction2 = Cychwyn botwm bar offer
 shortcuts-pageAction = Cychwyn gweithred tudalen
 shortcuts-sidebarAction = Toglo'r bar ochr
 shortcuts-modifier-mac = Cynnwys Ctrl, Alt, neu ⌘
@@ -313,6 +338,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Dangos Llai
 go-back-button =
     .tooltiptext = Mynd nôl
+header-back-button =
+    .title = Mynd nôl
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl
index 5e3b82684dc0..d71eb964fba6 100644
--- a/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/cy/localization/cy/toolkit/about/aboutSupport.ftl
@@ -307,6 +307,11 @@ sandbox-proc-type-content = cynnwys
 sandbox-proc-type-file = cynnwys ffeil
 sandbox-proc-type-media-plugin = ategyn cyfrwng
 sandbox-proc-type-data-decoder = datgodydd data
+startup-cache-title = Storfa cychwyn
+startup-cache-disk-cache-path = Llwybr Storfa Disg
+startup-cache-ignore-disk-cache = Anwybyddu Storfa Disg
+startup-cache-found-disk-cache-on-init = Wedi dod o hyd i Storfa Disg ar Init
+startup-cache-wrote-to-disk-cache = Ysgrifennwyd at Storfa Disg
 launcher-process-status-0 = Galluogwyd
 launcher-process-status-1 = Analluogwyd oherwydd methiant
 launcher-process-status-2 = Analluogwyd yn orfodol
@@ -330,6 +335,7 @@ touch-enabled = mewnbwn cyffwrdd wedi ei alluogi
 drag-enabled = wedi galluogu llusgo bar sgrolio
 keyboard-enabled = bysellfwrdd wedi ei anlluogi
 autoscroll-enabled = galluogwyd awtosgrolio
+zooming-enabled = pinsio chwyddo llyfn wedi'i alluogi
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl
index 88ab3ed161ad..6e2cf4dd6d46 100644
--- a/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/cy/localization/cy/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (tystysgrif)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (cadwyn)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Mae'r estyniad hwn wedi'i nodi fel un hanfodol, sy'n golygu bod yn rhaid i gleientiaid wrthod y dystysgrif os nad ydyn nhw'n ei deall.
+certificate-viewer-export = Allforio
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Eich Tystysgrifau
+certificate-viewer-tab-people = Pobl
+certificate-viewer-tab-servers = Gweinyddion
+certificate-viewer-tab-ca = Awdurdodau
+certificate-viewer-tab-unkonwn = Anhysbys
diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl
index 9ac560ade866..4b660f7c2ccd 100644
--- a/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/cy/localization/cy/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Cynnwys Gwe Ynysig
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Soced
diff --git a/thunderbird-l10n/cy/localization/cy/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/cy/localization/cy/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..f20d647a700e
--- /dev/null
+++ b/thunderbird-l10n/cy/localization/cy/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Rydych chi wedi cychwyn fersiwn hŷn o { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Creu Proffil Newydd
+profiledowngrade-sync = Mae defnyddio fersiwn hŷn o { -brand-product-name } yn gallu llygru nodiadau llyfr a hanes pori sydd eisoes wedi'u cadw i broffil { -brand-product-name } presennol. Er mwyn diogelu'ch gwybodaeth, crëwch broffil newydd ar gyfer gosodiad hwn o { -brand-short-name }. Gallwch bob amser mewngofnodi gyda { -fxaccount-brand-name } i gydweddu eich nodau tudalen a'ch hanes pori rhwng proffiliau.
+profiledowngrade-nosync = Mae defnyddio fersiwn hŷn o { -brand-product-name } yn gallu llygru nodau tudalen a hanes pori sydd eisoes wedi'u cadw i broffil { -brand-product-name } presennol. Er mwyn diogelu'ch gwybodaeth, crëwch broffil newydd ar gyfer gosod { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Gadael
+           *[other] Gadael
+        }
diff --git a/thunderbird-l10n/cy/manifest.json b/thunderbird-l10n/cy/manifest.json
index 561da3f6eeb5..c9c487f094fe 100644
--- a/thunderbird-l10n/cy/manifest.json
+++ b/thunderbird-l10n/cy/manifest.json
@@ -1,57 +1,57 @@
 {
-  "description": "Language pack for Thunderbird for cy",
-  "name": "Cymraeg Language Pack",
-  "author": "mozilla.org (contributors: Rhoslyn Prys)",
+  "langpack_id": "cy",
+  "manifest_version": 2,
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "langpack_id": "cy",
-  "manifest_version": 2,
-  "version": "76.0buildid20200407173003",
   "applications": {
     "gecko": {
-      "id": "langpack-cy@thunderbird.mozilla.org",
+      "strict_min_version": "76.0",
       "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
+      "id": "langpack-cy@thunderbird.mozilla.org"
     }
   },
+  "description": "Language pack for Thunderbird for cy",
   "languages": {
     "cy": {
-      "version": "20200403105218",
       "chrome_resources": {
+        "alerts": "chrome/cy/locale/cy/alerts/",
+        "pluginproblem": "chrome/cy/locale/cy/pluginproblem/",
         "global-platform": {
-          "android": "chrome/cy/locale/cy/global-platform/unix/",
           "macosx": "chrome/cy/locale/cy/global-platform/mac/",
-          "win": "chrome/cy/locale/cy/global-platform/win/",
-          "linux": "chrome/cy/locale/cy/global-platform/unix/"
+          "android": "chrome/cy/locale/cy/global-platform/unix/",
+          "linux": "chrome/cy/locale/cy/global-platform/unix/",
+          "win": "chrome/cy/locale/cy/global-platform/win/"
         },
-        "mozapps": "chrome/cy/locale/cy/mozapps/",
-        "pippki": "chrome/cy/locale/cy/pippki/",
-        "global": "chrome/cy/locale/cy/global/",
-        "calendar": "chrome/cy/locale/cy/calendar/",
-        "messenger-newsblog": "chrome/cy/locale/cy/messenger-newsblog/",
-        "pluginproblem": "chrome/cy/locale/cy/pluginproblem/",
         "devtools-startup": "chrome/cy/locale/cy/devtools/startup/",
-        "messenger-smime": "chrome/cy/locale/cy/messenger-smime/",
-        "passwordmgr": "chrome/cy/locale/cy/passwordmgr/",
-        "messenger": "chrome/cy/locale/cy/messenger/",
-        "communicator": "chrome/cy/locale/cy/communicator/",
-        "mozldap": "chrome/cy/locale/cy/mozldap/",
+        "lightning": "chrome/cy/locale/cy/lightning/",
+        "chat": "chrome/cy/locale/cy/chat/",
         "devtools": "chrome/cy/locale/cy/devtools/client/",
-        "alerts": "chrome/cy/locale/cy/alerts/",
-        "devtools-shared": "chrome/cy/locale/cy/devtools/shared/",
+        "communicator": "chrome/cy/locale/cy/communicator/",
+        "messenger": "chrome/cy/locale/cy/messenger/",
         "messenger-region": "chrome/cy/locale/cy/messenger-region/",
-        "lightning": "chrome/cy/locale/cy/lightning/",
-        "pipnss": "chrome/cy/locale/cy/pipnss/",
-        "necko": "chrome/cy/locale/cy/necko/",
-        "branding": "chrome/cy/locale/cy/branding/",
+        "devtools-shared": "chrome/cy/locale/cy/devtools/shared/",
         "autoconfig": "chrome/cy/locale/cy/autoconfig/",
+        "mozapps": "chrome/cy/locale/cy/mozapps/",
+        "necko": "chrome/cy/locale/cy/necko/",
+        "messenger-smime": "chrome/cy/locale/cy/messenger-smime/",
+        "calendar": "chrome/cy/locale/cy/calendar/",
+        "messenger-mapi": "chrome/cy/locale/cy/messenger-mapi/",
+        "messenger-newsblog": "chrome/cy/locale/cy/messenger-newsblog/",
+        "pipnss": "chrome/cy/locale/cy/pipnss/",
+        "global": "chrome/cy/locale/cy/global/",
+        "passwordmgr": "chrome/cy/locale/cy/passwordmgr/",
         "places": "chrome/cy/locale/cy/places/",
-        "chat": "chrome/cy/locale/cy/chat/",
-        "messenger-mapi": "chrome/cy/locale/cy/messenger-mapi/"
-      }
+        "branding": "chrome/cy/locale/cy/branding/",
+        "mozldap": "chrome/cy/locale/cy/mozldap/",
+        "pippki": "chrome/cy/locale/cy/pippki/"
+      },
+      "version": "20200415081206"
     }
-  }
+  },
+  "name": "Cymraeg Language Pack",
+  "author": "mozilla.org (contributors: Rhoslyn Prys)",
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties
index 10577944bd87..9c3f9b2e395f 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/debugger.properties
@@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=r
 removeDirectoryRoot.label=Fjern rod-mappe
 removeDirectoryRoot.accesskey=m
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+blackBoxAll.label=Blackbox
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+blackBoxAllInGroup.label=Blackbox filer i denne gruppe
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+unblackBoxAllInGroup.label=Slut blackboxing af filer i denne gruppe
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+blackBoxAllOutsideGroup.label=Blackbox filer uden for denne gruppe
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+unblackBoxAllOutsideGroup.label=Slut blackboxing af filer uden for denne gruppe
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+blackBoxAllInDir.label=Blackbox filer i denne mappe
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+unblackBoxAllInDir.label=Slut blackboxing af filer i denne mappe
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+blackBoxAllOutsideDir.label=Blackbox filer uden for denne mappe
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+unblackBoxAllOutsideDir.label=Slut blackboxing af filer uden for denne mappe
+
 # LOCALIZATION NOTE (copyFunction): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Kopier funktion
@@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Fjernet:
 # a JS execution
 whyPaused.interrupted=Sat på pause ved udførelse
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause=Sat på pause under optagelse
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=overflødig
 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
 # service worker that is in an unknown state.
 serviceWorkerInfo.unknown=ukendt
-
-# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
-blackBoxAll.label=Blackbox
-# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected group
-blackBoxAllInGroup.label=Blackbox files in this group
-# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected group
-unblackBoxAllInGroup.label=Unblackbox files in this group
-# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected group
-blackBoxAllOutsideGroup.label=Blackbox files outside this group
-# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected group
-unblackBoxAllOutsideGroup.label=Unblackbox files outside this group
-# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected directory
-blackBoxAllInDir.label=Blackbox files in this directory
-# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected directory
-unblackBoxAllInDir.label=Unblackbox files in this directory
-# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected directory
-blackBoxAllOutsideDir.label=Blackbox files outside this directory
-# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected directory
-unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties
index 561157ca56ee..9dbb093a8bfe 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Dette element har overflow, der kan scrolles.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Ingen tilknyttet regel
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold tasten Skift nede og klik for at hoppe til regel
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties
index 2f08b6f80a90..07f80258b6bb 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy=Kopier
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll=Udvid alle
 
+jsonViewer.ExpandAllSlow=Udvid alle (langsom)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll=Sammenfold alle
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON=Filtrer JSON
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference=Bladr i referencer
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties
index d8247c242db0..ab4096cf69eb 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/netmonitor.properties
@@ -350,6 +350,10 @@ netmonitor.timings.startedAt=Startet: %S
 # when the request actually finished downloading
 netmonitor.timings.downloadedAt=Hentet: %S
 
+# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
+# timings pane when thea request has been blocked
+netmonitor.timings.noTimings=Ingen timings for denne request
+
 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
 # in the network menu specifying timing interval divisions (in milliseconds).
 networkMenu.millisecond=%S ms
@@ -760,6 +764,14 @@ netmonitor.ws.context.received=Modtagne
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=M
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+netmonitor.ws.context.controlFrames=Kontrol
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey=o
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Kopier meddelelse
@@ -780,11 +792,6 @@ netmonitor.ws.type.sent=Sendte
 # accessible text for the "received" type icon in the websocket table's "data" column.
 netmonitor.ws.type.received=Modtagne
 
-# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the
-# time values in the websocket table's "time" column
-# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded)
-netmonitor.ws.time.format=%1$S,%2$S
-
 # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed
 # in the messages panel identifying the raw data.
 netmonitor.ws.rawData.header=Rå data (%S)
@@ -1021,6 +1028,14 @@ netmonitor.toolbar.resetColumns=Nulstil kolonner
 # displayed in the network table header context menu to reset sorting
 netmonitor.toolbar.resetSorting=Nulstil sortering
 
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label
+# displayed in the network table header context menu to resize a column to fit its content
+netmonitor.toolbar.resizeColumnToFitContent=Tilpas kolonnens størrelse til indholdet
+
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title
+# tooltip displayed when draggable resizer in network table headers is hovered
+netmonitor.toolbar.resizeColumnToFitContent.title=Dobbeltklik for at tilpasse kolonnen til indholdet
+
 # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label
 # displayed in the network table header context menu for the timing submenu
 netmonitor.toolbar.timings=Timings
@@ -1517,19 +1532,3 @@ netmonitor.cache.lastModified=Sidst ændret
 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
 # where a cached object was fetched from (e.g. "disk").
 netmonitor.cache.device=Enhed
-
-# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
-# timings pane when thea request has been blocked
-netmonitor.timings.noTimings=No timings for this request
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
-# on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
-# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label
-# displayed in the network table header context menu to resize a column to fit its content
-netmonitor.toolbar.resizeColumnToFitContent=Resize Column To Fit Content
-# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title
-# tooltip displayed when draggable resizer in network table headers is hovered
-netmonitor.toolbar.resizeColumnToFitContent.title=Double-click to fit column to content
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties
index 10751e92fdf5..320d3901c839 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/toolbox.properties
@@ -291,22 +291,6 @@ browserToolbox.statusMessage=Status for Browserværktøjers forbindelse
 # shown in the web replay timeline marker
 toolbox.replay.jumpMessage=Hop til besked %1$S
 
-# LOCALIZATION NOTE (toolbox.replay.jumpMessage2): This is the label
-# shown in the web replay timeline marker
-toolbox.replay.jumpMessage2=Hop til %1$S
-
-# LOCALIZATION NOTE (toolbox.replay.resume): This is the text that appears in the
-# Replay command bar to prompt the user to resume the program.
-toolbox.replay.resume=Fortsæt
-
-# LOCALIZATION NOTE (toolbox.replay.rewind): This is the text that appears in the
-# Replay command bar to prompt the user to rewind the program.
-toolbox.replay.rewind=Spol tilbage
-
-# LOCALIZATION NOTE (toolbox.replay.pause): This is the text that appears in the
-# Replay command bar to prompt the user to pause the program.
-toolbox.replay.pause=Pause
-
 # LOCALIZATION NOTE (toolbox.debugTargetErrorPage.title): This is the title
 # for the Error view shown by the toolbox when a connection to a debug target
 # could not be made
@@ -322,11 +306,6 @@ toolbox.debugTargetErrorPage.description = Kan ikke oprette forbindelse til dét
 # This entire text is treated as a link to an MDN page.
 options.deprecationNotice=Forældet. Læs mere…
 
-# LOCALIZATION NOTE (options.experimentalNotice): This is the text that appears in the
-# settings panel for the checkbox that enables Replay.
-# This entire text is treated as a link to an MDN page.
-options.experimentalNotice=Eksperimentelt. Læs mere…
-
 # LOCALIZATION NOTE (options.enableMultiProcessToolbox): This is the text that appears in the
 # settings panel for the checkbox that enables the Multiprocess Browser Toolbox.
 options.enableMultiProcessToolbox=Aktivér værktøj for multiproces-browser (kræver genstart af Browserværktøjer)
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties
index 0030306f87d6..cc7d6836e74e 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/devtools/client/webconsole.properties
@@ -180,6 +180,12 @@ webconsole.menu.openInNetworkPanel.accesskey=N
 webconsole.menu.resendNetworkRequest.label= Send request igen
 webconsole.menu.resendNetworkRequest.accesskey=e
 
+# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label)
+# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will 
+# reveal that specific DOM Node in the Inspector.
+webconsole.menu.openNodeInInspector.label=Vis i Inspektør
+webconsole.menu.openNodeInInspector.accesskey=n
+
 # LOCALIZATION NOTE (webconsole.menu.storeAsGlobalVar.label)
 # Label used for a context-menu item displayed for object/variable logs. Clicking on it
 # creates a new global variable pointing to the logged variable.
@@ -374,11 +380,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label=Vedvarende logn
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip)
 webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=Slår du denne indstilling til, vil output'et ikke blive ryddet, hver gang du besøger en ny side
 
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label)
-webconsole.console.settings.menu.item.eagerEvaluation.label=Ivrig evaluering
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip)
-webconsole.console.settings.menu.item.eagerEvaluation.tooltip=Aktiver dette for at lade inputtet blive  ivrigt evalueret, mens du taster det ind.
-
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label)
 webconsole.console.settings.menu.item.instantEvaluation.label=Øjeblikkelig evaluering
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip)
@@ -575,12 +576,8 @@ webconsole.input.selector.top=Top
 # expression for.
 webconsole.input.selector.tooltip=Vælg kontekst for evaluering
 
-# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label)
-# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will 
-# reveal that specific DOM Node in the Inspector.
-webconsole.menu.openNodeInInspector.label=Reveal in Inspector
-webconsole.menu.openNodeInInspector.accesskey=Q
 # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected
+webconsole.group.cookieSameSiteLaxByDefaultEnabled=Nogle cookies bruger attributten "sameSite" forkert, så den ikke virker som forventet
 # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute
+webconsole.group.cookieSameSiteLaxByDefaultDisabled=Nogle cookies bruger den anbefalede attribut "sameSite" forkert
+
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties b/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties
index 368645ff843b..97870a056ed9 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      adskiller
 tabPanel     =      fanebladslinje
 # The roleDescription for the html:mark element
 highlight = fremhæv
-
 # The roleDescription for the details element
-details = details
+details = detaljer
 # The roleDescription for the summary element
-summary = summary
+summary = sammenfatning
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties
index faa7cfb41d7f..95b95cdb3419 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/global/css.properties
@@ -179,5 +179,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Kun én repeat(auto-fill, …) er till
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Kun én repeat(auto-fill, …) eller (auto-fit, …) er tilladt i en track-liste.
 PEMoreThanOneGridRepeatTrackSize=Kun ét track-størrelse er tilladt inden i en repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=@import-regler er ikke gyldige endnu i konstruerede stylesheets.
+
 TooLargeDashedRadius=Radius på border er for stor til at kunne bruge 'dashed' (grænsen er 100000px). Bruger i stedet 'solid'.
 TooLargeDottedRadius=Radius på border er for stor til at kunne bruge 'dotted' (grænsen er 100000px). Bruger i stedet 'solid'.
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties
index 928f20ea66de..82352b81f70b 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/global/dom/dom.properties
@@ -423,6 +423,5 @@ MathML_DeprecatedStyleAttributeWarning=MathML-attributterne "background", "color
 MathML_DeprecatedXLinkAttributeWarning=XLink-attributterne "href", "type", "show" og "actuate" er forældede for MathML-elementer og vil blive fjernet i fremtiden.
 WebShareAPI_Failed=Deling slog fejl.
 WebShareAPI_Aborted=Deling blev afbrudt.
-
 # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
-UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol.
+UnknownProtocolNavigationPrevented=Forhindrede navigering til "%1$S" på grund af en ukendt protokol.
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties
index e069ab2966da..4d1bd35d6eee 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/global/layout_errors.properties
@@ -54,4 +54,4 @@ PrincipalWritingModePropagationWarning=Når <html>-elementet renderes bliver de
 ## %3$S is a floating point value with the total adjusted distance
 ScrollAnchoringDisabledInContainer=Scroll-anchoring blev deaktiveret i en scroll-container på grund af for mange sammenhængende tilpasninger (%1$S) med for lille sammenlagt afstand (%2$S px i gennemsnit, %3$S px totalt).
 
-ForcedLayoutStart=Layout was forced before the page was fully loaded. If stylesheets are not yet loaded this may cause a flash of unstyled content.
+ForcedLayoutStart=Layoutet blev gennemtvunget, før siden var helt indlæst. Hvis stylesheetsene ikke er indlæst endnu kan det medføre, at indholdet i et kort øjeblik vises uden styles.
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties b/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties
index 0222c84a8e41..7e4a1c1b0346 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/global/security/security.properties
@@ -143,10 +143,16 @@ XFODeny = Indslæsning nægtet af  X-Frame-Options: "%1$S" fra "%2$S", webstedet
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Indlæsning nægtet af X-Frame-Options: %1$S" fra "%2$S", webstedet tillader ikke cross-origin-framing på "%3$S.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid =  En ugyldigt X-Frame-Options-header blev fundet under indlæsning af "%2$S": "%1$S" er ikke et gyldigt direktiv.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Indlæsning af "%2$S" i en frame blev nægtet af direktivet “X-Frame-Options“ sat til "%1$S".
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
-HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”.
+HTTPSOnlyUpgradeRequest = Opgraderer den usikre forespørgsel "%1$S" til at bruge "%2$S".
 # LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt.
+HTTPSOnlyNoUpgradeException = Opgraderer ikke den usikre forespørgsel "%1$S", fordi den er undtaget.
 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code.
-HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S)
+HTTPSOnlyFailedRequest = Opgradering af den usikre forespørgsel "%1$S" slog fejl. (%2$S)
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd b/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd
index 621e66abfdb1..14ad9ac7de91 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd
+++ b/thunderbird-l10n/da/chrome/da/locale/da/messenger/accountCreation.dtd
@@ -79,7 +79,7 @@
 <!ENTITY half-manual-test.label          "Afprøv konfigurationen">
 <!ENTITY half-manual-test.accesskey      "ø">
 <!ENTITY manual-edit.label               "Manuel konfiguration">
-<!ENTITY manual-edit.accesskey           "M">
+<!ENTITY manual-edit.accesskey           "K">
 <!ENTITY manual-config.label             "Manuel opsætning…">
 <!ENTITY manual-config.accesskey         "M">
 <!ENTITY open-provisioner.label          "Få en ny mailadresse…">
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties b/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties
index ca756b7826e3..066b95390833 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/messenger/imapMsgs.properties
@@ -201,12 +201,20 @@ imapServerDroppedConnection=Kan ikke tilslutte til IMAP-server. Du har måske ov
 forbindelser til serveren. Hvis det er tilfældet, kan du bruge dialogen Avancerede \
 IMAP-server-indstillinger til at reducere antallet af cachede forbindelser.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Kvote-information er ikke tilgængelig, fordi mappen ikke er åben.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Serveren understøtter ikke kvoter.
 
 imapQuotaStatusNoQuota=Der er ingen kvote for, hvor meget der må gemmes i denne mappe.
 
+# The getqutaroot command succeeded but reported no quota information.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+
 # Out of memory
 imapOutOfMemory=Programmet er løbet tør for hukommelse.
 
@@ -257,7 +265,7 @@ imapFolderCommandFailed=Handlingen for mappen '%2$S' mislykkedes. Mailserveren f
 # LOCALIZATION NOTE (imapServerAlert):
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
-imapServerAlert=Advarsel for kontoen %1$S: %2$S
+imapServerAlert=Advarsel fra kontoen %1$S: %2$S
 
 # The getqutaroot command succeeded but reported no quota information.
 imapQuotaStatusNoQuota2=This folder reports no quota information.
diff --git a/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties b/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties
index b90aaebf9cf4..110df786c037 100644
--- a/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties
+++ b/thunderbird-l10n/da/chrome/da/locale/da/necko/necko.properties
@@ -55,6 +55,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Adgang til lager blev automatisk tild
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Adgang til lager blev automatisk tildelt for sporings-mekanismen "%2$S" på "%1$S".
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Adgang til lager blev automatisk tildelt første-parts isolationen "%2$S" på "%1$S".
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookien "%1$S" blev afvist, fordi den har attributten "sameSite=none" men mangler attributten "secure".
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
@@ -65,8 +68,7 @@ CookieLaxForced=Cookien "%1$S" har "sameSite"-policy sat til "lax", fordi den ma
 CookieLaxForcedForBeta=Cookien "%1$S" har ikke den korrekte "sameSite" attribut-værdi. Cookies uden attributten "sameSite" eller med en ugyldig værdi vil snart blive behandlet som "lax". Dette betyder, at cookien ikke længere vil blive sendt i tredjeparts-kontekster. Hvis din applikation er afhængig af, at denne cookie er tilgængelig i sådanne kontekster, skal du tilføje attributten "sameSite=none" til cookien. Læs %2$S for at lære mere om attributten "sameSite".
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid=Ugyldig "sameSite"-værdi for cookien "%1$S". De understøttede værdier er: "lax", "strict" og "none".
-
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
+CookieOversize=Cookie "%1$S" er ugyldig, fordi den fylder for meget. Den største tilladte størrelse er %2$S B.
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize=Cookien "%1$S" er ugyldig, fordi dens sti-størrelse er for stor. Den største tilladte størrelse er %2$S B.
diff --git a/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl
index 5c1776aaa3e1..a614a3cd314a 100644
--- a/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/da/localization/da/devtools/client/aboutdebugging.ftl
@@ -231,6 +231,10 @@ about-debugging-browser-version-too-old = Den forbundne browser har en gammel ve
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = Debugger-panelet virker muligvis ikke med den forbundne browser. Anvend Firefox { $runtimeVersion }, hvis du skal bruge debuggeren med denne browser.
 
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Denne version af Firefox kan ikke bruges til at debugge Firefox til Android (68). Vi anbefaler, at du installerer Firefox Nightly til Android for at kunne teste. < a>Læs mere</a>
+
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/en-US/docs/Tools/WebIDE/Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl
index 0a733aa07d06..fe15339f6aba 100644
--- a/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/da/localization/da/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Installer tilføjelse fra fil…
     .accesskey = I
 help-button = Hjælp til tilføjelser
+sidebar-help-button-title =
+    .title = Hjælp til tilføjelser
 preferences =
     { PLATFORM() ->
         [windows] Indstillinger for { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Indstillinger for alle tilføjelser
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Indstillinger for { -brand-short-name }
+           *[other] Indstillinger for { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Nogle udvidelser kunne ikke bekræftes
 show-all-extensions-button =
@@ -177,13 +185,29 @@ extensions-view-available-updates =
     .name = Tilgængelige opdateringer
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Anbefalinger
+addon-category-discover-title =
+    .title = Anbefalinger
 addon-category-extension = Udvidelser
+addon-category-extension-title =
+    .title = Udvidelser
 addon-category-theme = Temaer
+addon-category-theme-title =
+    .title = Temaer
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Ordbøger
+addon-category-dictionary-title =
+    .title = Ordbøger
 addon-category-locale = Sprog
+addon-category-locale-title =
+    .title = Sprog
 addon-category-available-updates = Tilgængelige opdateringer
+addon-category-available-updates-title =
+    .title = Tilgængelige opdateringer
 addon-category-recent-updates = Seneste opdateringer
+addon-category-recent-updates-title =
+    .title = Seneste opdateringer
 
 ## These are global warnings
 
@@ -296,6 +320,7 @@ shortcuts-no-commands = Følgende udvidelser han ingen genveje:
 shortcuts-input =
     .placeholder = Indtast en genvej.
 shortcuts-browserAction = Aktiver udvidelse
+shortcuts-browserAction2 = Aktiver knap på værktøjslinjen
 shortcuts-pageAction = Aktiver sidehandling
 shortcuts-sidebarAction = Vis/skjul sidepanelet
 shortcuts-modifier-mac = Inkluder Ctrl, Alt eller ⌘
@@ -320,6 +345,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Vis færre
 go-back-button =
     .tooltiptext = Gå tilbage
+header-back-button =
+    .title = Gå tilbage
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl
index bc3d556a1075..28d898f50fa3 100644
--- a/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/da/localization/da/toolkit/about/aboutSupport.ftl
@@ -291,6 +291,13 @@ sandbox-proc-type-content = indhold
 sandbox-proc-type-file = fil-indhold
 sandbox-proc-type-media-plugin = medie-plugin
 sandbox-proc-type-data-decoder = data-decoder
+
+startup-cache-title = Opstarts-cache
+startup-cache-disk-cache-path = Sti til disk-cache
+startup-cache-ignore-disk-cache = Ignorer disk-cache
+startup-cache-found-disk-cache-on-init = Fandt disk-cache på Init
+startup-cache-wrote-to-disk-cache = Skrev til disk-cache
+
 launcher-process-status-0 = Aktiveret
 launcher-process-status-1 = Deaktiveret på grund af en fejl
 launcher-process-status-2 = Deaktiveret
@@ -315,6 +322,8 @@ drag-enabled = træk i rullebjælke
 keyboard-enabled = tastatur
 autoscroll-enabled = autoscroll
 
+zooming-enabled = smooth pinch-zoom 
+
 ## Variables
 ## $preferenceKey (string) - String ID of preference
 
diff --git a/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl b/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl
index e03a12dd598d..b1a0226b4390 100644
--- a/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/da/localization/da/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Nøgleudvekslingsgruppe
 certificate-viewer-key-id = Nøgle-ID
 certificate-viewer-key-size = Nøgle-størrelse
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Virksomhedens placering
 certificate-viewer-locality = Lokalitet
 certificate-viewer-location = Placering
 certificate-viewer-logid = Log-ID
@@ -94,3 +96,17 @@ certificate-viewer-download-pem = PEM (cert)
   .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (kæde)
   .download = { $fileName }-chain.pem
+
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+  .title = Denne udvidelse er blevet markeret som kritisk, hvilket betyder at klienter skal afvise certifikatet, hvis de ikke forstår det.
+certificate-viewer-export = Eksporter
+  .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Dine certifikater
+certificate-viewer-tab-people = Personer
+certificate-viewer-tab-servers = Servere
+certificate-viewer-tab-ca = Autoriteter
+certificate-viewer-tab-unkonwn = Ukendt
diff --git a/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl b/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl
index 9f8df38d0407..de19553684c6 100644
--- a/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/da/localization/da/toolkit/global/processTypes.ftl
@@ -32,3 +32,6 @@ process-type-webisolated = Isoleret web-indhold
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/da/localization/da/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/da/localization/da/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..be0cf601686e
--- /dev/null
+++ b/thunderbird-l10n/da/localization/da/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Du har startet en gammel version af { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Opret en ny profil
+profiledowngrade-sync = Du risikerer at få ødelagt dine data, såsom browsing-historik og bogmærker, hvis du bruger en gammel version af { -brand-product-name } sammen med en nyere profil. Opret i stedet en ny profil for denne installation af { -brand-short-name } for at beskytte dine data. Du kan logge ind med en { -fxaccount-brand-name } for at synkronisere dine bogmærker og din browsing-historik mellem forskellige profiler.
+profiledowngrade-nosync = Du risikerer at få ødelagt dine data, såsom browsing-historik og bogmærker, hvis du bruger en gammel version af { -brand-product-name } sammen med en nyere profil. Opret i stedet en ny profil for denne installation af { -brand-short-name } for at beskytte dine data.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Afslut
+           *[other] Afslut
+        }
diff --git a/thunderbird-l10n/da/manifest.json b/thunderbird-l10n/da/manifest.json
index b57ee16de1bb..487d34bddca7 100644
--- a/thunderbird-l10n/da/manifest.json
+++ b/thunderbird-l10n/da/manifest.json
@@ -4,54 +4,54 @@
       "base_path": "browser/"
     }
   },
-  "langpack_id": "da",
-  "description": "Language pack for Thunderbird for da",
   "applications": {
     "gecko": {
+      "strict_max_version": "76.*",
       "strict_min_version": "76.0",
-      "id": "langpack-da@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
+      "id": "langpack-da@thunderbird.mozilla.org"
     }
   },
   "manifest_version": 2,
+  "author": "mozilla.org (contributors: Kim Ludvigsen, Jørgen Rasmussen, Mikkel Herold)",
   "languages": {
     "da": {
-      "version": "20200403074226",
+      "version": "20200419193739",
       "chrome_resources": {
-        "devtools-startup": "chrome/da/locale/da/devtools/startup/",
-        "pippki": "chrome/da/locale/da/pippki/",
+        "necko": "chrome/da/locale/da/necko/",
+        "branding": "chrome/da/locale/da/branding/",
         "communicator": "chrome/da/locale/da/communicator/",
-        "messenger-region": "chrome/da/locale/da/messenger-region/",
-        "global": "chrome/da/locale/da/global/",
-        "pluginproblem": "chrome/da/locale/da/pluginproblem/",
-        "messenger": "chrome/da/locale/da/messenger/",
+        "autoconfig": "chrome/da/locale/da/autoconfig/",
+        "messenger-smime": "chrome/da/locale/da/messenger-smime/",
+        "mozldap": "chrome/da/locale/da/mozldap/",
         "messenger-mapi": "chrome/da/locale/da/messenger-mapi/",
+        "messenger": "chrome/da/locale/da/messenger/",
+        "messenger-newsblog": "chrome/da/locale/da/messenger-newsblog/",
+        "passwordmgr": "chrome/da/locale/da/passwordmgr/",
+        "pipnss": "chrome/da/locale/da/pipnss/",
         "calendar": "chrome/da/locale/da/calendar/",
-        "alerts": "chrome/da/locale/da/alerts/",
-        "branding": "chrome/da/locale/da/branding/",
-        "mozapps": "chrome/da/locale/da/mozapps/",
+        "devtools-shared": "chrome/da/locale/da/devtools/shared/",
         "devtools": "chrome/da/locale/da/devtools/client/",
-        "messenger-newsblog": "chrome/da/locale/da/messenger-newsblog/",
+        "global": "chrome/da/locale/da/global/",
         "places": "chrome/da/locale/da/places/",
-        "passwordmgr": "chrome/da/locale/da/passwordmgr/",
+        "pippki": "chrome/da/locale/da/pippki/",
+        "lightning": "chrome/da/locale/da/lightning/",
+        "pluginproblem": "chrome/da/locale/da/pluginproblem/",
+        "alerts": "chrome/da/locale/da/alerts/",
+        "devtools-startup": "chrome/da/locale/da/devtools/startup/",
+        "mozapps": "chrome/da/locale/da/mozapps/",
         "global-platform": {
-          "macosx": "chrome/da/locale/da/global-platform/mac/",
           "linux": "chrome/da/locale/da/global-platform/unix/",
           "android": "chrome/da/locale/da/global-platform/unix/",
-          "win": "chrome/da/locale/da/global-platform/win/"
+          "win": "chrome/da/locale/da/global-platform/win/",
+          "macosx": "chrome/da/locale/da/global-platform/mac/"
         },
-        "pipnss": "chrome/da/locale/da/pipnss/",
-        "autoconfig": "chrome/da/locale/da/autoconfig/",
-        "chat": "chrome/da/locale/da/chat/",
-        "devtools-shared": "chrome/da/locale/da/devtools/shared/",
-        "messenger-smime": "chrome/da/locale/da/messenger-smime/",
-        "mozldap": "chrome/da/locale/da/mozldap/",
-        "necko": "chrome/da/locale/da/necko/",
-        "lightning": "chrome/da/locale/da/lightning/"
+        "messenger-region": "chrome/da/locale/da/messenger-region/",
+        "chat": "chrome/da/locale/da/chat/"
       }
     }
   },
-  "author": "mozilla.org (contributors: Kim Ludvigsen, Jørgen Rasmussen, Mikkel Herold)",
-  "version": "76.0buildid20200407173003",
+  "description": "Language pack for Thunderbird for da",
+  "version": "76.0buildid20200420212409",
+  "langpack_id": "da",
   "name": "Dansk (da) Language Pack"
 }
diff --git a/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl
index ac07e88d15f1..fb5b5bd93e25 100644
--- a/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/de/localization/de/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Add-on aus Datei installieren…
     .accesskey = A
 help-button = Hilfe für Add-ons
+sidebar-help-button-title =
+    .title = Hilfe für Add-ons
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } - Einstellungen
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Tools für alle Add-ons
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } - Einstellungen
+           *[other] { -brand-short-name } - Einstellungen
+        }
 show-unsigned-extensions-button =
     .label = Einige Erweiterungen konnten nicht verifiziert werden.
 show-all-extensions-button =
@@ -172,13 +180,29 @@ extensions-view-available-updates =
     .name = Verfügbare Updates
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Empfehlungen
+addon-category-discover-title =
+    .title = Empfehlungen
 addon-category-extension = Erweiterungen
+addon-category-extension-title =
+    .title = Erweiterungen
 addon-category-theme = Themes
+addon-category-theme-title =
+    .title = Themes
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Wörterbücher
+addon-category-dictionary-title =
+    .title = Wörterbücher
 addon-category-locale = Sprachen
+addon-category-locale-title =
+    .title = Sprachen
 addon-category-available-updates = Verfügbare Updates
+addon-category-available-updates-title =
+    .title = Verfügbare Updates
 addon-category-recent-updates = Zuletzt durchgeführte Updates
+addon-category-recent-updates-title =
+    .title = Zuletzt durchgeführte Updates
 
 ## These are global warnings
 
@@ -315,6 +339,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Weniger anzeigen
 go-back-button =
     .tooltiptext = Zurück
+header-back-button =
+    .title = Zurück
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl b/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl
index d3926bb8ffff..944262d4df55 100644
--- a/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/de/localization/de/toolkit/about/certviewer.ftl
@@ -95,3 +95,12 @@ certificate-viewer-download-pem = PEM (Zertifikat)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (Zertifikatskette)
     .download = { $fileName }-zertifikatskette.pem
+certificate-viewer-export = Exportieren
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-people = Personen
+certificate-viewer-tab-servers = Server
+certificate-viewer-tab-ca = Zertifizierungsstellen
+certificate-viewer-tab-unkonwn = Unbekannt
diff --git a/thunderbird-l10n/de/localization/de/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/de/localization/de/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..665c9a6f6fc6
--- /dev/null
+++ b/thunderbird-l10n/de/localization/de/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Ältere Version von { -brand-product-name } gestartet
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Neues Profil erstellen
+profiledowngrade-sync = Das Verwenden einer älteren als der zuletzt verwendeten { -brand-product-name }-Version kann Lesezeichen und Chronik eines bestehenden { -brand-product-name }-Profils beschädigen. Schützen Sie diese Informationen, indem Sie ein neues Profil für diese Installation von { -brand-short-name } erstellen. Sie können sich jederzeit mit einem { -fxaccount-brand-name } anmelden, um Lesezeichen und Chronik zwischen Profilen zu synchronisieren.
+profiledowngrade-nosync = Das Verwenden einer älteren als der zuletzt verwendeten { -brand-product-name }-Version kann Lesezeichen und Chronik eines bestehenden { -brand-product-name }-Profils beschädigen. Schützen Sie diese Informationen, indem Sie ein neues Profil für diese Installation von { -brand-short-name } erstellen.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Schließen
+           *[other] Beenden
+        }
diff --git a/thunderbird-l10n/de/manifest.json b/thunderbird-l10n/de/manifest.json
index 88687b8551f2..c5271576631f 100644
--- a/thunderbird-l10n/de/manifest.json
+++ b/thunderbird-l10n/de/manifest.json
@@ -1,57 +1,57 @@
 {
+  "version": "76.0buildid20200420212409",
+  "langpack_id": "de",
+  "applications": {
+    "gecko": {
+      "id": "langpack-de@thunderbird.mozilla.org",
+      "strict_min_version": "76.0",
+      "strict_max_version": "76.*"
+    }
+  },
+  "manifest_version": 2,
+  "name": "Deutsch (DE) Language Pack",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "manifest_version": 2,
+  "description": "Language pack for Thunderbird for de",
+  "author": "thunderbird-mail.de (contributors: Sebastian Hengst, Alexander Ihrig, Robert Kaiser, Abdulkadir Topal)",
   "languages": {
     "de": {
-      "version": "20200403074241",
+      "version": "20200415175432",
       "chrome_resources": {
-        "branding": "chrome/de/locale/de/branding/",
-        "autoconfig": "chrome/de/locale/de/autoconfig/",
         "messenger-region": "chrome/de/locale/de/messenger-region/",
-        "chat": "chrome/de/locale/de/chat/",
-        "pluginproblem": "chrome/de/locale/de/pluginproblem/",
-        "pippki": "chrome/de/locale/de/pippki/",
-        "mozldap": "chrome/de/locale/de/mozldap/",
-        "necko": "chrome/de/locale/de/necko/",
-        "messenger-smime": "chrome/de/locale/de/messenger-smime/",
-        "alerts": "chrome/de/locale/de/alerts/",
-        "communicator": "chrome/de/locale/de/communicator/",
-        "lightning": "chrome/de/locale/de/lightning/",
         "devtools-shared": "chrome/de/locale/de/devtools/shared/",
-        "calendar": "chrome/de/locale/de/calendar/",
-        "global": "chrome/de/locale/de/global/",
-        "places": "chrome/de/locale/de/places/",
-        "pipnss": "chrome/de/locale/de/pipnss/",
         "global-platform": {
           "macosx": "chrome/de/locale/de/global-platform/mac/",
-          "win": "chrome/de/locale/de/global-platform/win/",
+          "android": "chrome/de/locale/de/global-platform/unix/",
           "linux": "chrome/de/locale/de/global-platform/unix/",
-          "android": "chrome/de/locale/de/global-platform/unix/"
+          "win": "chrome/de/locale/de/global-platform/win/"
         },
+        "autoconfig": "chrome/de/locale/de/autoconfig/",
+        "places": "chrome/de/locale/de/places/",
+        "lightning": "chrome/de/locale/de/lightning/",
+        "global": "chrome/de/locale/de/global/",
+        "alerts": "chrome/de/locale/de/alerts/",
+        "messenger": "chrome/de/locale/de/messenger/",
+        "chat": "chrome/de/locale/de/chat/",
+        "branding": "chrome/de/locale/de/branding/",
         "messenger-mapi": "chrome/de/locale/de/messenger-mapi/",
-        "passwordmgr": "chrome/de/locale/de/passwordmgr/",
-        "devtools-startup": "chrome/de/locale/de/devtools/startup/",
+        "pippki": "chrome/de/locale/de/pippki/",
         "mozapps": "chrome/de/locale/de/mozapps/",
-        "messenger": "chrome/de/locale/de/messenger/",
+        "devtools-startup": "chrome/de/locale/de/devtools/startup/",
         "devtools": "chrome/de/locale/de/devtools/client/",
-        "messenger-newsblog": "chrome/de/locale/de/messenger-newsblog/"
+        "pluginproblem": "chrome/de/locale/de/pluginproblem/",
+        "passwordmgr": "chrome/de/locale/de/passwordmgr/",
+        "necko": "chrome/de/locale/de/necko/",
+        "messenger-newsblog": "chrome/de/locale/de/messenger-newsblog/",
+        "pipnss": "chrome/de/locale/de/pipnss/",
+        "communicator": "chrome/de/locale/de/communicator/",
+        "messenger-smime": "chrome/de/locale/de/messenger-smime/",
+        "mozldap": "chrome/de/locale/de/mozldap/",
+        "calendar": "chrome/de/locale/de/calendar/"
       }
     }
-  },
-  "description": "Language pack for Thunderbird for de",
-  "langpack_id": "de",
-  "name": "Deutsch (DE) Language Pack",
-  "version": "76.0buildid20200407173003",
-  "author": "thunderbird-mail.de (contributors: Sebastian Hengst, Alexander Ihrig, Robert Kaiser, Abdulkadir Topal)",
-  "applications": {
-    "gecko": {
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0",
-      "id": "langpack-de@thunderbird.mozilla.org"
-    }
   }
 }
diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties
index e8b1706f2a1a..78ad943a33e6 100644
--- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties
+++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Toś ten element ma kulajobny woběžk.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Žedno pśisłušne pšawidło
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Źaržćo Umsch tłocony a klikniśo, aby k pšawidłoju skócył
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties
index 7b53f39dc220..594d0ca38bd5 100644
--- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties
+++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/css.properties
@@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Jano jaden repeat(auto-fill, …) jo w
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Jano jaden repeat(auto-fill, …) abo repeat(auto-fit, …) jo w slědowańskej lisćinje dowólony.
 PEMoreThanOneGridRepeatTrackSize=Jano jadna slědowańska wjelikosć jo w repeat(auto-fit/auto-fill, …) dowólona.
 
+PEDisallowedImportRule=Pšawidła @import hyšći njejsu płaśiwe w napóranych stilowych pśedłogach.
+
 TooLargeDashedRadius=Ramikowy radius jo pśewjeliki za ‘smužkowany’ stil (limit jo 100000px).
 TooLargeDottedRadius=Ramikowy radius jo pśewjeliki za ‘dypkaty’ stil (limit jo 100000px).
diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties
index 3b91b3322de7..58990e323400 100644
--- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties
+++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Zacytanje jo se wótpokazało pśez X-Frame-Options: “%1$S” z “%
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Zacytanje jo se wótpokazało pśez X-Frame-Options: “%1$S” z “%2$S”, sedło rozdźělne žrědła we wobłuku z “%3$S”njedowólujo.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Njepłaśiwa głowa X-Frame-Options jo se namakała pśi cytanju “%2$S”: “%1$S” njejo płaśiwa direktiwa.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Zacytanje “%2$S” we wobłuku jo se wótpokazało pśez direktiwu X-Frame-Options“, kótaraž jo stajona na “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Njewěste napšašowanje “%1$S” se aktualizěrujo, aby “%2$S” wužywało
diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd
index 760911609792..450edb4a1963 100644
--- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd
+++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Powěsći pśepytaś…">
 <!ENTITY searchMailCmd.accesskey "P">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Globalne pytanje…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Adrese pśepytaś…">
 <!ENTITY searchAddressesCmd.accesskey "A">
 
diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties
index f8c4ed115acf..ce19839f6814 100644
--- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties
+++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=To jo skoděrowana OpenPGP-powěsć.<br>Aby toś tu e-mailku dešifrěrował, musyśo <a href="%S">dodank OpenPGP</a> instalěrowaś.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=To jo skoděrowana OpenPGP-powěsć, ale pódpěra za OpenPGP-dekoděrowanje njejo dispoziciji.
diff --git a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties
index 04d636126c00..f09d384da7c9 100644
--- a/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties
+++ b/thunderbird-l10n/dsb/chrome/dsb/locale/dsb/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Pśistup k składowakoju jo se awtoma
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Pśistup k składowakoju jo se awtomatiski pśizwólił pśeslědowakoju “%2$S” na “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Pśistup na składowak jo se awtomatiski pśizwólił za izolěrowanje prědnego póbitowarja “%2$S” na “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie “%1$S” jo se wótpokazał, dokulaž ma atribut “sameSite=none”, ale njama atribut “secure” .
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/dsb/localization/dsb/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/dsb/localization/dsb/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..56abfb56d8a9
--- /dev/null
+++ b/thunderbird-l10n/dsb/localization/dsb/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = URI-dalejpósrědnjenje kalendarja
+calendar-uri-redirect-description =
+    Serwer URI za kalendaŕ „{ $calendarName }“ dalej pósrědnja.
+    Dalejpósrědnjenje akceptěrowaś a nowy URI za toś ten kalendaŕ wužywaś?
+calendar-uri-redirect-original-uri-label = Aktualny URI:
+calendar-uri-redirect-target-uri-label = K nowemu URI dalej pósrědniś:
diff --git a/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl b/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl
index 1ef47f530f35..8ac5785b1734 100644
--- a/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/dsb/localization/dsb/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Witajśo k { -brand-full-name }
+account-settings = Kontowe nastajenja
+#   $accounts (Number) - the number of configured accounts
 setup-title = Wubjeŕśo, což ma se konfigurěrowaś
 about-title = Wó { -brand-full-name }
 resources-title = Resurse
@@ -40,3 +42,10 @@ explore-link = Funkcije wuslěźiś
 support-link = Pomoc
 involved-link = Cyńśo sobu
 developer-link = Wuwijarska dokumentacija
+read = Powěsći cytaś
+compose = Nowu powěsć pisaś
+search = Powěsći pytaś
+filter = Powěsćowe filtry zastojaś
+nntp-subscription = Abonementy diskusijnych kupkow zastojaś
+rss-subscription = Kanalowe abonomenty zastojaś
+e2e = Koděrowanje wót kóńca do kóńca
diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl
index 912636f353ee..f21dde036571 100644
--- a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Dodank z dataje instalěrowaś…
     .accesskey = D
 help-button = Pomoc za dodanki
+sidebar-help-button-title =
+    .title = Pomoc za dodanki
 preferences =
     { PLATFORM() ->
         [windows] Nastajenja { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Rědy za wšykne dodanki
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Nastajenja { -brand-short-name }
+           *[other] Nastajenja { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Někotare rozšyrjenja njejsu dali se wobkšuśiś
 show-all-extensions-button =
@@ -167,13 +175,29 @@ extensions-view-available-updates =
     .name = Aktualizacije
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Dopórucenja
+addon-category-discover-title =
+    .title = Dopórucenja
 addon-category-extension = Rozšyrjenja
+addon-category-extension-title =
+    .title = Rozšyrjenja
 addon-category-theme = Drastwy
+addon-category-theme-title =
+    .title = Drastwy
 addon-category-plugin = Tykace
+addon-category-plugin-title =
+    .title = Tykace
 addon-category-dictionary = Słowniki
+addon-category-dictionary-title =
+    .title = Słowniki
 addon-category-locale = Rěcy
+addon-category-locale-title =
+    .title = Rěcy
 addon-category-available-updates = Aktualizacije
+addon-category-available-updates-title =
+    .title = Aktualizacije
 addon-category-recent-updates = Nowe aktualizacije
+addon-category-recent-updates-title =
+    .title = Nowe aktualizacije
 
 ## These are global warnings
 
@@ -286,6 +310,7 @@ shortcuts-no-commands = Slědujuce rozšyrjenja njamaju  tastowe skrotconki:
 shortcuts-input =
     .placeholder = Zapódajśo tastowu skrotconku
 shortcuts-browserAction = Rozšyrjenje aktiwěrowaś
+shortcuts-browserAction2 = Tłocašk symboloweje rědki aktiwěrowaś
 shortcuts-pageAction = Akciju boka aktiwěrowaś
 shortcuts-sidebarAction = Bocnicu pśešaltowaś
 shortcuts-modifier-mac = Strg, Alt abo ⌘ zapśimjeś
@@ -313,6 +338,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mjenjej pokazaś
 go-back-button =
     .tooltiptext = Slědk
+header-back-button =
+    .title = Slědk
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl
index 77a85bcd5a48..1661f9c8b022 100644
--- a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/aboutSupport.ftl
@@ -297,6 +297,11 @@ sandbox-proc-type-content = wopśimjeśe
 sandbox-proc-type-file = datajowe wopśimjeśe
 sandbox-proc-type-media-plugin = medijowy tykac
 sandbox-proc-type-data-decoder = dekoděrowak datow
+startup-cache-title = Startowy pufrowak
+startup-cache-disk-cache-path = Sćažka platowego pufrowaka
+startup-cache-ignore-disk-cache = Platowy pufrowak ignorěrowaś
+startup-cache-found-disk-cache-on-init = Platowy pufrowak jo se namakał pśi inicializěrowanju
+startup-cache-wrote-to-disk-cache = Jo se napisało do platowego pufrowaka
 launcher-process-status-0 = Zmóžnjony
 launcher-process-status-1 = Zmólki dla znjemóžnjony
 launcher-process-status-2 = Z nuzkanim znjemóžnjony
@@ -320,6 +325,7 @@ touch-enabled = zapódaśe pśez dotyknjenje zmóžnjone
 drag-enabled = śěgnjenje suwańskeje rědki zmóžnjone
 keyboard-enabled = tastatura zmóžnjona
 autoscroll-enabled = awtomatiske kulanje zmóžnjone
+zooming-enabled = pózlažke šćipate skalěrowanje zmóžnjone
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl
index 4934e95fad8e..f962fb0b570e 100644
--- a/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certifikat)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (rjeśazk)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Toś to rozšyrjenje jo se markěrowało ako kritiske, to groni, až klienty muse certifikat wótpokazaś, jolic jen njerozměju.
+certificate-viewer-export = Eksportěrowaś
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Waše certifikaty
+certificate-viewer-tab-people = Luźe
+certificate-viewer-tab-servers = Serwery
+certificate-viewer-tab-ca = Awtority
+certificate-viewer-tab-unkonwn = Njeznaty
diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl
index 7585d0c0cd3c..e50988e69ffa 100644
--- a/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Izolěrowane webwopśimjeśe
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Soket
diff --git a/thunderbird-l10n/dsb/localization/dsb/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..1669337c768b
--- /dev/null
+++ b/thunderbird-l10n/dsb/localization/dsb/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Sćo startował staršu wersiju { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Nowy profil załožyś
+profiledowngrade-sync = Wužywanje staršeje wersije { -brand-product-name } móžo cytańske znamjenja a pśeglědowańsku historiju wobškóźiś, kótarež su se južo składli w eksistěrujucem profilu { -brand-product-name }. Aby swóje informacije šćitał, załožćo nowy profil za toś tu instalaciju { -brand-short-name }. Móžośo se pśecej z { -fxaccount-brand-name } pśizjawis, áby swóje cytańske znamjenja a pśeglědowańsku historiju mjazy profilami synchronizěrował.
+profiledowngrade-nosync = Wužywanje staršeje wersije { -brand-product-name } móžo cytańske znamjenja a pśeglědowańsku historiju wobškóźiś, kótarež su se južo składli w eksistěrujucem profilu { -brand-product-name }. Aby swóje informacije šćitał, załožćo nowy profil za toś tu instalaciju { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Skóńcyś
+           *[other] Skóńcyś
+        }
diff --git a/thunderbird-l10n/dsb/manifest.json b/thunderbird-l10n/dsb/manifest.json
index 0357b759d500..6a6242b2b896 100644
--- a/thunderbird-l10n/dsb/manifest.json
+++ b/thunderbird-l10n/dsb/manifest.json
@@ -6,52 +6,52 @@
       "id": "langpack-dsb@thunderbird.mozilla.org"
     }
   },
-  "author": "Michael Wolf (contributors: Michael Wolf)",
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "dsb",
   "description": "Language pack for Thunderbird for dsb",
-  "name": "Dolnoserbšćina Language Pack",
+  "version": "76.0buildid20200420212409",
   "manifest_version": 2,
+  "langpack_id": "dsb",
   "languages": {
     "dsb": {
-      "version": "20200403145359",
       "chrome_resources": {
-        "messenger-mapi": "chrome/dsb/locale/dsb/messenger-mapi/",
-        "pipnss": "chrome/dsb/locale/dsb/pipnss/",
+        "pippki": "chrome/dsb/locale/dsb/pippki/",
         "mozldap": "chrome/dsb/locale/dsb/mozldap/",
-        "alerts": "chrome/dsb/locale/dsb/alerts/",
-        "messenger-smime": "chrome/dsb/locale/dsb/messenger-smime/",
-        "devtools-shared": "chrome/dsb/locale/dsb/devtools/shared/",
-        "mozapps": "chrome/dsb/locale/dsb/mozapps/",
-        "messenger-region": "chrome/dsb/locale/dsb/messenger-region/",
-        "branding": "chrome/dsb/locale/dsb/branding/",
-        "autoconfig": "chrome/dsb/locale/dsb/autoconfig/",
-        "chat": "chrome/dsb/locale/dsb/chat/",
         "global-platform": {
-          "macosx": "chrome/dsb/locale/dsb/global-platform/mac/",
+          "win": "chrome/dsb/locale/dsb/global-platform/win/",
           "android": "chrome/dsb/locale/dsb/global-platform/unix/",
-          "linux": "chrome/dsb/locale/dsb/global-platform/unix/",
-          "win": "chrome/dsb/locale/dsb/global-platform/win/"
+          "macosx": "chrome/dsb/locale/dsb/global-platform/mac/",
+          "linux": "chrome/dsb/locale/dsb/global-platform/unix/"
         },
-        "global": "chrome/dsb/locale/dsb/global/",
-        "communicator": "chrome/dsb/locale/dsb/communicator/",
-        "messenger-newsblog": "chrome/dsb/locale/dsb/messenger-newsblog/",
-        "passwordmgr": "chrome/dsb/locale/dsb/passwordmgr/",
+        "messenger-smime": "chrome/dsb/locale/dsb/messenger-smime/",
+        "necko": "chrome/dsb/locale/dsb/necko/",
+        "chat": "chrome/dsb/locale/dsb/chat/",
+        "devtools-startup": "chrome/dsb/locale/dsb/devtools/startup/",
+        "pipnss": "chrome/dsb/locale/dsb/pipnss/",
+        "mozapps": "chrome/dsb/locale/dsb/mozapps/",
         "places": "chrome/dsb/locale/dsb/places/",
+        "devtools-shared": "chrome/dsb/locale/dsb/devtools/shared/",
+        "communicator": "chrome/dsb/locale/dsb/communicator/",
+        "branding": "chrome/dsb/locale/dsb/branding/",
+        "alerts": "chrome/dsb/locale/dsb/alerts/",
+        "calendar": "chrome/dsb/locale/dsb/calendar/",
         "devtools": "chrome/dsb/locale/dsb/devtools/client/",
-        "pippki": "chrome/dsb/locale/dsb/pippki/",
+        "global": "chrome/dsb/locale/dsb/global/",
         "messenger": "chrome/dsb/locale/dsb/messenger/",
-        "necko": "chrome/dsb/locale/dsb/necko/",
+        "messenger-region": "chrome/dsb/locale/dsb/messenger-region/",
+        "messenger-mapi": "chrome/dsb/locale/dsb/messenger-mapi/",
         "pluginproblem": "chrome/dsb/locale/dsb/pluginproblem/",
-        "calendar": "chrome/dsb/locale/dsb/calendar/",
         "lightning": "chrome/dsb/locale/dsb/lightning/",
-        "devtools-startup": "chrome/dsb/locale/dsb/devtools/startup/"
-      }
+        "autoconfig": "chrome/dsb/locale/dsb/autoconfig/",
+        "messenger-newsblog": "chrome/dsb/locale/dsb/messenger-newsblog/",
+        "passwordmgr": "chrome/dsb/locale/dsb/passwordmgr/"
+      },
+      "version": "20200418134448"
     }
   },
+  "author": "Michael Wolf (contributors: Michael Wolf)",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
-  }
+  },
+  "name": "Dolnoserbšćina Language Pack"
 }
diff --git a/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties b/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties
index 2b7b0377b575..1e44f6b3e644 100644
--- a/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties
+++ b/thunderbird-l10n/el/chrome/el/locale/el/devtools/client/font-inspector.properties
@@ -7,7 +7,7 @@
 
 # LOCALIZATION NOTE (fontinspector.system) This label indicates that the font is a local
 # system font.
-fontinspector.system=του συστήματος
+fontinspector.system=σύστημα
 
 # LOCALIZATION NOTE (fontinspector.noFontsUsedOnCurrentElement): This label is shown when
 # no fonts were used on the selected element.
diff --git a/thunderbird-l10n/el/localization/el/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/el/localization/el/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..57620f367ce6
--- /dev/null
+++ b/thunderbird-l10n/el/localization/el/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,5 @@
+# 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/.
+
+calendar-uri-redirect-original-uri-label = Τρέχον URI:
diff --git a/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl
index 01207b58ffdf..10750b711c0a 100644
--- a/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/el/localization/el/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Εγκατάσταση πρόσθετου από αρχείο…
     .accesskey = γ
 help-button = Υποστήριξη προσθέτων
+sidebar-help-button-title =
+    .title = Υποστήριξη προσθέτων
 preferences =
     { PLATFORM() ->
         [windows] Επιλογές { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Εργαλεία για όλα τα πρόσθετα
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Επιλογές { -brand-short-name }
+           *[other] Προτιμήσεις { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Δεν ήταν δυνατή η επαλήθευση ορισμένων πρόσθετων
 show-all-extensions-button =
@@ -172,13 +180,29 @@ extensions-view-available-updates =
     .name = Διαθέσιμες ενημερώσεις
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Προτάσεις
+addon-category-discover-title =
+    .title = Προτάσεις
 addon-category-extension = Επεκτάσεις
+addon-category-extension-title =
+    .title = Επεκτάσεις
 addon-category-theme = Θέματα
+addon-category-theme-title =
+    .title = Θέματα
 addon-category-plugin = Αρθρώματα
+addon-category-plugin-title =
+    .title = Αρθρώματα
 addon-category-dictionary = Λεξικά
+addon-category-dictionary-title =
+    .title = Λεξικά
 addon-category-locale = Γλώσσες
+addon-category-locale-title =
+    .title = Γλώσσες
 addon-category-available-updates = Διαθέσιμες ενημερώσεις
+addon-category-available-updates-title =
+    .title = Διαθέσιμες ενημερώσεις
 addon-category-recent-updates = Πρόσφατες ενημερώσεις
+addon-category-recent-updates-title =
+    .title = Πρόσφατες ενημερώσεις
 
 ## These are global warnings
 
@@ -316,6 +340,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Εμφάνιση λιγότερων
 go-back-button =
     .tooltiptext = Επιστροφή
+header-back-button =
+    .title = Επιστροφή
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/el/localization/el/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/el/localization/el/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..020c1336f4ef
--- /dev/null
+++ b/thunderbird-l10n/el/localization/el/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Έχετε εκκινήσει μια παλαιότερη έκδοση του { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Δημιουργία νέου προφίλ
+profiledowngrade-sync = Η χρήση μιας παλαιότερης έκδοσης του { -brand-product-name } μπορεί να καταστρέψει τους σελιδοδείκτες και το ιστορικό περιήγησης που έχουν ήδη αποθηκευτεί σε ένα υπάρχον προφίλ του { -brand-product-name }. Για να προστατέψετε τις πληροφορίες σας, δημιουργήστε ένα νέο προφίλ για αυτή την εγκατάσταση του { -brand-short-name }. Μπορείτε πάντα να συνδεθείτε με ένα { -fxaccount-brand-name } για να συγχρονίσετε τους σελιδοδείκτες και το ιστορικό περιήγησης μεταξύ των προφίλ.
+profiledowngrade-nosync = Η χρήση μιας παλαιότερης έκδοσης του { -brand-product-name } μπορεί να καταστρέψει τους σελιδοδείκτες και το ιστορικό περιήγησης που έχουν ήδη αποθηκευτεί σε ένα υπάρχον προφίλ του { -brand-product-name }. Για να προστατέψετε τις πληροφορίες σας, δημιουργήστε ένα νέο προφίλ για αυτή την εγκατάσταση του { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Έξοδος
+           *[other] Έξοδος
+        }
diff --git a/thunderbird-l10n/el/manifest.json b/thunderbird-l10n/el/manifest.json
index 8166e3c916d9..f9c3a5ce65d3 100644
--- a/thunderbird-l10n/el/manifest.json
+++ b/thunderbird-l10n/el/manifest.json
@@ -1,48 +1,39 @@
 {
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "el",
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-el@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
-    }
-  },
   "languages": {
     "el": {
-      "version": "20200403074312",
       "chrome_resources": {
+        "global": "chrome/el/locale/el/global/",
+        "pipnss": "chrome/el/locale/el/pipnss/",
+        "autoconfig": "chrome/el/locale/el/autoconfig/",
+        "lightning": "chrome/el/locale/el/lightning/",
+        "messenger-newsblog": "chrome/el/locale/el/messenger-newsblog/",
+        "mozldap": "chrome/el/locale/el/mozldap/",
+        "messenger-region": "chrome/el/locale/el/messenger-region/",
+        "pippki": "chrome/el/locale/el/pippki/",
         "devtools-startup": "chrome/el/locale/el/devtools/startup/",
-        "messenger": "chrome/el/locale/el/messenger/",
+        "pluginproblem": "chrome/el/locale/el/pluginproblem/",
+        "calendar": "chrome/el/locale/el/calendar/",
+        "messenger-mapi": "chrome/el/locale/el/messenger-mapi/",
         "global-platform": {
-          "android": "chrome/el/locale/el/global-platform/unix/",
           "macosx": "chrome/el/locale/el/global-platform/mac/",
+          "linux": "chrome/el/locale/el/global-platform/unix/",
           "win": "chrome/el/locale/el/global-platform/win/",
-          "linux": "chrome/el/locale/el/global-platform/unix/"
+          "android": "chrome/el/locale/el/global-platform/unix/"
         },
-        "necko": "chrome/el/locale/el/necko/",
-        "global": "chrome/el/locale/el/global/",
-        "alerts": "chrome/el/locale/el/alerts/",
-        "devtools": "chrome/el/locale/el/devtools/client/",
-        "pipnss": "chrome/el/locale/el/pipnss/",
         "branding": "chrome/el/locale/el/branding/",
+        "messenger": "chrome/el/locale/el/messenger/",
         "devtools-shared": "chrome/el/locale/el/devtools/shared/",
-        "lightning": "chrome/el/locale/el/lightning/",
-        "communicator": "chrome/el/locale/el/communicator/",
-        "calendar": "chrome/el/locale/el/calendar/",
+        "alerts": "chrome/el/locale/el/alerts/",
+        "devtools": "chrome/el/locale/el/devtools/client/",
+        "places": "chrome/el/locale/el/places/",
         "chat": "chrome/el/locale/el/chat/",
+        "communicator": "chrome/el/locale/el/communicator/",
+        "passwordmgr": "chrome/el/locale/el/passwordmgr/",
         "mozapps": "chrome/el/locale/el/mozapps/",
         "messenger-smime": "chrome/el/locale/el/messenger-smime/",
-        "messenger-mapi": "chrome/el/locale/el/messenger-mapi/",
-        "autoconfig": "chrome/el/locale/el/autoconfig/",
-        "pluginproblem": "chrome/el/locale/el/pluginproblem/",
-        "places": "chrome/el/locale/el/places/",
-        "messenger-region": "chrome/el/locale/el/messenger-region/",
-        "mozldap": "chrome/el/locale/el/mozldap/",
-        "passwordmgr": "chrome/el/locale/el/passwordmgr/",
-        "pippki": "chrome/el/locale/el/pippki/",
-        "messenger-newsblog": "chrome/el/locale/el/messenger-newsblog/"
-      }
+        "necko": "chrome/el/locale/el/necko/"
+      },
+      "version": "20200418131504"
     }
   },
   "sources": {
@@ -50,8 +41,17 @@
       "base_path": "browser/"
     }
   },
-  "manifest_version": 2,
-  "name": "Ελληνικά Language Pack",
+  "version": "76.0buildid20200420212409",
+  "description": "Language pack for Thunderbird for el",
   "author": "Kostas Papadimas (contributors: Λούρδας Βασίλης, Jim Spentzos)",
-  "description": "Language pack for Thunderbird for el"
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-el@thunderbird.mozilla.org"
+    }
+  },
+  "langpack_id": "el",
+  "name": "Ελληνικά Language Pack"
 }
diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties
index b183240e2d14..552497a263a9 100644
--- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties
+++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=No associated rule
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties
index ed91969c16b4..d60483345f00 100644
--- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties
+++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type,
 
 PEUnexpEOF2=Unexpected end of file while searching for %1$S.
 PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule.
+
 PEDeclDropped=Declaration dropped.
 PEDeclSkipped=Skipped to next declaration.
 PEUnknownProperty=Unknown property '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Only one repeat(auto-fill, …) is all
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Only one repeat(auto-fill, …) or repeat(auto-fit, …) is allowed in a track list.
 PEMoreThanOneGridRepeatTrackSize=Only one track size is allowed inside repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=@import rules are not yet valid in constructed stylesheets.
+
 TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid.
 TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid.
diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties
index d50ec46bbe6b..de6cee71fba1 100644
--- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties
+++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does not permit cross-origin framing from “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Invalid X-Frame-Options header was found when loading “%2$S”: “%1$S” is not a valid directive.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=The loading of “%2$S” in a frame is denied by “X-Frame-Options“ directive set to “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”.
diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd
index c60fb80436e2..54f24d1a29c7 100644
--- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd
+++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Search Messages…">
 <!ENTITY searchMailCmd.accesskey "M">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Global Search…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Search Addresses…">
 <!ENTITY searchAddressesCmd.accesskey "S">
 
diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties
index b22a6311e877..0492480e3381 100644
--- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties
+++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=This is an encrypted OpenPGP message.<br>In order to decrypt this mail, you need to install an <a href="%S">OpenPGP add-on</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=This is an encrypted OpenPGP message, but support for OpenPGP decryption is not available.
diff --git a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties
index 7ac9f2ff1d29..52d93a433537 100644
--- a/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties
+++ b/thunderbird-l10n/en-GB/chrome/en-GB/locale/en-GB/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Storage access automatically granted
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Storage access automatically granted for tracker “%2$S” on “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Storage access automatically granted for First-Party isolation “%2$S” on “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/en-GB/localization/en-GB/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/en-GB/localization/en-GB/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..9601c538a432
--- /dev/null
+++ b/thunderbird-l10n/en-GB/localization/en-GB/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Calendar URI Redirect
+calendar-uri-redirect-description =
+    The server is redirecting the URI for the calendar "{ $calendarName }".
+    Accept the redirect and start using the new URI for this calendar?
+calendar-uri-redirect-original-uri-label = Current URI:
+calendar-uri-redirect-target-uri-label = Redirecting to new URI:
diff --git a/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl b/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl
index bcb98a92316c..471973f9e400 100644
--- a/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/en-GB/localization/en-GB/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Welcome to { -brand-full-name }
+account-settings = Account Settings
+#   $accounts (Number) - the number of configured accounts
 setup-title = Choose What to Set Up
 about-title = About { -brand-full-name }
 resources-title = Resources
@@ -40,3 +42,10 @@ explore-link = Explore Features
 support-link = Support
 involved-link = Get Involved
 developer-link = Developer Documentation
+read = Read messages
+compose = Write a new message
+search = Search messages
+filter = Manage message filters
+nntp-subscription = Manage newsgroup subscriptions
+rss-subscription = Manage feed subscriptions
+e2e = End-to-end Encryption
diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl
index 688cec74b3a5..641df768e9bf 100644
--- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Install Add-on From File…
     .accesskey = I
 help-button = Add-ons Support
+sidebar-help-button-title =
+    .title = Add-ons Support
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } Options
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Tools for all add-ons
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } Options
+           *[other] { -brand-short-name } Preferences
+        }
 show-unsigned-extensions-button =
     .label = Some extensions could not be verified
 show-all-extensions-button =
@@ -173,13 +181,29 @@ extensions-view-available-updates =
     .name = Available Updates
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recommendations
+addon-category-discover-title =
+    .title = Recommendations
 addon-category-extension = Extensions
+addon-category-extension-title =
+    .title = Extensions
 addon-category-theme = Themes
+addon-category-theme-title =
+    .title = Themes
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Dictionaries
+addon-category-dictionary-title =
+    .title = Dictionaries
 addon-category-locale = Languages
+addon-category-locale-title =
+    .title = Languages
 addon-category-available-updates = Available Updates
+addon-category-available-updates-title =
+    .title = Available Updates
 addon-category-recent-updates = Recent Updates
+addon-category-recent-updates-title =
+    .title = Recent Updates
 
 ## These are global warnings
 
@@ -292,6 +316,7 @@ shortcuts-no-commands = The following extensions do not have shortcuts:
 shortcuts-input =
     .placeholder = Type a shortcut
 shortcuts-browserAction = Activate extension
+shortcuts-browserAction2 = Activate toolbar button
 shortcuts-pageAction = Activate page action
 shortcuts-sidebarAction = Toggle the sidebar
 shortcuts-modifier-mac = Include Ctrl, Alt, or ⌘
@@ -316,6 +341,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Show Less
 go-back-button =
     .tooltiptext = Go back
+header-back-button =
+    .title = Go back
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl
index 7c8d194f9517..5a275aa090b6 100644
--- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/aboutSupport.ftl
@@ -290,6 +290,11 @@ sandbox-proc-type-content = content
 sandbox-proc-type-file = file content
 sandbox-proc-type-media-plugin = media plugin
 sandbox-proc-type-data-decoder = data decoder
+startup-cache-title = Startup Cache
+startup-cache-disk-cache-path = Disk Cache Path
+startup-cache-ignore-disk-cache = Ignore Disk Cache
+startup-cache-found-disk-cache-on-init = Found Disk Cache on Init
+startup-cache-wrote-to-disk-cache = Wrote to Disk Cache
 launcher-process-status-0 = Enabled
 launcher-process-status-1 = Disabled due to failure
 launcher-process-status-2 = Disabled forcibly
@@ -313,6 +318,7 @@ touch-enabled = touch input enabled
 drag-enabled = scrollbar drag enabled
 keyboard-enabled = keyboard enabled
 autoscroll-enabled = autoscroll enabled
+zooming-enabled = smooth pinch-zoom enabled
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl
index 13b54f7e4337..ce7add86bb68 100644
--- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = This extension has been marked as critical, meaning that clients must reject the certificate if they do not understand it.
+certificate-viewer-export = Export
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Your Certificates
+certificate-viewer-tab-people = People
+certificate-viewer-tab-servers = Servers
+certificate-viewer-tab-ca = Authorities
+certificate-viewer-tab-unkonwn = Unknown
diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl
index 8c5a8eca29ab..ce99a5681183 100644
--- a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Isolated Web Content
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..c6258301ba87
--- /dev/null
+++ b/thunderbird-l10n/en-GB/localization/en-GB/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = You’ve launched an older version of { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Create New Profile
+profiledowngrade-sync = Using an older version of { -brand-product-name } can corrupt bookmarks and browsing history already saved to an existing { -brand-product-name } profile. To protect your information, create a new profile for this installation of { -brand-short-name }. You can always sign in with a { -fxaccount-brand-name } to synchronise your bookmarks and browsing history between profiles.
+profiledowngrade-nosync = Using an older version of { -brand-product-name } can corrupt bookmarks and browsing history already saved to an existing { -brand-product-name } profile. To protect your information, create a new profile for this installation of { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Exit
+           *[other] Quit
+        }
diff --git a/thunderbird-l10n/en-GB/manifest.json b/thunderbird-l10n/en-GB/manifest.json
index 9abc3b91dfc2..330270a6126c 100644
--- a/thunderbird-l10n/en-GB/manifest.json
+++ b/thunderbird-l10n/en-GB/manifest.json
@@ -1,57 +1,57 @@
 {
-  "version": "76.0buildid20200407173003",
-  "author": "Mark Tyndall (contributors: Ian Neal)",
-  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
+  "applications": {
+    "gecko": {
+      "id": "langpack-en-GB@thunderbird.mozilla.org",
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0"
+    }
+  },
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "langpack_id": "en-GB",
   "name": "English (GB) Language Pack",
+  "author": "Mark Tyndall (contributors: Ian Neal)",
+  "langpack_id": "en-GB",
+  "description": "Language pack for Thunderbird for en-GB",
   "languages": {
     "en-GB": {
-      "version": "20200405142407",
+      "version": "20200416111440",
       "chrome_resources": {
-        "messenger-mapi": "chrome/en-GB/locale/en-GB/messenger-mapi/",
-        "mozapps": "chrome/en-GB/locale/en-GB/mozapps/",
-        "devtools-shared": "chrome/en-GB/locale/en-GB/devtools/shared/",
-        "autoconfig": "chrome/en-GB/locale/en-GB/autoconfig/",
-        "branding": "chrome/en-GB/locale/en-GB/branding/",
-        "messenger-region": "chrome/en-GB/locale/en-GB/messenger-region/",
-        "global": "chrome/en-GB/locale/en-GB/global/",
-        "communicator": "chrome/en-GB/locale/en-GB/communicator/",
-        "passwordmgr": "chrome/en-GB/locale/en-GB/passwordmgr/",
-        "chat": "chrome/en-GB/locale/en-GB/chat/",
-        "calendar": "chrome/en-GB/locale/en-GB/calendar/",
-        "messenger-smime": "chrome/en-GB/locale/en-GB/messenger-smime/",
-        "mozldap": "chrome/en-GB/locale/en-GB/mozldap/",
+        "places": "chrome/en-GB/locale/en-GB/places/",
         "global-platform": {
-          "android": "chrome/en-GB/locale/en-GB/global-platform/unix/",
-          "macosx": "chrome/en-GB/locale/en-GB/global-platform/mac/",
           "linux": "chrome/en-GB/locale/en-GB/global-platform/unix/",
-          "win": "chrome/en-GB/locale/en-GB/global-platform/win/"
+          "macosx": "chrome/en-GB/locale/en-GB/global-platform/mac/",
+          "win": "chrome/en-GB/locale/en-GB/global-platform/win/",
+          "android": "chrome/en-GB/locale/en-GB/global-platform/unix/"
         },
-        "places": "chrome/en-GB/locale/en-GB/places/",
-        "necko": "chrome/en-GB/locale/en-GB/necko/",
-        "messenger": "chrome/en-GB/locale/en-GB/messenger/",
-        "lightning": "chrome/en-GB/locale/en-GB/lightning/",
-        "pippki": "chrome/en-GB/locale/en-GB/pippki/",
-        "devtools-startup": "chrome/en-GB/locale/en-GB/devtools/startup/",
-        "devtools": "chrome/en-GB/locale/en-GB/devtools/client/",
         "alerts": "chrome/en-GB/locale/en-GB/alerts/",
+        "global": "chrome/en-GB/locale/en-GB/global/",
         "pluginproblem": "chrome/en-GB/locale/en-GB/pluginproblem/",
+        "messenger-mapi": "chrome/en-GB/locale/en-GB/messenger-mapi/",
+        "messenger-smime": "chrome/en-GB/locale/en-GB/messenger-smime/",
+        "pipnss": "chrome/en-GB/locale/en-GB/pipnss/",
+        "chat": "chrome/en-GB/locale/en-GB/chat/",
+        "communicator": "chrome/en-GB/locale/en-GB/communicator/",
+        "calendar": "chrome/en-GB/locale/en-GB/calendar/",
+        "pippki": "chrome/en-GB/locale/en-GB/pippki/",
+        "messenger-region": "chrome/en-GB/locale/en-GB/messenger-region/",
+        "mozapps": "chrome/en-GB/locale/en-GB/mozapps/",
+        "passwordmgr": "chrome/en-GB/locale/en-GB/passwordmgr/",
+        "devtools": "chrome/en-GB/locale/en-GB/devtools/client/",
+        "branding": "chrome/en-GB/locale/en-GB/branding/",
+        "devtools-startup": "chrome/en-GB/locale/en-GB/devtools/startup/",
+        "mozldap": "chrome/en-GB/locale/en-GB/mozldap/",
         "messenger-newsblog": "chrome/en-GB/locale/en-GB/messenger-newsblog/",
-        "pipnss": "chrome/en-GB/locale/en-GB/pipnss/"
+        "devtools-shared": "chrome/en-GB/locale/en-GB/devtools/shared/",
+        "necko": "chrome/en-GB/locale/en-GB/necko/",
+        "autoconfig": "chrome/en-GB/locale/en-GB/autoconfig/",
+        "lightning": "chrome/en-GB/locale/en-GB/lightning/",
+        "messenger": "chrome/en-GB/locale/en-GB/messenger/"
       }
     }
   },
-  "description": "Language pack for Thunderbird for en-GB",
-  "applications": {
-    "gecko": {
-      "strict_max_version": "76.*",
-      "id": "langpack-en-GB@thunderbird.mozilla.org",
-      "strict_min_version": "76.0"
-    }
-  }
+  "manifest_version": 2
 }
diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties
index a8968576a7a0..373ee12a98ad 100644
--- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties
+++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Este elemento tiene desborde desplazable.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Ninguna regla asociada
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Presione Shift y haz clic para ir a la regla
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties
index ac46fed11281..5e505d82f82f 100644
--- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties
+++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=La hoja de estilo %1$S fue cargada como CSS aunque su tipo MIME,
 
 PEUnexpEOF2=Fin de archivo inesperado buscando %1$S.
 PEParseRuleWSOnly=Cadena conteniendo solamente espacios entregada para utilizarse como regla.
+
 PEDeclDropped=Declaración ignorada.
 PEDeclSkipped=Salteando a la próxima declaración.
 PEUnknownProperty=Propiedad desconocida '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Solamente un repeat(auto-fill, ...) se
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Solamente un repeat(auto-fill, ...) o repeat(auto-fit, ...) se permite en track list.
 PEMoreThanOneGridRepeatTrackSize=Solamente un track size se permite dentro de repeat(auto-fit/auto-fill, ...).
 
+PEDisallowedImportRule=Las reglas de @import todavía no son válidas en las hojas de estilo construidas.
+
 TooLargeDashedRadius=El radio de borde es demasiado grande para el estilo ‘dashed’ (el límite es 100000 px). Dibujando como sólido.
 TooLargeDottedRadius=El radio de borde es demasiado grande para el estilo ‘dotted’ (el límite es 100000 px). Dibujando como sólido.
diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties
index 85372357ac9d..0a5b16214edb 100644
--- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties
+++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio no permite ningún encuadre. Se intentó cargar en “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Cabecera X-Frame-Options inválida encontrada al cargar “%2$S”: “%1$S” no es una directiva válida.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=La carga de “%2$S” en un marco es denegada por la directiva “X-Frame-Options“ establecida en “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Actualizando pedido inseguro '%1$S' para usar '%2$S'
diff --git a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties
index d70c509dcdd3..e7834e40842c 100644
--- a/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties
+++ b/thunderbird-l10n/es-AR/chrome/es-AR/locale/es-AR/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=El acceso al almacenamiento concedido
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=El acceso al almacenamiento concedido automáticamente el rastreador "%2$S" en "%1$S".
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Acceso al almacenamiento concedido automáticamente para la aislación de primera fuente “%2$S” en “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie "%1$S" rechazada porque tiene el atributo "sameSite = ninguno" pero le falta el atributo "seguro".
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/es-AR/localization/es-AR/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/es-AR/localization/es-AR/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..382a1d88ab6c
--- /dev/null
+++ b/thunderbird-l10n/es-AR/localization/es-AR/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Redirección de URI de calendario
+calendar-uri-redirect-description =
+    El servidor está redirigiendo el URI para el calendario "{ $calendarName }".
+    ¿Acepta la redirección y comienza a usar el nuevo URI para este calendario?
+calendar-uri-redirect-original-uri-label = URI actual:
+calendar-uri-redirect-target-uri-label = Redireccionando a un nuevo URI:
diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl
index 43633516e02c..3889533e94c7 100644
--- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalar complemento desde archivo…
     .accesskey = I
 help-button = Ayuda sobre complementos
+sidebar-help-button-title =
+    .title = Ayuda sobre complementos
 preferences =
     { PLATFORM() ->
         [windows] Opciones de { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Herramientas para todos los complementos
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opciones de { -brand-short-name }
+           *[other] Preferencias de { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Algunos complementos no pudieron ser verificados
 show-all-extensions-button =
@@ -170,13 +178,29 @@ extensions-view-available-updates =
     .name = Actualizaciones disponibles
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recomendaciones
+addon-category-discover-title =
+    .title = Recomendaciones
 addon-category-extension = Extensiones
+addon-category-extension-title =
+    .title = Extensiones
 addon-category-theme = Temas
+addon-category-theme-title =
+    .title = Temas
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Diccionarios
+addon-category-dictionary-title =
+    .title = Diccionarios
 addon-category-locale = Idiomas
+addon-category-locale-title =
+    .title = Idiomas
 addon-category-available-updates = Actualizaciones disponibles
+addon-category-available-updates-title =
+    .title = Actualizaciones disponibles
 addon-category-recent-updates = Actualizaciones recientes
+addon-category-recent-updates-title =
+    .title = Actualizaciones recientes
 
 ## These are global warnings
 
@@ -289,6 +313,7 @@ shortcuts-no-commands = Los siguientes complementos no tienen atajos de teclado:
 shortcuts-input =
     .placeholder = Escriba un atajo
 shortcuts-browserAction = Activar el complemento
+shortcuts-browserAction2 = Activar botón de barra de herramientas
 shortcuts-pageAction = Activar Acción de la página
 shortcuts-sidebarAction = Alternar la barra lateral
 shortcuts-modifier-mac = Incluir Ctrl, Alt o ⌘
@@ -314,6 +339,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mostrar menos
 go-back-button =
     .tooltiptext = Retroceder
+header-back-button =
+    .title = Retroceder
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl
index 4a0f66c3ce85..86d8dadfd8f9 100644
--- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/aboutSupport.ftl
@@ -290,6 +290,11 @@ sandbox-proc-type-content = contenido
 sandbox-proc-type-file = contenido de archivo
 sandbox-proc-type-media-plugin = plugin de medios
 sandbox-proc-type-data-decoder = decodificador de datos
+startup-cache-title = Caché de inicio
+startup-cache-disk-cache-path = Ruta de caché de disco
+startup-cache-ignore-disk-cache = Ignorar caché de disco
+startup-cache-found-disk-cache-on-init = Se encontró caché de disco en Init
+startup-cache-wrote-to-disk-cache = Escribió en caché de disco
 launcher-process-status-0 = Habilitado
 launcher-process-status-1 = Deshabilitado por fallo
 launcher-process-status-2 = Deshabilitado por la fuerza
@@ -313,6 +318,7 @@ touch-enabled = táctil habilitado
 drag-enabled = arrastre de barra de desplazamiento habilitado
 keyboard-enabled = teclado habilitado
 autoscroll-enabled = desplazamiento automático habilitado
+zooming-enabled = zoom de pellizco suave habilitado
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl
index df8459908169..f1aed9808313 100644
--- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (cadena)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Esta extensión fue marcada como crítica, lo que significa que los clientes deben rechazar el certificado si no lo entienden.
+certificate-viewer-export = Exportar
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Tus certificados
+certificate-viewer-tab-people = Personas
+certificate-viewer-tab-servers = Servidores
+certificate-viewer-tab-ca = Autoridades
+certificate-viewer-tab-unkonwn = Desconocido
diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl
index 2b4b7cee6cc3..9bcc1415f93f 100644
--- a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Contenido web aislado
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..509a084e458d
--- /dev/null
+++ b/thunderbird-l10n/es-AR/localization/es-AR/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Se ha iniciado una versión vieja de { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Crear un nuevo perfil
+profiledowngrade-sync = Usar una versión vieja de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en el perfil existente de { -brand-product-name }. Para proteger la información, debería crear un perfil nuevo para esta instalación de { -brand-short-name }. Siempre se puede ingresar con una { -fxaccount-brand-name } para sincronizar los marcadores y el historial de navegación entre perfiles.
+profiledowngrade-nosync = Usar una versión vieja de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en el perfil existente de { -brand-product-name }. Para proteger la información, debería crear un perfil nuevo para esta instalación de { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Salir
+           *[other] Salir
+        }
diff --git a/thunderbird-l10n/es-AR/manifest.json b/thunderbird-l10n/es-AR/manifest.json
index 2b09fbb1b5e0..1e99da8cfabf 100644
--- a/thunderbird-l10n/es-AR/manifest.json
+++ b/thunderbird-l10n/es-AR/manifest.json
@@ -1,57 +1,57 @@
 {
-  "manifest_version": 2,
-  "langpack_id": "es-AR",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "manifest_version": 2,
+  "author": "mozilla.org (contributors: Marcelo Poli)",
+  "version": "76.0buildid20200420212409",
+  "description": "Language pack for Thunderbird for es-AR",
   "name": "Español (AR) Language Pack",
   "languages": {
     "es-AR": {
       "chrome_resources": {
-        "chat": "chrome/es-AR/locale/es-AR/chat/",
+        "devtools": "chrome/es-AR/locale/es-AR/devtools/client/",
+        "autoconfig": "chrome/es-AR/locale/es-AR/autoconfig/",
+        "messenger": "chrome/es-AR/locale/es-AR/messenger/",
+        "pluginproblem": "chrome/es-AR/locale/es-AR/pluginproblem/",
+        "messenger-region": "chrome/es-AR/locale/es-AR/messenger-region/",
         "devtools-startup": "chrome/es-AR/locale/es-AR/devtools/startup/",
+        "passwordmgr": "chrome/es-AR/locale/es-AR/passwordmgr/",
         "places": "chrome/es-AR/locale/es-AR/places/",
         "lightning": "chrome/es-AR/locale/es-AR/lightning/",
-        "branding": "chrome/es-AR/locale/es-AR/branding/",
-        "messenger-smime": "chrome/es-AR/locale/es-AR/messenger-smime/",
+        "messenger-mapi": "chrome/es-AR/locale/es-AR/messenger-mapi/",
         "global": "chrome/es-AR/locale/es-AR/global/",
-        "alerts": "chrome/es-AR/locale/es-AR/alerts/",
+        "mozldap": "chrome/es-AR/locale/es-AR/mozldap/",
         "pippki": "chrome/es-AR/locale/es-AR/pippki/",
-        "mozapps": "chrome/es-AR/locale/es-AR/mozapps/",
-        "devtools": "chrome/es-AR/locale/es-AR/devtools/client/",
-        "pipnss": "chrome/es-AR/locale/es-AR/pipnss/",
-        "pluginproblem": "chrome/es-AR/locale/es-AR/pluginproblem/",
-        "necko": "chrome/es-AR/locale/es-AR/necko/",
-        "communicator": "chrome/es-AR/locale/es-AR/communicator/",
-        "devtools-shared": "chrome/es-AR/locale/es-AR/devtools/shared/",
-        "passwordmgr": "chrome/es-AR/locale/es-AR/passwordmgr/",
         "global-platform": {
-          "android": "chrome/es-AR/locale/es-AR/global-platform/unix/",
-          "macosx": "chrome/es-AR/locale/es-AR/global-platform/mac/",
+          "linux": "chrome/es-AR/locale/es-AR/global-platform/unix/",
           "win": "chrome/es-AR/locale/es-AR/global-platform/win/",
-          "linux": "chrome/es-AR/locale/es-AR/global-platform/unix/"
+          "macosx": "chrome/es-AR/locale/es-AR/global-platform/mac/",
+          "android": "chrome/es-AR/locale/es-AR/global-platform/unix/"
         },
-        "autoconfig": "chrome/es-AR/locale/es-AR/autoconfig/",
-        "messenger-newsblog": "chrome/es-AR/locale/es-AR/messenger-newsblog/",
-        "mozldap": "chrome/es-AR/locale/es-AR/mozldap/",
-        "messenger": "chrome/es-AR/locale/es-AR/messenger/",
-        "messenger-mapi": "chrome/es-AR/locale/es-AR/messenger-mapi/",
-        "messenger-region": "chrome/es-AR/locale/es-AR/messenger-region/",
-        "calendar": "chrome/es-AR/locale/es-AR/calendar/"
+        "communicator": "chrome/es-AR/locale/es-AR/communicator/",
+        "calendar": "chrome/es-AR/locale/es-AR/calendar/",
+        "devtools-shared": "chrome/es-AR/locale/es-AR/devtools/shared/",
+        "alerts": "chrome/es-AR/locale/es-AR/alerts/",
+        "messenger-smime": "chrome/es-AR/locale/es-AR/messenger-smime/",
+        "mozapps": "chrome/es-AR/locale/es-AR/mozapps/",
+        "branding": "chrome/es-AR/locale/es-AR/branding/",
+        "chat": "chrome/es-AR/locale/es-AR/chat/",
+        "necko": "chrome/es-AR/locale/es-AR/necko/",
+        "pipnss": "chrome/es-AR/locale/es-AR/pipnss/",
+        "messenger-newsblog": "chrome/es-AR/locale/es-AR/messenger-newsblog/"
       },
-      "version": "20200404233502"
+      "version": "20200418082423"
     }
   },
-  "description": "Language pack for Thunderbird for es-AR",
+  "langpack_id": "es-AR",
   "applications": {
     "gecko": {
       "id": "langpack-es-AR@thunderbird.mozilla.org",
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
+      "strict_min_version": "76.0",
+      "strict_max_version": "76.*"
     }
-  },
-  "author": "mozilla.org (contributors: Marcelo Poli)",
-  "version": "76.0buildid20200407173003"
+  }
 }
diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties
index 6e778dfa34e5..51e173a838b7 100644
--- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties
+++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Este elemento tiene desbordamiento desplazabl
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Ninguna regla asociada
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Presione Shift y haga clic para ir a la regla
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties
index 4cc8b7dc355f..9672ab1b2b59 100644
--- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties
+++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=La hoja de estilos %1$S se ha cargado como CSS a pesar de que su
 
 PEUnexpEOF2=Fin de archivo inesperado mientras se buscaba %1$S.
 PEParseRuleWSOnly=Se ha pasado una cadena de espacios en blanco como regla.
+
 PEDeclDropped=Declaración rechazada.
 PEDeclSkipped=Ignorado hasta la siguiente declaración.
 PEUnknownProperty=Propiedad desconocida '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Solo se permite un repeat(auto-fill, 
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Solo se permite un repeat(auto-fill, …) o repeat(auto-fit, …) en una lista de pistas.
 PEMoreThanOneGridRepeatTrackSize=Solo se permite un tamaño de pista dentro de repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=Las reglas @import todavía no son válidas en hojas de estilo construidas.
+
 TooLargeDashedRadius=El radio del borde es demasiado grande para el estilo 'dashed' o a rayas (el límite es 100000px). Dibujando en estilo sólido o continuo.
 TooLargeDottedRadius=El radio del borde es demasiado grande para el estilo 'dotted' o punteado (el límite es 100000px). Dibujando en estilo sólido o continuo.
diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties
index 19ff72791b44..21f0c833ba5b 100644
--- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties
+++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Carga denegada por X-Frame-Options: “%1$S” de “%2$S”, el sitio no permite ningún marco de origen cruzado de “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Se ha encontrado una cabecera X-Frame-Options no válida al cargar “%2$S”: “%1$S” no es una directiva válida.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=La carga de “%2$S” en un marco ha sido denegada por la directiva “X-Frame-Options“ establecida en “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Actualizando solicitud insegura “%1$S” para usar “%2$S”.
diff --git a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties
index c84553c37d90..301d9ec0e3e1 100644
--- a/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties
+++ b/thunderbird-l10n/es-ES/chrome/es-ES/locale/es-ES/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Concedido automáticamente el acceso
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Concedido automáticamente el acceso al almacenamiento para el rastreador “%2$S” en “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Acceso al almacenamiento concedido automáticamente para el aislamiento First-Party “%2$S” en “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie “%1$S” rechazada porque tiene el atributo “sameSite=none” pero le falta el atributo “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl
index 1a7b7c5598af..30858357d184 100644
--- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalar complemento desde archivo…
     .accesskey = I
 help-button = Soporte para complementos
+sidebar-help-button-title =
+    .title = Soporte para complementos
 preferences =
     { PLATFORM() ->
         [windows] Opciones de { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Herramientas para todos los complementos
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opciones de { -brand-short-name }
+           *[other] Preferencias de { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Algunas extensiones no han podido ser verificadas
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Actualizaciones disponibles
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recomendaciones
+addon-category-discover-title =
+    .title = Recomendaciones
 addon-category-extension = Extensiones
+addon-category-extension-title =
+    .title = Extensiones
 addon-category-theme = Temas
+addon-category-theme-title =
+    .title = Temas
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Diccionarios
+addon-category-dictionary-title =
+    .title = Diccionarios
 addon-category-locale = Idiomas
+addon-category-locale-title =
+    .title = Idiomas
 addon-category-available-updates = Actualizaciones disponibles
+addon-category-available-updates-title =
+    .title = Actualizaciones disponibles
 addon-category-recent-updates = Actualizaciones recientes
+addon-category-recent-updates-title =
+    .title = Actualizaciones recientes
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Las siguientes extensiones no tienen atajos:
 shortcuts-input =
     .placeholder = Escriba un atajo
 shortcuts-browserAction = Activar extensión
+shortcuts-browserAction2 = Activar botón de la barra de herramientas
 shortcuts-pageAction = Activar acción de página
 shortcuts-sidebarAction = Alternar la barra lateral
 shortcuts-modifier-mac = Incluir Ctrl, Alt o ⌘
@@ -312,6 +337,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mostrar menos
 go-back-button =
     .tooltiptext = Retroceder
+header-back-button =
+    .title = Retroceder
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl
index 2baee6071a16..7c7768b71ed8 100644
--- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = contenido
 sandbox-proc-type-file = contenido del archivo
 sandbox-proc-type-media-plugin = plugin de medios
 sandbox-proc-type-data-decoder = decodificador de datos
+startup-cache-title = Caché de inicio
+startup-cache-disk-cache-path = Ruta de caché de disco
+startup-cache-ignore-disk-cache = Ignorar caché de disco
+startup-cache-found-disk-cache-on-init = Caché de disco encontrada durante la inicialización
+startup-cache-wrote-to-disk-cache = Se escribió a la caché de disco
 launcher-process-status-0 = Activado
 launcher-process-status-1 = Desactivado por fallo
 launcher-process-status-2 = Desactivado forzosamente
@@ -310,6 +315,7 @@ touch-enabled = entrada táctil activada
 drag-enabled = arrastre de la barra de desplazamiento activado
 keyboard-enabled = teclado habilitado
 autoscroll-enabled = desplazamiento automático activado
+zooming-enabled = zoom de pellizco suave activado
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl
index 88d549110a6a..3ca07152fb55 100644
--- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (cadena)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Esta extensión ha sido marcada como crítica, lo que significa que los clientes deben rechazar el certificado si no lo entienden.
+certificate-viewer-export = Exportar
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Sus certificados
+certificate-viewer-tab-people = Personas
+certificate-viewer-tab-servers = Servidores
+certificate-viewer-tab-ca = Autoridades
+certificate-viewer-tab-unkonwn = Desconocido
diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl
index 60a4d59075d3..5c3b21783328 100644
--- a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Contenido web aislado
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..d28ad8dedb87
--- /dev/null
+++ b/thunderbird-l10n/es-ES/localization/es-ES/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Ha ejecutado una versión antigua de { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Crear nuevo perfil
+profiledowngrade-sync = Usar una versión antigua de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en un perfil de { -brand-product-name } existente. Para proteger su información, cree un nuevo perfil para esta instalación de { -brand-short-name }. Siempre puede conectarse a una { -fxaccount-brand-name } para sincronizar sus marcadores e historial de navegación entre perfiles.
+profiledowngrade-nosync = Usar una versión antigua de { -brand-product-name } puede corromper los marcadores y el historial de navegación ya guardados en un perfil de { -brand-product-name } existente. Para proteger su información, cree un nuevo perfil para esta instalación de { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Salir
+           *[other] Salir
+        }
diff --git a/thunderbird-l10n/es-ES/manifest.json b/thunderbird-l10n/es-ES/manifest.json
index d52d4104d7e6..f513b16a9b96 100644
--- a/thunderbird-l10n/es-ES/manifest.json
+++ b/thunderbird-l10n/es-ES/manifest.json
@@ -1,57 +1,57 @@
 {
-  "langpack_id": "es-ES",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "version": "76.0buildid20200420212409",
   "manifest_version": 2,
+  "author": "mozilla.org",
+  "description": "Language pack for Thunderbird for es-ES",
+  "name": "Español (España) Language Pack",
   "applications": {
     "gecko": {
+      "strict_min_version": "76.0",
       "id": "langpack-es-ES@thunderbird.mozilla.org",
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
+      "strict_max_version": "76.*"
     }
   },
-  "name": "Español (España) Language Pack",
-  "author": "mozilla.org",
-  "description": "Language pack for Thunderbird for es-ES",
   "languages": {
     "es-ES": {
       "chrome_resources": {
-        "devtools": "chrome/es-ES/locale/es-ES/devtools/client/",
-        "autoconfig": "chrome/es-ES/locale/es-ES/autoconfig/",
-        "places": "chrome/es-ES/locale/es-ES/places/",
-        "messenger-region": "chrome/es-ES/locale/es-ES/messenger-region/",
-        "communicator": "chrome/es-ES/locale/es-ES/communicator/",
-        "global": "chrome/es-ES/locale/es-ES/global/",
-        "calendar": "chrome/es-ES/locale/es-ES/calendar/",
         "mozldap": "chrome/es-ES/locale/es-ES/mozldap/",
-        "messenger-mapi": "chrome/es-ES/locale/es-ES/messenger-mapi/",
-        "alerts": "chrome/es-ES/locale/es-ES/alerts/",
-        "pipnss": "chrome/es-ES/locale/es-ES/pipnss/",
-        "mozapps": "chrome/es-ES/locale/es-ES/mozapps/",
-        "devtools-shared": "chrome/es-ES/locale/es-ES/devtools/shared/",
+        "communicator": "chrome/es-ES/locale/es-ES/communicator/",
         "pluginproblem": "chrome/es-ES/locale/es-ES/pluginproblem/",
-        "messenger-newsblog": "chrome/es-ES/locale/es-ES/messenger-newsblog/",
-        "passwordmgr": "chrome/es-ES/locale/es-ES/passwordmgr/",
-        "necko": "chrome/es-ES/locale/es-ES/necko/",
-        "pippki": "chrome/es-ES/locale/es-ES/pippki/",
-        "chat": "chrome/es-ES/locale/es-ES/chat/",
+        "branding": "chrome/es-ES/locale/es-ES/branding/",
+        "messenger-smime": "chrome/es-ES/locale/es-ES/messenger-smime/",
+        "alerts": "chrome/es-ES/locale/es-ES/alerts/",
         "messenger": "chrome/es-ES/locale/es-ES/messenger/",
+        "devtools": "chrome/es-ES/locale/es-ES/devtools/client/",
+        "devtools-startup": "chrome/es-ES/locale/es-ES/devtools/startup/",
+        "mozapps": "chrome/es-ES/locale/es-ES/mozapps/",
+        "messenger-mapi": "chrome/es-ES/locale/es-ES/messenger-mapi/",
+        "autoconfig": "chrome/es-ES/locale/es-ES/autoconfig/",
         "global-platform": {
-          "linux": "chrome/es-ES/locale/es-ES/global-platform/unix/",
           "win": "chrome/es-ES/locale/es-ES/global-platform/win/",
+          "linux": "chrome/es-ES/locale/es-ES/global-platform/unix/",
           "android": "chrome/es-ES/locale/es-ES/global-platform/unix/",
           "macosx": "chrome/es-ES/locale/es-ES/global-platform/mac/"
         },
+        "pipnss": "chrome/es-ES/locale/es-ES/pipnss/",
+        "messenger-newsblog": "chrome/es-ES/locale/es-ES/messenger-newsblog/",
+        "places": "chrome/es-ES/locale/es-ES/places/",
+        "necko": "chrome/es-ES/locale/es-ES/necko/",
+        "devtools-shared": "chrome/es-ES/locale/es-ES/devtools/shared/",
+        "passwordmgr": "chrome/es-ES/locale/es-ES/passwordmgr/",
         "lightning": "chrome/es-ES/locale/es-ES/lightning/",
-        "messenger-smime": "chrome/es-ES/locale/es-ES/messenger-smime/",
-        "devtools-startup": "chrome/es-ES/locale/es-ES/devtools/startup/",
-        "branding": "chrome/es-ES/locale/es-ES/branding/"
+        "chat": "chrome/es-ES/locale/es-ES/chat/",
+        "calendar": "chrome/es-ES/locale/es-ES/calendar/",
+        "global": "chrome/es-ES/locale/es-ES/global/",
+        "messenger-region": "chrome/es-ES/locale/es-ES/messenger-region/",
+        "pippki": "chrome/es-ES/locale/es-ES/pippki/"
       },
-      "version": "20200405151330"
+      "version": "20200419163537"
     }
   },
-  "version": "76.0buildid20200407173003"
+  "langpack_id": "es-ES"
 }
diff --git a/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl
index 24a2d5a6f648..0d79960b4cd9 100644
--- a/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/et/localization/et/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Paigalda lisa failist…
     .accesskey = P
 help-button = Lisade kasutajatugi
+sidebar-help-button-title =
+    .title = Lisade kasutajatugi
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name }i sätted
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Tööriistad kõigile lisadele
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name }i sätted
+           *[other] { -brand-short-name }i eelistused
+        }
 show-unsigned-extensions-button =
     .label = Mõnda laiendust polnud võimalik verifitseerida
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Saadaolevad uuendused
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Soovitused
+addon-category-discover-title =
+    .title = Soovitused
 addon-category-extension = Laiendused
+addon-category-extension-title =
+    .title = Laiendused
 addon-category-theme = Teemad
+addon-category-theme-title =
+    .title = Teemad
 addon-category-plugin = Pluginad
+addon-category-plugin-title =
+    .title = Pluginad
 addon-category-dictionary = Sõnaraamatud
+addon-category-dictionary-title =
+    .title = Sõnaraamatud
 addon-category-locale = Keeled
+addon-category-locale-title =
+    .title = Keeled
 addon-category-available-updates = Saadaolevad uuendused
+addon-category-available-updates-title =
+    .title = Saadaolevad uuendused
 addon-category-recent-updates = Hiljutised uuendused
+addon-category-recent-updates-title =
+    .title = Hiljutised uuendused
 
 ## These are global warnings
 
@@ -312,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Näita vähem
 go-back-button =
     .tooltiptext = Mine tagasi
+header-back-button =
+    .title = Mine tagasi
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/et/localization/et/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/et/localization/et/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..df980adf0d3d
--- /dev/null
+++ b/thunderbird-l10n/et/localization/et/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Käivitatud on { -brand-product-name }i vanem versioon
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Loo uus profiil
+profiledowngrade-sync = Vanema { -brand-product-name }i versiooni kasutamine võib rikkuda järjehoidjad ning veebilehitsemise ajaloo, mis on olemasolevasse profiili juba salvestatud. Oma andmete kaitsmiseks soovitame luua selle { -brand-short-name }i paigalduse jaoks uue profiili. Sa võid alati sisse logida { -fxaccount-brand-name }ga ja erinevate profiilide vahel oma järjehoidjad ja veebilehitsemise ajaloo sünkroniseerida.
+profiledowngrade-nosync = Vanema { -brand-product-name }i versiooni kasutamine võib rikkuda järjehoidjad ning veebilehitsemise ajaloo, mis on olemasolevasse profiili juba salvestatud. Oma andmete kaitsmiseks soovitame luua selle { -brand-short-name }i paigalduse jaoks uue profiili.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Välju
+           *[other] Välju
+        }
diff --git a/thunderbird-l10n/et/manifest.json b/thunderbird-l10n/et/manifest.json
index 6aac495347b3..4dc4a68195de 100644
--- a/thunderbird-l10n/et/manifest.json
+++ b/thunderbird-l10n/et/manifest.json
@@ -1,5 +1,17 @@
 {
+  "manifest_version": 2,
+  "name": "Estonian Language Pack",
   "author": "mozilla.org (contributors: Sander Lepik, Marek Laane, Ain Vagula)",
+  "version": "76.0buildid20200420212409",
+  "applications": {
+    "gecko": {
+      "id": "langpack-et@thunderbird.mozilla.org",
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0"
+    }
+  },
+  "description": "Language pack for Thunderbird for et",
+  "langpack_id": "et",
   "sources": {
     "browser": {
       "base_path": "browser/"
@@ -7,51 +19,39 @@
   },
   "languages": {
     "et": {
-      "version": "20200403074527",
+      "version": "20200415054913",
       "chrome_resources": {
         "messenger-region": "chrome/et/locale/et/messenger-region/",
-        "global": "chrome/et/locale/et/global/",
-        "alerts": "chrome/et/locale/et/alerts/",
-        "devtools-shared": "chrome/et/locale/et/devtools/shared/",
-        "autoconfig": "chrome/et/locale/et/autoconfig/",
+        "devtools-startup": "chrome/et/locale/et/devtools/startup/",
+        "communicator": "chrome/et/locale/et/communicator/",
+        "branding": "chrome/et/locale/et/branding/",
+        "pippki": "chrome/et/locale/et/pippki/",
         "pluginproblem": "chrome/et/locale/et/pluginproblem/",
+        "devtools": "chrome/et/locale/et/devtools/client/",
+        "passwordmgr": "chrome/et/locale/et/passwordmgr/",
+        "alerts": "chrome/et/locale/et/alerts/",
+        "mozldap": "chrome/et/locale/et/mozldap/",
+        "messenger-mapi": "chrome/et/locale/et/messenger-mapi/",
         "global-platform": {
           "macosx": "chrome/et/locale/et/global-platform/mac/",
           "win": "chrome/et/locale/et/global-platform/win/",
-          "android": "chrome/et/locale/et/global-platform/unix/",
-          "linux": "chrome/et/locale/et/global-platform/unix/"
+          "linux": "chrome/et/locale/et/global-platform/unix/",
+          "android": "chrome/et/locale/et/global-platform/unix/"
         },
-        "messenger-mapi": "chrome/et/locale/et/messenger-mapi/",
-        "branding": "chrome/et/locale/et/branding/",
-        "passwordmgr": "chrome/et/locale/et/passwordmgr/",
-        "pippki": "chrome/et/locale/et/pippki/",
-        "devtools": "chrome/et/locale/et/devtools/client/",
-        "communicator": "chrome/et/locale/et/communicator/",
+        "lightning": "chrome/et/locale/et/lightning/",
+        "calendar": "chrome/et/locale/et/calendar/",
         "necko": "chrome/et/locale/et/necko/",
+        "mozapps": "chrome/et/locale/et/mozapps/",
+        "devtools-shared": "chrome/et/locale/et/devtools/shared/",
         "places": "chrome/et/locale/et/places/",
-        "devtools-startup": "chrome/et/locale/et/devtools/startup/",
+        "autoconfig": "chrome/et/locale/et/autoconfig/",
+        "global": "chrome/et/locale/et/global/",
+        "messenger": "chrome/et/locale/et/messenger/",
+        "messenger-smime": "chrome/et/locale/et/messenger-smime/",
         "pipnss": "chrome/et/locale/et/pipnss/",
-        "calendar": "chrome/et/locale/et/calendar/",
-        "mozldap": "chrome/et/locale/et/mozldap/",
         "messenger-newsblog": "chrome/et/locale/et/messenger-newsblog/",
-        "messenger-smime": "chrome/et/locale/et/messenger-smime/",
-        "lightning": "chrome/et/locale/et/lightning/",
-        "mozapps": "chrome/et/locale/et/mozapps/",
-        "messenger": "chrome/et/locale/et/messenger/",
         "chat": "chrome/et/locale/et/chat/"
       }
     }
-  },
-  "name": "Estonian Language Pack",
-  "description": "Language pack for Thunderbird for et",
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "et",
-  "manifest_version": 2,
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-et@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
-    }
   }
 }
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties
index 7e036c37d161..251987902566 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Elementu honek korritu daitekeen gainezkatzea
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Erlazionatutako erregelarik ez
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Mantendu Shift sakatuta eta egin klik araura saltatzeko
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties
index 33994804efc9..d27f045f8cd2 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=%1$S estilo-orria CSS gisa kargatu da bere MIME mota, "%2$S", "te
 
 PEUnexpEOF2=Espero ez zen fitxategi amaiera %1$S bilatzean.
 PEParseRuleWSOnly=Emandako zuriune bakarreko katea arau bezala analizatuko da.
+
 PEDeclDropped=Deklarazioa albo batera utzita.
 PEDeclSkipped=Hurrengo deklaraziora salto egin da.
 PEUnknownProperty='%1$S' propietate ezezaguna.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Azpi-saretaren izen-zerrendan repeat(a
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Track-zerrendan repeat(auto-fill, …) edo repeat(auto-fit, …) bakarra onartzen da.
 PEMoreThanOneGridRepeatTrackSize=Track-tamaina bakarra onartzen da repeat(auto-fit/auto-fill, …) barnean.
 
+PEDisallowedImportRule=@import  arauak ez dira oraindik baliozkoak eraikitako estilo orrietan
+
 TooLargeDashedRadius=Ertzaren erradioa handiegia da 'dashed' estilorako (muga 100000px da). Solido gisa errendatzen.
 TooLargeDottedRadius=Ertzaren erradioa handiegia da 'dotted' estilorako (muga 100000px da). Solido gisa errendatzen.
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties
index 6bfba4a13a9e..e99ab2f64731 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Kargatzea ukatu du "%2$S" helbideko X-Frame-Options:"%1$S" balioak, gu
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Kargatzea ukatu du "%2$S" helbideko X-Frame-Options:"%1$S" balioak, guneak ez baitu jatorri gurutzatuko markorik baimentzen "%3$S" dokumentutik.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = X-Frame-Options goiburu baliogabea aurkitu da "%2$S" kargatzean: "%1$S" ez da baliozko direktiba.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny="X-Frame-Options" direktibaren "%1$S" balioak "%2$S" markoa kargatzea eragozten du.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Segurua ez den "%1$S" eskaera "%2$S" erabiltzeko bertsio-berritzen.
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties
index ad4bc07b2ee4..f0f58fe82a82 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/addons.properties
@@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=Ezin izan da %S instalatu egonkortasun- eta segurta
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header=Gehitu %S?
 
+# %S is brandShortName
+webextPerms.experimentWarning=Asmo txarreko gehigarriek zure informazio pertsonala lapurtu edo zure ordenagailua arriskuan jar dezakete. Instalatu gehigarri hau iturburu fidagarrikoa bada soilik.
 webextPerms.unsignedWarning=Kontuz: gehigarri hau egiaztatu gabe dago. Asmo txarreko gehigarriek zure informazio pertsonala lapurtu edo zure ordenagailua arriskuan jar dezakete. Instalatu gehigarri hau iturburu fidagarrikoa bada soilik.
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -194,6 +196,9 @@ webextPerms.description.devtools=Garatzaile-tresnak hedatu eta irekitako fitxeta
 webextPerms.description.dns=IP helbide eta ostalari-izenetarako sarbidea
 webextPerms.description.downloads=Fitxategiak deskargatzea eta nabigatzailearen deskarga-historia irakurri eta aldatzea
 webextPerms.description.downloads.open=Zure ordenagailura deskargatutako fitxategiak irekitzea
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment=Osoa eduki, mugarik gabeko sarrera %S-(e)ra eta zure ordenagailura
 webextPerms.description.find=Irekitako fitxa guztietako testua irakurtzea
 webextPerms.description.geolocation=Zure kokapena atzitzea
 webextPerms.description.history=Nabigatze-historia atzitzea
@@ -258,9 +263,3 @@ webext.remove.confirmation.title=Kendu %S
 # %2$S is brandShorterName
 webext.remove.confirmation.message=Kendu %1$S %2$S(e)tik?
 webext.remove.confirmation.button=Kendu
-
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd
index f570af972b40..18a6ea2c8dd9 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/customizeToolbar.dtd
@@ -15,8 +15,7 @@
 <!ENTITY addNewToolbar.label      "Gehitu tresna-barra berria">
 <!ENTITY showTitlebar.label       "Erakutsi titulu-barra">
 <!ENTITY extraDragSpace.label     "Gehitu arrastatu zuriunea">
+<!ENTITY showTitlebar2.label      "Titulu-barra">
+<!ENTITY extraDragSpace2.label    "Arrastatu zuriunea">
 <!ENTITY saveChanges.label        "Eginda">
 <!ENTITY undoChanges.label        "Desegin aldaketak">
-
-<!ENTITY showTitlebar2.label      "Title Bar">
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties
index 61f94b22976c..071d3f0bddf2 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/imapMsgs.properties
@@ -199,12 +199,22 @@ imapSubscribePrompt=%1$S berri-taldera harpidetu nahi duzu?
 
 imapServerDroppedConnection=Ezin da zure IMAP zerbitzarira konektatu. Agian zerbitzariak onartzen duen gehieneko konexio kopurua gainditu duzu. Hala bada, erabili IMAP zerbitzariaren ezarpen aurreratuen elkarrizketa katxeatutako konexio kopurua murrizteko.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Kuota-informazioa ezin da eskuratu karpeta ireki gabe dagoelako.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Zerbitzari honek ez du kuotaren euskarririk.
 
 imapQuotaStatusNoQuota=Karpeta honetan ez dago kuotaren mugarik.
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2=Karpeta honek ez du kuota informaziorik ematen.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=Kuota informazioa ez dago eskuragarri.
+
 # Out of memory
 imapOutOfMemory=Aplikazioak ez dauka memoria librerik.
 
@@ -256,9 +266,3 @@ imapFolderCommandFailed='%2$S' karpetaren gaineko uneko uneko eragiketak huts eg
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert=%1$S kontuaren abisua: %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd
index 63d228806950..ac0f1d8ecb2b 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.dtd
@@ -289,8 +289,10 @@
 <!ENTITY searchMailCmd.label "Bilatu mezuak…">
 <!ENTITY searchMailCmd.accesskey "B">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Bilaketa globala…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Bilatu helbideak…">
-<!ENTITY searchAddressesCmd.accesskey "B">
+<!ENTITY searchAddressesCmd.accesskey "h">
 
 <!-- Go Menu -->
 <!ENTITY goMenu.label "Joan">
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties
index 147c75ca91b7..e603c8cbf0ef 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/messenger.properties
@@ -318,6 +318,7 @@ irakurtzeko. Hau egiteko, aukeratu lineaz kanpo fitxategia menuan eta aukeratu\
 
 # accountCentral
 mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat=%1$S %2$S - %3$S
 mailAcctType=Posta
@@ -465,11 +466,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=%S KB / %S KB erabilita
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=%%%S beteta
 # for quota in main window (commandglue.js)
 percent=%%%S
 quotaTooltip=IMAP kuota: %S KB / %S KB erabilita. Egin klik xehetasunak jasotzeko.
 
+quotaTooltip2=IMAP kuota: %Stik %S erabilita. Egin klik xehetasunak jasotzeko.
+
 # for message views
 confirmViewDeleteTitle=Berretsi
 confirmViewDeleteMessage=Ziur zaude bista hau ezabatu nahi duzula?
@@ -805,5 +810,3 @@ errorConsoleTitle = Errore-kontsola
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = Atzera
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties
index 3dc06b96beb8..b077303dd271 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Zifratutako OpenPGP mezu bat da hau.<br>Mezu hau deszifratzeko, <a href="%S">OpenPGP gehigarri bat</a> instalatu behar duzu.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Hau zifratutako OpenPGP mezua da, baina OpenPGP deszifratzeko euskarria ez dago erabilgarri.
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd
index c74034225ea5..2abd1b9c4ea0 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label         "Kendu">
 <!ENTITY removeSearchEngine.accesskey     "K">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
-<!ENTITY minimizeToTray.accesskey         "m">
+<!ENTITY minimizeToTray.label             "&brandShortName; txikitzen denean, mugitu erretilura">
+<!ENTITY minimizeToTray.accesskey         "t">
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties
index e22c6e6fe295..cc32f46ac317 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Biltegiratzea atzitzea automatikoki b
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Biltegiratzea atzitzea automatikoki baimendu da "%2$S" jarraipen-elementuarentzat "%1$S" helbidean.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Biltegiratzearen sarbidea automatikoki baimendu da lehenengo mailako isolamenduko “%2$S”(r)ako “%1$S” helbidean.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure="%1$S" cookiea baztertu egin da "sameSite=none" atributua izanagatik ere "secure" atributua falta duelako.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties b/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties
index e1458aa0f4b0..c397ad1d2cfb 100644
--- a/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties
+++ b/thunderbird-l10n/eu/chrome/eu/locale/eu/pipnss/nsserrors.properties
@@ -172,8 +172,8 @@ SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE=Ziurtagiri jaukitzailearen ziurtagiria irau
 SEC_ERROR_CRL_EXPIRED=Ziurtagiri jaulkitzailearen CRLa iraungita dago. Egunera ezazu edo egiaztatu zure sistemaren data eta ordua.
 SEC_ERROR_CRL_BAD_SIGNATURE=Ziurtagiri jaulkitzailearen CRL-ak sinadura baliogabe bat du.
 SEC_ERROR_CRL_INVALID=CRL berriak formatu baliogabea du.
-SEC_ERROR_EXTENSION_VALUE_INVALID=Ziurtagiri hedapena balioa baliogabea da.
-SEC_ERROR_EXTENSION_NOT_FOUND=Ziurtagiri hedapena ez da aurkitu.
+SEC_ERROR_EXTENSION_VALUE_INVALID=Ziurtagiri-hedapenaren balioa baliogabea da.
+SEC_ERROR_EXTENSION_NOT_FOUND=Ez da ziurtagiri-hedapena aurkitu.
 SEC_ERROR_CA_CERT_INVALID=Jaulkitzaile ziurtagiria baliogabea da.
 SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID=Ziurtagiri kokapen luzera murriztapena baliogabea da.
 SEC_ERROR_CERT_USAGES_INVALID=Ziurtagiri erabilera balioa baliogabea da.
@@ -308,7 +308,7 @@ SEC_ERROR_LIBPKIX_INTERNAL=Libpkix barne-errorea gertatu da ziurtagiriaren balid
 SEC_ERROR_PKCS11_GENERAL_ERROR=PKCS #11 modulu batek CKR_GENERAL_ERROR itzuli du, errore berreskuraezina gertatu dela adieraziz.
 SEC_ERROR_PKCS11_FUNCTION_FAILED=PKCS #11 modulu batek CKR_FUNCTION_FAILED itzuli du, eskatutako funtzio bat ezin dela burutu adieraziz. Eragiketa berdina berriro saiatuz ondo burutu liteke.
 SEC_ERROR_PKCS11_DEVICE_ERROR=PKCS #11 modulu batek CKR_DEVICE_ERROR itzuli du, token-arekin edo slot-arekin arazo bat gertatu dela adieraziz.
-SEC_ERROR_BAD_INFO_ACCESS_METHOD=Informazioa atzitzeko metodo ezezaguna ziurtagiriaren luzapenean.
+SEC_ERROR_BAD_INFO_ACCESS_METHOD=Informazioa atzitzeko metodo ezezaguna ziurtagiri-hedapenean.
 SEC_ERROR_CRL_IMPORT_FAILED=Errorea CRL bat inportatzen saiatzean.
 SEC_ERROR_EXPIRED_PASSWORD=Pasahitza iraungi da.
 SEC_ERROR_LOCKED_PASSWORD=Pasahitza blokeatuta dago.
diff --git a/thunderbird-l10n/eu/localization/eu/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/eu/localization/eu/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..c19b3b662f7b
--- /dev/null
+++ b/thunderbird-l10n/eu/localization/eu/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Egutegi URI berbideraketa
+calendar-uri-redirect-description =
+    Zerbitzaria "{ $calendarName }" egutegiaren URI berbideraketa egiten dabil.
+    Onartu berbideraketa eta hasi erabiltzen URI berria egutegi honentzat?
+calendar-uri-redirect-original-uri-label = Uneko URIa:
+calendar-uri-redirect-target-uri-label = URI berrira berbideratzen:
diff --git a/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl b/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl
index 3005631f6cdc..c3a891fea754 100644
--- a/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/eu/localization/eu/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Ongi etorri { -brand-full-name }(e)ra
+account-settings = Kontu-ezarpenak
+#   $accounts (Number) - the number of configured accounts
 setup-title = Aukeratu zer konfiguratu
 about-title = { -brand-full-name }(r)i buruz
 resources-title = Baliabideak
@@ -22,8 +24,28 @@ filelink-label = Filelink
 filelink-description = { -brand-short-name } filelink hodeiko kontua konfiguratzen uzten dizu eranskin handiak modu errazean bidaltzeko.
 addressbook-label = Helbide-liburua
     .aria-label = Sortu Helbide-liburu berria
+addressbook-description = { -brand-short-name } zure kontaktu guztiak helbide liburuan antolatzen dizkizu. Urrutiko helbide liburu batera ere konekta zintezke zure kontaktu guztiak sinkronizatuta mantentzeko.
+feeds-label = Jarioak
+    .aria-label = Jarioetara konektatu
+feeds-description = { -brand-short-name } RSS/Atom jarioetara konektatzen zaitu berriak eta inguru guztiko eguneratzeak jasotzeko.
+newsgroups-label = Berri-taldeak
+    .aria-label = Berri-taldeetara konektatu
+newsgroups-description = { -brand-short-name } nahi duzun berri-taldeetara konektatzen zaitu.
+import-title = Inportatu beste programa batetik…
+import-paragraph = { -brand-short-name } posta-mezuak, helbide-liburu sarrerak, jario harpidetzak, ezarpenak edota iragazkiak inportatzen dizu beste posta programa batetik eta ohiko helbide-liburu formatuetatik.
+import-label = Inportatu
+    .aria-label = Inportatu datuak beste programa batzuetatik
+about-paragraph = Thunderbird da kode irekiko posta eta egutegi bezero plataforma-anitz bakarra, dohakoa negoziorako nahiz erabilera pertsonalerako. Seguru mantendu eta are hobe bilaka dadin nahi dugu. Dohaintzak garatzaileak kontratatzea ahalbidetzen digu, azpiegiturak ordaindu eta hobetzen jarraitu.
+about-paragraph-2 = <b>Thunderbird zu bezalako erabiltzaileek babestua dago! Thunderbird gogoko baduzu pentsa ezazu dohaintza bat egitean.</b>Thunderbird eskuragarri mantenduko dela ziurtatzea nahi izanez gero
 about-donation = egin dohaintza
 explore-link = Eginbideak esploratu
 support-link = Laguntza
 involved-link = Parte hartu
 developer-link = Garatzaileentzako dokumentazioa
+read = Irakurri mezuak
+compose = Idatzi mezu berria
+search = Bilatu mezuak
+filter = Kudeatu mezu-iragazkiak
+nntp-subscription = Kudeatu berri-taldeetako harpidetzak
+rss-subscription = Kudeatu jario harpidetzak
+e2e = Muturretik muturrerako enkriptatzea
diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl
index 14b7397b7f18..a62b9c3cfd55 100644
--- a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalatu gehigarria fitxategitik…
     .accesskey = I
 help-button = Gehigarrien laguntza
+sidebar-help-button-title =
+    .title = Gehigarrien laguntza
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } aukerak
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Tresnak gehigarri guztientzat
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } aukerak
+           *[other] { -brand-short-name } hobespenak
+        }
 show-unsigned-extensions-button =
     .label = Zenbait gehigarri ezin izan dira egiaztatu
 show-all-extensions-button =
@@ -163,13 +171,29 @@ extensions-view-available-updates =
     .name = Eguneraketak eskura
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Gomendioak
+addon-category-discover-title =
+    .title = Gomendioak
 addon-category-extension = Hedapenak
+addon-category-extension-title =
+    .title = Hedapenak
 addon-category-theme = Itxurak
+addon-category-theme-title =
+    .title = Itxurak
 addon-category-plugin = Pluginak
+addon-category-plugin-title =
+    .title = Pluginak
 addon-category-dictionary = Hiztegiak
+addon-category-dictionary-title =
+    .title = Hiztegiak
 addon-category-locale = Hizkuntzak
+addon-category-locale-title =
+    .title = Hizkuntzak
 addon-category-available-updates = Eguneraketak eskura
+addon-category-available-updates-title =
+    .title = Eguneraketak eskura
 addon-category-recent-updates = Azken eguneraketak
+addon-category-recent-updates-title =
+    .title = Azken eguneraketak
 
 ## These are global warnings
 
@@ -282,6 +306,7 @@ shortcuts-no-commands = Ondorengo hedapenek ez dute lasterbiderik:
 shortcuts-input =
     .placeholder = Idatzi lasterbidea
 shortcuts-browserAction = Gaitu hedapena
+shortcuts-browserAction2 = Aktibatu tresna-barrako botoia
 shortcuts-pageAction = Gaitu orri-ekintza
 shortcuts-sidebarAction = Txandakatu alboko barra
 shortcuts-modifier-mac = Kontuan hartu Ktrl, Alt edo ⌘
@@ -307,6 +332,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Erakutsi gutxiago
 go-back-button =
     .tooltiptext = Joan atzera
+header-back-button =
+    .title = Joan atzera
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl
index 225fb7ae36df..3ce51aeb47c9 100644
--- a/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/eu/localization/eu/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = edukia
 sandbox-proc-type-file = fitxategiaren edukia
 sandbox-proc-type-media-plugin = multimedia plugina
 sandbox-proc-type-data-decoder = datu-deskodetzailea
+startup-cache-title = Abioko cachea
+startup-cache-disk-cache-path = Diskoko cachearen bide-izena
+startup-cache-ignore-disk-cache = Ezikusi diskoko cachea
+startup-cache-found-disk-cache-on-init = Diskoko cachea aurkitu da abioan
+startup-cache-wrote-to-disk-cache = Diskoko cachera idatzita
 launcher-process-status-0 = Gaituta
 launcher-process-status-1 = Desgaituta hutsegitea dela-eta
 launcher-process-status-2 = Behartuta desgaituta
@@ -310,6 +315,7 @@ touch-enabled = ukipen bidezko sarrera gaituta
 drag-enabled = korritze-barra arrastatzea gaituta
 keyboard-enabled = teklatua gaituta
 autoscroll-enabled = autoscroll gaituta
+zooming-enabled = Atximur-zoom leuna gaituta
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl
index ddfb0a624b20..2ea8585ce90f 100644
--- a/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/eu/localization/eu/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (ziurtagiria)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (katea)
     .download = { $fileName }-katea.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Hedapen hau kritiko gisa markatu da, hau da, bezeroek ziurtagiria ulertzen ez badute, baztertu egin behar dute.
+certificate-viewer-export = Esportatu
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Zure ziurtagiriak
+certificate-viewer-tab-people = Norbanakoak
+certificate-viewer-tab-servers = Zerbitzariak
+certificate-viewer-tab-ca = Autoritateak
+certificate-viewer-tab-unkonwn = Ezezaguna
diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl
index c34a3a90cd6d..4cf0d62af98e 100644
--- a/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/eu/localization/eu/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Isolatutako web edukia
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socketa
diff --git a/thunderbird-l10n/eu/localization/eu/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/eu/localization/eu/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..7b538622c619
--- /dev/null
+++ b/thunderbird-l10n/eu/localization/eu/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = { -brand-product-name }en bertsio zahar bat abiarazi duzu
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Sortu profil berria
+profiledowngrade-sync = { -brand-product-name }en bertsio zahar bat erabiliz gero, dagoeneko { -brand-product-name } profil batean gordetako laster-markak eta nabigazio-historia honda litezke. Zure informazioa babesteko, sortu profil berri bat { -brand-short-name }(r)en instalazio honetarako. Zure laster-markak eta nabigazio-historia profilen artean sinkronizatzeko, { -fxaccount-brand-name }(r)ekin saioa has dezakezu.
+profiledowngrade-nosync = { -brand-product-name }en bertsio zahar bat erabiliz gero, dagoeneko { -brand-product-name } profil batean gordetako laster-markak eta nabigazio-historia honda litezke. Zure informazioa babesteko, sortu profil berri bat { -brand-short-name }(r)en instalazio honetarako.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Irten
+           *[other] Irten
+        }
diff --git a/thunderbird-l10n/eu/manifest.json b/thunderbird-l10n/eu/manifest.json
index bf3cf6120536..3825f130f079 100644
--- a/thunderbird-l10n/eu/manifest.json
+++ b/thunderbird-l10n/eu/manifest.json
@@ -1,57 +1,57 @@
 {
-  "author": "librezale.org (contributors: Librezale.eus)",
-  "applications": {
-    "gecko": {
-      "id": "langpack-eu@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
-  "version": "76.0buildid20200407173003",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
   "name": "Basque Language Pack",
+  "description": "Language pack for Thunderbird for eu",
   "languages": {
     "eu": {
       "chrome_resources": {
-        "necko": "chrome/eu/locale/eu/necko/",
-        "global": "chrome/eu/locale/eu/global/",
-        "communicator": "chrome/eu/locale/eu/communicator/",
+        "chat": "chrome/eu/locale/eu/chat/",
         "places": "chrome/eu/locale/eu/places/",
-        "mozapps": "chrome/eu/locale/eu/mozapps/",
-        "messenger-newsblog": "chrome/eu/locale/eu/messenger-newsblog/",
-        "devtools-shared": "chrome/eu/locale/eu/devtools/shared/",
-        "messenger-smime": "chrome/eu/locale/eu/messenger-smime/",
+        "alerts": "chrome/eu/locale/eu/alerts/",
+        "global": "chrome/eu/locale/eu/global/",
+        "global-platform": {
+          "win": "chrome/eu/locale/eu/global-platform/win/",
+          "android": "chrome/eu/locale/eu/global-platform/unix/",
+          "linux": "chrome/eu/locale/eu/global-platform/unix/",
+          "macosx": "chrome/eu/locale/eu/global-platform/mac/"
+        },
+        "mozldap": "chrome/eu/locale/eu/mozldap/",
+        "autoconfig": "chrome/eu/locale/eu/autoconfig/",
+        "messenger-mapi": "chrome/eu/locale/eu/messenger-mapi/",
+        "necko": "chrome/eu/locale/eu/necko/",
         "lightning": "chrome/eu/locale/eu/lightning/",
-        "pipnss": "chrome/eu/locale/eu/pipnss/",
+        "calendar": "chrome/eu/locale/eu/calendar/",
+        "devtools-shared": "chrome/eu/locale/eu/devtools/shared/",
+        "communicator": "chrome/eu/locale/eu/communicator/",
         "messenger": "chrome/eu/locale/eu/messenger/",
         "pluginproblem": "chrome/eu/locale/eu/pluginproblem/",
+        "branding": "chrome/eu/locale/eu/branding/",
         "pippki": "chrome/eu/locale/eu/pippki/",
-        "calendar": "chrome/eu/locale/eu/calendar/",
+        "messenger-smime": "chrome/eu/locale/eu/messenger-smime/",
+        "passwordmgr": "chrome/eu/locale/eu/passwordmgr/",
         "devtools-startup": "chrome/eu/locale/eu/devtools/startup/",
         "devtools": "chrome/eu/locale/eu/devtools/client/",
-        "passwordmgr": "chrome/eu/locale/eu/passwordmgr/",
-        "mozldap": "chrome/eu/locale/eu/mozldap/",
-        "global-platform": {
-          "linux": "chrome/eu/locale/eu/global-platform/unix/",
-          "macosx": "chrome/eu/locale/eu/global-platform/mac/",
-          "android": "chrome/eu/locale/eu/global-platform/unix/",
-          "win": "chrome/eu/locale/eu/global-platform/win/"
-        },
-        "messenger-mapi": "chrome/eu/locale/eu/messenger-mapi/",
-        "alerts": "chrome/eu/locale/eu/alerts/",
-        "chat": "chrome/eu/locale/eu/chat/",
-        "autoconfig": "chrome/eu/locale/eu/autoconfig/",
-        "branding": "chrome/eu/locale/eu/branding/",
-        "messenger-region": "chrome/eu/locale/eu/messenger-region/"
+        "pipnss": "chrome/eu/locale/eu/pipnss/",
+        "messenger-region": "chrome/eu/locale/eu/messenger-region/",
+        "mozapps": "chrome/eu/locale/eu/mozapps/",
+        "messenger-newsblog": "chrome/eu/locale/eu/messenger-newsblog/"
       },
-      "version": "20200403092412"
+      "version": "20200420093436"
+    }
+  },
+  "author": "librezale.org (contributors: Librezale.eus)",
+  "version": "76.0buildid20200420212409",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-eu@thunderbird.mozilla.org"
     }
   },
   "manifest_version": 2,
-  "langpack_id": "eu",
-  "description": "Language pack for Thunderbird for eu"
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "langpack_id": "eu"
 }
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties
index 70eeba051861..078774570858 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=No associated rule
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties
index 0ba49ff19b92..f1d7417321ab 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      erotin
 tabPanel     =      välilehtipaneeli
 # The roleDescription for the html:mark element
 highlight = korostus
-
 # The roleDescription for the details element
-details = details
+details = lisätiedot
 # The roleDescription for the summary element
-summary = summary
+summary = yhteenveto
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties
index d0f43c58f628..0371d57df107 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type,
 
 PEUnexpEOF2=Unexpected end of file while searching for %1$S.
 PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule.
+
 PEDeclDropped=Declaration dropped.
 PEDeclSkipped=Skipped to next declaration.
 PEUnknownProperty=Unknown property '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Only one repeat(auto-fill, …) is all
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Only one repeat(auto-fill, …) or repeat(auto-fit, …) is allowed in a track list.
 PEMoreThanOneGridRepeatTrackSize=Only one track size is allowed inside repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=@import rules are not yet valid in constructed stylesheets.
+
 TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid.
 TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid.
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties
index a7f7e93a17ee..6b4b9ea79088 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/dom/dom.properties
@@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=MathML attributes “background”, “co
 MathML_DeprecatedXLinkAttributeWarning=XLink attributes “href”, “type”, “show” and “actuate” are deprecated on MathML elements and will be removed at a future date.
 WebShareAPI_Failed=Jakamisoperaatio on epäonnistunut.
 WebShareAPI_Aborted=Jakamisoperaatio keskeytettiin.
-
 # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
-UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol.
+UnknownProtocolNavigationPrevented=Estettiin siirtyminen osoitteeseen “%1$S” tuntemattoman protokollan takia.
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties
index 3619fb2d0d74..99a7c60afbad 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/layout_errors.properties
@@ -39,7 +39,6 @@ CompositorAnimationWarningTransformFrameInactive=Animation cannot be run on the
 CompositorAnimationWarningTransformIsBlockedByImportantRules=Transform animation cannot be run on the compositor because transform-related properties are overridden by !important rules
 CompositorAnimationWarningOpacityFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for ‘opacity’ animation
 CompositorAnimationWarningHasRenderingObserver=Animation cannot be run on the compositor because the element has rendering observers (-moz-element or SVG clipping/masking)
-
 CompositorAnimationWarningHasCurrentColor=Animations of ‘background-color’ cannot be run on the compositor with ‘current-color’ keyframe.
 
 ## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0"
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties
index ba8cdd3338aa..21d667d95ac9 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Load denied by X-Frame-Options: “%1$S” from “%2$S”, site does not permit cross-origin framing from “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Invalid X-Frame-Options header was found when loading “%2$S”: “%1$S” is not a valid directive.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=The loading of “%2$S” in a frame is denied by “X-Frame-Options“ directive set to “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Päivitetään suojaamaton pyyntö “%1$S” käyttämään skeemaa “%2$S”.
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties
index a862b4d6373a..a5b77c56e22d 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/addons.properties
@@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=Lisäosaa %S ei voitu asentaa, koska sen on raporto
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header=Lisätäänkö %S?
 
+# %S is brandShortName
+webextPerms.experimentWarning=Haitalliset lisäosat voivat varastaa yksityisiä tietojasi tai vaarantaa tietokoneesi. Asenna tämä lisäosa vain, jos luotat lähteeseen.
 webextPerms.unsignedWarning=Varoitus: Tämä lisäosa on varmentamaton. Haitalliset lisäosat voivat varastaa yksityisiä tietoja tai vaarantaa tietokoneesi turvallisuuden. Asenna tämä lisäosa vain, jos luotat lähteeseen.
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -194,6 +196,9 @@ webextPerms.description.devtools=Laajenna kehitystyökaluja käyttämään avoim
 webextPerms.description.dns=Käytä IP-osoite- ja palvelinnimitietoja
 webextPerms.description.downloads=Lataa tiedostoja sekä lue ja muokkaa selaimen lataushistoriaa
 webextPerms.description.downloads.open=Avaa tietokoneellesi ladattuja tiedostoja
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment=Hanki täydellinen ja rajoittamattoman pääy %Siin ja tietokoneellesi
 webextPerms.description.find=Lue kaikkien avointen välilehtien tekstiä
 webextPerms.description.geolocation=Käytä sijaintiasi
 webextPerms.description.history=Käytä selaushistoriaa
@@ -258,9 +263,3 @@ webext.remove.confirmation.title=Poista %S
 # %2$S is brandShorterName
 webext.remove.confirmation.message=Poistetaanko %1$S %2$Sistä?
 webext.remove.confirmation.button=Poista
-
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd
index 41f7cf68a3e2..0aa5c7ab89a0 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/customizeToolbar.dtd
@@ -16,7 +16,6 @@
 <!ENTITY showTitlebar.label       "Näytä otsikkopalkki">
 <!ENTITY extraDragSpace.label     "Lisää tyhjää tilaa vetämistä varten">
 <!ENTITY showTitlebar2.label      "Otsikkopalkki">
+<!ENTITY extraDragSpace2.label    "Lisää tyhjää tilaa">
 <!ENTITY saveChanges.label        "Valmis">
 <!ENTITY undoChanges.label        "Peruuta muutokset">
-
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties
index b1dbdd580096..0fb95291769e 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/imapMsgs.properties
@@ -201,12 +201,22 @@ imapServerDroppedConnection=IMAP-palvelimeen ei saatu yhteyttä. Olet saattanut
 palvelimelle. Tällaisessa tapauksessa vähennä välimuistissa olevien yhteyksien määrää \
 IMAP-palvelimen Lisäasetukset-ikkunasta.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Kiintiötietoa ei ole saatavilla, koska kansio ei ole auki.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Tämä palvelin ei tue kiintiöitä.
 
 imapQuotaStatusNoQuota=Tällä kansiolla ei ole tilakiintiötä.
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2=Tällä kansiolla ei ole kiintiötietoja.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=Kiintiötietoja ei ole vielä saatavilla.
+
 # Out of memory
 imapOutOfMemory=Sovellukselle ei ole tarpeeksi muistia.
 
@@ -258,9 +268,3 @@ imapFolderCommandFailed=Operaatio kansiolle "%2$S" ei onnistunut. Tilin %1$S pos
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert=Hälytys tilille %1$S: %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd
index dbc62b7f7ebd..abd959ca4f3f 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Etsi viesteistä…">
 <!ENTITY searchMailCmd.accesskey "v">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Globaali haku…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Etsi osoitekirjasta…">
 <!ENTITY searchAddressesCmd.accesskey "o">
 
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties
index 3917cae9a23e..e025e641c046 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/messenger.properties
@@ -317,6 +317,7 @@ levytilan käyttöasetukset, jotta suurikokoisia viestejä ei ladata.
 
 # accountCentral
 mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat=%1$S %2$S - %3$S
 mailAcctType=Sähköposti
@@ -464,11 +465,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=%S / %S kt käytössä
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=%S %% täynnä
 # for quota in main window (commandglue.js)
 percent=%S %%
 quotaTooltip=IMAP-kiintiö: %S kt käytetty %S kt:sta. Lue tiedot napsauttamalla.
 
+quotaTooltip2=IMAP-kiintiö: %S/%S käytetty. Lue lisätietoja napsauttamalla.
+
 # for message views
 confirmViewDeleteTitle=Vahvista
 confirmViewDeleteMessage=Poistetaanko tämä näkymä?
@@ -804,5 +809,3 @@ errorConsoleTitle = Virhekonsoli
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = Takaisin
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties
index c8cb91d50d73..5d7c04e2c76d 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Tämä on salakirjoitettu OpenPGP-viesti.<br>Jotta voit purkaa ja lukea viestin, asenna <a href="%S">OpenPGP-lisäosa</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Tämä on salattu OpenPGP-viesti, mutta tukea OpenPGP-salauksen purkamiselle ei ole saatavana.
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd
index 484c6daa35a7..125fc06b10d1 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label         "Poista">
 <!ENTITY removeSearchEngine.accesskey     "p">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
-<!ENTITY minimizeToTray.accesskey         "m">
+<!ENTITY minimizeToTray.label             "Kun &brandShortName; on pienennetty, piilota se">
+<!ENTITY minimizeToTray.accesskey         "p">
diff --git a/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties b/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties
index be2492c9cf84..39f24918179f 100644
--- a/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties
+++ b/thunderbird-l10n/fi/chrome/fi/locale/fi/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Tallennustilan käyttöoikeus myönne
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Tallennustilan käyttöoikeus myönnettiin automaattisesti seuraimelle ”%2$S” osoitteesta ”%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Storage access automatically granted for First-Party isolation “%2$S” on “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/fi/localization/fi/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/fi/localization/fi/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..6721c8bb7d44
--- /dev/null
+++ b/thunderbird-l10n/fi/localization/fi/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,8 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Kalenterin URI-uudelleenohjaus
+calendar-uri-redirect-original-uri-label = Nykyinen URI:
+calendar-uri-redirect-target-uri-label = Uudelleenohjattu uusi URI:
diff --git a/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl
index 3192b1bfde55..b1291bf3acdc 100644
--- a/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/fi/localization/fi/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = The connected browser has an old versi
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = The Debugger panel may not work with the connected browser. Please use Firefox { $runtimeVersion } if you need to use the Debugger with this browser.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = This version of Firefox cannot debug Firefox for Android (68). We recommend installing Firefox for Android Nightly on your phone for testing. <a>More details</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl b/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl
index c5a8e4e34046..e7a98705f2c6 100644
--- a/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/fi/localization/fi/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Tervetuloa { -brand-full-name }iin
+account-settings = Tilin asetukset
+#   $accounts (Number) - the number of configured accounts
 setup-title = Valitse mitä asennetaan
 about-title = Tietoja { -brand-full-name }ista
 resources-title = Resurssit
@@ -40,3 +42,10 @@ explore-link = Tutustu ominaisuuksiin
 support-link = Tuki
 involved-link = Tule mukaan
 developer-link = Kehittäjien dokumentaatio
+read = Lue viestejä
+compose = Kirjoita uusi viesti
+search = Hae viestejä
+filter = Hallitse viestisuodattimia
+nntp-subscription = Hallitse keskusteluryhmien tilauksia
+rss-subscription = Hallitse syötetilauksia
+e2e = Päästä päähän -salaus
diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl
index b896bb863570..bdbc03163973 100644
--- a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Asenna lisäosa tiedostosta…
     .accesskey = A
 help-button = Lisäosien tuki
+sidebar-help-button-title =
+    .title = Lisäosien tuki
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name }-asetukset
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Työkaluja kaikille lisäosille
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name }-asetukset
+           *[other] { -brand-short-name }-asetukset
+        }
 show-unsigned-extensions-button =
     .label = Joitain laajennuksia ei voitu varmentaa
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Päivitykset
     .tooltiptext = Saatavilla olevat päivitykset
 addon-category-discover = Suositukset
+addon-category-discover-title =
+    .title = Suositukset
 addon-category-extension = Laajennukset
+addon-category-extension-title =
+    .title = Laajennukset
 addon-category-theme = Teemat
+addon-category-theme-title =
+    .title = Teemat
 addon-category-plugin = Liitännäiset
+addon-category-plugin-title =
+    .title = Liitännäiset
 addon-category-dictionary = Oikoluvut
+addon-category-dictionary-title =
+    .title = Oikoluvut
 addon-category-locale = Kielet
+addon-category-locale-title =
+    .title = Kielet
 addon-category-available-updates = Päivitykset
+addon-category-available-updates-title =
+    .title = Päivitykset
 addon-category-recent-updates = Tuoreet päivitykset
+addon-category-recent-updates-title =
+    .title = Tuoreet päivitykset
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Seuraavilla laajennuksilla ei ole pikanäppäimiä:
 shortcuts-input =
     .placeholder = Kirjoita näppäinyhdistelmä
 shortcuts-browserAction = Aktivoi laajennus
+shortcuts-browserAction2 = Aktivoi työkalupalkin painike
 shortcuts-pageAction = Aktivoi sivutoiminto
 shortcuts-sidebarAction = Näytä/piilota sivupaneeli
 shortcuts-modifier-mac = Paina Ctrl-, Alt- tai ⌘-näppäintä
@@ -312,6 +337,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Näytä vähemmän
 go-back-button =
     .tooltiptext = Takaisin
+header-back-button =
+    .title = Takaisin
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl
index 95e7a8e173a6..2cef092e9dfc 100644
--- a/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/fi/localization/fi/toolkit/about/aboutSupport.ftl
@@ -286,6 +286,11 @@ sandbox-proc-type-content = sisältö
 sandbox-proc-type-file = tiedostojen sisältö
 sandbox-proc-type-media-plugin = medialiitännäinen
 sandbox-proc-type-data-decoder = datan purkaja
+startup-cache-title = Käynnistyksen välimuisti
+startup-cache-disk-cache-path = Levyvälimuistin polku
+startup-cache-ignore-disk-cache = Ohita levyvälimuisti
+startup-cache-found-disk-cache-on-init = Levyvälimuisti löytyi alustuksessa
+startup-cache-wrote-to-disk-cache = Kirjoitettiin levyvälimuistiin
 launcher-process-status-0 = Käytössä
 launcher-process-status-1 = Ei käytössä johtuen viasta
 launcher-process-status-2 = Poistettu käytöstä pakottaen
@@ -309,6 +314,7 @@ touch-enabled = kosketusliittymä käytössä
 drag-enabled = vierityspalkin vastus käytössä
 keyboard-enabled = näppäimistö käytössä
 autoscroll-enabled = automaattivieritys käytössä
+zooming-enabled = portaaton nipistyszoomaus käytössä
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl
index 326340297423..63d676db1b5b 100644
--- a/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/fi/localization/fi/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = Tunniste
 certificate-viewer-key-exchange-group = Avainvaihtoryhmä
 certificate-viewer-key-id = Avaimen tunniste
 certificate-viewer-key-size = Avaimen koko
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Perustuspaikka
 certificate-viewer-locality = Sijainti
 certificate-viewer-location = Sijainti
 certificate-viewer-logid = Lokin tunnus
@@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (varmenne)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (varmenneketju)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Tämä laajennus on merkitty kriittiseksi; se tarkoittaa, että asiakasohjelmien on hylättävä varmenne, jos ne eivät ymmärrä sitä.
+certificate-viewer-export = Vie
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Omat varmenteet
+certificate-viewer-tab-people = Ihmiset
+certificate-viewer-tab-servers = Palvelimet
+certificate-viewer-tab-ca = Varmentajat
+certificate-viewer-tab-unkonwn = Tuntematon
diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl
index 932dba60edb0..ce07cdd24740 100644
--- a/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/fi/localization/fi/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Eristetty verkkosisältö
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Pistoke
diff --git a/thunderbird-l10n/fi/localization/fi/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/fi/localization/fi/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..e753a3a8ae6e
--- /dev/null
+++ b/thunderbird-l10n/fi/localization/fi/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Olet käynnistänyt vanhan { -brand-product-name }-version
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Luo uusi profiili
+profiledowngrade-sync = Vanhan { -brand-product-name }-version käyttäminen voi vioittaa nykyiseen { -brand-product-name }-profiiliin tallennetut kirjanmerkit ja selaushistorian. Suojellaksesi tietojasi, luo uusi profiili tätä { -brand-short-name }-asennusta varten. Voit aina kirjautua sisään { -fxaccount-brand-name }llä ja synkronoida kirjanmerkit sekä selaushistorian profiilien välillä.
+profiledowngrade-nosync = Vanhan { -brand-product-name }-version käyttäminen voi vioittaa nykyiseen { -brand-product-name }-profiiliin tallennetut kirjanmerkit ja selaushistorian. Suojellaksesi tietojasi, luo uusi profiili tätä { -brand-short-name }-asennusta varten.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Sulje
+           *[other] Sulje
+        }
diff --git a/thunderbird-l10n/fi/manifest.json b/thunderbird-l10n/fi/manifest.json
index 77a16954e5eb..9fc4fe9124bd 100644
--- a/thunderbird-l10n/fi/manifest.json
+++ b/thunderbird-l10n/fi/manifest.json
@@ -1,57 +1,57 @@
 {
   "author": "mozilla org suomennosprojekti: (contributors: Lasse Liehu, Jarmo Juslin, Ville Pohjanheimo)",
-  "manifest_version": 2,
-  "name": "Finnish Language Pack",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "version": "76.0buildid20200407173003",
-  "applications": {
-    "gecko": {
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0",
-      "id": "langpack-fi@thunderbird.mozilla.org"
-    }
-  },
   "languages": {
     "fi": {
       "chrome_resources": {
-        "necko": "chrome/fi/locale/fi/necko/",
-        "messenger-smime": "chrome/fi/locale/fi/messenger-smime/",
+        "alerts": "chrome/fi/locale/fi/alerts/",
+        "devtools-shared": "chrome/fi/locale/fi/devtools/shared/",
+        "messenger-region": "chrome/fi/locale/fi/messenger-region/",
+        "messenger-mapi": "chrome/fi/locale/fi/messenger-mapi/",
+        "lightning": "chrome/fi/locale/fi/lightning/",
+        "messenger": "chrome/fi/locale/fi/messenger/",
         "global-platform": {
-          "linux": "chrome/fi/locale/fi/global-platform/unix/",
-          "macosx": "chrome/fi/locale/fi/global-platform/mac/",
           "android": "chrome/fi/locale/fi/global-platform/unix/",
-          "win": "chrome/fi/locale/fi/global-platform/win/"
+          "win": "chrome/fi/locale/fi/global-platform/win/",
+          "macosx": "chrome/fi/locale/fi/global-platform/mac/",
+          "linux": "chrome/fi/locale/fi/global-platform/unix/"
         },
-        "lightning": "chrome/fi/locale/fi/lightning/",
-        "messenger-newsblog": "chrome/fi/locale/fi/messenger-newsblog/",
-        "messenger-region": "chrome/fi/locale/fi/messenger-region/",
-        "global": "chrome/fi/locale/fi/global/",
+        "autoconfig": "chrome/fi/locale/fi/autoconfig/",
         "passwordmgr": "chrome/fi/locale/fi/passwordmgr/",
-        "alerts": "chrome/fi/locale/fi/alerts/",
         "communicator": "chrome/fi/locale/fi/communicator/",
-        "mozldap": "chrome/fi/locale/fi/mozldap/",
-        "devtools": "chrome/fi/locale/fi/devtools/client/",
-        "mozapps": "chrome/fi/locale/fi/mozapps/",
-        "branding": "chrome/fi/locale/fi/branding/",
-        "messenger": "chrome/fi/locale/fi/messenger/",
-        "messenger-mapi": "chrome/fi/locale/fi/messenger-mapi/",
         "pipnss": "chrome/fi/locale/fi/pipnss/",
-        "pippki": "chrome/fi/locale/fi/pippki/",
-        "calendar": "chrome/fi/locale/fi/calendar/",
-        "autoconfig": "chrome/fi/locale/fi/autoconfig/",
+        "chat": "chrome/fi/locale/fi/chat/",
+        "messenger-smime": "chrome/fi/locale/fi/messenger-smime/",
+        "messenger-newsblog": "chrome/fi/locale/fi/messenger-newsblog/",
+        "devtools": "chrome/fi/locale/fi/devtools/client/",
         "pluginproblem": "chrome/fi/locale/fi/pluginproblem/",
+        "pippki": "chrome/fi/locale/fi/pippki/",
+        "necko": "chrome/fi/locale/fi/necko/",
+        "global": "chrome/fi/locale/fi/global/",
         "places": "chrome/fi/locale/fi/places/",
-        "devtools-shared": "chrome/fi/locale/fi/devtools/shared/",
-        "chat": "chrome/fi/locale/fi/chat/",
+        "branding": "chrome/fi/locale/fi/branding/",
+        "calendar": "chrome/fi/locale/fi/calendar/",
+        "mozldap": "chrome/fi/locale/fi/mozldap/",
+        "mozapps": "chrome/fi/locale/fi/mozapps/",
         "devtools-startup": "chrome/fi/locale/fi/devtools/startup/"
       },
-      "version": "20200406181545"
+      "version": "20200420131456"
     }
   },
+  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
   "langpack_id": "fi",
-  "description": "Language pack for Thunderbird for fi"
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "id": "langpack-fi@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
+    }
+  },
+  "description": "Language pack for Thunderbird for fi",
+  "name": "Finnish Language Pack"
 }
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd
index 467a8a4f561d..aeb4a14935fd 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/calendar/preferences/general.dtd
@@ -16,7 +16,7 @@
 
 <!ENTITY pref.timezones.caption "Fuseau horaire">
 <!ENTITY pref.timezones.label "Choisissez la ville la plus proche dans votre fuseau horaire :">
-<!ENTITY pref.timezones.accesskey "C">
+<!ENTITY pref.timezones.accesskey "u">
 
 <!ENTITY pref.defaults.label "Valeurs par défaut pour les nouveaux éléments">
 <!ENTITY pref.events.label "Évènements">
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties
index 5b61cb42a5b5..c3be72f0f486 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/debugger.properties
@@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=r
 removeDirectoryRoot.label=Supprimer le répertoire racine
 removeDirectoryRoot.accesskey=p
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+blackBoxAll.label=Boîte noire
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+blackBoxAllInGroup.label=Placer les fichiers de ce groupe dans une boîte noire
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+unblackBoxAllInGroup.label=Débloquer les fichiers dans ce groupe
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+blackBoxAllOutsideGroup.label=Placer les fichiers hors de ce groupe dans une boîte noire
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+unblackBoxAllOutsideGroup.label=Débloquer les fichiers hors de ce groupe
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+blackBoxAllInDir.label=Placer les fichiers de ce répertoire dans une boîte noire
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+unblackBoxAllInDir.label=Débloquer les fichiers de ce répertoire
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+blackBoxAllOutsideDir.label=Placer les fichiers hors de ce répertoire dans une boîte noire
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+unblackBoxAllOutsideDir.label=Débloquer les fichiers hors de ce répertoire
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Copier la fonction
@@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Supprimé :
 # a JS execution
 whyPaused.interrupted=Mis en pause durant l’exécution
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause=Mis en pause durant l’enregistrement
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=redondant
 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
 # service worker that is in an unknown state.
 serviceWorkerInfo.unknown=inconnu
-
-# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
-blackBoxAll.label=Blackbox
-# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected group
-blackBoxAllInGroup.label=Blackbox files in this group
-# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected group
-unblackBoxAllInGroup.label=Unblackbox files in this group
-# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected group
-blackBoxAllOutsideGroup.label=Blackbox files outside this group
-# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected group
-unblackBoxAllOutsideGroup.label=Unblackbox files outside this group
-# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected directory
-blackBoxAllInDir.label=Blackbox files in this directory
-# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected directory
-unblackBoxAllInDir.label=Unblackbox files in this directory
-# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected directory
-blackBoxAllOutsideDir.label=Blackbox files outside this directory
-# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected directory
-unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties
index 7fe2f8bd4b94..5fcac4e0b40f 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Il est possible de faire défiler la partie q
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Pas de règle associée
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Maintenez la touche Maj enfoncée et cliquez pour aller à la règle
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties
index 0282853716f9..03b2ee323f06 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/devtools/client/netmonitor.properties
@@ -765,6 +765,14 @@ netmonitor.ws.context.received=Reçus
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=R
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+netmonitor.ws.context.controlFrames=Contrôle
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey=o
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Copier le message
@@ -1525,10 +1533,3 @@ netmonitor.cache.lastModified=Dernière modification
 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
 # where a cached object was fetched from (e.g. "disk").
 netmonitor.cache.device=Appareil
-
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
-# on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties
index 75cb6f1a0139..b559f99accf3 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=La feuille de style %1$S a été chargée comme CSS même si son
 
 PEUnexpEOF2=Fin de fichier inattendue durant la recherche de %1$S.
 PEParseRuleWSOnly=Chaîne composée uniquement d’espaces fournie comme règle.
+
 PEDeclDropped=Déclaration abandonnée.
 PEDeclSkipped=Passage à la déclaration suivante.
 PEUnknownProperty=Propriété « %1$S » inconnue.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Un seul repeat(auto-fill, …) est aut
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Un seul repeat(auto-fill, …) ou repeat(auto-fit, …) est autorisé dans une liste d’éléments « track ».
 PEMoreThanOneGridRepeatTrackSize=Une seule dimension d’élément « track » est autorisée dans repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=Les règles @import ne sont pas encore valides dans les feuilles de style construites.
+
 TooLargeDashedRadius=La valeur de border radius est trop importante pour le style « dashed » (la limite est 100000 px). Le rendu sera effectué avec le style « solid ».
 TooLargeDottedRadius=La valeur de border radius est trop importante pour le style « dotted » (la limite est 100000 px). Le rendu sera effectué avec le style « solid ».
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties
index 4b293702979f..ec648aca0188 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Chargement refusé par X-Frame-Options : « %1$S » à l’adresse
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Chargement refusé par X-Frame-Options : « %1$S » à l’adresse « %2$S », le site ne permet pas l’utilisation de cadres multiorigines depuis « %3$S ».
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Un en-tête X-Frame-Options non valide a été trouvé lors du chargement de « %2$S » : « %1$S » n’est pas une directive valide.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Le chargement de « %2$S » dans un cadre est refusé par la directive « X-Frame-Options » définie à « %1$S ».
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = La requête non sécurisée « %1$S » va maintenant utiliser « %2$S ».
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties
index 18ce6a273dd2..da517deb6bb3 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/addons.properties
@@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S n’a pas pu être installé car il présente un
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header=Installer %S ?
 
+# %S is brandShortName
+webextPerms.experimentWarning=Les modules malveillants peuvent dérober vos données personnelles ou compromettre votre ordinateur. Installez ce module uniquement si vous avez confiance en la source.
 webextPerms.unsignedWarning=Attention : ce module n’a pas été vérifié. Les modules malveillants peuvent dérober vos données personnelles ou compromettre votre ordinateur. Installez ce module uniquement si vous avez confiance en la source.
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -194,6 +196,9 @@ webextPerms.description.devtools=Ouvrir les outils de développement afin d’ac
 webextPerms.description.dns=Accéder à l’adresse IP et au nom d’hôte
 webextPerms.description.downloads=Télécharger des fichiers, et consulter et modifier l’historique des téléchargements du navigateur
 webextPerms.description.downloads.open=Ouvrir les fichiers téléchargés sur votre ordinateur
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment=Avoir un accès complet et illimité à %S et à votre ordinateur
 webextPerms.description.find=Lire le texte de tous les onglets ouverts
 webextPerms.description.geolocation=Accéder à votre localisation
 webextPerms.description.history=Accéder à l’historique de navigation
@@ -258,9 +263,3 @@ webext.remove.confirmation.title=Supprimer %S
 # %2$S is brandShorterName
 webext.remove.confirmation.message=Supprimer %1$S de %2$S ?
 webext.remove.confirmation.button=Supprimer
-
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd
index aa15e10a01c4..f0aa9effd503 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/customizeToolbar.dtd
@@ -15,8 +15,7 @@
 <!ENTITY addNewToolbar.label      "Nouvelle barre">
 <!ENTITY showTitlebar.label       "Afficher la barre de titre">
 <!ENTITY extraDragSpace.label     "Espace pour saisir la fenêtre">
+<!ENTITY showTitlebar2.label      "Barre de titre">
+<!ENTITY extraDragSpace2.label    "Espace pour saisir la fenêtre">
 <!ENTITY saveChanges.label        "Terminé">
 <!ENTITY undoChanges.label        "Annuler les changements">
-
-<!ENTITY showTitlebar2.label      "Title Bar">
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties
index 0131680ee31c..fa3b70a7a488 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/imapMsgs.properties
@@ -199,12 +199,22 @@ imapSubscribePrompt=Voulez-vous vous abonner à %1$S ?
 
 imapServerDroppedConnection=Impossible de se connecter au serveur IMAP. Vous avez peut-être dépassé le nombre maximal de connexions au serveur. Si c’est le cas, utilisez les paramètres avancés de serveur IMAP pour diminuer le nombre de connexions conservées en mémoire cache.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Les informations de quota ne sont pas disponibles car le dossier n’est pas ouvert.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Ce serveur ne prend pas en charge les quotas.
 
 imapQuotaStatusNoQuota=Il n’y a aucun quota de stockage sur ce dossier.
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2=Aucune information sur les quotas n’est fournie pour ce dossier.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=Les informations sur les quotas ne sont pas encore disponibles.
+
 # Out of memory
 imapOutOfMemory=Mémoire saturée.
 
@@ -256,9 +266,3 @@ imapFolderCommandFailed=L’opération courante « %2$S » n’a pas abouti. L
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert=Alerte pour le compte %1$S : %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd
index 4399db2e42f7..cf75d6904ce5 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Rechercher dans le courrier">
 <!ENTITY searchMailCmd.accesskey "c">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Recherche globale…">
+<!ENTITY glodaSearchCmd.accesskey "R">
 <!ENTITY searchAddressesCmd.label "Rechercher dans les adresses…">
 <!ENTITY searchAddressesCmd.accesskey "a">
 
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties
index 30a54dbb7296..a816fb856f54 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/messenger.properties
@@ -317,6 +317,7 @@ ajuster le paramètre d’espace disque pour éviter le téléchargement de mess
 
 # accountCentral
 mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat=%1$S %2$S - %3$S
 mailAcctType=Courrier
@@ -464,11 +465,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=%S sur %S Ko utilisés
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=%S%% utilisés
 # for quota in main window (commandglue.js)
 percent=%S%%
 quotaTooltip=Quota IMAP : %S Ko utilisés sur %S Ko alloués. Cliquer pour plus de détails.
 
+quotaTooltip2=Quota IMAP : %S utilisés sur %S alloués. Cliquer pour plus de détails.
+
 # for message views
 confirmViewDeleteTitle=Confirmation
 confirmViewDeleteMessage=Voulez-vous vraiment supprimer cette vue ?
@@ -804,5 +809,3 @@ errorConsoleTitle = Console d’erreurs
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = Retour
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties
index a7be2fb2439a..539cfb12dd6e 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Ceci est un message OpenPGP chiffré.<br>Afin de pouvoir déchiffrer ce courrier, vous devez installer un <a href="%S">module complémentaire OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Ceci est un message OpenPGP chiffré, mais la prise en charge du déchiffrement OpenPGP n’est pas disponible.
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd
index 4d7b70f662dc..bd9db35d05aa 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label         "Supprimer">
 <!ENTITY removeSearchEngine.accesskey     "S">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
-<!ENTITY minimizeToTray.accesskey         "m">
+<!ENTITY minimizeToTray.label             "Quand &brandShortName; est réduit, le déplacer dans la barre de notification">
+<!ENTITY minimizeToTray.accesskey         "r">
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties
index 1514a9230c69..6f4da2e0a336 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Accès au stockage automatiquement ac
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Accès au stockage automatiquement accordé pour le traqueur « %2$S » sur le site « %1$S ».
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Accès au stockage automatiquement accordé pour l’isolation First-Party « %2$S » sur le site « %1$S ».
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Le cookie « %1$S » a été rejeté car il possède l’attribut « sameSite=none » mais pas l’attribut « secure ».
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
@@ -70,6 +73,4 @@ CookieSameSiteValueInvalid=Valeur « sameSite » non valide pour le cookie «
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
 CookieOversize=Le cookie « %1$S » n’est pas valide car sa taille est trop grande. La taille maximale est de %2$S octets.
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-
-# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize=Le cookie « %1$S » n’est pas valide car la taille de son chemin est trop grande. La taille maximale est de %2$S octets.
diff --git a/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties b/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties
index e141b5d1d073..d01243aac0c6 100644
--- a/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties
+++ b/thunderbird-l10n/fr/chrome/fr/locale/fr/pippki/pippki.properties
@@ -2,56 +2,15 @@
 # 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/.
 
-# LOCALIZATION NOTE(certWithSerial): Used for semi-uniquely representing a cert.
-# %1$S is the serial number of the cert in AA:BB:CC hex format.
-certWithSerial=Certificat avec numéro de série : %1$S
-
 # Download Cert dialog
 # LOCALIZATION NOTE(newCAMessage1):
 # %S is a string representative of the certificate being downloaded/imported.
 newCAMessage1=Voulez-vous faire confiance à « %S » pour les actions suivantes ?
 unnamedCA=Autorité de certification (pas de nom)
 
-# For editing cert trust
-editTrustCA=Le certificat « %S » représente une autorité de certification.
-
-# For Deleting Certificates
-deleteSslCertConfirm3=Voulez-vous vraiment supprimer ces exceptions de serveurs ?
-deleteSslCertImpact3=Si vous supprimez une exception de serveur, vous restaurez les vérifications de sécurité usuelles pour ce serveur et demandez qu’il utilise un certificat valide.
-deleteSslCertTitle3=Suppression des exceptions de certificats de serveur
-
-deleteUserCertConfirm=Voulez-vous vraiment supprimer ces certificats ?
-deleteUserCertImpact=Si vous supprimez un de vos certificats, vous ne pourrez plus l’utiliser pour vous identifier vous-même.
-deleteUserCertTitle=Suppression de certificats
-
-deleteCaCertConfirm2=Vous avez demandé de supprimer ces certificats d’AC. S’il s’agit de certificats intégrés, aucune confiance ne leur sera plus accordée, ce qui a le même effet. Voulez-vous vraiment supprimer ces certificats ou ne plus leur faire confiance ?
-deleteCaCertImpactX2=Si vous supprimez une autorité de certification (AC) ou cessez de lui faire confiance, l’application ne fera plus confiance à aucun certificat fourni par cette autorité.
-deleteCaCertTitle2=Supprimer ou ne plus faire confiance à des certificats d’AC
-
-deleteEmailCertConfirm=Voulez-vous vraiment supprimer les certificats de courrier de ces personnes ?
-deleteEmailCertImpactDesc=Si vous supprimez le certificat de courrier d’une personne, vous ne pourrez plus envoyer de courrier chiffré à la personne qui lui est associée.
-deleteEmailCertTitle=Suppression de certificats de courrier
-
-deleteOrphanCertConfirm=Voulez-vous vraiment supprimer ces certificats ?
-deleteOrphanCertTitle=Suppression de certificats
-
 # PKCS#12 file dialogs
-chooseP12RestoreFileDialog2=Fichier de certificat à importer
-chooseP12BackupFileDialog=Nom de fichier à sauvegarder
-file_browse_PKCS12_spec=Fichiers PKCS12
 getPKCS12FilePasswordMessage=Veuillez saisir le mot de passe portable de sécurité protégeant ce certificat de sécurité et la clé privée :
 
-# Cert verification
-certVerified=Ce certificat a été vérifié pour les utilisations suivantes :
-certNotVerified_CertRevoked=Impossible de vérifier ce certificat car il a été révoqué.
-certNotVerified_CertExpired=Impossible de vérifier ce certificat car il a expiré.
-certNotVerified_CertNotTrusted=Impossible de vérifier ce certificat car il n’est pas digne de confiance.
-certNotVerified_IssuerNotTrusted=Impossible de vérifier ce certificat car son émetteur n’est pas digne de confiance.
-certNotVerified_IssuerUnknown=Impossible de vérifier ce certificat car l’émetteur est inconnu.
-certNotVerified_CAInvalid=Impossible de vérifier ce certificat car le certificat d’AC n’est pas valide.
-certNotVerified_AlgorithmDisabled=Impossible de vérifier ce certificat car il a été signé à l’aide d’un algorithme de signature qui a été désactivé car cet algorithme n’est pas sécurisé.
-certNotVerified_Unknown=Impossible de vérifier ce certificat pour une raison inconnue.
-
 # Client auth
 clientAuthRemember=Se souvenir de cette décision
 # LOCALIZATION NOTE(clientAuthNickAndSerial): Represents a single cert when the
@@ -111,12 +70,6 @@ pageInfo_MixedContent2=Certaines parties de la page que vous visionnez n’ont p
 pageInfo_WeakCipher=La connexion vers ce site possède un niveau de chiffrement trop bas et n’est pas privée. N’importe qui est en mesure d’afficher vos informations ou de modifier le comportement du site web.
 pageInfo_CertificateTransparency_Compliant=Ce site web respecte la politique de transparence du certificat.
 
-# Cert Viewer
-# LOCALIZATION NOTE(certViewerTitle): Title used for the Certificate Viewer.
-# %1$S is a string representative of the certificate being viewed.
-certViewerTitle=Détails du certificat : « %1$S »
-notPresent=<Ne fait pas partie du certificat>
-
 # Token Manager
 password_not_set=(non défini)
 failed_pw_change=Impossible de modifier le mot de passe.
@@ -126,67 +79,8 @@ pw_erased_ok=ATTENTION ! Vous avez effacé votre mot de passe principal.
 pw_not_wanted=Attention ! Vous avez décidé de ne pas utiliser de mot de passe principal.
 pw_empty_warning=Vos mots de passe enregistrés pour les formulaires web et le courrier ainsi que vos clés privées ne seront pas protégés.
 pw_change2empty_in_fips_mode=Vous êtes actuellement en mode FIPS. Ce mode nécessite un mot de passe principal non vide.
-login_failed=Échec de connexion
-loadPK11ModuleFilePickerTitle=Sélectionner un pilote de périphérique PKCS#11 à charger
-devinfo_modname=Module
-devinfo_modpath=Chemin
-devinfo_label=Étiquette
-devinfo_manID=Fabricant
-devinfo_serialnum=Numéro de série
-devinfo_hwversion=Version HW
-devinfo_fwversion=Version FW
-devinfo_status=Statut
-devinfo_desc=Description
-devinfo_stat_disabled=Désactivé
-devinfo_stat_notpresent=Absent
-devinfo_stat_uninitialized=Non initialisé
-devinfo_stat_notloggedin=Non connecté
-devinfo_stat_loggedin=Connecté
-devinfo_stat_ready=Prêt
 enable_fips=Activer FIPS
 disable_fips=Désactiver FIPS
-fips_nonempty_password_required=Le mode FIPS exige que vous ayez défini un mot de passe principal pour chaque périphérique de sécurité. Veuillez définir le mot de passe principal avant d’activer le mode FIPS.
-unable_to_toggle_fips=Impossible de modifier le mode FIPS pour le périphérique de sécurité. Nous vous recommandons de quitter et de redémarrer cette application.
 
 resetPasswordConfirmationTitle=Effacer le mot de passe principal
-resetPasswordConfirmationMessage=Votre mot de passe a été effacé
-
-# Import certificate(s) file dialog
-importEmailCertPrompt=Sélectionner un fichier contenant un certificat de courrier à importer
-importCACertsPrompt=Sélectionner un fichier contenant un (ou des) certificat(s) d’AC à importer
-file_browse_Certificate_spec=Fichiers de certificat
-
-# Cert export
-SaveCertAs=Enregistrer le certificat dans un fichier
-CertFormatBase64=Certificat X.509 (PEM)
-CertFormatBase64Chain=Certificat X.509 avec chaîne (PEM)
-CertFormatDER=Certificat X.509 (DER)
-CertFormatPKCS7=Certificat X.509 (PKCS#7)
-CertFormatPKCS7Chain=Certificat X.509 avec chaîne (PKCS#7)
-writeFileFailure=Erreur de fichier
-writeFileFailed=Impossible d’écrire dans le fichier %S :\n%S.
-writeFileAccessDenied=Accès refusé
-writeFileIsLocked=Le fichier est verrouillé
-writeFileNoDeviceSpace=Pas d’espace disque disponible
-writeFileUnknownError=Erreur inconnue
-
-# Add Security Exception dialog
-addExceptionBrandedWarning2=Vous êtes en train de passer outre la façon dont %S identifie ce site.
-addExceptionInvalidHeader=Ce site essaie de s’identifier lui-même avec des informations invalides.
-addExceptionDomainMismatchShort=Mauvais site
-addExceptionDomainMismatchLong2=Le certificat appartient à un site différent, ce qui pourrait indiquer que quelqu’un tente d’usurper l’identité de ce site.
-addExceptionExpiredShort=Informations obsolètes
-addExceptionExpiredLong2=Le certificat n’est pas valide actuellement. Il a pu être volé ou perdu et peut être utilisé par quelqu’un pour usurper l’identité de ce site.
-addExceptionUnverifiedOrBadSignatureShort=Identité inconnue
-addExceptionUnverifiedOrBadSignatureLong2=Le certificat n’est pas sûr car il est impossible de vérifier qu’il ait été délivré par une autorité de confiance utilisant une signature sécurisée.
-addExceptionValidShort=Certificat valide
-addExceptionValidLong=Ce site fournit une identification valide et certifiée. Il n’est pas nécessaire d’ajouter une exception.
-addExceptionCheckingShort=Vérification des informations
-addExceptionCheckingLong2=Tentative d’identification de ce site…
-addExceptionNoCertShort=Pas d’informations disponibles
-addExceptionNoCertLong2=Impossible d’obtenir l’état d’identification de ce site.
-
-# Load Module Dialog
-loadModuleHelp_emptyModuleName=Le nom du module ne peut pas être vide.
-# LOCALIZATION NOTE(loadModuleHelp_rootCertsModuleName): Do not translate 'Root Certs'
-loadModuleHelp_rootCertsModuleName=« Root Certs » est réservé et ne peut pas être utilisé comme nom de module.
+resetPasswordConfirmationMessage=Votre mot de passe à été réinitialisé.
diff --git a/thunderbird-l10n/fr/localization/fr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/fr/localization/fr/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..62a084009a15
--- /dev/null
+++ b/thunderbird-l10n/fr/localization/fr/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Redirection de l’adresse d’un agenda
+calendar-uri-redirect-description =
+    Le serveur redirige l’adresse (URI) de l’agenda « { $calendarName } ».
+    Accepter la redirection et commencer à utiliser la nouvelle adresse de cet agenda ?
+calendar-uri-redirect-original-uri-label = Adresse actuelle :
+calendar-uri-redirect-target-uri-label = Redirection vers :
diff --git a/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl
index f9567bfa55ad..5fee397c3522 100644
--- a/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/fr/localization/fr/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Le navigateur connecté dispose d’un
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = Le panneau du débogueur risque de ne pas fonctionner avec le navigateur connecté. Veuillez utiliser Firefox { $runtimeVersion } si vous avez besoin d’utiliser le débogueur avec ce navigateur.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Cette version de Firefox ne peut pas déboguer Firefox pour Android (68). Nous vous recommandons d’installer Firefox pour Android Nightly sur votre téléphone pour les tests. <a>Plus de détails</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl b/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl
index f241c3be8ab9..66f7cc73f936 100644
--- a/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/fr/localization/fr/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Bienvenue dans { -brand-full-name }
+account-settings = Paramètres du compte
+#   $accounts (Number) - the number of configured accounts
 setup-title = Choisir l’élément à configurer
 about-title = À propos de { -brand-full-name }
 resources-title = Ressources
@@ -40,3 +42,10 @@ explore-link = Découvrir les fonctionnalités
 support-link = Assistance
 involved-link = Contribuer
 developer-link = Documentation pour les développeurs
+read = Lire les messages
+compose = Écrire un nouveau message
+search = Rechercher dans les messages
+filter = Gérer les filtres des messages
+nntp-subscription = Gérer les abonnements aux groupes de discussion
+rss-subscription = Gérer les abonnements aux flux
+e2e = Chiffrement de bout en bout
diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl
index fb78ac90551a..984f904749ba 100644
--- a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Installer un module depuis un fichier…
     .accesskey = I
 help-button = Assistance des modules
+sidebar-help-button-title =
+    .title = Assistance des modules
 preferences =
     { PLATFORM() ->
         [windows] Options de { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Outils pour tous les modules
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Options de { -brand-short-name }
+           *[other] Préférences de { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Certaines extensions n’ont pas pu être vérifiées
 show-all-extensions-button =
@@ -170,13 +178,29 @@ extensions-view-available-updates =
     .name = À mettre à jour
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recommandations
+addon-category-discover-title =
+    .title = Recommandations
 addon-category-extension = Extensions
+addon-category-extension-title =
+    .title = Extensions
 addon-category-theme = Thèmes
+addon-category-theme-title =
+    .title = Thèmes
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Dictionnaires
+addon-category-dictionary-title =
+    .title = Dictionnaires
 addon-category-locale = Langues
+addon-category-locale-title =
+    .title = Langues
 addon-category-available-updates = À mettre à jour
+addon-category-available-updates-title =
+    .title = À mettre à jour
 addon-category-recent-updates = Mis à jour
+addon-category-recent-updates-title =
+    .title = Mis à jour
 
 ## These are global warnings
 
@@ -289,6 +313,7 @@ shortcuts-no-commands = Les extensions suivantes ne disposent pas de raccourcis
 shortcuts-input =
     .placeholder = Saisissez un raccourci
 shortcuts-browserAction = Activer l’extension
+shortcuts-browserAction2 = Activer le bouton de la barre d’outils
 shortcuts-pageAction = Activer l’action de la page
 shortcuts-sidebarAction = Afficher/Masquer le panneau latéral
 shortcuts-modifier-mac = Inclure Ctrl, Alt ou ⌘
@@ -314,6 +339,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = En montrer moins
 go-back-button =
     .tooltiptext = Retour
+header-back-button =
+    .title = Retour
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl
index 1efbc1e9bc28..f23817859792 100644
--- a/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/fr/localization/fr/toolkit/about/aboutSupport.ftl
@@ -290,6 +290,11 @@ sandbox-proc-type-content = contenu
 sandbox-proc-type-file = contenu du fichier
 sandbox-proc-type-media-plugin = plugin multimédia
 sandbox-proc-type-data-decoder = décodeur de données
+startup-cache-title = Cache de démarrage
+startup-cache-disk-cache-path = Chemin du cache disque
+startup-cache-ignore-disk-cache = Ignorer le cache disque
+startup-cache-found-disk-cache-on-init = Cache disque trouvé à l’initialisation
+startup-cache-wrote-to-disk-cache = Écriture dans le cache disque
 launcher-process-status-0 = Activé
 launcher-process-status-1 = Désactivé en raison d’une défaillance
 launcher-process-status-2 = Désactivé de force
@@ -313,6 +318,7 @@ touch-enabled = entrée tactile activée
 drag-enabled = faire glisser les barres de défilement
 keyboard-enabled = clavier activé
 autoscroll-enabled = défilement automatique activé
+zooming-enabled = zoom fluide par pincement activé
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl
index e78d21dddd74..c1465017f6a1 100644
--- a/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/fr/localization/fr/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Groupe d’échange de clés
 certificate-viewer-key-id = ID de clé
 certificate-viewer-key-size = Taille de la clé
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Siège social
 certificate-viewer-locality = Localité
 certificate-viewer-location = Emplacement
 certificate-viewer-logid = ID de journal
@@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Cette extension a été marquée comme critique, ce qui signifie que les clients doivent rejeter le certificat s’ils ne le comprennent pas.
+certificate-viewer-export = Exporter
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Vos certificats
+certificate-viewer-tab-people = Personnes
+certificate-viewer-tab-servers = Serveurs
+certificate-viewer-tab-ca = Autorités
+certificate-viewer-tab-unkonwn = Inconnu
diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl
index ba0034174281..3ce54635d122 100644
--- a/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/fr/localization/fr/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Contenu web isolé
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/fr/localization/fr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/fr/localization/fr/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..d7119f083d1a
--- /dev/null
+++ b/thunderbird-l10n/fr/localization/fr/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Vous avez lancé une ancienne version de { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Créer un nouveau profil
+profiledowngrade-sync = L’utilisation d’une ancienne version de { -brand-product-name } peut corrompre les marque-pages et l’historique de navigation déjà enregistrés dans un profil { -brand-product-name } existant. Pour protéger vos informations, créez un nouveau profil pour cette installation de { -brand-short-name }. Vous pouvez toujours vous connecter avec un { -fxaccount-brand-name } pour synchroniser vos marque-pages et votre historique de navigation entre les profils.
+profiledowngrade-nosync = L’utilisation d’une ancienne version de { -brand-product-name } peut corrompre les marque-pages et l’historique de navigation déjà enregistrés dans un profil { -brand-product-name } existant. Pour protéger vos informations, créez un nouveau profil pour cette installation de { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Quitter
+           *[other] Quitter
+        }
diff --git a/thunderbird-l10n/fr/manifest.json b/thunderbird-l10n/fr/manifest.json
index 443e127f873d..7a7290882379 100644
--- a/thunderbird-l10n/fr/manifest.json
+++ b/thunderbird-l10n/fr/manifest.json
@@ -1,57 +1,57 @@
 {
-  "description": "Language pack for Thunderbird for fr",
-  "name": "Français Language Pack",
   "manifest_version": 2,
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-fr@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
-    }
-  },
-  "author": "mozfr.org (contributors: Frédéric Chateaux, Théo Chevalier, Cédric Corazza, Philippe Dessante, Benoît Leseul, Jean-Bernard Marcon)",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "langpack_id": "fr",
+  "name": "Français Language Pack",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-fr@thunderbird.mozilla.org"
+    }
+  },
+  "description": "Language pack for Thunderbird for fr",
   "languages": {
     "fr": {
       "chrome_resources": {
+        "mozldap": "chrome/fr/locale/fr/mozldap/",
+        "autoconfig": "chrome/fr/locale/fr/autoconfig/",
+        "alerts": "chrome/fr/locale/fr/alerts/",
+        "necko": "chrome/fr/locale/fr/necko/",
+        "chat": "chrome/fr/locale/fr/chat/",
         "pippki": "chrome/fr/locale/fr/pippki/",
+        "global": "chrome/fr/locale/fr/global/",
         "places": "chrome/fr/locale/fr/places/",
-        "branding": "chrome/fr/locale/fr/branding/",
-        "messenger-smime": "chrome/fr/locale/fr/messenger-smime/",
-        "chat": "chrome/fr/locale/fr/chat/",
-        "devtools-shared": "chrome/fr/locale/fr/devtools/shared/",
         "pipnss": "chrome/fr/locale/fr/pipnss/",
-        "global": "chrome/fr/locale/fr/global/",
-        "pluginproblem": "chrome/fr/locale/fr/pluginproblem/",
-        "necko": "chrome/fr/locale/fr/necko/",
-        "messenger-newsblog": "chrome/fr/locale/fr/messenger-newsblog/",
+        "communicator": "chrome/fr/locale/fr/communicator/",
+        "messenger-smime": "chrome/fr/locale/fr/messenger-smime/",
+        "mozapps": "chrome/fr/locale/fr/mozapps/",
         "calendar": "chrome/fr/locale/fr/calendar/",
-        "messenger-region": "chrome/fr/locale/fr/messenger-region/",
         "lightning": "chrome/fr/locale/fr/lightning/",
+        "messenger": "chrome/fr/locale/fr/messenger/",
+        "messenger-mapi": "chrome/fr/locale/fr/messenger-mapi/",
+        "devtools-shared": "chrome/fr/locale/fr/devtools/shared/",
         "devtools-startup": "chrome/fr/locale/fr/devtools/startup/",
-        "alerts": "chrome/fr/locale/fr/alerts/",
-        "autoconfig": "chrome/fr/locale/fr/autoconfig/",
+        "messenger-region": "chrome/fr/locale/fr/messenger-region/",
+        "passwordmgr": "chrome/fr/locale/fr/passwordmgr/",
+        "devtools": "chrome/fr/locale/fr/devtools/client/",
         "global-platform": {
-          "linux": "chrome/fr/locale/fr/global-platform/unix/",
           "win": "chrome/fr/locale/fr/global-platform/win/",
+          "linux": "chrome/fr/locale/fr/global-platform/unix/",
           "android": "chrome/fr/locale/fr/global-platform/unix/",
           "macosx": "chrome/fr/locale/fr/global-platform/mac/"
         },
-        "mozapps": "chrome/fr/locale/fr/mozapps/",
-        "messenger": "chrome/fr/locale/fr/messenger/",
-        "communicator": "chrome/fr/locale/fr/communicator/",
-        "mozldap": "chrome/fr/locale/fr/mozldap/",
-        "passwordmgr": "chrome/fr/locale/fr/passwordmgr/",
-        "devtools": "chrome/fr/locale/fr/devtools/client/",
-        "messenger-mapi": "chrome/fr/locale/fr/messenger-mapi/"
+        "branding": "chrome/fr/locale/fr/branding/",
+        "messenger-newsblog": "chrome/fr/locale/fr/messenger-newsblog/",
+        "pluginproblem": "chrome/fr/locale/fr/pluginproblem/"
       },
-      "version": "20200403074633"
+      "version": "20200418212307"
     }
   },
-  "langpack_id": "fr",
-  "version": "76.0buildid20200407173003"
+  "version": "76.0buildid20200420212409",
+  "author": "mozfr.org (contributors: Frédéric Chateaux, Théo Chevalier, Cédric Corazza, Philippe Dessante, Benoît Leseul, Jean-Bernard Marcon)"
 }
diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties
index 35ff36616cec..c67246c39831 100644
--- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties
+++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Dit elemint hat skowbere oerrin.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Gjin keppele rigel
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hâld Shift yndrukt en klik om nei de rigel te springen
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties
index 01303cfdd750..7f5d1ba441a9 100644
--- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties
+++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=It stylblêd %1$S wurde download as CSS, alhoewol syn MIME-type,
 
 PEUnexpEOF2=Unferwacht einde fan bestân tiidens sykjen nei %1$S.
 PEParseRuleWSOnly=String mei inkeld witromte joun om te parsen as rige.
+
 PEDeclDropped=Deklaraasje negearre.
 PEDeclSkipped=Nei folgjende deklaraasje ljeppe.
 PEUnknownProperty=Unbekende eigenskip ’%1$S’.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Der is mar ien repeat(auto-fill, …)
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Der is mar ien repeat(auto-fill, …) of repeat(auto-fit, …) yn in track list tastien.
 PEMoreThanOneGridRepeatTrackSize=Der is mar ien track size binnen repeat(auto-fit/auto-fill, …) tastien.
 
+PEDisallowedImportRule=@import-rigels binne noch net jildich yn konstruearre stylblêden.
+
 TooLargeDashedRadius=Border-straal is te grut foar ‘dashed’ styl (de limyt is 100000px). Wurdt renderd as solid.
 TooLargeDottedRadius=Border-straal is te grut foar ‘dotted’ styl (de limyt is 100000px). Wurdt renderd as solid.
diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties
index 24dd4f9b2ce9..25f43723a5dd 100644
--- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties
+++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Laden troch X-Frame-Options wegere: ‘%1$S’ fan ‘%2$S’, website
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Laden troch X-Frame-Options wegere: ‘%1$S’ fan ‘%2$S’, website stiet cross-origin-framing fan ‘%3$S’ net ta.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Der is in ûnjildige X-Frame-Options-koptekst fûn by it laden fan ‘%2$S’: ‘%1$S’ is gjin jildige rjochtline.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=It laden yn in frame fan ‘%2$S’ is wegere troch de rjochtline ‘X-Frame-Options’, dy't ynsteld is op ‘%1$S’.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Unfeilige oanfraach ‘%1$S’ wurdt fernijd foar gebrûk fan ‘%2$S’
diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd
index fff26cc26a28..8616734981da 100644
--- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd
+++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Berjochten sykje…">
 <!ENTITY searchMailCmd.accesskey "B">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Globaal sykje…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Adressen sykje…">
 <!ENTITY searchAddressesCmd.accesskey "A">
 
diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties
index e8101c45f61f..40bb272db287 100644
--- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties
+++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/messenger/pgpmime.properties
@@ -9,3 +9,6 @@
 # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Dit is in fersifere OpenPGP-berjocht.<br>Om dizze e-mail te ûntsiferjen, moatte jo in <a href="%S">OpenPGP add-on</a> ynstallearje.
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Dit is in fersifere OpenPGP-berjocht, mar stipe foar OpenPGP-ûntsifering is net beskikber.
diff --git a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties
index c8db8c83f5e5..59cd97b17615 100644
--- a/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties
+++ b/thunderbird-l10n/fy-NL/chrome/fy-NL/locale/fy-NL/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Tagong ta ûnthâld automatysk ferlie
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Tagong ta ûnthâld automatysk ferliend foar tracker ‘%2$S’ op ‘%1$S’.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Tagong ta ûnthâld automatysk ferliend foar isolaasje fan streekrjochte cookie ‘%2$S’ op ‘%1$S’.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie ‘%1$S’ is ôfwezen omdat it it attribút ‘sameSite=none’ befettet, mar it attribút ‘secure’ ûntbrekt.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..e2a58ac213bd
--- /dev/null
+++ b/thunderbird-l10n/fy-NL/localization/fy-NL/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Omlieding aginda-URI
+calendar-uri-redirect-description =
+    De server liedt de URI foar de aginda ‘{ $calendarName }’ om.
+    Dizze omlieding akseptearje en de nije URI foar dizze aginda brûke?
+calendar-uri-redirect-original-uri-label = Aktuele URI:
+calendar-uri-redirect-target-uri-label = Omliede nei nije URI:
diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl
index d5055d3012fb..177fbee33ff8 100644
--- a/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/fy-NL/localization/fy-NL/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Wolkom by { -brand-full-name }
+account-settings = Accountynstellingen
+#   $accounts (Number) - the number of configured accounts
 setup-title = Kies wat jo ynstelle wolle
 about-title = Oer { -brand-full-name }
 resources-title = Boarnen
@@ -40,3 +42,10 @@ explore-link = Funksjes ferkenne
 support-link = Stipe
 involved-link = Meiwurkje
 developer-link = Dokumintaasje foar ûntwikkelers
+read = Berjochten lêze
+compose = Nij berjocht opstelle
+search = Berjochten sykje
+filter = Berjochtefilters beheare
+nntp-subscription = Nijsgroepabonneminten beheare
+rss-subscription = Feedabonneminten beheare
+e2e = End-to-end-fersifering
diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl
index 62c462924a46..363e2d6ae384 100644
--- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Ynstallearje add-on út bestân…
     .accesskey = Y
 help-button = Add-on-stipe
+sidebar-help-button-title =
+    .title = Add-on-stipe
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name }-opsjes
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Ark foar alle add-ons
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name }-opsjes
+           *[other] { -brand-short-name }-foarkarren
+        }
 show-unsigned-extensions-button =
     .label = Guon útwreidingen koene net ferifiearre wurde
 show-all-extensions-button =
@@ -173,13 +181,29 @@ extensions-view-available-updates =
     .name = Beskikbere fernijingen
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Oanrekommandaasjes
+addon-category-discover-title =
+    .title = Oanrekommandaasjes
 addon-category-extension = Utwreidingen
+addon-category-extension-title =
+    .title = Utwreidingen
 addon-category-theme = Tema's
+addon-category-theme-title =
+    .title = Tema's
 addon-category-plugin = Ynstekkers
+addon-category-plugin-title =
+    .title = Ynstekkers
 addon-category-dictionary = Wurdboeken
+addon-category-dictionary-title =
+    .title = Wurdboeken
 addon-category-locale = Talen
+addon-category-locale-title =
+    .title = Talen
 addon-category-available-updates = Beskikbere fernijingen
+addon-category-available-updates-title =
+    .title = Beskikbere fernijingen
 addon-category-recent-updates = Resinte fernijingen
+addon-category-recent-updates-title =
+    .title = Resinte fernijingen
 
 ## These are global warnings
 
@@ -292,6 +316,7 @@ shortcuts-no-commands = De folgjende útwreidingen hawwe gjin fluchtoetsen:
 shortcuts-input =
     .placeholder = Typ in fluchtoets
 shortcuts-browserAction = Utwreiding aktivearje
+shortcuts-browserAction2 = Arkbalkeknop aktivearje
 shortcuts-pageAction = Side-aksje aktivearje
 shortcuts-sidebarAction = De sydbalke yn-/útskeakelje
 shortcuts-modifier-mac = Druk ek op Ctrl, Alt of ⌘
@@ -316,6 +341,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Minder toane
 go-back-button =
     .tooltiptext = Tebekgean
+header-back-button =
+    .title = Tebekgean
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl
index 8815c1b0f1cc..724074a9c429 100644
--- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/aboutSupport.ftl
@@ -290,6 +290,11 @@ sandbox-proc-type-content = ynhâld
 sandbox-proc-type-file = bestânsynhâld
 sandbox-proc-type-media-plugin = mediaynstekker
 sandbox-proc-type-data-decoder = gegevensdecoder
+startup-cache-title = Opstartbuffer
+startup-cache-disk-cache-path = Paad nei skiifbuffer
+startup-cache-ignore-disk-cache = Skiifbuffer negearje
+startup-cache-found-disk-cache-on-init = Skiifbuffer by Init fûn
+startup-cache-wrote-to-disk-cache = Nei skiifbuffer skreaun
 launcher-process-status-0 = Ynskeakele
 launcher-process-status-1 = Utskeakele fanwegen flater
 launcher-process-status-2 = Forsearre útskeakele
@@ -313,6 +318,7 @@ touch-enabled = oanraakynfier ynskeakele
 drag-enabled = sleep fia skowbalke ynskeakele
 keyboard-enabled = toetseboerd ynskeakele
 autoscroll-enabled = automatysk skowe ynskeakele
+zooming-enabled = soepele knyp-zoom ynskeakele
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl
index ed1f1bda265e..e58b79c26f6a 100644
--- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (sert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (keten)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Dizze útwreiding is as krityk markearre, wat betsjut dat clients it sertifikaat wegerje moatten as se it net begripe.
+certificate-viewer-export = Eksportearje
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Jo sertifikaten
+certificate-viewer-tab-people = Minsken
+certificate-viewer-tab-servers = Servers
+certificate-viewer-tab-ca = Organisaasjes
+certificate-viewer-tab-unkonwn = Unbekend
diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl
index 84dd8781480c..c3c12abd7da5 100644
--- a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Isolearre webynhâld
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..a528d9ccdb54
--- /dev/null
+++ b/thunderbird-l10n/fy-NL/localization/fy-NL/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Jo hawwe in âldere ferzje fan { -brand-product-name } start
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Nij profyl oanmeitsje
+profiledowngrade-sync = It gebrûk fan in âldere ferzje fan { -brand-product-name } kin blêdwizers en navigaasjeskiednis dy't al yn in besteand { -brand-product-name }-profyl bewarre is skansearje. Meitsje in nij profyl oan foar dizze ynstallaasje fan { -brand-short-name } om jo ynformaasje te beskermjen. Jo kinne jo altyd oanmelde mei in { -fxaccount-brand-name } om jo blêdwizers en navigaasjeskiednis tusken profilen te syngronisearjen.
+profiledowngrade-nosync = It gebrûk fan in âldere ferzje fan { -brand-product-name } kin blêdwizers en navigaasjeskiednis dy't al yn in besteand { -brand-product-name }-profyl bewarre is skansearje. Meitsje in nij profyl oan foar dizze ynstallaasje fan { -brand-short-name } om jo ynformaasje te beskermjen.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Ofslute
+           *[other] Ofslute
+        }
diff --git a/thunderbird-l10n/fy-NL/manifest.json b/thunderbird-l10n/fy-NL/manifest.json
index 56281468a9f6..5b88c36744c6 100644
--- a/thunderbird-l10n/fy-NL/manifest.json
+++ b/thunderbird-l10n/fy-NL/manifest.json
@@ -1,57 +1,57 @@
 {
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "applications": {
-    "gecko": {
-      "strict_max_version": "76.*",
-      "id": "langpack-fy-NL@thunderbird.mozilla.org",
-      "strict_min_version": "76.0"
-    }
-  },
   "languages": {
     "fy-NL": {
+      "version": "20200416071509",
       "chrome_resources": {
+        "messenger-region": "chrome/fy-NL/locale/fy-NL/messenger-region/",
+        "messenger-smime": "chrome/fy-NL/locale/fy-NL/messenger-smime/",
+        "alerts": "chrome/fy-NL/locale/fy-NL/alerts/",
+        "devtools-shared": "chrome/fy-NL/locale/fy-NL/devtools/shared/",
+        "branding": "chrome/fy-NL/locale/fy-NL/branding/",
         "pluginproblem": "chrome/fy-NL/locale/fy-NL/pluginproblem/",
-        "messenger-newsblog": "chrome/fy-NL/locale/fy-NL/messenger-newsblog/",
-        "autoconfig": "chrome/fy-NL/locale/fy-NL/autoconfig/",
+        "pippki": "chrome/fy-NL/locale/fy-NL/pippki/",
+        "global": "chrome/fy-NL/locale/fy-NL/global/",
         "mozldap": "chrome/fy-NL/locale/fy-NL/mozldap/",
-        "messenger": "chrome/fy-NL/locale/fy-NL/messenger/",
-        "global-platform": {
-          "linux": "chrome/fy-NL/locale/fy-NL/global-platform/unix/",
-          "android": "chrome/fy-NL/locale/fy-NL/global-platform/unix/",
-          "win": "chrome/fy-NL/locale/fy-NL/global-platform/win/",
-          "macosx": "chrome/fy-NL/locale/fy-NL/global-platform/mac/"
-        },
-        "places": "chrome/fy-NL/locale/fy-NL/places/",
-        "passwordmgr": "chrome/fy-NL/locale/fy-NL/passwordmgr/",
-        "devtools-shared": "chrome/fy-NL/locale/fy-NL/devtools/shared/",
         "communicator": "chrome/fy-NL/locale/fy-NL/communicator/",
-        "devtools": "chrome/fy-NL/locale/fy-NL/devtools/client/",
-        "pipnss": "chrome/fy-NL/locale/fy-NL/pipnss/",
         "mozapps": "chrome/fy-NL/locale/fy-NL/mozapps/",
-        "branding": "chrome/fy-NL/locale/fy-NL/branding/",
+        "pipnss": "chrome/fy-NL/locale/fy-NL/pipnss/",
+        "devtools": "chrome/fy-NL/locale/fy-NL/devtools/client/",
         "chat": "chrome/fy-NL/locale/fy-NL/chat/",
-        "pippki": "chrome/fy-NL/locale/fy-NL/pippki/",
-        "messenger-region": "chrome/fy-NL/locale/fy-NL/messenger-region/",
-        "calendar": "chrome/fy-NL/locale/fy-NL/calendar/",
-        "messenger-smime": "chrome/fy-NL/locale/fy-NL/messenger-smime/",
-        "alerts": "chrome/fy-NL/locale/fy-NL/alerts/",
-        "necko": "chrome/fy-NL/locale/fy-NL/necko/",
-        "messenger-mapi": "chrome/fy-NL/locale/fy-NL/messenger-mapi/",
-        "devtools-startup": "chrome/fy-NL/locale/fy-NL/devtools/startup/",
         "lightning": "chrome/fy-NL/locale/fy-NL/lightning/",
-        "global": "chrome/fy-NL/locale/fy-NL/global/"
-      },
-      "version": "20200405084446"
+        "passwordmgr": "chrome/fy-NL/locale/fy-NL/passwordmgr/",
+        "devtools-startup": "chrome/fy-NL/locale/fy-NL/devtools/startup/",
+        "places": "chrome/fy-NL/locale/fy-NL/places/",
+        "messenger-mapi": "chrome/fy-NL/locale/fy-NL/messenger-mapi/",
+        "necko": "chrome/fy-NL/locale/fy-NL/necko/",
+        "messenger-newsblog": "chrome/fy-NL/locale/fy-NL/messenger-newsblog/",
+        "calendar": "chrome/fy-NL/locale/fy-NL/calendar/",
+        "messenger": "chrome/fy-NL/locale/fy-NL/messenger/",
+        "global-platform": {
+          "android": "chrome/fy-NL/locale/fy-NL/global-platform/unix/",
+          "linux": "chrome/fy-NL/locale/fy-NL/global-platform/unix/",
+          "macosx": "chrome/fy-NL/locale/fy-NL/global-platform/mac/",
+          "win": "chrome/fy-NL/locale/fy-NL/global-platform/win/"
+        },
+        "autoconfig": "chrome/fy-NL/locale/fy-NL/autoconfig/"
+      }
+    }
+  },
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "id": "langpack-fy-NL@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
     }
   },
-  "langpack_id": "fy-NL",
   "manifest_version": 2,
-  "author": "mozilla.org (contributors: Wim Benes, Hindrik Sijens)",
+  "langpack_id": "fy-NL",
+  "version": "76.0buildid20200420212409",
   "name": "Frysk (fy) Language Pack",
-  "version": "76.0buildid20200407173003",
-  "description": "Language pack for Thunderbird for fy-NL"
+  "author": "mozilla.org (contributors: Wim Benes, Hindrik Sijens)",
+  "description": "Language pack for Thunderbird for fy-NL",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  }
 }
diff --git a/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl
index 365a486d44d8..52205c7ab875 100644
--- a/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/about/aboutAddons.ftl
@@ -129,11 +129,23 @@ extensions-view-available-updates =
     .name = Nuashonruithe Ar Fáil
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-extension = Eisínteachtaí
+addon-category-extension-title =
+    .title = Eisínteachtaí
 addon-category-plugin = Forlíontáin
+addon-category-plugin-title =
+    .title = Forlíontáin
 addon-category-dictionary = Foclóirí
+addon-category-dictionary-title =
+    .title = Foclóirí
 addon-category-locale = Teangacha
+addon-category-locale-title =
+    .title = Teangacha
 addon-category-available-updates = Nuashonruithe Ar Fáil
+addon-category-available-updates-title =
+    .title = Nuashonruithe Ar Fáil
 addon-category-recent-updates = Nuashonruithe Le Déanaí
+addon-category-recent-updates-title =
+    .title = Nuashonruithe Le Déanaí
 
 ## These are global warnings
 
diff --git a/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..6fbe8159b2db
--- /dev/null
+++ b/thunderbird-l10n/ga-IE/localization/ga-IE/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,3 @@
+# 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/.
diff --git a/thunderbird-l10n/ga-IE/manifest.json b/thunderbird-l10n/ga-IE/manifest.json
index 83a8bb2f5ac6..4f7c24b56092 100644
--- a/thunderbird-l10n/ga-IE/manifest.json
+++ b/thunderbird-l10n/ga-IE/manifest.json
@@ -1,57 +1,57 @@
 {
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "strict_max_version": "76.*",
+      "id": "langpack-ga-IE@thunderbird.mozilla.org"
+    }
+  },
+  "author": "mozilla.org (contributors: Séamus Ó Ciardhuáin, Kevin Scannell, Brian King)",
+  "description": "Language pack for Thunderbird for ga-IE",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "name": "Béarla (SAM) Language Pack",
-  "manifest_version": 2,
-  "author": "mozilla.org (contributors: Séamus Ó Ciardhuáin, Kevin Scannell, Brian King)",
   "languages": {
     "ga-IE": {
+      "version": "20200415055106",
       "chrome_resources": {
-        "lightning": "chrome/ga-IE/locale/ga-IE/lightning/",
-        "messenger-smime": "chrome/ga-IE/locale/ga-IE/messenger-smime/",
+        "devtools-shared": "chrome/ga-IE/locale/ga-IE/devtools/shared/",
         "passwordmgr": "chrome/ga-IE/locale/ga-IE/passwordmgr/",
-        "pippki": "chrome/ga-IE/locale/ga-IE/pippki/",
-        "places": "chrome/ga-IE/locale/ga-IE/places/",
-        "branding": "chrome/ga-IE/locale/ga-IE/branding/",
-        "devtools": "chrome/ga-IE/locale/ga-IE/devtools/client/",
+        "calendar": "chrome/ga-IE/locale/ga-IE/calendar/",
+        "messenger-region": "chrome/ga-IE/locale/ga-IE/messenger-region/",
+        "chat": "chrome/ga-IE/locale/ga-IE/chat/",
+        "lightning": "chrome/ga-IE/locale/ga-IE/lightning/",
+        "autoconfig": "chrome/ga-IE/locale/ga-IE/autoconfig/",
+        "necko": "chrome/ga-IE/locale/ga-IE/necko/",
+        "messenger": "chrome/ga-IE/locale/ga-IE/messenger/",
+        "messenger-mapi": "chrome/ga-IE/locale/ga-IE/messenger-mapi/",
         "global-platform": {
+          "macosx": "chrome/ga-IE/locale/ga-IE/global-platform/mac/",
           "win": "chrome/ga-IE/locale/ga-IE/global-platform/win/",
           "android": "chrome/ga-IE/locale/ga-IE/global-platform/unix/",
-          "linux": "chrome/ga-IE/locale/ga-IE/global-platform/unix/",
-          "macosx": "chrome/ga-IE/locale/ga-IE/global-platform/mac/"
+          "linux": "chrome/ga-IE/locale/ga-IE/global-platform/unix/"
         },
-        "necko": "chrome/ga-IE/locale/ga-IE/necko/",
-        "global": "chrome/ga-IE/locale/ga-IE/global/",
+        "alerts": "chrome/ga-IE/locale/ga-IE/alerts/",
+        "places": "chrome/ga-IE/locale/ga-IE/places/",
+        "pippki": "chrome/ga-IE/locale/ga-IE/pippki/",
+        "devtools": "chrome/ga-IE/locale/ga-IE/devtools/client/",
         "messenger-newsblog": "chrome/ga-IE/locale/ga-IE/messenger-newsblog/",
-        "messenger": "chrome/ga-IE/locale/ga-IE/messenger/",
-        "communicator": "chrome/ga-IE/locale/ga-IE/communicator/",
         "pluginproblem": "chrome/ga-IE/locale/ga-IE/pluginproblem/",
-        "chat": "chrome/ga-IE/locale/ga-IE/chat/",
-        "autoconfig": "chrome/ga-IE/locale/ga-IE/autoconfig/",
-        "mozldap": "chrome/ga-IE/locale/ga-IE/mozldap/",
-        "mozapps": "chrome/ga-IE/locale/ga-IE/mozapps/",
-        "devtools-shared": "chrome/ga-IE/locale/ga-IE/devtools/shared/",
-        "alerts": "chrome/ga-IE/locale/ga-IE/alerts/",
-        "messenger-mapi": "chrome/ga-IE/locale/ga-IE/messenger-mapi/",
+        "communicator": "chrome/ga-IE/locale/ga-IE/communicator/",
         "pipnss": "chrome/ga-IE/locale/ga-IE/pipnss/",
-        "calendar": "chrome/ga-IE/locale/ga-IE/calendar/",
+        "global": "chrome/ga-IE/locale/ga-IE/global/",
         "devtools-startup": "chrome/ga-IE/locale/ga-IE/devtools/startup/",
-        "messenger-region": "chrome/ga-IE/locale/ga-IE/messenger-region/"
-      },
-      "version": "20200403074723"
+        "messenger-smime": "chrome/ga-IE/locale/ga-IE/messenger-smime/",
+        "mozldap": "chrome/ga-IE/locale/ga-IE/mozldap/",
+        "mozapps": "chrome/ga-IE/locale/ga-IE/mozapps/",
+        "branding": "chrome/ga-IE/locale/ga-IE/branding/"
+      }
     }
   },
-  "version": "76.0buildid20200407173003",
-  "description": "Language pack for Thunderbird for ga-IE",
   "langpack_id": "ga-IE",
-  "applications": {
-    "gecko": {
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0",
-      "id": "langpack-ga-IE@thunderbird.mozilla.org"
-    }
-  }
+  "version": "76.0buildid20200420212409",
+  "name": "Béarla (SAM) Language Pack",
+  "manifest_version": 2
 }
diff --git a/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl
index 97f424810e71..d244df1edb6a 100644
--- a/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/gd/localization/gd/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Stàlaich tuilleadan o fhaidhle…
     .accesskey = i
 help-button = Taic nan tuilleadan
+sidebar-help-button-title =
+    .title = Taic nan tuilleadan
 preferences =
     { PLATFORM() ->
         [windows] Roghainnean { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Innealan airson a h-uile tuilleadan
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Roghainnean { -brand-short-name }
+           *[other] Roghainnean { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Bha leudachain ann nach b’ urrainn dhuinn dearbhadh
 show-all-extensions-button =
@@ -160,12 +168,26 @@ extensions-view-available-updates =
     .name = Ùrachaidhean a tha ri am faighinn
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-extension = Leudachain
+addon-category-extension-title =
+    .title = Leudachain
 addon-category-theme = Ùrlaran
+addon-category-theme-title =
+    .title = Ùrlaran
 addon-category-plugin = Plugain
+addon-category-plugin-title =
+    .title = Plugain
 addon-category-dictionary = Faclairean
+addon-category-dictionary-title =
+    .title = Faclairean
 addon-category-locale = Cànain
+addon-category-locale-title =
+    .title = Cànain
 addon-category-available-updates = Ùrachaidhean a tha ri am faighinn
+addon-category-available-updates-title =
+    .title = Ùrachaidhean a tha ri am faighinn
 addon-category-recent-updates = Ùrachaidhean a rinn thu o chionn goirid
+addon-category-recent-updates-title =
+    .title = Ùrachaidhean a rinn thu o chionn goirid
 
 ## These are global warnings
 
@@ -299,6 +321,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Seall nas lugha
 go-back-button =
     .tooltiptext = Air ais
+header-back-button =
+    .title = Air ais
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/gd/localization/gd/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/gd/localization/gd/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..dc41cc450500
--- /dev/null
+++ b/thunderbird-l10n/gd/localization/gd/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Chuir thu gu dol seann-tionndadh de { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Cruthaich pròifil ùr
+profiledowngrade-sync = Ma chleachdas tu seann-tionndadh de { -brand-product-name }, faodaidh gun truaill sin na comharran-lìn agus eachdraidh a’ bhrabhsaidh a chaidh a shàbhaladh ann am pròifil { -brand-product-name } làithreach. Gus am fiosrachadh agad a dhìon, cruthaich pròifil ùr airson an stàladh seo de { -brand-short-name }. ’S urrainn dhut clàradh a-steach le { -fxaccount-brand-name } gus na comharran-lìn agus eachdraidh a’ bhrabhsaidh agad a shioncronachadh eadar pròifilean.
+profiledowngrade-nosync = Ma chleachdas tu seann-tionndadh de { -brand-product-name }, faodaidh gun truaill sin na comharran-lìn agus eachdraidh a’ bhrabhsaidh a chaidh a shàbhaladh ann am pròifil { -brand-product-name } làithreach. Gus am fiosrachadh agad a dhìon, cruthaich pròifil ùr airson an stàladh seo de { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Fàg an-seo
+           *[other] Fàg an-seo
+        }
diff --git a/thunderbird-l10n/gd/manifest.json b/thunderbird-l10n/gd/manifest.json
index f5bc006930fa..d128eb46e113 100644
--- a/thunderbird-l10n/gd/manifest.json
+++ b/thunderbird-l10n/gd/manifest.json
@@ -1,57 +1,57 @@
 {
-  "author": "Sgioba Ionadaileadh Mozilla na Gàidhlig (contributors: Michael &apos;Akerbeltz&apos; Bauer, Kevin Scannell)",
-  "manifest_version": 2,
   "applications": {
     "gecko": {
-      "strict_min_version": "76.0",
       "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
       "id": "langpack-gd@thunderbird.mozilla.org"
     }
   },
-  "version": "76.0buildid20200407173003",
+  "manifest_version": 2,
+  "langpack_id": "gd",
+  "name": "Gàidhlig Language Pack",
+  "author": "Sgioba Ionadaileadh Mozilla na Gàidhlig (contributors: Michael &apos;Akerbeltz&apos; Bauer, Kevin Scannell)",
   "languages": {
     "gd": {
-      "version": "20200403074735",
       "chrome_resources": {
-        "pipnss": "chrome/gd/locale/gd/pipnss/",
-        "autoconfig": "chrome/gd/locale/gd/autoconfig/",
-        "messenger-region": "chrome/gd/locale/gd/messenger-region/",
-        "pippki": "chrome/gd/locale/gd/pippki/",
-        "mozldap": "chrome/gd/locale/gd/mozldap/",
-        "messenger": "chrome/gd/locale/gd/messenger/",
-        "communicator": "chrome/gd/locale/gd/communicator/",
-        "global": "chrome/gd/locale/gd/global/",
-        "messenger-smime": "chrome/gd/locale/gd/messenger-smime/",
         "pluginproblem": "chrome/gd/locale/gd/pluginproblem/",
-        "lightning": "chrome/gd/locale/gd/lightning/",
+        "alerts": "chrome/gd/locale/gd/alerts/",
+        "calendar": "chrome/gd/locale/gd/calendar/",
+        "messenger-newsblog": "chrome/gd/locale/gd/messenger-newsblog/",
+        "devtools-shared": "chrome/gd/locale/gd/devtools/shared/",
+        "chat": "chrome/gd/locale/gd/chat/",
+        "devtools-startup": "chrome/gd/locale/gd/devtools/startup/",
+        "places": "chrome/gd/locale/gd/places/",
+        "messenger-region": "chrome/gd/locale/gd/messenger-region/",
+        "devtools": "chrome/gd/locale/gd/devtools/client/",
         "global-platform": {
-          "linux": "chrome/gd/locale/gd/global-platform/unix/",
+          "macosx": "chrome/gd/locale/gd/global-platform/mac/",
           "android": "chrome/gd/locale/gd/global-platform/unix/",
-          "win": "chrome/gd/locale/gd/global-platform/win/",
-          "macosx": "chrome/gd/locale/gd/global-platform/mac/"
+          "linux": "chrome/gd/locale/gd/global-platform/unix/",
+          "win": "chrome/gd/locale/gd/global-platform/win/"
         },
-        "branding": "chrome/gd/locale/gd/branding/",
-        "messenger-mapi": "chrome/gd/locale/gd/messenger-mapi/",
+        "global": "chrome/gd/locale/gd/global/",
+        "communicator": "chrome/gd/locale/gd/communicator/",
+        "pippki": "chrome/gd/locale/gd/pippki/",
+        "autoconfig": "chrome/gd/locale/gd/autoconfig/",
+        "messenger-smime": "chrome/gd/locale/gd/messenger-smime/",
+        "lightning": "chrome/gd/locale/gd/lightning/",
+        "mozldap": "chrome/gd/locale/gd/mozldap/",
+        "messenger": "chrome/gd/locale/gd/messenger/",
         "necko": "chrome/gd/locale/gd/necko/",
         "mozapps": "chrome/gd/locale/gd/mozapps/",
-        "alerts": "chrome/gd/locale/gd/alerts/",
-        "devtools": "chrome/gd/locale/gd/devtools/client/",
-        "places": "chrome/gd/locale/gd/places/",
-        "chat": "chrome/gd/locale/gd/chat/",
-        "devtools-startup": "chrome/gd/locale/gd/devtools/startup/",
-        "calendar": "chrome/gd/locale/gd/calendar/",
-        "messenger-newsblog": "chrome/gd/locale/gd/messenger-newsblog/",
         "passwordmgr": "chrome/gd/locale/gd/passwordmgr/",
-        "devtools-shared": "chrome/gd/locale/gd/devtools/shared/"
-      }
+        "messenger-mapi": "chrome/gd/locale/gd/messenger-mapi/",
+        "pipnss": "chrome/gd/locale/gd/pipnss/",
+        "branding": "chrome/gd/locale/gd/branding/"
+      },
+      "version": "20200415055119"
     }
   },
-  "langpack_id": "gd",
-  "name": "Gàidhlig Language Pack",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "version": "76.0buildid20200420212409",
   "description": "Language pack for Thunderbird for gd"
 }
diff --git a/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl
index 2c0161cf9754..67645de4a325 100644
--- a/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/gl/localization/gl/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalar complemento desde o ficheiro…
     .accesskey = I
 help-button = Asistencia dos módulos
+sidebar-help-button-title =
+    .title = Asistencia dos módulos
 preferences =
     { PLATFORM() ->
         [windows] Opcións de { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Ferramentas para todos os complementos
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opcións de { -brand-short-name }
+           *[other] Preferencias de { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Non foi posíbel comprobar algunhas extensións
 show-all-extensions-button =
@@ -138,12 +146,26 @@ extensions-view-available-updates =
     .name = Actualizacións dispoñíbeis
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-extension = Extensións
+addon-category-extension-title =
+    .title = Extensións
 addon-category-theme = Temas
+addon-category-theme-title =
+    .title = Temas
 addon-category-plugin = Engadidos
+addon-category-plugin-title =
+    .title = Engadidos
 addon-category-dictionary = Dicionarios
+addon-category-dictionary-title =
+    .title = Dicionarios
 addon-category-locale = Idiomas
+addon-category-locale-title =
+    .title = Idiomas
 addon-category-available-updates = Actualizacións dispoñíbeis
+addon-category-available-updates-title =
+    .title = Actualizacións dispoñíbeis
 addon-category-recent-updates = Actualizacións recentes
+addon-category-recent-updates-title =
+    .title = Actualizacións recentes
 
 ## These are global warnings
 
diff --git a/thunderbird-l10n/gl/localization/gl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/gl/localization/gl/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..6fbe8159b2db
--- /dev/null
+++ b/thunderbird-l10n/gl/localization/gl/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,3 @@
+# 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/.
diff --git a/thunderbird-l10n/gl/manifest.json b/thunderbird-l10n/gl/manifest.json
index 9632ad981a92..2341b9863fe6 100644
--- a/thunderbird-l10n/gl/manifest.json
+++ b/thunderbird-l10n/gl/manifest.json
@@ -1,57 +1,57 @@
 {
+  "manifest_version": 2,
+  "name": "Galego (España) Language Pack",
+  "version": "76.0buildid20200420212409",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-gl@thunderbird.mozilla.org"
+    }
+  },
+  "author": "mozilla.org (contributors: Grupo de tradución ao galego dos aplicativos de Mozilla (http://galician.mozdev.org/))",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "description": "Language pack for Thunderbird for gl",
+  "langpack_id": "gl",
   "languages": {
     "gl": {
-      "version": "20200403074747",
       "chrome_resources": {
-        "autoconfig": "chrome/gl/locale/gl/autoconfig/",
         "devtools-startup": "chrome/gl/locale/gl/devtools/startup/",
-        "necko": "chrome/gl/locale/gl/necko/",
-        "messenger-region": "chrome/gl/locale/gl/messenger-region/",
-        "messenger-smime": "chrome/gl/locale/gl/messenger-smime/",
+        "branding": "chrome/gl/locale/gl/branding/",
+        "devtools-shared": "chrome/gl/locale/gl/devtools/shared/",
+        "chat": "chrome/gl/locale/gl/chat/",
+        "messenger-newsblog": "chrome/gl/locale/gl/messenger-newsblog/",
         "global": "chrome/gl/locale/gl/global/",
-        "pipnss": "chrome/gl/locale/gl/pipnss/",
+        "devtools": "chrome/gl/locale/gl/devtools/client/",
+        "autoconfig": "chrome/gl/locale/gl/autoconfig/",
+        "lightning": "chrome/gl/locale/gl/lightning/",
+        "mozapps": "chrome/gl/locale/gl/mozapps/",
         "messenger-mapi": "chrome/gl/locale/gl/messenger-mapi/",
+        "alerts": "chrome/gl/locale/gl/alerts/",
+        "messenger": "chrome/gl/locale/gl/messenger/",
         "global-platform": {
-          "android": "chrome/gl/locale/gl/global-platform/unix/",
-          "win": "chrome/gl/locale/gl/global-platform/win/",
           "macosx": "chrome/gl/locale/gl/global-platform/mac/",
-          "linux": "chrome/gl/locale/gl/global-platform/unix/"
+          "win": "chrome/gl/locale/gl/global-platform/win/",
+          "linux": "chrome/gl/locale/gl/global-platform/unix/",
+          "android": "chrome/gl/locale/gl/global-platform/unix/"
         },
-        "calendar": "chrome/gl/locale/gl/calendar/",
-        "passwordmgr": "chrome/gl/locale/gl/passwordmgr/",
-        "chat": "chrome/gl/locale/gl/chat/",
-        "pluginproblem": "chrome/gl/locale/gl/pluginproblem/",
-        "messenger": "chrome/gl/locale/gl/messenger/",
-        "mozapps": "chrome/gl/locale/gl/mozapps/",
+        "messenger-region": "chrome/gl/locale/gl/messenger-region/",
         "communicator": "chrome/gl/locale/gl/communicator/",
-        "devtools": "chrome/gl/locale/gl/devtools/client/",
-        "branding": "chrome/gl/locale/gl/branding/",
-        "pippki": "chrome/gl/locale/gl/pippki/",
-        "devtools-shared": "chrome/gl/locale/gl/devtools/shared/",
+        "messenger-smime": "chrome/gl/locale/gl/messenger-smime/",
+        "pluginproblem": "chrome/gl/locale/gl/pluginproblem/",
         "mozldap": "chrome/gl/locale/gl/mozldap/",
+        "passwordmgr": "chrome/gl/locale/gl/passwordmgr/",
         "places": "chrome/gl/locale/gl/places/",
-        "lightning": "chrome/gl/locale/gl/lightning/",
-        "messenger-newsblog": "chrome/gl/locale/gl/messenger-newsblog/",
-        "alerts": "chrome/gl/locale/gl/alerts/"
-      }
-    }
-  },
-  "version": "76.0buildid20200407173003",
-  "applications": {
-    "gecko": {
-      "id": "langpack-gl@thunderbird.mozilla.org",
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
-    }
-  },
-  "manifest_version": 2,
-  "langpack_id": "gl",
-  "description": "Language pack for Thunderbird for gl",
-  "author": "mozilla.org (contributors: Grupo de tradución ao galego dos aplicativos de Mozilla (http://galician.mozdev.org/))",
-  "name": "Galego (España) Language Pack",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
+        "pipnss": "chrome/gl/locale/gl/pipnss/",
+        "calendar": "chrome/gl/locale/gl/calendar/",
+        "necko": "chrome/gl/locale/gl/necko/",
+        "pippki": "chrome/gl/locale/gl/pippki/"
+      },
+      "version": "20200415055132"
     }
   }
 }
diff --git a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties
index 476ee46e6152..30664cffefec 100644
--- a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties
+++ b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/debugger.properties
@@ -94,6 +94,7 @@ copyStackTrace.accesskey=ע
 
 # LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button
 # that expands the Breakpoints panes in the debugger UI.
+expandBreakpoints=הרחבת החלונית של נקודות העצירה
 
 # LOCALIZATION NOTE (evaluateInConsole.label): Editor right-click menu item
 # to execute selected text in browser console.
@@ -1310,9 +1311,6 @@ unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
 # LOCALIZATION NOTE (expandSources): This is the tooltip for the button
 # that expands the Sources and Outlines panes in the debugger UI.
 expandSources=Expand Sources and Outline panes
-# LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button
-# that expands the Breakpoints panes in the debugger UI.
-expandBreakpoints=Expand Breakpoints pane
 # LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events
 # header.
 eventListenersHeader1=Event Listener Breakpoints
diff --git a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties
index ae01ee666cb3..004594773c97 100644
--- a/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/he/chrome/he/locale/he/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy=העתקה
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll=הרחבת הכל
 
+jsonViewer.ExpandAllSlow=הרחבת הכל (איטי)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll=צמצום הכל
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON=סינון JSON
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference=הפניה מעגלית
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties b/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties
index 9faff1753848..6672c3dc6ec7 100644
--- a/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties
+++ b/thunderbird-l10n/he/chrome/he/locale/he/global/commonDialogs.properties
@@ -30,7 +30,7 @@ ScriptDialogPreventTitle=העדפות דו־שיח האישור
 # bug 244273). %1 should be integrated into the translated sentences as
 # little as possible. %2 is the url of the site being accessed.
 EnterLoginForRealm3=השרת %2$S מבקש את שם המשתמש והססמה שלך. מהאתר נמסר: “%1$S”
-EnterLoginForProxy3=השרת המתווך %2$S מבקש שם משתמש וססמה. מסר האתר: “%1$S”
+EnterLoginForProxy3=השרת המתווך %2$S מבקש שם משתמש וססמה. מהאתר נמסר: “%1$S”
 EnterUserPasswordFor2=%1$S מבקש את שם המשתמש והססמה שלך.
 EnterUserPasswordForCrossOrigin2=השרת %1$S מבקש את שם המשתמש והססמה שלך. זהירות: הססמה לא תשלח אל האתר הנוכחי!
 EnterPasswordFor=הכנס שם משתמש וססמה עבור %1$S ב־%2$S
diff --git a/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties b/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties
index 812993dfcc42..98ff65b0342f 100644
--- a/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties
+++ b/thunderbird-l10n/he/chrome/he/locale/he/necko/necko.properties
@@ -42,13 +42,24 @@ AutomaticAuth=אתה עומד להתחבר אל האתר "%1$S" עם שם המש
 
 TrackerUriBlocked=המשאב ב־„%1$S” נחסם כי הופעלה חסימת תוכן.
 UnsafeUriBlocked=המשאב „%1$S“ נחסם על־ידי גלישה בטוחה.
+CookieBlockedByPermission=בקשת גישה לעוגייה או אחסון ב־”%1$S” נחסמה עקב הרשאות עוגייה מותאמות אישית.
 
 # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByStorageAccessAPI): %3$S, %2$S and %1$S are URLs.
+
 # LOCALIZATION NOTE (CookieAllowedForTrackerByStorageAccessAPI): %2$S and %1$S are URLs.
 # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByHeuristic): %3$S, %2$S and %1$S are URLs.
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 
-CookieBlockedByPermission=Request to access cookies or storage on “%1$S” was blocked because of custom cookie permission.
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+
+# LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
+# LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
+# LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax".
+# LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none".
+# LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
+# LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
+# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
+
 CookieBlockedTracker=Request to access cookie or storage on “%1$S” was blocked because it came from a tracker and content blocking is enabled.
 CookieBlockedAll=Request to access cookie or storage on “%1$S” was blocked because we are blocking all storage access requests.
 CookieBlockedForeign=Request to access cookie or storage on “%1$S” was blocked because we are blocking all third-party storage access requests and content blocking is enabled.
diff --git a/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl
index 9b4455d67172..c90281d1942e 100644
--- a/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/he/localization/he/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = התקנת תוספת מקובץ…
     .accesskey = ה
 help-button = תמיכה בתוספות
+sidebar-help-button-title =
+    .title = תמיכה בתוספות
 preferences =
     { PLATFORM() ->
         [windows] אפשרויות של { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = כלים עבור כל התוספות
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] אפשרויות של { -brand-short-name }
+           *[other] העדפות של { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = אין אפשרות לאמת חלק מההרחבות
 show-all-extensions-button =
@@ -167,13 +175,29 @@ extensions-view-available-updates =
     .name = עדכונים זמינים
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = המלצות
+addon-category-discover-title =
+    .title = המלצות
 addon-category-extension = הרחבות
+addon-category-extension-title =
+    .title = הרחבות
 addon-category-theme = ערכות נושא
+addon-category-theme-title =
+    .title = ערכות נושא
 addon-category-plugin = תוספים חיצוניים
+addon-category-plugin-title =
+    .title = תוספים חיצוניים
 addon-category-dictionary = מילונים
+addon-category-dictionary-title =
+    .title = מילונים
 addon-category-locale = שפות
+addon-category-locale-title =
+    .title = שפות
 addon-category-available-updates = עדכונים זמינים
+addon-category-available-updates-title =
+    .title = עדכונים זמינים
 addon-category-recent-updates = עדכונים אחרונים
+addon-category-recent-updates-title =
+    .title = עדכונים אחרונים
 
 ## These are global warnings
 
@@ -286,6 +310,7 @@ shortcuts-no-commands = להרחבות הבאות אין קיצורי דרך:
 shortcuts-input =
     .placeholder = נא להקליד קיצור דרך
 shortcuts-browserAction = הפעלת הרחבה
+shortcuts-browserAction2 = הפעלת הכפתור בסרגל הכלים
 shortcuts-pageAction = הפעלת פעולת דף
 shortcuts-sidebarAction = הצגה/הסתרה של סרגל הצד
 shortcuts-modifier-mac = יש לכלול Ctrl, ‏Alt או ⌘
@@ -311,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = הצגת פחות
 go-back-button =
     .tooltiptext = חזרה אחורה
+header-back-button =
+    .title = חזרה אחורה
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl
index 8ada5c5c8359..5e03fd622840 100644
--- a/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/he/localization/he/toolkit/about/aboutSupport.ftl
@@ -147,6 +147,7 @@ intl-regional-prefs = העדפות אזוריות
 ##
 ## See also https://firefox-source-docs.mozilla.org/remote/
 
+remote-debugging-title = ניפוי שגיאות מרחוק (פרוטוקול Chromium)
 remote-debugging-url = כתובת
 
 ##
diff --git a/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl b/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl
index 4d6be1399ee9..3a7241d551d0 100644
--- a/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/he/localization/he/toolkit/about/certviewer.ftl
@@ -51,6 +51,8 @@ certificate-viewer-business-category = קטגוריית עסקים
 certificate-viewer-public-key-info = מידע מפתח ציבורי
 certificate-viewer-miscellaneous = שונות
 certificate-viewer-fingerprints = טביעות אצבע
+certificate-viewer-certificate-policies = מדיניות של אישור
+certificate-viewer-crl-endpoints = נקודות קצה של CRL
 # This message is used as a row header in the Miscellaneous section. 
 # The associated data cell contains links to download the certificate.
 certificate-viewer-download = הורדה
@@ -66,3 +68,16 @@ certificate-viewer-boolean =
 ## Variables:
 ##   $fileName (String) - The file name to save the PEM data in, derived from the common name from the certificate being displayed.
 
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = הרחבה זו סומנה כקריטית, כלומר לקוחות חייבים לדחות את האישור אם הם לא מבינים אותו.
+certificate-viewer-export = ייצוא
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = האישורים שלך
+certificate-viewer-tab-people = אנשים
+certificate-viewer-tab-servers = שרתים
+certificate-viewer-tab-ca = רשויות
+certificate-viewer-tab-unkonwn = לא ידוע
diff --git a/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl b/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl
index 9de30ffe7212..4134d7fb62b1 100644
--- a/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/he/localization/he/toolkit/global/processTypes.ftl
@@ -12,3 +12,5 @@ process-type-weblargeallocation = הקצאה גדולה
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = מעבד גרפי
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/he/localization/he/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/he/localization/he/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..dc6cf9d1d5f5
--- /dev/null
+++ b/thunderbird-l10n/he/localization/he/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = הפעלת גרסה ישנה של { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = יצירת פרופיל חדש
+profiledowngrade-sync = שימוש בגרסה ישנה של { -brand-product-name } עלול לפגוע בסימניות ובהיסטוריית הגלישה שכבר שמורים בפרופיל קיים ב־{ -brand-product-name }. כדי להגן על המידע שלך, יש ליצור פרופיל חדש עבור התקנה זו של { -brand-short-name }. תמיד ניתן להיכנס באמצעות { -fxaccount-brand-name } כדי לסנכרן את הסימניות והיסטוריית הגלישה שלך בין פרופילים.
+profiledowngrade-nosync = שימוש בגרסה ישנה של { -brand-product-name } עלול לפגוע בסימניות ובהיסטוריית הגלישה שכבר שמורים בפרופיל קיים ב־{ -brand-product-name }. כדי להגן על המידע שלך, יש ליצור פרופיל חדש עבור התקנה זו של { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] יציאה
+           *[other] יציאה
+        }
diff --git a/thunderbird-l10n/he/manifest.json b/thunderbird-l10n/he/manifest.json
index 65cb72e7d82a..4347e6f996a8 100644
--- a/thunderbird-l10n/he/manifest.json
+++ b/thunderbird-l10n/he/manifest.json
@@ -1,6 +1,5 @@
 {
   "langpack_id": "he",
-  "description": "Language pack for Thunderbird for he",
   "applications": {
     "gecko": {
       "id": "langpack-he@thunderbird.mozilla.org",
@@ -8,50 +7,51 @@
       "strict_min_version": "76.0"
     }
   },
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "version": "76.0buildid20200407173003",
+  "version": "76.0buildid20200420212409",
+  "author": "mozilla.org (contributors: Reuven Gonen, Tsahi Asher, Tomer Cohen)",
+  "manifest_version": 2,
   "name": "Hebrew (IL) Language Pack",
   "languages": {
     "he": {
-      "version": "20200403152317",
       "chrome_resources": {
-        "global-platform": {
-          "win": "chrome/he/locale/he/global-platform/win/",
-          "android": "chrome/he/locale/he/global-platform/unix/",
-          "linux": "chrome/he/locale/he/global-platform/unix/",
-          "macosx": "chrome/he/locale/he/global-platform/mac/"
-        },
-        "autoconfig": "chrome/he/locale/he/autoconfig/",
-        "alerts": "chrome/he/locale/he/alerts/",
-        "pippki": "chrome/he/locale/he/pippki/",
+        "global": "chrome/he/locale/he/global/",
+        "mozapps": "chrome/he/locale/he/mozapps/",
+        "lightning": "chrome/he/locale/he/lightning/",
+        "mozldap": "chrome/he/locale/he/mozldap/",
         "chat": "chrome/he/locale/he/chat/",
-        "messenger-newsblog": "chrome/he/locale/he/messenger-newsblog/",
-        "messenger-region": "chrome/he/locale/he/messenger-region/",
-        "calendar": "chrome/he/locale/he/calendar/",
-        "pluginproblem": "chrome/he/locale/he/pluginproblem/",
-        "places": "chrome/he/locale/he/places/",
         "devtools-startup": "chrome/he/locale/he/devtools/startup/",
-        "messenger-mapi": "chrome/he/locale/he/messenger-mapi/",
-        "messenger": "chrome/he/locale/he/messenger/",
-        "messenger-smime": "chrome/he/locale/he/messenger-smime/",
-        "mozldap": "chrome/he/locale/he/mozldap/",
-        "global": "chrome/he/locale/he/global/",
-        "devtools-shared": "chrome/he/locale/he/devtools/shared/",
+        "pippki": "chrome/he/locale/he/pippki/",
+        "branding": "chrome/he/locale/he/branding/",
+        "necko": "chrome/he/locale/he/necko/",
         "devtools": "chrome/he/locale/he/devtools/client/",
-        "lightning": "chrome/he/locale/he/lightning/",
+        "autoconfig": "chrome/he/locale/he/autoconfig/",
         "pipnss": "chrome/he/locale/he/pipnss/",
+        "messenger-region": "chrome/he/locale/he/messenger-region/",
+        "alerts": "chrome/he/locale/he/alerts/",
+        "devtools-shared": "chrome/he/locale/he/devtools/shared/",
+        "messenger-smime": "chrome/he/locale/he/messenger-smime/",
+        "messenger-mapi": "chrome/he/locale/he/messenger-mapi/",
         "communicator": "chrome/he/locale/he/communicator/",
+        "messenger": "chrome/he/locale/he/messenger/",
         "passwordmgr": "chrome/he/locale/he/passwordmgr/",
-        "necko": "chrome/he/locale/he/necko/",
-        "branding": "chrome/he/locale/he/branding/",
-        "mozapps": "chrome/he/locale/he/mozapps/"
-      }
+        "places": "chrome/he/locale/he/places/",
+        "calendar": "chrome/he/locale/he/calendar/",
+        "global-platform": {
+          "linux": "chrome/he/locale/he/global-platform/unix/",
+          "win": "chrome/he/locale/he/global-platform/win/",
+          "android": "chrome/he/locale/he/global-platform/unix/",
+          "macosx": "chrome/he/locale/he/global-platform/mac/"
+        },
+        "messenger-newsblog": "chrome/he/locale/he/messenger-newsblog/",
+        "pluginproblem": "chrome/he/locale/he/pluginproblem/"
+      },
+      "version": "20200420084421"
     }
   },
-  "manifest_version": 2,
-  "author": "mozilla.org (contributors: Reuven Gonen, Tsahi Asher, Tomer Cohen)"
+  "description": "Language pack for Thunderbird for he",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  }
 }
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties
index 735ad3de21d7..bfc09f835491 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/aboutdebugging.properties
@@ -184,7 +184,7 @@ nothing = Još ništa.
 # This string is displayed in about:debugging#workers if the current configuration of the
 # browser is incompatible with service workers. More details at
 # https://developer.mozilla.org/en-US/docs/Tools/about%3Adebugging#Service_workers_not_compatible
-configurationIsNotCompatible.label = Konfiguracija vašeg preglednika nije kompatibilna s radnim procesima usluge.
+configurationIsNotCompatible.label = Konfiguracija tvog preglednika nije kompatibilna s radnim procesima usluge.
 
 # LOCALIZATION NOTE (configurationIsNotCompatible.learnMore):
 # This string is displayed as a link next to configurationIsNotCompatible.label and leads
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties
index 68acd701196e..94784995825d 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/inspector.properties
@@ -103,7 +103,7 @@ markupView.event.tooltiptext=Prepoznavanje događaja
 # LOCALIZATION NOTE (markupView.custom.tooltiptext)
 # Used in a tooltip that appears when the user hovers over 'custom' badge in
 # the markup view. Only displayed on custom elements with a shadow root attached.
-markupView.custom.tooltiptext=Pokažite definiciju prilagođenih elemenata
+markupView.custom.tooltiptext=Pokaži definiciju prilagođenih elemenata
 
 # LOCALIZATION NOTE (markupView.newAttribute.label)
 # This is used to speak the New Attribute button when editing a tag
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties
index f906df9891a0..8b5628557d43 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webconsole.properties
@@ -119,7 +119,7 @@ cdFunctionInvalidArgument=cd() na dani prozor nije izvediv. Neispravan argument.
 # LOCALIZATION NOTE (selfxss.msg): the text that is displayed when
 # a new user of the developer tools pastes code into the console
 # %1 is the text of selfxss.okstring
-selfxss.msg=Upozorenje prijevare: budite oprezni kada ljepite stvari za koje niste sigurni. Takve radnje mogu omogućiti napadačima krađu vašeg identiteta ili preuzimanje kontrole nad vašim računalom. Da biste omogućili ljepljenje, upišite ispod '%S' (nema potrebe za pritiskom na tipku enter).
+selfxss.msg=Upozorenje prevare: pazi prilikom umetanja stvari koje ne razumiješ. Takve radnje mogu omogućiti napadačima ukrasti tvoj identitet ili preuzeti kontrolu nad tvojim računalom. Da omogućavanje ljepljenja, dolje upiši '%S' (ne moraš protisnuti tipku enter).
 
 # LOCALIZATION NOTE (selfxss.okstring): the string to be typed
 # in by a new user of the developer tools when they receive the sefxss.msg prompt.
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties
index 969e1160b5a4..5e73c9790d6f 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/client/webide.properties
@@ -46,7 +46,7 @@ error_appProjectsLoadFailed=Učitavanje popisa projekata nije uspjelo. Ovo se mo
 error_folderCreationFailed=Stvaranje direktorija projekta u odabranom direktoriju nije moguće.
 
 # Variable: runtime app build ID (looks like this %Y%M%D format) and firefox build ID (same format)
-error_runtimeVersionTooRecent=Spojeni runtime ima noviji datum izrade (%1$S) u odnosu na vaš Firefox (%2$S). Ovo je nepodržano podešenje koje može uzrokovati probleme sa DevTools alatom. Molimo vas da nadogradite Firefox.
+error_runtimeVersionTooRecent=Spojeni runtime ima noviji datum izrade (%1$S) u odnosu na tvoj Firefox (%2$S). Ovo je nepodržana postava, koja može prouzročiti probleme s DevTools alatom. Nadogradi Firefox.
 
 # Variable: runtime app version (looks like this 52.a3) and firefox version (same format)
 
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties
index 66f40ac6d5b3..0baf80c6c2b9 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/devtools/shared/debugger.properties
@@ -16,7 +16,7 @@ remoteIncomingPromptTitle=Dolazna veza
 
 # LOCALIZATION NOTE (remoteIncomingPromptHeader): Header displayed on the
 # dialog that prompts the user to allow the incoming connection.
-remoteIncomingPromptHeader=Uočen je dolazni zahtjev za dopuštanje udaljenog otklanjanja problema s vezom. Udaljeni klijent može preuzeti potpunu kontrolu nad vašim web preglednikom!
+remoteIncomingPromptHeader=Uočen je dolazni zahtjev za dopuštanje udaljenog otklanjanja problema s vezom. Udaljeni klijent može preuzeti potpunu kontrolu nad tvojim preglednikom!
 # LOCALIZATION NOTE (remoteIncomingPromptClientEndpoint): Part of the prompt
 # dialog for the user to choose whether an incoming connection should be
 # allowed.
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd
index 874a0b8da960..7c6a5347ad36 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appPicker.dtd
@@ -3,5 +3,5 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!ENTITY NoAppFound.label      "Nije pronađen program za ovaj tip datoteke.">
-<!ENTITY BrowseButton.label    "Pretraži…">
+<!ENTITY BrowseButton.label    "Pregledaj …">
 <!ENTITY SendMsg.label         "Pošalji ovu stavku za:">
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties
index 4128e7a8d323..e5183ee39451 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/appstrings.properties
@@ -29,16 +29,16 @@ externalProtocolPrompt=Vanjska aplikacija mora biti pokrenuta za upravljanje %1$
 externalProtocolUnknown=<Nepoznato>
 externalProtocolChkMsg=Zapamti moj izbor za sve poveznice ove vrste.
 externalProtocolLaunchBtn=Pokreni aplikaciju
-malwareBlocked=Stranica na %S je prijavljena kao zloćudna stranica i blokirana je na temelju vaših sigurnosnih osobitosti.
-harmfulBlocked=Web stranica %S je prijavljena kao potencijalno zlonamjerna stranica i blokirana je na temelju vaših sigurnosnih postavki.
-unwantedBlocked=Stranica na %S je prijavljena zbog posluživanja nepoželjnog softvera, te je blokirana na temelju vaših sigurnosnih postavki.
-deceptiveBlocked=Web stranica %S je prijavljena kao obmanjujuća stranica i blokirana je na temelju vaših sigurnosnih postavki.
-cspBlocked=Ova stranica ima sigurnosnu politiku sadržaja koja sprječava njeno učitavanje na ovaj način.
-xfoBlocked=Ova stranica ima X-Frame-Options pravilo koje sprječava da se stranica otvori u ovom kontekstu.
+malwareBlocked=Stranica na %S je prijavljena kao zloćudna stranica i blokirana je na osnovi tvojih sigurnosnih osobitosti.
+harmfulBlocked=Web stranica %S je prijavljena kao potencijalno zlonamjerna stranica i blokirana je na osnovi tvojih sigurnosnih postavki.
+unwantedBlocked=Stranica na %S je prijavljena zbog posluživanja nepoželjnog softvera, te je blokirana na osnovi tvojih sigurnosnih postavki.
+deceptiveBlocked=Web stranica %S je prijavljena kao obmanjujuća stranica i blokirana je na osnovi tvojih sigurnosnih postavki.
+cspBlocked=Ova stranica ima sigurnosnu politiku sadržaja koja sprečava njeno učitavanje na ovaj način.
+xfoBlocked=Ova stranica ima X-Frame-Options pravilo koje sprečava da se stranica otvori u ovom kontekstu.
 corruptedContentErrorv2=Stranica %S je doživjela povredu mrežnog protokola koja ne može biti ispravljena.
 remoteXUL=Ova stranica koristi nepodržanu tehnologiju, koja standardno više nije dostupna.
-sslv3Used=Sigurnost vaših podataka na %S ne može biti zajamčena jer koristi SSLv3, pokvaren sigurnosni protokol.
+sslv3Used=Sigurnost tvojih podataka na %S ne može biti zajamčena, jer koristi SSLv3, pokvaren sigurnosni protokol.
 weakCryptoUsed=Vlasnik %S je pogrešno podesio svoju stranicu. Da bismo spriječili krađu informacija, veza s ovom stranicom nije uspostavljena.
 inadequateSecurityError=Web stranica je pokušala pregovarati nedovoljnu razinu sigurnosti.
-blockedByPolicy=Vaša organizacija je blokirala pristup ovoj web stranici.
+blockedByPolicy=Tvoja organizacija je blokirala pristup ovoj web stranici.
 networkProtocolError=Firefox je doživio povredu mrežnog protokola koja ne može biti ispravljena.
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties
index ff2b08b5e1c3..87b094bcfd17 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/autocomplete.properties
@@ -7,11 +7,11 @@
 # because the provider can also end with "Search" (e.g.: MSN Search).
 searchWithEngine = Traži pomoću %S
 
-searchInPrivateWindowWithEngine = Pretražuj sa %S u Privatnom pretraživanju
+searchInPrivateWindowWithEngine = Pretraži s %S u privatnom prozoru
 
 # LOCALIZATION NOTE (searchInPrivateWindow): Used when the private browsing
 # engine is the same as the default engine.
-searchInPrivateWindow = Pretražuj u Privatnom pretraživanju
+searchInPrivateWindow = Pretraži u privatnom prozoru
 
 # LOCALIZATION NOTE (switchToTab2): This is the same as the older switchToTab
 # string that it's replacing, except it uses title case, so "Switch" and "Tab"
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties
index 5f369e52df4f..d3e3d046713f 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/browser.properties
@@ -3,8 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 browsewithcaret.checkMsg=Ne prikazuj više ovaj dijalog.
-browsewithcaret.checkWindowTitle=Pokazivačko pretraživanje
-browsewithcaret.checkLabel=Pritiskom na F7, uključujete ili isključujete Pokazivačko pretraživanje. To znači da će se na stranici pojaviti kursor koji vam omogućava označavanje teksta tipkovnicom. Želite li uključiti Pokazivačko pretraživanje?
+browsewithcaret.checkWindowTitle=Pokazivačko pregledavanje
+browsewithcaret.checkLabel=Pritiskom na F7, uključuje ili isključuje se pokazivačko pregledavanje. To znači da će se na stranici pojaviti kursor koji omogućuje označavanje teksta tipkovnicom. Želiš li uključiti pokazivačko pregledavanje?
 browsewithcaret.checkButtonLabel=Da
 
 plainText.wordWrap=Omotaj duge linije
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties
index ba3ec8a66c97..e72924d08088 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/dom/dom.properties
@@ -20,7 +20,7 @@ DontAskAgain=&Ne pitaj me ponovo
 JSURLLoadBlockedWarning=Pokušaj učitavanja javascripta: URL jednog poslužitelja\nkoji u prozoru prikazuje sadržaj jednog drugog poslužitelja\nblokiran je od sigurnosnog upravljača.
 WindowCloseBlockedWarning=Skripte ne mogu zatvarati prozore koji nisu bili otvoreni skriptom.
 OnBeforeUnloadTitle=Jeste li sigurni?
-OnBeforeUnloadMessage=Ova stranica traži potvrdu vašeg odlaska - podaci koje ste unijeli možda neće biti spremljeni.
+OnBeforeUnloadMessage=Ova stranica traži potvrdu, da je želiš napustiti – uneseni podaci možda neće biti spremljeni.
 OnBeforeUnloadStayButton=Ostani na stranici
 OnBeforeUnloadLeaveButton=Napusti stranicu
 UnexpectedCanvasVariantStyle=canvas: pokušaj postavljanja strokeStyle ili fillStyle na vrijednost koja nije izraz, CanvasGradient ili CanvasPattern je ignoriran.
@@ -127,7 +127,7 @@ MediaLoadDecodeError=Multimedija izvor %S nije moguće dekodirati.
 # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm')
 MediaWMFNeeded=Za prikaz %S video formata, moraš instalirati dodatni Microsoft softver. Pogledaj https://support.mozilla.org/kb/fix-video-audio-problems-firefox-windows
 # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm')
-MediaPlatformDecoderNotFound=Video na ovoj stranici ne može biti reproduciran. Vaš sustav možda nema potrebne video kodeke za: %S
+MediaPlatformDecoderNotFound=Video na ovoj stranici se ne može reproducirati. Tvoj sustav možda nema potrebne video kodeke za: %S
 MediaUnsupportedLibavcodec=Videozapis se na ovoj stranici ne može pokrenuti. Tvoj sustav sadrži nepodržanu verziju za libavcodec
 # LOCALIZATION NOTE: %1$S is the URL of the media resource, %2$S is technical information (in English)
 MediaDecodeError=Medijski resurs %1$S nije moguće dekodirati, greška: %2$S
@@ -359,6 +359,7 @@ MathML_DeprecatedStyleAttributeWarning=MathML atributi „background”, „colo
 MathML_DeprecatedXLinkAttributeWarning=XLink atributi “href”, “type”, “show” i “actuate” su zastarjeli za MathML elemente i uklonit će se u budućnosti.
 WebShareAPI_Failed=Operacija dijeljenja nije uspjela.
 WebShareAPI_Aborted=Operacija dijeljenja je prekinuta.
+# LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
 
 # LOCALIZATION NOTE: %S is the name of the header in question
 ForbiddenHeaderWarning=Attempt to set a forbidden header was denied: %S
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties
index f13b672c23e9..acb40fad3132 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/extensions.properties
@@ -23,7 +23,7 @@ csp.error.illegal-host-wildcard = %2$S: izvori zamjenskih znakova u ‘%1$S’ d
 uninstall.confirmation.title = Ukloni %S
 
 #LOCALIZATION NOTE (uninstall.confirmation.message) %S is the name of the extension which is about to be uninstalled.
-uninstall.confirmation.message = Dodatak je “%S” zatražio svoje uklanjanje. Što želite učiniti?
+uninstall.confirmation.message = Dodatak „%S” je zatražio da ga se ukloni. Što želiš učiniti?
 
 uninstall.confirmation.button-0.label = Ukloni
 uninstall.confirmation.button-1.label = Zadrži dodatak
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties
index d18bb2179794..9dc5ed723a83 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/layout/HtmlForm.properties
@@ -4,7 +4,7 @@
 
 Reset=Poništi
 Submit=Predaj upit
-Browse=Pretraži...
+Browse=Pregledaj …
 FileUpload=Slanje datoteke
 DirectoryUpload=Odabir mape za prijenos na poslužitelj
 DirectoryPickerOkButtonLabel=Prijenos
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd
index 434511ffd7ad..26a2fe9d1d6b 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/netError.dtd
@@ -11,10 +11,10 @@
 <!ENTITY connectionFailure.longDesc "<p>Iako je ime stranice ispravno, preglednik nije u stanju uspostaviti vezu.</p><ul><li>Možda je stranica privremeno nedostupna? Pokušaj ponovo kasnije.</li><li>Možeš li pregledati druge stranice? Provjeri mrežne postavke računala.</li><li>Je li tvoje računalo ili mreža zaštićena vatrozidom ili proxyem? Neispravne postavke mogu onemogućiti pregledavanje interneta.</li></ul>">
 
 <!ENTITY deniedPortAccess.title "Ulaz zabranjen zbog sigurnosih razloga">
-<!ENTITY deniedPortAccess.longDesc "<p>Zatražena adresa ima definiran ulaz (npr. <q>mozilla.org:80</q> za ulaz 80 na mozilla.org) koji se inače koristi za <em>druge</em> radnje, a ne pretraživanje. Pretraživač je prekinuo zahtjev za vaše zaštite i sigurnosti.</p>">
+<!ENTITY deniedPortAccess.longDesc "<p>Zatražena adresa ima definiran ulaz (npr. <q>mozilla.org:80</q> za ulaz 80 na mozilla.org) koji se inače koristi za <em>druge</em> radnje, a ne pretraživanje. Pretraživač je prekinuo zahtjev za tvoje zaštite i sigurnosti.</p>">
 
 <!ENTITY dnsNotFound.title "Adresa nije pronađena">
-<!ENTITY dnsNotFound.longDesc "<p>Preglednik nije pronašao poslužitelja za danu adresu.</p><ul><li>Jeste li napravili grešku prilikom upisa adrese? (npr. <q><strong>ww</strong>.mozilla.org</q> umjesto <q><strong>www</strong>mozilla.org</q>)</li><li>Jeste li sigurni da ova domena postoji? Možda joj je istekla registracija.</li><li>Ne možete pregledati i druge stranice? Provjerite mrežne postavke i postavke DNS poslužitelja.</li><li>Je li vaše računalo zaštićeno vatrozidom ili proxyem? Neispravne postavke mogu onemoućiti pretraživanje.</li></ul>">
+<!ENTITY dnsNotFound.longDesc "<p>Preglednik nije pronašao poslužitelja za navedenu adresu.</p><ul><li>Je li adresa krivo upisana? (npr. <q><strong>ww</strong>.mozilla.org</q> umjesto <q><strong>www</strong>mozilla.org</q>)</li><li>Je li ova domena stvarno postoji? Možda joj je istekla registracija.</li><li>Ne možeš pregledati druge stranice? Provjeri mrežne postavke i postavke DNS poslužitelja.</li><li>Je li tvoje računalo zaštićeno vatrozidom ili proxyem? Neispravne postavke mogu onemogućiti pregledavanje.</li></ul>">
 
 <!ENTITY fileNotFound.title "Datoteka nije pronađena">
 <!ENTITY fileNotFound.longDesc "<ul><li>Možda je uklonjena, premještena ili joj je ime promijenjeno?</li><li>Postoji li pravopisna ili nekakva tipografska greška?</li><li>Imate li dovoljna prava za pristup traženoj datoteci?</li></ul>">
@@ -59,7 +59,7 @@
 <!ENTITY proxyResolveFailure.longDesc "<p>Preglednik je postavljen da koristi proxy poslužitelj, ali ga nije moguće naći.</p><ul><li>Jesu li proxy postavke ispravne? Provjeri postavke i pokušaj ponovo.</li><li>Je li računalo povezano na aktivnu mrežu?</li><li>Ako još uvijek imaš problema, obrati se administratoru mreže ili pružatelju internet usluge.</li></ul>">
 
 <!ENTITY redirectLoop.title "Petlja preusmjeravanja">
-<!ENTITY redirectLoop.longDesc "<p>Preglednik je odustao od dohvaćanja zatražene stranice. Stranica preusmjerava zahtjev na takav način da on nikada ne može biti ispunjen.</p><ul><li>Jeste li onemogućili ili blokirali kolačiće za ovu stranicu?</li><li><em>OPASKA</em>: Ako prihvaćanje kolačića stranice ne riješi problem, vrlo je vjerojatno problem s konfiguracijom poslužitelja, a ne vašeg računala.</li></ul>">
+<!ENTITY redirectLoop.longDesc "<p>Preglednik je odustao od dohvaćanja zatražene stranice. Stranica preusmjerava zahtjev na takav način, da on nikada ne može biti ispunjen.</p><ul><li>Jesu li kolačići za ovu stranicu deaktivirani ili blokirani?</li><li><em>OPASKA</em>: Ako prihvaćanje kolačića stranice ne riješi problem, vrlo vjerojatno se radi o probleu s konfiguracijom poslužitelja, a ne tvog računala.</li></ul>">
 
 <!ENTITY unknownSocketType.title "Neispravan odgovor">
 <!ENTITY unknownSocketType.longDesc "<p>Stranica je na mreži zahtjev odgovorila na neočekivani način, te stoga pretraživač ne može nastaviti.</p>">
@@ -74,7 +74,7 @@
 </ul>">
 
 <!ENTITY securityOverride.linkText "Ili možete dodati iznimku…">
-<!ENTITY securityOverride.warningContent "<p>Ne biste trebali dodavati iznimke ako koristite vezu prema Internetu kojoj ne vjerujete u potpunosti ili ako niste ranije viđali upozorenje za ovaj poslužitelj.</p> <p>Ako ipak želite dodati iznimku za ovu stranicu, to možete učiniti u naprednim postavkama enkripcije.</p>">
+<!ENTITY securityOverride.warningContent "<p>Nemoj dodavati iznimke ako koristiš internetsku vezu kojoj ne vjeruješ u potpunosti ili ako nisi ranije viđao/la upozorenje za ovaj poslužitelj.</p> <p>Ako ipak želiš dodati iznimku za ovu stranicu, to možeš učiniti u naprednim postavkama šifriranja.</p>">
 
 <!ENTITY cspBlocked.title "Blokirala sigurnosna politika sadržaja">
 <!ENTITY cspBlocked.longDesc "<p>Preglednik je zaustavio učitavanje ove stranice na ovaj način jer stranica ima sigurnosnu politiku sadržaja koja to zabranjuje.</p>">
@@ -88,7 +88,7 @@
 <!ENTITY remoteXUL.title "Udaljeni XUL">
 <!ENTITY remoteXUL.longDesc "<p><ul><li>Obavijestite vlasnike web stranice o ovom problemu.</li></ul></p>">
 
-<!ENTITY inadequateSecurityError.title "Vaša veza nije sigurna">
+<!ENTITY inadequateSecurityError.title "Tvoja veza nije sigurna">
 <!-- LOCALIZATION NOTE (inadequateSecurityError.longDesc) - Do not translate
      "NS_ERROR_NET_INADEQUATE_SECURITY". -->
 <!ENTITY inadequateSecurityError.longDesc "<p><span class='hostname'></span> koristi sigurnosne tehnologije koje su zastarjele i podložne napadima. Napadač može jednostavno otkriti informacije za koje ste smatrali da su sigurne. Administrator web stranice će trebati popraviti poslužitelj prije nego možete posjetiti stranicu.</p><p>Kod greške: NS_ERROR_NET_INADEQUATE_SECURITY</p>">
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties
index 64ab51647638..4054bbf1ecaf 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/global/search/search.properties
@@ -4,7 +4,7 @@
 
 addEngineConfirmTitle=Dodaj tražilicu
 addEngineConfirmation=Dodati "%S" na popis dostupnih tražilica u traci traženja?\n\nOd: %S
-addEngineAsCurrentText=Učini ovo tren&utnim pretraživačem
+addEngineAsCurrentText=Postavi kao tren&utačnu tražilicu
 addEngineAddButtonLabel=U redu
 
 error_loading_engine_title=Greška preuzimanja
@@ -15,6 +15,4 @@ error_duplicate_engine_msg=%S ne može instalirati dodatak za traženje s "%S" j
 error_invalid_engine_title=Greška instaliranja
 error_invalid_format_title=Neispravan format
 # LOCALIZATION NOTE (error_invalid_engine_msg2): %1$S = brandShortName, %2$S = location (url)
-error_invalid_engine_msg2=%1$S nije mogao instalirati pretraživač iz: %2$S
-
-suggestion_label=Prijedlozi
+error_invalid_engine_msg2=%1$S nije mogao instalirati tražilicu iz: %2$S
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd
index 0ecb4082cfbc..edcab5658439 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Pretraži poruke…">
 <!ENTITY searchMailCmd.accesskey "e">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Globalno pretraživanje…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Pretraži adrese…">
 <!ENTITY searchAddressesCmd.accesskey "s">
 
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties
index 4d954a569a91..783ae828b403 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Ovo je kodirana OpenPGP poruka.<br>Kako biste dekodirali ovu poruku, trebate instalirati <a href="%S">OpenPGP dodatak</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Ovo je kriptirana OpenPGP poruka, ali podrška za OpenPGP dekriptiranje nije dostupna.
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd
index daaa4a3c95b2..f12fc8398df4 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/downloads/unknownContentType.dtd
@@ -20,7 +20,7 @@
 
 <!ENTITY  chooseHandlerMac.label      "Odaberi...">
 <!ENTITY  chooseHandlerMac.accesskey  "O">
-<!ENTITY  chooseHandler.label         "Pretraži...">
+<!ENTITY  chooseHandler.label         "Pregledaj …">
 <!ENTITY  chooseHandler.accesskey     "P">
 
 <!ENTITY  unknownPromptText.label     "Želite li spremiti ovu datoteku?">
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd
index b4bbad3f7a27..35a6c44e95f9 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/extensions/extensions.dtd
@@ -67,7 +67,7 @@
 
 <!ENTITY addon.createdBy.label                "Od ">
 
-<!ENTITY settings.path.button.label           "Pretraži…">
+<!ENTITY settings.path.button.label           "Pregledaj …">
 
 <!-- addon actions -->
 <!ENTITY setting.learnmore "Saznaj više …">
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties
index f4670450aaf3..0150eeaef31c 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/mozapps/profile/profileSelection.properties
@@ -43,7 +43,7 @@ profileExists=Profil s ovim imenom već postoji. Odaberi jedno drugo ime.
 profileExistsTitle=Profil već postoji
 profileFinishText=Da biste stvoriti ovaj profil, kliknite na Završi.
 profileFinishTextMac=Da biste stvoriti ovaj profil, kliknite na Gotovo.
-profileMissing=Vaš %S profil nije moguće učitati. Možda nedostaje ili je nedostupan.
+profileMissing=Tvoj %S profil nije moguće učitati. Možda nedostaje ili je nedostupan.
 profileMissingTitle=Nedostajući profil
 profileDeletionFailed=Profil se nije mogao izbrisati jer je možda u uporabi.
 profileDeletionFailedTitle=Brisanje neuspješno
@@ -55,7 +55,7 @@ resetBackupDirectory=Stari %S podaci
 flushFailTitle=Izmjene nisu spremljene
 # LOCALIZATION NOTE (conflictMessage): %1$S is brandProductName, %2$S is brandShortName.
 conflictMessage=Druga %1$S kopija je napravila izmjene u profilu. Morate ponovo pokrenuti %2$S prije nego li napravite nove izmjene.
-flushFailMessage=Neočekivana greška je spriječila spremanje vaših izmjena.
+flushFailMessage=Neočekivana greška je spriječila spremanje tvojih promjena.
 # LOCALIZATION NOTE (flushFailRestartButton): $S is brandShortName.
 flushFailRestartButton=Ponovo pokreni %S
 flushFailExitButton=Izlaz
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties
index e58b5eb49f91..7166829d925a 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/necko/necko.properties
@@ -64,7 +64,7 @@ CookieRejectedNonRequiresSecureForBeta=Kolačić “%1$S” će uskoro biti odbi
 # LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax".
 CookieLaxForced=Kolačić “%1$S” ima “sameSite” pravilo postavljeno na “lax”, jer nedostaje “sameSite” atribut i “sameSite=lax” je standardna vrijednost za ovaj atribut.
 # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none".
-CookieLaxForcedForBeta=Kolačić “%1$S” nema ispravnu “sameSite” vrijednost atributa. Uskoro kolačići bez “sameSite” atributa ili s neispravnom vrijednošću će biti smatrani kao “lax”. Ovo znači da se kolačići više neće slati kao kolačić treće strane. Ukoliko vaša aplikacija ovisi o dostupnosti ovog kolačića u tom smislu, dodajte mu “sameSite=none“ atribut. Kako biste saznali više o “sameSite“ atributu pročitajte %2$S
+CookieLaxForcedForBeta=Kolačić “%1$S” nema ispravnu “sameSite” vrijednost atributa. Uskoro će se kolačići bez “sameSite” atributa ili s neispravnom vrijednošću smatrani kao “lax”. To znači, da se kolačići više neće slati kao kolačić treće strane. Ukoliko tvoja aplikacija ovisi o dostupnosti ovog kolačića u tom smislu, dodaj mu “sameSite=none“ atribut. Saznaj više o “sameSite“ atributu na %2$S
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid=Neispravna “sameSite“ vrijednost za kolačić “%1$S”. Podržane vrijednosti su: “lax“, “strict“, “none“.
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties
index e9132aa12af7..30b1b549f7a0 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/passwordmgr/passwordmgr.properties
@@ -46,7 +46,7 @@ updatePasswordMsgNoUser = Želite li ažurirati spremljenu lozinku?
 userSelectText2 = Odaberi prijavu koju želiš aktualizirati:
 removeLoginPrompt=Jeste li sigurni da želite ukloniti ovu prijavu?
 removeLoginTitle=Ukloni prijavu
-loginsDescriptionAll2=Prijave za sljedeće stranice su spremljene na vašem računalu
+loginsDescriptionAll2=Prijave za sljedeće stranice su spremljene na tvom računalu
 
 # LOCALIZATION NOTE (useASecurelyGeneratedPassword):
 # Shown in the autocomplete popup to allow filling a generated password into a password field.
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties
index 5e0f337645e8..4ff38dd6c5c8 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/nsserrors.properties
@@ -17,9 +17,9 @@ SSL_ERROR_POST_WARNING=Nepoznata šifra SSL greške.
 SSL_ERROR_SSL2_DISABLED=Čvor podržava samo SSL verziju 2, koja je lokalno deaktivirana.
 SSL_ERROR_BAD_MAC_READ=SSL je primio zapis s netočnom porukom ovjere koda.
 SSL_ERROR_BAD_MAC_ALERT=SSL čvor obavještava o netočnoj poruci ovjere koda.
-SSL_ERROR_BAD_CERT_ALERT=SSL čvor ne može ovjeriti vaš certifikat.
-SSL_ERROR_REVOKED_CERT_ALERT=SSL čvor je odbio vaš certifikat kao poništeni.
-SSL_ERROR_EXPIRED_CERT_ALERT=SSL čvor je odbio vaš certifikat kao istekli.
+SSL_ERROR_BAD_CERT_ALERT=SSL čvor ne može provjeriti tvoj certifikat.
+SSL_ERROR_REVOKED_CERT_ALERT=SSL čvor je odbio tvoj certifikat kao poništeni.
+SSL_ERROR_EXPIRED_CERT_ALERT=SSL čvor je odbio tvoj certifikat kao istekli.
 SSL_ERROR_SSL_DISABLED=Spajanje nije moguće: SSL je onemogućen.
 SSL_ERROR_FORTEZZA_PQG=Spajanje nije moguće: SSL čvor je druga FORTEZZA domena.
 SSL_ERROR_UNKNOWN_CIPHER_SUITE=Zatražen je nepoznati SSL šifrator.
@@ -66,7 +66,7 @@ SSL_ERROR_ILLEGAL_PARAMETER_ALERT=SSL čvor je odbio poruku rukovanja zbog nepri
 SSL_ERROR_UNSUPPORTED_CERT_ALERT=SSL čvor ne podržava vrstu certifikata koju je primio.
 SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT=SSL čvor je naišao na nepoznat problem s primljenim certifikatom.
 SSL_ERROR_GENERATE_RANDOM_FAILURE=SSL je doživio kvar svojeg generatora slučajnog broja.
-SSL_ERROR_SIGN_HASHES_FAILURE=Digitalno potpisivanje podataka potrebnih za ovjeru vašeg certifikata nije moguće.
+SSL_ERROR_SIGN_HASHES_FAILURE=Digitalno potpisivanje podataka potrebnih za provjeru tvog certifikata nije moguće.
 SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE=SSL nije mogao izvući javni ključ iz certifikata čvora.
 SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE=Nepoznati problem pri obradi rukovanja razmjene poslužiteljskog SSL ključa.
 SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE=Nepoznati problem pri obradi rukovanja razmjene klijentskog SSL ključa.
@@ -93,7 +93,7 @@ SSL_ERROR_NO_TRUSTED_SSL_CLIENT_CA=Ne vjeruje se nijednom certifikacijskom tijel
 SSL_ERROR_SESSION_NOT_FOUND=Klijentov ID SSL prijave nije pronađen u privremenoj memoriji prijava poslužitelja.
 SSL_ERROR_DECRYPTION_FAILED_ALERT=Čvor nije mogao dešifrirati primljeni SSL zapis.
 SSL_ERROR_RECORD_OVERFLOW_ALERT=Čvor je primio SSL zapis koji je veći od dopuštenog.
-SSL_ERROR_UNKNOWN_CA_ALERT=Čvor ne prepoznaje i ne vjeruje vašem izdavaču certifikata.
+SSL_ERROR_UNKNOWN_CA_ALERT=Čvor ne prepoznaje i ne vjeruje tvom izdavaču certifikata.
 SSL_ERROR_ACCESS_DENIED_ALERT=Čvor je primio valjani certifikat, ali pristup je odbijen.
 SSL_ERROR_DECODE_ERROR_ALERT=Čvor nije mogao dešifrirati SSL poruku rukovanja.
 SSL_ERROR_DECRYPT_ERROR_ALERT=Čvor javlja neuspjeh ovjere potpisa ili razmjene ključa.
@@ -105,7 +105,7 @@ SSL_ERROR_USER_CANCELED_ALERT=Korisnik čvora je otkazao rukovanje.
 SSL_ERROR_NO_RENEGOTIATION_ALERT=Čvor ne dozvoljava ponovno pregovaranje sigurnosnih parametara SSL-a.
 SSL_ERROR_SERVER_CACHE_NOT_CONFIGURED=Privremena memorija SSL poslužitelja nije podešena i nije onemogućena za ovaj priključak.
 SSL_ERROR_UNSUPPORTED_EXTENSION_ALERT=SSL čvor ne podržava traženo TLS pozdravno proširenje.
-SSL_ERROR_CERTIFICATE_UNOBTAINABLE_ALERT=SSL čvor nije mogao dobiti vaš certifikat iz ponuđenog URL-a.
+SSL_ERROR_CERTIFICATE_UNOBTAINABLE_ALERT=SSL čvor nije mogao dobiti tvoj certifikat iz ponuđenog URL-a.
 SSL_ERROR_UNRECOGNIZED_NAME_ALERT=SSL čvor nema nijedan certifikat za traženi DNS naziv.
 SSL_ERROR_BAD_CERT_STATUS_RESPONSE_ALERT=SSL čvor nije mogao dobiti OCSP odgovor za svoj certifikat.
 SSL_ERROR_BAD_CERT_HASH_VALUE_ALERT=SSL čvor je prijavio lošu jedinstvenu vrijednost certifikata.
@@ -160,7 +160,7 @@ SEC_ERROR_BAD_DATABASE=sigurnosna biblioteka: loša baza podataka.
 SEC_ERROR_NO_MEMORY=sigurnosna biblioteka: greška pri alokaciji memorije.
 SEC_ERROR_UNTRUSTED_ISSUER=Izdavača certifikata čvora je korisnik označio kao nepouzdanog.
 SEC_ERROR_UNTRUSTED_CERT=Certifikata čvora je korisnik označio kao nepouzdani.
-SEC_ERROR_DUPLICATE_CERT=Certifikat već postoji u vašoj bazi podataka.
+SEC_ERROR_DUPLICATE_CERT=Certifikat već postoji u tvojoj bazi podataka.
 SEC_ERROR_DUPLICATE_CERT_NAME=Preuzeto ime certifikata podudara se s jednim drugim, koji se već nalazi u tvojoj bazi podataka.
 SEC_ERROR_ADDING_CERT=Greška pri dodavanju certifikata u bazu podataka.
 SEC_ERROR_FILING_KEY=Greška pri ponovnom upisivanju ključa za ovaj certifikat.
@@ -184,11 +184,11 @@ SEC_ERROR_OLD_CRL=Novi CRL nije kasniji od trenutačnog.
 SEC_ERROR_NO_EMAIL_CERT=Nije šifrirano ili potpisano: još nemate certifikat e-pošte.
 SEC_ERROR_NO_RECIPIENT_CERTS_QUERY=Nije šifrirano: nemaš certifikate za svakog primatelja.
 SEC_ERROR_NOT_A_RECIPIENT=Dešifriranje nije moguće: vi niste primatelj ili odgovarajući certifikat i privatni ključ nisu pronađeni.
-SEC_ERROR_PKCS7_KEYALG_MISMATCH=Dešifriranje nije moguće: algoritam šifriranja ključa ne odgovara vašem certifikatu.
+SEC_ERROR_PKCS7_KEYALG_MISMATCH=Dešifriranje nije moguće: algoritam šifriranja ključa ne odgovara tvom certifikatu.
 SEC_ERROR_PKCS7_BAD_SIGNATURE=Ovjera potpisa nije uspjela: nije pronađen nijedan potpisnik, pronađeno je previše potpisnika ili su pronađeni netočni i oštećeni podaci.
 SEC_ERROR_UNSUPPORTED_KEYALG=Nepodržani ili nepoznati algoritam ključa.
 SEC_ERROR_DECRYPTION_DISALLOWED=Dešifriranje nije moguće: šifrirano korištenjem nedopuštenog algoritma ili veličine ključa.
-XP_SEC_FORTEZZA_BAD_CARD=Fortezza kartica nije ispravno inicijalizirana. Uklonite ju i vratite vašem izdavaču.
+XP_SEC_FORTEZZA_BAD_CARD=Fortezza kartica nije ispravno inicijalizirana. Ukloni je i vrati je tvom izdavaču.
 XP_SEC_FORTEZZA_NO_CARD=Nijedna fortezza kartica nije pronađena
 XP_SEC_FORTEZZA_NONE_SELECTED=Nijedna fortezza kartica nije odabrana
 XP_SEC_FORTEZZA_MORE_INFO=Odaberi identitet za daljnje informacije
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties
index 8c6a60c1cbc4..1e6ad6146708 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pipnss/pipnss.properties
@@ -307,7 +307,7 @@ CertNoEmailAddress=(bez adrese e-pošte)
 CaCertExists=Ovaj certifikat je već instaliran kao certifikacijsko tijelo.
 NotACACert=Ovo nije certifikat certifikacijskog tijela, stoga se ne može uvesti u popis certifikacijskih tijela.
 UserCertIgnoredNoPrivateKey=Ovaj osobni certifikat ne može biti instaliran jer ne posjedujete odgovarajući privatni ključ koji je stvoren kad je certifikat zatražen.
-UserCertImported=Vaš osobni certifikat je instaliran. Trebali biste spremiti sigurnosnu kopiju ovog certifikata.
+UserCertImported=Tvoj osobni certifikat je instaliran. Trebao/la bi spremiti sigurnosnu kopiju ovog certifikata.
 CertOrgUnknown=(Nepoznat)
 CertNotStored=(Nije spremljeno)
 CertExceptionPermanent=Stalni
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties b/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties
index 84409d54771e..7503258b0a0e 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pippki/pippki.properties
@@ -67,7 +67,7 @@ pageInfo_Privacy_Encrypted1=Stranica koju gledaš šifrirana je prije slanja put
 pageInfo_Privacy_Encrypted2=Kriptiranje neovlaštenim osobama otežava pregledavanje informacija koje putuju između računala. Stoga je mala vjerojatnost da je netko pročitao ovu stranicu dok je putovala mrežom.
 pageInfo_MixedContent=Djelomično šifrirana veza
 pageInfo_MixedContent2=Dijelovi stranice koju gledaš nisu šifrirani prije slanja putem interneta.
-pageInfo_WeakCipher=Veza s ovom stranicom koristi slabu enkripciju, te nije privatna. Ostali ljudi mogu vidjeti vaše informacije ili modificirati ponašanje web stranice.
+pageInfo_WeakCipher=Veza s ovom stranicom koristi slabo šifriranje, te nije privatna. Ostali ljudi mogu vidjeti tvoje podatke ili promijeniti ponašanje web stranice.
 pageInfo_CertificateTransparency_Compliant=Ova web stranica je u skladu s politikom transparentnosti certifikata.
 
 # Token Manager
diff --git a/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd b/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd
index 575ff549db8a..a8964f2b2031 100644
--- a/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd
+++ b/thunderbird-l10n/hr/chrome/hr/locale/hr/pluginproblem/pluginproblem.dtd
@@ -6,7 +6,7 @@
 <!ENTITY tapToPlayPlugin                                     "Pritisnite ovdje za aktivaciju priključka.">
 <!ENTITY clickToActivatePlugin                               "Aktiviraj priključak.">
 <!ENTITY checkForUpdates                                     "Provjeri za dopune…">
-<!ENTITY blockedPlugin.label                                 "Ovaj je priključak blokiran radi vaše sigurnosti.">
+<!ENTITY blockedPlugin.label                                 "Ovaj je priključak blokiran za tvoju sigurnost.">
 <!ENTITY hidePluginBtn.label                                 "Sakrij priključak">
 <!ENTITY managePlugins                                       "Upravljaj priključcima …">
 
diff --git a/thunderbird-l10n/hr/localization/hr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/hr/localization/hr/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..32989e05a8f4
--- /dev/null
+++ b/thunderbird-l10n/hr/localization/hr/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Preusmjeravanje URI kalendara
+calendar-uri-redirect-description =
+    Poslužitelj preusmjerava URI za kalendar "{ $calendarName }".
+    Prihvati preusmjeravanje i koristi novi URI za kalendar?
+calendar-uri-redirect-original-uri-label = Trenutni URI:
+calendar-uri-redirect-target-uri-label = Preusmjeravanje na novi URI:
diff --git a/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl b/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl
index e876cf726c9d..9e15bed088a4 100644
--- a/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/hr/localization/hr/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Dobro došli u { -brand-full-name }
+account-settings = Postavke računa
+#   $accounts (Number) - the number of configured accounts
 setup-title = Odaberi što želiš postaviti
 about-title = O { -brand-full-name }u
 resources-title = Resursi
@@ -40,3 +42,10 @@ explore-link = Istraži funkcije
 support-link = Podrška
 involved-link = Uključi se
 developer-link = Dokumentacija programera
+read = Pročitane poruke
+compose = Piši novu poruku
+search = Pretraži poruke
+filter = Upravljanje filterima za poruke
+nntp-subscription = Upravljanje pretplatama na interesne grupe
+rss-subscription = Upravljanje pretplatama na kanale
+e2e = Potpuno šifriranje od pošiljatelja do primatelja
diff --git a/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl b/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl
index 874e19b03df3..5113267330e7 100644
--- a/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl
+++ b/thunderbird-l10n/hr/localization/hr/security/certificates/certManager.ftl
@@ -154,8 +154,8 @@ delete-user-cert-confirm = Jeste li sigurni da želite obrisati ove certifikate?
 delete-user-cert-impact = Ako obrišete jedan od vlastitih certifikata, više ga nećete moći koristiti za identifikaciju.
 delete-ssl-cert-title =
     .title = Obriši iznimku certifikata poslužitelja
-delete-ssl-cert-confirm = Jeste li sigurni da želite ukloniti ove iznimke poslužitelja?
-delete-ssl-cert-impact = Ako obrišete iznimku poslužitelja, obnavljate uobičajene sigurnosne provjere za te poslužitelje i uvjete o ispravnim certifikatima.
+delete-ssl-cert-confirm = Zaista želiš ukloniti ove iznimke poslužitelja?
+delete-ssl-cert-impact = Ako izbrišeš iznimku poslužitelja, obnavljaš uobičajene sigurnosne provjere za te poslužitelje i uvjetuješ upotrebu ispravnih certifikata.
 delete-ca-cert-title =
     .title = Brisanje ili poništavanje povjerenja CA certifikata
 delete-ca-cert-confirm = Zatražio/la si brisanje ovih CA certifikata. Za ugrađene certifikate uklonit će se sva povjerenja, što ima isti efekt. Zaista želiš obrisati certifikate ili poništiti povjerenje?
diff --git a/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl b/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl
index af0f736a0b0b..9934f8acdc58 100644
--- a/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl
+++ b/thunderbird-l10n/hr/localization/hr/security/certificates/deviceManager.ftl
@@ -50,7 +50,7 @@ load-device-filename =
     .value = Naziv datoteke modula
     .accesskey = d
 load-device-browse =
-    .label = Pretraži...
+    .label = Pregledaj …
     .accesskey = P
 
 ## Token Manager
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl
index 1a4d502fb495..281ad6b25912 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instaliraj dodatak iz datoteke…
     .accesskey = I
 help-button = Podrška za dodatke
+sidebar-help-button-title =
+    .title = Podrška za dodatke
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } Mogućnosti
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Alati za sve dodatke
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } Mogućnosti
+           *[other] { -brand-short-name } Postavke
+        }
 show-unsigned-extensions-button =
     .label = Neka proširenja nisu mogla biti verificirana
 show-all-extensions-button =
@@ -106,7 +114,7 @@ detail-private-disallowed-description2 = Ovaj dodatak se ne pokreće tijekom pri
 # Some special add-ons are privileged, run in private windows automatically, and this permission can't be revoked
 detail-private-required-label = Zahtjeva pristup u privatnim prozorima
 detail-private-required-description = Ovaj dodatak ima pristup tvojoj aktivnosti dok si u privatnom pretraživanju. <label data-l10n-name="detail-private-browsing-learn-more">Saznaj više</label>
-detail-private-required-description2 = Ovo proširenje ima pristup vašim internetskim aktivnostima tijekom privatnog pregledavanja. <a data-l10n-name="learn-more">Saznaj više</a>
+detail-private-required-description2 = Ovo proširenje ima pristup tvojim internetskim aktivnostima tijekom privatnog pregledavanja. <a data-l10n-name="learn-more">Saznaj više</a>
 detail-private-browsing-on =
     .label = Dozvoli
     .tooltiptext = Omogući u privatnom pretraživanju
@@ -166,13 +174,29 @@ extensions-view-available-updates =
     .name = Dostupne dopune
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Preporuke
+addon-category-discover-title =
+    .title = Preporuke
 addon-category-extension = Dodaci
+addon-category-extension-title =
+    .title = Dodaci
 addon-category-theme = Motivi
+addon-category-theme-title =
+    .title = Motivi
 addon-category-plugin = Priključci
+addon-category-plugin-title =
+    .title = Priključci
 addon-category-dictionary = Rječnici
+addon-category-dictionary-title =
+    .title = Rječnici
 addon-category-locale = Jezici
+addon-category-locale-title =
+    .title = Jezici
 addon-category-available-updates = Dostupne dopune
+addon-category-available-updates-title =
+    .title = Dostupne dopune
 addon-category-recent-updates = Nedavne dopune
+addon-category-recent-updates-title =
+    .title = Nedavne dopune
 
 ## These are global warnings
 
@@ -246,7 +270,7 @@ addon-updates-reset-updates-to-manual = Postavi ručno ažuriranje za sve dodatk
 extensions-updates-updating =
     .value = Ažuriranje dodataka
 extensions-updates-installed =
-    .value = Vaši su dodaci ažurirani.
+    .value = Tvoji su dodaci aktualizirani.
 extensions-updates-downloaded =
     .value = Dopune za tvoje dodatke su preuzete.
 extensions-updates-restart =
@@ -259,7 +283,7 @@ extensions-updates-update-selected =
     .label = Instaliraj dopune
     .tooltiptext = Instaliraj dostupne dopune s ovog popisa
 addon-updates-updating = Ažuriranje dodataka
-addon-updates-installed = Vaši su dodaci ažurirani.
+addon-updates-installed = Tvoji su dodaci aktualizirani.
 addon-updates-none-found = Nema dopuna
 addon-updates-manual-updates-found = Prikaži dostupne dopune
 
@@ -311,6 +335,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Prikaži manje
 go-back-button =
     .tooltiptext = Idi natrag
+header-back-button =
+    .title = Idi natrag
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl
index ec66af4ebff2..401277f2ecfd 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutRights.ftl
@@ -2,7 +2,7 @@
 # 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/.
 
-rights-title = O vašim pravima
+rights-title = O tvojim pravima
 rights-intro = { -brand-full-name } je slobodan program otvorenog koda, koju je izradila zajednica od tisuću osoba iz cijelog svijeta. Neke podatke trebaš znati:
 rights-intro-point-1 = { -brand-short-name } je dostupan pod uvjetima <a data-l10n-name="mozilla-public-license-link">Mozilline javne licence</a>. To znači da možeš koristiti, kopirati i distribuirati { -brand-short-name } drugima. Također smiješ mijenjati izvorni kod { -brand-short-name } kako god želiš. Mozillina javna licenca daje ti pravo distribuirati promijenjene verzije.
 rights-intro-point-2 = Nisu vam odobrena nikakva prava na zaštitni znak ili licenciranje zaštitnih znakova Mozilla fundacije ili bilo kojih drugih strana, uključujući, ali ne i ograničeno na, ime Firefox ili logo. Dodatne informacije o zaštitnim znacima možete naći <a data-l10n-name="mozilla-trademarks-link">ovdje</a>.
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl
index f90223515d58..0a4af9770143 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/aboutSupport.ftl
@@ -74,7 +74,7 @@ modified-key-prefs-title = Važne izmijenjene postavke
 modified-prefs-name = Naziv
 modified-prefs-value = Vrijednost
 user-js-title = user.js osobitosti
-user-js-description = Vaš profil sadrži <a data-l10n-name="user-js-link">user.js datoteku</a>, koja uključuje osobitosti koje nije stvorio { -brand-short-name }.
+user-js-description = Tvoj profil sadrži <a data-l10n-name="user-js-link">user.js datoteku</a>, koja uključuje osobitosti koje nije stvorio { -brand-short-name }.
 locked-key-prefs-title = Važne zaključane postavke
 locked-prefs-name = Naziv
 locked-prefs-value = Vrijednost
@@ -211,7 +211,7 @@ text-copied = Tekst kopiran u međuspremnik
 ## The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers".
 
 blocked-driver = Blokirano zbog verzije upravljačkog programa grafičke kartice.
-blocked-gfx-card = Blokirano za vašu grafičku karticu zbog neriješenih problema s upravljačkim programom.
+blocked-gfx-card = Blokirano za tvoju grafičku karticu zbog neriješenih problema s upravljačkim programom.
 blocked-os-version = Blokirano za verziju tvog operacijskog sustava.
 blocked-mismatched-version = Blokiran zbog nepodudaranja verzije upravljačkog programa tvoje grafičke kartice između registra i DLL-a.
 # Variables
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl
index bc8603da098c..e08ca62dd4cd 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/about/certviewer.ftl
@@ -39,7 +39,7 @@ certificate-viewer-modulus = Modul
 certificate-viewer-name = Naziv
 certificate-viewer-not-after = Ne nakon
 certificate-viewer-not-before = Ne prije
-certificate-viewer-organization = Tvrtka
+certificate-viewer-organization = Organizacija
 certificate-viewer-organizational-unit = Poslovna jedinica
 certificate-viewer-policy = Pravila
 certificate-viewer-protocol = Protokol
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl
index 698bcb6caeba..f21e619226fa 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/global/createProfileWizard.ftl
@@ -13,13 +13,13 @@ create-profile-first-page-header =
         [macos] Uvod
        *[other] Dobrodošli u { create-profile-window.title }
     }
-profile-creation-explanation-1 = { -brand-short-name } sprema informacije o vašim postavkama i osobitostima u vaš osobni profil.
+profile-creation-explanation-1 = { -brand-short-name } sprema informacije o tvojim postavkama i osobitostima u tvoj osobni profil.
 profile-creation-explanation-2 = Ako ovu kopiju { -brand-short-name }a dijelite s ostalima, možete koristiti profile kako biste informacije svakog korisnika držali odvojenima. Da biste to uradili, svaki korisnik bi trebao stvoriti svoj vlastiti profil.
 profile-creation-explanation-3 = Ako si jedini korisnik ove verzije { -brand-short-name }a, moraš imati barem jedan profil. Ako želiš, možeš stvoriti više profila za spremanje različitih postavki i osobitosti. Na primjer, možeš imati odvojene profile za poslovnu i osobnu upotrebu.
 profile-creation-explanation-4 =
     { PLATFORM() ->
-        [macos] Za početak stvaranja vašeg profila, kliknite na Nastavi.
-       *[other] Za početak stvaranja vašeg profila, kliknite na Dalje.
+        [macos] Za početak stvaranja tvog profila, klikni na Nastavi.
+       *[other] Za početak stvaranja tvog profila, klikni na Dalje.
     }
 
 ## Second wizard page
@@ -34,7 +34,7 @@ profile-prompt = Upiši ime novog profila:
     .accesskey = e
 profile-default-name =
     .value = Standardni korisnik
-profile-directory-explanation = Vaše korisničke postavke, osobitosti i ostali korisnički podaciti biti će spremljeni u:
+profile-directory-explanation = Tvoje korisničke postavke, osobitosti i ostali korisnički podaci bit će spremljeni u:
 create-profile-choose-folder =
     .label = Odaberi mapu...
     .accesskey = m
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..81a85ceff1f3
--- /dev/null
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Pokrenuo/la si stariju verziju { -brand-product-name }a
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Stvori novi profil
+profiledowngrade-sync = Korištenje starije verzije { -brand-product-name }a može oštetiti zabilješke i povijest pretraživanja koje su već spremljene u postojeći { -brand-product-name } profil. Za zaštitu tvojih podataka, stvori novi profil za ovu { -brand-short-name } instalaciju. Uvijek se možeš prijaviti u svoj { -fxaccount-brand-name } i sinkronizirati svoje zabilješke i povijest pretraživanja između profila.
+profiledowngrade-nosync = Korištenje starije verzije { -brand-product-name }a može oštetiti zabilješke i povijest pretraživanja koje su već spremljene u postojeći { -brand-product-name } profil. Za zaštitu tvojih podataka, stvori novi profil za ovu { -brand-short-name } instalaciju.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Izlaz
+           *[other] Izlaz
+        }
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl
index 33bea480cfac..c01028d5a6d9 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/global/profileSelection.ftl
@@ -20,7 +20,7 @@ profile-selection-delete-button =
 
 ## Messages used in the profile manager
 
-profile-manager-description = { -brand-short-name } sprema informacije o vašim postavkama, osobitostima i ostale korisničke stavke u vaš korisnički profil.
+profile-manager-description = { -brand-short-name } sprema informacije o tvojim postavkama, osobitostima i ostale korisničke stavke u tvoj korisnički profil.
 profile-manager-work-offline =
     .label = Izvanmrežni rad
     .accesskey = I
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl
index 888de3f9ccc0..8781be7ca3ba 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/passwordmgr/passwordManagerList.ftl
@@ -60,8 +60,8 @@ show-passwords =
 hide-passwords =
     .label = Sakrij lozinke
     .accesskey = P
-logins-description-all = Prijave za sljedeće stranice su spremljene na vašem računalu
-logins-description-filtered = Sljedeće prijave odgovaraju vašoj pretrazi:
+logins-description-all = Prijave za sljedeće stranice su spremljene na tvom računalu
+logins-description-filtered = Sljedeće prijave odgovaraju tvojoj pretrazi:
 remove-all =
     .label = Ukloni sve
     .accesskey = e
diff --git a/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl b/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl
index 73c84e2c9f90..3d41b84c7025 100644
--- a/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl
+++ b/thunderbird-l10n/hr/localization/hr/toolkit/preferences/preferences.ftl
@@ -7,7 +7,7 @@ password-not-set =
 failed-pw-change = Nije moguće promijeniti glavnu lozinku.
 incorrect-pw = Trenutačna glavna lozinka nije točno upisana. Pokušaj ponovo.
 pw-change-ok = Glavna lozinka je uspješno promijenjena.
-pw-empty-warning = Vaše web i lozinke e-pošte, podaci formulara i privatni ključevi neće biti zaštićeni.
+pw-empty-warning = Tvoje spremljene internetske lozinke i lozinke e-pošte, podaci formulara i privatni ključevi neće biti zaštićeni.
 pw-erased-ok = Tvoja glavna lozinka je obrisana. { pw-empty-warning }
 pw-not-wanted = Upozorenje! Odabrano je da se ne koristi glavna lozinka. { pw-empty-warning }
 pw-change2empty-in-fips-mode = Trenutačno si u FIPS modu. FIPS ne dopušta praznu glavnu lozinku.
diff --git a/thunderbird-l10n/hr/manifest.json b/thunderbird-l10n/hr/manifest.json
index 1b4f4144a158..70bc08010e0b 100644
--- a/thunderbird-l10n/hr/manifest.json
+++ b/thunderbird-l10n/hr/manifest.json
@@ -1,57 +1,57 @@
 {
-  "version": "76.0buildid20200407173003",
+  "langpack_id": "hr",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "author": "mozilla.org (contributors: Mihovil Stanić, Saša Teković)",
+  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
+  "description": "Language pack for Thunderbird for hr",
   "applications": {
     "gecko": {
-      "id": "langpack-hr@thunderbird.mozilla.org",
       "strict_min_version": "76.0",
+      "id": "langpack-hr@thunderbird.mozilla.org",
       "strict_max_version": "76.*"
     }
   },
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
   "languages": {
     "hr": {
+      "version": "20200416101533",
       "chrome_resources": {
-        "communicator": "chrome/hr/locale/hr/communicator/",
-        "devtools-startup": "chrome/hr/locale/hr/devtools/startup/",
-        "alerts": "chrome/hr/locale/hr/alerts/",
+        "branding": "chrome/hr/locale/hr/branding/",
+        "passwordmgr": "chrome/hr/locale/hr/passwordmgr/",
+        "autoconfig": "chrome/hr/locale/hr/autoconfig/",
         "places": "chrome/hr/locale/hr/places/",
+        "chat": "chrome/hr/locale/hr/chat/",
+        "mozapps": "chrome/hr/locale/hr/mozapps/",
+        "messenger-region": "chrome/hr/locale/hr/messenger-region/",
+        "messenger-smime": "chrome/hr/locale/hr/messenger-smime/",
+        "global": "chrome/hr/locale/hr/global/",
+        "devtools-shared": "chrome/hr/locale/hr/devtools/shared/",
         "necko": "chrome/hr/locale/hr/necko/",
-        "pluginproblem": "chrome/hr/locale/hr/pluginproblem/",
-        "pippki": "chrome/hr/locale/hr/pippki/",
-        "lightning": "chrome/hr/locale/hr/lightning/",
-        "autoconfig": "chrome/hr/locale/hr/autoconfig/",
-        "messenger-mapi": "chrome/hr/locale/hr/messenger-mapi/",
+        "messenger": "chrome/hr/locale/hr/messenger/",
+        "pipnss": "chrome/hr/locale/hr/pipnss/",
+        "alerts": "chrome/hr/locale/hr/alerts/",
         "calendar": "chrome/hr/locale/hr/calendar/",
-        "chat": "chrome/hr/locale/hr/chat/",
+        "lightning": "chrome/hr/locale/hr/lightning/",
+        "pippki": "chrome/hr/locale/hr/pippki/",
         "mozldap": "chrome/hr/locale/hr/mozldap/",
+        "communicator": "chrome/hr/locale/hr/communicator/",
+        "devtools": "chrome/hr/locale/hr/devtools/client/",
+        "messenger-newsblog": "chrome/hr/locale/hr/messenger-newsblog/",
+        "messenger-mapi": "chrome/hr/locale/hr/messenger-mapi/",
+        "pluginproblem": "chrome/hr/locale/hr/pluginproblem/",
         "global-platform": {
-          "macosx": "chrome/hr/locale/hr/global-platform/mac/",
-          "linux": "chrome/hr/locale/hr/global-platform/unix/",
           "android": "chrome/hr/locale/hr/global-platform/unix/",
-          "win": "chrome/hr/locale/hr/global-platform/win/"
+          "win": "chrome/hr/locale/hr/global-platform/win/",
+          "macosx": "chrome/hr/locale/hr/global-platform/mac/",
+          "linux": "chrome/hr/locale/hr/global-platform/unix/"
         },
-        "messenger-newsblog": "chrome/hr/locale/hr/messenger-newsblog/",
-        "global": "chrome/hr/locale/hr/global/",
-        "branding": "chrome/hr/locale/hr/branding/",
-        "devtools": "chrome/hr/locale/hr/devtools/client/",
-        "messenger": "chrome/hr/locale/hr/messenger/",
-        "mozapps": "chrome/hr/locale/hr/mozapps/",
-        "passwordmgr": "chrome/hr/locale/hr/passwordmgr/",
-        "messenger-region": "chrome/hr/locale/hr/messenger-region/",
-        "devtools-shared": "chrome/hr/locale/hr/devtools/shared/",
-        "pipnss": "chrome/hr/locale/hr/pipnss/",
-        "messenger-smime": "chrome/hr/locale/hr/messenger-smime/"
-      },
-      "version": "20200404082246"
+        "devtools-startup": "chrome/hr/locale/hr/devtools/startup/"
+      }
     }
   },
-  "description": "Language pack for Thunderbird for hr",
-  "author": "mozilla.org (contributors: Mihovil Stanić, Saša Teković)",
-  "langpack_id": "hr",
-  "name": "Hrvatski (HR) Language Pack",
-  "manifest_version": 2
+  "name": "Hrvatski (HR) Language Pack"
 }
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties
index 044864c546fb..16c0bb5b44fc 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/calendar/calendar.properties
@@ -282,7 +282,6 @@ filterIcs=iCalendar (%1$S)
 filterXml=XML-dokument (%1$S)
 filterHtml=Webstrona (%1$S)
 filterOutlookCsv=Outlook, hódnoty dźělene přez komu (%1$S)
-filterWav=Awdioformat WAVE (%1$S)
 
 # Remote calendar errors
 genericErrorTitle=Zmylk je wustupił
@@ -331,7 +330,7 @@ caldavRequestStatusCodeString404=Resursa njeje so namakała.
 caldavRequestStatusCodeString409=Resursowy konflikt.
 caldavRequestStatusCodeString412=Předpokład spjelnjeny njeje.
 caldavRequestStatusCodeString500=Nutřkowny serwerowy zmylk.
-caldavRequestStatusCodeString502=Gateway ze zmylkami (proksy-konfiguracija?).
+caldavRequestStatusCodeString502=Gateway ze zmylkami (proksykonfiguracija?).
 caldavRequestStatusCodeString503=Nutřkowny serwerowy zmylk (nachwilny wupad serwera?).
 caldavRedirectTitle=Městno za protyku %1$S aktualizować?
 caldavRedirectText=Naprašowanja za %1$S so do noweho městna dale sposrědkuja. Chceće městno do slědowaceje hódnoty změnić?
@@ -662,7 +661,7 @@ daysIntervalInMonth.monthFormat=nominative
 #    %2$S will be replaced with the day-index of the start date possibly followed by an ordinal symbol
 #    %3$S will be replaced with name of the month of the end date
 #    %4$S will be replaced with the day-index of the end date possibly followed by an ordinal symbol
-#    %5$S will be replaced with the commmon year of both dates
+#    %5$S will be replaced with the common year of both dates
 # The presence of the ordinal symbol in the day-indexes depends on the string
 # dayOrdinalSymbol in dateFormat.properties
 daysIntervalBetweenMonths=%2$S %1$S – %4$S %3$S %5$S
@@ -792,13 +791,13 @@ modifyConflictPromptButton2=Tute změny zaćisnyć
 # in the tooltip and the visible name for an attendee in the event summary dialog - don't add
 # leading or trailing whitespaces here
 # %1$S - a single delegatee or a comma separated list of delegatees
-# delegation is different from simple invitation forwarding - in case of delegation the orignal
+# delegation is different from simple invitation forwarding - in case of delegation the original
 # invited attendee gets replaced
 dialog.attendee.append.delegatedFrom=(wot %1$S delegowany)
 # LOCALIZATION_NOTE(dialog.attendee.append.delegatedTo): this is appended behind an attendee name
 # in the tooltip for an attendee in the event summary dialog - don't add leading or trailing
 # whitespaces here
-# delegation is different from simple invitation forwarding - in case of delegation the orignal
+# delegation is different from simple invitation forwarding - in case of delegation the original
 # invited attendee gets replaced
 dialog.attendee.append.delegatedTo=(na %1$S delegowany)
 
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties
index 503d1ebd87d3..e81db6f51942 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Tutón element ma kulomny přeběžk.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Žane přisłušne prawidło
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Dźeržće Umsch stłóčeny a klikńće, zo byšće k prawidłu skočił
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties
index 82c4d3b128b3..b8d94d869063 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/appstrings.properties
@@ -19,8 +19,8 @@ notCached=Tutón dokument hižo k dispoziciji njesteji.
 netOffline=Tutón dokument njeda so zwobraznić, mjeztym zo sće offline. Zo byšće online šoł, wotstrońće hóčku z Offline dźěłać w meniju Dataja.
 isprinting=Dokument njeda so změnić, mjeztym zo ćišćeće abo sće w ćišćerskim přehledźe.
 deniedPortAccess=Přistup k podatemu portowemu čisłu je so z wěstotnych přičinow znjemóžnił.
-proxyResolveFailure=Proksy-serwer, kotryž sće konfigurował, njeda so namakać. Prošu přepruwujće swoje proksy-nastajenja a spytajće hišće raz.
-proxyConnectFailure=Při pospyće so z proksy-serwerom, kotryž sće konfigurował, do zwiska stajić, bu zwisk wotpokazany. Prošu přepruwujće proksy-nastajenja a spytajće hišće raz.
+proxyResolveFailure=Proksyserwer, kotryž sće konfigurował, njeda so namakać. Prošu přepruwujće swoje proksynastajenja a spytajće hišće raz.
+proxyConnectFailure=Při pospyće so z proksyserwerom, kotryž sće konfigurował, do zwiska stajić, bu zwisk wotpokazany. Prošu přepruwujće proksynastajenja a spytajće hišće raz.
 contentEncodingError=Strona, kotruž pospytujeće sej wobhladać, njeda so pokazać, dokelž njepłaćiwu abo njepodpěrowanu formu zhusćenja wužiwa.
 unsafeContentType=Strona, kotruž chceće sej wobhladać, njeda so pokazać, dokelž je w datajowym typje wobsahowana, kotryž njeda so wěsće wočinić. Prošu stajće so z wobsedźerjemi websydła do zwiska, zo byšće jich wo tutym problemje informował.
 externalProtocolTitle=Naprašowanje eksterneho protokola
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties
index 91362970ece8..07595829db2e 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Stilowa předłoha %1$S so wužiwa jako CSS, hačrunjež jeje MIM
 
 PEUnexpEOF2=Njewočakowany kónc dataje při pytanju za %1$S.
 PEParseRuleWSOnly=Znamješkowy rjećazk jenož z mjezeru podaty, zo by so jako prawidło analyzował.
+
 PEDeclDropped=Deklaracija wuwostajena.
 PEDeclSkipped=K přichodnej deklaraciji skočene.
 PEUnknownProperty=Njeznata kajkosć '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Jenož jedyn repeat(auto-fill, …) je
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Jenož jedyn repeat(auto-fill, …) abo repeat(auto-fit, …) je w slědowanskej lisćinje dowoleny.
 PEMoreThanOneGridRepeatTrackSize=Jenož jedna slědowanska wulkosć je znutřka repeat(auto-fit/auto-fill, …) dowolena.
 
+PEDisallowedImportRule=Prawidła @import hišće w spłodźenych stilowych předłohach płaćiwe njejsu.
+
 TooLargeDashedRadius=Ramikowy radius je přewulki za ‘smužkowaty’ stil (limit je 100000px).
 TooLargeDottedRadius=Ramikowy radius je přewulki za ‘dypkowaty’ stil (limit je 100000px).
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd
index 7d7e50875fae..ccd724119a9f 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/netError.dtd
@@ -52,11 +52,11 @@
 <!ENTITY unknownProtocolFound.title "Njeznaty protokol">
 <!ENTITY unknownProtocolFound.longDesc "<p>Adresa podawa protokol (na př. <q>wxyz://</q>), kotryž wobhladowak njepřipóznawa, tak zo wobhladowak njemóže prawje ze sydłom zwjazać.</p><ul><li>Pospytujeće na multimedia abo druhe njetekstowe słužby přistup měć? Přepruwujće sydło za wosebitymi potrěbnosćemi.</li><li>Někotre protokole trjebaja programy třećich abo tykače, prjedy hač wobhladowak móže je připóznać.</li></ul>">
 
-<!ENTITY proxyConnectFailure.title "Proksy serwera je zwisk wotpokazał">
-<!ENTITY proxyConnectFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyjowy serwer wužiwa, ale proksy zwisk wotpokaza.</p><ul><li>Je konfiguracija proksy wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Dowola słužba proksy zwiski z tuteje syće?</li><li>Maće hišće ćeže? Skonsultujće swojeho syćoweho administratora abo internetneho poskićowarja za podpěru.</li></ul>">
+<!ENTITY proxyConnectFailure.title "Proksyserwer je zwisk wotpokazał">
+<!ENTITY proxyConnectFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyserwer wužiwa, ale proksy zwisk wotpokaza.</p><ul><li>Je konfiguracija proksy wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Dowola słužba proksy zwiski z tuteje syće?</li><li>Maće hišće ćeže? Skonsultujće swojeho syćoweho administratora abo internetneho poskićowarja za podpěru.</li></ul>">
 
-<!ENTITY proxyResolveFailure.title "Proksyjowy serwer njenamakany">
-<!ENTITY proxyResolveFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyjowy serwer wužiwa, ale proksy njeda so namakać.</p><ul><li>Je konfiguracija proksyja wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Je ličak z aktiwnej syću zwjazany?</li><li>Maće hišće ćeže? Stajće so ze swojim syćowym administratorom abo internetnym poskićowarjom za podpěru do zwiska.</li></ul>">
+<!ENTITY proxyResolveFailure.title "Proksyserwer njenamakany">
+<!ENTITY proxyResolveFailure.longDesc "<p>Wobhladowak je so konfigurował, zo by so proksyserwer wužiwa, ale proksy njeda so namakać.</p><ul><li>Je konfiguracija proksyja wobhladowaka korektna? Přepruwujće nastajenja a spytajće hišće raz.</li><li>Je ličak z aktiwnej syću zwjazany?</li><li>Maće hišće ćeže? Stajće so ze swojim syćowym administratorom abo internetnym poskićowarjom za podpěru do zwiska.</li></ul>">
 
 <!ENTITY redirectLoop.title "Sekla dalesposrědkowanja">
 <!ENTITY redirectLoop.longDesc "<p>Wobhladowak přesta požadany objekt wotwołować. Sydło sposrědkuje naprašowanje na wašnje, kotrež so njekónči.</p><ul><li>Sće placki znjemóžnił abo zablokował, kotrež su trěbne za tute sysdło?</li><li><em>KEDŹBU</em>: Jeli akceptowanje plackow tutoho sydła problem njerozrisa, je to najskerje problem konfiguracije serwera a nic wašeho ličaka.</li></ul>">
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties
index a93de432fbe5..89d8fd7e9884 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Začitanje je so přez X-Frame-Options wotpokazało: “%1$S” z “%
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Začitanje je so přez X-Frame-Options wotpokazało: “%1$S” z “%2$S”, sydło rozdźělne žórła we wobłuku z “%3$S”njedowoluje.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Njepłaćiwa hłowa X-Frame-Options je so při čitanju “%2$S” namakała: “%1$S” płaćiwa direktiwa njeje.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Začitanje “%2$S” we wobłuku je so přez direktiwu X-Frame-Options“ wotpokazało, kotraž je na “%1$S“ stajena.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Njewěste naprašowanje “%1$S” so aktualizuje, zo by “%2$S” wužiwało.
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties
index 1b2225374126..f6ab27d10240 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/addons.properties
@@ -211,7 +211,7 @@ webextPerms.description.nativeMessaging=Wuměńće powěsće z druhimi programam
 webextPerms.description.notifications=Zdźělenki na was pokazać
 webextPerms.description.pkcs11=Kryptografiske awtentifikowanske słužby wobstarać
 webextPerms.description.privacy=Nastajenja priwatnosće čitać a změnić
-webextPerms.description.proxy=Proksy-nastajenja wobhladowaka kontrolować
+webextPerms.description.proxy=Proksynastajenja wobhladowaka kontrolować
 webextPerms.description.sessions=Mějće přistup na njedawno začinjene rajtarki
 webextPerms.description.tabs=Mějće přistup na rajtarki wobhladowaka
 webextPerms.description.tabHide=Rajtarki wobhladowaka schować a pokazać
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd
index f358a03b62b8..c0a02d055e7f 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/am-im.dtd
@@ -11,6 +11,6 @@
 <!ENTITY account.alias                 "Alias:">
 <!ENTITY account.newMailNotification   "Wo nowej e-mejlu informować">
 <!ENTITY account.autojoin              "Awtomatisce zastupjene kanale:">
-<!ENTITY account.proxySettings.caption "Proksy-nastajenja:">
+<!ENTITY account.proxySettings.caption "Proksynastajenja:">
 <!ENTITY account.proxySettings.change.label     "Změnić…">
 <!ENTITY account.proxySettings.change.accessKey "Z">
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd
index d97d74853305..2591c5ee02c4 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/imAccountWizard.dtd
@@ -23,7 +23,7 @@
 <!ENTITY accountAliasGroupbox.caption "Lokalny alias">
 <!ENTITY accountAliasField.label      "Alias:">
 <!ENTITY accountAliasInfo.label       "To zwobrazni so we wašich konwersacijach jenož potom, hdyž komunikujeće, zdalone kontakty njebudu to widźeć.">
-<!ENTITY accountProxySettings.caption "Proksy-nastajenja">
+<!ENTITY accountProxySettings.caption "Proksynastajenja">
 <!ENTITY accountProxySettings.change.label     "Změnić…">
 <!ENTITY accountProxySettings.change.accessKey "Z">
 
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties
index 7b0abc2ef5d4..fbe33f93c7f6 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/importMsgs.properties
@@ -2,7 +2,7 @@
 # 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/.
 
-# The following are used by the import code to display status/error 
+# The following are used by the import code to display status/error
 # and informational messages
 
 # Success message when no address books are found to import
@@ -10,7 +10,7 @@
 ## @loc None
 2000=Žane adresniki za importowanje njenamakane.
 
-# Error: Address book import not intialized		
+# Error: Address book import not initialized
 ## @name IMPORT_ERROR_AB_NOTINITIALIZED
 ## @loc None
 2001=Njeje móžno, adresniki importować: Zmylk inicializowanja.
@@ -31,7 +31,7 @@
 ## @loc None
 2004=Žane póstowe kašćiki za importowanje namakane
 
-# Error: Mailbox import not intialized		
+# Error: Mailbox import not initialized
 ## @name IMPORT_ERROR_MB_NOTINITIALIZED
 ## @loc None
 2005=Njeje móžno, póstowe kašćiki importować, inicializowanski zmylk
@@ -44,7 +44,7 @@
 # Error: Unable to create the proxy object for importing mailboxes
 ## @name IMPORT_ERROR_MB_NOPROXY
 ## @loc None
-2007=Njeje móžno, póstowe kašćiki importować, objekt proksy za cilowe póstowe kašćiki njeda so wutworić
+2007=Njeje móžno, póstowe kašćiki importować, proksyobjekt za cilowe póstowe kašćiki njeda so wutworić
 
 # Error: Error creating destination mailboxes
 ## @name IMPORT_ERROR_MB_FINDCHILD
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd
index 7d8f1532d353..a51578d07feb 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Powěsće pytać…">
 <!ENTITY searchMailCmd.accesskey "o">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Globalne pytanje…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Adresy pytać…">
 <!ENTITY searchAddressesCmd.accesskey "A">
 
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd
index de9af009ea61..f973cd157a45 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/netError.dtd
@@ -55,11 +55,11 @@
 <!ENTITY unknownProtocolFound.title "Adresa njebu zrozumjena">
 <!ENTITY unknownProtocolFound.longDesc "<ul> <li>Je móžno, zo dyrbiće druhu softwaru instalować, zo byšće tutu adresu wočinił.</li> </ul>">
 
-<!ENTITY proxyConnectFailure.title "Proksy-serwer zwiski wotpokazuje">
-<!ENTITY proxyConnectFailure.longDesc "<ul> <li>Přepruwujće proksy-nastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Stajće so ze swojim syćowym administratorom do zwiska, zo byšće zawěsćił, za proksy-serwer dźěła.</li> </ul>">
+<!ENTITY proxyConnectFailure.title "Proksyserwer zwiski wotpokazuje">
+<!ENTITY proxyConnectFailure.longDesc "<ul> <li>Přepruwujće proksynastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Stajće so ze swojim syćowym administratorom do zwiska, zo byšće zawěsćił, za proksyserwer dźěła.</li> </ul>">
 
-<!ENTITY proxyResolveFailure.title "Proksy-serwer njeda so namakać">
-<!ENTITY proxyResolveFailure.longDesc "<ul> <li>Přepruwujće proksy-nastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Přepruwujće hač waš ličak ma fungowacy syćowy zwisk.</li> <li>Jeli waš ličak abo waša syć so přez wohnjowu murju abo proksy škita, zawěsćće, zo &brandShortName; smě z webom zwjazać.</li> </ul>">
+<!ENTITY proxyResolveFailure.title "Proksyserwer njeda so namakać">
+<!ENTITY proxyResolveFailure.longDesc "<ul> <li>Přepruwujće proksynastajenja, zo byšće zawěsćił, zo su korektne.</li> <li>Přepruwujće hač waš ličak ma fungowacy syćowy zwisk.</li> <li>Jeli waš ličak abo waša syć so přez wohnjowu murju abo proksy škita, zawěsćće, zo &brandShortName; smě z webom zwjazać.</li> </ul>">
 
 <!ENTITY redirectLoop.title "Strona so porjadnje dale njesposrědkuje">
 <!ENTITY redirectLoop.longDesc "<ul> <li>Tutón problem so druhdy zawinuje, hdyž so placki znjemóžnjeja abo wotpokazuja.</li> </ul>">
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties
index 997d5016d428..df76968edeea 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=To je zaklučowana OpenPGP-powěsć.<br>Zo byšće tutu e-mejlku dešifrował, dyrbiće <a href="%S">přidatk OpenPGP</a> instalować.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=To je zaklučowana OpenPGP-powěsć, ale podpěra za OpenPGP-dekodowanje dispoziciji njeje.
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd
index f1cba3b704ff..30a2c007494c 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/messenger/preferences/connection.dtd
@@ -9,13 +9,13 @@
 <!ENTITY  proxyTitle.label              "Proksy za přistup k internetej konfigurować">
 <!ENTITY  noProxyTypeRadio.label        "Žadyn proksy">
 <!ENTITY  noProxyTypeRadio.accesskey    "a">
-<!ENTITY  systemTypeRadio.label         "Systemowe proksy-nastajenja wužiwać">
+<!ENTITY  systemTypeRadio.label         "Systemowe proksynastajenja wužiwać">
 <!ENTITY  systemTypeRadio.accesskey     "S">
 <!ENTITY  WPADTypeRadio.label           "Nastajenja proksy za tutu syć awtomatisce wotkryć">
 <!ENTITY  WPADTypeRadio.accesskey       "w">
-<!ENTITY  manualTypeRadio.label         "Manuelna konfiguracija proksy:">
+<!ENTITY  manualTypeRadio.label         "Manuelna proksykonfiguracija:">
 <!ENTITY  manualTypeRadio.accesskey     "M">
-<!ENTITY  autoTypeRadio.label           "URL awtomatiskeje konfiguracije proksy:">
+<!ENTITY  autoTypeRadio.label           "URL awtomatiskeje proksykonfiguracije:">
 <!ENTITY  autoTypeRadio.accesskey       "L">
 <!ENTITY  reload.label                  "Znowa začitać">
 <!ENTITY  reload.accesskey              "Z">
@@ -40,12 +40,12 @@
 <!ENTITY  noproxy.label                 "Žadyn proksy za:">
 <!ENTITY  noproxy.accesskey             "d">
 <!ENTITY  noproxyExplain.label          "Přikład: .mozilla.org, .net.nz, 192.168.1.0/24">
+<!ENTITY  shareproxy.label              "Tutón proksyserwer za wšě protokole wužiwać">
+<!ENTITY  shareproxy.accesskey          "u">
 <!-- LOCALIZATION NOTE (noproxyLocalhostDesc.label): Do not translate
   localhost, 127.0.0.1 and ::1.
 -->
 <!ENTITY  noproxyLocalhostDesc.label    "Zwiski z localhost, 127.0.0.1 a ::1 ženje přez proksy njeńdu.">
-<!ENTITY  shareproxy.label              "Tutón proksy-serwer za wšě protokole wužiwać">
-<!ENTITY  shareproxy.accesskey          "u">
 <!ENTITY  proxyHttpSharing.label        "Tež tutón proksy za HTTPS wužiwać">
 <!ENTITY  proxyHttpSharing.accesskey    "k">
 <!ENTITY  autologinproxy.label          "Za awtentifikaciju so njeprašeć, jeli hesło je składowane">
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties
index 4da54b4d7725..365ef9d53786 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/mozapps/update/updates.properties
@@ -23,6 +23,7 @@ okButton=W porjadku
 okButton.accesskey=W
 askLaterButton=Pozdźišo so prašeć
 askLaterButton.accesskey=P
+
 noThanksButton=Ně, dźakuju so
 noThanksButton.accesskey=N
 updateButton_minor=%S aktualizować
@@ -70,10 +71,10 @@ check_error-2152398864=Syć je offline (online hić)
 check_error-2152398867=Port njedowoleny
 check_error-2152398868=Žane daty přijate (prošu spytajće hišće raz)
 check_error-2152398878=Aktualizowanski serwer njenamakany (skontrolujće swój internetny zwisk)
-check_error-2152398890=Proksy-serwer njenamakany (skontrolujće swój internetny zwisk)
+check_error-2152398890=Proksyserwer njenamakany (skontrolujće swój internetny zwisk)
 # NS_ERROR_DOCUMENT_NOT_CACHED
 check_error-2152398918=Syć je (online hić)
 check_error-2152398919=Přenjesenje datow je so přetorhnyło (prošu spytajće hišće raz)
-check_error-2152398920=Zwisk z proksy-serwerom wotpokazany
+check_error-2152398920=Zwisk z proksyserwerom wotpokazany
 check_error-2153390069=Serwerowy certifikat je spadnjeny (prošu stajće swój systemowy časnik na prawy datum a prawy čas, jeli stej wopak)
 check_error-verification_failed=Integrita aktualizacije njeda so přepruwować
diff --git a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties
index 4eff02637c0e..6d0577e5022b 100644
--- a/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties
+++ b/thunderbird-l10n/hsb/chrome/hsb/locale/hsb/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Přistup na składowak je so “%3$S
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Přistup na składowak je so awtomatisce přesćěhowakej “%2$S” na “%1$S” přizwolił.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Přistup na składowak je so awtomatisce za izolowanje prěnjeho poskićowarja “%2$S” na “%1$S” přizwolił.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Plack “%1$S” je so wotpokazał, dokelž ma atribut “sameSite=none”, ale nima atribut “secure” .
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/hsb/localization/hsb/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/hsb/localization/hsb/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..d33c440d1c30
--- /dev/null
+++ b/thunderbird-l10n/hsb/localization/hsb/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = URI-dalesposrědkowanje protyki
+calendar-uri-redirect-description =
+    Serwer URI za protyku „{ $calendarName }“ dale posrědkuje.
+    Dalesposrědkowanje akceptować a nowy URI za tutu protyku wužiwać?
+calendar-uri-redirect-original-uri-label = Aktualny URI:
+calendar-uri-redirect-target-uri-label = K nowemu URI dale posrědkować:
diff --git a/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl b/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl
index 751f0a0cf6b1..9e967c83714b 100644
--- a/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/hsb/localization/hsb/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Witajće k { -brand-full-name }
+account-settings = Kontowe nastajenja
+#   $accounts (Number) - the number of configured accounts
 setup-title = Wubjerće, štož ma so konfigurować
 about-title = Wo { -brand-full-name }
 resources-title = Resursy
@@ -40,3 +42,10 @@ explore-link = Funkcije wuslědźić
 support-link = Podpěra
 involved-link = Čińće sobu
 developer-link = Wuwiwarska dokumentacija
+read = Powěsće čitać
+compose = Nowu powěsć pisać
+search = Powěsće pytać
+filter = Powěsćowe filtry zrjadować
+nntp-subscription = Abonementy diskusijnych skupinow zrjadować
+rss-subscription = Kanalowe abonementy rjadować
+e2e = Zaklučowanje wot kónca do kónca
diff --git a/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl b/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl
index 0c2c425699e3..69e803e8238a 100644
--- a/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl
+++ b/thunderbird-l10n/hsb/localization/hsb/messenger/policies/policies-descriptions.ftl
@@ -54,7 +54,7 @@ policy-OverrideFirstRunPage = Stronu přepisać, kotraž so při prěnim starće
 policy-OverridePostUpdatePage = Stronu „Nowe funkcije a změny“ po aktualizaciji přepisać. Stajće tute prawidło na prózdne, jeli chceće tutu stronu znjemóžnić.
 policy-Preferences = Nastajće a zawrějće hódnotu za podsadźbu nastajenjow.
 policy-PromptForDownloadLocation = Prašeć so, hdźež maja so dataja při sćehnjenju składować.
-policy-Proxy = Nastajenja proksy konfigurować.
+policy-Proxy = Proksynastajenja konfigurować.
 policy-RequestedLocales = Podajće lisćinu požadanych rěčow za nałoženje w preferowanym porjedźe.
 policy-SanitizeOnShutdown2 = Nawigaciske daty při kónčenju zhašeć.
 policy-SearchEngines = Nastajenja pytawow konfigurować. Tute prawidło je jenož za wersiju Extended Support Release (ESR) k dispoziciji.
diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl
index d88800c62bbe..96abfb3006d1 100644
--- a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Přidatk z dataje instalować…
     .accesskey = P
 help-button = Pomoc za přidatki
+sidebar-help-button-title =
+    .title = Pomoc za přidatki
 preferences =
     { PLATFORM() ->
         [windows] Nastajenja { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Nastroje za wšě přidatki
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Nastajenja { -brand-short-name }
+           *[other] Nastajenja { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Někotre rozšěrjenja njedachu so wobkrućić
 show-all-extensions-button =
@@ -167,13 +175,29 @@ extensions-view-available-updates =
     .name = Aktualizacije
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Doporučenja
+addon-category-discover-title =
+    .title = Doporučenja
 addon-category-extension = Rozšěrjenja
+addon-category-extension-title =
+    .title = Rozšěrjenja
 addon-category-theme = Drasty
+addon-category-theme-title =
+    .title = Drasty
 addon-category-plugin = Tykače
+addon-category-plugin-title =
+    .title = Tykače
 addon-category-dictionary = Słowniki
+addon-category-dictionary-title =
+    .title = Słowniki
 addon-category-locale = Rěče
+addon-category-locale-title =
+    .title = Rěče
 addon-category-available-updates = Aktualizacije
+addon-category-available-updates-title =
+    .title = Aktualizacije
 addon-category-recent-updates = Nowe aktualizacije
+addon-category-recent-updates-title =
+    .title = Nowe aktualizacije
 
 ## These are global warnings
 
@@ -286,6 +310,7 @@ shortcuts-no-commands = Slědowace rozšěrjenja tastowe skrótšenki nimaja:
 shortcuts-input =
     .placeholder = Zapodajće tastowu skrótšenku
 shortcuts-browserAction = Rozšěrjenje aktiwizować
+shortcuts-browserAction2 = Tłóčatko symboloweje lajsty aktiwizować
 shortcuts-pageAction = Akciju strony aktiwizować
 shortcuts-sidebarAction = Bóčnicu přepinać
 shortcuts-modifier-mac = Strg, Alt abo ⌘ zapřijeć
@@ -313,6 +338,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mjenje pokazać
 go-back-button =
     .tooltiptext = Wróćo hić
+header-back-button =
+    .title = Wróćo hić
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl
index db59e076fea3..a2ab3e356478 100644
--- a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/aboutSupport.ftl
@@ -297,6 +297,11 @@ sandbox-proc-type-content = wobsah
 sandbox-proc-type-file = datajowy wobsah
 sandbox-proc-type-media-plugin = medijowy tykač
 sandbox-proc-type-data-decoder = dekodowak datow
+startup-cache-title = Startowy pufrowak
+startup-cache-disk-cache-path = Šćežka tačeloweho pufrowaka
+startup-cache-ignore-disk-cache = Tačelowy pufrowak ignorować
+startup-cache-found-disk-cache-on-init = Tačelowy pufrowak je so namakał při inicializowanju
+startup-cache-wrote-to-disk-cache = Je so do tačeloweho pufrowaka napisało
 launcher-process-status-0 = Zmóžnjeny
 launcher-process-status-1 = Zmylka dla znjemóžnjeny
 launcher-process-status-2 = Namócnje znjemóžnjeny
@@ -320,6 +325,7 @@ touch-enabled = zapodaće přez podótknjenje zmóžnjene
 drag-enabled = ćahanje suwanskeje lajsty zmóžnjene
 keyboard-enabled = tastatura zmóžnjena
 autoscroll-enabled = awtomatiske kulenje zmóžnjene
+zooming-enabled = łahodne šćipate skalowanje zmóžnjene
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl
index ec7d7582376d..0947571b8bb4 100644
--- a/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certifikat)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (rjećazk)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Tute rozšěrjenje je so jako kritiske markěrowało, to rěka, zo klienty dyrbja certifikat wotpokazać, jeli jón njerozumja.
+certificate-viewer-export = Eksportować
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Waše certifikaty
+certificate-viewer-tab-people = Ludźo
+certificate-viewer-tab-servers = Serwery
+certificate-viewer-tab-ca = Awtority
+certificate-viewer-tab-unkonwn = Njeznaty
diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl
index 8ce9f05ea539..8830cdbbfac1 100644
--- a/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Izolowany webwobsah
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Soket
diff --git a/thunderbird-l10n/hsb/localization/hsb/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..ba819f1705fa
--- /dev/null
+++ b/thunderbird-l10n/hsb/localization/hsb/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Sće staršu wersiju { -brand-product-name } startował
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Nowy profil załožić
+profiledowngrade-sync = Wužiwanje staršeje wersije { -brand-product-name } móže zapołožki a přehladowansku historiju wobškodźić, kotrež su so hižo w eksistowacym profilu { -brand-product-name } składowali. Zo byšće swoje informacije škitał, załožće nowy profil za tutu instalaciju { -brand-short-name }. Móžeće so přeco z { -fxaccount-brand-name } přizjewić, zo byšće swoje zapołožki a přehladowansku historiju mjez profilemi synchronizował.
+profiledowngrade-nosync = Wužiwanje staršeje wersije { -brand-product-name } móže zapołožki a přehladowansku historiju wobškodźić, kotrež su so hižo w eksistowacym profilu { -brand-product-name } składowali. Zo byšće swoje informacije škitał, załožće nowy profil za tutu instalaciju { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Skónčić
+           *[other] Skónčić
+        }
diff --git a/thunderbird-l10n/hsb/manifest.json b/thunderbird-l10n/hsb/manifest.json
index e26268d848fb..c0e49ce2ddf2 100644
--- a/thunderbird-l10n/hsb/manifest.json
+++ b/thunderbird-l10n/hsb/manifest.json
@@ -1,57 +1,57 @@
 {
+  "langpack_id": "hsb",
+  "manifest_version": 2,
+  "description": "Language pack for Thunderbird for hsb",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "version": "76.0buildid20200420212409",
   "name": "Hornjoserbšćina Language Pack",
   "languages": {
     "hsb": {
-      "version": "20200403145404",
       "chrome_resources": {
-        "messenger": "chrome/hsb/locale/hsb/messenger/",
-        "messenger-newsblog": "chrome/hsb/locale/hsb/messenger-newsblog/",
-        "alerts": "chrome/hsb/locale/hsb/alerts/",
-        "pipnss": "chrome/hsb/locale/hsb/pipnss/",
-        "global-platform": {
-          "macosx": "chrome/hsb/locale/hsb/global-platform/mac/",
-          "android": "chrome/hsb/locale/hsb/global-platform/unix/",
-          "win": "chrome/hsb/locale/hsb/global-platform/win/",
-          "linux": "chrome/hsb/locale/hsb/global-platform/unix/"
-        },
         "pluginproblem": "chrome/hsb/locale/hsb/pluginproblem/",
-        "chat": "chrome/hsb/locale/hsb/chat/",
+        "passwordmgr": "chrome/hsb/locale/hsb/passwordmgr/",
+        "mozapps": "chrome/hsb/locale/hsb/mozapps/",
         "necko": "chrome/hsb/locale/hsb/necko/",
-        "messenger-smime": "chrome/hsb/locale/hsb/messenger-smime/",
         "places": "chrome/hsb/locale/hsb/places/",
-        "passwordmgr": "chrome/hsb/locale/hsb/passwordmgr/",
+        "messenger": "chrome/hsb/locale/hsb/messenger/",
+        "global": "chrome/hsb/locale/hsb/global/",
         "messenger-mapi": "chrome/hsb/locale/hsb/messenger-mapi/",
-        "autoconfig": "chrome/hsb/locale/hsb/autoconfig/",
+        "lightning": "chrome/hsb/locale/hsb/lightning/",
+        "pippki": "chrome/hsb/locale/hsb/pippki/",
+        "messenger-smime": "chrome/hsb/locale/hsb/messenger-smime/",
+        "branding": "chrome/hsb/locale/hsb/branding/",
+        "calendar": "chrome/hsb/locale/hsb/calendar/",
+        "messenger-region": "chrome/hsb/locale/hsb/messenger-region/",
         "devtools-startup": "chrome/hsb/locale/hsb/devtools/startup/",
         "devtools": "chrome/hsb/locale/hsb/devtools/client/",
+        "messenger-newsblog": "chrome/hsb/locale/hsb/messenger-newsblog/",
+        "pipnss": "chrome/hsb/locale/hsb/pipnss/",
         "communicator": "chrome/hsb/locale/hsb/communicator/",
         "devtools-shared": "chrome/hsb/locale/hsb/devtools/shared/",
-        "pippki": "chrome/hsb/locale/hsb/pippki/",
-        "branding": "chrome/hsb/locale/hsb/branding/",
-        "messenger-region": "chrome/hsb/locale/hsb/messenger-region/",
-        "mozapps": "chrome/hsb/locale/hsb/mozapps/",
-        "mozldap": "chrome/hsb/locale/hsb/mozldap/",
-        "global": "chrome/hsb/locale/hsb/global/",
-        "calendar": "chrome/hsb/locale/hsb/calendar/",
-        "lightning": "chrome/hsb/locale/hsb/lightning/"
-      }
-    }
-  },
-  "manifest_version": 2,
-  "version": "76.0buildid20200407173003",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
+        "alerts": "chrome/hsb/locale/hsb/alerts/",
+        "global-platform": {
+          "win": "chrome/hsb/locale/hsb/global-platform/win/",
+          "linux": "chrome/hsb/locale/hsb/global-platform/unix/",
+          "macosx": "chrome/hsb/locale/hsb/global-platform/mac/",
+          "android": "chrome/hsb/locale/hsb/global-platform/unix/"
+        },
+        "chat": "chrome/hsb/locale/hsb/chat/",
+        "autoconfig": "chrome/hsb/locale/hsb/autoconfig/",
+        "mozldap": "chrome/hsb/locale/hsb/mozldap/"
+      },
+      "version": "20200419205356"
     }
   },
+  "author": "Michael Wolf (contributors: Michael Wolf)",
   "applications": {
     "gecko": {
       "strict_min_version": "76.0",
       "strict_max_version": "76.*",
       "id": "langpack-hsb@thunderbird.mozilla.org"
     }
-  },
-  "langpack_id": "hsb",
-  "description": "Language pack for Thunderbird for hsb",
-  "author": "Michael Wolf (contributors: Michael Wolf)"
+  }
 }
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties
index 9cd7e9474c26..a21d99a77743 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/debugger.properties
@@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=r
 removeDirectoryRoot.label=Könyvtár gyökér eltávolítása
 removeDirectoryRoot.accesskey=e
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+blackBoxAll.label=Fekete doboz
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+blackBoxAllInGroup.label=Fájlok fekete doboznak tekintése ebben a csoportban
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+unblackBoxAllInGroup.label=Fájlok fekete doboznak tekintésének visszavonása ebben a csoportban
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+blackBoxAllOutsideGroup.label=Fájlok fekete doboznak tekintése a csoporton kívül
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+unblackBoxAllOutsideGroup.label=Fájlok fekete doboznak tekintésének visszavonása a csoporton kívül
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+blackBoxAllInDir.label=Fájlok fekete doboznak tekintése ebben a könyvtárban
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+unblackBoxAllInDir.label=Fájlok fekete doboznak tekintésének visszavonása ebben a könyvtárban
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+blackBoxAllOutsideDir.label=Fájlok fekete doboznak tekintése a könyvtárban kívül
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+unblackBoxAllOutsideDir.label=Fájlok fekete doboznak tekintésének visszavonása a könyvtárban kívül
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Függvény másolása
@@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Eltávolítva:
 # a JS execution
 whyPaused.interrupted=Várakoztatás végrehajtáskor
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause=Várakoztatás felvételkor
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=felesleges
 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
 # service worker that is in an unknown state.
 serviceWorkerInfo.unknown=ismeretlen
-
-# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
-blackBoxAll.label=Blackbox
-# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected group
-blackBoxAllInGroup.label=Blackbox files in this group
-# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected group
-unblackBoxAllInGroup.label=Unblackbox files in this group
-# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected group
-blackBoxAllOutsideGroup.label=Blackbox files outside this group
-# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected group
-unblackBoxAllOutsideGroup.label=Unblackbox files outside this group
-# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected directory
-blackBoxAllInDir.label=Blackbox files in this directory
-# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected directory
-unblackBoxAllInDir.label=Unblackbox files in this directory
-# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected directory
-blackBoxAllOutsideDir.label=Blackbox files outside this directory
-# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected directory
-unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties
index 8d2c471e9a63..e2594d7a5016 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Az elem túlcsordulása görgethető.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Nincs kapcsolódó szabály
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Tartsa lenyomva a Shift billentyűt, és kattintson a szabályra ugráshoz
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties
index 0f2ce76fbcc4..02dc68edb77d 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy=Másolás
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll=Összes kinyitása
 
+jsonViewer.ExpandAllSlow=Összes kibontása (lassú)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll=Összes összecsukása
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON=JSON szűrése
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference=Ciklushivatkozás
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties
index 7303c3b42fe7..8d32c3b8126b 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/devtools/client/netmonitor.properties
@@ -351,6 +351,10 @@ netmonitor.timings.startedAt=Elindítva: %S
 # %S is time expressed in milliseconds or minutes.
 netmonitor.timings.downloadedAt=Letöltve: %S
 
+# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
+# timings pane when thea request has been blocked
+netmonitor.timings.noTimings=Nincsenek időzítések a kéréshez
+
 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
 # in the network menu specifying timing interval divisions (in milliseconds).
 networkMenu.millisecond=%S ms
@@ -761,6 +765,14 @@ netmonitor.ws.context.received=Fogadott
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=F
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+netmonitor.ws.context.controlFrames=Vezérlés
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey=e
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Üzenet másolása
@@ -781,11 +793,6 @@ netmonitor.ws.type.sent=Küldött
 # accessible text for the "received" type icon in the websocket table's "data" column.
 netmonitor.ws.type.received=Fogadott
 
-# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the
-# time values in the websocket table's "time" column
-# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded)
-netmonitor.ws.time.format=%1$S,%2$S
-
 # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed
 # in the messages panel identifying the raw data.
 netmonitor.ws.rawData.header=Nyers adatok (%S)
@@ -1526,13 +1533,3 @@ netmonitor.cache.lastModified=Utoljára módosítva
 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
 # where a cached object was fetched from (e.g. "disk").
 netmonitor.cache.device=Eszköz
-
-# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
-# timings pane when thea request has been blocked
-netmonitor.timings.noTimings=No timings for this request
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
-# on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties
index 329e2b0e3a31..dad7333dad97 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      elválasztó
 tabPanel     =      lappanel
 # The roleDescription for the html:mark element
 highlight = kiemelés
-
 # The roleDescription for the details element
-details = details
+details = részletek
 # The roleDescription for the summary element
-summary = summary
+summary = összefoglalás
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties
index b91b7bf74337..d238958d5378 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=A(z) %1$S stíluslap betöltődött CSS-ként annak ellenére, ho
 
 PEUnexpEOF2=%1$S keresése közben váratlanul vége lett a fájlnak.
 PEParseRuleWSOnly=Csak üres helyet tartalmazó karakterláncot kellett volna szabályként értelmezni.
+
 PEDeclDropped=A deklaráció el lett dobva.
 PEDeclSkipped=Ugrás a következő deklarációra.
 PEUnknownProperty=Ismeretlen tulajdonság: „%1$S”.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Csak egy repeat(auto-fill, …) enged
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Csak egy repeat(auto-fill, …) vagy repeat(auto-fit, …) engedélyezett a sávlistában.
 PEMoreThanOneGridRepeatTrackSize=Csak egy sávméret engedélyezett a repeat(auto-fit/auto-fill, …) belsejében.
 
+PEDisallowedImportRule=Az @import szabályok nem érvényesek a létrehozott stíluslapokban.
+
 TooLargeDashedRadius=A szegélysugár túl nagy a "dashed" stílushoz (a korlát 100000px). Megjelenítés tömörként.
 TooLargeDottedRadius=A szegélysugár túl nagy a "dotted" stílushoz (a korlát 100000px). Megjelenítés tömörként.
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties
index 825d65b25b79..6bcebbc1c8c7 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/dom/dom.properties
@@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=A „background”, „color”, „fontf
 MathML_DeprecatedXLinkAttributeWarning=A „href”, „type”, „show” és „actuate” XLink attribútumok elavultak a MathML elemeken, és a jövőben eltávolításra fognak kerülni.
 WebShareAPI_Failed=A megosztási művelet nem sikerült.
 WebShareAPI_Aborted=A megosztási műveletet megszakították.
-
 # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
-UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol.
+UnknownProtocolNavigationPrevented=Az ismeretlen protokoll miatt meg lett akadályozva a navigáció: „%1$S”.
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties
index f8ecb8c13f0d..7999302e7bf5 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/global/security/security.properties
@@ -147,13 +147,16 @@ XFODeny = Az X-Frame-Options megakadályozta a betöltést: „%1$S” innen: 
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Az X-Frame-Options megakadályozta a betöltést: „%1$S” innen: „%2$S”, az oldal nem engedélyezi a nem azonos eredetű beágyazást innen: „%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Érvénytelen X-Frame-Options fejléc található a(z) „%2$S” betöltésekor: a(z) „%1$S” nem érvényes direktíva.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=A(z) „%2$S” keretben megnyitása blokkolva a(z) „X-Frame-Options” direktíva „%1$S” értéke miatt.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = A nem biztonságos „%1$S” kérés frissítése „%2$S” használatára.
 # LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgrade = A „%1$S” kérés nem lett frissítve, mert NoUpgrade jelző van rajta.
-
-# LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt.
+HTTPSOnlyNoUpgradeException = A nem biztonságos „%1$S” kérés nem lesz frissítve, mert kivételt képez.
 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code.
-HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S)
+HTTPSOnlyFailedRequest = A nem biztonságos „%1$S” kérés frissítése sikertelen. (%2$S)
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd
index d7bc7aaf8b8b..aa61a75bb1e8 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Üzenetek keresése…">
 <!ENTITY searchMailCmd.accesskey "e">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Globális keresés…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Címek keresése…">
 <!ENTITY searchAddressesCmd.accesskey "C">
 
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties
index 61f8fb5bed31..338d1618c1a4 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Ez egy titkosított OpenPGP üzenet.<br>A levél visszafejtéséhez telepítenie kell egy <a href="%S">OpenPGP kiegészítőt</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Ez egy OpenPGP-vel titkosított üzenet, de az OpenPGP visszafejtés támogatása nem érhető el.
diff --git a/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties b/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties
index 0579a56cc8cf..3cabfde0dcf7 100644
--- a/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties
+++ b/thunderbird-l10n/hu/chrome/hu/locale/hu/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Tároló-hozzáférés automatikusan
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Tároló-hozzáférés automatikusan megadva a(z) „%2$S” követőnek itt: „%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Tároló-hozzáférés automatikusan megadva a(z) „%2$S” első féltől származó elkülönítésnek itt: „%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=A(z) „%1$S” süti elutasításra került, mert a „sameSite=none” attribútum meg lett adva, de hiányzik a „secure” attribútum.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
@@ -67,8 +70,7 @@ CookieLaxForced=A(z) „%1$S” süti „sameSite” irányelve „lax” érté
 CookieLaxForcedForBeta=A(z) „%1$S” süti nem rendelkezik megfelelő „sameSite” attribútumértékkel. Hamarosan a „sameSite” attribútum nélküli, vagy érvénytelen értékkel rendelkező sütik „lax” értékűként lesznek kezelve. Ez azt jelenti, hogy a sütik többé nem lesznek elküldve harmadik feles környezetben. Ha az alkalmazás arra támaszkodik, hogy ilyen esetekben is elérhető a süti, akkor adja meg a „sameSite=none” attribútumot. Hogy többet tudjon meg a „sameSite” attribútumról, olvassa el a(z) %2$S oldalt.
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid=Érvénytelen „sameSite” érték a(z) „%1$S” sütihez. A támogatott értékek: „lax”, „strict”, „none”.
-
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
+CookieOversize=A(z) „%1$S” süti érvénytelen, mert túl nagy. A legnagyobb méret %2$S B.
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize=A(z) „%1$S” süti érvénytelen, mert az útvonal túl nagy. A legnagyobb méret %2$S B.
diff --git a/thunderbird-l10n/hu/localization/hu/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/hu/localization/hu/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..066dde0e3be3
--- /dev/null
+++ b/thunderbird-l10n/hu/localization/hu/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Naptár URI átirányítás
+calendar-uri-redirect-description =
+    A kiszolgáló átirányítja a(z) „{ $calendarName }” naptár URI-ját.
+    Elfogadja az átirányítást, és elkezdi használni a naptár új URI-ját?
+calendar-uri-redirect-original-uri-label = Jelenlegi URI:
+calendar-uri-redirect-target-uri-label = Átirányítás új URI-ra:
diff --git a/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl
index 6afc13683fc6..dbbcd9bae4a8 100644
--- a/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/hu/localization/hu/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = A csatlakoztatott böngésző régi ve
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = A Hibakereső panel lehet hogy nem fog működni a csatlakoztatott böngészővel. Használja a Firefox { $runtimeVersion } verziót, ha ezzel a böngészővel akarja használni a Hibakeresőt.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = A Firefox ezen verziója nem tud hibát keresni a Firefox for Androidban (68). Javasoljuk, hogy a teszteléshez telepítse a Firefox for Android Nightlyt a telefonján.
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl b/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl
index ba4f8237cb97..e4b70b9733d0 100644
--- a/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/hu/localization/hu/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Üdvözli a { -brand-full-name }
+account-settings = Postafiók beállításai
+#   $accounts (Number) - the number of configured accounts
 setup-title = Válassza ki, mit szeretne beállítani
 about-title = A { -brand-full-name } névjegye
 resources-title = Erőforrások
@@ -40,3 +42,10 @@ explore-link = Funkciók felfedezése
 support-link = Támogatás
 involved-link = Csatlakozzon
 developer-link = Fejlesztői dokumentáció
+read = Üzenetek olvasása
+compose = Új üzenet írása
+search = Üzenetek keresése
+filter = Üzenetszűrők kezelése
+nntp-subscription = Hírcsoport-feliratkozások kezelése
+rss-subscription = Hírcsatorna-feliratkozások kezelése
+e2e = Végpontok közötti titkosítás
diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl
index 62f4c080eb9f..9c7eb6a5501a 100644
--- a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Kiegészítő telepítése fájlból…
     .accesskey = f
 help-button = Kiegészítő támogatás
+sidebar-help-button-title =
+    .title = Kiegészítő támogatás
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } beállítások
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Eszközök minden kiegészítőhöz
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } beállítások
+           *[other] { -brand-short-name } beállítások
+        }
 show-unsigned-extensions-button =
     .label = Néhány kiegészítő nem ellenőrizhető
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Elérhető frissítések
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Javaslatok
+addon-category-discover-title =
+    .title = Javaslatok
 addon-category-extension = Kiegészítők
+addon-category-extension-title =
+    .title = Kiegészítők
 addon-category-theme = Témák
+addon-category-theme-title =
+    .title = Témák
 addon-category-plugin = Bővítmények
+addon-category-plugin-title =
+    .title = Bővítmények
 addon-category-dictionary = Szótárak
+addon-category-dictionary-title =
+    .title = Szótárak
 addon-category-locale = Nyelvek
+addon-category-locale-title =
+    .title = Nyelvek
 addon-category-available-updates = Elérhető frissítések
+addon-category-available-updates-title =
+    .title = Elérhető frissítések
 addon-category-recent-updates = Legutóbbi frissítések
+addon-category-recent-updates-title =
+    .title = Legutóbbi frissítések
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = A következő kiegészítők nem rendelkeznek gyorsbille
 shortcuts-input =
     .placeholder = Írjon be egy gyorsbillentyűt
 shortcuts-browserAction = Kiegészítő aktiválása
+shortcuts-browserAction2 = Eszköztárgomb aktiválása
 shortcuts-pageAction = Lapművelet aktiválása
 shortcuts-sidebarAction = Oldalsáv be/ki
 shortcuts-modifier-mac = Ctrl, Alt vagy ⌘ gombot tartalmaz
@@ -312,6 +337,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Kevesebb megjelenítése
 go-back-button =
     .tooltiptext = Ugrás vissza
+header-back-button =
+    .title = Ugrás vissza
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl
index 9ec85f56ddaf..21890144a056 100644
--- a/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/hu/localization/hu/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = tartalom
 sandbox-proc-type-file = fájltartalom
 sandbox-proc-type-media-plugin = médiabővítmény
 sandbox-proc-type-data-decoder = adatdekódoló
+startup-cache-title = Indítási gyorsítótár
+startup-cache-disk-cache-path = Lemezgyorsítótár elérési útja
+startup-cache-ignore-disk-cache = Lemezgyorsítótár figyelmen kívül hagyása
+startup-cache-found-disk-cache-on-init = Lemezgyorsítótár megtalálva indításkor
+startup-cache-wrote-to-disk-cache = Lemezgyorsítótárba írva
 launcher-process-status-0 = Engedélyezve
 launcher-process-status-1 = Hiba miatt letiltva
 launcher-process-status-2 = Kényszerítve letiltva
@@ -310,6 +315,7 @@ touch-enabled = érintőbemenet engedélyezve
 drag-enabled = gördítősáv húzása engedélyezve
 keyboard-enabled = billentyűzet engedélyezve
 autoscroll-enabled = automatikus görgetés engedélyezve
+zooming-enabled = sima csípéssel történő nagyítás engedélyezve
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl
index 7cfb2363fbfb..2a42e9f2c756 100644
--- a/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/hu/localization/hu/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = Azonosító
 certificate-viewer-key-exchange-group = Kulcscsere csoport
 certificate-viewer-key-id = Kulcsazonosító
 certificate-viewer-key-size = Kulcsméret
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Bejegyzés helyszíne
 certificate-viewer-locality = Helység
 certificate-viewer-location = Hely
 certificate-viewer-logid = Naplóazonosító
@@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (tanúsítvány)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (lánc)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Ez a kiegészítő kritikusként lett megjelölve, ami azt jelenti, hogy a klienseknek el kell utasítaniuk a tanúsítványt, ha nem értik azt.
+certificate-viewer-export = Exportálás
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Saját tanúsítványok
+certificate-viewer-tab-people = Emberek
+certificate-viewer-tab-servers = Kiszolgálók
+certificate-viewer-tab-ca = Hitelesítésszolgáltatók
+certificate-viewer-tab-unkonwn = Ismeretlen
diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl
index dfd90b82c685..aa9601d7c417 100644
--- a/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/hu/localization/hu/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Elkülönített webtartalom
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Foglalat
diff --git a/thunderbird-l10n/hu/localization/hu/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hu/localization/hu/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..d126e42ddbeb
--- /dev/null
+++ b/thunderbird-l10n/hu/localization/hu/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = A { -brand-product-name } egy régebbi verzióját indította el
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Új profil létrehozása
+profiledowngrade-sync = A { -brand-product-name } régebbi verziójának használata megrongálhatja a létező { -brand-product-name } profilba mentett könyvjelzőket és a böngészési előzményeket. Az információi védelme érdekében hozzon létre egy új profil a { -brand-short-name } ezen telepítéséhez. Bármikor bejelentkezhet a { -fxaccount-brand-name }jába, hogy szinkronizálja a könyvjelzőit és böngészési előzményeit a profiljai között.
+profiledowngrade-nosync = A { -brand-product-name } régebbi verziójának használata megrongálhatja a létező { -brand-product-name } profilba mentett könyvjelzőket és a böngészési előzményeket. Az információi védelme érdekében hozzon létre egy új profil a { -brand-short-name } ezen telepítéséhez.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Kilépés
+           *[other] Kilépés
+        }
diff --git a/thunderbird-l10n/hu/manifest.json b/thunderbird-l10n/hu/manifest.json
index d9c7fd46710b..2e605b1983dd 100644
--- a/thunderbird-l10n/hu/manifest.json
+++ b/thunderbird-l10n/hu/manifest.json
@@ -1,57 +1,57 @@
 {
+  "manifest_version": 2,
+  "name": "Magyar (HU) Language Pack",
+  "version": "76.0buildid20200420212409",
+  "langpack_id": "hu",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "langpack_id": "hu",
-  "version": "76.0buildid20200407173003",
   "description": "Language pack for Thunderbird for hu",
-  "manifest_version": 2,
-  "applications": {
-    "gecko": {
-      "id": "langpack-hu@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
-  "author": "FSF.hu (contributors: Tímár András)",
-  "name": "Magyar (HU) Language Pack",
   "languages": {
     "hu": {
-      "version": "20200404102428",
+      "version": "20200420091805",
       "chrome_resources": {
+        "chat": "chrome/hu/locale/hu/chat/",
+        "devtools-shared": "chrome/hu/locale/hu/devtools/shared/",
+        "messenger-region": "chrome/hu/locale/hu/messenger-region/",
+        "messenger-mapi": "chrome/hu/locale/hu/messenger-mapi/",
+        "global": "chrome/hu/locale/hu/global/",
         "autoconfig": "chrome/hu/locale/hu/autoconfig/",
-        "devtools-startup": "chrome/hu/locale/hu/devtools/startup/",
-        "calendar": "chrome/hu/locale/hu/calendar/",
-        "devtools": "chrome/hu/locale/hu/devtools/client/",
-        "pipnss": "chrome/hu/locale/hu/pipnss/",
         "global-platform": {
           "android": "chrome/hu/locale/hu/global-platform/unix/",
-          "linux": "chrome/hu/locale/hu/global-platform/unix/",
           "macosx": "chrome/hu/locale/hu/global-platform/mac/",
-          "win": "chrome/hu/locale/hu/global-platform/win/"
+          "win": "chrome/hu/locale/hu/global-platform/win/",
+          "linux": "chrome/hu/locale/hu/global-platform/unix/"
         },
-        "global": "chrome/hu/locale/hu/global/",
-        "messenger": "chrome/hu/locale/hu/messenger/",
-        "passwordmgr": "chrome/hu/locale/hu/passwordmgr/",
         "pluginproblem": "chrome/hu/locale/hu/pluginproblem/",
-        "places": "chrome/hu/locale/hu/places/",
-        "communicator": "chrome/hu/locale/hu/communicator/",
-        "branding": "chrome/hu/locale/hu/branding/",
         "messenger-newsblog": "chrome/hu/locale/hu/messenger-newsblog/",
-        "mozapps": "chrome/hu/locale/hu/mozapps/",
-        "messenger-mapi": "chrome/hu/locale/hu/messenger-mapi/",
+        "alerts": "chrome/hu/locale/hu/alerts/",
         "messenger-smime": "chrome/hu/locale/hu/messenger-smime/",
-        "messenger-region": "chrome/hu/locale/hu/messenger-region/",
-        "lightning": "chrome/hu/locale/hu/lightning/",
-        "devtools-shared": "chrome/hu/locale/hu/devtools/shared/",
         "mozldap": "chrome/hu/locale/hu/mozldap/",
-        "chat": "chrome/hu/locale/hu/chat/",
-        "alerts": "chrome/hu/locale/hu/alerts/",
+        "lightning": "chrome/hu/locale/hu/lightning/",
+        "passwordmgr": "chrome/hu/locale/hu/passwordmgr/",
+        "places": "chrome/hu/locale/hu/places/",
+        "messenger": "chrome/hu/locale/hu/messenger/",
+        "devtools-startup": "chrome/hu/locale/hu/devtools/startup/",
+        "communicator": "chrome/hu/locale/hu/communicator/",
+        "necko": "chrome/hu/locale/hu/necko/",
+        "calendar": "chrome/hu/locale/hu/calendar/",
         "pippki": "chrome/hu/locale/hu/pippki/",
-        "necko": "chrome/hu/locale/hu/necko/"
+        "devtools": "chrome/hu/locale/hu/devtools/client/",
+        "branding": "chrome/hu/locale/hu/branding/",
+        "pipnss": "chrome/hu/locale/hu/pipnss/",
+        "mozapps": "chrome/hu/locale/hu/mozapps/"
       }
     }
+  },
+  "author": "FSF.hu (contributors: Tímár András)",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-hu@thunderbird.mozilla.org"
+    }
   }
 }
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties
index 35eed121d094..c7b7f5858494 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/debugger.properties
@@ -55,6 +55,32 @@ setDirectoryRoot.accesskey=r
 removeDirectoryRoot.label=Հեռացնել գրացուցակի արմատը
 removeDirectoryRoot.accesskey=d
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Պատճենել գործառույթը
@@ -67,7 +93,7 @@ copyStackTrace.accesskey=c
 
 # LOCALIZATION NOTE (expandSources): This is the tooltip for the button
 # that expands the Sources and Outlines panes in the debugger UI.
-expandSources=Ընդարձակել ղբյուրնրը և եզրագծի փեղկերը
+expandSources=Ընդարձակել աղբյուրնրը և եզրագծի փեղկերը
 
 # LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button
 # that expands the Breakpoints panes in the debugger UI.
@@ -146,11 +172,11 @@ mainThread=Գլխավոր շղթա
 
 # LOCALIZATION NOTE (noWorkersText): The text to display in the workers list
 # when there are no workers.
-noWorkersText=Այս էջը աշխատողներ չունի:                             \u0020
+noWorkersText=Այս էջը աշխատողներ չունի։
 
 # LOCALIZATION NOTE (noSourcesText): The text to display in the sources list
 # when there are no sources.
-noSourcesText=\u0020                                   Այս էջը աղբյուրներ չունի:                             \u0020
+noSourcesText=Այս էջը աղբյուրներ չունի։
 
 # LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab
 # when there are no events.
@@ -945,7 +971,7 @@ emptyVariablesText=Ցուցադրման համար փոփոխականներ չկ
 # LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables
 # pane as a header for each variable scope (e.g. "Global scope, "With scope",
 # etc.).
-scopeLabel=%S գործողության շրջանակ               \u0020
+scopeLabel=%S գործողության շրջանակ
 
 # LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch
 # expressions scope. This text is displayed in the variables pane as a header for
@@ -1054,11 +1080,6 @@ whyPaused.mutationBreakpointRemoved=Հեռացված․
 # a JS execution
 whyPaused.interrupted=Դադարեցվել է կատարման ժամանակ
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause=Դադարեցվել է փայնագրությունում
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1071,12 +1092,12 @@ whyPaused.pauseOnDOMEvents=Դադարեցված է իրադարձության ո
 
 # LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed
 # in an info block when evaluating a conditional breakpoint throws an error
-whyPaused.breakpointConditionThrown=Սխալ՝ պայմանական ընդհատակետում
+whyPaused.breakpointConditionThrown=Սխալ՝ պայմանական խզակետում
 
 # LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed
 # in a info block explaining how the debugger is currently paused on an
 # xml http request
-whyPaused.xhr=Դադարեցված XMLHttpRequest-ում
+whyPaused.xhr=Դադարեցվել է XMLHttpRequest-ում
 
 # LOCALIZATION NOTE (whyPaused.XHR): The text that is displayed
 # in a info block explaining how the debugger is currently paused on an
@@ -1138,7 +1159,7 @@ shortcuts.toggleCondPanel.breakpoint=Փոփոխել պայմանական խզա
 
 # LOCALIZATION NOTE (shortcuts.toggleCondPanel.logPoint): text describing
 # keyboard shortcut action for toggling conditional panel for log points
-shortcuts.toggleCondPanel.logPoint=Խմբագրել գրանցամատյանի կետը
+shortcuts.toggleCondPanel.logPoint=Խմբագրել մուտքային կետը
 
 # LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing
 # keyboard shortcut action for pause of resume
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties
index 0a5bcd633601..2b5f13369c62 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/font-inspector.properties
@@ -66,4 +66,4 @@ fontinspector.fontsUsedLabel=Օգտագործված տառատեսակներ
 
 # LOCALIZATION NOTE (fontinspector.previewTextPlaceholder): Placeholder for the input
 # where the user can type text to get a preview of it using a font.
-fontinspector.previewTextPlaceholder=Նախադիտման գրույթի տառատեսակի
+fontinspector.previewTextPlaceholder=Նախադիտման գրույթի տառատեսակ
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties
index 80461e968aa9..6b565b74571c 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/inspector.properties
@@ -322,7 +322,7 @@ inspectorPseudoClassSubmenu.label=Փոխել կեղծ֊դասը
 
 # LOCALIZATION NOTE (inspectorBreakpointSubmenu.label): This is the label
 # shown in the inspector contextual-menu for the sub-menu of the DOM breakpoints.
-inspectorBreakpointSubmenu.label=Կոտրել երբ…
+inspectorBreakpointSubmenu.label=Կոտրել …
 
 # LOCALIZATION NOTE (inspectorSubtreeModification.label): This is the label shown
 # in the inspector contextual-menu for the item that lets users add a DOM breakpoint
@@ -534,7 +534,7 @@ inspector.printSimulation.tooltip = Էջի համար մեդիա մոդելավ
 # LOCALIZATION NOTE (inspector.colorSchemeSimulation.tooltip):
 # This is the tooltip of the color scheme simulation button in the Rule View
 # toolbar that toggles color scheme simulation.
-inspector.colorSchemeSimulation.tooltip=Այս էջի համար փոխանջատել գունավորման նմնակումը
+inspector.colorSchemeSimulation.tooltip=Այս էջի համար փոխանջատել գունավորման նմանակումը
 
 # LOCALIZATION NOTE (markupView.scrollableBadge.label): This is the text displayed inside a
 # badge, in the inspector, next to nodes that are scrollable in the page.
@@ -548,6 +548,9 @@ markupView.scrollableBadge.tooltip=Այս տարրն ունի պտտվող ար
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Ոչ մի հարակից կանոն
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties
index 57e6b765b643..bf5f428dd8cc 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/layout.properties
@@ -89,7 +89,7 @@ flexbox.itemSizing.notSetToShrink=Նյութը չպետք է նեղացնել։
 
 # LOCALIZATION NOTE (flexbox.togglesFlexboxHighlighter2): The tooltip text for the Flexbox
 # toggle button.
-flexbox.togglesFlexboxHighlighter2=Փոխարկել Flexbox-ի գունանաշիչները
+flexbox.togglesFlexboxHighlighter2=Փոխարկել Flexbox-ի գունանշիչները
 
 # LOCALIZATION NOTE (layout.cannotShowGridOutline, layout.cannotSHowGridOutline.title):
 # In the case where the grid outline cannot be effectively displayed.
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties
index 09082dd30825..9bf6014ee4a7 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/memory.properties
@@ -46,7 +46,7 @@ checkbox.recordAllocationStacks=Խմբավորել ըստ՝
 # LOCALIZATION NOTE (checkbox.recordAllocationStacks.tooltip): The tooltip for
 # the label describing the boolean checkbox whether or not to record call
 # stacks.
-checkbox.recordAllocationStacks.tooltip=Միացրեք զանգի ձայնագրությունը այն ժամանակ, երբ առարկան հատկացվել է։ Հետագա նկարահանումները կկարողանան խմբագրել և պիտակավորել առարկաները զանգի պաստառներով, բայց միայն այն տարբերակներով, որոնք ստեղծվել են այս տարբերակն անցնելուց հետո։ Զանգի փորագրերը ձայնագրելու գործընթացն ունի գերակատարում։
+checkbox.recordAllocationStacks.tooltip=Միացրեք զանգի ձայնագրությունը այն ժամանակ, երբ առարկան հատկացվել է։ Հետագայ նկարահանումները կկարողանան խմբագրել և պիտակաւորել առարկաները զանգի պաստառներով, բայց միայն այն տարբերակներով, որոնք ստեղծուել են այս տարբերակն անցնելուց յետոյ։ Զանգի փորագրերը ձայնագրելու գործընթացն ունի գերակատարում։
 
 # LOCALIZATION NOTE (toolbar.displayBy): The label describing the select menu
 # options of the display options.
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties
index 4aaa3b9f4d7c..253ab0318b14 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/netmonitor.properties
@@ -351,6 +351,9 @@ netmonitor.timings.startedAt=Ներածական․ %S
 # %S is time expressed in milliseconds or minutes.
 netmonitor.timings.downloadedAt=Ներբեռնված․ %S
 
+# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
+# timings pane when thea request has been blocked
+
 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
 # in the network menu specifying timing interval divisions (in milliseconds).
 networkMenu.millisecond=%Sմվ
@@ -638,6 +641,7 @@ netmonitor.toolbar.cause=Պատճառ
 
 # LOCALIZATION NOTE (netmonitor.toolbar.initiator): This is the label displayed
 # in the network table toolbar, above the "initiator" column.
+netmonitor.toolbar.initiator=Սկզբնավորիչ
 
 # LOCALIZATION NOTE (netmonitor.toolbar.type): This is the label displayed
 # in the network table toolbar, above the "type" column.
@@ -760,6 +764,12 @@ netmonitor.ws.context.received=Ստացված
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=R
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Պատճենել նամակը
@@ -780,11 +790,6 @@ netmonitor.ws.type.sent=Ուղարկված
 # accessible text for the "received" type icon in the websocket table's "data" column.
 netmonitor.ws.type.received=Ստացված
 
-# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the
-# time values in the websocket table's "time" column
-# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded)
-netmonitor.ws.time.format=%1$S.%2$S
-
 # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed
 # in the messages panel identifying the raw data.
 netmonitor.ws.rawData.header=Հում տվյալներ (%S)
@@ -1021,6 +1026,14 @@ netmonitor.toolbar.resetColumns=Վերականգնել սյուները
 # displayed in the network table header context menu to reset sorting
 netmonitor.toolbar.resetSorting=Վերատեղադրել տեսակավորումը
 
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label
+# displayed in the network table header context menu to resize a column to fit its content
+netmonitor.toolbar.resizeColumnToFitContent=Չափափոխել սյունակը բովանդակությանը համապատասխանելու համար
+
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title
+# tooltip displayed when draggable resizer in network table headers is hovered
+netmonitor.toolbar.resizeColumnToFitContent.title=Կրկնակի սեղմեք`սյունը բովանդակությանը համապատասխանելու համար
+
 # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label
 # displayed in the network table header context menu for the timing submenu
 netmonitor.toolbar.timings=Ժամանակներ
@@ -1521,18 +1534,9 @@ netmonitor.cache.device=Սարք
 # LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
 # timings pane when thea request has been blocked
 netmonitor.timings.noTimings=No timings for this request
-# LOCALIZATION NOTE (netmonitor.toolbar.initiator): This is the label displayed
-# in the network table toolbar, above the "initiator" column.
-netmonitor.toolbar.initiator=Initiator
 # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
 # on the context menu that shows "Control Frames" WebSocket frames.
 netmonitor.ws.context.controlFrames=Control
 # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
 # for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.controlFrames.accesskey=o
-# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label
-# displayed in the network table header context menu to resize a column to fit its content
-netmonitor.toolbar.resizeColumnToFitContent=Resize Column To Fit Content
-# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title
-# tooltip displayed when draggable resizer in network table headers is hovered
-netmonitor.toolbar.resizeColumnToFitContent.title=Double-click to fit column to content
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd
index a46963ad9708..c5a0bb585cfe 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/devtools/client/performance.dtd
@@ -42,7 +42,7 @@
 <!ENTITY performanceUI.toolbar.memory-calltree "Բաշխումներ">
 <!ENTITY performanceUI.toolbar.allocations.tooltiptext "Ցուցադրումներ, որտեղ ձայնագրության ընթացքում հիշողություն է հատկացվել։">
 <!ENTITY performanceUI.toolbar.js-flamegraph "Այրել JS աղյուսակը">
-<!ENTITY performanceUI.toolbar.js-flamegraph.tooltiptext "Ցույց է տալիս JavaScript֊ի կանչի զանգը ձայնագրության ընթացքում։">
+<!ENTITY performanceUI.toolbar.js-flamegraph.tooltiptext "Ցոյց է տալիս JavaScript֊ի կանչի զանգը ձայնագրութեան ընթացքում։">
 <!ENTITY performanceUI.toolbar.memory-flamegraph "Հատկացումների հրային աղյուսակ">
 
 <!-- LOCALIZATION NOTE (performanceUI.table.*): These strings are displayed
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties
index 38e107885e86..5a5a610f7b45 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global-platform/mac/accessible.properties
@@ -30,7 +30,7 @@ searchTextField = որոնել տեքստի դաշտում
 # The Role Description for WAI-ARIA Landmarks
 application =   հավելված
 search  =       փնտրել
-banner  =       բաններ
+banner  =       ազդերիզ
 navigation =    ուղղորդումը
 complementary = լրացուցիչ
 content =       բովանդակությունը
@@ -58,6 +58,8 @@ separator    =      բաժանիչ
 tabPanel     =      ներդիրի վահանակ
 # The roleDescription for the html:mark element
 highlight = գունանշել
+# The roleDescription for the details element
+# The roleDescription for the summary element
 
 # The roleDescription for the details element
 details = details
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties
index c8f981e83f48..12d4cb7c9d6a 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/htmlparser.properties
@@ -83,6 +83,7 @@ errNoSpaceBetweenPublicAndSystemIds=Փաստաթղթի տեսակի հանրայ
 errNoSpaceBetweenDoctypePublicKeywordAndQuote=Փաստաթղթի տեսակի “PUBLIC” հիմնաբառի և չակերտի միջև բացատ չկա:                \u0020
 
 # Tree builder errors
+errDeepTree=Փաստաթղթի ծառը չափազանց խորն է։ Ծառը կկնճռոտվի 513 տարր խորության վրա։
 errStrayStartTag2=Թափառող սկզբնական պիտակ“%1$S”:\u0020
 errStrayEndTag=Թափառող ավարտական պիտակ “%1$S”:\u0020
 errUnclosedElements=\u0020                 Ավարտական պիտակ “%1$S”-ը տեղի էր ունեցել, բայց կային և բաց տարրեր:                \u0020
@@ -129,6 +130,3 @@ errNoCheckUnclosedElementsOnStack=Շեղջում չփակված տարրեր:\u0
 errEndTagDidNotMatchCurrentOpenElement=Վերջնական պիտակ “%1$S”-ը չի համապատասխանում ընթացիկ բաց տարր (“%2$S”)-ի անվան հետ:\u0020
 errEndTagViolatesNestingRules=Վերջնական պիտակ “%1$S”-ը խախտում է ներդրված կանոնները:\u0020
 errEndWithUnclosedElements=Ավարտական պիտակ “%1$S”-ը տեղի էր ունեցել, բայց կային և չփակված տարրեր:                \u0020
-
-# Tree builder errors
-errDeepTree=The document tree is too deep. The tree will be flattened to be 513 elements deep.
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties
index 9f3ee81183f1..a2a0c1e847c1 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout/xmlparser.properties
@@ -4,38 +4,38 @@
 
 # Map Expat error codes to error strings
 1 = հիշողությունը չի բավարարում
-2 = գրագրության սխալանք
+2 = շարահյուսական սխալ է
 3 = Ոչ մի տարր չգտնվեց
 4 = լավ չէ ձևավորված
 5 = Չեզրափակված նշադրում
-6 = Չեզրափակված նշադրում
+6 = մասնակի բնույթ
 7 = անհամապատասխան շաղկապ
 8 = կրկնվող հատկանիշ
-9 = փաստաթուղթ հոդին հաջորդող թափոն
-10 = անհայտ պարամետր­բովանդակության մեջբերում
+9 = փաստաթղթի տարրին հաջորդող թափոն
+10 = անհայտ պարամետր­ բովանդակության մեջբերում
 11 = չսահմանված բովանդակություն
 12 = ինքն իրեն հիշատակող բովանդակության մեջբերում
 13 = անհամատեղ բովանդակություն
-14 = Անվաներ տառանիշի համարի հիշատակում
+14 = Անվավեր տառանիշի համարի հիշատակում
 15 = Երկուական բովանդակության հիշատակում
 16 = հատկանիշում արտաքին բովանդակության հիշատակում
 17 = XML մշակման հրահանգ, որն արտաքին բովանդակության սկզբում չէ
 18 = անհայտ կոդավորում
 19 = XML-հռչակագրում նշված կոդավորումը անստույգ է
 20 = չփակված CDATA բաժին
-21 = Սխալանք արտաքին բովանդակության մեջբերումն մշակելիս
-22 = Փաստաթուղթն ինքնամփոփ չէ
+21 = Սխալ արտաքին բովանդակության մեջբերումն մշակելիս
+22 = փաստաթուղթը ինքնուրույն չէ
 23 = վերլուծչի անսպասելի վիճակ
 24 = պարամետր բովանդակությունում հռչակված բովանդակություն
 27 = նախանիշը կապված չէ որևէ անվանատիրույթի հետ
-28 = չպետք է անդեկլարացնել պռեֆիքսը
+28 = չպետք է բացահայտել նախանիշը
 29 = անավարտ նշարկում ցուցիչի գրառում
 30 = XML հայտարարումը լավ չէ ձևավորված
-31 = նախանիշը չպիտի կապված լինի որևէ պաշարված անվանատիրույթի URI-ի հետ
+31 = տեքստի հռչակագիրը լավ ձևավորված չէ
 32 = անթույլատրելի գրանշաններ հանրային id-ում
 38 = Պահպանված նախածանցը (xml) չպետք է լինի չհայտարարված կամ պարտավորվում է մեկ այլ անվանատարածքի անուն
-39 = Ռեզերվացված (xmlns) պրեֆիքսը չի կարող լինել հայտարարված կամ ոչ հայտարարված
-40 = պրեֆիքսը չի կարող կապված լինել որևէ ռեզերվացված անունների դաշտի հետ
+39 = Պահպանված (xmlns) նախանիշը չի կարող լինել հայտարարված կամ ոչ հայտարարված
+40 = նախանիշը չի կարող կապված լինել որևէ պահպանված անունների դաշտի հետ
 
 # %1$S is replaced by the Expat error string, may be followed by Expected (see below)
 # %2$S is replaced by URL
@@ -45,4 +45,4 @@ XMLParsingError = XML վերլուծության սխալմունք՝ %1$S\nՏե
 
 # %S is replaced by a tag name.
 # This gets appended to the error string if the error is mismatched tag.
-Expected = : Սպասվում էր` </%S>:
+Expected = ։ Սպասվում է`</%S>։
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties
index b063a521796f..180b45ed4839 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/layout_errors.properties
@@ -39,11 +39,11 @@ CompositorAnimationWarningTransformFrameInactive=Շարժապատկերումը
 CompositorAnimationWarningTransformIsBlockedByImportantRules=Փոխակերպիչի շարժապատկերը չի կարող գործադրվել գրաշարի վրա, որովհետև փոխակերպիչի հետ կապված հատկությունները գերադասվում են կարևոր կանոններով
 CompositorAnimationWarningOpacityFrameInactive=Շարժապատկերը չի կարող գործադրվել գրաշարի վրա, որովհետև շրջանակը գործուն չի նշվել «անթափանցիկ» շարժապատկերի համար
 CompositorAnimationWarningHasRenderingObserver=Շարժապատկերում չի կարող գործադրվել գրաշարի վրա, քանի որ տարրն ունի դիտորդներ (-moz-element or SVG clipping/masking)
+CompositorAnimationWarningHasCurrentColor=«Ֆոնային գույնի» անիմացիաները չեն կարող վազել կոմպոզիտորի վրա `« ներկայիս գույն »առանցքային շրջանակով:
 
 ## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0"
 ZoomPropertyWarning=Ոչ ստանդարտ “zoom” գույքը օգտագործվում է այս էջում: Փորձեք օգտագործել calc () արժեքը համապատասխան գույքային արժեքներում կամ օգտագործել “transform” և “transform-origin 00” :
 
-
 ## LOCALIZATION NOTE(PrincipalWritingModePropagationWarning):
 ## Do not translate <html>, <body>, CSS, "writing-mode", "direction", "text-orientation", :root, and "The Principal Writing Mode" because they are technical terms.
 PrincipalWritingModePropagationWarning=<html> բաղադրիչը ներկայացնելիս, CSS-ի հատկությունների օգտագործված արժեքները “writing-mode”, “direction” և “text-orientation” <html> բաղադրիչում վերցված են <body> բաղադրիչի հաշվարկված արժեքներից, ոչ թե <html> բաղադրիչի սեփական արժեքներից։ Դիտարկեք այս հատկությունների  կարգավորումը :root CSS pseudo-class-ում կարգավորումը։Հավելյալ տեղեկության համար՝ “The Principal Writing Mode” https://www.w3.org/TR/css-writing-modes-3/#principal-flow-ում
@@ -54,5 +54,4 @@ PrincipalWritingModePropagationWarning=<html> բաղադրիչը ներկայա
 ## %3$S is a floating point value with the total adjusted distance
 ScrollAnchoringDisabledInContainer=Ոլորման հաստատումը անջատվել է ոլորման պարունակում` չափազանց շատ հաջորդական կարգավորումների պատճառով (%1$S) չափազանց փոքր ընդհանուր տարածություն (%2$S px միջին, %3$S px ընդհանուր)։
 
-CompositorAnimationWarningHasCurrentColor=Animations of ‘background-color’ cannot be run on the compositor with ‘current-color’ keyframe.
-ForcedLayoutStart=Layout was forced before the page was fully loaded. If stylesheets are not yet loaded this may cause a flash of unstyled content.
+ForcedLayoutStart=Դասավորությունը հարկադրված էր, նախքան էջն ամբողջությամբ բեռնված լինի։ Եթե ոճային թերթերը դեռ բեռնված չեն, դա կարող է հանգեցնել չստուգված բովանդակության փայլ։
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties
index 2a0cdd36390e..c582a16a12d9 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/mathml/mathml.properties
@@ -2,16 +2,16 @@
 # 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/.
 
-InvalidChild=Անվավեր նշարկում. <%1$S> չի թույլատրվում որպես <%2$S>-ի հետևորդ:            \u0020
-ChildCountIncorrect=Անվավեր նշարկում: <%1$S/> պիտակի համար հետնորդների սխալ քանակ:               \u0020
-DuplicateMprescripts=Անվավեր նշարկում. մեկից ավելի <mprescripts/> <mmultiscripts/>  -ում:
+InvalidChild=Անվավեր նշարկում ՝ <%1$S> չի թույլատրվում որպես <%2$S>-ի ժառանգ։
+ChildCountIncorrect=Անվավեր նշարկում ՝ <%1$S/> պիտակի համար հետնորդների սխալ քանակ։
+DuplicateMprescripts=Անվավեր նշարկում ՝ մեկից ավելի <mprescripts/> <mmultiscripts/>-ում։
 # LOCALIZATION NOTE:  The first child of <mmultiscript/> is the base, that is the element to which scripts are attached.
-NoBase=Անվավեր նշարկում:<mmultiscripts/>-ում սպասվում էր ճիշտ մեկ  Base (Հենակետ) տարր:  Ոչ մի հատ չհայտնաբերվեց:
-SubSupMismatch=Անվավեր նշարկում:<mmultiscripts/>-ում subscript/superscript  ոչ ամբողջական զույգ:               \u0020
+NoBase=Անվավեր նշարկում ՝ <mmultiscripts/>-ում սպասվում էր ճիշտ մեկ Base (Հենակետ) տարր: Ոչ մի հատ չհայտնաբերվեց:
+SubSupMismatch=Անվավեր նշարկում ՝ <mmultiscripts/>-ում subscript/superscript ոչ ամբողջական զույգ։
 
 # LOCALIZATION NOTE:  When localizing the single quotes ('), follow the conventions in css.properties for your target locale.
-AttributeParsingError=<%3$S/>ում '%2$S' հատկանիշի համար '%1$S' արժեքի սխալ վերլուծում: Հատկանիշը մերժվել է:                               \u0020
-AttributeParsingErrorNoTag='%2$S' հատկանիշի համար '%1$S' արժեքի սխալ պարզաբանում: Հատկանիշը մերժվել է:               \u0020
-LengthParsingError=MathML հատկանիշի '%1$S' արժեքի սխալ վերլուծում: Հատկանիշը մերժված է:               \u0020
-DeprecatedSupersededBy='%1$S'-ը հնացել է MathML 3-ում,փոխարինվել է '%2$S'-ով:               \u0020
+AttributeParsingError=<%3$S/>ում '%2$S' հատկանիշի համար '%1$S' արժեքի սխալ վերլուծում։ Հատկանիշը մերժվել է։
+AttributeParsingErrorNoTag='%2$S' հատկանիշի համար '%1$S' արժեքի սխալ պարզաբանում։ Հատկանիշը մերժվել է։
+LengthParsingError=MathML հատկանիշի '%1$S' արժեքի սխալ վերլուծում։ Հատկանիշը մերժված է։
+DeprecatedSupersededBy='%1$S'-ը հնացել է MathML 3-ում,փոխարինվել է '%2$S'-ով։
 UnitlessValuesAreDeprecated=Անհամաչափ արժեքները հնացել են MathML 3-ում:
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties
index 88db10741ca2..689ea4f1cdf6 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/nsWebBrowserPersist.properties
@@ -2,16 +2,16 @@
 # 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/.
 
-readError=Անհնար էր %S-ը պահել, քանզի աղբյուր-ֆայլն անհնար է կարդալ:\n\nՓորձեք ավելի ուշ կամ կապնվեք սպասարկիչի կառավարչի հետ:
-writeError=Անհայտ սխալմունքի պատճառով %S-ն անհնար էր պահպանել:\n\nՑավում եմ: Փորձեք մեկ այլ տեղ պահել:
-launchError=Անհայտ սխալի պատճառով անհնար էր %S-ը բացել:\n\nՑավում եմ: Փորձեք սկավառակի վրա պահել այնուհետև բացել:
-diskFull=%S­ը պահպանելու համար սկավառակի վրա բավարար տեղ չկա:\n\nՏեղ ստեղծելու համար հեռացրեք անպետք ֆայլերը եվ կրկին փորձեք, կամ փորձեք այլ տեղ պահել:
-readOnly=%S-ն անհնար էր պահպանել, քանզի սկավառակը, պանակը կամ ֆայլը գրելու դեմ պաշտպանված են:\n\nՀեռացրեք պաշտպանությունը և կրկին փորձեք, կամ էլ փորձեք այլ տեղ պահել:
+readError=Անհնար էր %S-ը պահել, քանզի աղբյուր-ֆայլն անհնար է կարդալ։\n\nՓորձեք ավելի ուշ կամ կապնվեք սպասարկիչի կառավարչի հետ։
+writeError=Անհայտ սխալմունքի պատճառով %S-ն անհնար էր պահպանել։\n\nՑավում եմ։ Փորձեք մեկ այլ տեղ պահել։
+launchError=Անհայտ սխալի պատճառով անհնար էր %S-ը բացել։\n\nՑավում եմ։ Փորձեք սկավառակի վրա պահել այնուհետև բացել։
+diskFull=%S­֊ը պահպանելու համար սկավառակի վրա բավարար տեղ չկա։\n\nՏեղ ստեղծելու համար հեռացրեք անպետք նիշքերը և կրկին փորձեք, կամ փորձեք այլ տեղ պահել։
+readOnly=%S-ն անհնար էր պահպանել, քանզի սկավառակը, պանակը կամ նիշքը գրելու դեմ պաշտպանված են։\n\nՀեռացրեք պաշտպանությունը և կրկին փորձեք, կամ էլ փորձեք այլ տեղ պահել։
 accessError=Անհնար է պահպանել %S­-ը, քանի որ Դուք չեք կարող փոփոխել այդ թղթապանակի պարունակությունը:\n\nՓոփոխեք թղթապանակի հատկանիշները և փորձեք կրկին կամ էլ փորձեք այլ տեղ պահել:
-SDAccessErrorCardReadOnly=Ֆայլը հնարավոր չէ բեռնել, քանի որ SD քարտը օգտագործվում է:
-SDAccessErrorCardMissing=Ֆայլը հնարավոր չէ բեռնել, քանի որ SD քարտը բացակայում է:
+SDAccessErrorCardReadOnly=Նիշքը հնարավոր չէ բեռնել, քանի որ SD քարտը օգտագործվում է։
+SDAccessErrorCardMissing=Նիշքը հնարավոր չէ բեռնել, քանի որ SD քարտը բացակայում է։
 helperAppNotFound=Անհնար էր %S-ը բացել, քանզի համապատասխան օգնող ծրագիրը առկա չէ: Փոխեք համապատասխանությունն ու կրկին փորձեք:
-noMemory=Գործողությունն ավարտեկու համար բավարար հիշողություն չկա:\n\nՓակեք որոշ ծրագրեր և կրկին փորձեք:
+noMemory=Գործողությունն ավարտելու համար բավարար հիշողություն չկա։\n\nՓակեք որոշ ծրագրեր և կրկին փորձեք։
 title=%S-ի ներբեռնում
 fileAlreadyExistsError=%S-ն անհնար էր պահպանել, քանզի մի ֆայլ արդեն իսկ առկա է նույն անվամբ ինչպես «_files» պանակը:\n\nՓորձեք մեկ այլ տեղ պահել:
-fileNameTooLongError=%S-ն անհնար էր պահպանել, քանզի ֆայլի անունը շատ երկար էր:\n\nՓորձեք ավելի կարճ անվամբ պահել:
+fileNameTooLongError=%S-ն անհնար էր պահպանել, քանզի ֆայլի անունը շատ երկար էր։\n\nՓորձեք ավելի կարճ անվամբ պահել։
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties
index 22159c5a546f..42a1b2ffa71d 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/printing.properties
@@ -4,7 +4,7 @@
 
 # Page number formatting
 ## @page_number The current page number
-#LOCALIZATION NOTE (pageofpages): Do not translate %ld in the following line.
+#LOCALIZATION NOTE (pagenumber): Do not translate %ld in the following line.
 # Place the word %ld where the page number and number of pages should be
 # The first %ld will receive the the page number
 pagenumber=%1$d
@@ -18,11 +18,12 @@ pagenumber=%1$d
 # the second %ld will receive the total number of pages
 pageofpages=%2$d-ը %1$d-ից
 
-noprinter=Որևէ տպիչ առկա չէ:
-PrintToFile=Տպել ֆայլում
+noprinter=Որևէ տպիչ առկա չէ։
+
+PrintToFile=Տպել նիշքում
 noPrintFilename.title=Ֆայլի անունն առկա չէ
-noPrintFilename.alert=Դուք ընտրել եք "Տպել ֆայլում" և ֆայլի անունը դատարկ է:
-fileConfirm.exists=%S- ն արդեն իսկ առկա է\nՑանկանու՞մ եք այն փոխարինել:
+noPrintFilename.alert=Դուք ընտրել եք "Տպել նիշքում" և նիշքի անունը դատարկ է։
+fileConfirm.exists=%S- ն արդեն իսկ առկա է\nՑանկանու՞մ եք այն փոխարինել։
 print_error_dialog_title=Տպիչի սխալ
 printpreview_error_dialog_title=Տպելու նախադիտման սխալ
 
@@ -41,20 +42,20 @@ printpreview_error_dialog_title=Տպելու նախադիտման սխալ
 # printing, and PERR_FAILURE_PP will be used under the same conditions
 # when print previewing.
 #
-PERR_FAILURE=Սխալ է տեղի ունեցել տպելիս:
+PERR_FAILURE=Սխալ է տեղի ունեցել տպելիս։
 
-PERR_ABORT=Տպելը դադարեցվեց կամ չեղարկվեց:
-PERR_NOT_AVAILABLE=Տպիչի որոշ գործառույթներ հասանելի չեն:
-PERR_NOT_IMPLEMENTED=Տպելու որոշ գործառույթներ դեռ իրագործված չեն:
-PERR_OUT_OF_MEMORY=Հիշողությունը քիչ է:
-PERR_UNEXPECTED=Սխալ՝ նախադիտման ժամանակ:
+PERR_ABORT=Տպելը դադարեցվեց կամ չեղարկվեց։
+PERR_NOT_AVAILABLE=Տպիչի որոշ գործառույթներ հասանելի չեն։
+PERR_NOT_IMPLEMENTED=Տպելու որոշ գործառույթներ դեռ իրագործված չեն։
+PERR_OUT_OF_MEMORY=Տպելու համար չկա բավարար ազատ հիշողություն:
+PERR_UNEXPECTED=Տպելիս անսպասելի խնդիր է առաջացել։
 
-PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE=Որևէ տպիչ առկա չէ:
-PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE_PP=Տպիչներ չկան, հնարավոր չէ նախադիտել:
-PERR_GFX_PRINTER_NAME_NOT_FOUND=Ընտրված տպիչը չի գտնվել:
-PERR_GFX_PRINTER_COULD_NOT_OPEN_FILE=ՀՆարավոր չեղավ բացել արտածվող ֆայլը՝ այն տպելու համար:
+PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE=Որևէ տպիչ առկա չէ։
+PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE_PP=Տպիչներ չկան, հնարավոր չէ նախադիտել։
+PERR_GFX_PRINTER_NAME_NOT_FOUND=Ընտրված տպիչը չի գտնվել։
+PERR_GFX_PRINTER_COULD_NOT_OPEN_FILE=Հնարավոր չեղավ բացել արտածվող ֆայլը՝ այն տպելու համար։
 PERR_GFX_PRINTER_STARTDOC=Տպելը ձախողվեց՝ դեռ չսկսված:
-PERR_GFX_PRINTER_ENDDOC=Տպելը ձախողվեց տպելու ընթացքում:
-PERR_GFX_PRINTER_STARTPAGE=Տպելը ձախողվեց՝ նոր էջ բացելիս:
-PERR_GFX_PRINTER_DOC_IS_BUSY=Այս փաստաթուղթը դեռ չի բացվել, ուստի հնարավոր չէ այն տպել:
-PERR_GFX_PRINTER_DOC_IS_BUSY_PP=Այս փաստաթուղթը դեռ չի բացվել, ուստի հնարավոր չէ դրա նախադիտումը:
+PERR_GFX_PRINTER_ENDDOC=Տպելը ձախողվեց տպելու ընթացքում։
+PERR_GFX_PRINTER_STARTPAGE=Տպելը ձախողվեց՝ նոր էջ բացելիս։
+PERR_GFX_PRINTER_DOC_IS_BUSY=Այս փաստաթուղթը դեռ հնարավոր չէ տպել, քանի որ այն դեռ բեռնվում է։
+PERR_GFX_PRINTER_DOC_IS_BUSY_PP=Այս փաստաթուղթը դեռ չի բացվել, ուստի հնարավոր չէ դրա նախադիտումը։
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties
index 6bbfed68602c..239925b9a8ef 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/caps.properties
@@ -1,16 +1,16 @@
 # 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/.
-CheckLoadURIError = Անվտանգության բացառում: %S-­ի պարունակությունը իրավասու չէ բեռնավորել հղում %S­-ում:
-CheckSameOriginError = Անվտանգության բացառում: %S­ի պարունակությունն իրավասու չէ %S­ից տվյալներ բեռնավորել:
-ExternalDataError = Անվտանգության սխալ. %S-ի բովանդակությունը փորձում է բեռնել %S-ը, բայց չի կարող բեռնել արտաքին տվյալ, երբ օգտագործվում է որպես պատկեր:\u0020
+CheckLoadURIError = Անվտանգության բացառում։ %S-­ի պարունակությունը իրավասու չէ բեռնավորել հղում %S­-ում։
+CheckSameOriginError = Անվտանգության բացառում: %S­ի պարունակությունն իրավասու չէ %S­ից տվյալներ բեռնավորել։
+ExternalDataError = Անվտանգության սխալ. %S-ի բովանդակությունը փորձում է բեռնել %S-ը, բայց չի կարող բեռնել արտաքին տվյալ, երբ օգտագործվում է որպես պատկեր։
 
 # LOCALIZATION NOTE (GetPropertyDeniedOrigins):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
 # %3$S is the property of that object that access was denied for.
 # %4$S is the origin of the object access was denied to.
-GetPropertyDeniedOrigins = <%1$S>-ին թույլտրված չէ <%4$S>-ից վերցնել %2$S.%3$S տվյալներ:
+GetPropertyDeniedOrigins = <%1$S>-ին թույլտրված չէ <%4$S>-ից վերցնել %2$S.%3$S տվյալներ։
 # LOCALIZATION NOTE (GetPropertyDeniedOriginsSubjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -18,7 +18,7 @@ GetPropertyDeniedOrigins = <%1$S>-ին թույլտրված չէ <%4$S>-ից վ
 # %4$S is the origin of the object access was denied to.
 # %5$S is the value of document.domain for the script which was denied access;
 #      don't translate "document.domain".
-GetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն %2$S.%3$S -ի <%4$S> (document.domain չի նշանակվել)  կարգավորումները ստանալու:
+GetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն %2$S.%3$S -ի <%4$S> (document.domain չի նշանակվել)  կարգավորումները ստանալու։
 # LOCALIZATION NOTE (GetPropertyDeniedOriginsObjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -26,7 +26,7 @@ GetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չո
 # %4$S is the origin of the object access was denied to.
 # %5$S is the value of document.domain for the object being accessed;
 #      don't translate "document.domain".
-GetPropertyDeniedOriginsObjectDomain = <%1$S>-ը չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ի %2$S.%3$S հատկանիշը վերցնելու (document.domain դեռ տեղադրված չէ):
+GetPropertyDeniedOriginsObjectDomain = <%1$S>-ը չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ի %2$S.%3$S հատկանիշը վերցնելու (document.domain դեռ տեղադրված չէ)։
 # LOCALIZATION NOTE (GetPropertyDeniedOriginsSubjectDomainObjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -36,14 +36,14 @@ GetPropertyDeniedOriginsObjectDomain = <%1$S>-ը չունի արտոնությո
 #      don't translate "document.domain"
 # %6$S is the value of document.domain for the object being accessed;
 #      don't translate "document.domain".
-GetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> (document.domain=<%6$S>)-ի %2$S.%3$S հատկանիշը վերցնելու արտոնություն:
+GetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> (document.domain=<%6$S>)-ի %2$S.%3$S հատկանիշը վերցնելու արտոնություն։
 
 # LOCALIZATION NOTE (SetPropertyDeniedOrigins):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
 # %3$S is the property of that object that access was denied for.
 # %4$S is the origin of the object access was denied to.
-SetPropertyDeniedOrigins = <%1$S>-ին արգելված է <%4$S>-ի վրա դնել %2$S.%3$S կարգավորումներ:
+SetPropertyDeniedOrigins = <%1$S>-ին արգելված է <%4$S>-ի վրա դնել %2$S.%3$S կարգավորումներ։
 # LOCALIZATION NOTE (SetPropertyDeniedOriginsSubjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -51,7 +51,7 @@ SetPropertyDeniedOrigins = <%1$S>-ին արգելված է <%4$S>-ի վրա դն
 # %4$S is the origin of the object access was denied to.
 # %5$S is the value of document.domain for the script which was denied access;
 #      don't translate "document.domain".
-SetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S>-ի (document.domain has not been set) %2$S.%3$S հատկանիշը փոփոխելու արտոնություն:
+SetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S>-ի (document.domain has not been set) %2$S.%3$S հատկանիշը փոփոխելու արտոնություն։
 # LOCALIZATION NOTE (SetPropertyDeniedOriginsObjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -59,7 +59,7 @@ SetPropertyDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չո
 # %4$S is the origin of the object access was denied to.
 # %5$S is the value of document.domain for the object being accessed;
 #      don't translate "document.domain".
-SetPropertyDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ում %2$S.%3$S նախընտրանք դնելու:
+SetPropertyDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>)-ում %2$S.%3$S նախընտրանք դնելու։
 # LOCALIZATION NOTE (SetPropertyDeniedOriginsSubjectDomainObjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -69,14 +69,14 @@ SetPropertyDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been s
 #      don't translate "document.domain"
 # %6$S is the value of document.domain for the object being accessed;
 #      don't translate "document.domain".
-SetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն <%4$S>-ում (document.domain=<%6$S>) %2$S.%3$S կարգավորումներ կատարելու:
+SetPropertyDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի թույլտվություն <%4$S>-ում (document.domain=<%6$S>) %2$S.%3$S կարգավորումներ կատարելու։
 
 # LOCALIZATION NOTE (CallMethodDeniedOrigins):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
 # %3$S is the method of that object that access was denied for.
 # %4$S is the origin of the object access was denied to.
-CallMethodDeniedOrigins = <%1$S>-ը չունի թույլտվություն օգտագործել %2$S.%3$S մեթոդ <%4$S>-ում:
+CallMethodDeniedOrigins = <%1$S>-ը չունի թույլտվություն օգտագործել %2$S.%3$S մեթոդ <%4$S>-ում։
 # LOCALIZATION NOTE (CallMethodDeniedOriginsSubjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -84,7 +84,7 @@ CallMethodDeniedOrigins = <%1$S>-ը չունի թույլտվություն օգ
 # %4$S is the origin of the object access was denied to.
 # %5$S is the value of document.domain for the script which was denied access;
 #      don't translate "document.domain".
-CallMethodDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու արտոնություն (document.domain-ը դեռ տեղադրված չէ):
+CallMethodDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չունի <%4$S> -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու արտոնություն (document.domain-ը դեռ տեղադրված չէ)։
 # LOCALIZATION NOTE (CallMethodDeniedOriginsObjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -92,7 +92,7 @@ CallMethodDeniedOriginsSubjectDomain = <%1$S> (document.domain=<%5$S>)-ը չու
 # %4$S is the origin of the object access was denied to.
 # %5$S is the value of document.domain for the object being accessed;
 #      don't translate "document.domain".
-CallMethodDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու:
+CallMethodDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been set) չունի արտոնություն <%4$S> (document.domain=<%5$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կիրառելու։
 # LOCALIZATION NOTE (CallMethodDeniedOriginsSubjectDomainObjectDomain):
 # %1$S is the origin of the script which was denied access.
 # %2$S is the type of object it was.
@@ -102,11 +102,12 @@ CallMethodDeniedOriginsObjectDomain = <%1$S>-ը (document.domain has not been se
 #      don't translate "document.domain"
 # %6$S is the value of document.domain for the object being accessed;
 #      don't translate "document.domain".
-CallMethodDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>) -ը չունի թույլտվություն <%4$S> (document.domain=<%6$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կանչելու:
+CallMethodDeniedOriginsSubjectDomainObjectDomain = <%1$S> (document.domain=<%5$S>) -ը չունի թույլտվություն <%4$S> (document.domain=<%6$S>) -ի նկատմամբ %2$S.%3$S մեթոդ կանչելու։
 
-GetPropertyDeniedOriginsOnlySubject = <%S>-ը չունի %S.%S-ից կարգավորումներ վերցնելու թույլտվություն:
+GetPropertyDeniedOriginsOnlySubject = <%S>-ը չունի %S.%S-ից կարգավորումներ վերցնելու թույլտվություն։
 SetPropertyDeniedOriginsOnlySubject = <%S>-ը չունի իրավունք կատարելու %S.%S կարգավորումներ
 CallMethodDeniedOriginsOnlySubject = <%S>-ը չունի %S.%S մեթոդ օգտագործելու իրավունք
+
 CreateWrapperDenied = %S դասի Օբյեկտի համար շապիկի ստեղծումը մերժվեց
 CreateWrapperDeniedForOrigin = Թույլտվությունը մերժվում է <%2$S> համար ստեղծելով փաթեթ %1$S դասի օբյեկտի համար
-ProtocolFlagError = Զգուշացում՝ Արձանագրության ղեկավարը '%S' համար չի գովազդում անվտանգության կանոնակարգ: Չնայած այս պահին թույլատրվում է բեռնել նման հաղորդակարգեր, սակայն խորհուրդ չի տրվում: Խնդում ենք նայել փաստաթղթերը nsIProtocolHandler.idl-ում:
+ProtocolFlagError = Զգուշացում՝ Արձանագրության ղեկավարը '%S' համար չի գովազդում անվտանգության կանոնակարգ։ Չնայած այս պահին թույլատրվում է բեռնել նման հաղորդակարգեր, սակայն խորհուրդ չի տրվում։ Խնդում ենք նայել փաստաթղթերը nsIProtocolHandler.idl-ում։
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties
index 2325d7a5fe7d..02e44b5e766c 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/csp.properties
@@ -9,23 +9,23 @@ CSPViolation = Էջի կարգավորումները արգելափակել են
 # LOCALIZATION NOTE (CSPViolationWithURI):
 # %1$S is the directive that has been violated.
 # %2$S is the URI of the resource which violated the directive.
-CSPViolationWithURI = Էջի կարգավորումները արգելափակել են ռեսուրսի բեռնումը %2$S ("%1$S"):
+CSPViolationWithURI = Էջի կարգավորումները արգելափակել են ռեսուրսի բեռնումը %2$S («%1$S»)։
 # LOCALIZATION NOTE (CSPROViolation):
 # %1$S is the reason why the resource has not been loaded.
-CSPROViolation = Խախտում է տեղի ունեցել միայն զեկույցի CSP դրույթում (“%1$S”): Վարքը թույլատրելի էր և CSP զեկույցը ուղարկվել է:
+CSPROViolation = Խախտում է տեղի ունեցել միայն զեկույցի CSP դրույթում («%1$S»)։ Վարքը թույլատրելի էր և CSP զեկույցը ուղարկվել է։
 # LOCALIZATION NOTE (CSPROViolationWithURI):
 # %1$S is the directive that has been violated.
 # %2$S is the URI of the resource which violated the directive.
-CSPROViolationWithURI = Էջի կարգավորումները դիտարկում են ռեսուրսի բեռնում %2$S (“%1$S”)-ում: CSP զեկույցը ուղարկվել է:
+CSPROViolationWithURI = Էջի կարգավորումները դիտարկում են ռեսուրսի բեռնում %2$S («%1$S»)-ում։ CSP զեկույցը ուղարկվել է։
 # LOCALIZATION NOTE (triedToSendReport):
 # %1$S is the URI we attempted to send a report to.
-triedToSendReport = Անվավեր URI-ին զեկույց ուղարկելու փորձ."%1$S"
+triedToSendReport = Անվավեր URI-ին զեկույց ուղարկելու փորձ.«%1$S»
 # LOCALIZATION NOTE (couldNotParseReportURI):
 # %1$S is the report URI that could not be parsed
-couldNotParseReportURI = Անհնար է  վերլուծել URI զեկույցը.%1$S
+couldNotParseReportURI = Անհնար է վերլուծել URI զեկույցը. %1$S
 # LOCALIZATION NOTE (couldNotProcessUnknownDirective):
 # %1$S is the unknown directive
-couldNotProcessUnknownDirective = \u0020'%1$S' անհայտ հրահանգը անհնար է մշակել
+couldNotProcessUnknownDirective = '%1$S' անհայտ հրահանգը անհնար է մշակել
 # LOCALIZATION NOTE (ignoringUnknownOption):
 # %1$S is the option that could not be understood
 ignoringUnknownOption = %1$S անհայտ ընտրանքի անտեսում
@@ -34,37 +34,37 @@ ignoringUnknownOption = %1$S անհայտ ընտրանքի անտեսում
 ignoringDuplicateSrc = Կրկնվող աղբյուրի անտեսում %1$S
 # LOCALIZATION NOTE (ignoringSrcFromMetaCSP):
 # %1$S defines the ignored src
-ignoringSrcFromMetaCSP = ‘%1$S’ աղբյուրի անտեսում (չի աջակցվում, երբ առաքված է մետա տարի միջոցով):
+ignoringSrcFromMetaCSP = ‘%1$S’ աղբյուրի անտեսում (չի աջակցվում, երբ առաքված է մետա տարի միջոցով)։
 # LOCALIZATION NOTE (ignoringSrcWithinScriptStyleSrc):
 # %1$S is the ignored src
 # script-src and style-src are directive names and should not be localized
-ignoringSrcWithinScriptStyleSrc = “%1$S”-ի անտեսում, երբ հատկորոշված են script-src style-src:nonce-source կամ hash-source
+ignoringSrcWithinScriptStyleSrc = «%1$S»-ի անտեսում, երբ հատկորոշված են script-src style-src:nonce-source կամ hash-source
 # LOCALIZATION NOTE (ignoringSrcForStrictDynamic):
 # %1$S is the ignored src
 # script-src, as well as 'strict-dynamic' should not be localized
-ignoringSrcForStrictDynamic = Անտեսել “%1$S” հետևյալ script-src: ‘strict-dynamic’-ը հատկորոշվեց
+ignoringSrcForStrictDynamic = Անտեսել «%1$S» հետևյալ script-src: ‘strict-dynamic’-ը հատկորոշվեց
 # LOCALIZATION NOTE (ignoringStrictDynamic):
 # %1$S is the ignored src
-ignoringStrictDynamic = Անտեսել “%1$S”-ի աղբյուրը (Միայն աջակցված հետևյալ script-src)։ 
+ignoringStrictDynamic = Անտեսել «%1$S»-ի աղբյուրը (Միայն աջակցված հետևյալ script-src)։
 # LOCALIZATION NOTE (strictDynamicButNoHashOrNonce):
 # %1$S is the csp directive that contains 'strict-dynamic'
 # 'strict-dynamic' should not be localized
-strictDynamicButNoHashOrNonce = Բանալի բառը ‘strict-dynamic’ հետևյալ “%1$S” ոչ վավեր nonce-ի հետ կամ hash-ը կարող է բեռնումից արգելափակել բոլոր գրվածքները
+strictDynamicButNoHashOrNonce = Բանալի բառը ‘strict-dynamic’ հետևյալ «%1$S» ոչ վավեր nonce-ի հետ կամ hash-ը կարող է բեռնումից արգելափակել բոլոր գրվածքները
 # LOCALIZATION NOTE (reportURInotHttpsOrHttp2):
 # %1$S is the ETLD of the report URI that is not HTTP or HTTPS
-reportURInotHttpsOrHttp2 = Զեկույցի URI (%1$S)-ին պետք է լինի HTTP կամ HTTPS URI:
+reportURInotHttpsOrHttp2 = Զեկույցի URI (%1$S)-ին պետք է լինի HTTP կամ HTTPS URI։
 # LOCALIZATION NOTE (reportURInotInReportOnlyHeader):
 # %1$S is the ETLD of the page with the policy
-reportURInotInReportOnlyHeader = Այս կասքը (%1$S) ունի Report-Only քաղաքականություն առանց URI զեկույցի։ CSP-ը չի արգելափակի և չի կարող զեկուցել այս քաղաքականության խախտումները։
+reportURInotInReportOnlyHeader = Այս կայքը (%1$S) ունի Report-Only քաղաքականություն առանց URI զեկույցի։ CSP-ը չի արգելափակի և չի կարող զեկուցել այս քաղաքականության խախտումները։
 # LOCALIZATION NOTE (failedToParseUnrecognizedSource):
 # %1$S is the CSP Source that could not be parsed
-failedToParseUnrecognizedSource = Հնարավոր չեղավ վերլուծել չճանաչված %1$S աղբյուրը\u0020
+failedToParseUnrecognizedSource = Հնարավոր չեղավ վերլուծել չճանաչված %1$S աղբյուրը։
 # LOCALIZATION NOTE (inlineScriptBlocked):
 # inline script refers to JavaScript code that is embedded into the HTML document.
 inlineScriptBlocked = Ներգծված գրվածքի կատարումը արգելափակված է
 # LOCALIZATION NOTE (inlineStyleBlocked):
 # inline style refers to CSS code that is embedded into the HTML document.
-inlineStyleBlocked = Ներգծված ոճի թերթի կիառումը արգելափակված է
+inlineStyleBlocked = Ներգծված ոճի թերթի կիրառումը արգելափակված է
 # LOCALIZATION NOTE (scriptFromStringBlocked):
 # eval is a name and should not be localized.
 scriptFromStringBlocked = JavaScript-ի կանչը տողից արգելափակված է
@@ -72,36 +72,34 @@ scriptFromStringBlocked = JavaScript-ի կանչը տողից արգելափակ
 # %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 upgradeInsecureRequest = ‘%1$S’ ոչ անվտանգ հարցման արդիացում ‘%2$S’-ի
 # LOCALIZATION NOTE (ignoreSrcForDirective):
-ignoreSrcForDirective = Անտեսեք srcs-ը ‘%1$S’ հրահանգի համար:
+ignoreSrcForDirective = Անտեսեք srcs-ը ‘%1$S’ հրահանգի համար։
 # LOCALIZATION NOTE (hostNameMightBeKeyword):
 # %1$S is the hostname in question and %2$S is the keyword
 hostNameMightBeKeyword = %1$S-ը ներկայացնում է որպես խնամորդի անուն, այլ ոչ թե բանալի բառ։ Եթե դուք ցանկանում եք, որ սա լինի բանալի բառ, օգտագործեք ‘%2$S’ (տեղավորված մեկ չակերտում)։
 # LOCALIZATION NOTE (notSupportingDirective):
 # directive is not supported (e.g. 'reflected-xss')
-notSupportingDirective = ‘%1$S’ հրահանգը չի ապահովվում: Հրահանգը և արժեքները անտեսվելու են:
+notSupportingDirective = ‘%1$S’ հրահանգը չի ապահովվում։ Հրահանգը և արժեքները անտեսվելու են։
 # LOCALIZATION NOTE (blockAllMixedContent):
 # %1$S is the URL of the blocked resource load.
-blockAllMixedContent = ‘%1$S’ ոչ անվտանգ հարցման արգելափակում:
+blockAllMixedContent = ‘%1$S’ ոչ անվտանգ հարցման արգելափակում։
 # LOCALIZATION NOTE (ignoringDirectiveWithNoValues):
 # %1$S is the name of a CSP directive that requires additional values 
 ignoringDirectiveWithNoValues = ‘%1$S’-ի անտեսում, քանի որ այն չի պարունակում որևէ ցուցիչ:
 # LOCALIZATION NOTE (ignoringReportOnlyDirective):
 # %1$S is the directive that is ignored in report-only mode.
-ignoringReportOnlyDirective = Անտեսեք ավազատուփի հրահանգը ‘%1$S’ միակ զեկույցի քաղաքականության մեջ:
+ignoringReportOnlyDirective = Անտեսեք ավազատուփի հրահանգը ‘%1$S’ միակ զեկույցի քաղաքականության մեջ։
 # LOCALIZATION NOTE (deprecatedReferrerDirective):
 # %1$S is the value of the deprecated Referrer Directive.
-deprecatedReferrerDirective = Referrer ‘%1$S’ հրահանգը արժեզրկվում է: Փոխարենը օգտագործեք Referrer- ի քաղաքականության վերնագիրը:
+deprecatedReferrerDirective = Referrer ‘%1$S’ հրահանգը արժեզրկվում է։ Փոխարենը օգտագործեք Referrer- ի քաղաքականության վերնագիրը։
 # LOCALIZATION NOTE (IgnoringSrcBecauseOfDirective):
 # %1$S is the name of the src that is ignored.
 # %2$S is the name of the directive that causes the src to be ignored.
-IgnoringSrcBecauseOfDirective=Անտեսեք ‘%1$S’ - ը ‘%2$S’ հրահանգի պատճառով:
-
+IgnoringSrcBecauseOfDirective=Անտեսեք ‘%1$S’ - ը ‘%2$S’ հրահանգի պատճառով։
 
 # LOCALIZATION NOTE (IgnoringSourceWithinDirective):
 # %1$S is the ignored src
 # %2$S is the directive  which supports src
-IgnoringSourceWithinDirective = Անտեսեք “%1$S” աղբյուրը (Not supported within ‘%2$S’):
-
+IgnoringSourceWithinDirective = Անտեսեք “%1$S” աղբյուրը (Not supported within ‘%2$S’)։
  
 # CSP Errors:
 # LOCALIZATION NOTE (couldntParseInvalidSource):
@@ -115,10 +113,10 @@ couldntParseInvalidHost = Չհաջողվեց վերլուծել անվավեր %
 couldntParseScheme = %1$S-ում չհաջողվեց վերլուծել սխեման
 # LOCALIZATION NOTE (couldntParsePort):
 # %1$S is the string source
-couldntParsePort = \u0020                 Չհաջողվեց վերլուծել միացքը %1$S-ում               \u0020
+couldntParsePort = Չհաջողվեց վերլուծել միացքը %1$S-ում
 # LOCALIZATION NOTE (duplicateDirective):
 # %1$S is the name of the duplicate directive
-duplicateDirective = Հայտնաբերվել է կրկնօրինակվող %1$S հրահանգներ:Բացի առաջինից բոլոր նմուշները  կմերժվեն:
+duplicateDirective = Հայտնաբերվել է կրկնօրինակվող %1$S հրահանգներ։ Բացի առաջինից բոլոր նմուշները կմերժվեն։
 # LOCALIZATION NOTE (deprecatedChildSrcDirective):
 # %1$S is the value of the deprecated directive.
 # Do not localize: worker-src, frame-src
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties
index 86f763dc246c..42fc7c11dfc3 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/security/security.properties
@@ -21,10 +21,12 @@ CORSNotSupportingCredentials=Cross-Origin հարցումը արգելափակվ
 CORSMethodNotFound=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ չի կարողացել գտնել մեթոդ CORS-ի ‘Access-Control-Allow-Methods’ էջագլխում):
 CORSMissingAllowCredentials=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ակնկալվել է ‘true’ CORS-ի ‘Access-Control-Allow-Credentials’-ում):
 CORSPreflightDidNotSucceed=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ CORS-ի preflight ալիքը հաջող չէր):
+CORSPreflightDidNotSucceed2=Խաչաձև ծագման հարցում արգելափակված է. Նույն ծագման քաղաքականությունը թույլ է տալիս կարդալ հեռավոր ռեսուրսը %1$S֊ով։ (Պատճառը. CORS- ի նախնական թռիչքային պատասխանը չհաջողվեց)։
 CORSInvalidAllowMethod=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ‘%2$S’ անվավեր թոքեն CORS-ի ‘Access-Control-Allow-Methods’ էջագլխում):
 CORSInvalidAllowHeader=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ‘%2$S’ անվավեր թոքեն CORS-ի ‘Access-Control-Allow-Headers’ էջագլխում):
 CORSMissingAllowHeaderFromPreflight=Cross-Origin հարցումը արգելափակված է. միևնույն Origin Policy-ին չի թույլատրում հեռակա ռեսուրսի ընթերցում %1$S-ում: (Պատճառը՝ ‘%2$S’ բացակայող թոքեն CORS-ի ‘Access-Control-Allow-Headers’ էջագլխում):
 
+CORSMissingAllowHeaderFromPreflight2=Խաչաձև ծագման հարցում արգելափակված է. Նույն ծագման քաղաքականությունը թույլ է տալիս կարդալ հեռավոր ռեսուրսը %1$S֊ով։ (Պատճառը. Վերնագիր «%2$S»֊ը չի թույլատրվում ըստ վերնագրի «Մուտքի հսկողություն-թույլատրել-վերնագրերը» CORS-ի նախնական թռիչքային պատասխանից)։
 
 # LOCALIZATION NOTE: Do not translate "Strict-Transport-Security", "HSTS", "max-age" or "includeSubDomains"
 STSUnknownError=Խիստ փոխանցման֊անվտանգություն․Անհայտ սխալ է տեղի ունեցել կայքի կողմից նշված վերնագրի մշակման ժամանակ։
@@ -132,7 +134,6 @@ FeaturePolicyInvalidEmptyAllowValue= Յուրահատկությանքաղաքա
 # TODO: would be nice to add a link to the Feature-Policy MDN documentation here. See bug 1449501
 FeaturePolicyInvalidAllowValue=Կորպորատիվ քաղաքականություն: Բաց թողեք արգելված արժեքը “%S”
 
-
 # LOCALIZATION NOTE: "%1$S" is the limitation length (bytes) of referrer URI, "%2$S" is the origin of the referrer URI.
 ReferrerLengthOverLimitation=Հղում կատարող HTTP վերնագիր: Վերնագրի երկարությունը գերազանցում է “%1$S” բայթերի սահմանը. Ուղղորդեք վերնագրողի ծագման ծագումը. “%2$S”
 # LOCALIZATION NOTE: "%1$S" is the limitation length (bytes) of referrer URI, "%2$S" is the origin of the referrer URI.
@@ -146,12 +147,16 @@ XFODeny = Բեռնումը X-Frame-Options:-ի կողմից մերժված է 
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Բեռնումը մերժված է X-Frame-Options:-ի կողմից“%1$S” “%2$S”-ից, կայքը չի թույլատրում cross-origin framing %3$S%3$S”-ից:
 
-CORSPreflightDidNotSucceed2=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS preflight response did not succeed).
-CORSMissingAllowHeaderFromPreflight2=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: header ‘%2$S’ is not allowed according to header ‘Access-Control-Allow-Headers’ from CORS preflight response).
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = «%2$S» բեռնում տեղադրելու ժամանակ հայտնաբերվեց անվավեր X- շրջանակի ընտրանքների վերնագիր. «%1$S»-ը վավեր հրահանգ չէ։
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Շրջանակներում «%2$S»-ի բեռնումը մերժվում է «X-Frame-Options» հրահանգով, որը սահմանվում է «%1$S»։
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
-HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”.
+HTTPSOnlyUpgradeRequest = «%1$S» ոչ անվտանգ հարցման արդիացում «%2$S»-ի։
 # LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt.
+HTTPSOnlyNoUpgradeException = Անվտանգության խնդրանքը «%1$S» չի թարմացնում, քանի որ այն ազատված է։
 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code.
-HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S)
+HTTPSOnlyFailedRequest = «%1$S» անապահով հարցման արդիականացումը ձախողվեց։ (%2$S)
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties
index 544d23fa7f9e..65c8b9219332 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/svg/svg.properties
@@ -2,4 +2,4 @@
 # 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/.
 
-AttributeParseWarning=%1$S-ի անալիզի ժամանակ անկանխատեսելի %2$S անժեք:
+AttributeParseWarning=%1$S-ի անալիզի ժամանակ անկանխատեսելի %2$S արժեք։
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd
index fe43a6fef538..9c7b0733d783 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xml/prettyprint.dtd
@@ -2,4 +2,4 @@
    - 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/. -->
 
-<!ENTITY xml.nostylesheet "Այս XML ֆայլը չունի իր հետ կապված որևէ ոճական տեղեկություն: Փաստաթղթի ծառը բերված է ստորև:">
+<!ENTITY xml.nostylesheet "Այս XML նիշքը չունի իր հետ կապված որևէ ոճական տեղեկություն։ Փաստաթղթի ծառը բերված է ստորև։">
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties
index 5af433426e99..77cadf0229f1 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/global/xslt/xslt.properties
@@ -2,38 +2,38 @@
 # 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/.
 
-1  = XSLT ձևաթերթի վերլուծությանը խափանվեց:
-2  = XPath արտահայտության վերլուծությունը խափանվեց:
+1  = XSLT ձևաթերթի վերլուծութիւնը խափանվեց։
+2  = XPath արտահայտության վերլուծությունը խափանվեց։
 3  = 
-4  = XSLT-փոխակերպումը խափանվեց:
-5  = Անվավեր XSLT/XPath-գործառույթ:
-6  = XSLT ձևաթերթը (հավանաբար) պարունակում է ինքնականչ:
+4  = XSLT-փոխակերպումը խափանվեց։
+5  = Անվավեր XSLT/XPath-գործառույթ։
+6  = XSLT ձևաթերթը (հավանաբար) պարունակում է ինքնականչ։
 7  = XSLT 1.0­ի համար հատկանիշի արժեքն անվավեր է:
-8  = XPath­արտահատությունը պիտի վերադարձներ հանգուցախումբ:
-9  = XSLT փոխակերպումն ընդհատվեց <xsl:message>­ի միջոցով:
-10 = XSLT-ձևաթերթի բեռնավորման ընթացքում ցանցային սխալմունք պատահեց:
-11 = XSLT ձևաթերթը չունի XML-MIME տեսակ:
+8  = XPath­ արտահայտությունը պիտի վերադարձներ NodeSet։
+9  = XSLT փոխակերպումն ընդհատվեց <xsl:message>­ի միջոցով։
+10 = XSLT-ձևաթերթի բեռնավորման ընթացքում ցանցային սխալմունք պատահեց։
+11 = XSLT ձևաթերթը չունի XML տեսակ:
 12 = XSLT-ձևաթերթն ուղղակիորեն թե անուղղակիորեն ներմուծում կամ ներգրավում է ինքն իրեն:
-13 = XPath-գործառույթը կոչվել է սխալ քանակի մուտքային տվյալներով:
-14 = Անհայտ XPath-ընդլանված գործառույթ է կոչվել:
-15 = XPath-վերլուծության սխալմունք՝. ')' սպասվում էր՝.
-16 = XPath-վերլուծության սխալմունք՝. անվավեր առանցք՝.
-17 = XPath-վերլուծության սխալմունք՝. Սպասվում էր ավանում կամ հանգուցատիպի ստուգում՝.
-18 = XPath-վերլուծության սխալմունք՝. ']' սպասվում էր՝.
-19 = XPath-վերլուծության սխալմունք՝. անվավեր փոփոխականի անվանում՝.
-20 = XPath-վերլուծության սխալմունք՝. արտահայտության անսպասելի ավարտ՝.
-21 = XPath-վերլուծության սխալմունք՝. սպասվում էր օպերատոր՝.
-22 = նք՝. չփակված տառաշար՝.
-23 = XPath-վերլուծության սխալմունք՝. ':'­ն անսպասելի էր՝.
-24 = XPath-վերլուծության սխալմունք՝. '!'-անսպասելի էր բացառումը not() է:
+13 = XPath-գործառույթը կոչվել է սխալ քանակի մուտքային տվյալներով։
+14 = Անհայտ XPath-ընդլայնված գործառույթ է կոչվել։
+15 = XPath-վերլուծության սխալմունք. ')' սպասվում էր.
+16 = XPath-վերլուծության սխալմունք․ անվավեր առանցք․
+17 = XPath-վերլուծության սխալմունք. Սպասվում էր ավանում կամ հանգուցատիպի ստուգում․
+18 = XPath-վերլուծության սխալմունք. ']' սպասվում էր.
+19 = XPath-վերլուծության սխալմունք. անվավեր փոփոխականի անվանում.
+20 = XPath-վերլուծության սխալմունք. արտահայտության անսպասելի ավարտ.
+21 = XPath-վերլուծության սխալմունք. սպասվում էր օպերատոր.
+22 = XPath֊վերլուծության սխալմունք. չփակված տառաշար.
+23 = XPath-վերլուծության սխալմունք. ':'­֊ն անսպասելի էր.
+24 = XPath-վերլուծության սխալմունք. '!'-ն անսպասելի էր բացառումը not() է․
 25 = XPath-վերլուծության սխալմունք՝. անվավեր տառանիշ հանդիպեց՝.
-26 = XPath-վերլուծության սխալմունք՝. սպասվում էր երկուական օպերատոր՝.
-27 = XSLT ձևաթերթի բեռնավորումը արգելվեց անվտանգության պատճառներով՝.
-28 = Սխալ արտահայտության հաշվում:
-29 = Անկայուն ձևավոր փակագիծ:
-30 = Սխալ QName-ով տարրի ստեղծում
-31 = Փոփոխական կապը կանխազգուշացնում է միևնույն ձևաչափի մեջ փոփոխական կապի վերաբերյալ:
-32 = Բանալու կանչի գործառույթը չի աջակցվում:
+26 = XPath-վերլուծության սխալմունք. սպասվում էր երկուական օպերատոր.
+27 = XSLT ձևաթերթի բեռնավորումը արգելվեց անվտանգության պատճառներով.
+28 = Սխալ արտահայտության հաշվում։
+29 = Անկայուն ձևավոր փակագիծ։
+30 = Սխալ QName-ով տարրի ստեղծում։
+31 = Փոփոխական կապը կանխազգուշացնում է միևնույն ձևաչափի մեջ փոփոխական կապի վերաբերյալ։
+32 = Բանալու կանչի գործառույթը չի աջակցվում։
 
-LoadingError = Սխալմունք ձևաթերթի բեռնավորման ընթացքում: %S
-TransformError = Սխալմունք XSLT փոխակերպման ընթացքում՝. %S
+LoadingError = Սխալմունք ձևաթերթի բեռնավորման ընթացքում․ %S
+TransformError = Սխալմունք XSLT փոխակերպման ընթացքում. %S
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties
index 11242cd8857b..71219328f4f6 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/necko/necko.properties
@@ -11,19 +11,19 @@
 3=Որոնում %1$S…
 4=Կապակցված է %1$S-ի հետ…
 5=%1$S -ին Ուղարկվում է հարցում...
-6=Տվյալների փոխանցում %1$S -ից ...
-7=Կապակցում %1$S-ին...
+6=Տվյալների փոխանցում %1$S -ից…
+7=Կապակցում %1$S-ին…
 8=Կարդացվել է %1$S
 9=Գրվել է %1$S
-10=Սպասում է %1$S-ի պատասխանին...
-11=Գտնվել է՝ %1$S-ը...
-12=TLS ձեռքսեղման կատարում %1$S-ի հետ...
+10=Սպասում է %1$S-ի պատասխանին…
+11=Գտնվել է՝ %1$S-ը…
+12=TLS ձեռքսեղման կատարում %1$S-ի հետ…
 13=TLS ձեռքսեղմումը ավարտվել է %1$S-ի հետ…
 
 27=FTP-տռանզակցիայի սկիզբ...
 28=FTP տռանզակցիան ավարտվեց
 
-RepostFormData=Տեղի ունեցավ վերահասցեավորում: Ցանկանու՞մ էք մուտքագրած ձեր տվյալները վերահասցեավորել դեպի նոր հասցե:
+RepostFormData=Տեղի ունեցավ վերահասցեավորում։ Ցանկանու՞մ էք մուտքագրած Ձեր տվյալները վերահասցեավորել դեպի նոր հասցե։
 
 # Directory listing strings
 DirTitle=%1$S -ի ինդեքս
@@ -34,18 +34,18 @@ DirColSize=Չափը
 DirColMTime=Վերջին փոփոխությունը
 DirFileLabel=ֆայլ`
 
-PhishingAuth=Դուք պատրաստվում էք այցելել %1$S կայքը: Այս կայքը կարող է ձեզ խաբել, ձևանալով որպես այլ կայք. Եղեք չափազանց զգույշ:
+PhishingAuth=Դուք պատրաստվում էք այցելել %1$S կայքը։ Այս կայքը կարող է Ձեզ խաբել, ձևանալով որպես այլ կայք. Եղեք չափազանց զգույշ։
 PhishingAuthAccept=Ես դա հասկանում եմ և կլինեմ շատ զգույշ
 
-SuperfluousAuth=Դուք պատրաստվում եք "%1$S" կայքում գրանցվել "%2$S" անվամբ, սակայն կայքը չի պահանջում նույնականացում: Սա կարող է ձեզ խաբելու փորձ լինել:\n\nԱրդյո՞ք "%1$S"-ը այն կայքն է, որը ցանկանում եք այցելել:
-AutomaticAuth=Դուք պատրաստվում էք մուտք գործել «%1$S» կայք «%2$S» մականվամբ:
+SuperfluousAuth=Դուք պատրաստվում եք «%1$S» կայքում գրանցվել «%2$S» անվամբ, սակայն կայքը չի պահանջում նույնականացում։ Սա կարող է Ձեզ խաբելու փորձ լինել։\n\nԱրդյո՞ք «%1$S»-ը այն կայքն է, որը ցանկանում եք այցելել։
+AutomaticAuth=Դուք պատրաստվում էք մուտք գործել «%1$S» կայք «%2$S» անունով:
 
 TrackerUriBlocked=“%1$S” աշխատամիջոցը արգելափակվել է, որովհետև բովանդակության արգելփակումը թույլատրված է։
 UnsafeUriBlocked=Ռեսուրսը “%1$S”-ում արգելափակվել է Գաղտնի դիտարկման կողմից:
 CookieBlockedByPermission=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, հարմարեցված նշոցիկի արտոնության պատճառով։
-CookieBlockedTracker=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև այն եկել է հետևումից և բովանդակության արգելափակումը թույլատրվել է։
-CookieBlockedAll=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք հիշողության հասանելիության բոլոր դիմումները։
-CookieBlockedForeign=“%1$S”-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք բոլոր երրորդ֊կողմի հիշողության հասանելիության դիմումները և բովանդակության արգելափակումը թույլատրվել է։
+CookieBlockedTracker=«%1$S»-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև այն եկել է հետևումից և բովանդակության արգելափակումը թույլատրվել է։
+CookieBlockedAll=«%1$S»-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք հիշողության հասանելիության բոլոր դիմումները։
+CookieBlockedForeign=«%1$S»-ում նշոցիկների կամ հիշողության հասանելիության դիմումը արգելափակվել է, որովհետև մենք արգելափակում ենք բոլոր երրորդ֊կողմի հիշողության հասանելիության դիմումները և բովանդակության արգելափակումը թույլատրվել է։
 
 # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByStorageAccessAPI): %3$S, %2$S and %1$S are URLs.
 CookieAllowedForOriginOnTrackerByStorageAccessAPI=“%3$S”-ի համար տրվել է հիշողության մատչելիություն, “%2$S”-ը “%1$S”-ում բացվել է հետևման կողմից։ 
@@ -57,17 +57,19 @@ CookieAllowedForOriginOnTrackerByHeuristic=“%2$S”֊ի կողմից բացվ
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=“%2$S” որոնիչի համար ավտոմատ կերպով տրամադրվում է պահեստային մուտք՝ “%1$S”։
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
-CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute.
+CookieRejectedNonRequiresSecure=Նշոցիկ «%1$S»-ը մերժվեց, քանի որ այն ունի «sameSite=ոչ» ատրիբուտը, բայց բացակայում է «անվտանգ» հատկանիշը։
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
-CookieRejectedNonRequiresSecureForBeta=Cookie “%1$S” will be soon rejected because it has the “sameSite” attribute set to “none” or an invalid value, without the “secure” attribute. To know more about the “sameSite“ attribute, read %2$S
+CookieRejectedNonRequiresSecureForBeta=Նշոցիկ «%1$S»֊ը շուտով մերժվում է, քանի որ այն ունի «sameSite» հատկանիշը, որը սահմանվում է «ոչ մեկի» կամ անվավեր արժեքի, առանց «ապահով» հատկանիշի։ «SameSite» ատրիբուտի մասին ավելին իմանալու համար կարդացեք %2$S
 # LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax".
-CookieLaxForced=Cookie “%1$S” has “sameSite” policy set to “lax” because it is missing a “sameSite” attribute, and “sameSite=lax” is the default value for this attribute.
+CookieLaxForced=Նշոցիկ «%1$S»֊ը ունի «SameSite» կանոնակարգը, որը սահմանվել է «մեղմ», քանի որ այն բացակայում է «sameSite» հատկանիշին, և «sameSite=մեղմ»֊ը այս հատկանիշի լռելյայն արժեքն է։
 # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none".
-CookieLaxForcedForBeta=Cookie “%1$S” does not have a proper “sameSite” attribute value. Soon, cookies without the “sameSite” attribute or with an invalid value will be treated as “lax”. This means that the cookie will no longer be sent in third-party contexts. If your application depends on this cookie being available in such contexts, please add the “sameSite=none“ attribute to it. To know more about the “sameSite“ attribute, read %2$S
+CookieLaxForcedForBeta=Նշոցիկ «%1$S»֊ը չունի համապատասխան «sameSite» հատկանիշի արժեք։ Շուտով, նշոցիկերը, առանց «sameSite» հատկանիշի կամ անվավեր արժեքի, կդառնան «մեղմ»։ Սա նշանակում է, որ նշոցիկն այլևս չի ուղարկվի երրորդ կողմի ենթատեքստերում։ Եթե Ձեր դիմումը կախված է այն բանից, որ այս նշոցիկն առկա է նման համագրույթերում, խնդրում ենք դրան ավելացրեք «sameSite=ոչ» ատրիբուտը։ «SameSite» ատրիբուտի մասին ավելին իմանալու համար կարդացեք %2$S
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
-CookieSameSiteValueInvalid=Invalid “sameSite“ value for cookie “%1$S”. The supported values are: “lax“, “strict“, “none“.
+CookieSameSiteValueInvalid=«%1$S» նշոցիկի համար անվավեր «sameSite» արժեք։ Աջակցված արժեքներն են. «Մեղմ», «խիստ», «ոչ»։
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
+CookieOversize=Նշոցիկ «%1$S» անվավեր է, քանի որ դրա չափը չափազանց մեծ է։ Առավելագույն չափը %2$S B է։
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize=Նշոցիկ «%1$S»֊ը անվավեր է, քանի որ դրա ուղու չափը չափազանց մեծ է։ Առավելագույն չափը %2$S B է։
diff --git a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties
index 483500deef84..f0cc118ac6ef 100644
--- a/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties
+++ b/thunderbird-l10n/hy-AM/chrome/hy-AM/locale/hy-AM/pipnss/pipnss.properties
@@ -3,9 +3,9 @@
 # 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/.
 
-CertPassPrompt=%S-ի համար նշեք հիմնական գաղտնաբառը:
+CertPassPrompt=%S-ի համար նշեք հիմնական գաղտնաբառը։
 
-CertPassPromptDefault=Մուտքագրեք Հիմնական գաղտնաբառը
+CertPassPromptDefault=Մուտքագրեք հիմնական գաղտնաբառը։
 
 # The following strings have special requirements: they must fit in a 32 or 64
 # bytes buffer after being encoded to UTF-8.
@@ -27,7 +27,7 @@ RootCertModuleName=Արմատների Ներդրված Բաղադրիչ
 # LOCALIZATION NOTE (ManufacturerID): string limit is 32 bytes after conversion
 # to UTF-8.
 # length_limit = 32 bytes
-ManufacturerID=Mozilla.am
+ManufacturerID=Mozilla.org
 # LOCALIZATION NOTE (LibraryDescription): string limit is 32 bytes after
 # conversion to UTF-8.
 # length_limit = 32 bytes
@@ -47,7 +47,7 @@ SlotDescription=PSM Internal Cryptographic Services
 # LOCALIZATION NOTE (PrivateSlotDescription): string limit is 64 bytes after
 # conversion to UTF-8.
 # length_limit = 64 bytes
-PrivateSlotDescription=ԱԱԿ (PSM) Անձնական Բանալիներ
+PrivateSlotDescription=PSM Անձնական Բանալիներ
 # LOCALIZATION NOTE (Fips140TokenDescription): string limit is 32 bytes after
 # conversion to UTF-8.
 # length_limit = 32 bytes
@@ -76,7 +76,7 @@ CertDumpSHA384WithRSA=PKCS #1 SHA-384՝ RSA գաղտնագրմամբ
 CertDumpSHA512WithRSA=PKCS #1 SHA-512՝ RSA գաղտնագրմամբ
 CertDumpDefOID=Առարկայի Նույնացուցիչը (%S)
 CertDumpIssuer=Թողարկող
-CertDumpSubject=Առարկան
+CertDumpSubject=Առարկա
 CertDumpAVACountry=C
 CertDumpAVAState=ST
 CertDumpAVALocality=L
@@ -91,9 +91,9 @@ CertDumpSurname=Ազգանուն
 CertDumpGivenName=Անուն
 CertDumpValidity=Վավեր է
 CertDumpNotBefore=Ոչ Նախքան
-CertDumpNotAfter=Ոչ ուշ քան
-CertDumpSPKI=Առարկայի Հասարակային Բանալու Տվյալները
-CertDumpSPKIAlg=Առարկայի Հասարակային Բանալու Քայլաշարը
+CertDumpNotAfter=Ոչ Հետո
+CertDumpSPKI=Առարկայի Հանրային Բանալու Տվյալները
+CertDumpSPKIAlg=Առարկայի Հանրային Բանալու Քայլաշարը
 CertDumpAlgID=Քայլաշարի Նույնացուցիչ
 CertDumpParams=Քայլաշարի Պարամետրերը
 CertDumpRSAEncr=PKCS #1 RSA գաղտնագրմամբ
diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl
index fde0b303f4c2..79bb62dce9df 100644
--- a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/aboutdebugging.ftl
@@ -85,7 +85,7 @@ about-debugging-setup-intro = Կարգավորեք կապի եղանակը, որ
 # Explanatory text in the Setup page about what the 'This Firefox' page is for
 about-debugging-setup-this-firefox = Օգտագործել <a>{ about-debugging-this-firefox-runtime-name }</a> ներդիրները վրիպազերծելու, ընդլայնումներ և ծառայության աշխատողներին { -brand-shorter-name }-ի այս տարբերակի համար։
 # Explanatory text in the Setup page about what the 'This Firefox' page is for
-about-debugging-setup-this-firefox2 = Օգտագործել <a>{ about-debugging-this-firefox-runtime-name }</a> վրիպազերծելու ընդլաայնոմները և ծառայության աշխատողներին { -brand-shorter-name }-ի այս տարբերակի համար։
+about-debugging-setup-this-firefox2 = Օգտագործել <a>{ about-debugging-this-firefox-runtime-name }</a> վրիպազերծելու ընդլայնումները և ծառայության աշխատողներին { -brand-shorter-name }-ի այս տարբերակի համար։
 # Title of the heading Connect section of the Setup page.
 about-debugging-setup-connect-heading = Միացրեք սարք
 # USB section of the Setup page
diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl
index 75b36d5a0227..56fd7e022f2e 100644
--- a/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl
+++ b/thunderbird-l10n/hy-AM/localization/hy-AM/devtools/client/toolbox-options.ftl
@@ -47,6 +47,8 @@ options-stylesheet-autocompletion-label = CSS-ի ինքնալրացում
 
 ## Screenshot section
 
+# The heading
+options-screenshot-label = Էկրանի հանույթի պահվածք
 
 ## Editor section
 
@@ -61,6 +63,8 @@ options-sourceeditor-keybinding-default-label = Լռելյայն
 
 # The heading
 options-context-advanced-settings = Լրացուցիչ կարգավորումներ
+# The label for the checkbox that toggles the HTTP cache on or off
+options-disable-http-cache-label = Անջատել HTTP պահոցը (երբ գործիքատուփը բաց է)
 # The label for checkbox that toggles JavaScript on or off
 options-disable-javascript-label = Անջատել JavaScript-­ը *
 options-disable-javascript-tooltip =
diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl
index 44e250febb71..00276dec20e2 100644
--- a/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Տեղակայեք հավելումը Ֆայլից...
     .accesskey = Տ
 help-button = Լրացուցիչ աջակցություն
+sidebar-help-button-title =
+    .title = Լրացուցիչ աջակցություն
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } Ընտրանքներ
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Գործիքներ բոլոր հավելումների համար
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } Ընտրանքներ
+           *[other] { -brand-short-name } Նախընտրություններ
+        }
 show-unsigned-extensions-button =
     .label = Որոշ ընդլայնումներ չեն կարող ստուգվել:
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Առկա Թարմացումներ
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Խորհուրդներ
+addon-category-discover-title =
+    .title = Խորհուրդներ
 addon-category-extension = Ընդլայնումներ
+addon-category-extension-title =
+    .title = Ընդլայնումներ
 addon-category-theme = Ոճեր
+addon-category-theme-title =
+    .title = Ոճեր
 addon-category-plugin = Բաղադրիչներ
+addon-category-plugin-title =
+    .title = Բաղադրիչներ
 addon-category-dictionary = Բառարաններ
+addon-category-dictionary-title =
+    .title = Բառարաններ
 addon-category-locale = Լեզուներ
+addon-category-locale-title =
+    .title = Լեզուներ
 addon-category-available-updates = Առկա Թարմացումներ
+addon-category-available-updates-title =
+    .title = Առկա Թարմացումներ
 addon-category-recent-updates = Վերջին Թարմացումները
+addon-category-recent-updates-title =
+    .title = Վերջին Թարմացումները
 
 ## These are global warnings
 
@@ -312,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Ավելի քիչ
 go-back-button =
     .tooltiptext = Գնալ ետ
+header-back-button =
+    .title = Գնալ ետ
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..a695cbd75675
--- /dev/null
+++ b/thunderbird-l10n/hy-AM/localization/hy-AM/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Դուք օգտագործում եք { -brand-product-name }֊ի հին տարբերակը
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Ստեղծել նոր հաշիվ
+profiledowngrade-sync = { -brand-product-name }-ի հին տարբերակի օգտագործումը կարող է վնասել գոյություն ունեցող { -brand-product-name }-ի հաշվում արդեն պահպանված էջանիշերը և զննարկման պատմությունը։ Ձեր տեղեկությունը պաշտպանելու համար, ստեղծեք նոր հաշիվ { -brand-short-name }-ի այս տեղակայման համար։ Դուք կարող եք միշտ մուտք գործել { -fxaccount-brand-name }-ի հետ Ձեր էջանիշերը և զննարկման պատմությունը հաշիվների միջև համաժամեցնելու համար։
+profiledowngrade-nosync = { -brand-product-name }֊ի ավելի հին տարաբերակի օգտագործումը կարող է վնասել էջանիշները և դիտման պատմությունը, որոնք արդեն պահված են Ձեր առկա { -brand-product-name }֊ի հատկագրում։ Ձեր տեղեկատվությունը պաշտպանելու համար ստեղծեք նոր տեղադրություն այս տեղադրման համար { -brand-short-name }
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Ելք
+           *[other] Փակել
+        }
diff --git a/thunderbird-l10n/hy-AM/manifest.json b/thunderbird-l10n/hy-AM/manifest.json
index d9c3626f4e90..4c8a3f3ebebd 100644
--- a/thunderbird-l10n/hy-AM/manifest.json
+++ b/thunderbird-l10n/hy-AM/manifest.json
@@ -1,57 +1,57 @@
 {
-  "langpack_id": "hy-AM",
-  "applications": {
-    "gecko": {
-      "id": "langpack-hy-AM@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
-  "manifest_version": 2,
-  "author": "haysoft.org (contributors: Hrant Ohanyan)",
-  "version": "76.0buildid20200407173003",
-  "description": "Language pack for Thunderbird for hy-AM",
-  "name": "Armenian (AM) Language Pack",
   "languages": {
     "hy-AM": {
+      "version": "20200419104323",
       "chrome_resources": {
-        "places": "chrome/hy-AM/locale/hy-AM/places/",
-        "devtools": "chrome/hy-AM/locale/hy-AM/devtools/client/",
-        "messenger-smime": "chrome/hy-AM/locale/hy-AM/messenger-smime/",
+        "branding": "chrome/hy-AM/locale/hy-AM/branding/",
+        "devtools-shared": "chrome/hy-AM/locale/hy-AM/devtools/shared/",
+        "devtools-startup": "chrome/hy-AM/locale/hy-AM/devtools/startup/",
+        "pippki": "chrome/hy-AM/locale/hy-AM/pippki/",
+        "communicator": "chrome/hy-AM/locale/hy-AM/communicator/",
         "mozapps": "chrome/hy-AM/locale/hy-AM/mozapps/",
-        "messenger-newsblog": "chrome/hy-AM/locale/hy-AM/messenger-newsblog/",
+        "alerts": "chrome/hy-AM/locale/hy-AM/alerts/",
+        "places": "chrome/hy-AM/locale/hy-AM/places/",
+        "messenger-mapi": "chrome/hy-AM/locale/hy-AM/messenger-mapi/",
+        "messenger-region": "chrome/hy-AM/locale/hy-AM/messenger-region/",
         "autoconfig": "chrome/hy-AM/locale/hy-AM/autoconfig/",
-        "communicator": "chrome/hy-AM/locale/hy-AM/communicator/",
-        "global-platform": {
-          "macosx": "chrome/hy-AM/locale/hy-AM/global-platform/mac/",
-          "android": "chrome/hy-AM/locale/hy-AM/global-platform/unix/",
-          "win": "chrome/hy-AM/locale/hy-AM/global-platform/win/",
-          "linux": "chrome/hy-AM/locale/hy-AM/global-platform/unix/"
-        },
+        "mozldap": "chrome/hy-AM/locale/hy-AM/mozldap/",
+        "chat": "chrome/hy-AM/locale/hy-AM/chat/",
+        "messenger-newsblog": "chrome/hy-AM/locale/hy-AM/messenger-newsblog/",
+        "devtools": "chrome/hy-AM/locale/hy-AM/devtools/client/",
         "lightning": "chrome/hy-AM/locale/hy-AM/lightning/",
-        "alerts": "chrome/hy-AM/locale/hy-AM/alerts/",
         "necko": "chrome/hy-AM/locale/hy-AM/necko/",
-        "passwordmgr": "chrome/hy-AM/locale/hy-AM/passwordmgr/",
+        "calendar": "chrome/hy-AM/locale/hy-AM/calendar/",
         "pipnss": "chrome/hy-AM/locale/hy-AM/pipnss/",
-        "mozldap": "chrome/hy-AM/locale/hy-AM/mozldap/",
-        "messenger": "chrome/hy-AM/locale/hy-AM/messenger/",
-        "pippki": "chrome/hy-AM/locale/hy-AM/pippki/",
+        "messenger-smime": "chrome/hy-AM/locale/hy-AM/messenger-smime/",
         "pluginproblem": "chrome/hy-AM/locale/hy-AM/pluginproblem/",
-        "messenger-mapi": "chrome/hy-AM/locale/hy-AM/messenger-mapi/",
-        "calendar": "chrome/hy-AM/locale/hy-AM/calendar/",
-        "devtools-shared": "chrome/hy-AM/locale/hy-AM/devtools/shared/",
         "global": "chrome/hy-AM/locale/hy-AM/global/",
-        "chat": "chrome/hy-AM/locale/hy-AM/chat/",
-        "branding": "chrome/hy-AM/locale/hy-AM/branding/",
-        "messenger-region": "chrome/hy-AM/locale/hy-AM/messenger-region/",
-        "devtools-startup": "chrome/hy-AM/locale/hy-AM/devtools/startup/"
-      },
-      "version": "20200403075007"
+        "messenger": "chrome/hy-AM/locale/hy-AM/messenger/",
+        "passwordmgr": "chrome/hy-AM/locale/hy-AM/passwordmgr/",
+        "global-platform": {
+          "linux": "chrome/hy-AM/locale/hy-AM/global-platform/unix/",
+          "win": "chrome/hy-AM/locale/hy-AM/global-platform/win/",
+          "android": "chrome/hy-AM/locale/hy-AM/global-platform/unix/",
+          "macosx": "chrome/hy-AM/locale/hy-AM/global-platform/mac/"
+        }
+      }
     }
   },
+  "author": "haysoft.org (contributors: Hrant Ohanyan)",
+  "name": "Armenian (AM) Language Pack",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
-  }
+  },
+  "version": "76.0buildid20200420212409",
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "id": "langpack-hy-AM@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
+    }
+  },
+  "langpack_id": "hy-AM",
+  "description": "Language pack for Thunderbird for hy-AM",
+  "manifest_version": 2
 }
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd b/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd
index ca65b8629b48..5868d964f6f7 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd
+++ b/thunderbird-l10n/id/chrome/id/locale/id/calendar/calendarCreation.dtd
@@ -40,7 +40,7 @@
 
 <!ENTITY calendartype.label "Jenis Kalender:">
 <!ENTITY location.label "Lokasi:">
-<!ENTITY location.placeholder "URL atau nama hos dari peladen kalender">
+<!ENTITY location.placeholder "URL atau nama host dari server kalender">
 
 <!ENTITY network.loading.description "Mohon tunggu sembari menemukan kalender.">
 <!ENTITY network.notfound.description "Kalender tidak ditemukan di lokasi ini. Mohon periksa pengaturan Anda.">
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties b/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties
index d8c44cf4a1e1..98d0af222709 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/chat/irc.properties
@@ -175,7 +175,7 @@ error.sendMessageFailed=Terjadi kesalahan ketika mengirim pesan terakhir Anda. H
 error.channelForward=Mungkin anda tidak dapat bergabung %1$S, dan secara otomatis diarahkan ke %2$S.
 #    %S is the mode that the user tried to set but was not recognized
 #    by the server as a valid mode.
-error.unknownMode='%S' bukan mode pengguna sah di peladen ini.
+error.unknownMode='%S' bukan mode pengguna valid di server ini.
 
 # LOCALIZATION NOTE (tooltip.*):
 #    These are the descriptions given in a tooltip with information received
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties b/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties
index 5fdf580ff213..71e9c7e46218 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/chat/matrix.properties
@@ -5,7 +5,7 @@
 # LOCALIZATION NOTE (options.*):
 #   These are the protocol specific options shown in the account manager and
 #   account wizard windows.
-options.connectServer=Peladen
+options.connectServer=Server
 
 # LOCALIZATION NOTE (chatRoomField.*):
 #   These are the name of fields displayed in the 'Join Chat' dialog
@@ -14,6 +14,12 @@ options.connectServer=Peladen
 #   character of the string should be used as the access key for this
 #   field.
 
+# LOCALIZATION NOTE (tooltip.*):
+#    These are the descriptions given in a tooltip with information received
+#    from the "User" object.
+# The human readable name of the user.
+# %S is the timespan elapsed since the last activity.
+
 options.connectPort=Port
 # LOCALIZATION NOTE (chatRoomField.*):
 #   These are the name of fields displayed in the 'Join Chat' dialog
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties b/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties
index e0c1f26ba069..3dc23c0a9de9 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/chat/xmpp.properties
@@ -34,7 +34,7 @@ connection.error.authenticationFailure=Kegagalan autentikasi
 connection.error.notAuthorized=Tidak diizinkan (Sandinya sudah benar?)
 connection.error.failedToGetAResource=Gagal mengambil sumber daya
 connection.error.failedResourceNotValid=Sumber tidak valid.
-connection.error.XMPPNotSupported=Peladen ini tidak mendukung XMPP
+connection.error.XMPPNotSupported=Server ini tidak mendukung XMPP
 
 # LOCALIZATION NOTE (conversation.error.notDelivered):
 #   This is displayed in a conversation as an error message when a message
@@ -90,7 +90,6 @@ tooltip.userName=Nama pengguna
 tooltip.title=Judul
 tooltip.organization=Organisasi
 tooltip.country=Negara
-
 tooltip.telephone=Nomor telepon
 
 # LOCALIZATION NOTE (chatRoomField.*):
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties
index 154dd94b2fb5..45d3e17895cd 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/accessibility.properties
@@ -100,7 +100,7 @@ accessibility.description.general.p2=Fitur aksesibilitas mungkin mempengaruhi ki
 # LOCALIZATION NOTE (accessibility.description.oldVersion): A title text used
 # when accessibility service description is provided when a client is connected
 # to an older version of accessibility actor.
-accessibility.description.oldVersion=Anda tersambung dengan peladen debugger yang sudah usang. Untuk menggunakan panel Aksesibilitas, sambungkan dengan peladen debugger versi terbaru.
+accessibility.description.oldVersion=Anda tersambung dengan server debugger yang sudah usang. Untuk menggunakan panel Aksesibilitas, sambungkan dengan server debugger versi terbaru.
 
 # LOCALIZATION NOTE (accessibility.tree.menu.printToJSON): A title text used when a
 # context menu item for printing an accessible tree to JSON is rendered after triggering a
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties
index 57cf44d05c5d..8664d7712fdd 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy=Salin
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll=Bentangkan Semua
 
+jsonViewer.ExpandAllSlow=Bentangkan Semua (lambat)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll=Ciutkan Semua
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON=Filter JSON
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference=Referensi Siklus
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties b/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties
index 06d13b1d1cbb..a72ba7f2f4d0 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      pemisah
 tabPanel     =      panel tab
 # The roleDescription for the html:mark element
 highlight = sorot
-
 # The roleDescription for the details element
-details = details
+details = detail
 # The roleDescription for the summary element
-summary = summary
+summary = ringkasan
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd b/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd
index a3f2d5c75581..f49769026df1 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd
+++ b/thunderbird-l10n/id/chrome/id/locale/id/lightning/lightning.dtd
@@ -23,6 +23,8 @@
 <!ENTITY lightning.menupopup.open.accesskey           "B">
 <!ENTITY lightning.menupopup.open.message.label       "Simpanan Pesan…">
 <!ENTITY lightning.menupopup.open.message.accesskey   "S">
+
+<!-- Open menu popup in File menu -->
 <!ENTITY lightning.menupopup.open.calendar.label      "Berkas Kalender…">
 <!ENTITY lightning.menupopup.open.calendar.accesskey  "k">
 
@@ -46,7 +48,7 @@
      lightning.calendarproperties.forceEmailScheduling.tooltiptext2)
      - tooltiptext1 is used in the calendar wizard when setting a new caldav calendar
      - tooltiptext2 is used in the calendar properties dialog for caldav calendars -->
-<!ENTITY lightning.calendarproperties.forceEmailScheduling.tooltiptext1     "Untuk saat ini, Anda hanya dapat mengaktifkan ini setelah mengatur kalender dalam dialog propertinya jika peladen kalender menangani penjadwalan.">
+<!ENTITY lightning.calendarproperties.forceEmailScheduling.tooltiptext1     "Untuk saat ini, Anda hanya dapat mengaktifkan ini setelah mengatur kalender dalam dialog propertinya jika server kalender menangani penjadwalan.">
 
 <!-- iMIP Bar (meeting support) -->
 <!ENTITY lightning.imipbar.btnAccept.label                                  "Terima">
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd
index 4e1585afb803..bc032eed00d7 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd
+++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-advanced.dtd
@@ -4,6 +4,8 @@
 
 <!-- extracted from am-advanced.xul -->
 
+<!-- extracted from am-advanced.xhtml -->
+
 <!-- LOCALIZATION NOTE (smtpServer.label): do not translate "SMTP" in below line -->
 <!ENTITY smtpServer.label "Pengaturan Server Pengirim (SMTP)">
 
@@ -18,7 +20,7 @@
 <!ENTITY smtpListSetDefault.label "Setel Baku">
 <!ENTITY smtpListSetDefault.accesskey "d">
 
-<!ENTITY serverDetails.label "Detail peladen yang dipilih:">
+<!ENTITY serverDetails.label "Detail server yang dipilih:">
 <!ENTITY serverDescription.label "Keterangan: ">
 <!ENTITY serverName.label "Nama Server: ">
 <!ENTITY serverPort.label "Port: ">
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd
index f6d5e69722af..6dde58b4f5f2 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd
+++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/am-main.dtd
@@ -4,6 +4,8 @@
 
 <!-- extracted from am-main.xul -->
 
+<!-- extracted from am-main.xhtml -->
+
 <!ENTITY accountTitle.label "Pengaturan Akun">
 <!ENTITY accountName.label "Nama Akun:">
 <!ENTITY accountName.accesskey "N">
@@ -41,6 +43,6 @@
 <!ENTITY smtpName.accesskey "P">
 <!ENTITY smtpDefaultServer.label "Gunakan Server Default">
 
-<!ENTITY smtpServerEdit.label "Sunting peladen SMTP…">
+<!ENTITY smtpServerEdit.label "Sunting server SMTP…">
 
 <!ENTITY smtpServerEdit.accesskey "P">
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties b/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties
index ebcfd0a9d6c8..57adb36e8eed 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/imapMsgs.properties
@@ -124,8 +124,11 @@ imapDone=
 
 imapEnterPasswordPromptTitle=Sandi Server Email Dibutuhkan
 
+# LOCALIZATION NOTE (imapEnterPasswordPromptTitleWithUsername): Do not translate the
+# word %1$S. Place the word %1$S where the user name should appear.
+
 imapUnknownHostError=Gagal tersambung ke server %S.
-imapOAuth2Error=Kegagalan autentikasi saat menyambung ke peladen %S.
+imapOAuth2Error=Kegagalan autentikasi saat menyambung ke server %S.
 
 
 imapNetTimeoutError=Sambungan ke server %S kehabisan waktu.
@@ -162,7 +165,7 @@ imapAclDeleteRight=Hapus Pesan
 
 imapAclAdministerRight=Kelola Folder
 
-imapServerDoesntSupportAcl=Peladen tidak mendukung folder bersama.
+imapServerDoesntSupportAcl=Server tidak mendukung folder bersama.
 
 imapAclExpungeRight=Hapus
 
@@ -171,9 +174,17 @@ imapAclExpungeRight=Hapus
 imapSubscribePrompt=Anda ingin berlangganan %1$S?
 
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
+
+# The imap capability response reports that QUOTA is not supported.
+imapQuotaStatusNotSupported=Server ini tidak mendukung kuota.
+
 
-imapQuotaStatusNotSupported=Peladen ini tidak mendukung kuota.
+# The getqutaroot command succeeded but reported no quota information.
 
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
 
 # Out of memory
 imapOutOfMemory=Aplikasi kehabisan memori.
diff --git a/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties b/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties
index 3f6a506b004d..83f5cca8d62e 100644
--- a/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties
+++ b/thunderbird-l10n/id/chrome/id/locale/id/messenger/messenger.properties
@@ -289,6 +289,7 @@ mailnews.search_date_leading_zeros=true
 
 # accountCentral
 mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat=%1$S %2$S - %3$S
 mailAcctType=Email
@@ -379,7 +380,7 @@ connectionRefusedError=Tidak dapat tersambung ke server %S; sambungan ditolak.
 # LOCALIZATION NOTE(netTimeoutError): %S is the server name
 netTimeoutError=Sambungan ke server %S kehabisan waktu.
 # LOCALIZATION NOTE(netResetError): %S is the server name
-netResetError=Sambungan ke peladen %S telah diset ulang.
+netResetError=Sambungan ke server %S telah diset ulang.
 # LOCALIZATION NOTE(netInterruptError): %S is the server name
 
 recipientSearchCriteria=Subjek atau Penerima mengandung:
@@ -416,11 +417,14 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=%S dari %S KB dipakai
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=%S%% penuh
 # for quota in main window (commandglue.js)
 percent=%S%%
 quotaTooltip=Kuota IMAP: digunakan %S KB dari total %S KB. Klik untuk detail.
 
+
 # for message views
 confirmViewDeleteTitle=Konfirmasi
 confirmViewDeleteMessage=Yakin akan menghapus tampilan berikut?
@@ -619,7 +623,7 @@ mailServerLoginFailedTitle=Log Masuk Gagal
 mailServerLoginFailedTitleWithAccount=Gagal masuk ke akun "%S"
 # LOCALIZATION NOTE (mailServerLoginFailed2):
 # %1$S is the host name of the server, %2$S is the user name.
-mailServerLoginFailed2=Gagal masuk ke peladen %1$S dengan nama pengguna %2$S.
+mailServerLoginFailed2=Gagal masuk ke server %1$S dengan nama pengguna %2$S.
 mailServerLoginFailedRetryButton=&Coba Lagi
 mailServerLoginFailedEnterNewPasswordButton=&Masukkan Sandi Baru
 
diff --git a/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl b/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl
index 4755cf11ef61..b06decb28f86 100644
--- a/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl
+++ b/thunderbird-l10n/id/localization/id/security/certificates/certManager.ftl
@@ -14,7 +14,7 @@ certmgr-tab-ca =
     .label = Otoritas
 certmgr-mine = Anda memiliki sertifikat dari organisasi berikut ini yang mengenali Anda
 certmgr-people = Anda memiliki sertifikat di berkas yang mengenali orang ini
-certmgr-servers = Anda memiliki sertifikat pada berkas yang bisa mengidentifikasi peladen berikut
+certmgr-servers = Anda memiliki sertifikat pada berkas yang bisa mengidentifikasi server berikut
 certmgr-ca = Anda memiliki sertifikat pada berkas yang mengidentifikasi otoritas sertifikat ini
 certmgr-detail-general-tab-title =
     .label = Umum
@@ -24,14 +24,6 @@ certmgr-detail-pretty-print-tab-title =
     .accesskey = D
 certmgr-pending-label =
     .value = Sedang memverifikasi sertifikat…
-certmgr-subject-info-label =
-    .value = Diterbitkan untuk
-certmgr-issuer-info-label =
-    .value = Diterbitkan Oleh
-certmgr-period-of-validity-label =
-    .value = Periode Kevalidan
-certmgr-fingerprints-label =
-    .value = Sidik Jari
 certmgr-subject-label = Diterbitkan untuk
 certmgr-issuer-label = Diterbitkan Oleh
 certmgr-period-of-validity = Periode Kevalidan
@@ -40,18 +32,6 @@ certmgr-cert-detail =
     .title = Detail Sertifikat
     .buttonlabelaccept = Tutup
     .buttonaccesskeyaccept = T
-certmgr-cert-detail-cn =
-    .value = Nama Umum (Common Name-CN)
-certmgr-cert-detail-o =
-    .value = Organisasi (O)
-certmgr-cert-detail-ou =
-    .value = Unit Organisasi (Organizational Unit-OU)
-certmgr-cert-detail-serialnumber =
-    .value = Nomor Seri
-certmgr-cert-detail-sha256-fingerprint =
-    .value = Sidik jari SHA-256
-certmgr-cert-detail-sha1-fingerprint =
-    .value = Sidik jari SHA1
 certmgr-cert-detail-commonname = Common Name (CN)
 certmgr-cert-detail-org = Organisasi (O)
 certmgr-cert-detail-orgunit = Unit Organisasi (OU)
@@ -80,13 +60,9 @@ certmgr-token-name =
 certmgr-begins-on = Mulai Sejak
 certmgr-begins-label =
     .label = Mulai Sejak
-certmgr-begins-value =
-    .value = { certmgr-begins-label.label }
 certmgr-expires-on = Kedaluwarsa Pada
 certmgr-expires-label =
     .label = Kedaluwarsa Pada
-certmgr-expires-value =
-    .value = { certmgr-expires-label.label }
 certmgr-email =
     .label = Alamat Surel
 certmgr-serial =
diff --git a/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl
index b83c9249e8b0..1442788c1cae 100644
--- a/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/id/localization/id/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Pasang Pengaya dari Berkas…
     .accesskey = B
 help-button = Dukungan Pengaya
+sidebar-help-button-title =
+    .title = Dukungan Pengaya
 preferences =
     { PLATFORM() ->
         [windows] Opsi { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Alat untuk semua pengaya
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opsi { -brand-short-name }
+           *[other] Preferensi { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Beberapa ekstensi tidak dapat diverifikasi
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Versi Baru yang Tersedia
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Rekomendasi
+addon-category-discover-title =
+    .title = Rekomendasi
 addon-category-extension = Ekstensi
+addon-category-extension-title =
+    .title = Ekstensi
 addon-category-theme = Tema
+addon-category-theme-title =
+    .title = Tema
 addon-category-plugin = Plugin
+addon-category-plugin-title =
+    .title = Plugin
 addon-category-dictionary = Kamus
+addon-category-dictionary-title =
+    .title = Kamus
 addon-category-locale = Bahasa
+addon-category-locale-title =
+    .title = Bahasa
 addon-category-available-updates = Versi Baru yang Tersedia
+addon-category-available-updates-title =
+    .title = Versi Baru yang Tersedia
 addon-category-recent-updates = Versi Baru
+addon-category-recent-updates-title =
+    .title = Versi Baru
 
 ## These are global warnings
 
@@ -311,6 +335,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Lebih Sedikit
 go-back-button =
     .tooltiptext = Mundur
+header-back-button =
+    .title = Mundur
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl b/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl
index 03b6b3040b76..a661b9dcd42c 100644
--- a/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/id/localization/id/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Konten Web Terisolasi
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Soket
diff --git a/thunderbird-l10n/id/localization/id/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/id/localization/id/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..d4d420eb9be9
--- /dev/null
+++ b/thunderbird-l10n/id/localization/id/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Anda telah meluncurkan versi { -brand-product-name } yang lebih lama
+    .style = width: 490px
+profiledowngrade-window-create =
+    .label = Buat Profil Baru
+profiledowngrade-sync = Menggunakan versi { -brand-product-name } yang lebih lama dapat merusak markah dan riwayat penjelajahan yang telah disimpan ke profil { -brand-product-name } yang ada. Untuk melindungi informasi Anda, buat profil baru untuk pemasangan { -brand-short-name } ini. Anda selalu dapat masuk dengan { -fxaccount-brand-name } untuk menyinkronkan markah dan riwayat penjelajahan di antara profil.
+profiledowngrade-nosync = Menggunakan versi { -brand-product-name } yang lebih lama dapat merusak markah dan riwayat penjelajahan yang telah disimpan ke profil { -brand-product-name } yang ada. Untuk melindungi informasi Anda, buat profil baru untuk pemasangan { -brand-short-name } ini.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Keluar
+           *[other] Keluar
+        }
diff --git a/thunderbird-l10n/id/manifest.json b/thunderbird-l10n/id/manifest.json
index 16a8bbf80bc2..7f671cd80b82 100644
--- a/thunderbird-l10n/id/manifest.json
+++ b/thunderbird-l10n/id/manifest.json
@@ -1,57 +1,57 @@
 {
-  "description": "Language pack for Thunderbird for id",
-  "manifest_version": 2,
-  "name": "Bahasa Indonesia (ID) Language Pack",
-  "author": "id-Mozilla - Komunitas Mozilla Indonesia (contributors: Dody Suria Wijaya, Milda Irhamni, Romi Hardiyanto)",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
   "applications": {
     "gecko": {
-      "strict_max_version": "76.*",
       "id": "langpack-id@thunderbird.mozilla.org",
+      "strict_max_version": "76.*",
       "strict_min_version": "76.0"
     }
   },
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "id",
+  "description": "Language pack for Thunderbird for id",
+  "manifest_version": 2,
+  "author": "id-Mozilla - Komunitas Mozilla Indonesia (contributors: Dody Suria Wijaya, Milda Irhamni, Romi Hardiyanto)",
+  "version": "76.0buildid20200420212409",
   "languages": {
     "id": {
-      "version": "20200403075045",
       "chrome_resources": {
-        "messenger-newsblog": "chrome/id/locale/id/messenger-newsblog/",
-        "messenger-region": "chrome/id/locale/id/messenger-region/",
-        "pipnss": "chrome/id/locale/id/pipnss/",
-        "autoconfig": "chrome/id/locale/id/autoconfig/",
-        "pluginproblem": "chrome/id/locale/id/pluginproblem/",
-        "lightning": "chrome/id/locale/id/lightning/",
-        "messenger-smime": "chrome/id/locale/id/messenger-smime/",
-        "global-platform": {
-          "linux": "chrome/id/locale/id/global-platform/unix/",
-          "win": "chrome/id/locale/id/global-platform/win/",
-          "android": "chrome/id/locale/id/global-platform/unix/",
-          "macosx": "chrome/id/locale/id/global-platform/mac/"
-        },
-        "devtools": "chrome/id/locale/id/devtools/client/",
-        "mozapps": "chrome/id/locale/id/mozapps/",
-        "alerts": "chrome/id/locale/id/alerts/",
         "messenger": "chrome/id/locale/id/messenger/",
         "places": "chrome/id/locale/id/places/",
-        "communicator": "chrome/id/locale/id/communicator/",
+        "global": "chrome/id/locale/id/global/",
         "messenger-mapi": "chrome/id/locale/id/messenger-mapi/",
-        "chat": "chrome/id/locale/id/chat/",
-        "mozldap": "chrome/id/locale/id/mozldap/",
-        "calendar": "chrome/id/locale/id/calendar/",
-        "branding": "chrome/id/locale/id/branding/",
-        "devtools-shared": "chrome/id/locale/id/devtools/shared/",
+        "messenger-region": "chrome/id/locale/id/messenger-region/",
+        "devtools": "chrome/id/locale/id/devtools/client/",
+        "messenger-newsblog": "chrome/id/locale/id/messenger-newsblog/",
         "devtools-startup": "chrome/id/locale/id/devtools/startup/",
+        "devtools-shared": "chrome/id/locale/id/devtools/shared/",
         "necko": "chrome/id/locale/id/necko/",
+        "mozapps": "chrome/id/locale/id/mozapps/",
+        "autoconfig": "chrome/id/locale/id/autoconfig/",
+        "calendar": "chrome/id/locale/id/calendar/",
+        "communicator": "chrome/id/locale/id/communicator/",
         "passwordmgr": "chrome/id/locale/id/passwordmgr/",
+        "branding": "chrome/id/locale/id/branding/",
+        "alerts": "chrome/id/locale/id/alerts/",
+        "messenger-smime": "chrome/id/locale/id/messenger-smime/",
+        "lightning": "chrome/id/locale/id/lightning/",
+        "chat": "chrome/id/locale/id/chat/",
+        "global-platform": {
+          "win": "chrome/id/locale/id/global-platform/win/",
+          "linux": "chrome/id/locale/id/global-platform/unix/",
+          "macosx": "chrome/id/locale/id/global-platform/mac/",
+          "android": "chrome/id/locale/id/global-platform/unix/"
+        },
+        "pipnss": "chrome/id/locale/id/pipnss/",
         "pippki": "chrome/id/locale/id/pippki/",
-        "global": "chrome/id/locale/id/global/"
-      }
+        "mozldap": "chrome/id/locale/id/mozldap/",
+        "pluginproblem": "chrome/id/locale/id/pluginproblem/"
+      },
+      "version": "20200415055410"
     }
-  }
+  },
+  "name": "Bahasa Indonesia (ID) Language Pack",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "langpack_id": "id"
 }
diff --git a/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties b/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties
index 6e6a0e9a9fce..8029efb45ffc 100644
--- a/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties
+++ b/thunderbird-l10n/is/chrome/is/locale/is/devtools/client/debugger.properties
@@ -24,6 +24,9 @@ copyToClipboard.accesskey=C
 # LOCALIZATION NOTE (copySource.label): This is the text that appears in the
 # context menu to copy the selected source of file open.
 copySource=Copy
+
+# LOCALIZATION NOTE (copySource.label): This is the text that appears in the
+# context menu to copy the selected source of file open.
 copySource.label=Afrita frumtexta
 copySource.accesskey=y
 
@@ -50,6 +53,32 @@ setDirectoryRoot.accesskey=r
 removeDirectoryRoot.label=Remove directory root
 removeDirectoryRoot.accesskey=d
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Copy Function
@@ -100,6 +129,7 @@ skipPausingTooltip.label=Óvirkja rofstaði
 
 # LOCALIZATION NOTE (undoSkipPausingTooltip.label): The tooltip text for enabling all
 # breakpoints and pausing triggers
+undoSkipPausingTooltip.label=Virkja rofstaði
 
 # LOCALIZATION NOTE (pauseButtonItem): The label that is displayed for the dropdown pause
 # list item when the debugger is in a running state.
@@ -151,9 +181,6 @@ noEventListenersText=No event listeners to display
 # header.
 eventListenersHeader=Event Listeners
 
-# LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events
-# header.
-
 # LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab
 # when there are no stack frames.
 noStackFramesText=No stack frames to display
@@ -208,6 +235,30 @@ otherEvents=Other
 # source.
 blackboxCheckboxTooltip2=Toggle blackboxing
 
+# LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events
+# header.
+
+# LOCALIZATION NOTE (noDomMutationBreakpoints): The text to
+# display in the DOM Mutation Breakpoints pane when there are no events.
+# %S will be replaced by an active link using inspectorTool as text
+
+# LOCALIZATION NOTE (inspectorTool): The text to describe the the Inspector tool
+
+# LOCALIZATION NOTE (eventListenersHeader1.placeholder): The placeholder text in
+# the event search input bar
+
+# LOCALIZATION NOTE (domMutationHeader): The text to display in the
+# DOM Mutation Breakpoints header
+
+# LOCALIZATION NOTE (domMutationTypes.attribute): The text to display in the
+# DOM Mutation Breakpoints panel for an attribute change
+
+# LOCALIZATION NOTE (domMutationTypes.removal): The text to display in the
+# DOM Mutation Breakpoints panel for a DOM node removal
+
+# LOCALIZATION NOTE (domMutationTypes.subtree): The text to display in the
+# DOM Mutation Breakpoints panel for a DOM subtree change
+
 # LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for
 # searching all the source files the debugger has seen.
 # Do not localize "CmdOrCtrl+P", or change the format of the string. These are
@@ -318,22 +369,6 @@ sourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G
 # the number of matches for autocomplete
 sourceSearch.resultsSummary1=%d results
 
-# LOCALIZATION NOTE (sourceSearch.search.again.key3): Key shortcut to highlight
-# the next occurrence of the last search triggered from a source search
-# Do not localize "Cmd+G", or change the format of the string. These are
-# key identifiers, not messages displayed to the user.
-sourceSearch.search.again.key3=Cmd+G
-
-# LOCALIZATION NOTE (sourceSearch.search.againPrev.key3): Key shortcut to highlight
-# the previous occurrence of the last search triggered from a source search
-# Do not localize "Cmd+Shift+G", or change the format of the string. These are
-# key identifiers, not messages displayed to the user.
-sourceSearch.search.againPrev.key3=Cmd+Shift+G
-
-# LOCALIZATION NOTE (sourceSearch.resultsSummary2): Semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# Shows a summary of the number of matches for autocomplete
-
 # LOCALIZATION NOTE (noMatchingStringsText): The text to display in the
 # global search results when there are no matching strings after filtering.
 noMatchingStringsText=No matches found
@@ -377,6 +412,22 @@ searchPanelGoToLine=Go to line (%S)
 # filter panel popup for the variables search operation.
 searchPanelVariable=Filter variables (%S)
 
+# LOCALIZATION NOTE (sourceSearch.search.again.key3): Key shortcut to highlight
+# the next occurrence of the last search triggered from a source search
+# Do not localize "Cmd+G", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+sourceSearch.search.again.key3=Cmd+G
+
+# LOCALIZATION NOTE (sourceSearch.search.againPrev.key3): Key shortcut to highlight
+# the previous occurrence of the last search triggered from a source search
+# Do not localize "Cmd+Shift+G", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+sourceSearch.search.againPrev.key3=Cmd+Shift+G
+
+# LOCALIZATION NOTE (sourceSearch.resultsSummary2): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# Shows a summary of the number of matches for autocomplete
+
 # LOCALIZATION NOTE (breakpointHeadingMenuItem.*): The text for all the elements
 # that are displayed in the breakpoint headings menu item popup.
 breakpointHeadingsMenuItem.enableInSource.label=Virkja rofstaði
@@ -389,6 +440,9 @@ breakpointHeadingsMenuItem.removeInSource.accesskey=R
 # LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that
 # are displayed in the breakpoints menu item popup.
 breakpointMenuItem.setConditional=Configure conditional breakpoint
+
+# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that
+# are displayed in the breakpoints menu item popup.
 breakpointMenuItem.enableSelf2.label=Enable
 breakpointMenuItem.enableSelf2.accesskey=E
 breakpointMenuItem.disableSelf2.label=Disable
@@ -498,13 +552,13 @@ components.header=Íhlutir
 # for the summarizing the selected search result. e.g. 5 of 10 results.
 editor.searchResults=%d of %d results
 
+# LOCALIZATION NOTE (editor.singleResult): Copy shown when there is one result.
+editor.singleResult=1 result
+
 # LOCALIZATION NOTE (editor.searchResults1): Semi-colon list of plural forms.
 # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 # Editor Search bar message to summarize the selected search result. e.g. 5 of 10 results.
 
-# LOCALIZATION NOTE (editor.singleResult): Copy shown when there is one result.
-editor.singleResult=1 result
-
 # LOCALIZATION NOTE (editor.noResultsFound): Editor Search bar message
 # for when no results found.
 editor.noResultsFound=Engar niðurstöður fundust
@@ -595,6 +649,16 @@ editor.jumpToMappedLocation1.accesskey=m
 downloadFile.label=Hlaða niður skrá
 downloadFile.accesskey=d
 
+# LOCALIZATION NOTE (inlinePreview.show.label): Context menu item
+# for showing the inline preview blocks
+
+# LOCALIZATION NOTE (inlinePreview.hide.label): Context menu item
+# for hiding the inline preview block
+
+# LOCALIZATION NOTE (preview.noProperties): Label shown in the preview
+# popup when there are no properties to show.
+preview.noProperties=Engir eiginleikar
+
 # LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the
 # context menu to disable framework grouping.
 framework.disableGrouping=Disable Framework Grouping
@@ -633,6 +697,20 @@ xhrBreakpoints.label=Bæta við XHR rofstað
 # LOCALIZATION NOTE (pauseOnAnyXHR): The pause on any XHR checkbox description
 # when the debugger will pause on any XHR requests.
 
+# LOCALIZATION NOTE (watchpoints.submenu): This is the text for the watchpoints sub-menu.
+
+# LOCALIZATION NOTE (watchpoints.getWatchpoint): This is the text that appears in the
+# watchpoints sub-menu to add a "get" watchpoint on an object property.
+
+# LOCALIZATION NOTE (watchpoints.setWatchpoint): This is the text that appears in the
+# watchpoints submenu to add a "set" watchpoint on an object property.
+
+# LOCALIZATION NOTE (watchpoints.removeWatchpoint): This is the text that appears in the
+# context menu to delete a watchpoint on an object property.
+
+# LOCALIZATION NOTE (watchpoints.removeWatchpointTooltip): This is the text that appears in the
+# tooltip to delete a watchpoint on an object property.
+
 # LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item
 # for closing the selected tab below the mouse.
 sourceTabs.closeTab=Close tab
@@ -674,6 +752,14 @@ sourceFooter.blackbox.accesskey=b
 sourceFooter.unblackbox=Unblackbox Source
 sourceFooter.unblackbox.accesskey=b
 
+# LOCALIZATION NOTE (blackboxContextItem.blackbox): Text associated
+# with the blackbox context menu item
+blackboxContextItem.blackbox.accesskey=B
+
+# LOCALIZATION NOTE (blackboxContextItem.unblackbox): Text associated
+# with the unblackbox context menu item
+blackboxContextItem.unblackbox.accesskey=U
+
 # LOCALIZATION NOTE (sourceFooter.mappedSource): Text associated
 # with a mapped source. %S is replaced by the source map origin.
 sourceFooter.mappedSource=(From %S)
@@ -714,10 +800,17 @@ scopes.notPaused=Not Paused
 # LOCALIZATION NOTE (scopes.mapping.label): Scopes right sidebar pane
 # tooltip for checkbox and label
 
+# LOCALIZATION NOTE (eventlisteners.log.label): Event listeners tooltip for
+# checkbox and label
+
+# LOCALIZATION NOTE (eventlisteners.log): Checkbox label for logging events
+eventlisteners.log=Skrá
+
 # LOCALIZATION NOTE (scopes.helpTooltip.label): Scopes right sidebar pane
 # icon tooltip for link to MDN
 
 # LOCALIZATION NOTE (scopes.map.label): Checkbox label to map scopes
+scopes.map.label=Varpa
 
 # LOCALIZATION NOTE (scopes.block): Refers to a block of code in
 # the scopes pane when the debugger is paused.
@@ -851,70 +944,6 @@ watchExpressionsScopeLabel=Watch expressions
 # the global scope.
 globalScopeLabel=Global
 
-# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is
-# shown before the stack trace in an error.
-variablesViewErrorStacktrace=Stack trace:
-
-# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed
-# when you have an object preview that does not show all of the elements. At the end of the list
-# you see "N more..." in the web console output.
-# This is a semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of remaining items in the object
-# example: 3 more…
-variablesViewMoreObjects=#1 more…;#1 more…
-
-# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed
-# in the variables list on an item with an editable name.
-variablesEditableNameTooltip=Double click to edit
-
-# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed
-# in the variables list on an item with an editable value.
-variablesEditableValueTooltip=Click to change value
-
-# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed
-# in the variables list on an item which can be removed.
-variablesCloseButtonTooltip=Click to remove
-
-# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed
-# in the variables list on a getter or setter which can be edited.
-variablesEditButtonTooltip=Click to set value
-
-# LOCALIZATION NOTE (variablesDomNodeValueTooltip): The text that is displayed
-# in a tooltip on the "open in inspector" button in the the variables list for a
-# DOMNode item.
-variablesDomNodeValueTooltip=Click to select the node in the inspector
-
-# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed
-# in the variables list on certain variables or properties as tooltips.
-# Explanations of what these represent can be found at the following links:
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
-# It's probably best to keep these in English.
-configurableTooltip=configurable
-enumerableTooltip=enumerable
-writableTooltip=writable
-frozenTooltip=frozen
-sealedTooltip=sealed
-extensibleTooltip=extensible
-overriddenTooltip=overridden
-WebIDLTooltip=WebIDL
-
-# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed
-# in the variables list as a separator between the name and value.
-variablesSeparatorLabel=:
-
-# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed
-# in the watch expressions list as a separator between the code and evaluation.
-watchExpressionsSeparatorLabel2=\u0020→
-
-# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed
-# in the functions search panel as a separator between function's inferred name
-# and its real name (if available).
-functionSearchSeparatorLabel=←
-
 # LOCALIZATION NOTE(gotoLineModal.placeholder): The placeholder
 # text displayed when the user searches for specific lines in a file
 gotoLineModal.placeholder=Go to line…
@@ -933,6 +962,7 @@ gotoLineModal.key2=CmdOrCtrl+;
 # go to line modal
 # Do not localize "Ctrl+G", or change the format of the string. These are
 # key identifiers, not messages displayed to the user.
+gotoLineModal.key3=Ctrl + G
 
 # LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder
 # text displayed when the user searches for functions in a file
@@ -973,12 +1003,6 @@ symbolSearch.searchModifier.wholeWord=Whole word
 # resumed first.
 resumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S
 
-variablesViewOptimizedOut=(optimized away)
-variablesViewUninitialized=(uninitialized)
-variablesViewMissingArgs=(unavailable)
-
-anonymousSourcesLabel=Anonymous Sources
-
 experimental=This is an experimental feature
 
 # LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed
@@ -1002,6 +1026,17 @@ whyPaused.exception=Paused on exception
 # in a info block explaining how the debugger is currently paused on a
 # DOM mutation breakpoint
 
+# LOCALIZATION NOTE (whyPaused.mutationBreakpointAdded): The text that
+# is displayed to describe an added node which triggers a subtree modification
+whyPaused.mutationBreakpointAdded=Bætt við:
+
+# LOCALIZATION NOTE (whyPaused.mutationBreakpointRemoved): The text that
+# is displayed to describe a removed node which triggers a subtree modification
+
+# LOCALIZATION NOTE (whyPaused.interrupted): The text that is displayed
+# in a info block explaining how the debugger is currently paused at
+# a JS execution
+
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1021,11 +1056,23 @@ whyPaused.breakpointConditionThrown=Error with conditional breakpoint
 # xml http request
 whyPaused.xhr=Paused on XMLHttpRequest
 
+# LOCALIZATION NOTE (whyPaused.XHR): The text that is displayed
+# in a info block explaining how the debugger is currently paused on an
+# xml http request
+
 # LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed
 # in a info block explaining how the debugger is currently paused on a
 # promise rejection
 whyPaused.promiseRejection=Paused on promise rejection
 
+# LOCALIZATION NOTE (whyPaused.getWatchpoint): The text that is displayed
+# in a info block explaining how the debugger is currently paused at a
+# watchpoint on an object property
+
+# LOCALIZATION NOTE (whyPaused.setWatchpoint): The text that is displayed
+# in an info block explaining how the debugger is currently paused at a
+# watchpoint on an object property
+
 # LOCALIZATION NOTE (whyPaused.assert): The text that is displayed
 # in a info block explaining how the debugger is currently paused on an
 # assert
@@ -1050,6 +1097,10 @@ ctrl=Ctrl
 # anonymous.
 anonymousFunction=<anonymous>
 
+# LOCALIZATION NOTE (stacktrace.asyncStack): this string is used to
+# indicate that a given stack frame has an async parent.
+# %S is the "Async Cause" of the frame.
+
 # LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing
 # keyboard shortcut action for toggling breakpoint
 shortcuts.toggleBreakpoint=Toggle Breakpoint
@@ -1116,6 +1167,91 @@ shortcuts.functionSearch=Function Search
 # keyboard shortcut button text
 shortcuts.buttonName=Flýtilyklar
 
+# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed
+# in the variables list as a separator between the name and value.
+variablesSeparatorLabel=:
+
+# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed
+# in the watch expressions list as a separator between the code and evaluation.
+watchExpressionsSeparatorLabel2=\u0020→
+
+# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed
+# in the functions search panel as a separator between function's inferred name
+# and its real name (if available).
+functionSearchSeparatorLabel=←
+
+variablesViewOptimizedOut=(optimized away)
+variablesViewUninitialized=(uninitialized)
+variablesViewMissingArgs=(unavailable)
+
+anonymousSourcesLabel=Anonymous Sources
+
+# LOCALIZATION NOTE (variablesDomNodeValueTooltip): The text that is displayed
+# in a tooltip on the "open in inspector" button in the the variables list for a
+# DOMNode item.
+variablesDomNodeValueTooltip=Click to select the node in the inspector
+
+# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed
+# in the variables list on a getter or setter which can be edited.
+variablesEditButtonTooltip=Click to set value
+
+# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is
+# shown before the stack trace in an error.
+variablesViewErrorStacktrace=Stack trace:
+
+# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed
+# when you have an object preview that does not show all of the elements. At the end of the list
+# you see "N more..." in the web console output.
+# This is a semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of remaining items in the object
+# example: 3 more…
+variablesViewMoreObjects=#1 more…;#1 more…
+
+# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed
+# in the variables list on an item with an editable name.
+variablesEditableNameTooltip=Double click to edit
+
+# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed
+# in the variables list on an item with an editable value.
+variablesEditableValueTooltip=Click to change value
+
+# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed
+# in the variables list on an item which can be removed.
+variablesCloseButtonTooltip=Click to remove
+
+# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed
+# in the variables list on certain variables or properties as tooltips.
+# Explanations of what these represent can be found at the following links:
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
+# It's probably best to keep these in English.
+configurableTooltip=configurable
+enumerableTooltip=enumerable
+writableTooltip=writable
+frozenTooltip=frozen
+sealedTooltip=sealed
+extensibleTooltip=extensible
+overriddenTooltip=overridden
+WebIDLTooltip=WebIDL
+
+# LOCALIZATION NOTE (serviceWorkerInfo.parsed): State displayed for a service
+# worker that has been parsed.
+# LOCALIZATION NOTE (serviceWorkerInfo.installing): State displayed for a
+# service worker that is being installed.
+# LOCALIZATION NOTE (serviceWorkerInfo.installed): State displayed for a
+# service worker that has finished being installed.
+# LOCALIZATION NOTE (serviceWorkerInfo.activating): State displayed for a
+# service worker that is being activated.
+# LOCALIZATION NOTE (serviceWorkerInfo.activated): State displayed for a
+# service worker that has finished being activated.
+# LOCALIZATION NOTE (serviceWorkerInfo.redundant): State displayed for a
+# service worker that is redundant.
+# LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
+# service worker that is in an unknown state.
+
 # LOCALIZATION NOTE (collapseSources): This is the tooltip for the button
 # that collapses the Sources and Outlines panes in the debugger UI.
 collapseSources=Collapse Sources and Outline panes
@@ -1154,9 +1290,6 @@ expandSources=Expand Sources and Outline panes
 # LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button
 # that expands the Breakpoints panes in the debugger UI.
 expandBreakpoints=Expand Breakpoints pane
-# LOCALIZATION NOTE (undoSkipPausingTooltip.label): The tooltip text for enabling all
-# breakpoints and pausing triggers
-undoSkipPausingTooltip.label=Activate breakpoints
 # LOCALIZATION NOTE (pauseOnCaughtExceptionsItem): The pause on exceptions checkbox description
 # when the debugger should pause on caught exceptions
 pauseOnCaughtExceptionsItem=Pause on caught exceptions
@@ -1206,9 +1339,6 @@ inlinePreview.show.label=Show inline preview
 # LOCALIZATION NOTE (inlinePreview.hide.label): Context menu item
 # for hiding the inline preview block
 inlinePreview.hide.label=Hide inline preview
-# LOCALIZATION NOTE (preview.noProperties): Label shown in the preview
-# popup when there are no properties to show.
-preview.noProperties=No properties
 # LOCALIZATION NOTE (xhrBreakpoints.item.label): message displayed when reaching a breakpoint for XHR requests. %S is replaced by the path provided as condition for the breakpoint.
 xhrBreakpoints.item.label=URL contains “%S”
 # LOCALIZATION NOTE (pauseOnAnyXHR): The pause on any XHR checkbox description
@@ -1231,11 +1361,9 @@ watchpoints.removeWatchpointTooltip=Remove watchpoint
 # LOCALIZATION NOTE (blackboxContextItem.blackbox): Text associated
 # with the blackbox context menu item
 blackboxContextItem.blackbox=Blackbox source
-blackboxContextItem.blackbox.accesskey=B
 # LOCALIZATION NOTE (blackboxContextItem.unblackbox): Text associated
 # with the unblackbox context menu item
 blackboxContextItem.unblackbox=Unblackbox source
-blackboxContextItem.unblackbox.accesskey=U
 # LOCALIZATION NOTE (sourceFooter.currentCursorPosition): Text associated
 # with the current cursor line and column
 sourceFooter.currentCursorPosition=(%1$S, %2$S)
@@ -1248,13 +1376,9 @@ scopes.mapping.label=Map original variable names
 # LOCALIZATION NOTE (eventlisteners.log.label): Event listeners tooltip for
 # checkbox and label
 eventlisteners.log.label=Log events to the console
-# LOCALIZATION NOTE (eventlisteners.log): Checkbox label for logging events
-eventlisteners.log=Log
 # LOCALIZATION NOTE (scopes.helpTooltip.label): Scopes right sidebar pane
 # icon tooltip for link to MDN
 scopes.helpTooltip.label=Learn more about map scopes
-# LOCALIZATION NOTE (scopes.map.label): Checkbox label to map scopes
-scopes.map.label=Map
 # LOCALIZATION NOTE (welcome.search2): The center pane welcome panel's
 # search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on
 # a mac we use the unicode character.
@@ -1263,11 +1387,6 @@ welcome.search2=%S Go to file
 # search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on
 # a mac we use the unicode character.
 welcome.findInFiles2=%S Find in files
-# LOCALIZATION NOTE(gotoLineModal.key3): The shortcut for opening the
-# go to line modal
-# Do not localize "Ctrl+G", or change the format of the string. These are
-# key identifiers, not messages displayed to the user.
-gotoLineModal.key3=Ctrl+G
 # LOCALIZATION NOTE (whyPaused.eventBreakpoint): The text that is displayed
 # in a info block explaining how the debugger is currently paused on an event
 # breakpoint.
@@ -1276,9 +1395,6 @@ whyPaused.eventBreakpoint=Paused on event breakpoint
 # in a info block explaining how the debugger is currently paused on a
 # DOM mutation breakpoint
 whyPaused.mutationBreakpoint=Paused on DOM mutation
-# LOCALIZATION NOTE (whyPaused.mutationBreakpointAdded): The text that
-# is displayed to describe an added node which triggers a subtree modification
-whyPaused.mutationBreakpointAdded=Added:
 # LOCALIZATION NOTE (whyPaused.mutationBreakpointRemoved): The text that
 # is displayed to describe a removed node which triggers a subtree modification
 whyPaused.mutationBreakpointRemoved=Removed:
diff --git a/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl
index b5f5466a1e5f..df3b1fbabc86 100644
--- a/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/is/localization/is/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Setja inn viðbót frá skrá…
     .accesskey = i
 help-button = Viðbótastuðningur
+sidebar-help-button-title =
+    .title = Viðbótastuðningur
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } Valmynd
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Verkfæri fyrir allar viðbætur
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } Valmynd
+           *[other] { -brand-short-name } Valkostir
+        }
 show-unsigned-extensions-button =
     .label = Ekki tókst að staðfesta sumar viðbætur
 show-all-extensions-button =
@@ -146,12 +154,26 @@ extensions-view-available-updates =
     .name = Fáanlegar uppfærslur
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-extension = Viðbætur
+addon-category-extension-title =
+    .title = Viðbætur
 addon-category-theme = Þema
+addon-category-theme-title =
+    .title = Þema
 addon-category-plugin = Tengiforrit
+addon-category-plugin-title =
+    .title = Tengiforrit
 addon-category-dictionary = Orðabækur
+addon-category-dictionary-title =
+    .title = Orðabækur
 addon-category-locale = Tungumál
+addon-category-locale-title =
+    .title = Tungumál
 addon-category-available-updates = Fáanlegar uppfærslur
+addon-category-available-updates-title =
+    .title = Fáanlegar uppfærslur
 addon-category-recent-updates = Nýlegar uppfærslur
+addon-category-recent-updates-title =
+    .title = Nýlegar uppfærslur
 
 ## These are global warnings
 
@@ -271,6 +293,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Sýna minna
 go-back-button =
     .tooltiptext = Til baka
+header-back-button =
+    .title = Til baka
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/is/localization/is/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/is/localization/is/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..c0a6e7cc0cf1
--- /dev/null
+++ b/thunderbird-l10n/is/localization/is/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,10 @@
+# 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/.
+
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Loka
+           *[other] Hætta
+        }
diff --git a/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl b/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl
index 86a402cb883c..e08eee1bebb1 100644
--- a/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl
+++ b/thunderbird-l10n/is/localization/is/toolkit/intl/languageNames.ftl
@@ -188,6 +188,7 @@ language-name-tlh = Klingónska
 language-name-tn = Tsvana
 language-name-to = Tonga
 language-name-tr = Tyrkneska
+language-name-trs = Triqui
 language-name-ts = Tonganska
 language-name-tt = Tatarska
 language-name-tw = Tví
diff --git a/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl b/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl
index 7c5a30c2acb8..0f9efd5c5148 100644
--- a/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl
+++ b/thunderbird-l10n/is/localization/is/toolkit/printing/printPreview.ftl
@@ -12,7 +12,7 @@ printpreview-simplify-page-checkbox-enabled =
     .tooltiptext = Breyta útliti til að auðveldara sé að lesa
 printpreview-close =
     .label = Loka
-    .accesskey = o
+    .accesskey = L
 printpreview-portrait =
     .label = Skammsnið
     .accesskey = S
@@ -25,14 +25,15 @@ printpreview-scale =
 printpreview-shrink-to-fit =
     .label = Minnka svo passi á síðu
 printpreview-custom =
-    .label = Sérsniðið…
+    .label = Sérsnið…
 printpreview-print =
     .label = Prenta…
     .accesskey = P
 printpreview-of =
     .value = af
 printpreview-custom-prompt =
-    .value = Skali…
+    .value = Sérsniðinn skali…
+printpreview-custom-scale-prompt-title = Sérsniðinn skali
 printpreview-page-setup =
     .label = Uppsetning síðu…
     .accesskey = U
diff --git a/thunderbird-l10n/is/manifest.json b/thunderbird-l10n/is/manifest.json
index d4150f92b82f..41638723bd1b 100644
--- a/thunderbird-l10n/is/manifest.json
+++ b/thunderbird-l10n/is/manifest.json
@@ -1,57 +1,57 @@
 {
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-is@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
-    }
-  },
+  "description": "Language pack for Thunderbird for is",
   "author": "mozilla.org",
-  "version": "76.0buildid20200407173003",
-  "manifest_version": 2,
-  "langpack_id": "is",
+  "name": "Icelandic (IS) Language Pack",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "langpack_id": "is",
+  "version": "76.0buildid20200420212409",
+  "applications": {
+    "gecko": {
+      "id": "langpack-is@thunderbird.mozilla.org",
+      "strict_min_version": "76.0",
+      "strict_max_version": "76.*"
+    }
+  },
   "languages": {
     "is": {
-      "version": "20200403075109",
+      "version": "20200420122433",
       "chrome_resources": {
-        "branding": "chrome/is/locale/is/branding/",
-        "devtools": "chrome/is/locale/is/devtools/client/",
-        "messenger-newsblog": "chrome/is/locale/is/messenger-newsblog/",
-        "messenger-smime": "chrome/is/locale/is/messenger-smime/",
-        "messenger-region": "chrome/is/locale/is/messenger-region/",
-        "messenger": "chrome/is/locale/is/messenger/",
-        "passwordmgr": "chrome/is/locale/is/passwordmgr/",
-        "devtools-startup": "chrome/is/locale/is/devtools/startup/",
-        "necko": "chrome/is/locale/is/necko/",
-        "pippki": "chrome/is/locale/is/pippki/",
-        "mozapps": "chrome/is/locale/is/mozapps/",
-        "messenger-mapi": "chrome/is/locale/is/messenger-mapi/",
         "communicator": "chrome/is/locale/is/communicator/",
-        "mozldap": "chrome/is/locale/is/mozldap/",
+        "pluginproblem": "chrome/is/locale/is/pluginproblem/",
+        "calendar": "chrome/is/locale/is/calendar/",
+        "chat": "chrome/is/locale/is/chat/",
+        "autoconfig": "chrome/is/locale/is/autoconfig/",
+        "pipnss": "chrome/is/locale/is/pipnss/",
+        "devtools-shared": "chrome/is/locale/is/devtools/shared/",
+        "messenger": "chrome/is/locale/is/messenger/",
+        "alerts": "chrome/is/locale/is/alerts/",
         "global-platform": {
           "linux": "chrome/is/locale/is/global-platform/unix/",
-          "win": "chrome/is/locale/is/global-platform/win/",
+          "android": "chrome/is/locale/is/global-platform/unix/",
           "macosx": "chrome/is/locale/is/global-platform/mac/",
-          "android": "chrome/is/locale/is/global-platform/unix/"
+          "win": "chrome/is/locale/is/global-platform/win/"
         },
-        "devtools-shared": "chrome/is/locale/is/devtools/shared/",
-        "lightning": "chrome/is/locale/is/lightning/",
+        "passwordmgr": "chrome/is/locale/is/passwordmgr/",
+        "messenger-smime": "chrome/is/locale/is/messenger-smime/",
+        "branding": "chrome/is/locale/is/branding/",
+        "messenger-mapi": "chrome/is/locale/is/messenger-mapi/",
+        "mozapps": "chrome/is/locale/is/mozapps/",
         "places": "chrome/is/locale/is/places/",
-        "calendar": "chrome/is/locale/is/calendar/",
-        "pipnss": "chrome/is/locale/is/pipnss/",
-        "chat": "chrome/is/locale/is/chat/",
-        "pluginproblem": "chrome/is/locale/is/pluginproblem/",
-        "alerts": "chrome/is/locale/is/alerts/",
-        "autoconfig": "chrome/is/locale/is/autoconfig/",
-        "global": "chrome/is/locale/is/global/"
+        "mozldap": "chrome/is/locale/is/mozldap/",
+        "global": "chrome/is/locale/is/global/",
+        "devtools": "chrome/is/locale/is/devtools/client/",
+        "messenger-region": "chrome/is/locale/is/messenger-region/",
+        "lightning": "chrome/is/locale/is/lightning/",
+        "messenger-newsblog": "chrome/is/locale/is/messenger-newsblog/",
+        "devtools-startup": "chrome/is/locale/is/devtools/startup/",
+        "pippki": "chrome/is/locale/is/pippki/",
+        "necko": "chrome/is/locale/is/necko/"
       }
     }
   },
-  "name": "Icelandic (IS) Language Pack",
-  "description": "Language pack for Thunderbird for is"
+  "manifest_version": 2
 }
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties
index 90b4b70ce54d..8e785ac9c1c8 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/debugger.properties
@@ -255,6 +255,7 @@ pauseOnAnyXHR = Sospendi su qualunque XHR
 watchpoints.submenu = Sospendi su…
 watchpoints.getWatchpoint = Lettura proprietà
 watchpoints.setWatchpoint = Impostazione proprietà
+watchpoints.getOrSetWatchpoint = Imposta o leggi proprietà
 watchpoints.removeWatchpoint = Rimuovi watchpoint
 watchpoints.removeWatchpointTooltip = Rimuovi watchpoint
 sourceTabs.closeTab = Chiudi scheda
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties
index 0fd39a10d92f..2650e510f559 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/layout.properties
@@ -22,9 +22,9 @@ flexbox.itemSizing.finalSizeSectionHeader = Dimensione finale
 flexbox.itemSizing.itemContentSize = Dimensione contenuto
 flexbox.itemSizing.clampedToMax = L’elemento è stato bloccato alla sua dimensione massima.
 flexbox.itemSizing.clampedToMin = L’elemento è stato bloccato alla sua dimensione minima.
-flexbox.itemSizing.setToGrow = L’elemento è impostato per allagarsi.
+flexbox.itemSizing.setToGrow = L’elemento è impostato per allargarsi.
 flexbox.itemSizing.setToShrink = L’elemento è impostato per restringersi.
-flexbox.itemSizing.notSetToGrow = L’elemento non è impostato per allagarsi.
+flexbox.itemSizing.notSetToGrow = L’elemento non è impostato per allargarsi.
 flexbox.itemSizing.notSetToShrink = L’elemento non è impostato per restringersi.
 flexbox.togglesFlexboxHighlighter2 = Attiva/disattiva evidenziatore flexbox
 layout.gridDisplaySettings = Impostazioni visualizzazione griglia
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties
index c02a77d28107..40133213793c 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/devtools/client/netmonitor.properties
@@ -363,3 +363,7 @@ netmonitor.cache.fetchCount = Numero letture
 netmonitor.cache.lastFetched = Ultima lettura
 netmonitor.cache.lastModified = Ultima modifica
 netmonitor.cache.device = Dispositivo
+netmonitor.settings.menuTooltip = Impostazioni rete
+netmonitor.settings.importHarTooltip = Importa un file HAR con i dati di rete
+netmonitor.settings.saveHarTooltip = Salva i dati di rete in un file HAR
+netmonitor.settings.copyHarTooltip = Copia i dati di rete negli appunti
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties b/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties
index a36546584972..d7e63bbb94e0 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/global/css.properties
@@ -158,6 +158,7 @@ PESupportsGroupRuleStart = Previsto “{” per iniziare la regola @supports, ri
 PEFilterEOF = filtro
 PEExpectedNoneOrURL = Previsto “none” o URL, invece è stato rilevato “%1$S”.
 PEExpectedNoneOrURLOrFilterFunction = Previsto “none”, URL o una funzione filtro, invece è stato rilevato “%1$S”.
+PEDisallowedImportRule = Le regole @import non sono ancora valide in fogli di stile costruiti.
 PEExpectedNonnegativeNP = Previsto numero non negativo o percentuale.
 PEFilterFunctionArgumentsParsingError = Errore nell’analisi degli argomenti per la funzione filtro.
 PEVariableEOF = variabile
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties b/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties
index a40493b5f89a..65f6f61237dc 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/global/dom/dom.properties
@@ -156,10 +156,10 @@ InterceptedNonResponseWithURL = Impossibile caricare “%1$S”. Un ServiceWorke
 PrefixedImageSmoothingEnabledWarning = L’utilizzo di mozImageSmoothingEnabled è deprecato. Al suo posto utilizzare la proprietà senza prefisso imageSmoothingEnabled.
 ServiceWorkerScopePathMismatch = Registrazione del ServiceWorker non riuscita: il percorso “%1$S” fornito per l’ambito non è incluso nell’ambito massimo consentito “%2$S”. Correggere l’ambito, spostare lo script del service worker o utilizzare l’header HTTP Service-Worker-Allowed per consentire l’ambito.
 ServiceWorkerRegisterNetworkError = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: caricamento non riuscito con stato “%2$S” per lo script “%3$S”.
-ServiceWorkerRegisterStorageError = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
-ServiceWorkerGetRegistrationStorageError = Impossibile ottenere la registrazione del service worker: l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
-ServiceWorkerGetClientStorageError = Impossibile ottenere i client del service worker: l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
-ServiceWorkerPostMessageStorageError = Il ServiceWorker per l’ambito “%S” non ha potuto eseguire “postMessage” in quanto l’accesso allo storage è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
+ServiceWorkerRegisterStorageError = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
+ServiceWorkerGetRegistrationStorageError = Impossibile ottenere la registrazione del service worker: l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
+ServiceWorkerGetClientStorageError = Impossibile ottenere i client del service worker: l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
+ServiceWorkerPostMessageStorageError = Il ServiceWorker per l’ambito “%S” non ha potuto eseguire “postMessage” in quanto l’accesso alle risorse di archiviazione è limitato dalle impostazioni utente o dalla modalità Navigazione anonima.
 ServiceWorkerRegisterMimeTypeError2 = Registrazione/aggiornamento del ServiceWorker non riuscito per l’ambito “%1$S”: ricevuto Content-Type errato “%2$S” per lo script “%3$S”. Deve essere un tipo MIME JavaScript.
 ServiceWorkerGraceTimeoutTermination = Il ServiceWorker per l’ambito “%1$S” con waitUntil/respondWith promise in sospeso è stato interrotto per grace timeout.
 ServiceWorkerNoFetchHandler = I gestori degli eventi fetch devono essere aggiunti durante la valutazione iniziale dello script del worker.
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties b/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties
index 9752c7551c97..d3b62f36fcda 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/global/security/security.properties
@@ -85,6 +85,8 @@ ReferrerOriginLengthOverLimitation = Header HTTP Referrer: la lunghezza dell’o
 XFOInvalid = X-Frame-Options non valido: header “%1$S” da “%2$S” caricato in “%3$S”.
 XFODeny = Caricamento negato da X-Frame-Options: “%1$S” da “%2$S”, il sito non consente framing. Tentativo di caricamento in “%3$S”.
 XFOSameOrigin = Caricamento negato da X-Frame-Options: “%1$S” da “%2$S”, il sito non consente framing cross-origin da “%3$S”.
+XFrameOptionsInvalid = Rilevato header X-Frame-Options non valido durante il caricamento di “%2$S”: “%1$S” non è una direttiva valida.
+XFrameOptionsDeny = Il caricamento di “%2$S” in un riquadro è vietato dalla direttiva “X-Frame-Options“ impostata a “%1$S“.
 HTTPSOnlyUpgradeRequest = Aggiornamento della richiesta non sicura da “%1$S” a “%2$S”.
 HTTPSOnlyNoUpgradeException = Richiesta non sicura “%1$S” non aggiornata in quanto esentata.
 HTTPSOnlyFailedRequest = Aggiornamento della richiesta non sicura “%1$S” non riuscito. (%2$S)
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd b/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd
index 161439bdd9e9..c4c232b15b81 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd
+++ b/thunderbird-l10n/it/chrome/it/locale/it/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Cerca messaggi…">
 <!ENTITY searchMailCmd.accesskey "m">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Ricerca globale…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Cerca indirizzi…">
 <!ENTITY searchAddressesCmd.accesskey "C">
 
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties b/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties
index b08650e6c4b2..93cc06eecb50 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/messenger/pgpmime.properties
@@ -2,4 +2,13 @@
 # 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/.
 
-pgpMimeNeedsAddon = Questo è un messaggio cifrato OpenPGP.<br>Per decrittare questo messaggio si deve installare un <a href="%S">add-on OpenPGP</a>.
+#
+# The following are used by the pgpmime content type handler
+#
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+# %S is the url to Enigmail on AMO supplied from preferences.
+pgpMimeNeedsAddon=Questo è un messaggio cifrato OpenPGP.<br>Per decrittare questo messaggio si deve installare un <a href="%S">add-on OpenPGP</a>.
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Questo è un messaggio OpenPGP crittato, ma il supporto per la decrittazione OpenPGP non è disponibile.
diff --git a/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties b/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties
index eaf17c7c19cb..52cd82502282 100644
--- a/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties
+++ b/thunderbird-l10n/it/chrome/it/locale/it/necko/necko.properties
@@ -29,14 +29,15 @@ SuperfluousAuth = Ci si sta autenticando sul sito “%1$S” con nome utente “
 AutomaticAuth = Ci si sta autenticando sul sito “%1$S” con nome utente “%2$S”.
 TrackerUriBlocked = La risorsa “%1$S” è stata bloccata in quanto è attivo il blocco contenuti.
 UnsafeUriBlocked = La risorsa “%1$S” è stata bloccata dal servizio Safe Browsing.
-CookieBlockedByPermission = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata da permessi personalizzati per i cookie.
-CookieBlockedTracker = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata in quanto proviene da un elemento tracciante e il blocco contenuti è attivo.
-CookieBlockedAll = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata in quanto tutte le richieste di accesso allo spazio di archiviazione sono bloccate.
-CookieBlockedForeign = La richiesta di accedere a cookie e spazio di archiviazione (storage) per “%1$S” è stata bloccata in quanto tutte le richieste di accesso di terze parti allo spazio di archiviazione sono bloccate e il blocco contenuti è attivo.
-CookieAllowedForOriginOnTrackerByStorageAccessAPI = Consentito accesso allo spazio di archiviazione (storage) per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”.
-CookieAllowedForTrackerByStorageAccessAPI = Consentito accesso allo spazio di archiviazione (storage) per elemento tracciante “%2$S” su “%1$S”.
-CookieAllowedForOriginOnTrackerByHeuristic = Consentito automaticamente accesso allo spazio di archiviazione (storage) per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”.
-CookieAllowedForTrackerByHeuristic = Consentito automaticamente accesso allo spazio di archiviazione (storage) per elemento tracciante “%2$S” su “%1$S”.
+CookieBlockedByPermission = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata da permessi personalizzati per i cookie.
+CookieBlockedTracker = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata in quanto proviene da un elemento tracciante e il blocco contenuti è attivo.
+CookieBlockedAll = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata in quanto tutte le richieste di accesso alle risorse di archiviazione sono bloccate.
+CookieBlockedForeign = La richiesta di accedere a cookie e risorse di archiviazione per “%1$S” è stata bloccata in quanto tutte le richieste di accesso di terze parti alle risorse di archiviazione sono bloccate e il blocco contenuti è attivo.
+CookieAllowedForOriginOnTrackerByStorageAccessAPI = Consentito accesso alle risorse di archiviazione per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”.
+CookieAllowedForTrackerByStorageAccessAPI = Consentito accesso alle risorse di archiviazione per elemento tracciante “%2$S” su “%1$S”.
+CookieAllowedForOriginOnTrackerByHeuristic = Consentito automaticamente accesso alle risorse di archiviazione per “%3$S” aperto da elemento tracciante “%2$S” su “%1$S”.
+CookieAllowedForTrackerByHeuristic = Consentito automaticamente accesso alle risorse di archiviazione per elemento tracciante “%2$S” su “%1$S”.
+CookieAllowedForFpiByHeuristic = Accesso alle risorse di archiviazione garantito automaticamente per isolamento First-Party “%2$S” su “%1$S”.
 CookieRejectedNonRequiresSecure = Cookie “%1$S” rifiutato in quanto include l’attributo “sameSite=none” ma manca l’attributo “secure”.
 CookieRejectedNonRequiresSecureForBeta = Il cookie “%1$S” verrà presto rifiutato in quanto l’attributo “sameSite” è impostato a “none” o un valore non valido, senza l’attributo “secure”. Per ulteriori informazioni sull’attributo “sameSite”, consultare %2$S
 CookieLaxForced = Il criterio “sameSite” è impostato a “lax” per il cookie “%1$S” in quanto manca l’attributo “sameSite”. “sameSite=lax” è il valore predefinito per questo attributo.
diff --git a/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl b/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl
index 79d15caf2f8f..9f5b72a4369a 100644
--- a/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/it/localization/it/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Benvenuto in { -brand-full-name }
+account-settings = Impostazioni account
+#   $accounts (Number) - the number of configured accounts
 setup-title = Scegli che cosa vuoi configurare
 about-title = Informazioni su { -brand-full-name }
 resources-title = Risorse
@@ -40,3 +42,10 @@ explore-link = Scopri le funzionalità
 support-link = Supporto
 involved-link = Collabora con noi
 developer-link = Documentazione per sviluppatori
+read = Leggi messaggi
+compose = Scrivi un nuovo messaggio
+search = Cerca tra i messaggi
+filter = Gestisci i filtri per i messaggi
+nntp-subscription = Gestisci le sottoscrizioni ai gruppi di discussione
+rss-subscription = Gestisci le sottoscrizioni ai feed
+e2e = Crittografia end-to-end
diff --git a/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl
index 7dd8f99e9eaa..2e6bccd86835 100644
--- a/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/it/localization/it/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Installa componente aggiuntivo da file…
     .accesskey = I
 help-button = Supporto componenti aggiuntivi
+sidebar-help-button-title =
+    .title = Supporto componenti aggiuntivi
 preferences =
     { PLATFORM() ->
         [windows] Opzioni di { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Strumenti per tutti i componenti aggiuntivi
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opzioni di { -brand-short-name }
+           *[other] Preferenze di { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Non è stato possibile verificare alcune estensioni
 show-all-extensions-button =
@@ -167,13 +175,29 @@ extensions-view-available-updates =
     .name = Aggiornamenti disponibili
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Consigli
+addon-category-discover-title =
+    .title = Consigli
 addon-category-extension = Estensioni
+addon-category-extension-title =
+    .title = Estensioni
 addon-category-theme = Temi
+addon-category-theme-title =
+    .title = Temi
 addon-category-plugin = Plugin
+addon-category-plugin-title =
+    .title = Plugin
 addon-category-dictionary = Dizionari
+addon-category-dictionary-title =
+    .title = Dizionari
 addon-category-locale = Lingue
+addon-category-locale-title =
+    .title = Lingue
 addon-category-available-updates = Aggiornamenti disponibili
+addon-category-available-updates-title =
+    .title = Aggiornamenti disponibili
 addon-category-recent-updates = Aggiornamenti recenti
+addon-category-recent-updates-title =
+    .title = Aggiornamenti recenti
 
 ## These are global warnings
 
@@ -286,6 +310,7 @@ shortcuts-no-commands = Le seguenti estensioni non hanno scorciatoie da tastiera
 shortcuts-input =
     .placeholder = Inserisci una scorciatoia
 shortcuts-browserAction = Attiva estensione
+shortcuts-browserAction2 = Attiva pulsante nella barra degli strumenti
 shortcuts-pageAction = Attiva azione pagina
 shortcuts-sidebarAction = Attiva/disattiva barra laterale
 shortcuts-modifier-mac = Includi Ctrl, Alt o ⌘
@@ -304,6 +329,8 @@ shortcuts-card-expand-button = Visualizza altre { $numberToShow }
 shortcuts-card-collapse-button = Mostra meno scorciatoie
 go-back-button =
     .tooltiptext = Torna indietro
+header-back-button =
+    .title = Torna indietro
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl
index 0415afe624ed..669e5aafb8e8 100644
--- a/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/it/localization/it/toolkit/about/aboutSupport.ftl
@@ -300,6 +300,7 @@ touch-enabled = input touch attivo
 drag-enabled = trascinamento barre di scorrimento attivo
 keyboard-enabled = tastiera attiva
 autoscroll-enabled = scorrimento automatico attivo
+zooming-enabled = smooth pinch-zoom attivo
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl b/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl
index d684311e75c9..796e80713c5b 100644
--- a/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/it/localization/it/toolkit/about/certviewer.ftl
@@ -16,6 +16,9 @@ certificate-viewer-certificate-authority = Autorità di certificazione
 certificate-viewer-cipher-suite = Suite di cifratura
 certificate-viewer-common-name = Nome comune
 certificate-viewer-email-address = Indirizzo email
+# Variables:
+#   $firstCertName (String) - Common Name for the displayed certificate
+certificate-viewer-tab-title = Certificato per { $firstCertName }
 # Inc. means Incorporated, e.g GitHub is incorporated in Delaware
 certificate-viewer-inc-country = Paese di costituzione
 certificate-viewer-country = Paese
@@ -96,3 +99,18 @@ certificate-viewer-download-pem = PEM (certificato)
   .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (catena)
   .download = { $fileName }-catena.pem
+
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+  .title = Questa estensione è stata contrassegnata come critica. Questo significa che un client deve rifiutare il certificato se non è in grado di interpretarla.
+
+certificate-viewer-export = Esporta
+  .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Certificati personali
+certificate-viewer-tab-people = Persone
+certificate-viewer-tab-servers = Server
+certificate-viewer-tab-ca = Autorità
+certificate-viewer-tab-unkonwn = Sconosciuti
diff --git a/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl b/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl
index 4c0b8d923843..585b41724d8e 100644
--- a/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/it/localization/it/toolkit/global/processTypes.ftl
@@ -11,3 +11,4 @@ process-type-file = File locale
 process-type-weblargeallocation = Allocazione di grandi dimensioni
 process-type-webisolated = Contenuti web isolati
 process-type-gpu = GPU
+process-type-socket = Socket
diff --git a/thunderbird-l10n/it/localization/it/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/it/localization/it/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..cf5738b1d93c
--- /dev/null
+++ b/thunderbird-l10n/it/localization/it/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,13 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Stai utilizzando una versione più vecchia di { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Crea un nuovo profilo
+profiledowngrade-sync = L’utilizzo di una versione più vecchia di { -brand-product-name } può danneggiare segnalibri e cronologia di navigazione già salvati in un profilo esistente di { -brand-product-name }. Per proteggere queste informazioni, creare un nuovo profilo per questa installazione di { -brand-short-name }. È possibile utilizzare un { -fxaccount-brand-name } per sincronizzare segnalibri e cronologia di navigazione tra profili diversi.
+profiledowngrade-nosync = L’utilizzo di una versione più vecchia di { -brand-product-name } può danneggiare segnalibri e cronologia di navigazione già salvati in un profilo esistente di { -brand-product-name }. Per proteggere queste informazioni, creare un nuovo profilo per questa installazione di { -brand-short-name }.
+profiledowngrade-quit =
+    .label = Esci
diff --git a/thunderbird-l10n/it/localization/it/toolkit/updates/elevation.ftl b/thunderbird-l10n/it/localization/it/toolkit/updates/elevation.ftl
new file mode 100644
index 000000000000..7480eddd9aec
--- /dev/null
+++ b/thunderbird-l10n/it/localization/it/toolkit/updates/elevation.ftl
@@ -0,0 +1,14 @@
+# 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/.
+# This is temporary until bug 1521632 is fixed
+
+elevation-update-wizard =
+    .title = Aggiornamento software
+elevation-details-link-label =
+    .value = Dettagli
+elevation-error-manual = È possibile aggiornare { -brand-short-name } manualmente visitando il seguente link e scaricando l’ultima versione:
+elevation-finished-page = Aggiornamento pronto per l’installazione
+elevation-finished-background-page = È stato scaricato ed è pronto per l’installazione un aggiornamento per migliorare la stabilità e la sicurezza di { -brand-short-name }.
+elevation-finished-background = Aggiornamento:
+elevation-more-elevated = L’installazione di questo aggiornamento richiede privilegi di amministratore e verrà effettuata al prossimo avvio di { -brand-short-name }. È possibile riavviare { -brand-short-name } adesso, proseguire con il proprio lavoro e riavviarlo più tardi, oppure annullare l’aggiornamento.
diff --git a/thunderbird-l10n/it/manifest.json b/thunderbird-l10n/it/manifest.json
index 3a8dc5125c8f..297045185652 100644
--- a/thunderbird-l10n/it/manifest.json
+++ b/thunderbird-l10n/it/manifest.json
@@ -1,48 +1,50 @@
 {
+  "manifest_version": 2,
+  "author": "mozilla.org (contributors: Roberto Principiano)",
+  "langpack_id": "it",
   "languages": {
     "it": {
       "chrome_resources": {
-        "branding": "chrome/it/locale/it/branding/",
+        "messenger-smime": "chrome/it/locale/it/messenger-smime/",
+        "places": "chrome/it/locale/it/places/",
+        "communicator": "chrome/it/locale/it/communicator/",
+        "global": "chrome/it/locale/it/global/",
+        "passwordmgr": "chrome/it/locale/it/passwordmgr/",
         "messenger-newsblog": "chrome/it/locale/it/messenger-newsblog/",
-        "global-platform": {
-          "linux": "chrome/it/locale/it/global-platform/unix/",
-          "macosx": "chrome/it/locale/it/global-platform/mac/",
-          "android": "chrome/it/locale/it/global-platform/unix/",
-          "win": "chrome/it/locale/it/global-platform/win/"
-        },
         "devtools-shared": "chrome/it/locale/it/devtools/shared/",
+        "necko": "chrome/it/locale/it/necko/",
+        "autoconfig": "chrome/it/locale/it/autoconfig/",
+        "alerts": "chrome/it/locale/it/alerts/",
         "pipnss": "chrome/it/locale/it/pipnss/",
-        "messenger-region": "chrome/it/locale/it/messenger-region/",
         "mozldap": "chrome/it/locale/it/mozldap/",
-        "global": "chrome/it/locale/it/global/",
-        "lightning": "chrome/it/locale/it/lightning/",
-        "necko": "chrome/it/locale/it/necko/",
-        "passwordmgr": "chrome/it/locale/it/passwordmgr/",
-        "communicator": "chrome/it/locale/it/communicator/",
-        "places": "chrome/it/locale/it/places/",
         "calendar": "chrome/it/locale/it/calendar/",
+        "pluginproblem": "chrome/it/locale/it/pluginproblem/",
+        "chat": "chrome/it/locale/it/chat/",
         "pippki": "chrome/it/locale/it/pippki/",
-        "alerts": "chrome/it/locale/it/alerts/",
         "messenger-mapi": "chrome/it/locale/it/messenger-mapi/",
-        "chat": "chrome/it/locale/it/chat/",
-        "messenger-smime": "chrome/it/locale/it/messenger-smime/",
+        "global-platform": {
+          "android": "chrome/it/locale/it/global-platform/unix/",
+          "linux": "chrome/it/locale/it/global-platform/unix/",
+          "win": "chrome/it/locale/it/global-platform/win/",
+          "macosx": "chrome/it/locale/it/global-platform/mac/"
+        },
+        "devtools-startup": "chrome/it/locale/it/devtools/startup/",
         "mozapps": "chrome/it/locale/it/mozapps/",
-        "autoconfig": "chrome/it/locale/it/autoconfig/",
+        "lightning": "chrome/it/locale/it/lightning/",
+        "branding": "chrome/it/locale/it/branding/",
+        "messenger-region": "chrome/it/locale/it/messenger-region/",
         "devtools": "chrome/it/locale/it/devtools/client/",
-        "devtools-startup": "chrome/it/locale/it/devtools/startup/",
-        "pluginproblem": "chrome/it/locale/it/pluginproblem/",
         "messenger": "chrome/it/locale/it/messenger/"
       },
-      "version": "20200406064310"
+      "version": "20200420155819"
     }
   },
-  "author": "mozilla.org (contributors: Roberto Principiano)",
-  "version": "76.0buildid20200407173003",
+  "description": "Language pack for Thunderbird for it",
   "applications": {
     "gecko": {
-      "strict_min_version": "76.0",
+      "id": "langpack-it@thunderbird.mozilla.org",
       "strict_max_version": "76.*",
-      "id": "langpack-it@thunderbird.mozilla.org"
+      "strict_min_version": "76.0"
     }
   },
   "sources": {
@@ -50,8 +52,6 @@
       "base_path": "browser/"
     }
   },
-  "langpack_id": "it",
-  "description": "Language pack for Thunderbird for it",
-  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
   "name": "Italiano (IT) Language Pack"
 }
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties
index f91ef8e8a7fc..a091cb916925 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/debugger.properties
@@ -55,6 +55,41 @@ setDirectoryRoot.accesskey		=r
 removeDirectoryRoot.label		=ルートディレクトリーを削除
 removeDirectoryRoot.accesskey		=d
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+blackBoxAll.label			=ブラックボックス
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+blackBoxAllInGroup.label		=このグループのファイルをブラックボックス化
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+unblackBoxAllInGroup.label		=このグループのファイルのブラックボックス化を解除
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+blackBoxAllOutsideGroup.label		=このグループ以外のファイルをブラックボックス化
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+unblackBoxAllOutsideGroup.label		=このグループ以外のファイルのブラックボックス化を解除
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+blackBoxAllInDir.label			=このディレクトリーのファイルをブラックボックス化
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+unblackBoxAllInDir.label		=このディレクトリーのファイルのブラックボックス化を解除
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+blackBoxAllOutsideDir.label		=このディレクトリー以外のファイルをブラックボックス化
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+unblackBoxAllOutsideDir.label		=このディレクトリー以外のファイルのブラックボックス化を解除
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label			=関数をコピー
@@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved	=削除:
 # a JS execution
 whyPaused.interrupted			=実行中に停止しました
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause		=記録中に停止しました
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant	=冗長
 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
 # service worker that is in an unknown state.
 serviceWorkerInfo.unknown	=不明
-
-# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
-blackBoxAll.label=Blackbox
-# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected group
-blackBoxAllInGroup.label=Blackbox files in this group
-# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected group
-unblackBoxAllInGroup.label=Unblackbox files in this group
-# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected group
-blackBoxAllOutsideGroup.label=Blackbox files outside this group
-# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected group
-unblackBoxAllOutsideGroup.label=Unblackbox files outside this group
-# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected directory
-blackBoxAllInDir.label=Blackbox files in this directory
-# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected directory
-unblackBoxAllInDir.label=Unblackbox files in this directory
-# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected directory
-blackBoxAllOutsideDir.label=Blackbox files outside this directory
-# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected directory
-unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties
index a25cbedaf044..45771ae55f75 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/inspector.properties
@@ -546,7 +546,11 @@ markupView.scrollableBadge.tooltip	=この要素にはスクロール可能な
 
 # LOCALIZATION NOTE (rulePreviewTooltip.noAssociatedRule): This is the text displayed inside
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
-rulePreviewTooltip.noAssociatedRule	=該当するルールはありません。
+rulePreviewTooltip.noAssociatedRule	=該当するルールはありません
+
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut	=Shift を押しながらクリックすると、ルールに移動します
 
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties
index bc6caba30fa6..16b2857e45c0 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy			=コピー
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll		=すべて展開
 
+jsonViewer.ExpandAllSlow	=すべて展開 (時間がかかります)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll		=すべて折りたたむ
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON		=JSON を検索
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference	=循環参照
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties
index 2f429dbaf606..447cf2be2e87 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/menus.properties
@@ -47,17 +47,17 @@ browserContentToolboxMenu.accesskey	=x
 webide.label				=WebIDE
 webide.accesskey			=W
 
-# LOCALIZATION NOTE (toggleProfilerButtonMenu.label): This is the label for the
-# application menu item that toggles the profiler button to record performance profiles.
-toggleProfilerButtonMenu.label		=プロファイラーツールバーアイコンを有効にする
-toggleProfilerButtonMenu.accesskey	=P
-
 devtoolsWebReplay.label			=Web Replay
 devtoolsRecordNewTab.label		=新しい記録タブを開く
 devtoolsReloadAndRecordTab.label	=再読み込みしてタブを記録
 devtoolsSaveRecording.label		=記録を保存
 devtoolsReplayNewTab.label		=新しいタブに記録を読み込み
 
+# LOCALIZATION NOTE (toggleProfilerButtonMenu.label): This is the label for the
+# application menu item that toggles the profiler button to record performance profiles.
+toggleProfilerButtonMenu.label		=プロファイラーツールバーアイコンを有効にする
+toggleProfilerButtonMenu.accesskey	=P
+
 devToolboxMenuItem.label		=開発ツールを表示
 devToolboxMenuItem.accesskey		=T
 
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties
index ac262869cf1f..07aee6949853 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/netmonitor.properties
@@ -351,6 +351,10 @@ netmonitor.timings.startedAt		=要求開始: %S
 # %S is time expressed in milliseconds or minutes.
 netmonitor.timings.downloadedAt		=ダウンロード開始: %S
 
+# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
+# timings pane when thea request has been blocked
+netmonitor.timings.noTimings		=この要求のタイミング情報はありません
+
 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
 # in the network menu specifying timing interval divisions (in milliseconds).
 networkMenu.millisecond	=%S ms
@@ -761,6 +765,14 @@ netmonitor.ws.context.received			=受信
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey	=R
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+netmonitor.ws.context.controlFrames		=制御
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey	=o
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame			=メッセージをコピー
@@ -781,11 +793,6 @@ netmonitor.ws.type.sent				=送信
 # accessible text for the "received" type icon in the websocket table's "data" column.
 netmonitor.ws.type.received			=受信
 
-# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the
-# time values in the websocket table's "time" column
-# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded)
-netmonitor.ws.time.format			=%1$S.%2$S
-
 # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed
 # in the messages panel identifying the raw data.
 netmonitor.ws.rawData.header			=生データ (%S)
@@ -1022,6 +1029,14 @@ netmonitor.toolbar.resetColumns		=列表示をリセット
 # displayed in the network table header context menu to reset sorting
 netmonitor.toolbar.resetSorting		=並べ替えをリセット
 
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label
+# displayed in the network table header context menu to resize a column to fit its content
+netmonitor.toolbar.resizeColumnToFitContent		=列の幅を内容に合わせる
+
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title
+# tooltip displayed when draggable resizer in network table headers is hovered
+netmonitor.toolbar.resizeColumnToFitContent.title	=ダブルクリックで列の幅を内容に合わせます
+
 # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label
 # displayed in the network table header context menu for the timing submenu
 netmonitor.toolbar.timings		=タイミング
@@ -1518,19 +1533,3 @@ netmonitor.cache.lastModified		=最終更新日時
 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
 # where a cached object was fetched from (e.g. "disk").
 netmonitor.cache.device			=取得元デバイス
-
-# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
-# timings pane when thea request has been blocked
-netmonitor.timings.noTimings=No timings for this request
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
-# on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
-# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label
-# displayed in the network table header context menu to resize a column to fit its content
-netmonitor.toolbar.resizeColumnToFitContent=Resize Column To Fit Content
-# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title
-# tooltip displayed when draggable resizer in network table headers is hovered
-netmonitor.toolbar.resizeColumnToFitContent.title=Double-click to fit column to content
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties
index 6ccfacd3dbb3..a097e5480d85 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/toolbox.properties
@@ -291,22 +291,6 @@ browserToolbox.statusMessage	=ブラウザーツールボックスの接続状
 # shown in the web replay timeline marker
 toolbox.replay.jumpMessage	=メッセージ %1$S に移動
 
-# LOCALIZATION NOTE (toolbox.replay.jumpMessage2): This is the label
-# shown in the web replay timeline marker
-toolbox.replay.jumpMessage2	=%1$S に移動
-
-# LOCALIZATION NOTE (toolbox.replay.resume): This is the text that appears in the
-# Replay command bar to prompt the user to resume the program.
-toolbox.replay.resume		=復帰
-
-# LOCALIZATION NOTE (toolbox.replay.rewind): This is the text that appears in the
-# Replay command bar to prompt the user to rewind the program.
-toolbox.replay.rewind		=巻き戻し
-
-# LOCALIZATION NOTE (toolbox.replay.pause): This is the text that appears in the
-# Replay command bar to prompt the user to pause the program.
-toolbox.replay.pause		=停止
-
 # LOCALIZATION NOTE (toolbox.debugTargetErrorPage.title): This is the title
 # for the Error view shown by the toolbox when a connection to a debug target
 # could not be made
@@ -322,11 +306,6 @@ toolbox.debugTargetErrorPage.description	=デバッグ対象に接続できま
 # This entire text is treated as a link to an MDN page.
 options.deprecationNotice			=非推奨です。詳細...
 
-# LOCALIZATION NOTE (options.experimentalNotice): This is the text that appears in the
-# settings panel for the checkbox that enables Replay.
-# This entire text is treated as a link to an MDN page.
-options.experimentalNotice			=実験的な機能です。詳細...
-
 # LOCALIZATION NOTE (options.enableMultiProcessToolbox): This is the text that appears in the
 # settings panel for the checkbox that enables the Multiprocess Browser Toolbox.
 options.enableMultiProcessToolbox		=マルチプロセスブラウザーツールボックスを有効化 (ブラウザーツールボックスの再起動が必要です)
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties
index e94bfa8b3f6b..164ee7c148c3 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/devtools/client/webconsole.properties
@@ -192,6 +192,12 @@ webconsole.menu.openInNetworkPanel.accesskey	=N
 webconsole.menu.resendNetworkRequest.label	=要求を再送
 webconsole.menu.resendNetworkRequest.accesskey	=n
 
+# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label)
+# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will 
+# reveal that specific DOM Node in the Inspector.
+webconsole.menu.openNodeInInspector.label	=インスペクターで確認
+webconsole.menu.openNodeInInspector.accesskey	=Q
+
 # LOCALIZATION NOTE (webconsole.menu.storeAsGlobalVar.label)
 # Label used for a context-menu item displayed for object/variable logs. Clicking on it
 # creates a new global variable pointing to the logged variable.
@@ -227,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey	=V
 # copies the entire output of the console to the clipboard.
 webconsole.menu.exportClipboard.label	=表示メッセージをクリップボードにエクスポートする
 
+# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
+# Label used for a context-menu item displayed for any log. Clicking on it will
+# jump to the execution point where the log item was generated.
+webconsole.menu.timeWarp.label		=ここに移動
+
+# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
+# Label used for the tooltip on the "jump" button in the console. It's displayed when
+# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
+# message in the console output. Clicking on it will jump to the execution point where the
+# log item was generated.
+# Parameters: %S is the level of the message.
+webconsole.jumpButton.tooltip		=%S - ここに移動
+
 # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label)
 # Label used for a context-menu item displayed on the output. Clicking on it
 # opens a submenu where the user can select how to export messages.
@@ -243,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label	=クリップボード
 # the output of the console.
 webconsole.menu.exportSubmenu.exportFile.label		=ファイル
 
-# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
-# Label used for a context-menu item displayed for any log. Clicking on it will
-# jump to the execution point where the log item was generated.
-webconsole.menu.timeWarp.label		=ここに移動
-
-# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
-# Label used for the tooltip on the "jump" button in the console. It's displayed when
-# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
-# message in the console output. Clicking on it will jump to the execution point where the
-# log item was generated.
-# Parameters: %S is the level of the message.
-webconsole.jumpButton.tooltip		=%S - ここに移動
-
 # LOCALIZATION NOTE (webconsole.clearButton.tooltip)
 # Label used for the tooltip on the clear logs button in the console top toolbar bar.
 # Clicking on it will clear the content of the console.
@@ -386,11 +392,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label	=永続ログ
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip)
 webconsole.console.settings.menu.item.enablePersistentLogs.tooltip	=このオプションを有効にすると、新しいページへ移動しても出力が消去されなくなります
 
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label)
-webconsole.console.settings.menu.item.eagerEvaluation.label		=先行評価
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip)
-webconsole.console.settings.menu.item.eagerEvaluation.tooltip		=このオプションを有効にすると、キー入力時に先行評価が行われます
-
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label)
 webconsole.console.settings.menu.item.instantEvaluation.label		=即時評価
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip)
@@ -587,12 +588,7 @@ webconsole.input.selector.top		=トップ
 # expression for.
 webconsole.input.selector.tooltip	=評価コンテキストを選択します
 
-# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label)
-# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will 
-# reveal that specific DOM Node in the Inspector.
-webconsole.menu.openNodeInInspector.label=Reveal in Inspector
-webconsole.menu.openNodeInInspector.accesskey=Q
 # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected
+webconsole.group.cookieSameSiteLaxByDefaultEnabled	=一部の Cookie は “sameSite“ 属性がないため、期待通りの動作にはなりません
 # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute
+webconsole.group.cookieSameSiteLaxByDefaultDisabled	=一部の Cookie は推奨される “sameSite“ 属性がありません
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties
index 67a81d48594e..353a089835e5 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/mac/accessible.properties
@@ -4,8 +4,8 @@
 
 jump	=移動
 press	=押す
-check	=チェック
-uncheck	=チェックしない
+check	=チェックを入れる
+uncheck	=チェックを外す
 select	=選択
 open	=開く
 close	=閉じる
@@ -14,7 +14,7 @@ click	=クリック
 collapse=折りたたむ
 expand	=展開する
 activate=動作させる
-cycle   =切り替え
+cycle	=切り替え
 
 # Universal Access API support
 # (Mac Only)
@@ -58,8 +58,7 @@ separator	=区切り
 tabPanel	=タブパネル
 # The roleDescription for the html:mark element
 highlight	=強調
-
 # The roleDescription for the details element
-details = details
+details		=詳細
 # The roleDescription for the summary element
-summary = summary
+summary		=要約
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties
index d89d8ef3f85d..252e22f7a82b 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/unix/accessible.properties
@@ -2,16 +2,16 @@
 # 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/.
 
-jump	= 移動
-press	= 押す
-check	= チェック
-uncheck	= チェックしない
-select	= 選択
-open	= 開く
-close	= 閉じる
-switch	= 切り替え
-click	= クリック
-collapse= 折りたたむ
-expand	= 展開する
-activate= 動作させる
-cycle   = 切り替え
+jump	=移動
+press	=押す
+check	=チェックを入れる
+uncheck	=チェックを外す
+select	=選択
+open	=開く
+close	=閉じる
+switch	=切り替え
+click	=クリック
+collapse=折りたたむ
+expand	=展開する
+activate=動作させる
+cycle	=切り替え
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties
index d89d8ef3f85d..252e22f7a82b 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global-platform/win/accessible.properties
@@ -2,16 +2,16 @@
 # 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/.
 
-jump	= 移動
-press	= 押す
-check	= チェック
-uncheck	= チェックしない
-select	= 選択
-open	= 開く
-close	= 閉じる
-switch	= 切り替え
-click	= クリック
-collapse= 折りたたむ
-expand	= 展開する
-activate= 動作させる
-cycle   = 切り替え
+jump	=移動
+press	=押す
+check	=チェックを入れる
+uncheck	=チェックを外す
+select	=選択
+open	=開く
+close	=閉じる
+switch	=切り替え
+click	=クリック
+collapse=折りたたむ
+expand	=展開する
+activate=動作させる
+cycle	=切り替え
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties
index bae7e3b00d5a..2454991b6583 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/css.properties
@@ -188,5 +188,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList	=repeat(auto-fill, ...) はサブグ
 PEMoreThanOneGridRepeatAutoFillFitInTrackList	=repeat(auto-fill, ...) または repeat(auto-fit, ...) はトラックリスト内で一度しか許可されていません。
 PEMoreThanOneGridRepeatTrackSize	=トラックサイズの指定は repeat(auto-fit/auto-fill, ...) 内で一個しか許可されていません。
 
+PEDisallowedImportRule			=後で構築されたスタイルシート内の @import 規則はまだ検証されていません。
+
 TooLargeDashedRadius			=‘dashed’ スタイルの border radius が大きすぎます (最大 100000px まで)。実線で描画します。
 TooLargeDottedRadius			=‘dotted’ スタイルの border radius が大きすぎます (最大 100000px まで)。実線で描画します。
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties
index fd2e338beb11..a50335eac7dd 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/dom/dom.properties
@@ -10,7 +10,7 @@ KillScriptLocation		=スクリプト: %S
 KillAddonScriptTitle		=警告:: 応答のないアドオンスクリプト
 # LOCALIZATION NOTE (KillAddonScriptMessage): %1$S is the name of an extension.
 # %2$S is the name of the application (e.g., Firefox).
-KillAddonScriptMessage		=このページ上で実行中の拡張機能 “%1$S” のスクリプトが原因で %2$S からの応答がありません。\n\nスクリプトがビジー状態か応答を停止しているかのうせいがあります。スクリプトを今すぐ停止するか処理が完了するまで待機してください。
+KillAddonScriptMessage		=このページ上で実行中の拡張機能 “%1$S” のスクリプトが原因で %2$S からの応答がありません。\n\nスクリプトがビジー状態か応答を停止している可能性があります。スクリプトを今すぐ停止するか処理が完了するまで待機してください。
 KillAddonScriptGlobalMessage	=次回再読み込みするまで、このページ上で拡張機能のスクリプトが実行されないようにする
 
 StopScriptButton		=スクリプトを停止
@@ -427,6 +427,5 @@ MathML_DeprecatedStyleAttributeWarning	=MathML 属性の “background”, “co
 MathML_DeprecatedXLinkAttributeWarning	=XLink 属性の “href”, “type”, “show” および “actuate” は MathML 要素での使用が推奨されません。これらは将来のバージョンで削除されます。
 WebShareAPI_Failed			=共有操作が失敗しました。
 WebShareAPI_Aborted			=共有操作が中止されました。
-
 # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
-UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol.
+UnknownProtocolNavigationPrevented	=プロトコルが不明なため “%1$S” への移動を中止しました。
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties
index 485bca2093b3..db5433e5046f 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/layout_errors.properties
@@ -39,7 +39,6 @@ CompositorAnimationWarningTransformFrameInactive		=フレームに ‘transform
 CompositorAnimationWarningTransformIsBlockedByImportantRules	=transform 関連のプロパティが !important 規則により上書きされているため、このコンポジターでは transform アニメーションを実行できません。
 CompositorAnimationWarningOpacityFrameInactive			=フレームに ‘opacity’ アニメーションがアクティブであることを示すマークがないため、このコンポジターではアニメーションを実行できません。
 CompositorAnimationWarningHasRenderingObserver			=要素の描画が -moz-element または SVG clipping/masking により監視されているため、このコンポジターではアニメーションを実行できません。
-
 CompositorAnimationWarningHasCurrentColor			=この ‘current-color’ キーフレームを持つコンポジターでは ‘background-color’ のアニメーションを実行できません。
 
 ## LOCALIZATION NOTE: Do not translate zoom, calc(), "transform", "transform-origin: 0 0"
@@ -55,4 +54,4 @@ PrincipalWritingModePropagationWarning	=<html> 要素のレンダリング時に
 ## %3$S is a floating point value with the total adjusted distance
 ScrollAnchoringDisabledInContainer	=スクロールアンカーは、連続調整 (%1$S) が多すぎ、移動距離の合計 (平均 %2$S px、合計 %3$S px) が小さすぎるため、スクロールコンテナー内で無効化されています。
 
-ForcedLayoutStart=Layout was forced before the page was fully loaded. If stylesheets are not yet loaded this may cause a flash of unstyled content.
+ForcedLayoutStart			=ページの読み込みが完了する前にレイアウトの開始が強制されました。スタイルシートがまだ読み込まれていない場合、スタイル付けされていないコンテンツがちらつく原因となる可能性があります。
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties
index 6806de93409d..ec518aef341c 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/global/security/security.properties
@@ -149,8 +149,8 @@ XFOSameOrigin	=X-Frame-Options による読み込み拒否: “%2$S” からの
 
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
-HTTPSOnlyUpgradeRequest = Upgrading insecure request “%1$S” to use “%2$S”.
+HTTPSOnlyUpgradeRequest		=安全でない要求 “%1$S” が “%2$S” を使用するようにアップグレードします。
 # LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt.
+HTTPSOnlyNoUpgradeException	=安全でない要求 “%1$S” は除外されているたアップグレードされません。
 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code.
-HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S)
+HTTPSOnlyFailedRequest		=安全でない要求 “%1$S” のアップグレードに失敗しました。(%2$S)
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd
index fa2e5201032b..30c9c7b69f05 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/accountCreation.dtd
@@ -37,6 +37,7 @@
 <!ENTITY imapLong.label			"IMAP (リモートフォルダー)">
 <!ENTITY pop3Long.label			"POP3 (メールをコンピューターに保存)">
 
+<!ENTITY manualConfigTable.summary	"サーバー設定">
 <!ENTITY incoming.label			"受信サーバー:">
 <!ENTITY incomingColumn.label		"受信サーバー">
 <!ENTITY outgoing.label			"送信サーバー:">
@@ -117,5 +118,3 @@
 <!ENTITY insecureUnencrypted.description	"あなたのメールと認証情報が暗号化されずに送信されるため、パスワード (およびメッセージの内容) が他の人々に簡単に読まれる危険性があります。このまま &brandShortName; でメールの送受信ができますが、メールプロバイダーに、安全な接続を行うサーバーを構成するように連絡してください。">
 <!ENTITY insecureSelfSigned.description		"サーバーが、自己署名された信頼できない証明書を使用しているため、&brandShortName; とサーバーの間の通信が盗聴されないことを保証できません。このまま &brandShortName; でメールの送受信ができますが、信頼できる証明書を使用しているメールプロバイダーを利用すべきです。">
 <!ENTITY secureServer.description		"設定が完了しました。このサーバーは安全な接続を行うサーバーです。">
-
-<!ENTITY manualConfigTable.summary       "Server settings">
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties
index 692a278d9c27..626cfe315095 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/addons.properties
@@ -1,16 +1,45 @@
-xpinstallPromptMessage			=このサイトからは %S にソフトウェアをインストールできない設定になっています。
-xpinstallPromptMessage.dontAllow	=許可しない
+# 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/.
+
+xpinstallPromptMessage				=このサイトからは %S にソフトウェアをインストールできない設定になっています。
+# LOCALIZATION NOTE (xpinstallPromptMessage.header)
+# The string contains the hostname of the site the add-on is being installed from.
+xpinstallPromptMessage.header			=%S にアドオンのインストールを許可しますか?
+xpinstallPromptMessage.message			=%S からアドオンをインストールしようとしています。続ける前に、これが信頼できるサイトかどうか確認してください。
+xpinstallPromptMessage.header.unknown		=知らないサイトにアドオンのインストールを許可しますか?
+xpinstallPromptMessage.message.unknown		=知らないサイトからアドオンをインストールしようとしています。続ける前に、これが信頼できるサイトかどうか確認してください。
+xpinstallPromptMessage.learnMore		=アドオンを安全にインストールするための情報
+xpinstallPromptMessage.dontAllow		=許可しない
 xpinstallPromptMessage.dontAllow.accesskey=D
-xpinstallPromptAllowButton		=許可する
+xpinstallPromptAllowButton			=許可する
+# Accessibility Note:
+# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
+# See http://www.mozilla.org/access/keyboard/accesskey for details
+xpinstallPromptAllowButton.accesskey		=A
+xpinstallPromptMessage.neverAllow		=許可しない
+xpinstallPromptMessage.neverAllow.accesskey	=N
+# Accessibility Note:
+# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
+# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details
+xpinstallPromptMessage.install			=インストールを続ける
+xpinstallPromptMessage.install.accesskey	=C
+
 # Accessibility Note:
 # Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
 # See http://www.mozilla.org/access/keyboard/accesskey for details
-xpinstallPromptAllowButton.accesskey	=A
 xpinstallDisabledMessageLocked		=ソフトウェアのインストールはシステム管理者により無効化されています。
 xpinstallDisabledMessage		=ソフトウェアのインストールは現在無効になっています。[有効にする] をクリックしてからもう一度やり直してください。
 xpinstallDisabledButton			=有効にする
 xpinstallDisabledButton.accesskey	=n
 
+# LOCALIZATION NOTE (addonInstallBlockedByPolicy)
+# This message is shown when the installation of an add-on is blocked by
+# enterprise policy. %1$S is replaced by the name of the add-on.
+# %2$S is replaced by the ID of add-on. %3$S is a custom message that
+# the administration can add to the message.
+addonInstallBlockedByPolicy		=%1$S (%2$S) のインストールがシステム管理者によりブロックされました。%3$S
+
 # LOCALIZATION NOTE (addonPostInstall.message1)
 # %1$S is replaced with the localized named of the extension that was
 # just installed.
@@ -97,6 +126,8 @@ addonInstallErrorBlocklisted		=セキュリティまたは安定性に問題が
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header		=%S を追加しますか?
 
+# %S is brandShortName
+webextPerms.experimentWarning	=悪意のあるアドオンはユーザーの個人情報を盗んだりコンピューターを危険にさらすことがあります。提供元を信頼できない場合は、このアドオンをインストールしないでください。
 webextPerms.unsignedWarning	=注意: このアドオンは検証されていません。悪意のあるアドオンはユーザーの個人情報を盗んだりコンピューターを危険にさらすことがあります。提供元を信頼できない場合は、このアドオンをインストールしないでください。
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -165,6 +196,9 @@ webextPerms.description.devtools	=開いたタブのユーザーデータへア
 webextPerms.description.dns		=IP アドレスとホスト名情報へのアクセス
 webextPerms.description.downloads	=ファイルのダウンロードおよびブラウザーのダウンロード履歴の読み取りと変更
 webextPerms.description.downloads.open	=コンピューターにダウンロードしたファイルを開く
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment	=%S とコンピューターへの完全に無制限なアクセス
 webextPerms.description.find		=すべての開いたタブのテキストの読み取り
 webextPerms.description.geolocation	=ユーザーの位置情報へのアクセス
 webextPerms.description.history		=ブラウジング履歴へのアクセス
@@ -229,29 +263,3 @@ webext.remove.confirmation.title	=%1$S を削除
 # %2$S is brandShorterName
 webext.remove.confirmation.message	=%2$S から %1$S を削除しますか?
 webext.remove.confirmation.button	=削除
-
-# LOCALIZATION NOTE (xpinstallPromptMessage.header)
-# The string contains the hostname of the site the add-on is being installed from.
-xpinstallPromptMessage.header=Allow %S to install an add-on?
-xpinstallPromptMessage.message=You are attempting to install an add-on from %S. Make sure you trust this site before continuing.
-xpinstallPromptMessage.header.unknown=Allow an unknown site to install an add-on?
-xpinstallPromptMessage.message.unknown=You are attempting to install an add-on from an unknown site. Make sure you trust this site before continuing.
-xpinstallPromptMessage.learnMore=Learn more about installing add-ons safely
-xpinstallPromptMessage.neverAllow=Never Allow
-xpinstallPromptMessage.neverAllow.accesskey=N
-# Accessibility Note:
-# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
-# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details
-xpinstallPromptMessage.install=Continue to Installation
-xpinstallPromptMessage.install.accesskey=C
-# LOCALIZATION NOTE (addonInstallBlockedByPolicy)
-# This message is shown when the installation of an add-on is blocked by
-# enterprise policy. %1$S is replaced by the name of the add-on.
-# %2$S is replaced by the ID of add-on. %3$S is a custom message that
-# the administration can add to the message.
-addonInstallBlockedByPolicy=%1$S (%2$S) is blocked by your system administrator.%3$S
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties
index 9d42cb925768..62ed41f15b38 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-e2e.properties
@@ -2,4 +2,4 @@
 # 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/.
 
-prefPanel-e2e=End-To-End Encryption
+prefPanel-e2e	=エンドツーエンド暗号化
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd
index 135917ad4c8e..1cd7227f4505 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.dtd
@@ -2,16 +2,31 @@
    - 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/. -->
 
-<!ENTITY securityTitle.label			"セキュリティ">
-<!ENTITY securityTab.label			"セキュリティ">
-<!ENTITY securityHeading.label			"署名や暗号化されたメッセージを送受信するには、デジタル署名証明書と暗号化証明書の両方を指定する必要があります。">
-<!ENTITY encryptionGroupTitle.label		"暗号化">
-<!ENTITY encryptionChoiceLabel.label		"メッセージ送信時に使用する既定の暗号化設定:">
-<!ENTITY neverEncrypt.label			"暗号化しない">
-<!ENTITY neverEncrypt.accesskey			"N">
-<!ENTITY alwaysEncryptMessage.label		"暗号化する (すべての受信者が証明書を持っていなければ送信できません)">
-<!ENTITY alwaysEncryptMessage.accesskey		"u">
-<!ENTITY encryptionCert.message			"あなたへのメッセージの暗号化と復号に使用する証明書:">
+<!ENTITY securityTitle.label		"セキュリティ">
+<!ENTITY securityTab.label		"セキュリティ">
+<!ENTITY securityHeading.label		"署名や暗号化されたメッセージを送受信するには、デジタル署名証明書と暗号化証明書の両方を指定する必要があります。">
+<!ENTITY encryptionGroupTitle.label	"暗号化">
+<!ENTITY encryptionChoiceLabel.label	"メッセージ送信時に使用する既定の暗号化設定:">
+<!ENTITY neverEncrypt.label		"暗号化しない">
+<!ENTITY neverEncrypt.accesskey		"N">
+<!ENTITY alwaysEncryptMessage.label	"暗号化する (すべての受信者が証明書を持っていなければ送信できません)">
+<!ENTITY alwaysEncryptMessage.accesskey	"u">
+<!ENTITY encryptionCert.message		"あなたへのメッセージの暗号化と復号に使用する証明書:">
+<!ENTITY e2eTitle.label			"エンドツーエンド暗号化">
+<!ENTITY e2eIntro.description		"暗号化またはデジタル署名されたメッセージを送信するには、OpenPGP または S/MIME のどちらかの暗号技術を設定する必要があります。">
+<!ENTITY e2eLearnMore.label		"詳細情報">
+
+<!ENTITY e2eEnc.description		"エンドツーエンド暗号化をしないメッセージのコンテンツは、ご利用のメールプロバイダーや監視システムに容易にさらされます。">
+<!ENTITY e2eeReqWarning.description	"送信メッセージを暗号化する必要がある場合は、あなたの公開鍵またはすべての受信者の証明書を用意しなければなりません。">
+
+<!ENTITY e2eSigning.description		"デジタル署名により、メッセージの送信者があなたであり、コンテンツが改変されていないことを受信者が検証できます。">
+<!ENTITY e2eTechPref.description	"優先される暗号化技術:">
+
+<!ENTITY doNotEncrypt.label			"既定で暗号化を有効にしない">
+<!ENTITY doNotEncrypt.accesskey			"N">
+<!ENTITY requireEncryptMessage.label		"既定で暗号化を必須にする">
+<!ENTITY requireEncryptMessage.accesskey	"u">
+<!ENTITY encryptionCert2.message		"暗号化のための個人証明書:">
 <!ENTITY digitalSign.certificate.button		"選択...">
 <!ENTITY digitalSign.certificate.accesskey	"S">
 <!ENTITY digitalSign.certificate_clear.button	"消去">
@@ -22,46 +37,40 @@
 <!ENTITY encryption.certificate_clear.accesskey	"e">
 <!ENTITY signingGroupTitle.label		"デジタル署名">
 <!ENTITY signMessage.label			"メッセージにデジタル署名する (既定の動作)">
+<!ENTITY signMessage2.label			"既定でデジタル署名を追加する">
 <!ENTITY signMessage.accesskey			"D">
-<!ENTITY signingCert.message			"メッセージのデジタル署名に使用する証明書:">
+<!ENTITY signingCert.message			"送信メッセージのデジタル署名に使用する証明書:">
+
+<!ENTITY certificates.label		"証明書">
+<!ENTITY manageCerts2.label		"証明書を管理">
+<!ENTITY manageCerts2.accesskey		"M">
+<!ENTITY manageDevices.label		"セキュリティデバイス">
+<!ENTITY manageDevices.accesskey	"y">
+
+<!ENTITY signingCert2.message		"デジタル署名のための個人証明書:">
+
+<!ENTITY sendingDefaults.label		"メッセージ送信の既定の設定">
+
+<!ENTITY technologyAutomatic.label	"利用可能な鍵または証明書をもとに自動的に選択する">
+
+<!ENTITY certificates2.label		"S/MIME">
+<!ENTITY manageCerts3.label		"S/MIME 証明書の管理">
+<!ENTITY manageCerts3.accesskey		"M">
+<!ENTITY manageDevices2.label		"S/MIME セキュリティデバイス">
+<!ENTITY manageDevices2.accesskey	"y">
+
+<!ENTITY technologySMIME.label		"S/MIME を優先する">
+<!ENTITY technologyOpenPGP.label	"OpenPGP を優先する">
 
-<!ENTITY certificates.label			"証明書">
-<!ENTITY manageCerts2.label			"証明書を管理">
-<!ENTITY manageCerts2.accesskey			"M">
-<!ENTITY manageDevices.label			"セキュリティデバイス">
-<!ENTITY manageDevices.accesskey		"y">
+<!ENTITY openpgpKeys.label		"OpenPGP">
+<!ENTITY manageKeys.label		"OpenPGP 鍵の管理">
+<!ENTITY manageKeys.accesskey		"K">
 
 <!-- Strings for the cert picker dialog -->
-<!ENTITY certPicker.title			"証明書の選択">
-<!ENTITY certPicker.info			"証明書:">
-<!ENTITY certPicker.detailsLabel		"選択した証明書の詳細:">
+<!ENTITY certPicker.title		"証明書の選択">
+<!ENTITY certPicker.info		"証明書:">
+<!ENTITY certPicker.detailsLabel	"選択した証明書の詳細:">
 
-<!ENTITY e2eTitle.label "End-To-End Encryption">
-<!ENTITY e2eIntro.description "To send encrypted or digitally signed messages, you need to configure an encryption technology, either OpenPGP or S/MIME.">
-<!ENTITY e2eLearnMore.label "Learn more">
-<!ENTITY e2eEnc.description "Without end-to-end encryption the contents of messages are easily exposed to your email provider and to mass surveillance.">
-<!ENTITY e2eeReqWarning.description "If you require encryption, to send a message you must have the public key or certificate of every recipient.">
-<!ENTITY e2eSigning.description "A digital signature allows recipients to verify the message was sent by you, and that the content has not been changed.">
-<!ENTITY e2eTechPref.description "Preferred encryption technology:">
-<!ENTITY doNotEncrypt.label "Do not enable encryption by default">
-<!ENTITY doNotEncrypt.accesskey "N">
-<!ENTITY requireEncryptMessage.label "Require encryption by default">
-<!ENTITY requireEncryptMessage.accesskey "u">
-<!ENTITY encryptionCert2.message "Personal certificate for encryption:">
-<!ENTITY signMessage2.label "Add my digital signature by default">
-<!ENTITY signingCert2.message "Personal certificate for digital signing:">
-<!ENTITY sendingDefaults.label "Default settings for sending messages">
-<!ENTITY technologyAutomatic.label "Select automatically based on available keys or certificates">
-<!ENTITY certificates2.label "S/MIME">
-<!ENTITY manageCerts3.label "Manage S/MIME Certificates">
-<!ENTITY manageCerts3.accesskey "M">
-<!ENTITY manageDevices2.label "S/MIME Security Devices">
-<!ENTITY manageDevices2.accesskey "y">
-<!ENTITY technologySMIME.label "Prefer S/MIME">
-<!ENTITY technologyOpenPGP.label "Prefer OpenPGP">
-<!ENTITY openpgpKeys.label "OpenPGP">
-<!ENTITY manageKeys.label "Manage OpenPGP Keys">
-<!ENTITY manageKeys.accesskey "K">
-<!ENTITY openpgpKey.message "Personal key for encryption and digital signing:">
-<!ENTITY openpgpKey.button "Set Personal Key…">
-<!ENTITY openpgpKey.accesskey "o">
+<!ENTITY openpgpKey.message		"暗号化およびデジタル署名のための秘密鍵:">
+<!ENTITY openpgpKey.button		"秘密鍵を設定...">
+<!ENTITY openpgpKey.accesskey		"o">
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties
index 4bef385195be..0e9cc99d0a33 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/am-smime.properties
@@ -12,6 +12,8 @@ ErrorCanNotSignMail		=メッセージに署名できません。アカウント
 
 ## Strings used for in the prefs.
 prefPanel-smime			=セキュリティ
+
+## Strings used for in the prefs.
 NoSigningCert			=証明書マネージャーはメッセージをデジタル署名する際に使用する有効な証明書を見つけられませんでした。
 NoSigningCertForThisAddress	=証明書マネージャーは <%S> のアドレスでメッセージをデジタル署名する際に使用する有効な証明書を見つけられませんでした。
 NoEncryptionCert		=証明書マネージャーは他の人があなたに暗号化したメールを送信する際に使用する有効な証明書を見つけられませんでした。
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd
index 4e32d0f2eebc..65c6d5ce0d47 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/customizeToolbar.dtd
@@ -15,8 +15,7 @@
 <!ENTITY addNewToolbar.label		"ツールバーを追加">
 <!ENTITY showTitlebar.label		"タイトルバーを表示">
 <!ENTITY extraDragSpace.label		"ドラッグスペースを追加">
+<!ENTITY showTitlebar2.label		"タイトルバー">
+<!ENTITY extraDragSpace2.label		"ドラッグスペース">
 <!ENTITY saveChanges.label		"完了">
 <!ENTITY undoChanges.label		"元に戻す">
-
-<!ENTITY showTitlebar2.label      "Title Bar">
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties
index ca8682414e0b..624a9d909a5a 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/imapMsgs.properties
@@ -194,16 +194,28 @@ imapAclExpungeRight			=整理 (Expunge)
 
 imapServerDisconnected			=サーバー %S との接続が切断されました。サーバーがダウンしたか、ネットワークに問題があるかもしれません。
 
+# LOCALIZATION NOTE (autoSubscribeText): %1$S is the imap folder.
 imapSubscribePrompt			=%1$S を購読しますか?
 
 imapServerDroppedConnection		=IMAP サーバーへ接続できませんでした。このサーバーへの同時接続数の限度を超えている可能性があります。その場合は [アカウント設定] の [サーバー設定] の [詳細] でサーバーへの最大同時接続数を減らしてください。
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen		=フォルダーが開かれていないため、クォータ情報は利用できません。
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported		=このサーバーはクォータをサポートしていません。
 
 imapQuotaStatusNoQuota			=このフォルダーにはクォータが割り当てられていません。
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2			=このフォルダーにはクォータ情報がありません。
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress		=クォータ情報はまだ利用できません
+
+# Out of memory
 imapOutOfMemory				=メモリーが不足しています。
 
 # LOCALIZATION NOTE (imapCopyingMessageOf2): Do not translate the word "%S" below.
@@ -254,9 +266,3 @@ imapFolderCommandFailed			='%2$S' に対する現在の操作を正常に完了
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert				=%1$S アカウントからの警告: %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd
index 32f739f85669..e5ee74b801ca 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.dtd
@@ -292,6 +292,8 @@
 <!ENTITY searchMailCmd.label		"メッセージを検索...">
 <!ENTITY searchMailCmd.accesskey	"M">
 <!ENTITY searchMailCmd.key		"f">
+<!ENTITY glodaSearchCmd.label		"グローバル検索...">
+<!ENTITY glodaSearchCmd.accesskey	"G">
 <!ENTITY searchAddressesCmd.label	"アドレスを検索...">
 <!ENTITY searchAddressesCmd.accesskey	"S">
 
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties
index fc3bb9dc255b..3cf450580fb8 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messenger.properties
@@ -316,7 +316,8 @@ mailnews.search_date_leading_zeros	=true
 nocachedbodybody2		=このメッセージの本文はオフライン作業用にサーバーからダウンロードされていません。メッセージを読むには、[ファイル] メニューを開いて [オフライン] を選択し、[オフライン作業] のチェックを外してネットワークに接続してください。オフラインで使用するフォルダーとメッセージは [ツール] メニューから [アカウント設定] を開き、[同期とディスク領域] で設定できます。
 
 # accountCentral
-mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xhtml
+mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat		=%1$S %2$S - %3$S
 mailAcctType			=Mail
@@ -465,11 +466,15 @@ macBiffNotification_separator		=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree				=%S / %S KB 使用
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed			=%S%% 使用
 # for quota in main window (commandglue.js)
 percent					=%S%%
 quotaTooltip				=IMAP クォータ: ディスク領域の割り当て %2$S KB 中の %1$S KB 使用しています。クリックすると詳細を表示します。
 
+quotaTooltip2				=IMAP クォータ: ディスク領域の割り当て %2$S 中の %1$S 使用しています。クリックすると詳細を表示します。
+
 # for message views
 confirmViewDeleteTitle			=確認
 confirmViewDeleteMessage		=本当にこの絞り込み条件を削除しますか?
@@ -812,5 +817,3 @@ errorConsoleTitle			=エラーコンソール
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back				=戻る
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd
index 750f6b3ec6bb..0ff73515f6d3 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/messengercompose/messengercompose.dtd
@@ -90,15 +90,8 @@
 <!ENTITY reorderAttachmentsCmd.accesskey	"s">
 <!ENTITY reorderAttachmentsCmd.key	"x">
 <!ENTITY toggleAttachmentPaneCmd.label	"添付ペイン">
-<!-- LOCALIZATION NOTE (toggleAttachmentPaneCmd.accesskey):
-     For better mnemonics, toggleAttachmentPaneCmd.accesskey should be the same
-     as attachments.accesskey. -->
 <!ENTITY toggleAttachmentPaneCmd.accesskey	"m">
-<!-- LOCALIZATION NOTE (toggleAttachmentPaneCmd.key):
-     As Mac does not have access keys, this key defines a Mac-only, cross-l10n
-     shortcut key (Ctrl+M). Typically, this key should not be translated unless
-     otherwise required by specific needs of the localization. -->
-<!ENTITY toggleAttachmentPaneCmd.key	"m">
+<!ENTITY toggleAttachmentPaneCmd.key	"M">
 <!ENTITY selectAllCmd.label		"すべて選択">
 <!ENTITY selectAllCmd.accesskey		"a">
 <!ENTITY selectAllCmd.key		"A">
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties
index 06b3405bbce1..b2c6f4b3ec54 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/pgpmime.properties
@@ -8,5 +8,8 @@
 
 # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
 # %S is the url to Enigmail on AMO supplied from preferences.
-pgpMimeNeedsAddon	=これは暗号化された OpenPGP メッセージです。<br>このメールを復号するには <a href="%S">OpenPGP アドオン</a> をインストールする必要があります。
 ## (^m^) リンク先設定 mail.pgpmime.addon_url
+pgpMimeNeedsAddon	=これは暗号化された OpenPGP メッセージです。<br>このメールを復号するには <a href="%S">OpenPGP アドオン</a> をインストールする必要があります。
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable		=これは暗号化された OpenPGP メッセージですが、OpenPGP の復号サポートが利用できません。
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd
index 1a839c7a25ea..4182e31f5739 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label	"削除">
 <!ENTITY removeSearchEngine.accesskey	"v">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
-<!ENTITY minimizeToTray.accesskey         "m">
+<!ENTITY minimizeToTray.label		"最小化した &brandShortName; をタスクトレイにしまう">
+<!ENTITY minimizeToTray.accesskey	"m">
diff --git a/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties b/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties
index 415d5194b300..221f307c0c06 100644
--- a/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties
+++ b/thunderbird-l10n/ja/chrome/ja/locale/ja/necko/necko.properties
@@ -68,8 +68,7 @@ CookieLaxForced				=Cookie “%1$S” は “sameSite” 属性が足りない
 CookieLaxForcedForBeta			=Cookie “%1$S” に正しい “sameSite” 属性の値が設定されていません。“sameSite” 属性を持たない Cookie またはその属性値が不正なものの値は “lax” として扱われます。これは、Cookie が第三者のコンテキストに送信されないことを意味します。あなたのアプリケーションがこのようなコンテキストで利用可能になっている Cookie に依存する場合は、“sameSite=none” 属性を追加してください。“sameSite” 属性についての詳細は %2$S をお読みください。
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid		=Cookie “%1$S” の “sameSite” の値が不正です。サポートされた値は “lax”, “strict”, “none” です。
-
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
+CookieOversize				=Cookie “%1$S” のサイズが大きすぎるため正しく読み込めません。最大サイズは  %2$S バイトです。
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize			=Cookie “%1$S” のパスが長すぎるため正しく読み込めません。最大サイズは  %2$S バイトです。
diff --git a/thunderbird-l10n/ja/localization/ja/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ja/localization/ja/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..f3250ea8c38b
--- /dev/null
+++ b/thunderbird-l10n/ja/localization/ja/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,14 @@
+# 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/.
+
+calendar-uri-redirect-window =
+  .title = カレンダー URI のリダイレクト
+
+calendar-uri-redirect-description =
+  サーバーが "{ $calendarName }" のカレンダーの URI をリダイレクトしています。
+  このカレンダーのリダイレクトを受け入れて新しい URI を使用しますか?
+
+calendar-uri-redirect-original-uri-label = 現在の URI:
+
+calendar-uri-redirect-target-uri-label = リダイレクト先の新しい URI:
diff --git a/thunderbird-l10n/ja/localization/ja/calendar/calendar-widgets.ftl b/thunderbird-l10n/ja/localization/ja/calendar/calendar-widgets.ftl
new file mode 100644
index 000000000000..3e1f3fe9fcea
--- /dev/null
+++ b/thunderbird-l10n/ja/localization/ja/calendar/calendar-widgets.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-deactivated-notification-events = 現在すべてのカレンダーが無効化されています。既存のカレンダーを有効にするか、新しいカレンダーを追加して予定を編集してください。
+calendar-deactivated-notification-tasks = 現在すべてのカレンダーが無効化されています。既存のカレンダーを有効にするか、新しいカレンダーを追加して ToDo を編集してください。
diff --git a/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl
index e27be3d5faa7..5c6fd9d672e3 100644
--- a/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/ja/localization/ja/devtools/client/aboutdebugging.ftl
@@ -231,6 +231,10 @@ about-debugging-browser-version-too-old = 接続したブラウザーのバー
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = 接続したブラウザーではデバッガーパネルが動作しないようです。このブラウザーでデバッガーを利用したい場合は、Firefox { $runtimeVersion } を使用してください。
 
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = このバージョンの Firefox は Android 版 Firefox (68) をデバッグできません。携帯電話でのテストには Android 版 Firefox Nightly のインストールをお勧めします。<a>詳細</a>
+
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/ja/localization/ja/messenger/accountCentral.ftl b/thunderbird-l10n/ja/localization/ja/messenger/accountCentral.ftl
new file mode 100644
index 000000000000..add875453014
--- /dev/null
+++ b/thunderbird-l10n/ja/localization/ja/messenger/accountCentral.ftl
@@ -0,0 +1,69 @@
+# 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/.
+
+account-central-title = Welcome to { -brand-full-name }
+account-settings = アカウント設定
+
+#   $accounts (Number) - the number of configured accounts
+setup-title = { $accounts ->
+    [0]      セットアップするアカウントを選んでください
+    *[other] 別のアカウントをセットアップ
+}
+about-title = { -brand-full-name } について
+resources-title = 製品情報
+
+release-notes =
+    .title = { -brand-full-name } について
+
+email-label = メール
+    .aria-label = 既存のメールアカウントに接続します
+email-description = { -brand-short-name } に既存のメールアカウントを設定します。このアプリケーションからあなたのメールを利便性が高く効果的な方法で読むことができます。
+
+calendar-label = カレンダー
+    .aria-label = 新しいカレンダーを作成します
+calendar-description = { -brand-short-name } であなたの予定を整理できます。リモートのカレンダーに接続することにより、あなたの予定をお持ちのすべての端末と同期します。
+
+chat-label = チャット
+    .aria-label = チャットアカウントに接続します
+chat-description = { -brand-short-name } で複数のインスタントメッセージアカウントに接続し、様々なプラットフォームのサポートを提供します。
+
+filelink-label = Filelink
+    .aria-label = Filelink をセットアップします
+filelink-description = { -brand-short-name } に便利な Filelink クラウドアカウントをセットアップすると、サイズの大きな添付ファイルを簡単に送信できます。
+
+addressbook-label = アドレス帳
+    .aria-label = 新しいアドレス帳を作成します
+addressbook-description = { -brand-short-name } でアドレス帳のすべての連絡先を整理できます。リモートのアドレス帳に接続して連絡先を同期することもできます。
+
+feeds-label = フィード
+    .aria-label = フィードに接続します
+feeds-description = { -brand-short-name } を RSS/Atom フィードに接続して、世の中のニュースや更新情報を受け取れます。
+
+newsgroups-label = ニュースグループ
+    .aria-label = ニュースグループに接続します
+newsgroups-description = { -brand-short-name } をお好みのすべてのニュースグループに接続できます。
+
+import-title = 別のプログラムからインポート
+import-paragraph = { -brand-short-name } に他のメールプログラムからメールメッセージやフィード購読、環境設定、メッセージフィルターを、一般的なアドレス帳形式からアドレス帳をインポートすることができます。
+
+import-label = データをインポート
+    .aria-label = 他のプログラムからデータをインポートします
+
+about-paragraph = Thunderbird は、オープンソースでクロスプラットフォームを特徴とし、ビジネスでも個人でも無料で利用できる人気のメール・カレンダークライアントです。私たちはそのセキュリティを守りつつ、さらに改善していきたいと考えています。皆さんからの寄付によって、開発者の雇用、インフラストラクチャの購入、改良の継続が可能となります。
+
+about-paragraph-2 = <b>Thunderbird はあなたのようなユーザーに支えられています! Thunderbird を気に入っていただけた方は寄付をご検討ください。</b> Thunderbird を存続可能にするため、あなたができる最善の方法は
+about-donation = 寄付をしていただくことです。
+
+explore-link = 機能紹介
+support-link = サポート
+involved-link = 参加協力
+developer-link = 開発者ドキュメント
+
+read = メッセージを読む
+compose = メッセージを作成
+search = メッセージを検索
+filter = メッセージフィルターを管理
+nntp-subscription = ニュースグループ購読を管理
+rss-subscription = フィード購読を管理
+e2e = エンドツーエンド暗号化
diff --git a/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl b/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl
index 929be65ac3cf..74bbd202ba16 100644
--- a/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl
+++ b/thunderbird-l10n/ja/localization/ja/messenger/policies/policies-descriptions.ftl
@@ -31,6 +31,8 @@ policy-CertificatesDescription = 証明書を追加、または組み込みの
 
 policy-Cookies = Cookie の保存をウェブサイトに許可または拒否します。
 
+policy-DisabledCiphers = 暗号を無効にします。
+
 policy-DefaultDownloadDirectory = 既定のダウンロードディレクトリーを設定します。
 
 policy-DisableAppUpdate = { -brand-short-name } の更新を禁止します。
diff --git a/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl
index bf81e59e832b..a3c211a6e257 100644
--- a/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl
+++ b/thunderbird-l10n/ja/localization/ja/messenger/preferences/passwordManager.ftl
@@ -69,3 +69,17 @@ remove-all-shown =
 remove-all-passwords-prompt = 本当にすべてのパスワードを消去しますか?
 remove-all-passwords-title = すべてのパスワードを消去
 no-master-password-prompt = パスワードを表示しますか?
+
+## OS Authentication dialog
+
+# This message can be seen by trying to show or copy the passwords.
+password-os-auth-dialog-message = 保存されたパスワードを開示するため、あなたのアカウントを検証します。
+
+# This message can be seen by trying to show or copy the passwords.
+# The macOS strings are preceded by the operating system with "Thunderbird is trying to "
+# and includes subtitle of "Enter password for the user "xxx" to allow this." These
+# notes are only valid for English. Please test in your locale.
+password-os-auth-dialog-message-macosx = 保存されたパスワードを開示
+
+# Don't change this label.
+password-os-auth-dialog-caption = { -brand-full-name }
diff --git a/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl b/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl
index 29b392bea7f7..a366c99c630b 100644
--- a/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl
+++ b/thunderbird-l10n/ja/localization/ja/messenger/preferences/preferences.ftl
@@ -88,3 +88,17 @@ update-in-progress-ok-button = 破棄(&D)
 # Continue is the cancel button so pressing escape or using a platform standard
 # method of closing the UI will not discard the update.
 update-in-progress-cancel-button = 続行(&C)
+
+## OS Authentication dialog
+
+# This message can be seen by trying to add a Master Password.
+master-password-os-auth-dialog-message = マスターパスワードを作成するため、あなたのアカウントを検証します。
+
+# This message can be seen by trying to add a Master Password.
+# The macOS strings are preceded by the operating system with "Thunderbird is trying to "
+# and includes subtitle of "Enter password for the user "xxx" to allow this." These
+# notes are only valid for English. Please test in your locale.
+master-password-os-auth-dialog-message-macosx = マスターパスワードを作成
+
+# Don't change this label.
+master-password-os-auth-dialog-caption = { -brand-full-name }
diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl
index 84e2fc9db2ea..2ec5a638a04a 100644
--- a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = ファイルからアドオンをインストール...
     .accesskey = I
 help-button = アドオンのサポート
+sidebar-help-button-title =
+    .title = アドオンのサポート
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } オプション
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = アドオンツール
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } オプション
+           *[other] { -brand-short-name } 設定
+        }
 show-unsigned-extensions-button =
     .label = 一部の拡張機能を検証できませんでした
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = 更新可能
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = おすすめ
+addon-category-discover-title =
+    .title = おすすめ
 addon-category-extension = 拡張機能
+addon-category-extension-title =
+    .title = 拡張機能
 addon-category-theme = テーマ
+addon-category-theme-title =
+    .title = テーマ
 addon-category-plugin = プラグイン
+addon-category-plugin-title =
+    .title = プラグイン
 addon-category-dictionary = 辞書
+addon-category-dictionary-title =
+    .title = 辞書
 addon-category-locale = 言語パック
+addon-category-locale-title =
+    .title = 言語パック
 addon-category-available-updates = 更新可能
+addon-category-available-updates-title =
+    .title = 更新可能
 addon-category-recent-updates = 最近の更新
+addon-category-recent-updates-title =
+    .title = 最近の更新
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = 次の拡張機能にはショートカットがあり
 shortcuts-input =
     .placeholder = ショートカットキーを入力してください
 shortcuts-browserAction = 拡張機能を有効化
+shortcuts-browserAction2 = ツールバーボタンを有効化
 shortcuts-pageAction = ページ操作を有効化
 shortcuts-sidebarAction = サイドバーの表示を切り替え
 shortcuts-modifier-mac = Ctrl, Alt または ⌘ を含む
@@ -311,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = 折りたたむ
 go-back-button =
     .tooltiptext = 前のページへ戻ります
+header-back-button =
+    .title = 前のページへ戻ります
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl
index 02e5e741f666..f8fef75cee73 100644
--- a/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/ja/localization/ja/toolkit/about/aboutSupport.ftl
@@ -4,6 +4,7 @@
 
 page-title = トラブルシューティング情報
 page-subtitle = このページには問題発生時に役立てられる技術情報が表示されます。{ -brand-short-name } に関する一般的な質問については <a data-l10n-name="support-link">サポートサイト</a> をご覧ください。
+
 crashes-title = クラッシュレポート
 crashes-id = レポート ID
 crashes-send-date = 送信日時
@@ -120,6 +121,7 @@ audio-backend = 音声バックエンド
 max-audio-channels = 最大チャンネル数
 channel-layout = 優先チャンネルレイアウト
 sample-rate = 優先サンプルレート
+
 media-title = メディア
 media-output-devices-title = 出力デバイス
 media-input-devices-title = 入力デバイス
@@ -135,7 +137,6 @@ media-device-latency = 遅延
 media-capabilities-title = メディア性能
 # List all the entries of the database.
 media-capabilities-enumerate = データベースを列挙
-
 ##
 
 intl-title = 国際化とローカライズ
@@ -181,7 +182,6 @@ raw-data-copied = 生データをクリップボードにコピーしました
 text-copied = テキストをクリップボードにコピーしました
 
 ## The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers".
-
 blocked-driver = グラフィックドライバーのバージョンが対応していないため描画支援がブロックされました。
 blocked-gfx-card = グラフィックカードのドライバーの未解決の問題により描画支援がブロックされました。
 blocked-os-version = オペレーティングシステムのバージョンが対応していないため描画支援がブロックされました。
@@ -189,9 +189,11 @@ blocked-mismatched-version = グラフィックドライバーのバージョン
 # Variables
 # $driverVersion - The graphics driver version string
 try-newer-driver = グラフィックドライバーのバージョンが対応していないため描画支援がブロックされました。グラフィックドライバーをバージョン { $driverVersion } 以降に更新してみてください。
+
 # "ClearType" is a proper noun and should not be translated. Feel free to leave English strings if
 # there are no good translations, these are only used in about:support
 clear-type-parameters = ClearType パラメーター
+
 compositing = 画像処理
 hardware-h264 = ハードウェア H264 デコード
 main-thread-no-omtc = メインスレッド、OMTC なし
@@ -203,9 +205,9 @@ virtual-monitor-disp = 仮想デスクトップ
 ## The following strings indicate if an API key has been found.
 ## In some development versions, it's expected for some API keys that they are
 ## not found.
-
 found = あり
 missing = なし
+
 gpu-process-pid = GPUProcessPid
 gpu-process = GPUProcess
 gpu-description = 型番
@@ -229,12 +231,15 @@ webgl2-version = WebGL 2 ドライバーのバージョン
 webgl2-driver-extensions = WebGL 2 ドライバーの拡張
 webgl2-extensions = WebGL 2 拡張
 blocklisted-bug = 既知の問題によりブロックリストに掲載されています
+
 # Variables
 # $bugNumber (string) - String of bug number from Bugzilla
 bug-link = Bug { $bugNumber }
+
 # Variables
 # $failureCode (string) - String that can be searched in the source tree.
 unknown-failure = ブロックリストに掲載。失敗コード { $failureCode }
+
 d3d11layers-crash-guard = D3D11 コンポジター
 d3d11video-crash-guard = D3D11 動画デコーダー
 d3d9video-crash-buard = D3D9 動画デコーダー
@@ -252,8 +257,10 @@ content-uses-tiling = タイリングの使用 (コンテンツ)
 off-main-thread-paint-enabled = メインスレッド外ペイント有効
 off-main-thread-paint-worker-count = メインスレッド外ペイントワーカー数
 target-frame-rate = ターゲットのフレームレート
+
 min-lib-versions = 想定される最低バージョン
 loaded-lib-versions = 使用中のバージョン
+
 has-seccomp-bpf = Seccomp-BPF (システムコールフィルタリング)
 has-seccomp-tsync = Seccomp スレッド同期
 has-user-namespaces = ユーザー名前空間
@@ -266,10 +273,18 @@ sandbox-proc-type-content = コンテンツ
 sandbox-proc-type-file = ファイルコンテンツ
 sandbox-proc-type-media-plugin = メディアプラグイン
 sandbox-proc-type-data-decoder = データデコーダー
+
+startup-cache-title = 起動時キャッシュ
+startup-cache-disk-cache-path = ディスクキャッシュのパス
+startup-cache-ignore-disk-cache = ディスクキャッシュ無視
+startup-cache-found-disk-cache-on-init = 初期化時に見つけたディスクキャッシュ
+startup-cache-wrote-to-disk-cache = ディスクキャッシュへの書き込み
+
 launcher-process-status-0 = 有効
 launcher-process-status-1 = 失敗したため無効
 launcher-process-status-2 = 強制的に無効
 launcher-process-status-unknown = 状態不明
+
 # Variables
 # $remoteWindows (integer) - Number of remote windows
 # $totalWindows (integer) - Number of total windows
@@ -282,6 +297,7 @@ multi-process-status-6 = 未サポートのテキスト入力により無効
 multi-process-status-7 = アドオンにより無効
 multi-process-status-8 = 強制的に無効
 multi-process-status-unknown = 状態不明
+
 async-pan-zoom = 非同期パン / ズーム
 apz-none = なし
 wheel-enabled = ホイール入力有効
@@ -290,14 +306,14 @@ drag-enabled = スクロールバーのドラッグ有効
 keyboard-enabled = キーボード有効
 autoscroll-enabled = 自動スクロール有効
 
+zooming-enabled = スムーズなピンチズーム有効
+
 ## Variables
 ## $preferenceKey (string) - String ID of preference
-
 wheel-warning = 非同期ホイール入力は未サポートの設定により無効化されます: { $preferenceKey }
 touch-warning = 非同期タッチ入力は未サポートの設定により無効化されます: { $preferenceKey }
 
 ## Strings representing the status of the Enterprise Policies engine.
-
 policies-inactive = 非アクティブ
 policies-active = アクティブ
 policies-error = エラー
diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl
index fe7d15212895..b5136b54ddb8 100644
--- a/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/ja/localization/ja/toolkit/about/certviewer.ftl
@@ -30,6 +30,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Key Exchange Group
 certificate-viewer-key-id = Key ID
 certificate-viewer-key-size = Key Size
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Inc. Locality
 certificate-viewer-locality = Locality
 certificate-viewer-location = Location
 certificate-viewer-logid = Log ID
diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl
index 64d9ebb8384e..71a57fec1adc 100644
--- a/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl
+++ b/thunderbird-l10n/ja/localization/ja/toolkit/extensions/blocklist.ftl
@@ -8,7 +8,7 @@ blocklist-window =
 blocklist-accept =
     .label = { -brand-short-name } を再起動
     .accesskey = R
-blocklist-label-summary = 安定性またはセキュリティの問題を生じるものとして知られているアドオンを検出しました:
+blocklist-label-summary = 安定性またはセキュリティの問題を生じるものとして知られているアドオンが { -brand-short-name } により検出されました:
 blocklist-soft-and-hard = 安定性またはセキュリティの問題を生じる高いリスクがあるアドオンはブロックされます。その他のアドオンのリスクは低いですが、再起動して無効化することが強く推奨されます。
 blocklist-hard-blocked = このアドオンには安定性またはセキュリティの問題を生じる高いリスクがあるため、ブロックされますが、完全に無効化するには再起動する必要があります。
 blocklist-soft-blocked = 安全のために、再起動してこのアドオンを無効化することが強く推奨されます。
diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl
index 4da798b55eca..2de9f68498e7 100644
--- a/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/ja/localization/ja/toolkit/global/processTypes.ftl
@@ -32,3 +32,6 @@ process-type-webisolated = 隔離されたウェブコンテンツ
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+
+# process used to perform network operations
+process-type-socket = ソケット
diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..1f316ecd05cd
--- /dev/null
+++ b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = 古いバージョンの { -brand-product-name } を起動しています
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = 新しいプロファイルを作成
+profiledowngrade-sync = 古いバージョンの { -brand-product-name } を使用すると既存のプロファイルに保存されたブックマークやブラウジング履歴が壊れる可能性があります。これらの情報を保護するため、この { -brand-short-name } 用に新しいプロファイルを作成してください。{ -fxaccount-brand-name }にログインして、いつでもブックマークとブラウジング履歴をプロファイル間で同期できます。
+profiledowngrade-nosync = 古いバージョンの { -brand-product-name } を使用すると既存のプロファイルに保存されたブックマークやブラウジング履歴が壊れる可能性があります。これらの情報を保護するため、この { -brand-short-name } 用に新しいプロファイルを作成してください。
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] 終了
+           *[other] 終了
+        }
diff --git a/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl
index 91f2a3673ef5..77305ffb6562 100644
--- a/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl
+++ b/thunderbird-l10n/ja/localization/ja/toolkit/global/profileSelection.ftl
@@ -20,7 +20,7 @@ profile-selection-delete-button =
 
 ## Messages used in the profile manager
 
-profile-manager-description = ユーザーの設定やデータなどはユーザープロファイルに保存されます。
+profile-manager-description = ユーザーの設定やデータなどは { -brand-short-name } のユーザープロファイルに保存されます。
 profile-manager-work-offline =
     .label = オフライン作業
     .accesskey = o
diff --git a/thunderbird-l10n/ja/manifest.json b/thunderbird-l10n/ja/manifest.json
index 7523934b3291..fb434b2c9cca 100644
--- a/thunderbird-l10n/ja/manifest.json
+++ b/thunderbird-l10n/ja/manifest.json
@@ -1,57 +1,57 @@
 {
-  "author": "Mozilla Japanese L10N Community (contributors: Makoto Arai, Tomoya Asai, Hideyuki EMURA, Shaw Hosaka, Joji Ikeda, Masahiko Imanaka, Kosuke Kaizuka, Hidehiro Kozawa, Teiji Matsuba, Shigeki Narisawa, Takeshi Nishimura, Atsushi Sakai, Hiroshi Sekiya, Youhei Tooyama, Satoru Yamaguchi)",
-  "applications": {
-    "gecko": {
-      "id": "langpack-ja@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
     }
   },
-  "name": "Japanese Language Pack",
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "ja",
+  "description": "Language pack for Thunderbird for ja",
+  "version": "76.0buildid20200420212409",
   "languages": {
     "ja": {
-      "version": "20200403075200",
+      "version": "20200417160521",
       "chrome_resources": {
-        "calendar": "chrome/ja/locale/ja/calendar/",
-        "messenger": "chrome/ja/locale/ja/messenger/",
+        "messenger-newsblog": "chrome/ja/locale/ja/messenger-newsblog/",
+        "pipnss": "chrome/ja/locale/ja/pipnss/",
+        "global": "chrome/ja/locale/ja/global/",
+        "necko": "chrome/ja/locale/ja/necko/",
         "messenger-mapi": "chrome/ja/locale/ja/messenger-mapi/",
-        "devtools-startup": "chrome/ja/locale/ja/devtools/startup/",
-        "places": "chrome/ja/locale/ja/places/",
-        "alerts": "chrome/ja/locale/ja/alerts/",
         "pluginproblem": "chrome/ja/locale/ja/pluginproblem/",
-        "necko": "chrome/ja/locale/ja/necko/",
-        "messenger-newsblog": "chrome/ja/locale/ja/messenger-newsblog/",
         "lightning": "chrome/ja/locale/ja/lightning/",
+        "mozldap": "chrome/ja/locale/ja/mozldap/",
+        "alerts": "chrome/ja/locale/ja/alerts/",
+        "passwordmgr": "chrome/ja/locale/ja/passwordmgr/",
+        "calendar": "chrome/ja/locale/ja/calendar/",
+        "communicator": "chrome/ja/locale/ja/communicator/",
         "devtools": "chrome/ja/locale/ja/devtools/client/",
+        "chat": "chrome/ja/locale/ja/chat/",
         "pippki": "chrome/ja/locale/ja/pippki/",
-        "messenger-smime": "chrome/ja/locale/ja/messenger-smime/",
-        "branding": "chrome/ja/locale/ja/branding/",
-        "mozapps": "chrome/ja/locale/ja/mozapps/",
-        "pipnss": "chrome/ja/locale/ja/pipnss/",
         "autoconfig": "chrome/ja/locale/ja/autoconfig/",
+        "messenger-smime": "chrome/ja/locale/ja/messenger-smime/",
         "messenger-region": "chrome/ja/locale/ja/messenger-region/",
+        "devtools-shared": "chrome/ja/locale/ja/devtools/shared/",
+        "messenger": "chrome/ja/locale/ja/messenger/",
+        "branding": "chrome/ja/locale/ja/branding/",
+        "places": "chrome/ja/locale/ja/places/",
         "global-platform": {
           "macosx": "chrome/ja/locale/ja/global-platform/mac/",
           "win": "chrome/ja/locale/ja/global-platform/win/",
-          "android": "chrome/ja/locale/ja/global-platform/unix/",
-          "linux": "chrome/ja/locale/ja/global-platform/unix/"
+          "linux": "chrome/ja/locale/ja/global-platform/unix/",
+          "android": "chrome/ja/locale/ja/global-platform/unix/"
         },
-        "global": "chrome/ja/locale/ja/global/",
-        "mozldap": "chrome/ja/locale/ja/mozldap/",
-        "passwordmgr": "chrome/ja/locale/ja/passwordmgr/",
-        "chat": "chrome/ja/locale/ja/chat/",
-        "communicator": "chrome/ja/locale/ja/communicator/",
-        "devtools-shared": "chrome/ja/locale/ja/devtools/shared/"
+        "mozapps": "chrome/ja/locale/ja/mozapps/",
+        "devtools-startup": "chrome/ja/locale/ja/devtools/startup/"
       }
     }
   },
-  "description": "Language pack for Thunderbird for ja",
   "manifest_version": 2,
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "id": "langpack-ja@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
     }
-  }
+  },
+  "langpack_id": "ja",
+  "name": "Japanese Language Pack",
+  "author": "Mozilla Japanese L10N Community (contributors: Makoto Arai, Tomoya Asai, Hideyuki EMURA, Shaw Hosaka, Joji Ikeda, Masahiko Imanaka, Kosuke Kaizuka, Hidehiro Kozawa, Teiji Matsuba, Shigeki Narisawa, Takeshi Nishimura, Atsushi Sakai, Hiroshi Sekiya, Youhei Tooyama, Satoru Yamaguchi)"
 }
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd b/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd
index 6c981e735ba9..22c755868941 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/calendar/calendar.dtd
@@ -50,7 +50,7 @@
 <!ENTITY calendar.unifinder.tree.categories.tooltip2       "კატეგორიებით დალაგება">
 <!ENTITY calendar.unifinder.tree.location.label            "მისამართი">
 <!ENTITY calendar.unifinder.tree.location.tooltip2         "მდებარეობის მიხედვით დალაგება">
-<!ENTITY calendar.unifinder.tree.status.label              "სტატუსი">
+<!ENTITY calendar.unifinder.tree.status.label              "მდგომარეობა">
 <!ENTITY calendar.unifinder.tree.status.tooltip2           "მდგომარეობის მიხედვით დალაგება">
 <!ENTITY calendar.unifinder.tree.calendarname.label        "კალენდრის სახელი">
 <!ENTITY calendar.unifinder.tree.calendarname.tooltip2     "კალენდრის სახელით დალაგება">
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties
index 45a759da19df..c94f909f67df 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=No associated rule
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties
index 402e7081c589..eb69624f9056 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/appstrings.properties
@@ -15,7 +15,7 @@ confirmRepostPrompt=ამ გვერდის საჩვენებლა
 resendButton.label=ხელახლა გადაგზავნა
 unknownSocketType=ეს დოკუმენტი ვერ აისახება პირადი უსაფრთხოების მმართველის (PSM) ჩადგმამდე. ჩამოტვირთეთ და ჩადგით PSM და კვლავ სცადეთ ან მიმართეთ სისტემის ადმინს.
 netReset=დოკუმენტი მონაცემებს არ შეიცავს.
-notCached=ეს დოკუმენტი აღარ არის ხელმისაწვდომი.
+notCached=შიგთავსი აღარაა ხელმისაწვდომი.
 netOffline=ეს დოკუმენტი კავშირგარეშე რეჟიმში ვერ გამოჩნდება. ინტერნეტში გასასვლელად, მოხსენით მონიშვნა კავშირგარეშე მუშაობას მენიუდან.
 isprinting=დაბეჭვდისას ან ამოსაბეჭდის ნახვის დროს დოკუმენტის შეცვლა შეუძლებელია.
 deniedPortAccess=მისამართი იყენებს ქსელის პორტს, რომელიც სხვა მიზნებით გამოიყენება. უსაფრთხოების მიზნით პროგრამამ მოთხოვნა გააუქმა.
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties
index 02c527882b0d..6c353a0b3256 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=სტილების ნაკრები %1$S ჩაიტ
 
 PEUnexpEOF2=ფაილის მოულოდნელი დასასრული %1$S ძებნისას.
 PEParseRuleWSOnly=მხოლოდ ხარეების გამოხშირვაა მითითებული.
+
 PEDeclDropped=დეკლარაცია გამოიტოვა.
 PEDeclSkipped=გადასვლა შემდეგ დეკლარაციაზე.
 PEUnknownProperty=უცნობი პარამეტრი '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=subgrid-ისთვის სახ
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=ბილიკის სიაში დაშვებულია მხოლოდ ერთი repeat(auto-fill, …) ან repeat(auto-fit, …).
 PEMoreThanOneGridRepeatTrackSize=გამეორების (auto-fit/auto-fill, …) შიგნით დაშვებულია მხოლოდ ერთი ბილიკის ზომა.
 
+PEDisallowedImportRule=@import წესები ჯერ არაა მართებული სტილის აწყობილ ცხრილებში.
+
 TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid.
 TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid.
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties
index c062150eb4c1..622c62d97b14 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/dom/dom.properties
@@ -194,9 +194,9 @@ IgnoringWillChangeOverBudgetWarning=Will-change მეხსიერები
 # LOCALIZATION NOTE: Do not translate "Worker".
 HittingMaxWorkersPerDomain2=Worker-ის სწრაფად გაშვება შეუძლებელია, რადგან იმავე წყაროს სხვა დოკუმენტები უკვე იყენებენ worker-ების სრულ რაოდენობას. Worker ახლა იცდის და გაეშვება მაშინვე, როცა სხვა რომელიმე worker დაასრულებს სამუშაოს.
 # LOCALIZATION NOTE: Do not translate "Application Cache API", "AppCache" and "ServiceWorker".
-AppCacheWarning=API-ის დროებითი მეხსიერების (AppCache) გამოყენება მოძველებულია და მომავალში მოცილდება.  გთხოვთ, მის ნაცვლად, ხაზგარეშე მხარდაჭერისთვის ისარგებლოთ ServiceWorker-ით.
+AppCacheWarning=აპლიკაციის დროებითი მეხსიერების API-ის (AppCache) გამოყენება მოძველებულია და მომავალში მოცილდება.  გთხოვთ, მის ნაცვლად, კავშირგარეშე მხარდაჭერისთვის ისარგებლოთ ServiceWorker-ით.
 # LOCALIZATION NOTE: Do not translate "Application Cache API", "AppCache".
-AppCacheInsecureWarning=აპლიკაციის კეშის API-ის (AppCache) გამოყენების შესაძლებლობა დაუცველი კავშირებისას მოცილებული იქნება 62 ვერსიაში.
+AppCacheInsecureWarning=აპლიკაციის დროებითი მეხსიერების API-ის (AppCache) გამოყენების შესაძლებლობა დაუცველი კავშირებისას მოცილებული იქნება 62 ვერსიაში.
 # LOCALIZATION NOTE: Do not translate "Worker".
 EmptyWorkerSourceWarning=Worker-ის შექმნის მცდელობა ცარიელი წყაროდან. ალბათ, უნებლიე.
 WebrtcDeprecatedPrefixWarning=WebRTC ინტერფეისი “moz” თავსართით (mozRTCPeerConnection, mozRTCSessionDescription, mozRTCIceCandidate) უკვე მოძველებულია.
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd
index 037b49943934..17be9e986f87 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/netError.dtd
@@ -32,7 +32,7 @@
 <!ENTITY netInterrupt.longDesc "<p>დაკავშირება წარმატებული იყო, მაგრამ მოულოდნელად გაწყდა მონაცემთა გადმოტანისას.  გთხოვთ, კვლავ სცადოთ.</p><ul><li>სხვა საიტებზეც ვერ შედიხართ? შეამოწმეთ კომპიუტერის კავშირი ქსელთან.</li><li>ჯერ კიდევ არ გამოსწორდა ხარვეზი? დახმარებისთვის მიმართეთ თქვენი ქსელის მმართველს, ან ინტერნეტმომსახურების მომწოდებელს.</li></ul>">
 
 <!ENTITY notCached.title "შიგთავსი ვადაგასულია">
-<!ENTITY notCached.longDesc "<p>მოთხოვნილი შიგთავსი არაა ხელმისაწვდომი ბრაუზერის კავშირგარეშე საცავში (კეშში).</p><ul><li>უსაფრთხოების მიზნით, ბრაუზერი დაუკითხავად არ ითხოვს ხოლმე საიტიდან მნიშვნელოვანი მასალის ხელახლა ჩამოტვირთვას.</li><li>ჩამოტვირთვის ხელმეორედ მოთხოვნისთვის, დააწკაპეთ ღილაკზე „სცადეთ ხელახლა“.</li></ul>">
+<!ENTITY notCached.longDesc "<p>მოთხოვნილი შიგთავსი არაა ხელმისაწვდომი ადგილობრივად, სადაც ბრაუზერი მას დროებით ინახავს.</p><ul><li>უსაფრთხოების მიზნით, ბრაუზერი დაუკითხავად არ ითხოვს ხოლმე საიტიდან მნიშვნელოვანი მასალის ხელახლა ჩამოტვირთვას.</li><li>ჩამოტვირთვის ხელმეორედ მოთხოვნისთვის, დააწკაპეთ ღილაკზე „სცადეთ ხელახლა“.</li></ul>">
 
 <!ENTITY netOffline.title "კავშირგარეშე რეჟიმი">
 <!ENTITY netOffline.longDesc2 "<p>ბრაუზერი მუშაობს კავშირგარეშედ და მოთხოვნილ მისამართს ვერ დაუკავშირდება.</p><ul><li>ჩართულია მოწყობილობა მოქმედ ქსელში?</li><li>გამოიყენეთ &quot;სცადეთ ხელახლა&quot; ღილაკი კავშირზე დასაბრუნებლად და გვერდის ხელახლა ჩასატვირთად.</li></ul>">
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties
index fc5e58a35955..fc0cf99c530f 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = ჩატვირთვა უარყო X-Frame-Options-მა: 
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = ჩატვირთვას ზღუდავს X-Frame-Options: „%1$S“ თავსართის „%2$S“ მისამართიდან, საიტი არ იძლევა „%3$S“ განსხვავებული წყაროდან ჩარჩოში ჩასმის ნებართვას.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = არამართებული X-Frame-Options თავსართია ნაპოვნი, როცა იტვირთებოდა „%2$S“: “%1$S” დაუშვებელი მითითებაა.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=„%2$S“ ვერ ჩაიტვირთა, ვინაიდან უარყოფს „X-Frame-Options“ მითითება, პარამეტრით „%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = დაუცველი მოთხოვნის “%1$S” განახლება რომ გამოიყენოს “%2$S”.
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd
index 2c436ec78f6e..92c15f2f2cbf 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "წერილების ძიება…">
 <!ENTITY searchMailCmd.accesskey "ძ">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "საერთო ძიება…">
+<!ENTITY glodaSearchCmd.accesskey "თ">
 <!ENTITY searchAddressesCmd.label "მისამართების ძიება…">
 <!ENTITY searchAddressesCmd.accesskey "ე">
 
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties
index 8f8508c15008..a7be87346094 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=ეს დაშიფრული OpenPGP გზავნილია.<br>წერილის გასაშიფრად აუცილებელია გადგათ <a href="%S">OpenPGP მოდული</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=ეს დაშიფრული OpenPGP-წერილია, მაგრამ OpenPGP-ის გაშიფვრის მხარდაჭერა, არაა ხელმისაწვდომი.
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties
index 86c0b97bbb45..991e47aaac1a 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/necko/necko.properties
@@ -8,55 +8,58 @@
 #SendingRequestTo=Sending request to 
 #TransferringDataFrom=Transferring data from 
 
-3=ეძებს – %1$S…
-4=დაკავშირებულია – %1$S…
-5=იგზავნება მოთხოვნა – %1$S…
+3=იძებნება %1$S…
+4=დაუკავშირდა %1$S…
+5=იღებს მოთხოვნას %1$S…
 6=მონაცემთა გადმოტანა – %1$S…
-7=უკავშირდება – %1$S…
-8=დამუშავდა – %1$S 
-9=ჩაიწერა – %1$S
+7=უკავშირდება %1$S…
+8=დამუშავდა %1$S
+9=ჩაიწერა %1$S
 10=ელოდება – %1$S…
 11=მოიძებნა %1$S…
-12=TLS დამმოწმებელი კავშირი %1$S-სთან…
-13=TLS დამმოწმებელი კავშირი %1$S-სთან, დასრულებულია…
+12=კავშირის TLS-დამოწმება – %1$S…
+13=TLS-დამოწმება დასრულდა – %1$S…
 
-27=FTP ტრანზაქციის დაწყება...
-28=დასრულებული FTP ტრანზაქცია
+27=FTP-გადაცემის დაწყება...
+28=FTP-გადაცემა დასრულდა
 
 RepostFormData=ეს გვერდი სხვა ბმულზე გადამისამართდა. გსურთ თქვენი შევსებული ველების ახალ მისამართზე გადაგზავნა?
 
 # Directory listing strings
 DirTitle=ნუსხა – %1$S
 DirGoUp=ზედა საქაღალდე
-ShowHidden=დამალული ობიექტების ჩვენება
+ShowHidden=დამალულების გამოჩენა
 DirColName=სახელი
 DirColSize=ზომა
 DirColMTime=ბოლო ცვლილება
 DirFileLabel=ფაილი:\u0020
 
-PhishingAuth=თქვენ აპირებთ მოინახულოთ “%1$S”. ეს საიტი შესაძლოა ცდილობს მოგაჩვენოთ, რომ თქვენ სხვა საიტს სტუმრობთ. გამოიყენეთ მხოლოდ განსაკუთრებულ შემთხვევებში.
-PhishingAuthAccept=მივხვდი და ძალიან ფრთხილად ვიქნები
+PhishingAuth=თქვენ აპირებთ მოინახულოთ „%1$S“. ეს საიტი შესაძლოა ცდილობდეს თავი სხვა საიტად გაასაღოს. იმოქმედეთ განსაკუთრებული სიფრთხილით.
+PhishingAuthAccept=გასაგებია და სიფრთხილით მოვეკიდები
 
-SuperfluousAuth=თქვენ აპირებთ შეხვიდეთ “%1$S” საიტზე “%2$S” სახელით, მაგრამ ვებსაიტი, ანგარიშზე შესვლას არ ითხოვს. აქ შესაძლოა რამე თაღლითობას ჰქონდეს ადგილი.\n\n“%1$S” ნამდვილად ის საიტია, რომლის ნახვაც გსურთ?
-AutomaticAuth=თქვენ აპირებთ შეხვიდეთ “%1$S” საიტზე “%2$S” სახელით.
+SuperfluousAuth=თქვენ აპირებთ შეხვიდეთ „%1$S“ საიტზე „%2$S“ სახელით, მაგრამ ვებსაიტი, ანგარიშზე შესვლას არ საჭიროებს. აქ შესაძლოა რამე თაღლითობას ჰქონდეს ადგილი.\n\n„%1$S“ ნამდვილად ის საიტია, რომლის ნახვაც გსურთ?
+AutomaticAuth=თქვენ აპირებთ შეხვიდეთ „%1$S“ საიტზე „%2$S“ სახელით.
 
-TrackerUriBlocked=მასალა „%1$S“ შეიზღუდა, ვინაიდან შიგთავსის შეზღუდვა ჩართულია.
-UnsafeUriBlocked=მასალა „%1$S“ შეიზღუდა, უსაფრთხო თვალიერების რეჟიმის მიერ.
-CookieBlockedByPermission=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ფუნთუშების განსაზღვრული ნებართვების შესაბამისად.
-CookieBlockedTracker=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ვინაიდან მომდინარეობდა მეთვალყურისგან და შიგთავსის შეზღუდვა ჩართულია.
-CookieBlockedAll=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ვინაიდან ყველა საცავთან წვდომა შეზღუდული გაქვთ.
-CookieBlockedForeign=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა “%1$S-ზე” შეიზღუდა, ვინაიდან ყველა მესამე მხარისთვის შეზღუდული გაქვთ საცავთან წვდომის მოთხოვნა და შიგთავსის შეზღუდვაც ჩართულია.
+TrackerUriBlocked=მასალა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან შიგთავსის შეზღუდვა ჩართულია.
+UnsafeUriBlocked=მასალა „%1$S“ მისამართზე შეიზღუდა, უსაფრთხო თვალიერების რეჟიმის მიერ.
+CookieBlockedByPermission=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ფუნთუშების მითითებული ნებართვების შესაბამისად.
+CookieBlockedTracker=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან მომდინარეობდა მეთვალყურისგან და შიგთავსის შეზღუდვა ჩართულია.
+CookieBlockedAll=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან ყველა საცავთან წვდომა შეზღუდული გაქვთ.
+CookieBlockedForeign=ფუნთუშებთან ან საცავთან წვდომის მოთხოვნა „%1$S“ მისამართზე შეიზღუდა, ვინაიდან შეზღუდული გაქვთ ყველა გარეშე საცავთან წვდომის მოთხოვნა და შიგთავსის შეზღუდვაც ჩართულია.
 
 # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByStorageAccessAPI): %3$S, %2$S and %1$S are URLs.
-CookieAllowedForOriginOnTrackerByStorageAccessAPI=საცავთან წვდომის უფლება მიიღო “%3$S-მა“, გახსნილმა “%2$S” მეთვალყურის მიერ “%1$S-ზე”.
+CookieAllowedForOriginOnTrackerByStorageAccessAPI=საცავთან წვდომის მიმღებია „%3$S“, რომელიც გახსნა „%2$S“ მეთვალყურემ მისამართზე „%1$S“.
 
 # LOCALIZATION NOTE (CookieAllowedForTrackerByStorageAccessAPI): %2$S and %1$S are URLs.
-CookieAllowedForTrackerByStorageAccessAPI=საცავთან წვდომა მიიღო “%2$S-მა” “%1$S-ზე”.
+CookieAllowedForTrackerByStorageAccessAPI=საცავთან წვდომის მიმღებია „%2$S“ მისამართზე „%1$S“.
 # LOCALIZATION NOTE (CookieAllowedForOriginOnTrackerByHeuristic): %3$S, %2$S and %1$S are URLs.
-CookieAllowedForOriginOnTrackerByHeuristic=საცავთან წვდომა ავტომატურად მიიღო “%3$S-მა” გახსნილმა “%2$S” მეთვალყურის მიერ “%1$S-ზე”.
+CookieAllowedForOriginOnTrackerByHeuristic=საცავთან წვდომის მიმღებია „%3$S“, რომელიც გახსნა „%2$S“ მეთვალყურემ მისამართზე „%1$S“.
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=საცავთან წვდომა ავტომატურად მიიღო “%2$S” მეთვალყურემ “%1$S-ზე”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=საცავთან წვდომა მიღებულია პირველი მხარის გამიჯვნისთვის „%2$S“ მისამართზე „%1$S“.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=უარყოფილია “%1$S” ფუნთუშა, ვინაიდან აქვს “sameSite=none” თვისება და აკლია “secure” თვისება.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties b/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties
index cb3095f9f8dc..eef3a6b524e0 100644
--- a/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties
+++ b/thunderbird-l10n/ka/chrome/ka/locale/ka/pippki/pippki.properties
@@ -64,7 +64,7 @@ pageInfo_Privacy_None4=გვერდი, რომელსაც ათვა
 pageInfo_EncryptionWithBitsAndProtocol=კავშირი დაშიფრულია (%1$S, გასაღების სიგრძე %2$S ბიტი, %3$S)
 pageInfo_BrokenEncryption=დაზიანებული დაშიფვრა (%1$S, გასაღების სიგრძე %2$S ბიტი, %3$S)
 pageInfo_Privacy_Encrypted1=გვერდი, რომელსაც ათვალიერებთ ინტერნეტით გადაცემამდე დაიშიფრა.
-pageInfo_Privacy_Encrypted2=დაშიფვრა ურთულებს უცხო პირებს, უნებართვოდ ნახონ კომპიუტერებს შორის გადაცემული ინფორმაცია. ამიტომ, ნაკლებად სავარაუდოა, რომ ქსელში გადაცემისას, ვინმე ხედავდეს ამ გვერდს.
+pageInfo_Privacy_Encrypted2=დაშიფვრა ურთულებს უცხო პირებს, უნებართვოდ იხილონ კომპიუტერებს შორის მიმოცვლილი ინფორმაცია. ამიტომ, ნაკლებად სავარაუდოა, რომ ქსელში გადაცემისას, ვინმე ხედავდეს ამ გვერდს.
 pageInfo_MixedContent=კავშირი ნაწილობრივ დაშიფრულია
 pageInfo_MixedContent2=გვერდის შიგთავსის ნაწილი, რომელსაც ათვალიერებთ, ინტერნეტით გადაცემამდე არ დაშიფრულა.
 pageInfo_WeakCipher=საიტთან კავშირისას სუსტი დაშიფვრაა გამოყენებული, რაც ვერ უზრუნველყოფს პირადი მონაცემების უსაფრთხოებას. შესაძლოა, სხვებმაც იხილონ გადაცემული ინფორმაცია, ან საიტის შიგთავსი შეცვალონ.
diff --git a/thunderbird-l10n/ka/localization/ka/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ka/localization/ka/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..af60be7c6db4
--- /dev/null
+++ b/thunderbird-l10n/ka/localization/ka/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = კალენდარის URI-გადამისამართება
+calendar-uri-redirect-description =
+    სერვერი ამისამართებს URI-ის კალენდრისთვის „{ $calendarName }“.
+    გსურთ, გადამისამართების მიღება და ახალი URI-ის გამოყენება ამ კალენდრისთვის?
+calendar-uri-redirect-original-uri-label = მიმდინარე URI:
+calendar-uri-redirect-target-uri-label = გადამისამართების ახალი URI:
diff --git a/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl b/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl
index f5f9fcf9a2fa..270daf23911a 100644
--- a/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl
+++ b/thunderbird-l10n/ka/localization/ka/devtools/startup/aboutDevTools.ftl
@@ -35,7 +35,7 @@ features-debugger-desc = JavaScript-ის მძლავრი გამმა
 features-network-title = ქსელი
 features-network-desc = თვალი ადევნეთ დაკავშირების მოთხოვნებს, რომელთაც შეუძლია შეანელოს ან შეზღუდოს საიტთან წვდომა. <a data-l10n-name="learn-more">{ features-learn-more }</a>
 features-storage-title = საცავების მართვა
-features-storage-desc = დაამატეთ, შეცვალეთ ან გააუქმეთ კეში, ფუნთუშები, ბაზები და სეანსის მონაცემები. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-storage-desc = დაამატეთ, შეცვალეთ ან გააუქმეთ დროებითი ფაილები, ფუნთუშები, ბაზები და სეანსის მონაცემები. <a data-l10n-name="learn-more">{ features-learn-more }</a>
 features-responsive-title = თავსებადი იერსახე
 features-responsive-desc = გამოცადეთ საიტები ვირტუალურ მოწყობილობებზე, თქვენს ბრაუზერშივე. <a data-l10n-name="learn-more">{ features-learn-more }</a>
 features-visual-editing-title = იერსახის შესწორება
diff --git a/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl b/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl
index 5fbdd64957b7..2069c97873b7 100644
--- a/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/ka/localization/ka/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = მოგესალმებათ { -brand-full-name }
+account-settings = ანგარიშის პარამეტრები
+#   $accounts (Number) - the number of configured accounts
 setup-title = აირჩიეთ, რისი გამართვა გსურთ
 about-title = { -brand-full-name } – შესახებ
 resources-title = მასალები
@@ -40,3 +42,10 @@ explore-link = აღმოაჩინეთ შესაძლებლობ
 support-link = მხარდაჭერა
 involved-link = ჩაერთეთ
 developer-link = შემმუშავებლის მასალები
+read = წერილების წაკითხვა
+compose = ახალი წერილის შედგენა
+search = წერილების ძიება
+filter = წერილების ფილტრების მართვა
+nntp-subscription = გამოწერილი ჯგუფების მართვა
+rss-subscription = გამოწერილი არხების მართვა
+e2e = გამჭოლი დაშიფვრა
diff --git a/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl b/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl
index 238f48f4cc44..049797be0e6f 100644
--- a/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl
+++ b/thunderbird-l10n/ka/localization/ka/security/certificates/certManager.ftl
@@ -11,7 +11,7 @@ certmgr-tab-people =
 certmgr-tab-servers =
     .label = სერვერები
 certmgr-tab-ca =
-    .label = სერტიფიკატის გამცემები
+    .label = გამომცემები
 certmgr-mine = თქვენ გაქვთ ამ ორგანიზაციებიდან სერტიფიკატები, რომლებითაც თქვენი ამოცნობა ხდება
 certmgr-people = თქვენ გაქვთ სერტიფიკატები, რომლებითაც შემდეგი პირების ამოცნობა ხდება
 certmgr-servers = თქვენ გაქვთ სერტიფიკატები, რომლებითაც შემდეგი სერვერების ამოცნობა ხდება
diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl
index 708905e06a24..53faf7b1467e 100644
--- a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = დამატების დაყენება ფაილის მეშვეობით…
     .accesskey = ფ
 help-button = დამატებების მხარდაჭერა
+sidebar-help-button-title =
+    .title = დამატებების მხარდაჭერა
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } პარამეტრები
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = ხელსაწყოები ყველა დამატებისთვის
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } პარამეტრები
+           *[other] { -brand-short-name } პარამეტრები
+        }
 show-unsigned-extensions-button =
     .label = ზოგიერთი გაფართოება ვერ გადამოწმდა
 show-all-extensions-button =
@@ -171,13 +179,29 @@ extensions-view-available-updates =
     .name = ხელმისწვდომი განახლებები
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = შემოთავაზებები
+addon-category-discover-title =
+    .title = შემოთავაზებები
 addon-category-extension = გაფართოებები
+addon-category-extension-title =
+    .title = გაფართოებები
 addon-category-theme = თემები
+addon-category-theme-title =
+    .title = თემები
 addon-category-plugin = მოდულები
+addon-category-plugin-title =
+    .title = მოდულები
 addon-category-dictionary = ლექსიკონები
+addon-category-dictionary-title =
+    .title = ლექსიკონები
 addon-category-locale = ენები
+addon-category-locale-title =
+    .title = ენები
 addon-category-available-updates = ხელმისწვდომი განახლებები
+addon-category-available-updates-title =
+    .title = ხელმისწვდომი განახლებები
 addon-category-recent-updates = ბოლო განახლებები
+addon-category-recent-updates-title =
+    .title = ბოლო განახლებები
 
 ## These are global warnings
 
@@ -290,6 +314,7 @@ shortcuts-no-commands = სწრაფი ღილაკები არ ა
 shortcuts-input =
     .placeholder = სწრაფი ღილაკის აკრეფა
 shortcuts-browserAction = გაფართოების ამოქმედება
+shortcuts-browserAction2 = ხელსაწყოთა ზოლზე ღილაკის ამოქმედება
 shortcuts-pageAction = გვერდზე მოქმედების ჩართვა
 shortcuts-sidebarAction = გვერდითა ზოლის გამოჩენა/დამალვა
 shortcuts-modifier-mac = გამოყენებული იყოს Ctrl, Alt, ან ⌘
@@ -314,6 +339,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = ნაკლების ჩვენება
 go-back-button =
     .tooltiptext = უკან გადასვლა
+header-back-button =
+    .title = უკან გადასვლა
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl
index 49d9e4bc1041..96989347e266 100644
--- a/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = შიგთავსი
 sandbox-proc-type-file = ფაილის შიგთავსი
 sandbox-proc-type-media-plugin = მედიის მოდული
 sandbox-proc-type-data-decoder = მონაცემთა გამშიფრავი
+startup-cache-title = დროებითი საცავი გაშვებისთვის
+startup-cache-disk-cache-path = დისკის დროებითი საცავის მისამართი
+startup-cache-ignore-disk-cache = დისკის დროებითი საცავის უგულებელყოფა
+startup-cache-found-disk-cache-on-init = ნაპოვნია დისკის დროებითი საცავი Init-ზე
+startup-cache-wrote-to-disk-cache = ჩაწერილია დისკის დროებით საცავში
 launcher-process-status-0 = ჩართულია
 launcher-process-status-1 = გამორთულია ხარვეზის გამო
 launcher-process-status-2 = გამორთულია ძალით
@@ -310,6 +315,7 @@ touch-enabled = შეხებით შეტანა ჩართული
 drag-enabled = გადაადგილების ზოლის გადატანა შესაძლებელია
 keyboard-enabled = კლავიატურა ჩართულია
 autoscroll-enabled = თვითგადაადგილება ჩართულია
+zooming-enabled = ორი თითით გლუვი მოახლოება და დაშორება ჩართულია
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl
index b3b926872114..0db4d0350b3b 100644
--- a/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/certviewer.ftl
@@ -64,7 +64,7 @@ certificate-viewer-business-category = ბიზნესის კატეგ
 certificate-viewer-subject-name = სუბიექტის დასახელება
 certificate-viewer-issuer-name = გამომცემის დასახელება
 certificate-viewer-validity = ძალამოსილობა
-certificate-viewer-subject-alt-names = სუბიექტის შემცვლელი სახელები
+certificate-viewer-subject-alt-names = სუბიექტის სხვა სახელები
 certificate-viewer-public-key-info = საჯარო გასაღების მონაცემები
 certificate-viewer-miscellaneous = სხვადასხვა
 certificate-viewer-fingerprints = ანაბეჭდები
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (სერტიფიკატი)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (ჯაჭვი)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = ეს გაფართოება მიჩნეულია გადამწვეტად, რაც ნიშნავს, რომ კლიენტებმა უნდა უარყონ სერტიფიკატი, თუ მათთვის გაუგებარია.
+certificate-viewer-export = ცალკე შენახვა
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = თქვენი სერტიფიკატები
+certificate-viewer-tab-people = ხალხი
+certificate-viewer-tab-servers = სერვერები
+certificate-viewer-tab-ca = გამომცემები
+certificate-viewer-tab-unkonwn = უცნობი
diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl
index 459981e0c2d2..bb0733c0299f 100644
--- a/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl
+++ b/thunderbird-l10n/ka/localization/ka/toolkit/about/url-classifier.ftl
@@ -20,18 +20,18 @@ url-classifier-provider-next-update-time = მომდევნო განა
 url-classifier-provider-back-off-time = უკან დაბრუნების დრო
 url-classifier-provider-last-update-status = ბოლო განახლების მდგომარეობა
 url-classifier-provider-update-btn = განახლება
-url-classifier-cache-title = კეში
+url-classifier-cache-title = დროებითი ფაილები
 url-classifier-cache-refresh-btn = განახლება
 url-classifier-cache-clear-btn = გასუფთავება
 url-classifier-cache-table-name = ცხრილის სახელი
 url-classifier-cache-ncache-entries = კეშის უარყოფითი ჩანაწერების რაოდენობა
 url-classifier-cache-pcache-entries = კეშის დადებითი ჩანაწერების რაოდენობა
 url-classifier-cache-show-entries = ჩანაწერების ჩვენება
-url-classifier-cache-entries = კეშის ჩანაწერები
+url-classifier-cache-entries = დროებითი ჩანაწერები
 url-classifier-cache-prefix = წინსართი
-url-classifier-cache-ncache-expiry = კეშის უარყოფითი ჩანაწერების ვადა
+url-classifier-cache-ncache-expiry = უარყოფითი დროებითი ჩანაწერების ვადა
 url-classifier-cache-fullhash = სრული ჰეში
-url-classifier-cache-pcache-expiry = კეშის დადებითი ჩანაწერების ვადა
+url-classifier-cache-pcache-expiry = დადებითი დროებითი ჩანაწერების ვადა
 url-classifier-debug-title = გამართვა
 url-classifier-debug-module-btn = აღრიცხვის მოდულების მითითება
 url-classifier-debug-file-btn = აღრიცხვის ფაილის მითითება
diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl
index fa5ef1f5f15a..208a31f1b2f7 100644
--- a/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/ka/localization/ka/toolkit/global/processTypes.ftl
@@ -5,7 +5,7 @@
 process-type-web = ვებშიგთავსი
 # process used to run privileged pages,
 # such as about:home
-process-type-privileged = უპირატესად შიგთავსი
+process-type-privileged = უპირატესი შიგთავსი
 # process used to run privileged about pages,
 # such as about:home
 process-type-privilegedabout = უპირატესად შესახებ-გვერდები
@@ -24,3 +24,5 @@ process-type-webisolated = განცალკევებული ვებ
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = სოკეტი
diff --git a/thunderbird-l10n/ka/localization/ka/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ka/localization/ka/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..e1a799f63d52
--- /dev/null
+++ b/thunderbird-l10n/ka/localization/ka/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = თქვენ გაუშვით { -brand-product-name }-ის ძველი ვერსია
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = ახალი პროფილის შექმნა
+profiledowngrade-sync = { -brand-product-name }-ის ძველმა ვერსიამ შესაძლოა დააზიანოს სანიშნები და მონახულებული საიტების ისტორია, რომლებიც არსებული { -brand-product-name }-ის პროფილშია განთავსებული. მონაცემების დასაცავად, შექმენით ახალი პროფილი, რომელსაც ეს { -brand-short-name } გამოიყენებს. ასევე ყოველთვის შეგიძლიათ მოიხმაროთ { -fxaccount-brand-name } სანიშნებისა და ისტორიის დასინქრონებისთვის, სხვადასხვა პროფილებს შორის.
+profiledowngrade-nosync = { -brand-product-name }-ის ძველმა ვერსიამ შესაძლოა დააზიანოს სანიშნები და მონახულებული საიტების ისტორია, რომლებიც არსებული { -brand-product-name }-ის პროფილშია განთავსებული. მონაცემების დასაცავად, შექმენით ახალი პროფილი, რომელსაც ეს { -brand-short-name } გამოიყენებს.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] გამოსვლა
+           *[other] დახურვა
+        }
diff --git a/thunderbird-l10n/ka/manifest.json b/thunderbird-l10n/ka/manifest.json
index 30bbdcdd20f3..600c127e10ce 100644
--- a/thunderbird-l10n/ka/manifest.json
+++ b/thunderbird-l10n/ka/manifest.json
@@ -1,57 +1,57 @@
 {
+  "langpack_id": "ka",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "version": "76.0buildid20200420212409",
+  "author": "giasher.com (contributors: გია შერვაშიძე, http://giasher.com)",
+  "name": "Georgian (ქართული) Language Pack",
+  "description": "Language pack for Thunderbird for ka",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "id": "langpack-ka@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
+    }
+  },
   "languages": {
     "ka": {
-      "version": "20200404171350",
+      "version": "20200418135253",
       "chrome_resources": {
-        "devtools-shared": "chrome/ka/locale/ka/devtools/shared/",
-        "messenger-region": "chrome/ka/locale/ka/messenger-region/",
-        "places": "chrome/ka/locale/ka/places/",
-        "alerts": "chrome/ka/locale/ka/alerts/",
-        "calendar": "chrome/ka/locale/ka/calendar/",
-        "mozapps": "chrome/ka/locale/ka/mozapps/",
-        "messenger-newsblog": "chrome/ka/locale/ka/messenger-newsblog/",
-        "pippki": "chrome/ka/locale/ka/pippki/",
-        "devtools": "chrome/ka/locale/ka/devtools/client/",
-        "messenger-mapi": "chrome/ka/locale/ka/messenger-mapi/",
-        "chat": "chrome/ka/locale/ka/chat/",
+        "pipnss": "chrome/ka/locale/ka/pipnss/",
         "messenger": "chrome/ka/locale/ka/messenger/",
-        "pluginproblem": "chrome/ka/locale/ka/pluginproblem/",
-        "mozldap": "chrome/ka/locale/ka/mozldap/",
+        "messenger-smime": "chrome/ka/locale/ka/messenger-smime/",
+        "lightning": "chrome/ka/locale/ka/lightning/",
+        "messenger-mapi": "chrome/ka/locale/ka/messenger-mapi/",
+        "mozapps": "chrome/ka/locale/ka/mozapps/",
         "global-platform": {
-          "linux": "chrome/ka/locale/ka/global-platform/unix/",
-          "android": "chrome/ka/locale/ka/global-platform/unix/",
           "win": "chrome/ka/locale/ka/global-platform/win/",
-          "macosx": "chrome/ka/locale/ka/global-platform/mac/"
+          "android": "chrome/ka/locale/ka/global-platform/unix/",
+          "macosx": "chrome/ka/locale/ka/global-platform/mac/",
+          "linux": "chrome/ka/locale/ka/global-platform/unix/"
         },
-        "pipnss": "chrome/ka/locale/ka/pipnss/",
-        "branding": "chrome/ka/locale/ka/branding/",
+        "communicator": "chrome/ka/locale/ka/communicator/",
+        "messenger-newsblog": "chrome/ka/locale/ka/messenger-newsblog/",
         "passwordmgr": "chrome/ka/locale/ka/passwordmgr/",
-        "messenger-smime": "chrome/ka/locale/ka/messenger-smime/",
-        "lightning": "chrome/ka/locale/ka/lightning/",
-        "necko": "chrome/ka/locale/ka/necko/",
         "global": "chrome/ka/locale/ka/global/",
-        "communicator": "chrome/ka/locale/ka/communicator/",
+        "pluginproblem": "chrome/ka/locale/ka/pluginproblem/",
+        "messenger-region": "chrome/ka/locale/ka/messenger-region/",
+        "necko": "chrome/ka/locale/ka/necko/",
         "autoconfig": "chrome/ka/locale/ka/autoconfig/",
+        "branding": "chrome/ka/locale/ka/branding/",
+        "devtools": "chrome/ka/locale/ka/devtools/client/",
+        "pippki": "chrome/ka/locale/ka/pippki/",
+        "calendar": "chrome/ka/locale/ka/calendar/",
+        "chat": "chrome/ka/locale/ka/chat/",
+        "devtools-shared": "chrome/ka/locale/ka/devtools/shared/",
+        "alerts": "chrome/ka/locale/ka/alerts/",
+        "places": "chrome/ka/locale/ka/places/",
+        "mozldap": "chrome/ka/locale/ka/mozldap/",
         "devtools-startup": "chrome/ka/locale/ka/devtools/startup/"
       }
     }
   },
-  "author": "giasher.com (contributors: გია შერვაშიძე, http://giasher.com)",
-  "name": "Georgian (ქართული) Language Pack",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "applications": {
-    "gecko": {
-      "strict_max_version": "76.*",
-      "id": "langpack-ka@thunderbird.mozilla.org",
-      "strict_min_version": "76.0"
-    }
-  },
-  "langpack_id": "ka",
-  "version": "76.0buildid20200407173003",
-  "manifest_version": 2,
-  "description": "Language pack for Thunderbird for ka"
+  "manifest_version": 2
 }
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties
index a8f3a3b37831..5e02b850fba9 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/calendar/calendar.properties
@@ -325,7 +325,7 @@ caldavResponseError=Teḍra-d tucḍa lawan n uciyaε n tririt.
 caldavRequestStatusCode=Tangalt n waddad: %1$S
 caldavRequestStatusCodeStringGeneric=Asuter ur izmir ara ad yeddu.
 caldavRequestStatusCodeString400=Asuter ur ittwaru yara akken iwata ɣef aya ur izmir ara ad yeddu.
-caldavRequestStatusCodeString403=Aseqdac ur ɣu-s ara tisirag ilaqen akken ad iselkem tuttra.
+caldavRequestStatusCodeString403=Aseqdac ur ɣur-s ara tisirag akken ad iselkem tuttra.
 caldavRequestStatusCodeString404=Taɣbalut ulac-itt
 caldavRequestStatusCodeString409=Tilla di teɣbalut.
 caldavRequestStatusCodeString412=Tawtilt tuzwirt ur teddi ara.
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties
index d8fdce002cb1..ef625c36fb49 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/irc.properties
@@ -133,10 +133,10 @@ message.unknownNick=%S d meffer isem arussin.
 message.channelKeyAdded=%1$S isnifel awall uffir n ubadu ɣeṛ %2$S.
 message.channelKeyRemoved=%S ikkes awal uffir n ubadu.
 #    This will be followed by a list of ban masks.
-message.banMasks=Iseqdacen id yeqqnen si tansiwin-agi ttawagedlen si %S:
+message.banMasks=Iseqdacen i d-yeqqnen si tansiwin-agi ttawagedlen si %S:
 message.noBanMasks=Ulac tnasa ittwagedlen i %S.
-message.banMaskAdded=Iseqdacen id yeqqnen si tansiwin imeɣṛan %1$S ttawagedlen si %2$S.
-message.banMaskRemoved=Iseqdacen id yeqqnen si tansiwin-agi imeɣṛan %1$S ur ttawagedlen ara si %2$S.
+message.banMaskAdded=Iseqdacen i d-yeqqnen si tansiwin n iimeɣran %1$S ttawagedlen si %2$S.
+message.banMaskRemoved=Iseqdacen i d-yeqqnen si tansiwin-agi n yimeɣra %1$S ur ttawagedlen ara si %2$S.
 # LOCALIZATION NOTE (message.ping): Semi-colon list of plural forms.
 #  See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 #   %1$S is the nickname of the user or the server that was pinged.
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties
index 0b80937aae54..a37ad5723c03 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/chat/xmpp.properties
@@ -34,7 +34,7 @@ connection.error.notSendingPasswordInClear=Aqeddac isefrak kan aseseteb s tuzzna
 connection.error.authenticationFailure=Aseseteb ur yeddi ara
 connection.error.notAuthorized=Ur yettusireg ara (Ahat tmuddeḍ awal uffir mačči d ameɣtu?)
 connection.error.failedToGetAResource=Ur yessaweḍ ara ad d-yawi taɣbalut
-connection.error.failedMaxResourceLimit=Amiḍan-agi yeqqen si deqs n imedqan deg iwet n tikelt.
+connection.error.failedMaxResourceLimit=Amiḍan-agi yeqqen si ddeqs n yimeḍqan deg yiwet n tikkelt.
 connection.error.failedResourceNotValid=Taɣbalut mačči d tameɣtut.
 connection.error.XMPPNotSupported=Aqeddac-agi ur yessefrak ara XMPP
 
@@ -110,7 +110,6 @@ tooltip.title=Azwel
 tooltip.organization=Takebbanit
 tooltip.locality=Tamnaṭ
 tooltip.country=Tamurt
-
 tooltip.telephone=Uṭṭun n tiliɣṛi
 
 # LOCALIZATION NOTE (chatRoomField.*):
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties
index 5d587f647a65..de36ec13cc34 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Tzemred ad tsedrurmeḍ aḥric i yefaḍen s
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Ulac alugan icudden
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Ttekki ɣef Shift tessiteḍ akken ad tneggzeḍ ɣer ulugen.
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties
index 9d50cc50ef9c..9f7dd3bb42b6 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/devtools/client/scratchpad.properties
@@ -17,7 +17,7 @@ export.fileOverwriteConfirmation=Afaylu yella. Ad tsemselsiḍ-t?
 
 # LOCALIZATION NOTE  (browserWindow.unavailable): This error message is shown
 # when Scratchpad does not find any recently active main browser window.
-browserWindow.unavailable=Tacirra JavaScript ur d-tuffi ara asfaylu n iminig urmid anda tettuselkam tengalt.
+browserWindow.unavailable=Tacirra JavaScript ur d-tufi ara asfaylu n yiminig urmid anda tettuselkam tengalt.
 
 # LOCALIZATION NOTE  (scratchpadContext.invalid): This error message is shown
 # when user tries to run an operation in Scratchpad in an unsupported context.
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties
index bcc885296c8f..ac664ceaadd5 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/css.properties
@@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Ala yiwen n repeat(auto-fill, …) i y
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Ala yiwen repeat(auto-fill, …) neɣ repeat(auto-fit, …) i yettwasirgen deg tebdart n uḍfaṛ.
 PEMoreThanOneGridRepeatTrackSize=Ala yiwet n teɣzi n uḍfaṛ i yettwasirgen deg ugensu n repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=Ilugan @import mačči d imeɣta akka tura deg tferikiyin n uɣanib yettwabnan.
+
 TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid.
 TooLargeDottedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid.
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties
index f902cf04aec8..02f6a8651ab2 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Asali igdel-it X-Frame-Options: “%1$S” ɣer “%2$S”, asmel ur i
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Asali igdel-it X-Frame-Options: “%1$S” ɣer “%2$S”, asmel ur ittaǧǧa ara aseqdec n yikataren cross-origin seg “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Yiwen uqeṛṛu X-Frame-Options arameɣtu yettwaf-d mi id-yettali “%2$S” : “%1$S” ur telli ara d tazunfalit tameɣtut.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Asali n “%2$S” deg ukatar tegdel-it tzunfalit “ X-Frame-Options“ yettwasbadun ɣer “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Aleqqem n tuttra taraɣelsant “%1$S” akken ad tesseqdec “%2$S”.
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd
index b2262258ded5..6f4aa8139bfa 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Nadi iznan di…">
 <!ENTITY searchMailCmd.accesskey "d">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Anadi amatu...">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Nadi tansiwin…">
 <!ENTITY searchAddressesCmd.accesskey "d">
 
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties
index d88a633d8273..3eb8f9822f9e 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Wagi d izen awgelhan OpenPGP.<br>Akke ad yettwazmek yimayl-agi, tesriḍ ad tesbeddeḍ <a href="%S"> Azegrir OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Aya d izen OpenPGP awgelhen, maaca tallelt i tukksa n uweglhen OpenPGP ulac-itt.
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd
index 5ce47540a677..7f9626b3a0cb 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/preferences/advanced.dtd
@@ -42,7 +42,7 @@
 
 <!-- Data Choices -->
 <!ENTITY telemetrySection.label          "Tilisɣelt">
-<!ENTITY telemetryDesc.label             "Ad yebḍu isefka n timellit, aseqdec, arrum d usugenn n umsaq-inek n tirawt akked &vendorShortName; akken aɣ-d-yefk tallalt i usnerni d useggem n &brandShortName;">
+<!ENTITY telemetryDesc.label             "Bḍu isefka n tmellit, n useqdec, n warrum d waggan n yifecka yeɛnan amsaɣ-inek n yimayl s &vendorShortName; akken ad aɣ-talleḍ ad nerr &brandShortName; ifaz">
 <!ENTITY enableTelemetry.label           "Rmed tilisɣelt">
 <!ENTITY enableTelemetry.accesskey       "l">
 <!ENTITY telemetryLearnMore.label        "Issin ugar">
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties
index 79bdc45e7ea6..1ca8adbd809c 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/messenger/search-operators.properties
@@ -10,7 +10,7 @@
 
 5=send
 6=enld
-    
+  
 7=yugar
 8=daw
 
@@ -28,4 +28,4 @@
 17=ulac-it deg imedlis-iw n tensa
 18=mačči d ilem
 19=imeɣra
-20=ur imeqri ara
+20=ur imcuba ara
diff --git a/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties b/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties
index b8652cbeb254..253fcf7b40ca 100644
--- a/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties
+++ b/thunderbird-l10n/kab/chrome/kab/locale/kab/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Anekcum Ɣer uklas ittusireg s wudem
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Anekcum Ɣer uklas ittusireg s wudem awurman i uneḍfar “%2$S” deg “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Anekcum ɣer uklas yettusireg s wudem awurman i uɛzal n uḥric amezwaru "%2$S" deg "%1$S".
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Anagi n tuqqna “%1$S” yettwagi acku amyerr “sameSite=none” maca mačči imyerr “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/kab/localization/kab/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/kab/localization/kab/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..e4ea553606fd
--- /dev/null
+++ b/thunderbird-l10n/kab/localization/kab/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Wehhi URL n uwitay
+calendar-uri-redirect-description =
+    Aqeddac iwehha URL ɣer uwitay "{ $calendarName }". 
+    Qbel awehhi, tebduḍ aseqdec n URI amaynut i uwitay-a?
+calendar-uri-redirect-original-uri-label = URI amiran:
+calendar-uri-redirect-target-uri-label = Awehhi  ɣer URI amaynut:
diff --git a/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl b/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl
index 14c58bc444a5..2a0626cc0550 100644
--- a/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/kab/localization/kab/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Ansuf ɣer { -brand-full-name }
+account-settings = Iɣewwaṛen n umiḍan
+#   $accounts (Number) - the number of configured accounts
 setup-title = Fren iferdisen ara yemtawin
 about-title = Ɣef { -brand-full-name }
 resources-title = Tiɣbula
@@ -42,3 +44,10 @@ explore-link = Snirem timahilin
 support-link = Tallelt
 involved-link = Ttekki
 developer-link = Tasemlit n uneflay
+read = Ɣer iznan
+compose = Aru izen amaynut
+search = Nadi iznan
+filter = Sefrek imsizdigen n yizen
+nntp-subscription = Sefrek amulteɣ n ugraw n yisallen
+rss-subscription = Sefrek amulteɣ n usuddem
+e2e = Awgelhen seg yixef ɣer wayeḍ
diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl
index cd896e1f3d42..205c2b50332a 100644
--- a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Sebded azegrir seg ufaylu…
     .accesskey = S
 help-button = Tallelt izegrar
+sidebar-help-button-title =
+    .title = Tallelt izegrar
 preferences =
     { PLATFORM() ->
         [windows] Iɣewwaren n { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Ifecka i yizegrar imaṛṛa
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Iɣewwaren n { -brand-short-name }
+           *[other] Ismenyifen n { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Kra n iseɣzaf ur ţwasenqeden ara
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Ileqman yellan
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Iwellihen
+addon-category-discover-title =
+    .title = Iwellihen
 addon-category-extension = Isiɣzaf
+addon-category-extension-title =
+    .title = Isiɣzaf
 addon-category-theme = Isental
+addon-category-theme-title =
+    .title = Isental
 addon-category-plugin = Izegrar
+addon-category-plugin-title =
+    .title = Izegrar
 addon-category-dictionary = Imawalen
+addon-category-dictionary-title =
+    .title = Imawalen
 addon-category-locale = Tutlayin
+addon-category-locale-title =
+    .title = Tutlayin
 addon-category-available-updates = Ileqman yellan
+addon-category-available-updates-title =
+    .title = Ileqman yellan
 addon-category-recent-updates = Ileqman n melmi kan
+addon-category-recent-updates-title =
+    .title = Ileqman n melmi kan
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Isiɣzaf id-iteddun ur sɛin ara inegzumen:
 shortcuts-input =
     .placeholder = Sekcem anegzum
 shortcuts-browserAction = Rmed isiɣzaf
+shortcuts-browserAction2 = Rmed taqeffalt n ufeggag n yifecka
 shortcuts-pageAction = Rmed tigawt n usebter
 shortcuts-sidebarAction = Sken/Fer agalis adisan
 shortcuts-modifier-mac = Seddu Ctrl, Alt, neɣ ⌘
@@ -312,6 +337,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Sken qel
 go-back-button =
     .tooltiptext = Uɣal ɣer deffir
+header-back-button =
+    .title = Uɣal ɣer deffir
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl
index 0fb6dbee2e37..592db6bbf4a0 100644
--- a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = agbur
 sandbox-proc-type-file = agbur n ufaylu
 sandbox-proc-type-media-plugin = asiɣzef n wallen n teywalt
 sandbox-proc-type-data-decoder = akestengal n yisefka
+startup-cache-title = Tanekkra tuffirt
+startup-cache-disk-cache-path = Abrid n uḍbsi n tuffra
+startup-cache-ignore-disk-cache = Eǧǧ aḍebsi n tuffra
+startup-cache-found-disk-cache-on-init = Aḍebsi n tuffra yettwaf deg Init
+startup-cache-wrote-to-disk-cache = Aru deg uḍebsi n tuffra
 launcher-process-status-0 = Irmed
 launcher-process-status-1 = Yensa ɣef sebba n tuccḍa
 launcher-process-status-2 = Arurmid s tedusi
@@ -310,6 +315,7 @@ touch-enabled = anekcum amennalan irmed
 drag-enabled = Adrurem nufeggag yettwarmed
 keyboard-enabled = anasiw yermed
 autoscroll-enabled = Adrurem awurman yermed
+zooming-enabled = smooth pinch-zoom yermed
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl
index 5947b0883442..b75b4aa67269 100644
--- a/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl
+++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/aboutTelemetry.ftl
@@ -19,7 +19,7 @@ about-telemetry-page-title = Isefka n tilisɣelt
 about-telemetry-current-store = Tahanut tamirant:
 about-telemetry-more-information = Tettnadiḍ ugar n telγut?
 about-telemetry-firefox-data-doc = <a data-l10n-name="data-doc-link">Tisemlit n isefka Firefox</a> tegber imniren γef amek ad nseqdec s ifecka n isefka.
-about-telemetry-telemetry-client-doc = <a data-l10n-name="client-doc-link">Tisemlit n umsaγ tilisγelt</a>tegber tabadut yef tiktiwin, API tisemlit akked isefka ittwamlen.
+about-telemetry-telemetry-client-doc = <a data-l10n-name="client-doc-link">Tisemlit n umsaγ tilisγelt</a>tegber tabadutin yef tiktiwin, API tisemlit akked isefka ittwamlen.
 about-telemetry-telemetry-dashboard = <a data-l10n-name="dashboard-link">Tafelwit n tilisγelt</a> ad k-tsireg akken ad twaliḍ isefka ittwaznen i Mozilla s ttawil n tilispyelt.
 about-telemetry-telemetry-probe-dictionary = <a data-l10n-name="probe-dictionary-link">Amawal n usenqed</a> ittmuddu-d talqayt akked uglam i isenqaden id-telqeḍ tilisɣelt.
 about-telemetry-show-in-Firefox-json-viewer = Ldi deg umeskan JSON
diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl
index e734e1d31e84..9bafd9532325 100644
--- a/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/kab/localization/kab/toolkit/about/certviewer.ftl
@@ -80,7 +80,7 @@ certificate-viewer-embedded-scts = SCT usliɣ
 certificate-viewer-crl-endpoints = Agazen n tagara CRL
 # This message is used as a row header in the Miscellaneous section. 
 # The associated data cell contains links to download the certificate.
-certificate-viewer-download = Sider
+certificate-viewer-download = Sader
 # This message is used to replace boolean values (true/false) in several certificate fields, e.g. Certificate Authority
 # Variables:
 #   $boolean (String) - true/false value for the specific field
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Asiɣzef-agi yettwacreḍ d uzɣin, ayagi yebɣa ad d-yini dakken ilaq imsaɣen ad agin aselkin ma yella ur tegzin ara.
+certificate-viewer-export = Kter
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Iselkinen-ik(im)
+certificate-viewer-tab-people = Medden
+certificate-viewer-tab-servers = Iqeddacen
+certificate-viewer-tab-ca = Iduba
+certificate-viewer-tab-unkonwn = Arussin
diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl
index 24aaeefdfdca..90acda52b085 100644
--- a/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/kab/localization/kab/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Agbur web yettwaɛezlen
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Agrudmawan
diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..3c274e559841
--- /dev/null
+++ b/thunderbird-l10n/kab/localization/kab/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Tessenkkreḍ lqem aqbuṛ n { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Rnu amaɣnu amaynut
+profiledowngrade-sync = Aseqdec n lqem aqbuṛ n { -brand-product-name } izmer ad isexseṛ ticraḍ n yisebtar akked uzray n tunigin i yettwaskelsen yakan deg umaɣnu { -brand-product-name } yellan. Akken ad tettummesten telɣut-ik, rnu amaqnu amaynut i usebeddi-a n { -brand-short-name }. Tzemreḍ yal tikkelt ad teqqneḍ s { -fxaccount-brand-name } akken ad temtawiḍ ticraḍ-ik n yisebtar akked uzray n tunigin gar yimuɣna.
+profiledowngrade-nosync = Aseqdec n lqem aqbuṛ n { -brand-product-name } izmer ad isexseṛ ticraḍ n yisebtar akked uzray n tunigin i yettwaskelsen yakan deg umaɣnu { -brand-product-name } yellan. Akken ad tettummesten telɣut-ik, rnu amaqnu amaynut i usebeddi-a n { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Ffeɣ
+           *[other] Ffeɣ
+        }
diff --git a/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl b/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl
index 074a38de9ffb..bc05e42df5dd 100644
--- a/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl
+++ b/thunderbird-l10n/kab/localization/kab/toolkit/printing/printPreview.ftl
@@ -9,7 +9,7 @@ printpreview-simplify-page-checkbox =
 printpreview-simplify-page-checkbox-enabled =
     .label = { printpreview-simplify-page-checkbox.label }
     .accesskey = { printpreview-simplify-page-checkbox.accesskey }
-    .tooltiptext = Snifek taneɣruft i tɣuri fessusen
+    .tooltiptext = Snifel taneɣruft i tɣuri fessusen
 printpreview-close =
     .label = Mdel
     .accesskey = M
diff --git a/thunderbird-l10n/kab/manifest.json b/thunderbird-l10n/kab/manifest.json
index 335cdbd60780..5e614e6e2c1f 100644
--- a/thunderbird-l10n/kab/manifest.json
+++ b/thunderbird-l10n/kab/manifest.json
@@ -1,57 +1,57 @@
 {
   "name": "Taqbaylit Language Pack",
-  "version": "76.0buildid20200407173003",
+  "version": "76.0buildid20200420212409",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "description": "Language pack for Thunderbird for kab",
   "languages": {
     "kab": {
-      "version": "20200405203521",
+      "version": "20200420102502",
       "chrome_resources": {
-        "communicator": "chrome/kab/locale/kab/communicator/",
-        "pluginproblem": "chrome/kab/locale/kab/pluginproblem/",
-        "messenger-mapi": "chrome/kab/locale/kab/messenger-mapi/",
-        "messenger-newsblog": "chrome/kab/locale/kab/messenger-newsblog/",
-        "global": "chrome/kab/locale/kab/global/",
         "devtools": "chrome/kab/locale/kab/devtools/client/",
-        "devtools-startup": "chrome/kab/locale/kab/devtools/startup/",
+        "mozapps": "chrome/kab/locale/kab/mozapps/",
+        "branding": "chrome/kab/locale/kab/branding/",
+        "messenger-region": "chrome/kab/locale/kab/messenger-region/",
+        "chat": "chrome/kab/locale/kab/chat/",
+        "global": "chrome/kab/locale/kab/global/",
+        "mozldap": "chrome/kab/locale/kab/mozldap/",
+        "devtools-shared": "chrome/kab/locale/kab/devtools/shared/",
+        "passwordmgr": "chrome/kab/locale/kab/passwordmgr/",
+        "messenger-mapi": "chrome/kab/locale/kab/messenger-mapi/",
+        "alerts": "chrome/kab/locale/kab/alerts/",
         "messenger-smime": "chrome/kab/locale/kab/messenger-smime/",
+        "devtools-startup": "chrome/kab/locale/kab/devtools/startup/",
+        "pippki": "chrome/kab/locale/kab/pippki/",
         "global-platform": {
-          "win": "chrome/kab/locale/kab/global-platform/win/",
+          "macosx": "chrome/kab/locale/kab/global-platform/mac/",
           "linux": "chrome/kab/locale/kab/global-platform/unix/",
           "android": "chrome/kab/locale/kab/global-platform/unix/",
-          "macosx": "chrome/kab/locale/kab/global-platform/mac/"
+          "win": "chrome/kab/locale/kab/global-platform/win/"
         },
+        "messenger-newsblog": "chrome/kab/locale/kab/messenger-newsblog/",
+        "pluginproblem": "chrome/kab/locale/kab/pluginproblem/",
         "lightning": "chrome/kab/locale/kab/lightning/",
-        "messenger-region": "chrome/kab/locale/kab/messenger-region/",
-        "mozapps": "chrome/kab/locale/kab/mozapps/",
-        "chat": "chrome/kab/locale/kab/chat/",
-        "alerts": "chrome/kab/locale/kab/alerts/",
-        "pippki": "chrome/kab/locale/kab/pippki/",
-        "devtools-shared": "chrome/kab/locale/kab/devtools/shared/",
-        "passwordmgr": "chrome/kab/locale/kab/passwordmgr/",
-        "mozldap": "chrome/kab/locale/kab/mozldap/",
-        "necko": "chrome/kab/locale/kab/necko/",
-        "pipnss": "chrome/kab/locale/kab/pipnss/",
-        "branding": "chrome/kab/locale/kab/branding/",
         "messenger": "chrome/kab/locale/kab/messenger/",
         "calendar": "chrome/kab/locale/kab/calendar/",
         "autoconfig": "chrome/kab/locale/kab/autoconfig/",
-        "places": "chrome/kab/locale/kab/places/"
+        "pipnss": "chrome/kab/locale/kab/pipnss/",
+        "places": "chrome/kab/locale/kab/places/",
+        "necko": "chrome/kab/locale/kab/necko/",
+        "communicator": "chrome/kab/locale/kab/communicator/"
       }
     }
   },
+  "manifest_version": 2,
+  "author": "mozilla.org (contributors: Belkacem Mohammed)",
   "applications": {
     "gecko": {
+      "strict_min_version": "76.0",
       "id": "langpack-kab@thunderbird.mozilla.org",
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
+      "strict_max_version": "76.*"
     }
   },
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "manifest_version": 2,
-  "description": "Language pack for Thunderbird for kab",
-  "langpack_id": "kab",
-  "author": "mozilla.org (contributors: Belkacem Mohammed)"
+  "langpack_id": "kab"
 }
diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd
index 1fe6fe9460f2..72b191b17993 100644
--- a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd
+++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/calendar.dtd
@@ -10,6 +10,7 @@
 <!ENTITY calendar.newtask.button.tooltip          "Жаңа тапсырманы жасау" >
 
 <!ENTITY calendar.unifinder.todoitems.label       "Тапсырмалар" >
+
 <!ENTITY calendar.unifinder.showcompletedtodos.label "Аяқталған тапсырмаларды көрсету">
 
 <!ENTITY calendar.today.button.label          "Бүгін">
@@ -178,8 +179,6 @@
 <!ENTITY calendar.context.attendance.menu.label                 "Қатысу">
 <!ENTITY calendar.context.attendance.menu.accesskey             "т">
 <!ENTITY calendar.context.attendance.occurrence.label           "Бұл қайталануы">
-<!ENTITY calendar.context.attendance.all.label        "Бүкіл кездерін" >
-
 <!ENTITY calendar.context.attendance.all2.label                 "Оқиғалардың барлық қайталанулары">
 <!ENTITY calendar.context.attendance.send.label                 "Ескертуді қазір жіберу">
 <!ENTITY calendar.context.attendance.send.accesskey             "ж">
@@ -366,6 +365,7 @@
 <!ENTITY calendarproperties.firealarms.label               "Еске салуларды көрсету">
 <!ENTITY calendarproperties.cache3.label                   "Желіден тыс қолдау">
 <!ENTITY calendarproperties.enabled.label                  "Бұл күнтізбені іске қосу">
+<!ENTITY calendarproperties.enabled2.label                 "Бұл күнтізбені іске қосу">
 <!ENTITY calendarproperties.forceDisabled.label            "Бұл күнтізбенің ұсынушысын табу мүмкін емес. Бұл кейбір қосымшалар сөндірілген немесе өшірілген кезде болуы мүмкін.">
 <!ENTITY calendarproperties.unsubscribe.label              "Жазылудан бас тарту">
 <!ENTITY calendarproperties.unsubscribe.accesskey          "б">
diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd
index 492a17a4f9fd..4e342778407c 100644
--- a/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd
+++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/calendar/preferences/preferences.dtd
@@ -8,4 +8,4 @@
 <!ENTITY  paneViews.title         "Көріністер">
 <!ENTITY  panelHeader.title       "Күнтізбе">
 <!ENTITY  panelReminder.title     "Еске салулар">
-<!ENTITY  panelCatecory.title     "Санаттар">
+<!ENTITY  panelCategory.title     "Санаттар">
diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd
index 5edc9c9eed8c..7815f908ea98 100644
--- a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd
+++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.dtd
@@ -23,6 +23,8 @@
 <!ENTITY lightning.menupopup.open.accesskey           "А">
 <!ENTITY lightning.menupopup.open.message.label       "Сақталған хабарлама…">
 <!ENTITY lightning.menupopup.open.message.accesskey   "л">
+
+<!-- Open menu popup in File menu -->
 <!ENTITY lightning.menupopup.open.calendar.label      "Күнтізбе файлы…">
 <!ENTITY lightning.menupopup.open.calendar.accesskey  "К">
 
@@ -67,6 +69,9 @@
 <!ENTITY lightning.imipbar.btnDelete.tooltiptext                            "Күнтізбеден өшіру">
 <!ENTITY lightning.imipbar.btnDetails.label                                 "Көбірек білу…">
 <!ENTITY lightning.imipbar.btnDetails.tooltiptext                           "Оқиға ақпаратын көрсету">
+<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label                        "Бұл хабарларламаларды маған көрсетпеу">
+<!ENTITY lightning.imipbar.btnGoToCalendar.label                            "Күнтізбе">
+<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext                      "Күнтізбе бетіне ауысу">
 <!ENTITY lightning.imipbar.btnMore.label                                    "Көбірек">
 <!ENTITY lightning.imipbar.btnMore.tooltiptext                              "Көбірек опцияларды көрсету үшін шертіңіз">
 <!ENTITY lightning.imipbar.btnReconfirm2.label                              "Қайта растау">
diff --git a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties
index 41ae672da889..f3d617b62963 100644
--- a/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties
+++ b/thunderbird-l10n/kk/chrome/kk/locale/kk/lightning/lightning.properties
@@ -142,29 +142,22 @@ imipBarReplyToNotExistingItem=Бұл хабарламада сіздің күн
 imipBarReplyToRecentlyRemovedItem=Бұл хабарламада сіздің күнтізбеңізден %1$S өшірілген оқиғаға сілтейтін жауап бар.
 imipBarUnsupportedText=Бұл хабарламада Lightning бұл нұсқасы өңдей алмайтын оқиға бар.
 imipBarProcessingFailed=Хабарламаны өңдеу сәтсіз аяқталды. Қалып-күйі: %1$S.
+imipBarCalendarDeactivated=Бұл хабарламада оқиға туралы ақпарат бар. Оны өңдеу үшін күнтізбені іске қосыңыз.
 imipBarNotWritable=Шақырулар үшін ешбір күнтізбе бапталмаған, күнтізбе қасиеттерін тексеріңіз.
 imipSendMail.title=Эл. поштамен хабарландыру
 imipSendMail.text=Хабарландыру эл. поштасын қазір жіберуді қалайсыз ба?
 imipNoIdentity=Ешнәрсе
 imipNoCalendarAvailable=Жазуға болатын бірде-бір қолжетерлік күнтізбе жоқ.
 
-itipReplySubject=Оқиғаға шақыруға жауап: %1$S
-
 itipReplySubject2=Шақыруға жауап: %1$S
 itipReplyBodyAccept=%1$S сіздің оқиғаға шақыруыңызды қабылдады.
 itipReplyBodyDecline=%1$S сіздің оқиғаға шақыруыңызды тайдырды.
-itipReplySubjectAccept=Оқиғаға шақыруға жауап (қабылданды): %1$S
-itipReplySubjectDecline=Оқиғаға шақыруға жауап (тайдырылды): %1$S
-itipReplySubjectTentative=Оқиғаға шақыруға жауап (мүмкін деп): %1$S
-itipRequestSubject=Оқиғаға шақыру: %1$S
-itipRequestUpdatedSubject=Жаңартылған оқиғаға шақыру: %1$S
 itipReplySubjectAccept2=Қабылданды: %1$S
 itipReplySubjectDecline2=Шақыру тайдырылды: %1$S
 itipReplySubjectTentative2=Мүмкін деп: %1$S
 itipRequestSubject2=Шақыру: %1$S
 itipRequestUpdatedSubject2=Жаңартылды: %1$S
 itipRequestBody=%1$S сізді %2$S қатысуға шақырды
-itipCancelSubject=Оқиғадан бас тартылды: %1$S
 itipCancelSubject2=Бас тартылды: %1$S
 itipCancelBody=%1$S бұл оқиғаны бас тартылған етті: %2$S
 itipCounterBody=%1$S "%2$S" үшін кері ұсынысты жасады:
@@ -203,27 +196,5 @@ binaryComponentUnknown=%1$S үшін керек бинарлық құраман
 # %1$S - The Lightning brand name, from the brandShortName string above.
 binaryComponentTitle=%1$S нұсқасы сәйкес келмейді
 
-# LOCALIZATION_NOTE(integrationLabel): Used by the notification bar shown when
-# Lightning is installed from the distribution folder. To trigger it, start a
-# new profile without Lightning in a previous Thunderbird version, then upgrade
-# to a Thunderbird that has Lightning packaged. See bug 1130852 for details.
-integrationLabel=%1$S құрамында енді %2$S кеңейтудің енуі көмегімен күнтізбе мүмкіндіктері бар.
-integrationLearnMoreButton=Көбірек білу
-integrationLearnMoreAccessKey=л
-integrationOptOutButton=Сөндіру
-integrationOptOutAccessKey=д
-integrationKeepItButton=Қалдыру
-integrationKeepItAccessKey=л
-
-# LOCALIZATION_NOTE(integrationRestartLabel): At the current time its not yet
-# clear if we will be completely uninstalling Lightning or disabling it. Please
-# translate this string in a general manner, so that it makes sense for both
-# options.
-integrationRestartLabel=%1$S сіз келесі рет %2$S қайта іске қосқан кезде өшірілетін болады. Сіз оны кейін де, Қосымшалар басқарушысын қолданып, орната аласыз.
-integrationRestartButton=Қазір қайта қосу
-integrationRestartAccessKey=й
-integrationUndoButton=Болдырмау
-integrationUndoAccessKey=ы
-
 # LOCALIZATION NOTE(noIdentitySelectedNotification):
 noIdentitySelectedNotification=Бұл күнтізбеде басқа адамдарға жіберілетін немесе олардан келген шақыруларды сақтауды қаласаңыз, төменде эл. пошта адресіңізді көрсетуіңіз керек.
diff --git a/thunderbird-l10n/kk/localization/kk/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/kk/localization/kk/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..2a5e5719ea64
--- /dev/null
+++ b/thunderbird-l10n/kk/localization/kk/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Күнтізбе URI-ін қайта бағыттау
+calendar-uri-redirect-description =
+    Сервер "{ $calendarName }" күнтізбе URI-ін қайта бағыттауда.
+    Қайта бағыттауды қабылдап, бұл күнтізбе үшін жаңа URI қолданып бастау керек пе?
+calendar-uri-redirect-original-uri-label = Ағымдағы URI:
+calendar-uri-redirect-target-uri-label = Жаңа URI-ге қайта бағыттау:
diff --git a/thunderbird-l10n/kk/localization/kk/calendar/calendar-widgets.ftl b/thunderbird-l10n/kk/localization/kk/calendar/calendar-widgets.ftl
new file mode 100644
index 000000000000..1e00697fd8d7
--- /dev/null
+++ b/thunderbird-l10n/kk/localization/kk/calendar/calendar-widgets.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-deactivated-notification-events = Барлық күнтізбелер қазір сөндірілген. Оқиғаларды қосу немесе түзету үшін бар болып тұрған күнтізбені іске қосыңыз, немесе жаңасын қосыңыз.
+calendar-deactivated-notification-tasks = Барлық күнтізбелер қазір сөндірілген. Тапсырмаларды қосу немесе түзету үшін бар болып тұрған күнтізбені іске қосыңыз, немесе жаңасын қосыңыз.
diff --git a/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl
index 6bceb6d5c99d..7c54bb59fd55 100644
--- a/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/kk/localization/kk/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Файлдан қосымшаны орнату…
     .accesskey = Ф
 help-button = Қосымшаларды қолдау
+sidebar-help-button-title =
+    .title = Қосымшаларды қолдау
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } опциялары
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Барлық қосымшалар үшін құралдар
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } опциялары
+           *[other] { -brand-short-name } баптаулары
+        }
 show-unsigned-extensions-button =
     .label = Кейбір кеңейтулерді растау мүмкін емес
 show-all-extensions-button =
@@ -163,13 +171,29 @@ extensions-view-available-updates =
     .name = Қолжетерлік жаңартулар
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Ұсыныстар
+addon-category-discover-title =
+    .title = Ұсыныстар
 addon-category-extension = Кеңейтулер
+addon-category-extension-title =
+    .title = Кеңейтулер
 addon-category-theme = Темалар
+addon-category-theme-title =
+    .title = Темалар
 addon-category-plugin = Плагиндер
+addon-category-plugin-title =
+    .title = Плагиндер
 addon-category-dictionary = Сөздіктер
+addon-category-dictionary-title =
+    .title = Сөздіктер
 addon-category-locale = Тілдер
+addon-category-locale-title =
+    .title = Тілдер
 addon-category-available-updates = Қолжетерлік жаңартулар
+addon-category-available-updates-title =
+    .title = Қолжетерлік жаңартулар
 addon-category-recent-updates = Соңғы жаңартулар
+addon-category-recent-updates-title =
+    .title = Соңғы жаңартулар
 
 ## These are global warnings
 
@@ -306,6 +330,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Азырақ көрсету
 go-back-button =
     .tooltiptext = Артқа
+header-back-button =
+    .title = Артқа
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/kk/localization/kk/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/kk/localization/kk/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..dbf951b8baf0
--- /dev/null
+++ b/thunderbird-l10n/kk/localization/kk/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Сіз ескірген { -brand-product-name } нұсқасын жөнелттіңіз
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Жаңа профильді жасау
+profiledowngrade-sync = Ескілеу { -brand-product-name } нұсқасын қолдану бар болып тұрған { -brand-product-name } профиліне сақталған бетбелгілер және шолу тарихын зақымдауы мүмкін. Ақпаратыңызды қорғау үшін, { -brand-short-name } бұл орнатуы үшін жаңа профильді жасаңыз. Профильдер арасында бетбелгілер және шолу тарихын синхрондау үшін, сіз әрқашан да { -fxaccount-brand-name } көмегімен кіре аласыз.
+profiledowngrade-nosync = Ескілеу { -brand-product-name } нұсқасын қолдану бар болып тұрған { -brand-product-name } профиліне сақталған бетбелгілер және шолу тарихын зақымдауы мүмкін. Ақпаратыңызды қорғау үшін, { -brand-short-name } бұл орнатуы үшін жаңа профильді жасаңыз.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Шығу
+           *[other] Шығу
+        }
diff --git a/thunderbird-l10n/kk/manifest.json b/thunderbird-l10n/kk/manifest.json
index bc2fd7453ecc..6e6b40b43ead 100644
--- a/thunderbird-l10n/kk/manifest.json
+++ b/thunderbird-l10n/kk/manifest.json
@@ -1,57 +1,57 @@
 {
+  "manifest_version": 2,
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "langpack_id": "kk",
+  "name": "Kazakh (KZ) Language Pack",
+  "author": "mozilla.org (contributors: Baurzhan Muftakhidinov, Timur Timirkhanov, Zhanbolat Satybaldinov)",
+  "version": "76.0buildid20200420212409",
+  "description": "Language pack for Thunderbird for kk",
   "languages": {
     "kk": {
-      "version": "20200405082441",
+      "version": "20200419175425",
       "chrome_resources": {
-        "chat": "chrome/kk/locale/kk/chat/",
-        "messenger": "chrome/kk/locale/kk/messenger/",
-        "lightning": "chrome/kk/locale/kk/lightning/",
+        "pipnss": "chrome/kk/locale/kk/pipnss/",
+        "devtools-startup": "chrome/kk/locale/kk/devtools/startup/",
         "calendar": "chrome/kk/locale/kk/calendar/",
-        "passwordmgr": "chrome/kk/locale/kk/passwordmgr/",
-        "places": "chrome/kk/locale/kk/places/",
-        "devtools": "chrome/kk/locale/kk/devtools/client/",
+        "lightning": "chrome/kk/locale/kk/lightning/",
+        "mozldap": "chrome/kk/locale/kk/mozldap/",
+        "messenger-smime": "chrome/kk/locale/kk/messenger-smime/",
+        "communicator": "chrome/kk/locale/kk/communicator/",
+        "messenger-region": "chrome/kk/locale/kk/messenger-region/",
         "messenger-mapi": "chrome/kk/locale/kk/messenger-mapi/",
-        "messenger-newsblog": "chrome/kk/locale/kk/messenger-newsblog/",
+        "pluginproblem": "chrome/kk/locale/kk/pluginproblem/",
         "global-platform": {
-          "android": "chrome/kk/locale/kk/global-platform/unix/",
           "win": "chrome/kk/locale/kk/global-platform/win/",
-          "linux": "chrome/kk/locale/kk/global-platform/unix/",
-          "macosx": "chrome/kk/locale/kk/global-platform/mac/"
+          "android": "chrome/kk/locale/kk/global-platform/unix/",
+          "macosx": "chrome/kk/locale/kk/global-platform/mac/",
+          "linux": "chrome/kk/locale/kk/global-platform/unix/"
         },
-        "autoconfig": "chrome/kk/locale/kk/autoconfig/",
-        "messenger-smime": "chrome/kk/locale/kk/messenger-smime/",
-        "alerts": "chrome/kk/locale/kk/alerts/",
+        "passwordmgr": "chrome/kk/locale/kk/passwordmgr/",
+        "messenger-newsblog": "chrome/kk/locale/kk/messenger-newsblog/",
+        "chat": "chrome/kk/locale/kk/chat/",
+        "messenger": "chrome/kk/locale/kk/messenger/",
+        "devtools-shared": "chrome/kk/locale/kk/devtools/shared/",
+        "devtools": "chrome/kk/locale/kk/devtools/client/",
         "mozapps": "chrome/kk/locale/kk/mozapps/",
         "pippki": "chrome/kk/locale/kk/pippki/",
-        "devtools-startup": "chrome/kk/locale/kk/devtools/startup/",
-        "messenger-region": "chrome/kk/locale/kk/messenger-region/",
+        "places": "chrome/kk/locale/kk/places/",
+        "autoconfig": "chrome/kk/locale/kk/autoconfig/",
         "branding": "chrome/kk/locale/kk/branding/",
-        "global": "chrome/kk/locale/kk/global/",
-        "mozldap": "chrome/kk/locale/kk/mozldap/",
-        "communicator": "chrome/kk/locale/kk/communicator/",
         "necko": "chrome/kk/locale/kk/necko/",
-        "devtools-shared": "chrome/kk/locale/kk/devtools/shared/",
-        "pluginproblem": "chrome/kk/locale/kk/pluginproblem/",
-        "pipnss": "chrome/kk/locale/kk/pipnss/"
+        "alerts": "chrome/kk/locale/kk/alerts/",
+        "global": "chrome/kk/locale/kk/global/"
       }
     }
   },
-  "langpack_id": "kk",
   "applications": {
     "gecko": {
-      "strict_max_version": "76.*",
       "strict_min_version": "76.0",
-      "id": "langpack-kk@thunderbird.mozilla.org"
+      "id": "langpack-kk@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
     }
-  },
-  "manifest_version": 2,
-  "description": "Language pack for Thunderbird for kk",
-  "version": "76.0buildid20200407173003",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "name": "Kazakh (KZ) Language Pack",
-  "author": "mozilla.org (contributors: Baurzhan Muftakhidinov, Timur Timirkhanov, Zhanbolat Satybaldinov)"
+  }
 }
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd
index 16ea668d5e14..8739aaf26cf7 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/calendar/calendar.dtd
@@ -10,6 +10,7 @@
 <!ENTITY calendar.newtask.button.tooltip          "새 캘린더 태스크를 만듭니다" >
 
 <!ENTITY calendar.unifinder.todoitems.label       "태스크" >
+
 <!ENTITY calendar.unifinder.showcompletedtodos.label "완료된 태스크 보이기">
 
 <!ENTITY calendar.today.button.label          "오늘">
@@ -178,8 +179,6 @@
 <!ENTITY calendar.context.attendance.menu.label                 "참여">
 <!ENTITY calendar.context.attendance.menu.accesskey             "d">
 <!ENTITY calendar.context.attendance.occurrence.label           "현재 일정만">
-<!ENTITY calendar.context.attendance.all.label        "모든 일정" >
-
 <!ENTITY calendar.context.attendance.all2.label                 "완전한 시리즈">
 <!ENTITY calendar.context.attendance.send.label                 "지금 알림 보냄">
 <!ENTITY calendar.context.attendance.send.accesskey             "S">
@@ -366,6 +365,7 @@
 <!ENTITY calendarproperties.firealarms.label               "알람 보기">
 <!ENTITY calendarproperties.cache3.label                   "오프라인 지원">
 <!ENTITY calendarproperties.enabled.label                  "이 캘린더 전환: ">
+<!ENTITY calendarproperties.enabled2.label                 "이 캘린더 활성화">
 <!ENTITY calendarproperties.forceDisabled.label            "이 캘린더에 대한 공급자를 찾을 수 없습니다. 이 문제는 어떤 부가 기능을 사용 안함 또는 삭제를 했을 경우에 자주 발생할 수 있습니다.">
 <!ENTITY calendarproperties.unsubscribe.label              "해지">
 <!ENTITY calendarproperties.unsubscribe.accesskey          "U">
@@ -409,5 +409,3 @@
 <!ENTITY calendar.extract.task.button          "태스크 추가">
 <!ENTITY calendar.extract.event.button.tooltip "메시지에서 날짜 정보를 추출하여 캘린더에 이벤트로 추가">
 <!ENTITY calendar.extract.task.button.tooltip  "메시지에서 날짜 정보를 추출하여 캘린더에 태스크로 추가">
-
-<!ENTITY calendarproperties.enabled2.label                 "Enable This Calendar">
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd
index f1cfe6af0115..83ca221440d4 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/connection-screen.dtd
@@ -24,7 +24,7 @@
 <!-- LOCALIZATION NOTE (remoteHelp, remoteDocumentation, remoteHelpSuffix):
 these strings will be concatenated in a single label, remoteDocumentation will
 be used as text for a link to MDN. -->
-<!ENTITY remoteHelp "Firefox 개발자 도구로 원격 기기(예: Android 용 Firefox 및 Firefox OS)를 디버깅 할 수 있습니다. 원격 기기에서 '원격 디버깅' 옵션이 켜져 있는지 확인하세요. 자세한 내용은">
+<!ENTITY remoteHelp "Firefox 개발자 도구로 원격 기기(예: Android용 Firefox 및 Firefox OS)를 디버깅 할 수 있습니다. 원격 기기에서 '원격 디버깅' 옵션이 켜져 있는지 확인하세요. 자세한 내용은">
 <!ENTITY remoteDocumentation "이 문서">
 <!ENTITY remoteHelpSuffix "를 보세요.">
 
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties
index 3dbdfeac2765..67d1ed11da72 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/debugger.properties
@@ -110,7 +110,7 @@ expandBreakpoints=중단점 창 펼치기
 
 # LOCALIZATION NOTE (evaluateInConsole.label): Editor right-click menu item
 # to execute selected text in browser console.
-evaluateInConsole.label=콘손에서 실행
+evaluateInConsole.label=콘솔에서 실행
 
 # LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause
 # button when the debugger is in a running state.
@@ -875,7 +875,7 @@ scopes.mapScopes=스코프 맵
 outline.placeholder=함수 필터
 
 # LOCALIZATION NOTE (outline.sortLabel): Label for the sort button
-outline.sortLabel=이름으로 정렬
+outline.sortLabel=이름순 정렬
 
 # LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display
 outline.noFunctions=함수 없음
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties
index c3b6deacd685..8e3735138733 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/inspector.properties
@@ -453,7 +453,7 @@ inspector.sidebar.changesViewTitle=변경사항
 # This is the title shown in a tab in the side panel of the Inspector panel
 # that corresponds to the tool displaying the list of CSS rules used
 # in the page.
-inspector.sidebar.ruleViewTitle=선언
+inspector.sidebar.ruleViewTitle=규칙
 
 # LOCALIZATION NOTE (inspector.sidebar.computedViewTitle):
 # This is the title shown in a tab in the side panel of the Inspector panel
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=이 요소는 스크롤 할 수 있는 넘친
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=관련 규칙 없음
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Shift 키를 누른 상태에서 클릭하여 규칙으로 이동
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties
index b72d0c1bd300..c22f3d52a4f9 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/netmonitor.properties
@@ -1102,7 +1102,7 @@ netmonitor.response.name=이름:
 
 # LOCALIZATION NOTE (netmonitor.response.dimensions): This is the label displayed
 # in the network details response tab identifying an image's dimensions.
-netmonitor.response.dimensions=이미지 크기:
+netmonitor.response.dimensions=픽셀 크기:
 
 # LOCALIZATION NOTE (netmonitor.response.mime): This is the label displayed
 # in the network details response tab identifying an image's mime.
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties
index f21b516f99e4..1ea70afe24c5 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/devtools/client/webconsole.properties
@@ -119,7 +119,7 @@ cdFunctionInvalidArgument=주어진 창에서 cd()를 할 수 없습니다. 유
 # LOCALIZATION NOTE (selfxss.msg): the text that is displayed when
 # a new user of the developer tools pastes code into the console
 # %1 is the text of selfxss.okstring
-selfxss.msg=사기 주의: 자신이 이해하지 못하는 것을 붙여넣을 때에는 조심하세요. 이를 통해 공격자가 여러분의 개인 정보를 훔치거나 컴퓨터를 제어할 수 있습니다. 붙여넣기를 허용하려면 '%S'를 아래에 입력하세요(엔터키를 누르지 않아도 됩니다).
+selfxss.msg=사기 주의: 자신이 이해하지 못하는 것을 붙여넣을 때에는 조심하세요. 이를 통해 공격자가 여러분의 개인 정보를 훔치거나 컴퓨터를 제어할 수 있습니다. 붙여넣기를 허용하려면 '%S'를 아래에 입력하세요(Enter 키를 누르지 않아도 됩니다).
 
 # LOCALIZATION NOTE (selfxss.okstring): the string to be typed
 # in by a new user of the developer tools when they receive the sefxss.msg prompt.
@@ -233,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey=V
 # copies the entire output of the console to the clipboard.
 webconsole.menu.exportClipboard.label=보이는 메시지를 클립보드로 내보내기
 
+# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
+# Label used for a context-menu item displayed for any log. Clicking on it will
+# jump to the execution point where the log item was generated.
+webconsole.menu.timeWarp.label=여기로 건너뛰기
+
+# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
+# Label used for the tooltip on the "jump" button in the console. It's displayed when
+# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
+# message in the console output. Clicking on it will jump to the execution point where the
+# log item was generated.
+# Parameters: %S is the level of the message.
+webconsole.jumpButton.tooltip=%S - 여기로 이동
+
 # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label)
 # Label used for a context-menu item displayed on the output. Clicking on it
 # opens a submenu where the user can select how to export messages.
@@ -249,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label=클립보드
 # the output of the console.
 webconsole.menu.exportSubmenu.exportFile.label=파일
 
-# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
-# Label used for a context-menu item displayed for any log. Clicking on it will
-# jump to the execution point where the log item was generated.
-webconsole.menu.timeWarp.label=여기로 건너뛰기
-
-# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
-# Label used for the tooltip on the "jump" button in the console. It's displayed when
-# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
-# message in the console output. Clicking on it will jump to the execution point where the
-# log item was generated.
-# Parameters: %S is the level of the message.
-webconsole.jumpButton.tooltip=%S - 여기로 이동
-
 # LOCALIZATION NOTE (webconsole.clearButton.tooltip)
 # Label used for the tooltip on the clear logs button in the console top toolbar bar.
 # Clicking on it will clear the content of the console.
@@ -392,11 +392,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label=로그 유지
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip)
 webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=이 옵션을 사용하면 새 페이지로 이동할 때마다 출력이 지워지지 않습니다
 
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label)
-webconsole.console.settings.menu.item.eagerEvaluation.label=조급한 계산
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip)
-webconsole.console.settings.menu.item.eagerEvaluation.tooltip=이 옵션을 사용하면 입력 할 때 조급하게 계산됩니다
-
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label)
 webconsole.console.settings.menu.item.instantEvaluation.label=즉시 계산
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip)
@@ -573,7 +568,7 @@ webconsole.input.editor.onboarding.dissmis.label=확인
 # LOCALIZATION NOTE (webconsole.enterKey): The text that will be used to represent the
 # Enter key in the editor onboarding UI, as well as on the Editor toolbar "Run" button
 # tooltip.
-webconsole.enterKey=엔터
+webconsole.enterKey=Enter
 
 # LOCALIZATION NOTE (webconsole.input.openJavaScriptFile): This is a label
 # used for opening a file in the console input (Ctrl+O or Cmd+O on OSX while
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties
index 09aaffa87d0e..f7696fc6bf31 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/appstrings.properties
@@ -13,7 +13,7 @@ netTimeout=%S 서버의 응답이 너무 늦습니다.
 redirectLoop=이 주소에 대하여 완전하지 못한 방법의 연결 이동 요청이 감지되었습니다.
 confirmRepostPrompt=이 페이지를 표시하려면 응용프로그램이 이전에 수행했던 정보가 필요합니다. 이전에 실행하였던 작업(검색 또는 입력 양식 제출)을 다시 반복 합니다.
 resendButton.label=다시 보내기
-unknownSocketType=PSM (Personal Security Manager)을 설치하지 않으면 이 문서를 표시 할 수 없습니다. PSM을 다운로드하고 설치한 후 다시 시도하시거나 시스템 관리자에게 문의하세요.
+unknownSocketType=PSM (Personal Security Manager)을 설치하지 않으면 이 문서를 표시할 수 없습니다. PSM을 다운로드하고 설치한 후 다시 시도하시거나 시스템 관리자에게 문의하세요.
 netReset=페이지 로딩 중 서버와의 연결이 초기화 되었습니다.
 notCached=페이지가 더 이상 저장되어 있지 않습니다.
 netOffline=오프라인 상태에서는 웹에 연결할 수 없습니다.
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties
index ac5cf658e028..4fabee44e861 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/css.properties
@@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=subgrid의 이름 목록에는 한개
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=트랙 목록에는 한개의 반복 (auto-fill, …) 또는 반복(auto-fit, …) 만 허용됩니다.
 PEMoreThanOneGridRepeatTrackSize=반복 (auto-fit/auto-fill, …) 안에서는 한개의 트랙 크기만 허용됩니다.
 
+PEDisallowedImportRule=@import 규칙은 생성된 스타일시트에서 아직 유효하지 않습니다.
+
 TooLargeDashedRadius=‘dashed’ 스타일에 대한 border radius가 너무 큽니다(최대 100000px). solid로 랜더링 합니다.
 TooLargeDottedRadius=‘dotted’ 스타일에 대한 border radius가 너무 큽니다(최대 100000px). solid로 랜더링 합니다.
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties
index 623a43d3de88..0e58d8355946 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/dom/dom.properties
@@ -20,7 +20,7 @@ DontAskAgain=다시 묻지 않음
 JSURLLoadBlockedWarning=자바스크립트 읽기 시도 중: 다른 호스트로부터 받은 콘텐츠를 창에 표시하는 중 보안 관리자에 의해 중지되었습니다.
 WindowCloseBlockedWarning=스크립트에 의해 열리지 않은 창을 닫을 수 없습니다.
 OnBeforeUnloadTitle=페이지 나가기 여부
-OnBeforeUnloadMessage=이 페이지를 나갈 지 여부를 결정합니다. 입력한 데이터는 저장되지 않을 수 있습니다.
+OnBeforeUnloadMessage=이 페이지가 나갈지 여부를 묻습니다. 입력한 데이터는 저장되지 않을 수 있습니다.
 OnBeforeUnloadStayButton=계속 사용
 OnBeforeUnloadLeaveButton=나가기 
 UnexpectedCanvasVariantStyle=canvas:  문자열이 아닌 값이 strokeStyle나 fillStyle로 설정 하여 CanvasGradient나 CanvasPattern은 무시합니다.
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties
index d899e3fa1274..3bc08887ed20 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = X-Frame-Options에 의해 로드 거부됨: “%2$S”의 “%1$S”,
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = X-Frame-Options에 의해 로드 거부됨: “%2$S”의 “%1$S”, 사이트에서는 “%3$S”의 원본 간 프레임을 허용하지 않습니다.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = “%2$S”를 로드할 때 잘못된 X-Frame-Options 헤더가 발견됨: “%1$S”는 유효한 지시자가 아닙니다.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=프레임에서 “%2$S”의 로드는 “X1-Frame-Options” 지시자가 “%1$S”로 설정되어 거부되었습니다.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = “%2$S”(을)를 사용하도록 안전하지 않은 요청 “%1$S”(을)를 업그레이드 중
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd
index 1b4e12564a90..93d025bdc3bc 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.dtd
@@ -23,6 +23,8 @@
 <!ENTITY lightning.menupopup.open.accesskey           "O">
 <!ENTITY lightning.menupopup.open.message.label       "메시지 저장…">
 <!ENTITY lightning.menupopup.open.message.accesskey   "M">
+
+<!-- Open menu popup in File menu -->
 <!ENTITY lightning.menupopup.open.calendar.label      "캘린더 파일…">
 <!ENTITY lightning.menupopup.open.calendar.accesskey  "C">
 
@@ -67,6 +69,9 @@
 <!ENTITY lightning.imipbar.btnDelete.tooltiptext                            "캘린더에서 삭제">
 <!ENTITY lightning.imipbar.btnDetails.label                                 "상세…">
 <!ENTITY lightning.imipbar.btnDetails.tooltiptext                           "이벤트 상세 보기">
+<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label                        "이 메시지 보여주지 않기">
+<!ENTITY lightning.imipbar.btnGoToCalendar.label                            "달력">
+<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext                      "캘린더 탭으로 이동">
 <!ENTITY lightning.imipbar.btnMore.label                                    "더 보기">
 <!ENTITY lightning.imipbar.btnMore.tooltiptext                              "더 많은 옵션을 보려면 클릭">
 <!ENTITY lightning.imipbar.btnReconfirm2.label                              "재확인">
@@ -109,7 +114,3 @@
 <!ENTITY todaypane.showTodayPane.label "오늘 일정 보기">
 <!ENTITY todaypane.showTodayPane.accesskey "o">
 <!ENTITY todaypane.statusButton.label "오늘 일정">
-
-<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label                        "Don't show me these messages">
-<!ENTITY lightning.imipbar.btnGoToCalendar.label                            "Calendar">
-<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext                      "Go to the calendar tab">
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties
index 542dfc5e47a6..ed7cf97af38a 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/lightning/lightning.properties
@@ -142,29 +142,22 @@ imipBarReplyToNotExistingItem=이 메시지는 달력에 기록되지 않은 이
 imipBarReplyToRecentlyRemovedItem=이 메시지는 %1$S에 달력에서 삭제된 이벤트를 참조하는 답변을 포함하고 있습니다.
 imipBarUnsupportedText=이 메시지는 현재 버전의 Lightning이 처리할 수 없는 이벤트를 포함하고 있습니다.
 imipBarProcessingFailed=메시지 처리 실패. 상태: %1$S.
+imipBarCalendarDeactivated=이 메시지에는 이벤트 정보가 포함되어 있습니다. 캘린더가 처리 할 수 있도록합니다.
 imipBarNotWritable=초대가 설정된 쓰기 가능한 달력이 없습니다. 달력 속성을 확인해 보십시오.
 imipSendMail.title=이 메일 통지
 imipSendMail.text=이메일 통지를 발송 하시겠습니까?
 imipNoIdentity=없음
 imipNoCalendarAvailable=쓰기 가능한 캘린더가 없습니다.
 
-itipReplySubject=이벤트 초대 응답: %1$S
-
 itipReplySubject2=초대 응답: %1$S
 itipReplyBodyAccept=%1$S 님이 이벤트 초대를 허가했습니다.
 itipReplyBodyDecline=%1$S 님이 이벤트 초대를 거부했습니다.
-itipReplySubjectAccept=이벤트 초대 응답 (참여): %1$S
-itipReplySubjectDecline=이벤트 초대 응답 (참여 안함): %1$S
-itipReplySubjectTentative=이벤트 초대 응답 (불확실): %1$S
-itipRequestSubject=이벤트 초대: %1$S
-itipRequestUpdatedSubject=이벤트 초대 (내용 업데이트): %1$S
 itipReplySubjectAccept2=승낙됨: %1$S
 itipReplySubjectDecline2=초대 거절됨: %1$S
 itipReplySubjectTentative2=미정: %1$S
 itipRequestSubject2=초대: %1$S
 itipRequestUpdatedSubject2=수정됨: %1$S
 itipRequestBody=%1$S 님이 %2$S (으)로 초대했습니다.
-itipCancelSubject=이벤트 취소: %1$S
 itipCancelSubject2=취소됨: %1$S
 itipCancelBody=%1$S 님이 이 이벤트를 취소했습니다: < %2$S >
 itipCounterBody=%1$S 님이 "%2$S"에 대한 반대 의견을 만들었음:
@@ -203,29 +196,5 @@ binaryComponentUnknown=%1$S에 필요한 바이너리 컴포넌트가 로딩되
 # %1$S - The Lightning brand name, from the brandShortName string above.
 binaryComponentTitle=잘못된 %1$S 버전
 
-# LOCALIZATION_NOTE(integrationLabel): Used by the notification bar shown when
-# Lightning is installed from the distribution folder. To trigger it, start a
-# new profile without Lightning in a previous Thunderbird version, then upgrade
-# to a Thunderbird that has Lightning packaged. See bug 1130852 for details.
-integrationLabel=%1$S는 이제 %2$S 확장기능과의 통합으로 달력 기능이 포함됩니다.
-integrationLearnMoreButton=더 알아보기
-integrationLearnMoreAccessKey=m
-integrationOptOutButton=비활성화
-integrationOptOutAccessKey=D
-integrationKeepItButton=계속 진행하기
-integrationKeepItAccessKey=K
-
-# LOCALIZATION_NOTE(integrationRestartLabel): At the current time its not yet
-# clear if we will be completely uninstalling Lightning or disabling it. Please
-# translate this string in a general manner, so that it makes sense for both
-# options.
-integrationRestartLabel=%2$S를 재시작 하면 %1$S가 제거 될 것입니다. 언제든지 부가 기능 도구에서 추가하실 수 있습니다.
-integrationRestartButton=지금 재시작
-integrationRestartAccessKey=R
-integrationUndoButton=되돌리기
-integrationUndoAccessKey=U
-
 # LOCALIZATION NOTE(noIdentitySelectedNotification):
 noIdentitySelectedNotification=이 달력이 다른 사람의 초대를 저장하게 하려면 아래의 이메일 확인을 설정해야 합니다.
-
-imipBarCalendarDeactivated=This message contains event information. Enable a calendar to handle it.
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties
index 8c4e9450a760..3fa4071bdbd0 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/addons.properties
@@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S는 불안정하게 만들고 보안 문제를 
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header=%S 추가?
 
+# %S is brandShortName
+webextPerms.experimentWarning=악의적인 목적으로 제작된 추가 기능은 개인 정보를 빼돌리거나 컴퓨터를 망가뜨릴 수 있습니다. 이 추가 기능의 출처를 신뢰할 수 있는 경우에만 설치하실 것을 권장합니다.
 webextPerms.unsignedWarning=주의: 이 추가 기능은 검증되지 않았습니다. 악의적인 목적으로 제작된 추가 기능은 개인 정보를 빼돌리거나 컴퓨터를 망가뜨릴 수 있습니다. 이 추가 기능의 출처를 신뢰할 수 있는 경우에만 설치하실 것을 권장합니다.
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -194,6 +196,9 @@ webextPerms.description.devtools=열려있는 탭의 데이터에 접근하도
 webextPerms.description.dns=IP 주소와 호스트 이름 정보에 접근
 webextPerms.description.downloads=파일을 다운로드하고 브라우저의 다운로드 기록을 변경
 webextPerms.description.downloads.open=컴퓨터에 다운로드 된 파일 열기
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment=%S 및 컴퓨터에 대한 무제한의 전체 접근 권한
 webextPerms.description.find=열려있는 모든 탭의 텍스트 읽기
 webextPerms.description.geolocation=현재 위치에 접근
 webextPerms.description.history=브라우징 기록에 접근
@@ -258,9 +263,3 @@ webext.remove.confirmation.title=%S 삭제
 # %2$S is brandShorterName
 webext.remove.confirmation.message=%2$S에서 %1$S 확장기능을 지우시겠어요?
 webext.remove.confirmation.button=삭제
-
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties
index 9d42cb925768..103517f6dcb0 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-e2e.properties
@@ -2,4 +2,4 @@
 # 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/.
 
-prefPanel-e2e=End-To-End Encryption
+prefPanel-e2e=종단간 암호화
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd
index a73c5ea8c31f..e5b79c7a592f 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/am-smime.dtd
@@ -12,6 +12,22 @@
 <!ENTITY alwaysEncryptMessage.label "암호화 사용함 (개인 인증서 필요)">
 <!ENTITY alwaysEncryptMessage.accesskey "u">
 <!ENTITY encryptionCert.message "다음 개인 인증서 사용:">
+
+<!ENTITY e2eTitle.label "종단간 암호화">
+<!ENTITY e2eIntro.description "암호화되거나 디지털 서명 된 메시지를 보내려면 OpenPGP 또는 S/MIME과 같은 암호화 기술을 구성해야 합니다.">
+<!ENTITY e2eLearnMore.label "더 알아보기">
+
+<!ENTITY e2eEnc.description "종단간 암호화가 없으면 메시지 내용이 전자 메일 공급자 및 대중 사찰에 쉽게 노출됩니다.">
+<!ENTITY e2eeReqWarning.description "암호화가 필요한 경우 메시지를 보내려면 모든 수신자의 공개 키 또는 인증서가 있어야 합니다.">
+
+<!ENTITY e2eSigning.description "디지털 서명을 사용하면 수신자가 메시지를 보냈으며 내용이 변경되지 않았음을 확인할 수 있습니다.">
+<!ENTITY e2eTechPref.description "선호하는 암호화 기술:">
+
+<!ENTITY doNotEncrypt.label "기본적으로 암호화를 활성화하지 않음">
+<!ENTITY doNotEncrypt.accesskey "N">
+<!ENTITY requireEncryptMessage.label "기본적으로 암호화를 필요로 함">
+<!ENTITY requireEncryptMessage.accesskey "u">
+<!ENTITY encryptionCert2.message "암호화를 위한 개인 인증서:">
 <!ENTITY digitalSign.certificate.button "선택…">
 <!ENTITY digitalSign.certificate.accesskey "S">
 <!ENTITY digitalSign.certificate_clear.button "제거">
@@ -22,6 +38,7 @@
 <!ENTITY encryption.certificate_clear.accesskey "e">
 <!ENTITY signingGroupTitle.label "디지털 서명">
 <!ENTITY signMessage.label "디지털 서명 메시지 (기본)">
+<!ENTITY signMessage2.label "기본적으로 내 디지털 서명 추가">
 <!ENTITY signMessage.accesskey "D">
 <!ENTITY signingCert.message "다음 개인 인증서 사용:">
 
@@ -31,37 +48,30 @@
 <!ENTITY manageDevices.label "보안 장치 관리">
 <!ENTITY manageDevices.accesskey "y">
 
-<!-- Strings for the cert picker dialog -->
-<!ENTITY certPicker.title "인증서 선택">
-<!ENTITY certPicker.info  "인증서:">
-<!ENTITY certPicker.detailsLabel "선택한 인증서 상세 정보:">
+<!ENTITY signingCert2.message "디지털 서명을 위한 개인 인증서:">
+
+<!ENTITY sendingDefaults.label "메시지 전송을 위한 기본 설정">
+
+<!ENTITY technologyAutomatic.label "사용 가능한 키 또는 인증서를 기반으로 자동 선택">
 
-<!ENTITY e2eTitle.label "End-To-End Encryption">
-<!ENTITY e2eIntro.description "To send encrypted or digitally signed messages, you need to configure an encryption technology, either OpenPGP or S/MIME.">
-<!ENTITY e2eLearnMore.label "Learn more">
-<!ENTITY e2eEnc.description "Without end-to-end encryption the contents of messages are easily exposed to your email provider and to mass surveillance.">
-<!ENTITY e2eeReqWarning.description "If you require encryption, to send a message you must have the public key or certificate of every recipient.">
-<!ENTITY e2eSigning.description "A digital signature allows recipients to verify the message was sent by you, and that the content has not been changed.">
-<!ENTITY e2eTechPref.description "Preferred encryption technology:">
-<!ENTITY doNotEncrypt.label "Do not enable encryption by default">
-<!ENTITY doNotEncrypt.accesskey "N">
-<!ENTITY requireEncryptMessage.label "Require encryption by default">
-<!ENTITY requireEncryptMessage.accesskey "u">
-<!ENTITY encryptionCert2.message "Personal certificate for encryption:">
-<!ENTITY signMessage2.label "Add my digital signature by default">
-<!ENTITY signingCert2.message "Personal certificate for digital signing:">
-<!ENTITY sendingDefaults.label "Default settings for sending messages">
-<!ENTITY technologyAutomatic.label "Select automatically based on available keys or certificates">
 <!ENTITY certificates2.label "S/MIME">
-<!ENTITY manageCerts3.label "Manage S/MIME Certificates">
+<!ENTITY manageCerts3.label "S/MIME 인증서 관리">
 <!ENTITY manageCerts3.accesskey "M">
-<!ENTITY manageDevices2.label "S/MIME Security Devices">
+<!ENTITY manageDevices2.label "S/MIME 보안 장치">
 <!ENTITY manageDevices2.accesskey "y">
-<!ENTITY technologySMIME.label "Prefer S/MIME">
-<!ENTITY technologyOpenPGP.label "Prefer OpenPGP">
+
+<!ENTITY technologySMIME.label "S/MIME 선호">
+<!ENTITY technologyOpenPGP.label "OpenPGP 선호">
+
 <!ENTITY openpgpKeys.label "OpenPGP">
-<!ENTITY manageKeys.label "Manage OpenPGP Keys">
+<!ENTITY manageKeys.label "OpenPGP 키 관리">
 <!ENTITY manageKeys.accesskey "K">
-<!ENTITY openpgpKey.message "Personal key for encryption and digital signing:">
-<!ENTITY openpgpKey.button "Set Personal Key…">
+
+<!-- Strings for the cert picker dialog -->
+<!ENTITY certPicker.title "인증서 선택">
+<!ENTITY certPicker.info  "인증서:">
+<!ENTITY certPicker.detailsLabel "선택한 인증서 상세 정보:">
+
+<!ENTITY openpgpKey.message "암호화 및 디지털 서명을위한 개인 키:">
+<!ENTITY openpgpKey.button "개인 키 설정…">
 <!ENTITY openpgpKey.accesskey "o">
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd
index e32ed9f54e01..7491e30057e5 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/customizeToolbar.dtd
@@ -15,8 +15,7 @@
 <!ENTITY addNewToolbar.label      "새 도구 모음 추가">
 <!ENTITY showTitlebar.label       "제목 표시줄 표시">
 <!ENTITY extraDragSpace.label     "드래그 영역 추가">
+<!ENTITY showTitlebar2.label      "제목 표시 줄">
+<!ENTITY extraDragSpace2.label    "드래그 공간">
 <!ENTITY saveChanges.label        "완료">
 <!ENTITY undoChanges.label        "변경사항 취소">
-
-<!ENTITY showTitlebar2.label      "Title Bar">
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties
index 894f6efa076a..5fa6b57664f2 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/imapMsgs.properties
@@ -201,12 +201,22 @@ imapServerDroppedConnection=IMAP 서버에 연결할 수 없습니다. 서버의
 있습니다. 만약 그렇다면, 고급 IMAP 서버 설정창에서 캐시된 연결 숫자를 \
 줄여 보세요.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=폴더가 열리지 않았기 때문에 용량 제한 정보를 가져올 수 없습니다.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=서버가 용량 제한 정보를 지원하지 않습니다.
 
 imapQuotaStatusNoQuota=이 폴더에 할당된 용량이 없습니다.
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2=이 폴더는 할당량 정보를 보고하지 않습니다.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=할당량 정보가 아직 없습니다.
+
 # Out of memory
 imapOutOfMemory=메모리가 부족합니다.
 
@@ -258,9 +268,3 @@ imapFolderCommandFailed='%2$S'의 현재 작업을 실패했습니다. %1$S 메
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert=%1$S 계정 경고: %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties
index b92b0ff68a28..f98cfe7ce404 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/messenger.properties
@@ -464,11 +464,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=%S (전체: %S KB) 사용됨.
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=%S%% 용량 초과
 # for quota in main window (commandglue.js)
 percent=%S%%
 quotaTooltip=IMAP 용량: %S KB 사용(총 %S KB). 자세한 정보를 선택하십시오.
 
+quotaTooltip2=IMAP 용량: %S 사용(총 %S). 자세한 내용을 보려면 클릭하십시오.
+
 # for message views
 confirmViewDeleteTitle=확인
 confirmViewDeleteMessage=이것을 삭제하시겠습니까?
@@ -804,5 +808,3 @@ errorConsoleTitle = 오류 콘솔
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = 뒤로
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd
index 6f51a722e5ca..084381f57c20 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label         "삭제">
 <!ENTITY removeSearchEngine.accesskey     "v">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
+<!ENTITY minimizeToTray.label             "&brandShortName;가 최소화되면 트레이로 이동">
 <!ENTITY minimizeToTray.accesskey         "m">
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties
index a01f23be328f..716590cc9b70 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/mozapps/handling/handling.properties
@@ -5,7 +5,7 @@
 protocol.title=응용 프로그램 실행
 protocol.description=이 링크는 응용 프로그램으로 열어야 합니다.
 protocol.choices.label=보낼 대상:
-protocol.checkbox.label=%S 링크에 대한 선택 사항을 기억합니다.
+protocol.checkbox.label=%S 링크에 대한 이 선택 기억하기
 protocol.checkbox.accesskey=R
 protocol.checkbox.extra=세부 사항은 %S 설정에서 바꿀 수 있습니다.
 
diff --git a/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties b/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties
index 0ec897637e28..a73f39600aa5 100644
--- a/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties
+++ b/thunderbird-l10n/ko/chrome/ko/locale/ko/necko/necko.properties
@@ -14,7 +14,7 @@
 6=%1$S 전송 중…
 7=%1$S 연결 중…
 8=%1$S 읽음
-9=%1$S 씀
+9=%1$S 기록
 10=%1$S 기다리는 중…
 11=%1$S 조회함…
 12=%1$S TLS 핸드셰이크 수행 중…
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=“%1$S”의 추적기 “%2$S”에
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=“%1$S”의 추적기 “%2$S”의 저장소 접근이 자동으로 승인되었습니다.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=“%1$S”의 자사 격리 “%2$S”의 저장소 접근이 자동으로 승인되었습니다.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=쿠키 “%1$S”에 “sameSite=none” 속성이 있지만 “secure” 속성이 없기 때문에 거부되었습니다.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/ko/localization/ko/calendar/calendar-widgets.ftl b/thunderbird-l10n/ko/localization/ko/calendar/calendar-widgets.ftl
new file mode 100644
index 000000000000..cd3c6cf1d7e1
--- /dev/null
+++ b/thunderbird-l10n/ko/localization/ko/calendar/calendar-widgets.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-deactivated-notification-events = 모든 캘린더가 현재 비활성화되어 있습니다. 기존 캘린더를 활성화하거나 새 캘린더를 추가하여 이벤트 생성 및 편집을 하십시오.
+calendar-deactivated-notification-tasks = 모든 캘린더가 현재 비활성화되어 있습니다. 기존 캘린더를 활성화하거나 새 캘린더를 추가하여 작업 생성 및 편집을 하십시오.
diff --git a/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl
index 8c72a8e8f9b7..874312b8ec65 100644
--- a/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/ko/localization/ko/devtools/client/aboutdebugging.ftl
@@ -178,7 +178,7 @@ about-debugging-runtime-service-workers-not-compatible = 브라우저 구성이
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 # { $minVersion } is the minimum version that is compatible with the current Firefox instance (same format)
-about-debugging-browser-version-too-old = 연결된 브라우저에는 이전 버전 ({ $runtimeVersion })이 있습니다. 지원되는 최소 버전은 ({ $minVersion }) 입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패 할 수 있습니다. 연결된 브라우저를 업데이트하세요. <a>문제 해결</a>
+about-debugging-browser-version-too-old = 연결된 브라우저에는 이전 버전 ({ $runtimeVersion })이 있습니다. 지원되는 최소 버전은 ({ $minVersion }) 입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패할 수 있습니다. 연결된 브라우저를 업데이트하세요. <a>문제 해결</a>
 # Dedicated message for a backward compatibility issue that occurs when connecting:
 # - from Fx 67 to 66 or to 65
 # - from Fx 68 to 66
@@ -188,14 +188,14 @@ about-debugging-browser-version-too-old = 연결된 브라우저에는 이전 
 about-debugging-browser-version-too-old-67-debugger = 디버거 패널이 연결된 브라우저와 작동하지 않을 수 있습니다. 이 브라우저에 디버거를 사용해야 하는 경우 Firefox { $runtimeVersion }를 사용하세요.
 # Dedicated message for a backward compatibility issue that occurs when connecting:
 # from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
-about-debugging-browser-version-too-old-fennec = 이 Firefox 버전은 Android 용 Firefox (68)를 디버깅 할 수 없습니다. 테스트를 위해 휴대폰에 Android Nightly 용 Firefox를 설치하는 것이 좋습니다. <a>추가 정보</a>
+about-debugging-browser-version-too-old-fennec = 이 Firefox 버전은 Android용 Firefox (68)를 디버깅 할 수 없습니다. 테스트를 위해 휴대폰에 Android Nightly용 Firefox를 설치하는 것이 좋습니다. <a>추가 정보</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
 # { $localID } is the build ID of the current Firefox instance (same format)
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 # { $localVersion } is the version of your current browser (same format)
-about-debugging-browser-version-too-recent = 연결된 브라우저가 { -brand-shorter-name } ({ $localVersion }, buildID { $localID })보다 최근 버전({ $runtimeVersion }, buildID { $runtimeID })입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패 할 수 있습니다. Firefox를 업데이트하세요. <a>문제 해결</a>
+about-debugging-browser-version-too-recent = 연결된 브라우저가 { -brand-shorter-name } ({ $localVersion }, buildID { $localID })보다 최근 버전({ $runtimeVersion }, buildID { $runtimeID })입니다. 이것은 지원되지 않는 설정이며 DevTools가 실패할 수 있습니다. Firefox를 업데이트하세요. <a>문제 해결</a>
 # Displayed for runtime info in runtime pages.
 # { $name } is brand name such as "Firefox Nightly"
 # { $version } is version such as "64.0a1"
diff --git a/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl b/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl
index d8342825d50f..251272bcf0c2 100644
--- a/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl
+++ b/thunderbird-l10n/ko/localization/ko/devtools/startup/aboutDevTools.ftl
@@ -9,7 +9,7 @@ enable-inspect-element-message = 개발자 도구의 검사기로 HTML과 CSS를
 enable-about-debugging-message = Firefox 개발자 도구로 WebExtensions이나 웹 Worker, Service Worker 등을 개발하고 디버깅하세요.
 enable-key-shortcut-message = 개발자 도구 바로가기를 활성화했습니다. 만약 실수인 경우, 이 탭을 닫을 수 있습니다.
 enable-menu-message = 검사기와 디버거 같은 도구로 웹 사이트의 HTML, CSS와 JavaScript를 완벽하게 처리하세요.
-enable-common-message = Firefox 개발자 도구는 브라우저를 보다 강력하게 제어 할 수 있도록 기본적으로 비활성화되어 있습니다.
+enable-common-message = Firefox 개발자 도구는 브라우저를 보다 강력하게 제어할 수 있도록 기본적으로 비활성화되어 있습니다.
 enable-learn-more-link = 개발자 도구에 대하여 더 알아보기
 enable-enable-button = 개발자 도구 활성화
 enable-close-button = 이 탭 닫기
@@ -21,7 +21,7 @@ newsletter-email-placeholder =
 newsletter-privacy-label = 전 Mozilla에서 제 정보를 이 <a data-l10n-name="privacy-policy">개인 정보 정책</a>에 나와있는 대로 다뤄도 괜찮습니다.
 newsletter-subscribe-button = 구독
 newsletter-thanks-title = 고맙습니다!
-newsletter-thanks-message = 만약 이전에 Mozilla 관련 뉴스 레터 구독을 확인하지 않았다면 그렇게해야 할 수 있습니다. 받은 편지함이나 스팸 필터에서 이메일을 확인하세요.
+newsletter-thanks-message = 만약 이전에 Mozilla 관련 뉴스 레터 구독을 확인하지 않았다면 그렇게 해야 할 수 있습니다. 받은 편지함이나 스팸 필터에서 이메일을 확인하세요.
 footer-title = Firefox 개발자 버전
 footer-message = 더 좋은 개발자 도구를 찾고 계신가요? 개발자와 현대적인 워크플로우를 위해 특별히 제작된 Firefox 브라우저를 확인해보세요.
 footer-learn-more-link = 더 알아보기
@@ -35,9 +35,9 @@ features-debugger-desc = 프레임워크를 지원하는 강력한 JavaScript 
 features-network-title = 네트워크
 features-network-desc = 웹 사이트를 느리게하거나 방해하는 네트워크 요청을 모니터링하세요. <a data-l10n-name="learn-more">{ features-learn-more }</a>
 features-storage-title = 저장소
-features-storage-desc = 캐시, 쿠키, 데이터베이스 및 세션 데이터를 추가, 수정 그리고 제거합니다. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-storage-desc = 캐시, 쿠키, 데이터베이스 및 세션 데이터를 추가, 수정 및 제거합니다. <a data-l10n-name="learn-more">{ features-learn-more }</a>
 features-responsive-title = 반응형 디자인 모드
-features-responsive-desc = 브라우저의 에뮬레이터된 기기에서 사이트를 테스트하세요. <a data-l10n-name="learn-more">{ features-learn-more }</a>
+features-responsive-desc = 브라우저에 에뮬레이트된 기기에서 사이트를 테스트하세요. <a data-l10n-name="learn-more">{ features-learn-more }</a>
 features-visual-editing-title = 시각적 편집 기능
 features-visual-editing-desc = 애니메이션, 정렬 및 패딩을 미세 조정합니다. <a data-l10n-name="learn-more">{ features-learn-more }</a>
 features-performance-title = 성능
diff --git a/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl b/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl
index dea503210c8d..107beac8db75 100644
--- a/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/ko/localization/ko/messenger/accountCentral.ftl
@@ -3,11 +3,38 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = { -brand-full-name }를 사용해 주셔서 감사합니다.
+account-settings = 계정 설정
+#   $accounts (Number) - the number of configured accounts
 setup-title = 설정할 항목 선택
 about-title = { -brand-full-name } 정보
 resources-title = 자원
 release-notes =
     .title = { -brand-full-name } 정보
+email-label = 이메일
+    .aria-label = 기존 이메일 계정과 연결
+email-description = { -brand-short-name }를 사용하면 기존 이메일 계정에 연결하여 응용 프로그램 내에서 편리하고 효율적으로 이메일을 읽을 수 있습니다.
+calendar-label = 달력
+    .aria-label = 새 달력 생성
+calendar-description = { -brand-short-name }를 사용하면 이벤트를 처리하고 체계적으로 유지할 수 있습니다. 원격 캘린더에 연결하면 모든 기기에서 모든 일정이 동기화됩니다.
+chat-label = 채팅
+    .aria-label = 채팅 계정과 연결
+chat-description = { -brand-short-name }를 사용하면 다양한 플랫폼에서 여러 인스턴트 메시징 계정에 연결할 수 있습니다.
+filelink-label = Filelink
+    .aria-label = Filelink 설정
+filelink-description = { -brand-short-name }를 사용하면 첨부 파일을 쉽게 보낼 수있는 편리한 filelink 클라우드 계정을 설정할 수 있습니다.
+addressbook-label = 주소록
+    .aria-label = 새 주소록 생성
+addressbook-description = { -brand-short-name }를 사용하면 주소록에서 모든 연락처를 구성 할 수 있습니다. 원격 주소록에 연결하여 모든 연락처를 동기화 할 수도 있습니다.
+feeds-label = 피드
+    .aria-label = 피드에 연결
+feeds-description = { -brand-short-name }를 사용하면 RSS/Atom 피드에 연결하여 모든 곳에서 뉴스와 업데이트를 받을 수 있습니다.
+newsgroups-label = 뉴스 그룹
+    .aria-label = 뉴스 그룹에 연결
+newsgroups-description = { -brand-short-name }를 사용하면 원하는 모든 뉴스 그룹에 연결할 수 있습니다.
+import-title = 다른 프로그램에서 가져 오기
+import-paragraph = { -brand-short-name }를 사용하면 다른 메일 프로그램 및 일반 주소록 형식에서 메일 메시지, 주소록 항목, 피드 구독, 환경 설정 또는 필터를 가져올 수 있습니다.
+import-label = 가져오기
+    .aria-label = 다른 프로그램에서 데이터 가져오기
 about-paragraph = Thunderbird는 오픈 소스 크로스 플랫폼으로 회사에서나 개인이 무료로 이용할 수있는 인기 높은 메일, 캘린더 클라이언트입니다. 저희는 보안을 지키면서 더욱 개선해 나가고자 합니다. 기부는 개발자 채용, 인프라 구축 및 개선 작업을 진행할 수 있게 해줍니다.
 about-paragraph-2 = <b>Thunderbird는 사용자에 의해서 자금을 지원 받습니다. Thunderbird를 좋아하신다면 기부를 해 주세요.</b> Thunderbird를 계속 사용할 수 있는 가장 좋은 방법은
 about-donation = 기부 하기
@@ -15,3 +42,10 @@ explore-link = 기능 살펴보기
 support-link = 지원
 involved-link = 참여하기
 developer-link = 개발자 문서
+read = 메시지 읽기
+compose = 새 메시지 작성
+search = 메시지 검색
+filter = 메시지 필터 관리
+nntp-subscription = 뉴스 그룹 구독 관리
+rss-subscription = 피드 구독 관리
+e2e = 종단간 암호화
diff --git a/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl
index 9f3de5c77881..1e9b9c259deb 100644
--- a/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl
+++ b/thunderbird-l10n/ko/localization/ko/messenger/preferences/passwordManager.ftl
@@ -68,3 +68,15 @@ remove-all-shown =
 remove-all-passwords-prompt = 비밀번호를 모두 삭제하시겠습니까?
 remove-all-passwords-title = 모든 비밀번호 삭제
 no-master-password-prompt = 정말 암호를 보이게 하시겠습니까?
+
+## OS Authentication dialog
+
+# This message can be seen by trying to show or copy the passwords.
+password-os-auth-dialog-message = 저장된 비밀번호를 보려면 자격 증명을 검증하세요.
+# This message can be seen by trying to show or copy the passwords.
+# The macOS strings are preceded by the operating system with "Thunderbird is trying to "
+# and includes subtitle of "Enter password for the user "xxx" to allow this." These
+# notes are only valid for English. Please test in your locale.
+password-os-auth-dialog-message-macosx = 저장된 비밀번호 표시
+# Don't change this label.
+password-os-auth-dialog-caption = { -brand-full-name }
diff --git a/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl b/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl
index 03d4072cf083..64ccdad36f97 100644
--- a/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl
+++ b/thunderbird-l10n/ko/localization/ko/messenger/preferences/preferences.ftl
@@ -55,3 +55,15 @@ update-in-progress-ok-button = 취소
 # Continue is the cancel button so pressing escape or using a platform standard
 # method of closing the UI will not discard the update.
 update-in-progress-cancel-button = 계속
+
+## OS Authentication dialog
+
+# This message can be seen by trying to add a Master Password.
+master-password-os-auth-dialog-message = 마스터 비밀번호를 만들기 위해 자격 증명을 검증하세요.
+# This message can be seen by trying to add a Master Password.
+# The macOS strings are preceded by the operating system with "Thunderbird is trying to "
+# and includes subtitle of "Enter password for the user "xxx" to allow this." These
+# notes are only valid for English. Please test in your locale.
+master-password-os-auth-dialog-message-macosx = 마스터 비밀번호 만들기
+# Don't change this label.
+master-password-os-auth-dialog-caption = { -brand-full-name }
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl
index 45629784fd2a..020b613f1431 100644
--- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = 파일에서 부가 기능 설치…
     .accesskey = I
 help-button = 부가 기능 지원
+sidebar-help-button-title =
+    .title = 부가 기능 지원
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } 설정
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = 부가 기능 도구
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } 설정
+           *[other] { -brand-short-name } 설정
+        }
 show-unsigned-extensions-button =
     .label = 몇몇 확장 기능은 확인을 할 수 없음
 show-all-extensions-button =
@@ -167,13 +175,29 @@ extensions-view-available-updates =
     .name = 업데이트 가능 항목
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = 추천
+addon-category-discover-title =
+    .title = 추천
 addon-category-extension = 확장 기능
+addon-category-extension-title =
+    .title = 확장 기능
 addon-category-theme = 테마
+addon-category-theme-title =
+    .title = 테마
 addon-category-plugin = 플러그인
+addon-category-plugin-title =
+    .title = 플러그인
 addon-category-dictionary = 사전
+addon-category-dictionary-title =
+    .title = 사전
 addon-category-locale = 언어팩
+addon-category-locale-title =
+    .title = 언어팩
 addon-category-available-updates = 업데이트 가능 항목
+addon-category-available-updates-title =
+    .title = 업데이트 가능 항목
 addon-category-recent-updates = 최근 업데이트
+addon-category-recent-updates-title =
+    .title = 최근 업데이트
 
 ## These are global warnings
 
@@ -286,6 +310,7 @@ shortcuts-no-commands = 다음 확장 기능에는 단축키가 없습니다:
 shortcuts-input =
     .placeholder = 단축키 입력
 shortcuts-browserAction = 확장 기능 활성화
+shortcuts-browserAction2 = 도구 모음 버튼 활성화
 shortcuts-pageAction = 페이지 작업 활성화
 shortcuts-sidebarAction = 탐색창 표시/숨기기
 shortcuts-modifier-mac = Ctrl, Alt 또는 ⌘ 포함
@@ -310,6 +335,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = 간략히 보기
 go-back-button =
     .tooltiptext = 뒤로 가기
+header-back-button =
+    .title = 뒤로 가기
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl
index 1b647ddc0b4f..ab21c2cffdd3 100644
--- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutPerformance.ftl
@@ -8,7 +8,7 @@ about-performance-title = 작업 관리자
 ## Column headers
 
 column-name = 이름
-column-type = 형식
+column-type = 유형
 column-energy-impact = 에너지 영향
 column-memory = 메모리
 
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl
index 90872845199e..67abad7c8a4e 100644
--- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutSupport.ftl
@@ -140,7 +140,7 @@ media-capabilities-enumerate = 데이터베이스 열거
 
 ##
 
-intl-title = 국제화 & 현지화
+intl-title = 국제화 및 현지화
 intl-app-title = 응용 프로그램 설정
 intl-locales-requested = 요청된 언어
 intl-locales-available = 사용 가능한 언어
@@ -267,6 +267,11 @@ sandbox-proc-type-content = 내용
 sandbox-proc-type-file = 파일 내용
 sandbox-proc-type-media-plugin = 미디어 플러그인
 sandbox-proc-type-data-decoder = 데이터 디코더
+startup-cache-title = 시작 캐시
+startup-cache-disk-cache-path = 디스크 캐시 경로
+startup-cache-ignore-disk-cache = 디스크 캐시 무시
+startup-cache-found-disk-cache-on-init = 초기화시 디스크 캐시 찾음
+startup-cache-wrote-to-disk-cache = 디스크 캐시에 기록
 launcher-process-status-0 = 활성화됨
 launcher-process-status-1 = 실패로 비활성화됨
 launcher-process-status-2 = 강제로 비활성화됨
@@ -287,9 +292,10 @@ async-pan-zoom = 비동기 팬 및 확대/축소
 apz-none = 없음
 wheel-enabled = 휠 입력 활성화됨
 touch-enabled = 터치 입력 활성화됨
-drag-enabled = 스크롤바 끌기 활성화됨
+drag-enabled = 스크롤 막대 끌기 활성화됨
 keyboard-enabled = 키보드 활성화됨
 autoscroll-enabled = 자동 스크롤 활성화됨
+zooming-enabled = 부드러운 핀치 확대/축소 활성화됨
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl
index 205f8edcb38f..a5cf43d12ced 100644
--- a/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/aboutTelemetry.ftl
@@ -8,7 +8,7 @@ about-telemetry-show-current-data = 현재 데이터
 about-telemetry-show-archived-ping-data = 저장된 핑 데이터
 about-telemetry-show-subsession-data = 하위 세션 데이터 보기
 about-telemetry-choose-ping = 핑 선택:
-about-telemetry-archive-ping-type = 핑 종류
+about-telemetry-archive-ping-type = 핑 유형
 about-telemetry-archive-ping-header = 핑
 about-telemetry-option-group-today = 오늘
 about-telemetry-option-group-yesterday = 어제
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl
index 0ea22f095ace..d784d0923602 100644
--- a/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (인증서)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (체인)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = 이 확장 기능은 클라이언트가 인증서를 이해하지 못할 경우 반드시 인증서를 거부해야 함을 의미하는 위험한 것으로 표시되었습니다.
+certificate-viewer-export = 내보내기
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = 개인 인증서
+certificate-viewer-tab-people = 다른 사람
+certificate-viewer-tab-servers = 서버
+certificate-viewer-tab-ca = 인증 기관
+certificate-viewer-tab-unkonwn = 알 수 없음
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl
index 343cb5541e78..4e33a3df58dd 100644
--- a/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = 격리된 웹 콘텐츠
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = 소켓
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..0aa507da7634
--- /dev/null
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = { -brand-product-name } 이전 버전을 사용 중입니다
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = 새 프로필 만들기
+profiledowngrade-sync = 이전 버전의 { -brand-product-name }를 사용하면 기존 { -brand-product-name } 프로필에 이미 저장된 북마크와 방문 기록이 손상될 수 있습니다. 정보를 보호하려면 이 { -brand-short-name } 설치에 대한 새 프로필을 만드세요. 언제든지 { -fxaccount-brand-name }로 로그인하여 프로필간에 북마크와 방문 기록을 동기화 할 수 있습니다.
+profiledowngrade-nosync = 이전 버전의 { -brand-product-name }를 사용하면 기존 { -brand-product-name } 프로필에 이미 저장된 북마크와 방문 기록이 손상될 수 있습니다. 정보를 보호하려면 이 { -brand-short-name } 설치에 대한 새 프로필을 만드세요.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] 종료
+           *[other] 종료
+        }
diff --git a/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl b/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl
index f2f6205af2fc..70450a697651 100644
--- a/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl
+++ b/thunderbird-l10n/ko/localization/ko/toolkit/printing/printDialogs.ftl
@@ -58,7 +58,7 @@ margin-right =
 margin-right-invisible =
     .value = 오른쪽:
 header-footer-label =
-    .value = 머리글/바닥글
+    .value = 머리글 및 바닥글
 hf-left-label =
     .value = 왼쪽
 hf-center-label =
diff --git a/thunderbird-l10n/ko/manifest.json b/thunderbird-l10n/ko/manifest.json
index 6691729ee24f..a62d08c8fa0f 100644
--- a/thunderbird-l10n/ko/manifest.json
+++ b/thunderbird-l10n/ko/manifest.json
@@ -1,54 +1,54 @@
 {
-  "name": "Korean (KR) Language Pack",
   "languages": {
     "ko": {
-      "version": "20200403125500",
+      "version": "20200420021306",
       "chrome_resources": {
-        "messenger": "chrome/ko/locale/ko/messenger/",
-        "mozapps": "chrome/ko/locale/ko/mozapps/",
-        "devtools": "chrome/ko/locale/ko/devtools/client/",
-        "necko": "chrome/ko/locale/ko/necko/",
-        "messenger-mapi": "chrome/ko/locale/ko/messenger-mapi/",
-        "global": "chrome/ko/locale/ko/global/",
         "calendar": "chrome/ko/locale/ko/calendar/",
+        "chat": "chrome/ko/locale/ko/chat/",
+        "global": "chrome/ko/locale/ko/global/",
+        "mozapps": "chrome/ko/locale/ko/mozapps/",
+        "lightning": "chrome/ko/locale/ko/lightning/",
+        "pipnss": "chrome/ko/locale/ko/pipnss/",
         "passwordmgr": "chrome/ko/locale/ko/passwordmgr/",
+        "messenger": "chrome/ko/locale/ko/messenger/",
+        "global-platform": {
+          "win": "chrome/ko/locale/ko/global-platform/win/",
+          "android": "chrome/ko/locale/ko/global-platform/unix/",
+          "linux": "chrome/ko/locale/ko/global-platform/unix/",
+          "macosx": "chrome/ko/locale/ko/global-platform/mac/"
+        },
+        "branding": "chrome/ko/locale/ko/branding/",
         "messenger-newsblog": "chrome/ko/locale/ko/messenger-newsblog/",
+        "necko": "chrome/ko/locale/ko/necko/",
+        "devtools-shared": "chrome/ko/locale/ko/devtools/shared/",
+        "places": "chrome/ko/locale/ko/places/",
         "messenger-region": "chrome/ko/locale/ko/messenger-region/",
-        "mozldap": "chrome/ko/locale/ko/mozldap/",
-        "pipnss": "chrome/ko/locale/ko/pipnss/",
         "autoconfig": "chrome/ko/locale/ko/autoconfig/",
+        "mozldap": "chrome/ko/locale/ko/mozldap/",
         "devtools-startup": "chrome/ko/locale/ko/devtools/startup/",
-        "devtools-shared": "chrome/ko/locale/ko/devtools/shared/",
-        "pluginproblem": "chrome/ko/locale/ko/pluginproblem/",
+        "messenger-smime": "chrome/ko/locale/ko/messenger-smime/",
         "communicator": "chrome/ko/locale/ko/communicator/",
-        "alerts": "chrome/ko/locale/ko/alerts/",
+        "messenger-mapi": "chrome/ko/locale/ko/messenger-mapi/",
+        "pluginproblem": "chrome/ko/locale/ko/pluginproblem/",
         "pippki": "chrome/ko/locale/ko/pippki/",
-        "global-platform": {
-          "linux": "chrome/ko/locale/ko/global-platform/unix/",
-          "win": "chrome/ko/locale/ko/global-platform/win/",
-          "macosx": "chrome/ko/locale/ko/global-platform/mac/",
-          "android": "chrome/ko/locale/ko/global-platform/unix/"
-        },
-        "messenger-smime": "chrome/ko/locale/ko/messenger-smime/",
-        "chat": "chrome/ko/locale/ko/chat/",
-        "branding": "chrome/ko/locale/ko/branding/",
-        "places": "chrome/ko/locale/ko/places/",
-        "lightning": "chrome/ko/locale/ko/lightning/"
+        "devtools": "chrome/ko/locale/ko/devtools/client/",
+        "alerts": "chrome/ko/locale/ko/alerts/"
       }
     }
   },
+  "author": "한글 Mozilla 프로젝트(mozilla.or.kr) (contributors: Seokchan Yun, JoungKyun Kim)",
+  "name": "Korean (KR) Language Pack",
+  "description": "Language pack for Thunderbird for ko",
   "manifest_version": 2,
-  "version": "76.0buildid20200407173003",
+  "version": "76.0buildid20200420212409",
+  "langpack_id": "ko",
   "applications": {
     "gecko": {
       "strict_max_version": "76.*",
-      "strict_min_version": "76.0",
-      "id": "langpack-ko@thunderbird.mozilla.org"
+      "id": "langpack-ko@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
     }
   },
-  "description": "Language pack for Thunderbird for ko",
-  "langpack_id": "ko",
-  "author": "한글 Mozilla 프로젝트(mozilla.or.kr) (contributors: Seokchan Yun, JoungKyun Kim)",
   "sources": {
     "browser": {
       "base_path": "browser/"
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties
index a4045529f6cd..1eb5adfde3b5 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/debugger.properties
@@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=a
 removeDirectoryRoot.label=Nelaikyti pradiniu aplanku
 removeDirectoryRoot.accesskey=p
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+blackBoxAll.label=Juodoji dėžė
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+blackBoxAllInGroup.label=Juodosios dėžės failai šioje grupėje
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+unblackBoxAllInGroup.label=Išimti šios grupės failus iš juodosios dėžės
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+blackBoxAllOutsideGroup.label=Padėti visus ne šios grupės failus į juodąją dėžę
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+unblackBoxAllOutsideGroup.label=Išimti visus ne šios grupės failus iš juodosios dėžės
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+blackBoxAllInDir.label=Įdėti visus šio aplanko failus į juodąją dėžę
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+unblackBoxAllInDir.label=Išimti visus šio aplanko failus iš juodosios dėžės
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+blackBoxAllOutsideDir.label=Įdėti visus ne šio aplanko failus į juodąją dėžę
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+unblackBoxAllOutsideDir.label=Išimti visus ne šio aplanko failus iš juodosios dėžės
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Kopijuoti funkciją
@@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Pašalinta:
 # a JS execution
 whyPaused.interrupted=Pristabdyta ties vykdymu
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause=Pristabdyta ties įrašinėjimu
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=nereikalingas
 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
 # service worker that is in an unknown state.
 serviceWorkerInfo.unknown=nežinomas
-
-# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
-blackBoxAll.label=Blackbox
-# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected group
-blackBoxAllInGroup.label=Blackbox files in this group
-# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected group
-unblackBoxAllInGroup.label=Unblackbox files in this group
-# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected group
-blackBoxAllOutsideGroup.label=Blackbox files outside this group
-# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected group
-unblackBoxAllOutsideGroup.label=Unblackbox files outside this group
-# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected directory
-blackBoxAllInDir.label=Blackbox files in this directory
-# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected directory
-unblackBoxAllInDir.label=Unblackbox files in this directory
-# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected directory
-blackBoxAllOutsideDir.label=Blackbox files outside this directory
-# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected directory
-unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties
index d0490c885810..2a36ac23fcc0 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Šis elementas turi slinkimo galimybę.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Nėra susietos taisyklės
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Laikykite „Vald“ ir spustelėkite, norėdami peršokti į taisyklę
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties
index ca13ee1020b8..20dffdfa631c 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy=Kopijuoti
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll=Išskleisti viską
 
+jsonViewer.ExpandAllSlow=Išskleisti viską (lėtai)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll=Suskleisti visus
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON=Filtruoti JSON
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference=Ciklo nuoroda
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties
index 6916183ab976..ad1c3d96dab8 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/netmonitor.properties
@@ -351,6 +351,10 @@ netmonitor.timings.startedAt=Pradėta: %S
 # %S is time expressed in milliseconds or minutes.
 netmonitor.timings.downloadedAt=Atsiųsta: %S
 
+# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
+# timings pane when thea request has been blocked
+netmonitor.timings.noTimings=Nėra šios užklausos trukmių
+
 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
 # in the network menu specifying timing interval divisions (in milliseconds).
 networkMenu.millisecond=%S ms
@@ -761,6 +765,14 @@ netmonitor.ws.context.received=Gauta
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=G
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+netmonitor.ws.context.controlFrames=Valdymo
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey=o
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Kopijuoti pranešimą
@@ -781,11 +793,6 @@ netmonitor.ws.type.sent=Išsiųsta
 # accessible text for the "received" type icon in the websocket table's "data" column.
 netmonitor.ws.type.received=Gauta
 
-# LOCALIZATION NOTE (netmonitor.ws.time.format): This is the format used for the
-# time values in the websocket table's "time" column
-# %1$S is the formatted hour-minutes-seconds, %2$S is the milliseconds (zero-padded)
-netmonitor.ws.time.format=%1$S.%2$S
-
 # LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed
 # in the messages panel identifying the raw data.
 netmonitor.ws.rawData.header=Neapdoroti duomenys (%S)
@@ -1526,13 +1533,3 @@ netmonitor.cache.lastModified=Atnaujinta
 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
 # where a cached object was fetched from (e.g. "disk").
 netmonitor.cache.device=Įrenginys
-
-# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
-# timings pane when thea request has been blocked
-netmonitor.timings.noTimings=No timings for this request
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
-# on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties
index 1923c7cfcc22..69c634219dc7 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/devtools/client/webconsole.properties
@@ -233,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey=v
 # copies the entire output of the console to the clipboard.
 webconsole.menu.exportClipboard.label=Kopijuoti matomus pranešimus į iškarpinę
 
+# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
+# Label used for a context-menu item displayed for any log. Clicking on it will
+# jump to the execution point where the log item was generated.
+webconsole.menu.timeWarp.label=Peršokti čia
+
+# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
+# Label used for the tooltip on the "jump" button in the console. It's displayed when
+# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
+# message in the console output. Clicking on it will jump to the execution point where the
+# log item was generated.
+# Parameters: %S is the level of the message.
+webconsole.jumpButton.tooltip=%S – peršokti čia
+
 # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label)
 # Label used for a context-menu item displayed on the output. Clicking on it
 # opens a submenu where the user can select how to export messages.
@@ -249,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label=Iškarpinę
 # the output of the console.
 webconsole.menu.exportSubmenu.exportFile.label=Failą
 
-# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
-# Label used for a context-menu item displayed for any log. Clicking on it will
-# jump to the execution point where the log item was generated.
-webconsole.menu.timeWarp.label=Peršokti čia
-
-# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
-# Label used for the tooltip on the "jump" button in the console. It's displayed when
-# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
-# message in the console output. Clicking on it will jump to the execution point where the
-# log item was generated.
-# Parameters: %S is the level of the message.
-webconsole.jumpButton.tooltip=%S – peršokti čia
-
 # LOCALIZATION NOTE (webconsole.clearButton.tooltip)
 # Label used for the tooltip on the clear logs button in the console top toolbar bar.
 # Clicking on it will clear the content of the console.
@@ -392,11 +392,6 @@ webconsole.console.settings.menu.item.enablePersistentLogs.label=Išlaikyti žur
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip)
 webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=Įjungus šią parinktį, išvestys nebus išvalomos pereinant į kitą tinklalapį
 
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label)
-webconsole.console.settings.menu.item.eagerEvaluation.label=Išankstinis įvertinimas
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip)
-webconsole.console.settings.menu.item.eagerEvaluation.tooltip=Įjungus šią parinktį, įvestis bus įvertinama iš anksto, jums ją renkant
-
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label)
 webconsole.console.settings.menu.item.instantEvaluation.label=Greitas įvertinimas
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip)
@@ -594,6 +589,6 @@ webconsole.input.selector.top=Viršutinė
 webconsole.input.selector.tooltip=Pasirinkti įvertinimo kontekstą
 
 # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected
+webconsole.group.cookieSameSiteLaxByDefaultEnabled=Kai kurie slapukai netinkamai naudoja „sameSite“ atributą, tad jis neveiks kaip turėtų
 # LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute
+webconsole.group.cookieSameSiteLaxByDefaultDisabled=Kai kurie slapukai netinkamai naudoja „sameSite“ atributą
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties
index fea483242a9e..6390f85be06d 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      skyriklis
 tabPanel     =      kortelių juosta
 # The roleDescription for the html:mark element
 highlight = paryškinimas
-
 # The roleDescription for the details element
-details = details
+details = išsamiau
 # The roleDescription for the summary element
-summary = summary
+summary = santrauka
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties
index f3a649c1e887..f4a1b894b26f 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Stilių rinkinys %1$S buvo įkeltas kaip CSS nors jo MIME tipas (
 
 PEUnexpEOF2=Ieškant elemento „%1$S“, pasiekta failo pabaiga.
 PEParseRuleWSOnly=Vietoj taisyklės pateikta tuščia eilutė.
+
 PEDeclDropped=Nėra aprašo.
 PEDeclSkipped=Pereita prie tolesnio aprašo.
 PEUnknownProperty=Savybė „%1$S“ nėra žinoma.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Potinklelio vardų sąrašui yra leid
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Takelių sąraše yra leidžiamas tik vienas „repeat(auto-fill, …)“ arba „repeat(auto-fit, …)“.
 PEMoreThanOneGridRepeatTrackSize=Viduje „repeat(auto-fill, …)“ yra leidžiamas tik vienas takelio dydis.
 
+PEDisallowedImportRule=Kol kas „@import“ taisyklės nėra galimos konstruotuose stilių aprašuose.
+
 TooLargeDashedRadius=Rėmelio spindulys yra per didelis „dashed“ stiliui (riba yra 100000 taškų). Atvaizduojamas kaip vientisas.
 TooLargeDottedRadius=Rėmelio spindulys yra per didelis „dotted“ stiliui (riba yra 100000 taškų). Atvaizduojamas kaip vientisas.
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties
index 7ed1c4f53974..0ff67759d6fc 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/dom/dom.properties
@@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=„MathML“ atributai „background“,
 MathML_DeprecatedXLinkAttributeWarning=„XLink“ atributai „href“, „type“, „show“ ir „actuate“ yra nenaudotini su „MathML“ elementais, ir ateityje bus panaikinti.
 WebShareAPI_Failed=Dalinimosi operacija nepavyko.
 WebShareAPI_Aborted=Dalinimosi operacija buvo nutraukta.
-
 # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
-UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol.
+UnknownProtocolNavigationPrevented=Neleista patekti į „%1$S“ dėl nežinomo protokolo.
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties
index 46ceb19ccfdd..996be13a6694 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/global/security/security.properties
@@ -147,13 +147,16 @@ XFODeny = Įkėlimas atmestas dėl X-Frame-Options: „%1$S“ iš „%2$S“, s
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Įkėlimas atmestas dėl X-Frame-Options: „%1$S“ iš „%2$S“, svetainė neleidžia „cross-origin“ rėminimo iš „%3$S“.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Netinkama „X-Frame-Options“ antraštė įkeliant „%2$S“: „%1$S“ nėra galima direktyva.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=„%2$S“ įkėlimas kadre buvo uždraustas, nes „X-Frame-Options“ direktyvos reikšmė yra „%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Nesaugi užklausa „%1$S“ dabar naudos „%2$S“.
 # LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgrade = Nepavyko pataisyti užklausos „%1$S“, nes ji turi „NoUpgrade“ žymę.
-
-# LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt.
+HTTPSOnlyNoUpgradeException = Nesaugi užklausa „%1$S“  turi išimtį.
 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code.
-HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S)
+HTTPSOnlyFailedRequest = Nesaugios užklausos „%1$S“ atnaujinimas nepavyko. (%2$S“)
diff --git a/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties b/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties
index 54c35c0ad1e8..f4299365c1ce 100644
--- a/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties
+++ b/thunderbird-l10n/lt/chrome/lt/locale/lt/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Saugyklų prieiga automatiškai sutei
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Saugyklų prieiga automatiškai suteikta stebėjimo elementui „%2$S“ per „%1$S“.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Priėjimas prie saugyklos automatiškai suteiktas „First-Party“ izoliacijai „%2$S“, esančiai „%1$S“.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Slapukas „%1$S“ buvo atmestas, nes turi atributą „sameSite=none“, tačiau neturi atributo „secure“.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
@@ -67,8 +70,7 @@ CookieLaxForced=Slapuko „%1$S“ atributo „sameSite“ reikšmė nustatyta 
 CookieLaxForcedForBeta=Slapukas „%1$S“ neturi tinkamos atributo „sameSite“ reikšmės. Netrukus slapukai be „sameSite“ atributo, arba su netinkama reikšme, bus laikomi „lax“. Tai reiškia, kad tokie slapukai nebus persiunčiami trečiųjų šalių kontekstuose. Jei jūsų programai reikia, kad šie slapukai egzistuotų tokiuose kontekstuose, prašome jiems pridėti „sameSite=none“ atributą. Norėdami sužinoti daugiau, skaitykite %2$S
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid=Netinkama „sameSite“ atributo reikšmė slapukui „%1$S“. Galimos reikšmės: „lax“, „strict“, „none“.
-
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
+CookieOversize=Slapukas „%1$S“ yra negalimas, nes jo dydis per didelis. Didžiausias dydis yra %2$S B.
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize=Slapukas „%1$S“ yra negalimas, nes jo kelio dydis per didelis. Didžiausias dydis yra %2$S B.
diff --git a/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl
index 6d92d4d2dfe3..95d6e158e460 100644
--- a/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/lt/localization/lt/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Prijungto įrenginio darinio laida ({
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = Derintuvės polangis gali neveikti su prijungto įrenginio naršykle. Naudokite „Firefox“ { $runtimeVersion }, jeigu turite naudoti derintuvę su šia įrenginio naršykle.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Ši „Firefox“ laida negali būti naudojama „Firefox“ (68), skirtos „Android“, derinimui. Testavimui rekomenduojame savo telefone įdiegti „Firefox for Android Nightly“. <a>Daugiau informacijos</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl
index 325ba70fea5b..059596bec382 100644
--- a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Įdiegti priedą iš failo…
     .accesskey = d
 help-button = Priedų pagalba
+sidebar-help-button-title =
+    .title = Priedų pagalba
 preferences =
     { PLATFORM() ->
         [windows] „{ -brand-short-name }“ nuostatos
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Visiems priedams taikomos priemonės
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] „{ -brand-short-name }“ nuostatos
+           *[other] „{ -brand-short-name }“ nuostatos
+        }
 show-unsigned-extensions-button =
     .label = Kai kurių plėtinių patikrinti nepavyko
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Galimi naujinimai
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Rekomendacijos
+addon-category-discover-title =
+    .title = Rekomendacijos
 addon-category-extension = Plėtiniai
+addon-category-extension-title =
+    .title = Plėtiniai
 addon-category-theme = Grafiniai apvalkalai
+addon-category-theme-title =
+    .title = Grafiniai apvalkalai
 addon-category-plugin = Papildiniai
+addon-category-plugin-title =
+    .title = Papildiniai
 addon-category-dictionary = Žodynai
+addon-category-dictionary-title =
+    .title = Žodynai
 addon-category-locale = Kalbos
+addon-category-locale-title =
+    .title = Kalbos
 addon-category-available-updates = Galimi naujinimai
+addon-category-available-updates-title =
+    .title = Galimi naujinimai
 addon-category-recent-updates = Paskiausiai atnaujinti
+addon-category-recent-updates-title =
+    .title = Paskiausiai atnaujinti
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Šie priedai neturi sparčiųjų klavišų komandų:
 shortcuts-input =
     .placeholder = Surinkite klavišų kombinaciją
 shortcuts-browserAction = Įjungti priedą
+shortcuts-browserAction2 = Aktyvuoti priemonių juostos mygtuką
 shortcuts-pageAction = Įjungti veiksmą tinklalapyje
 shortcuts-sidebarAction = Rodyti / slėpti šoninį polangį
 shortcuts-modifier-mac = Įtraukti Ctrl, Alt arba ⌘
@@ -313,6 +338,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Rodyti mažiau
 go-back-button =
     .tooltiptext = Eiti atgal
+header-back-button =
+    .title = Eiti atgal
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl
index 89f0f0187fe6..e129dd3704a1 100644
--- a/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/lt/localization/lt/toolkit/about/aboutSupport.ftl
@@ -292,6 +292,11 @@ sandbox-proc-type-content = turinys
 sandbox-proc-type-file = failo turinys
 sandbox-proc-type-media-plugin = medijos įskiepis
 sandbox-proc-type-data-decoder = duomenų iškoduotuvas
+startup-cache-title = Paleisties podėlis
+startup-cache-disk-cache-path = Disko podėlio kelias
+startup-cache-ignore-disk-cache = Ignoruoti disko podėlį
+startup-cache-found-disk-cache-on-init = Rastas disko podėlis įkėlimo metu
+startup-cache-wrote-to-disk-cache = Įrašyta į disko podėlį
 launcher-process-status-0 = Įjungta
 launcher-process-status-1 = Išjungta dėl gedimo
 launcher-process-status-2 = Išjungta priverstinai
@@ -315,6 +320,7 @@ touch-enabled = įjungta įvestis lietimu
 drag-enabled = slankjuostės tempimas įjungtas
 keyboard-enabled = klaviatūra įjungta
 autoscroll-enabled = automatinis slinkimas įjungtas
+zooming-enabled = įjungtas tolygus artinimas suimant
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl
index 3a496fcdd113..6cc12edca5fb 100644
--- a/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/lt/localization/lt/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Apsikeitimo raktais grupė
 certificate-viewer-key-id = Rakto identifikatorius
 certificate-viewer-key-size = Rakto dydis
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Centrinė buveinė
 certificate-viewer-locality = Vietovė
 certificate-viewer-location = Vieta
 certificate-viewer-logid = Įrašo identifikatorius
@@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Šis plėtinys buvo pažymėtas kaip kritinis, kas reiškia, kad klientai privalo atmesti liudijimą, jeigu jo nesupranta.
+certificate-viewer-export = Eksportuoti
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Jūsų liudijimai
+certificate-viewer-tab-people = Žmonės
+certificate-viewer-tab-servers = Serveriai
+certificate-viewer-tab-ca = Liudijimų įstaigos
+certificate-viewer-tab-unkonwn = Nežinoma
diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl
index 9cfe18c3ff9a..e2dc69d79626 100644
--- a/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/lt/localization/lt/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Izoliuotas saityno turinys
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Sujungimas
diff --git a/thunderbird-l10n/lt/localization/lt/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/lt/localization/lt/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..9c257a5af387
--- /dev/null
+++ b/thunderbird-l10n/lt/localization/lt/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Jūs paleidote senesnę „{ -brand-product-name }“ laidą
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Kurti naują profilį
+profiledowngrade-sync = Senesnės „{ -brand-product-name }“ laidos naudojimas gali sugadinti adresyną ir naršymo žurnalą, įrašytus jau esančiame „{ -brand-product-name }“ profilyje. Norėdami apsaugoti savo duomenis, šiai „{ -brand-short-name }“ įdiegčiai susikurkite naują profilį. Vėliau galėsite prisijungti su { -fxaccount-brand-name } ir sinchronizuoti savo adresyną bei naršymo istoriją tarp profilių.
+profiledowngrade-nosync = Senesnės „{ -brand-product-name }“ laidos naudojimas gali sugadinti adresyną ir naršymo žurnalą, įrašytus jau esančiame „{ -brand-product-name }“ profilyje. Norėdami apsaugoti savo duomenis, šiai „{ -brand-short-name }“ įdiegčiai susikurkite naują profilį.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Išeiti
+           *[other] Išeiti
+        }
diff --git a/thunderbird-l10n/lt/manifest.json b/thunderbird-l10n/lt/manifest.json
index 4391fb134054..c2e5ac39e279 100644
--- a/thunderbird-l10n/lt/manifest.json
+++ b/thunderbird-l10n/lt/manifest.json
@@ -1,57 +1,57 @@
 {
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "lt",
-  "manifest_version": 2,
-  "author": "Mozilla Lietuvoje (contributors: Gintautas Grigas, Tatjana Jevsikova, Rimas Kudelis, Sigita Pedzevičienė)",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "description": "Language pack for Thunderbird for lt",
-  "name": "Lietuvių Language Pack",
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*",
-      "id": "langpack-lt@thunderbird.mozilla.org"
-    }
-  },
   "languages": {
     "lt": {
-      "version": "20200405184421",
       "chrome_resources": {
+        "pluginproblem": "chrome/lt/locale/lt/pluginproblem/",
+        "messenger-newsblog": "chrome/lt/locale/lt/messenger-newsblog/",
+        "pippki": "chrome/lt/locale/lt/pippki/",
+        "calendar": "chrome/lt/locale/lt/calendar/",
         "lightning": "chrome/lt/locale/lt/lightning/",
+        "alerts": "chrome/lt/locale/lt/alerts/",
         "communicator": "chrome/lt/locale/lt/communicator/",
+        "necko": "chrome/lt/locale/lt/necko/",
+        "chat": "chrome/lt/locale/lt/chat/",
         "messenger-mapi": "chrome/lt/locale/lt/messenger-mapi/",
         "branding": "chrome/lt/locale/lt/branding/",
-        "mozapps": "chrome/lt/locale/lt/mozapps/",
         "passwordmgr": "chrome/lt/locale/lt/passwordmgr/",
-        "chat": "chrome/lt/locale/lt/chat/",
+        "devtools-startup": "chrome/lt/locale/lt/devtools/startup/",
+        "pipnss": "chrome/lt/locale/lt/pipnss/",
         "devtools": "chrome/lt/locale/lt/devtools/client/",
-        "messenger-newsblog": "chrome/lt/locale/lt/messenger-newsblog/",
+        "mozapps": "chrome/lt/locale/lt/mozapps/",
+        "devtools-shared": "chrome/lt/locale/lt/devtools/shared/",
+        "places": "chrome/lt/locale/lt/places/",
+        "autoconfig": "chrome/lt/locale/lt/autoconfig/",
+        "global": "chrome/lt/locale/lt/global/",
+        "messenger-region": "chrome/lt/locale/lt/messenger-region/",
+        "messenger": "chrome/lt/locale/lt/messenger/",
+        "messenger-smime": "chrome/lt/locale/lt/messenger-smime/",
         "global-platform": {
-          "macosx": "chrome/lt/locale/lt/global-platform/mac/",
+          "android": "chrome/lt/locale/lt/global-platform/unix/",
           "linux": "chrome/lt/locale/lt/global-platform/unix/",
-          "win": "chrome/lt/locale/lt/global-platform/win/",
-          "android": "chrome/lt/locale/lt/global-platform/unix/"
+          "macosx": "chrome/lt/locale/lt/global-platform/mac/",
+          "win": "chrome/lt/locale/lt/global-platform/win/"
         },
-        "messenger": "chrome/lt/locale/lt/messenger/",
-        "mozldap": "chrome/lt/locale/lt/mozldap/",
-        "messenger-region": "chrome/lt/locale/lt/messenger-region/",
-        "autoconfig": "chrome/lt/locale/lt/autoconfig/",
-        "pippki": "chrome/lt/locale/lt/pippki/",
-        "alerts": "chrome/lt/locale/lt/alerts/",
-        "places": "chrome/lt/locale/lt/places/",
-        "pipnss": "chrome/lt/locale/lt/pipnss/",
-        "devtools-startup": "chrome/lt/locale/lt/devtools/startup/",
-        "devtools-shared": "chrome/lt/locale/lt/devtools/shared/",
-        "pluginproblem": "chrome/lt/locale/lt/pluginproblem/",
-        "global": "chrome/lt/locale/lt/global/",
-        "calendar": "chrome/lt/locale/lt/calendar/",
-        "necko": "chrome/lt/locale/lt/necko/",
-        "messenger-smime": "chrome/lt/locale/lt/messenger-smime/"
-      }
+        "mozldap": "chrome/lt/locale/lt/mozldap/"
+      },
+      "version": "20200418172531"
+    }
+  },
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "author": "Mozilla Lietuvoje (contributors: Gintautas Grigas, Tatjana Jevsikova, Rimas Kudelis, Sigita Pedzevičienė)",
+  "manifest_version": 2,
+  "langpack_id": "lt",
+  "name": "Lietuvių Language Pack",
+  "description": "Language pack for Thunderbird for lt",
+  "version": "76.0buildid20200420212409",
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "id": "langpack-lt@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
     }
   }
 }
diff --git a/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl
index 8ca16bae08cf..b7db3cc4aaec 100644
--- a/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ms/localization/ms/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Pasang Add-ons Dari Fail…
     .accesskey = I
 help-button = Sokongan Add-ons
+sidebar-help-button-title =
+    .title = Sokongan Add-ons
 preferences =
     { PLATFORM() ->
         [windows] Pilihan { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Alatan untuk semua add-on
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Pilihan { -brand-short-name }
+           *[other] Keutamaan { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Beberapa ekstensi tidak dapat disahkan
 show-all-extensions-button =
@@ -141,12 +149,26 @@ extensions-view-available-updates =
     .name = Kemaskini Tersedia
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-extension = Ekstensi
+addon-category-extension-title =
+    .title = Ekstensi
 addon-category-theme = Tema
+addon-category-theme-title =
+    .title = Tema
 addon-category-plugin = Plugin
+addon-category-plugin-title =
+    .title = Plugin
 addon-category-dictionary = Kamus
+addon-category-dictionary-title =
+    .title = Kamus
 addon-category-locale = Bahasa
+addon-category-locale-title =
+    .title = Bahasa
 addon-category-available-updates = Kemaskini Tersedia
+addon-category-available-updates-title =
+    .title = Kemaskini Tersedia
 addon-category-recent-updates = Kemaskini Terkini
+addon-category-recent-updates-title =
+    .title = Kemaskini Terkini
 
 ## These are global warnings
 
diff --git a/thunderbird-l10n/ms/localization/ms/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ms/localization/ms/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..6fbe8159b2db
--- /dev/null
+++ b/thunderbird-l10n/ms/localization/ms/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,3 @@
+# 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/.
diff --git a/thunderbird-l10n/ms/manifest.json b/thunderbird-l10n/ms/manifest.json
index 1095a62c1201..b4cf652cd1af 100644
--- a/thunderbird-l10n/ms/manifest.json
+++ b/thunderbird-l10n/ms/manifest.json
@@ -1,11 +1,5 @@
 {
-  "name": "Bahasa Melayu (ms) Language Pack",
   "manifest_version": 2,
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
   "applications": {
     "gecko": {
       "strict_min_version": "76.0",
@@ -13,45 +7,51 @@
       "id": "langpack-ms@thunderbird.mozilla.org"
     }
   },
+  "name": "Bahasa Melayu (ms) Language Pack",
+  "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)",
+  "langpack_id": "ms",
+  "version": "76.0buildid20200420212409",
   "description": "Language pack for Thunderbird for ms",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
   "languages": {
     "ms": {
+      "version": "20200415060535",
       "chrome_resources": {
-        "chat": "chrome/ms/locale/ms/chat/",
+        "alerts": "chrome/ms/locale/ms/alerts/",
+        "branding": "chrome/ms/locale/ms/branding/",
         "devtools-shared": "chrome/ms/locale/ms/devtools/shared/",
-        "devtools": "chrome/ms/locale/ms/devtools/client/",
-        "messenger-newsblog": "chrome/ms/locale/ms/messenger-newsblog/",
-        "lightning": "chrome/ms/locale/ms/lightning/",
-        "necko": "chrome/ms/locale/ms/necko/",
-        "passwordmgr": "chrome/ms/locale/ms/passwordmgr/",
-        "mozldap": "chrome/ms/locale/ms/mozldap/",
-        "devtools-startup": "chrome/ms/locale/ms/devtools/startup/",
-        "autoconfig": "chrome/ms/locale/ms/autoconfig/",
-        "calendar": "chrome/ms/locale/ms/calendar/",
-        "messenger-smime": "chrome/ms/locale/ms/messenger-smime/",
-        "communicator": "chrome/ms/locale/ms/communicator/",
-        "global": "chrome/ms/locale/ms/global/",
-        "pipnss": "chrome/ms/locale/ms/pipnss/",
         "places": "chrome/ms/locale/ms/places/",
-        "messenger-mapi": "chrome/ms/locale/ms/messenger-mapi/",
         "global-platform": {
+          "linux": "chrome/ms/locale/ms/global-platform/unix/",
           "android": "chrome/ms/locale/ms/global-platform/unix/",
           "macosx": "chrome/ms/locale/ms/global-platform/mac/",
-          "win": "chrome/ms/locale/ms/global-platform/win/",
-          "linux": "chrome/ms/locale/ms/global-platform/unix/"
+          "win": "chrome/ms/locale/ms/global-platform/win/"
         },
-        "messenger-region": "chrome/ms/locale/ms/messenger-region/",
-        "pluginproblem": "chrome/ms/locale/ms/pluginproblem/",
-        "branding": "chrome/ms/locale/ms/branding/",
+        "messenger-smime": "chrome/ms/locale/ms/messenger-smime/",
+        "chat": "chrome/ms/locale/ms/chat/",
         "pippki": "chrome/ms/locale/ms/pippki/",
-        "alerts": "chrome/ms/locale/ms/alerts/",
+        "mozldap": "chrome/ms/locale/ms/mozldap/",
+        "global": "chrome/ms/locale/ms/global/",
+        "messenger-mapi": "chrome/ms/locale/ms/messenger-mapi/",
+        "autoconfig": "chrome/ms/locale/ms/autoconfig/",
+        "devtools": "chrome/ms/locale/ms/devtools/client/",
+        "calendar": "chrome/ms/locale/ms/calendar/",
+        "messenger-newsblog": "chrome/ms/locale/ms/messenger-newsblog/",
         "messenger": "chrome/ms/locale/ms/messenger/",
-        "mozapps": "chrome/ms/locale/ms/mozapps/"
-      },
-      "version": "20200403075703"
+        "mozapps": "chrome/ms/locale/ms/mozapps/",
+        "communicator": "chrome/ms/locale/ms/communicator/",
+        "messenger-region": "chrome/ms/locale/ms/messenger-region/",
+        "lightning": "chrome/ms/locale/ms/lightning/",
+        "pluginproblem": "chrome/ms/locale/ms/pluginproblem/",
+        "necko": "chrome/ms/locale/ms/necko/",
+        "pipnss": "chrome/ms/locale/ms/pipnss/",
+        "devtools-startup": "chrome/ms/locale/ms/devtools/startup/",
+        "passwordmgr": "chrome/ms/locale/ms/passwordmgr/"
+      }
     }
-  },
-  "langpack_id": "ms",
-  "version": "76.0buildid20200407173003",
-  "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)"
+  }
 }
diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties
index 47a0200a2fd5..851048c11ba1 100644
--- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties
+++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=No associated rule
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties
index 217ed9d1fffc..cfe0e8f5ed98 100644
--- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties
+++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type,
 
 PEUnexpEOF2=Unexpected end of file while searching for %1$S.
 PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule.
+
 PEDeclDropped=Declaration dropped.
 PEDeclSkipped=Skipped to next declaration.
 PEUnknownProperty=Unknown property '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Only one repeat(auto-fill, …) is all
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Only one repeat(auto-fill, …) or repeat(auto-fit, …) is allowed in a track list.
 PEMoreThanOneGridRepeatTrackSize=Only one track size is allowed inside repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=@import-regler er ennå ikke gyldige i konstruerte stilsett.
+
 TooLargeDashedRadius=Kantradius er for stor for ‘stiplet’ stil (grensen er 100000 px). Gjengis som fyllt.
 TooLargeDottedRadius=Kantradius er for stor for ‘prikket’ stil (grensen er 100000 px). Gjengis som fyllt.
diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties
index 494f43fc8da1..7402aac6bff7 100644
--- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties
+++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Lasting nektet av X-Frame-Options: «%1$S» fra «%2$S», nettstedet t
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Lasting nektet av X-Frame-Options: «%1$S» fra «%2$S», nettstedet tillater ikke kryss-opprinnelse innramming fra «%3$S».
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = En ugyldig X-Frame-Options-header ble funnet under innlesing av «%1$S»: «%2$S» er ikke et gyldig direktiv.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Lasting av «%2$S» i en ramme blir nektet av «X-Frame-Options»-direktivet satt ti «%1$S».
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Oppgraderer usikker forespørsel «%1$S» til å bruke «%2$S».
diff --git a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties
index a243e9be11bb..ad56de38dad2 100644
--- a/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties
+++ b/thunderbird-l10n/nb-NO/chrome/nb-NO/locale/nb-NO/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Lagringstilgang ble automatisk tildel
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Lagringstilgang ble automatisk tildelt for sporer «%2$S» på «%1$S».
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Lagringstilgang ble automatisk tildelt for førstepartsisolasjon «%2$S» på «%1$S».
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Infokapsel «%1$S» ble avvist fordi den har attributten «sameSite=none», men mangler «secure»-attributten.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..dfe02707fdfa
--- /dev/null
+++ b/thunderbird-l10n/nb-NO/localization/nb-NO/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Omdirigering av URI for kalender
+calendar-uri-redirect-description =
+    Serveren omdirigerer URI for kalenderen «{ $calendarName }».
+    Godta omdirigering og begynne å bruke den nye URI-en for denne kalenderen?
+calendar-uri-redirect-original-uri-label = GJeldende URI:
+calendar-uri-redirect-target-uri-label = Omdirigerer til ny URI:
diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl
index 752079802319..7d52eb880886 100644
--- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Installer utvidelse fra fil …
     .accesskey = I
 help-button = Brukerstøtte for utvidelser
+sidebar-help-button-title =
+    .title = Brukerstøtte for utvidelser
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name }-innstillinger
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Verktøy for alle utvidelser
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name }-innstillinger
+           *[other] { -brand-short-name }-innstillinger
+        }
 show-unsigned-extensions-button =
     .label = Noen utvidelser kunne ikke bli kontrollert
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Tilgjengelige oppdateringer
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Anbefalinger
+addon-category-discover-title =
+    .title = Anbefalinger
 addon-category-extension = Utvidelser
+addon-category-extension-title =
+    .title = Utvidelser
 addon-category-theme = Temaer
+addon-category-theme-title =
+    .title = Temaer
 addon-category-plugin = Programtillegg
+addon-category-plugin-title =
+    .title = Programtillegg
 addon-category-dictionary = Ordbøker
+addon-category-dictionary-title =
+    .title = Ordbøker
 addon-category-locale = Språk
+addon-category-locale-title =
+    .title = Språk
 addon-category-available-updates = Tilgjengelige oppdateringer
+addon-category-available-updates-title =
+    .title = Tilgjengelige oppdateringer
 addon-category-recent-updates = Nylig oppdatert
+addon-category-recent-updates-title =
+    .title = Nylig oppdatert
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Følgende utvidelser har ikke snarveier:
 shortcuts-input =
     .placeholder = Skriver inn en snarvei
 shortcuts-browserAction = Aktiver utvidelse
+shortcuts-browserAction2 = Aktiver verktøylinjeknapp
 shortcuts-pageAction = Aktiver sidehandling
 shortcuts-sidebarAction = Vis/skjul sidestolpe
 shortcuts-modifier-mac = Inkluder Ctrl, Alt eller ⌘
@@ -311,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Vis mindre
 go-back-button =
     .tooltiptext = Gå tilbake
+header-back-button =
+    .title = Gå tilbake
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl
index 316d7355387c..38427ea5b69d 100644
--- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = innhold
 sandbox-proc-type-file = filinnhold
 sandbox-proc-type-media-plugin = programtillegg for medier
 sandbox-proc-type-data-decoder = datadekoder
+startup-cache-title = Oppstartshurtiglager
+startup-cache-disk-cache-path = Sti for diskhurtiglager
+startup-cache-ignore-disk-cache = Ignorer diskhurtiglager
+startup-cache-found-disk-cache-on-init = Fant diskhurtiglager på Init
+startup-cache-wrote-to-disk-cache = Skrev til diskhurtiglager
 launcher-process-status-0 = Aktivert
 launcher-process-status-1 = Deaktivert på grunn av feil
 launcher-process-status-2 = Tvunget deaktivert
@@ -310,6 +315,7 @@ touch-enabled = touchinput påslått
 drag-enabled = dra og slipp av rullelinje påslått
 keyboard-enabled = tastatur aktivert
 autoscroll-enabled = automatisk rulling slått på
+zooming-enabled = glatt pinch-zoom aktivert
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl
index 3094c92378bd..852e1cc59fc4 100644
--- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Denne utvidelsen er merket som kritisk, noe som betyr at klienter må avvise sertifikatet hvis de ikke forstår det.
+certificate-viewer-export = Eksporter
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Dine sertifikater
+certificate-viewer-tab-people = Personer
+certificate-viewer-tab-servers = Servere
+certificate-viewer-tab-ca = Utstedere
+certificate-viewer-tab-unkonwn = Ukjent
diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl
index 59a04068a418..783607e540c2 100644
--- a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Isolert nettinnhold
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..445971cc6364
--- /dev/null
+++ b/thunderbird-l10n/nb-NO/localization/nb-NO/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Du har startet en eldre versjon av { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Lag en ny profil
+profiledowngrade-sync = Bruk av en eldre versjon av { -brand-product-name } kan ødelegge bokmerker og nettlesingshistorikk som allerede er lagret i en eksisterende { -brand-product-name }-profil. For å beskytte informasjonen din, opprett en ny profil for denne installasjonen av { -brand-short-name }. Du kan logge på med en { -fxaccount-brand-name } for å synkronisere bokmerker og nettleserhistorikken mellom ulike profiler.
+profiledowngrade-nosync = Bruk av en eldre versjon av { -brand-product-name } kan ødelegge bokmerker og nettlesingshistorikken som allerede er lagret i en eksisterende { -brand-product-name }-profil. For å beskytte informasjonen din, opprett en ny profil for denne installasjonen av { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Avslutt
+           *[other] Avslutt
+        }
diff --git a/thunderbird-l10n/nb-NO/manifest.json b/thunderbird-l10n/nb-NO/manifest.json
index 00542177a910..ef1f5dd31d24 100644
--- a/thunderbird-l10n/nb-NO/manifest.json
+++ b/thunderbird-l10n/nb-NO/manifest.json
@@ -1,57 +1,57 @@
 {
-  "author": "firefox.no (contributors: Pascual Strømsnæs, Vidar Braut Haarr, Håvar Henriksen, Reidar Djupvik, Jan-Espen Pettersen, Håvard Mork, Lasse Marøen, Martin Joné, Morten Liljegren)",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "applications": {
-    "gecko": {
-      "id": "langpack-nb-NO@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
-  "langpack_id": "nb-NO",
   "languages": {
     "nb-NO": {
+      "version": "20200420123524",
       "chrome_resources": {
-        "pluginproblem": "chrome/nb-NO/locale/nb-NO/pluginproblem/",
-        "lightning": "chrome/nb-NO/locale/nb-NO/lightning/",
-        "necko": "chrome/nb-NO/locale/nb-NO/necko/",
-        "messenger-newsblog": "chrome/nb-NO/locale/nb-NO/messenger-newsblog/",
-        "communicator": "chrome/nb-NO/locale/nb-NO/communicator/",
+        "devtools": "chrome/nb-NO/locale/nb-NO/devtools/client/",
         "branding": "chrome/nb-NO/locale/nb-NO/branding/",
+        "chat": "chrome/nb-NO/locale/nb-NO/chat/",
+        "pipnss": "chrome/nb-NO/locale/nb-NO/pipnss/",
+        "communicator": "chrome/nb-NO/locale/nb-NO/communicator/",
+        "messenger-smime": "chrome/nb-NO/locale/nb-NO/messenger-smime/",
         "alerts": "chrome/nb-NO/locale/nb-NO/alerts/",
+        "passwordmgr": "chrome/nb-NO/locale/nb-NO/passwordmgr/",
+        "messenger-mapi": "chrome/nb-NO/locale/nb-NO/messenger-mapi/",
+        "calendar": "chrome/nb-NO/locale/nb-NO/calendar/",
         "mozapps": "chrome/nb-NO/locale/nb-NO/mozapps/",
-        "devtools": "chrome/nb-NO/locale/nb-NO/devtools/client/",
-        "messenger-smime": "chrome/nb-NO/locale/nb-NO/messenger-smime/",
+        "devtools-startup": "chrome/nb-NO/locale/nb-NO/devtools/startup/",
+        "mozldap": "chrome/nb-NO/locale/nb-NO/mozldap/",
+        "pluginproblem": "chrome/nb-NO/locale/nb-NO/pluginproblem/",
         "devtools-shared": "chrome/nb-NO/locale/nb-NO/devtools/shared/",
         "messenger-region": "chrome/nb-NO/locale/nb-NO/messenger-region/",
-        "passwordmgr": "chrome/nb-NO/locale/nb-NO/passwordmgr/",
+        "messenger-newsblog": "chrome/nb-NO/locale/nb-NO/messenger-newsblog/",
+        "pippki": "chrome/nb-NO/locale/nb-NO/pippki/",
         "global-platform": {
-          "macosx": "chrome/nb-NO/locale/nb-NO/global-platform/mac/",
           "win": "chrome/nb-NO/locale/nb-NO/global-platform/win/",
           "linux": "chrome/nb-NO/locale/nb-NO/global-platform/unix/",
+          "macosx": "chrome/nb-NO/locale/nb-NO/global-platform/mac/",
           "android": "chrome/nb-NO/locale/nb-NO/global-platform/unix/"
         },
-        "pippki": "chrome/nb-NO/locale/nb-NO/pippki/",
-        "calendar": "chrome/nb-NO/locale/nb-NO/calendar/",
-        "messenger-mapi": "chrome/nb-NO/locale/nb-NO/messenger-mapi/",
-        "global": "chrome/nb-NO/locale/nb-NO/global/",
-        "messenger": "chrome/nb-NO/locale/nb-NO/messenger/",
-        "devtools-startup": "chrome/nb-NO/locale/nb-NO/devtools/startup/",
+        "lightning": "chrome/nb-NO/locale/nb-NO/lightning/",
         "places": "chrome/nb-NO/locale/nb-NO/places/",
-        "pipnss": "chrome/nb-NO/locale/nb-NO/pipnss/",
-        "chat": "chrome/nb-NO/locale/nb-NO/chat/",
-        "mozldap": "chrome/nb-NO/locale/nb-NO/mozldap/",
-        "autoconfig": "chrome/nb-NO/locale/nb-NO/autoconfig/"
-      },
-      "version": "20200403232428"
+        "necko": "chrome/nb-NO/locale/nb-NO/necko/",
+        "autoconfig": "chrome/nb-NO/locale/nb-NO/autoconfig/",
+        "global": "chrome/nb-NO/locale/nb-NO/global/",
+        "messenger": "chrome/nb-NO/locale/nb-NO/messenger/"
+      }
     }
   },
-  "name": "Norsk (bokmål) Language Pack",
-  "description": "Language pack for Thunderbird for nb-NO",
   "manifest_version": 2,
-  "version": "76.0buildid20200407173003"
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "langpack_id": "nb-NO",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-nb-NO@thunderbird.mozilla.org"
+    }
+  },
+  "author": "firefox.no (contributors: Pascual Strømsnæs, Vidar Braut Haarr, Håvar Henriksen, Reidar Djupvik, Jan-Espen Pettersen, Håvard Mork, Lasse Marøen, Martin Joné, Morten Liljegren)",
+  "description": "Language pack for Thunderbird for nb-NO",
+  "name": "Norsk (bokmål) Language Pack",
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties
index 050c81b7f352..cbd776be8c4d 100644
--- a/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties
+++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Dit element heeft scrolbare overloop.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Geen gekoppelde regel
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Houd Shift ingedrukt en klik om naar de regel te springen
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties
index fded64bd23b8..a43062b951ec 100644
--- a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties
+++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Het stijlblad %1$S werd geladen als CSS, hoewel het MIME-type erv
 
 PEUnexpEOF2=Onverwacht einde van bestand tijdens zoeken naar %1$S.
 PEParseRuleWSOnly=String met alleen witruimte gegeven om te parsen als regel.
+
 PEDeclDropped=Declaratie genegeerd.
 PEDeclSkipped=Naar volgende declaratie gesprongen.
 PEUnknownProperty=Onbekende eigenschap ‘%1$S’.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Er is maar één repeat(auto-fill, …
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Er is maar één repeat(auto-fill, …) of repeat(auto-fit, …) in een track list toegestaan.
 PEMoreThanOneGridRepeatTrackSize=Er is maar één track size binnen repeat(auto-fit/auto-fill, …) toegestaan.
 
+PEDisallowedImportRule=@import-regels zijn nog niet geldig in geconstrueerde stylesheets.
+
 TooLargeDashedRadius=Border-straal is te groot voor ‘dashed’ stijl (de limiet is 100000px). Wordt gerenderd als solid.
 TooLargeDottedRadius=Border-straal is te groot voor ‘dotted’ stijl (de limiet is 100000px). Wordt gerenderd als solid.
diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties
index 272902999982..7c0eb221c9ff 100644
--- a/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties
+++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Laden door X-Frame-Options geweigerd: ‘%1$S’ van ‘%2$S’, websi
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Laden door X-Frame-Options geweigerd: ‘%1$S’ van ‘%2$S’, website staat cross-origin-framing van ‘%3$S’ niet toe.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Er is een ongeldige X-Frame-Options-koptekst gevonden bij het laden van ‘%2$S’: ‘%1$S’ is geen geldige richtlijn.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Het laden in een frame van ‘%2$S’ is geweigerd door de richtlijn ‘X-Frame-Options’, die is ingesteld op ‘%1$S’.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Onveilige aanvraag ‘%1$S’ wordt geüpgraded voor gebruik van ‘%2$S’
diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd
index c9203573500a..c30d3e82755c 100644
--- a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd
+++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Berichten zoeken…">
 <!ENTITY searchMailCmd.accesskey "B">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Globaal zoeken…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Adressen zoeken…">
 <!ENTITY searchAddressesCmd.accesskey "A">
 
diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties
index 1c46ebc21d61..02b6445bc8a5 100644
--- a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties
+++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/pgpmime.properties
@@ -9,3 +9,6 @@
 # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Dit is een versleuteld OpenPGP-bericht.<br>Om deze e-mail te ontcijferen dient u een <a href="%S">OpenPGP-add-on</a> te installeren.
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Dit is een versleuteld OpenPGP-bericht, maar ondersteuning voor OpenPGP-ontsleuteling is niet beschikbaar.
diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd
index e71cbe23bcc3..576ce3c93487 100644
--- a/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd
+++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/messenger/preferences/advanced.dtd
@@ -9,7 +9,7 @@
 <!ENTITY itemCertificates.label  "Certificaten">
 
 <!-- General Settings -->
-<!ENTITY enableGlodaSearch.label       "Globaal zoeken en indexer activeren">
+<!ENTITY enableGlodaSearch.label       "Globaal zoeken en indexeren activeren">
 <!ENTITY enableGlodaSearch.accesskey   "G">
 <!ENTITY dateTimeFormatting.label      "Datum- en tijdopmaak">
 <!ENTITY languageSelector.label        "Taal">
@@ -58,7 +58,7 @@
   Strings from aboutDialog.dtd are displayed in this section of the preferences.
   Please check for possible accesskey conflicts.
 -->
-<!ENTITY updateApp2.label                 "&brandShortName;-updates">
+<!ENTITY updateApp2.label                "&brandShortName;-updates">
 <!-- LOCALIZATION NOTE (updateApp.version.*): updateApp.version.pre is
   followed by a version number, keep the trailing space or replace it with
   a different character as needed. updateApp.version.post is displayed after
@@ -118,10 +118,11 @@
 <!ENTITY enableOCSP.label                "OCSP-responderservers vragen om de huidige geldigheid van certificaten te bevestigen">
 <!ENTITY enableOCSP.accesskey            "v">
 
-<!ENTITY manageCertificates.label       "Certificaten beheren">
-<!ENTITY manageCertificates.accesskey   "C">
-<!ENTITY viewSecurityDevices.label      "Beveiligingsapparaten">
-<!ENTITY viewSecurityDevices.accesskey  "B">
+<!ENTITY manageCertificates.label "Certificaten beheren">
+<!ENTITY manageCertificates.accesskey "C">
+<!ENTITY viewSecurityDevices.label "Beveiligingsapparaten">
+<!ENTITY viewSecurityDevices.accesskey "B">
+
 <!ENTITY manageCertificates2.label "Certificaten beheren…">
 <!ENTITY manageCertificates2.accesskey "C">
 <!ENTITY viewSecurityDevices2.label "Beveiligingsapparaten…">
diff --git a/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties b/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties
index 1b54ccf221cf..b498e0eb4638 100644
--- a/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties
+++ b/thunderbird-l10n/nl/chrome/nl/locale/nl/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Toegang tot opslag automatisch verlee
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Toegang tot opslag automatisch verleend voor tracker ‘%2$S’ op ‘%1$S’.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Toegang tot opslag automatisch verleend voor isolatie van rechtstreekse cookie ‘%2$S’ op ‘%1$S’.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie ‘%1$S’ is afgewezen omdat het het attribuut ‘sameSite=none’ bevat, maar het attribuut ‘secure’ ontbreekt.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/nl/localization/nl/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/nl/localization/nl/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..85a39f54f160
--- /dev/null
+++ b/thunderbird-l10n/nl/localization/nl/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Omleiding agenda-URI
+calendar-uri-redirect-description =
+    De server leidt de URI voor de agenda ‘{ $calendarName }’ om.
+    Deze omleiding accepteren en de nieuwe URI voor deze agenda gebruiken?
+calendar-uri-redirect-original-uri-label = Huidige URI:
+calendar-uri-redirect-target-uri-label = Omleiden naar nieuwe URI:
diff --git a/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl b/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl
index 76ff04c46908..0f0070723f61 100644
--- a/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/nl/localization/nl/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Welkom bij { -brand-full-name }
+account-settings = Accountinstellingen
+#   $accounts (Number) - the number of configured accounts
 setup-title = Kies wat u wilt instellen
 about-title = Over { -brand-full-name }
 resources-title = Bronnen
@@ -40,3 +42,10 @@ explore-link = Functies verkennen
 support-link = Ondersteuning
 involved-link = Meewerken
 developer-link = Documentatie voor ontwikkelaars
+read = Berichten lezen
+compose = Nieuw bericht opstellen
+search = Berichten zoeken
+filter = Berichtenfilters beheren
+nntp-subscription = Nieuwsgroepabonnementen beheren
+rss-subscription = Feedabonnementen beheren
+e2e = End-to-end-versleuteling
diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl
index 7dec7e4b639f..0b15e7a96ddb 100644
--- a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Add-on installeren via bestand…
     .accesskey = s
 help-button = Add-on-ondersteuning
+sidebar-help-button-title =
+    .title = Add-on-ondersteuning
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name }-opties
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Hulpmiddelen voor alle add-ons
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name }-opties
+           *[other] { -brand-short-name }-voorkeuren
+        }
 show-unsigned-extensions-button =
     .label = Sommige extensies konden niet worden geverifieerd
 show-all-extensions-button =
@@ -177,13 +185,29 @@ extensions-view-available-updates =
     .name = Beschikbare updates
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Aanbevelingen
+addon-category-discover-title =
+    .title = Aanbevelingen
 addon-category-extension = Extensies
+addon-category-extension-title =
+    .title = Extensies
 addon-category-theme = Thema’s
+addon-category-theme-title =
+    .title = Thema’s
 addon-category-plugin = Plug-ins
+addon-category-plugin-title =
+    .title = Plug-ins
 addon-category-dictionary = Woordenboeken
+addon-category-dictionary-title =
+    .title = Woordenboeken
 addon-category-locale = Talen
+addon-category-locale-title =
+    .title = Talen
 addon-category-available-updates = Beschikbare updates
+addon-category-available-updates-title =
+    .title = Beschikbare updates
 addon-category-recent-updates = Recente updates
+addon-category-recent-updates-title =
+    .title = Recente updates
 
 ## These are global warnings
 
@@ -296,6 +320,7 @@ shortcuts-no-commands = De volgende extensies hebben geen sneltoetsen:
 shortcuts-input =
     .placeholder = Typ een sneltoets
 shortcuts-browserAction = Extensie activeren
+shortcuts-browserAction2 = Werkbalkknop activeren
 shortcuts-pageAction = Pagina-actie activeren
 shortcuts-sidebarAction = De zijbalk in-/uitschakelen
 shortcuts-modifier-mac = Druk ook op Ctrl, Alt of ⌘
@@ -320,6 +345,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Minder tonen
 go-back-button =
     .tooltiptext = Teruggaan
+header-back-button =
+    .title = Terug
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl
index 9292e153c375..e3246382dc0f 100644
--- a/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/nl/localization/nl/toolkit/about/aboutSupport.ftl
@@ -290,6 +290,11 @@ sandbox-proc-type-content = inhoud
 sandbox-proc-type-file = bestandsinhoud
 sandbox-proc-type-media-plugin = mediaplug-in
 sandbox-proc-type-data-decoder = gegevensdecoder
+startup-cache-title = Opstartbuffer
+startup-cache-disk-cache-path = Pad naar schijfbuffer
+startup-cache-ignore-disk-cache = Schijfbuffer negeren
+startup-cache-found-disk-cache-on-init = Schijfbuffer bij Init gevonden
+startup-cache-wrote-to-disk-cache = Naar schijfbuffer geschreven
 launcher-process-status-0 = Ingeschakeld
 launcher-process-status-1 = Uitgeschakeld vanwege fout
 launcher-process-status-2 = Geforceerd uitgeschakeld
@@ -313,6 +318,7 @@ touch-enabled = aanraakinvoer ingeschakeld
 drag-enabled = slepen via scrollbalk ingeschakeld
 keyboard-enabled = toetsenbord ingeschakeld
 autoscroll-enabled = automatisch scrollen ingeschakeld
+zooming-enabled = soepele knijp-zoom ingeschakeld
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl
index 7faec01ee268..6e79189400e5 100644
--- a/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/nl/localization/nl/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (keten)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Deze extensie is als kritiek gemarkeerd, wat betekent dat clients het certificaat moeten weigeren als ze het niet begrijpen.
+certificate-viewer-export = Exporteren
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Uw certificaten
+certificate-viewer-tab-people = Personen
+certificate-viewer-tab-servers = Servers
+certificate-viewer-tab-ca = Organisaties
+certificate-viewer-tab-unkonwn = Onbekend
diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl
index e53571d059c4..355a0361c869 100644
--- a/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/nl/localization/nl/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Geïsoleerde webinhoud
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/nl/localization/nl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/nl/localization/nl/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..1b47a37851bd
--- /dev/null
+++ b/thunderbird-l10n/nl/localization/nl/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = U hebt een oudere versie van { -brand-product-name } gestart
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Nieuw profiel aanmaken
+profiledowngrade-sync = Het gebruik van een oudere versie van { -brand-product-name } kan bladwijzers en navigatiegeschiedenis die al in een bestaand { -brand-product-name }-profiel is opgeslagen beschadigen. Maak een nieuw profiel aan voor deze installatie van { -brand-short-name } om uw informatie te beschermen. U kunt zich altijd aanmelden met een { -fxaccount-brand-name } om uw bladwijzers en navigatiegeschiedenis tussen profielen te synchroniseren.
+profiledowngrade-nosync = Het gebruik van een oudere versie van { -brand-product-name } kan bladwijzers en navigatiegeschiedenis die al in een bestaand { -brand-product-name }-profiel is opgeslagen beschadigen. Maak een nieuw profiel aan voor deze installatie van { -brand-short-name } om uw informatie te beschermen.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Afsluiten
+           *[other] Afsluiten
+        }
diff --git a/thunderbird-l10n/nl/manifest.json b/thunderbird-l10n/nl/manifest.json
index 96ea7de222a2..f45fe4c9f111 100644
--- a/thunderbird-l10n/nl/manifest.json
+++ b/thunderbird-l10n/nl/manifest.json
@@ -1,57 +1,57 @@
 {
-  "name": "Nederlands (NL) Language Pack",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
   "langpack_id": "nl",
-  "author": "mozilla.org (contributors: Gert-Paul van der Beek, Tim Maks van den Broek, Onno Ekker, Laurens Holst, Ton Kensen, Anne van Kesteren, Hendrik Maryns, Martijn Ras, leden MozBrowser-forum)",
   "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
+  "author": "mozilla.org (contributors: Gert-Paul van der Beek, Tim Maks van den Broek, Onno Ekker, Laurens Holst, Ton Kensen, Anne van Kesteren, Hendrik Maryns, Martijn Ras, leden MozBrowser-forum)",
+  "applications": {
+    "gecko": {
+      "id": "langpack-nl@thunderbird.mozilla.org",
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0"
+    }
+  },
+  "name": "Nederlands (NL) Language Pack",
   "description": "Language pack for Thunderbird for nl",
   "languages": {
     "nl": {
+      "version": "20200416071503",
       "chrome_resources": {
         "messenger-smime": "chrome/nl/locale/nl/messenger-smime/",
-        "lightning": "chrome/nl/locale/nl/lightning/",
-        "mozapps": "chrome/nl/locale/nl/mozapps/",
-        "pluginproblem": "chrome/nl/locale/nl/pluginproblem/",
-        "devtools": "chrome/nl/locale/nl/devtools/client/",
         "autoconfig": "chrome/nl/locale/nl/autoconfig/",
-        "passwordmgr": "chrome/nl/locale/nl/passwordmgr/",
-        "places": "chrome/nl/locale/nl/places/",
-        "messenger": "chrome/nl/locale/nl/messenger/",
-        "devtools-startup": "chrome/nl/locale/nl/devtools/startup/",
-        "mozldap": "chrome/nl/locale/nl/mozldap/",
-        "alerts": "chrome/nl/locale/nl/alerts/",
-        "branding": "chrome/nl/locale/nl/branding/",
-        "calendar": "chrome/nl/locale/nl/calendar/",
+        "messenger-mapi": "chrome/nl/locale/nl/messenger-mapi/",
+        "communicator": "chrome/nl/locale/nl/communicator/",
         "global-platform": {
+          "android": "chrome/nl/locale/nl/global-platform/unix/",
           "linux": "chrome/nl/locale/nl/global-platform/unix/",
           "win": "chrome/nl/locale/nl/global-platform/win/",
-          "macosx": "chrome/nl/locale/nl/global-platform/mac/",
-          "android": "chrome/nl/locale/nl/global-platform/unix/"
+          "macosx": "chrome/nl/locale/nl/global-platform/mac/"
         },
-        "pipnss": "chrome/nl/locale/nl/pipnss/",
-        "chat": "chrome/nl/locale/nl/chat/",
         "necko": "chrome/nl/locale/nl/necko/",
-        "messenger-region": "chrome/nl/locale/nl/messenger-region/",
-        "messenger-mapi": "chrome/nl/locale/nl/messenger-mapi/",
+        "branding": "chrome/nl/locale/nl/branding/",
+        "places": "chrome/nl/locale/nl/places/",
+        "devtools": "chrome/nl/locale/nl/devtools/client/",
+        "alerts": "chrome/nl/locale/nl/alerts/",
+        "passwordmgr": "chrome/nl/locale/nl/passwordmgr/",
+        "messenger": "chrome/nl/locale/nl/messenger/",
         "pippki": "chrome/nl/locale/nl/pippki/",
-        "devtools-shared": "chrome/nl/locale/nl/devtools/shared/",
-        "global": "chrome/nl/locale/nl/global/",
+        "lightning": "chrome/nl/locale/nl/lightning/",
         "messenger-newsblog": "chrome/nl/locale/nl/messenger-newsblog/",
-        "communicator": "chrome/nl/locale/nl/communicator/"
-      },
-      "version": "20200405083605"
-    }
-  },
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-nl@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
-    }
-  },
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
+        "pipnss": "chrome/nl/locale/nl/pipnss/",
+        "global": "chrome/nl/locale/nl/global/",
+        "mozapps": "chrome/nl/locale/nl/mozapps/",
+        "pluginproblem": "chrome/nl/locale/nl/pluginproblem/",
+        "devtools-shared": "chrome/nl/locale/nl/devtools/shared/",
+        "messenger-region": "chrome/nl/locale/nl/messenger-region/",
+        "mozldap": "chrome/nl/locale/nl/mozldap/",
+        "devtools-startup": "chrome/nl/locale/nl/devtools/startup/",
+        "chat": "chrome/nl/locale/nl/chat/",
+        "calendar": "chrome/nl/locale/nl/calendar/"
+      }
     }
-  },
-  "version": "76.0buildid20200407173003"
+  }
 }
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd
index 419b52d6dd85..d8440af89544 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/calendar.dtd
@@ -10,6 +10,7 @@
 <!ENTITY calendar.newtask.button.tooltip          "Lag ny oppgåve" >
 
 <!ENTITY calendar.unifinder.todoitems.label       "Oppgåver" >
+
 <!ENTITY calendar.unifinder.showcompletedtodos.label "Vis fullførte oppgåver">
 
 <!ENTITY calendar.today.button.label          "I dag">
@@ -364,6 +365,7 @@
 <!ENTITY calendarproperties.firealarms.label               "Vis alarmar">
 <!ENTITY calendarproperties.cache3.label                   "Fråkopla støtte">
 <!ENTITY calendarproperties.enabled.label                  "Slå på denne kalenderen">
+<!ENTITY calendarproperties.enabled2.label                 "Aktiver denne kalenderen">
 <!ENTITY calendarproperties.forceDisabled.label            "Fann ikkje tilbydaren av denne kalenderen. Dette skjer ofte om du har slått av eller avinstallert enkelte utvidingar.">
 <!ENTITY calendarproperties.unsubscribe.label              "Stopp abonnement">
 <!ENTITY calendarproperties.unsubscribe.accesskey          "S">
@@ -407,5 +409,3 @@
 <!ENTITY calendar.extract.task.button          "Legg til som oppgåve">
 <!ENTITY calendar.extract.event.button.tooltip "Hent ut kalenderinfo frå meldinga og legg til i kalenderen din som ei hending">
 <!ENTITY calendar.extract.task.button.tooltip  "Hent ut kalenderinfo frå meldinga og legg til i kalenderen din som ei oppgåve">
-
-<!ENTITY calendarproperties.enabled2.label                 "Enable This Calendar">
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd
index 5d802e2ee375..14b8f7428fe4 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/calendar/preferences/preferences.dtd
@@ -8,6 +8,4 @@
 <!ENTITY  paneViews.title         "Utsjånad">
 <!ENTITY  panelHeader.title       "Kalender">
 <!ENTITY  panelReminder.title     "Påminningar">
-<!ENTITY  panelCatecory.title     "Kategoriar">
-
-<!ENTITY  panelCategory.title     "Categories">
+<!ENTITY  panelCategory.title     "Kategoriar">
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties
index 47a0200a2fd5..851048c11ba1 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=No associated rule
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties
index 808ead6b29db..4ccbcce7fabd 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      skiljelinje
 tabPanel     =      fanepanel
 # The roleDescription for the html:mark element
 highlight = markere
-
 # The roleDescription for the details element
-details = details
+details = detaljar
 # The roleDescription for the summary element
-summary = summary
+summary = samandrag
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties
index b7051be2eee6..0ff128116be9 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/css.properties
@@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Berre ei repetering(auto-fill, …) er
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Berre ei repetering(auto-fill, …) eller repeterande(auto-fit, …) er tillate i ei sporliste.
 PEMoreThanOneGridRepeatTrackSize=Berre ein sporstorleik er tillate inne i repeterande(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=@import-reglar er enno ikkje gyldige i konstruerte stilsett.
+
 TooLargeDashedRadius=Kantradius er for stor for ‘stipla’ stil (grensa er 100000 px). Renderar som fyllt.
 TooLargeDottedRadius=Grensradius er for stor for ‘prikka’ stil (grensa er 100000 px). Renderar som fyllt.
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties
index 1dfefc388d8a..131f1d6693af 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/dom/dom.properties
@@ -424,6 +424,5 @@ MathML_DeprecatedStyleAttributeWarning=MathML-attributene «background», «colo
 MathML_DeprecatedXLinkAttributeWarning=XLink-attributtene «href», «type», «show» og «actuate» er forelda på MathML-element og vil bli fjerna i framtida.
 WebShareAPI_Failed=Mislykka delingsoperasjon.
 WebShareAPI_Aborted=Avbroten delingsoperasjon.
-
 # LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
-UnknownProtocolNavigationPrevented=Prevented navigation to “%1$S” due to an unknown protocol.
+UnknownProtocolNavigationPrevented=Hindra navigering til «%1$S» på grunn av ein ukjend protokoll.
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties
index 86e474aedd29..33c7d6d59a01 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/security/security.properties
@@ -147,13 +147,16 @@ XFODeny = Lasting nekta av X-Frame-Options: «%1$S» fra «%2$S», nettstaden ti
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Lasting nekta av X-Frame-Options: «%1$S» frå «%2$S», nettstaden tillèt ikkje kryss-opphav innramming frå «%3$S».
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Ein ugyldig X-Frame-Options-header vart funnen under innlesing av «%1$S»: «%2$S» er ikkje eit gyldig direktiv.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Lasting av «%2$S» i ei ramme vert nekta av «X-Frame-Options»-direktivet sett til «%1$S».
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Oppgraderer usikker førespurnad «%1$S» til å bruke «%2$S».
 # LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgrade = Førespurnad for «%1$S» vart ikkje oppgradert fordi han hadde NoUpgrade-flagget.
-
-# LOCALIZATION NOTE: %1$S is the URL of request.
-HTTPSOnlyNoUpgradeException = Not upgrading insecure request “%1$S” because it is exempt.
+HTTPSOnlyNoUpgradeException = Oppgraderer ikkje utrygg førespurnad «%1$S» fordi han er unntatt.
 # LOCALIZATION NOTE: %1$S is the URL of the failed request; %2$S is an error-code.
-HTTPSOnlyFailedRequest = Upgrading insecure request “%1$S” failed. (%2$S)
+HTTPSOnlyFailedRequest = Oppgradering av utrygg førespurnad «%1$S» mislyktast. (%2$S)
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd
index 7e0c2895279d..c5dd4023963a 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/global/videocontrols.dtd
@@ -38,7 +38,7 @@ the Picture-in-Picture video toggle button when the mouse is hovering it. -->
 <!ENTITY error.noSource2 "Ingen video med eit støtta format eller MIME-type funne.">
 <!ENTITY error.generic "Videoavspeling avbroten på grunn av ukjend feil.">
 
-<!ENTITY status.pictureInPicture "Denne videoen vert spela av i Picture-in-Picture-modus.">
+<!ENTITY status.pictureInPicture "Denne videoen vert spela av i bilde-i-bilde modus.">
 
 <!-- LOCALIZATION NOTE (scrubberScale.nameFormat): the #1 string is the current
 media position, and the #2 string is the total duration. For example, when at
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd
index 0f3a416e7cee..89e36999e103 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.dtd
@@ -23,6 +23,8 @@
 <!ENTITY lightning.menupopup.open.accesskey           "O">
 <!ENTITY lightning.menupopup.open.message.label       "Lagra melding…">
 <!ENTITY lightning.menupopup.open.message.accesskey   "L">
+
+<!-- Open menu popup in File menu -->
 <!ENTITY lightning.menupopup.open.calendar.label      "Kalenderfil…">
 <!ENTITY lightning.menupopup.open.calendar.accesskey  "K">
 
@@ -67,6 +69,9 @@
 <!ENTITY lightning.imipbar.btnDelete.tooltiptext                            "Slett frå kalenderen">
 <!ENTITY lightning.imipbar.btnDetails.label                                 "Detaljar…">
 <!ENTITY lightning.imipbar.btnDetails.tooltiptext                           "Vis detaljar">
+<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label                        "Ikkje vis meg desse meldingane">
+<!ENTITY lightning.imipbar.btnGoToCalendar.label                            "Kalender">
+<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext                      "Gå til kalenderfana">
 <!ENTITY lightning.imipbar.btnMore.label                                    "Meir">
 <!ENTITY lightning.imipbar.btnMore.tooltiptext                              "Trykk for å vise fleire val">
 <!ENTITY lightning.imipbar.btnReconfirm2.label                              "Stadfest på nytt">
@@ -109,7 +114,3 @@
 <!ENTITY todaypane.showTodayPane.label "Vis i dag-ruta">
 <!ENTITY todaypane.showTodayPane.accesskey "a">
 <!ENTITY todaypane.statusButton.label "I dag-ruta">
-
-<!ENTITY lightning.imipbar.btnDoNotShowImipBar.label                        "Don't show me these messages">
-<!ENTITY lightning.imipbar.btnGoToCalendar.label                            "Calendar">
-<!ENTITY lightning.imipbar.btnGoToCalendar.tooltiptext                      "Go to the calendar tab">
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties
index 6187798a7ff2..842ffebf1956 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/lightning/lightning.properties
@@ -142,6 +142,7 @@ imipBarReplyToNotExistingItem=Denne meldinga inneheld eit svar som viser til ei
 imipBarReplyToRecentlyRemovedItem=Denne meldinga inneheld eit svar som viser til ei hending som vart fjerna frå kalenderen den %1$S.
 imipBarUnsupportedText=Denne meldinga inneheld ei hending som denne versjonen av Lightning ikkje kan lese.
 imipBarProcessingFailed=Klarte ikkje å handsame meldinga. Status: %1$S.
+imipBarCalendarDeactivated=Denne meldinga inneheld informasjon om hendingar. Aktiver ein kalender for å handtere han.
 imipBarNotWritable=Ingen skrivbare kalendrar er konfigurerte for invitasjonar. Kontroller kalenderinnstillingane.
 imipSendMail.title=Informer deltakarar på e-post
 imipSendMail.text=Vil du sende ut kunngjeringar på e-post no?
@@ -197,5 +198,3 @@ binaryComponentTitle=Feil %1$S-versjon
 
 # LOCALIZATION NOTE(noIdentitySelectedNotification):
 noIdentitySelectedNotification=Viss du vil bruka denne kalenderen for å lagra innbydingar til eller frå andre personar, skal du tildela ein e-postidentitet nedanfor.
-
-imipBarCalendarDeactivated=This message contains event information. Enable a calendar to handle it.
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd
index 200459c04f53..b05abb949040 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger-smime/msgCompSMIMEOverlay.dtd
@@ -5,11 +5,23 @@
 <!--LOCALIZATION NOTE msgCompSMIMEOverlay.dtd UI for s/mime hooks in message composition -->
 
 <!ENTITY menu_securityEncryptRequire.label "Krypter denne meldinga">
+
+
+<!-- not yet used
+<!ENTITY menu_securityEncryptOptional.label "Allow Encryption">
+<!ENTITY menu_securityEncryptOptional.accesskey "w">
+-->
+
 <!ENTITY menu_securityEncryptRequire.accesskey "K">
 
 <!ENTITY menu_securitySign.label "Signer denne meldinga digitalt">
 <!ENTITY menu_securitySign.accesskey "S">
 
+
+
+<!ENTITY menu_techPGP.label "OpenPGP">
+<!ENTITY menu_techPGP.accesskey "O">
+
 <!ENTITY menu_securityStatus.label "Vis tryggingsinfo">
 <!ENTITY menu_securityStatus.accesskey "V">
 
@@ -26,7 +38,5 @@
 <!ENTITY menu_securityAttachMyKey.accesskey "A">
 <!ENTITY menu_securityTech.label "Encryption Technology">
 <!ENTITY menu_securityTech.accesskey "T">
-<!ENTITY menu_techPGP.label "OpenPGP">
-<!ENTITY menu_techPGP.accesskey "O">
 <!ENTITY menu_techSMIME.label "S/MIME">
 <!ENTITY menu_techSMIME.accesskey "S">
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd
index 9ec4fe7c1688..e27a930a940a 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/am-smime.dtd
@@ -12,6 +12,10 @@
 <!ENTITY alwaysEncryptMessage.label "Påkravd (alle mottakarar må ha sertifikat)">
 <!ENTITY alwaysEncryptMessage.accesskey "P">
 <!ENTITY encryptionCert.message "Bruk dette sertifikatet til å kryptera og dekryptera meldingar sendt til deg:">
+
+
+
+
 <!ENTITY digitalSign.certificate.button "Vel…">
 <!ENTITY digitalSign.certificate.accesskey "V">
 <!ENTITY digitalSign.certificate_clear.button "Tøm">
@@ -31,11 +35,24 @@
 <!ENTITY manageDevices.label "Tryggingseiningar">
 <!ENTITY manageDevices.accesskey "T">
 
+
+
+
+
+<!ENTITY technologyOpenPGP.label "Føretrekk OpenPGP">
+
+<!ENTITY openpgpKeys.label "OpenPGP">
+<!ENTITY manageKeys.label "Handter OpenPGP-nøklar">
+
 <!-- Strings for the cert picker dialog -->
 <!ENTITY certPicker.title "Vel sertifikat">
 <!ENTITY certPicker.info  "Sertifikat:">
 <!ENTITY certPicker.detailsLabel "Detaljar om valt sertifikat:">
 
+<!ENTITY openpgpKey.message "Personleg nøkkel for kryptering og digital signering:">
+<!ENTITY openpgpKey.button "Still inn personleg nøkkel…">
+<!ENTITY openpgpKey.accesskey "o">
+
 <!ENTITY e2eTitle.label "End-To-End Encryption">
 <!ENTITY e2eIntro.description "To send encrypted or digitally signed messages, you need to configure an encryption technology, either OpenPGP or S/MIME.">
 <!ENTITY e2eLearnMore.label "Learn more">
@@ -58,10 +75,4 @@
 <!ENTITY manageDevices2.label "S/MIME Security Devices">
 <!ENTITY manageDevices2.accesskey "y">
 <!ENTITY technologySMIME.label "Prefer S/MIME">
-<!ENTITY technologyOpenPGP.label "Prefer OpenPGP">
-<!ENTITY openpgpKeys.label "OpenPGP">
-<!ENTITY manageKeys.label "Manage OpenPGP Keys">
 <!ENTITY manageKeys.accesskey "K">
-<!ENTITY openpgpKey.message "Personal key for encryption and digital signing:">
-<!ENTITY openpgpKey.button "Set Personal Key…">
-<!ENTITY openpgpKey.accesskey "o">
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties
index be3b67454ee0..90a64fd0e6b9 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/messenger/messengercompose/composeMsgs.properties
@@ -362,6 +362,10 @@ smtpEnterPasswordPrompt=Skriv inn passordet ditt for %S:
 smtpEnterPasswordPromptWithUsername=Skriv inn passordet ditt for %2$S på %1$S:
 smtpEnterPasswordPromptTitle=SMTP tenaren krev passord
 
+## LOCALIZATION NOTE(smtpEnterPasswordPromptTitleWithHostname): Do not translate the
+## word %1$S. Place the word %1$S where the server host name should appear.
+smtpEnterPasswordPromptTitleWithHostname=Passord er påkravd for utgåande (SMTP) server %1$S
+
 # LOCALIZATION NOTE (removeAttachmentMsgs): Semi-colon list of plural forms.
 # See: https://developer.mozilla.org/en/Localization_and_Plurals
 removeAttachmentMsgs=Fjern vedlegg;Fjern vedlegg
@@ -481,19 +485,14 @@ blockedContentPrefAccesskeyUnix=n
 ## LOCALIZATION NOTE(identityWarning): %S will be replaced with the identity name.
 identityWarning=Ein unik identitet som passar med frå-adressen vart ikkje funnen. Meldinga vert sendt ved hjelp av gjeldande frå-felt og innstillingar frå identiteten %S.
 
-## Recipient pills fileds.
-## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name.
-confirmRemoveRecipientRowTitle=Fjern %S
-## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name.
-confirmRemoveRecipientRowBody=Alle adressene i %S-feltet blir fjerna. Vil du fortsetje?
+## Recipient pills fields.
+## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle2): %S will be replaced with the field name.
+## LOCALIZATION NOTE(confirmRemoveRecipientRowBody2): %S will be replaced with the field name.
 
 ## LOCALIZATION NOTE headersSpaceStyle is for aligning label of a newly create recipient row.
 ## It should be larger than the largest Header label and identical to &headersSpace2.style;
 headersSpaceStyle=width: 8em
 
-## LOCALIZATION NOTE(smtpEnterPasswordPromptTitleWithHostname): Do not translate the
-## word %1$S. Place the word %1$S where the server host name should appear.
-smtpEnterPasswordPromptTitleWithHostname=Password Required for Outgoing (SMTP) Server %1$S
 ## Recipient pills fields.
 ## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle2): %S will be replaced with the field name.
 confirmRemoveRecipientRowTitle2=Remove %S Addresses
diff --git a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties
index c317169421bd..92fad4620130 100644
--- a/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties
+++ b/thunderbird-l10n/nn-NO/chrome/nn-NO/locale/nn-NO/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Lagringstilgang vart automatisk tilde
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Lagringstilgang vart automatisk tildelt for sporfølgjaren "%2$S" på "%1$S".
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Lagringstilgang vart automatisk tildelt for førstepartsisolasjon «%2$S» på «%1$S».
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Infokapsel «%1$S» vart avvist fordi han har attributten «sameSite=none», men manglar «secure»-attributten.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
@@ -67,8 +70,7 @@ CookieLaxForced=Infokapsel «%1$S» har «sameSite»-policy sett til «lax» for
 CookieLaxForcedForBeta=Infokapsel «%1$S» har ikkje rett «sameSite» attributtverdi. Snart vil infokapslar utan attributten «sameSite» eller med ein ugyldig verdi bli behandla som «lax». Dette betyr at infokapselen ikkje lenger vil bli sendt i tredjeparts samanhengar. Dersom applikasjonen din er avhengig av at denne infokapselen er tilgjengeleg i slike samanhengar, kan du leggje til attributtet «sameSite=none». Les %2$S for å lære meir om «sameSite»-atributten
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid=Ugyldig «sameSite»-verdi for infokapsel «%1$S». Dei støtta verdiane er: «lax», «strict» og «none».
-
 # LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
+CookieOversize=Infokapsel «%1$S» er ugyldig fordi størrelsen er for stor. Maks størrelse er %2$S B.
 # LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
+CookiePathOversize=Infokapsel «%1$S» er ugyldig fordi filstistørrelsen er for stor. Maks størrelse er %2$S B.
diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..32056f5939f5
--- /dev/null
+++ b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Omdirigering av URI for kalender
+calendar-uri-redirect-description =
+    Serveren omdirigerer URI for kalenderen «{ $calendarName }».
+    Godta omdirigering og begynne å bruke den nye URI-en for denne kalenderen?
+calendar-uri-redirect-original-uri-label = Gjeldande URI:
+calendar-uri-redirect-target-uri-label = Omdirigerer til ny URI:
diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-widgets.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-widgets.ftl
new file mode 100644
index 000000000000..7b63121d7529
--- /dev/null
+++ b/thunderbird-l10n/nn-NO/localization/nn-NO/calendar/calendar-widgets.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-deactivated-notification-events = Alle kalendrar er akkurat noi deaktiverte. Aktiver ein eksisterande kalender, eller legg til ein ny for å opprette og redigere hendingar.
+calendar-deactivated-notification-tasks = Alle kalendrar er akkurat no deaktiverte. Aktiver ein eksisterande kalender, eller legg til ein ny for å opprette og redigere oppgåver.
diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl
index 9bbc8f63f452..26903bff850b 100644
--- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Installer tillegg frå ei fil…
     .accesskey = I
 help-button = Brukarstøtte for tillegg
+sidebar-help-button-title =
+    .title = Brukarstøtte for tillegg
 preferences =
     { PLATFORM() ->
         [windows] Innstillingar for { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Verktøy for alle tillegg
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Innstillingar for { -brand-short-name }
+           *[other] Innstillingar for { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Nokre utvidingar kunne ikkje stadfestast
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Tilgjengelege oppdateringar
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Tilrådingar
+addon-category-discover-title =
+    .title = Tilrådingar
 addon-category-extension = Utvidingar
+addon-category-extension-title =
+    .title = Utvidingar
 addon-category-theme = Tema
+addon-category-theme-title =
+    .title = Tema
 addon-category-plugin = Programtillegg
+addon-category-plugin-title =
+    .title = Programtillegg
 addon-category-dictionary = Ordbøker
+addon-category-dictionary-title =
+    .title = Ordbøker
 addon-category-locale = Språk
+addon-category-locale-title =
+    .title = Språk
 addon-category-available-updates = Tilgjengelege oppdateringar
+addon-category-available-updates-title =
+    .title = Tilgjengelege oppdateringar
 addon-category-recent-updates = Nyleg oppdatert
+addon-category-recent-updates-title =
+    .title = Nyleg oppdatert
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Følgjande utvidingar har ikkje snarvegar:
 shortcuts-input =
     .placeholder = Skriv inn ein snarveg
 shortcuts-browserAction = Aktiver utviding
+shortcuts-browserAction2 = Aktiver verktøylinjeknapp
 shortcuts-pageAction = Aktiver sidehandling
 shortcuts-sidebarAction = Vis/skjul sidepanelet
 shortcuts-modifier-mac = Inkluder Ctrl, Alt eller ⌘
@@ -311,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Vis mindre
 go-back-button =
     .tooltiptext = Gå tilbake
+header-back-button =
+    .title = Gå tilbake
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl
index 418414366317..032c5c3f46ae 100644
--- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = innhald
 sandbox-proc-type-file = filinnhald
 sandbox-proc-type-media-plugin = programtillegg for media
 sandbox-proc-type-data-decoder = datadekodar
+startup-cache-title = Oppstart-snøgglager
+startup-cache-disk-cache-path = Sti for disk-snøgglager
+startup-cache-ignore-disk-cache = Ignorer disk-snøgglager
+startup-cache-found-disk-cache-on-init = Fann disk-snøgglager på Init
+startup-cache-wrote-to-disk-cache = Skreiv til disk-snøgglager
 launcher-process-status-0 = Påslått
 launcher-process-status-1 = Deaktivert på grunn av feil
 launcher-process-status-2 = Tvungen deaktivering
@@ -310,6 +315,7 @@ touch-enabled = tøtsj-input slått på
 drag-enabled = drag og slepp av rullelinje påslått
 keyboard-enabled = tastatur aktivert
 autoscroll-enabled = autorulling slått på
+zooming-enabled = glatt pinch-zoom aktivert
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl
index 9b71db97712a..26892ee48b41 100644
--- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Gruppe for nøkkelutveksling
 certificate-viewer-key-id = Nøkkel-ID
 certificate-viewer-key-size = Nøkkelstorleik
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Organisasjonsplassering
 certificate-viewer-locality = Stad
 certificate-viewer-location = Adresse
 certificate-viewer-logid = Logg-ID
@@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Denne utvidinga er merkt som kritisk, noko som tyder at klientar må avvise sertifikatet dersom dei ikkje forstår det.
+certificate-viewer-export = Eksporter
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Dine sertifikat
+certificate-viewer-tab-people = Personar
+certificate-viewer-tab-servers = Serverar
+certificate-viewer-tab-ca = Utskrivarar
+certificate-viewer-tab-unkonwn = Ukjent
diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl
index 91c02385e5d0..b8028def37e0 100644
--- a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Isolert nettinnhald
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..bfbf6990f00d
--- /dev/null
+++ b/thunderbird-l10n/nn-NO/localization/nn-NO/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Du har starta ein eldre versjon av { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Lag ein ny profil
+profiledowngrade-sync = Bruk av ein eldre versjon av { -brand-product-name } kan øydeleggje bokmerke og nettlesingshistorikk som allereie er lagra i ein eksisterande { -brand-product-name }-profil. For å beskytte informasjonen din, lag ein ny profil for denne installasjonen av { -brand-short-name }. Du kan logge på med ein { -fxaccount-brand-name } for å synkronisere bokmerke og nettlesarhistorikk mellom ulike profilar.
+profiledowngrade-nosync = Bruk av ein eldre versjon av { -brand-product-name } kan øydeleggje bokmerke og nettlesingshistorikk som allereie er lagra i ein eksisterande { -brand-product-name }-profil. For å beskytte informasjonen din, lag ein ny profil for denne installasjonen av { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Avslutt
+           *[other] Avslutt
+        }
diff --git a/thunderbird-l10n/nn-NO/manifest.json b/thunderbird-l10n/nn-NO/manifest.json
index 9a832049a705..e9cdc9dba6b9 100644
--- a/thunderbird-l10n/nn-NO/manifest.json
+++ b/thunderbird-l10n/nn-NO/manifest.json
@@ -1,57 +1,57 @@
 {
+  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
   "description": "Language pack for Thunderbird for nn-NO",
-  "name": "Norsk (nynorsk) Language Pack",
   "author": "firefox.no (contributors: Kurt-Rune Bergset, Eirik Ulltang Birkeland, Håvar Henriksen, Torstein Hønsi, Erik Klepsvik, Håvard Mork, Jan-Espen Pettersen, Tom Ottar Røw, Åsmund Skjæveland, Pascual Strømsnæs, Vebjørn Sture, Kristian Svanes, Bjørn I. Svindseth, Ronny Vårdal)",
-  "applications": {
-    "gecko": {
-      "id": "langpack-nn-NO@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "id": "langpack-nn-NO@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
+    }
+  },
   "languages": {
     "nn-NO": {
-      "version": "20200406121446",
+      "version": "20200420153332",
       "chrome_resources": {
-        "lightning": "chrome/nn-NO/locale/nn-NO/lightning/",
-        "devtools-startup": "chrome/nn-NO/locale/nn-NO/devtools/startup/",
-        "mozldap": "chrome/nn-NO/locale/nn-NO/mozldap/",
-        "branding": "chrome/nn-NO/locale/nn-NO/branding/",
-        "messenger": "chrome/nn-NO/locale/nn-NO/messenger/",
-        "messenger-region": "chrome/nn-NO/locale/nn-NO/messenger-region/",
-        "pipnss": "chrome/nn-NO/locale/nn-NO/pipnss/",
-        "global": "chrome/nn-NO/locale/nn-NO/global/",
-        "messenger-mapi": "chrome/nn-NO/locale/nn-NO/messenger-mapi/",
         "mozapps": "chrome/nn-NO/locale/nn-NO/mozapps/",
+        "devtools-shared": "chrome/nn-NO/locale/nn-NO/devtools/shared/",
         "communicator": "chrome/nn-NO/locale/nn-NO/communicator/",
-        "devtools": "chrome/nn-NO/locale/nn-NO/devtools/client/",
+        "chat": "chrome/nn-NO/locale/nn-NO/chat/",
+        "messenger-mapi": "chrome/nn-NO/locale/nn-NO/messenger-mapi/",
+        "pipnss": "chrome/nn-NO/locale/nn-NO/pipnss/",
+        "places": "chrome/nn-NO/locale/nn-NO/places/",
+        "lightning": "chrome/nn-NO/locale/nn-NO/lightning/",
         "alerts": "chrome/nn-NO/locale/nn-NO/alerts/",
-        "passwordmgr": "chrome/nn-NO/locale/nn-NO/passwordmgr/",
-        "devtools-shared": "chrome/nn-NO/locale/nn-NO/devtools/shared/",
+        "branding": "chrome/nn-NO/locale/nn-NO/branding/",
         "pluginproblem": "chrome/nn-NO/locale/nn-NO/pluginproblem/",
         "global-platform": {
-          "linux": "chrome/nn-NO/locale/nn-NO/global-platform/unix/",
-          "macosx": "chrome/nn-NO/locale/nn-NO/global-platform/mac/",
           "android": "chrome/nn-NO/locale/nn-NO/global-platform/unix/",
+          "macosx": "chrome/nn-NO/locale/nn-NO/global-platform/mac/",
+          "linux": "chrome/nn-NO/locale/nn-NO/global-platform/unix/",
           "win": "chrome/nn-NO/locale/nn-NO/global-platform/win/"
         },
-        "autoconfig": "chrome/nn-NO/locale/nn-NO/autoconfig/",
-        "messenger-newsblog": "chrome/nn-NO/locale/nn-NO/messenger-newsblog/",
-        "chat": "chrome/nn-NO/locale/nn-NO/chat/",
-        "calendar": "chrome/nn-NO/locale/nn-NO/calendar/",
-        "messenger-smime": "chrome/nn-NO/locale/nn-NO/messenger-smime/",
         "pippki": "chrome/nn-NO/locale/nn-NO/pippki/",
+        "passwordmgr": "chrome/nn-NO/locale/nn-NO/passwordmgr/",
         "necko": "chrome/nn-NO/locale/nn-NO/necko/",
-        "places": "chrome/nn-NO/locale/nn-NO/places/"
+        "devtools": "chrome/nn-NO/locale/nn-NO/devtools/client/",
+        "global": "chrome/nn-NO/locale/nn-NO/global/",
+        "messenger": "chrome/nn-NO/locale/nn-NO/messenger/",
+        "devtools-startup": "chrome/nn-NO/locale/nn-NO/devtools/startup/",
+        "messenger-smime": "chrome/nn-NO/locale/nn-NO/messenger-smime/",
+        "autoconfig": "chrome/nn-NO/locale/nn-NO/autoconfig/",
+        "calendar": "chrome/nn-NO/locale/nn-NO/calendar/",
+        "messenger-region": "chrome/nn-NO/locale/nn-NO/messenger-region/",
+        "messenger-newsblog": "chrome/nn-NO/locale/nn-NO/messenger-newsblog/",
+        "mozldap": "chrome/nn-NO/locale/nn-NO/mozldap/"
       }
     }
   },
-  "langpack_id": "nn-NO",
-  "version": "76.0buildid20200407173003"
+  "name": "Norsk (nynorsk) Language Pack",
+  "langpack_id": "nn-NO"
 }
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties
index 65df6e3868ab..9c0c3e39dc33 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Ten element ma przepełnienie, które można
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Brak powiązanej reguły
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Przytrzymaj Shift i kliknij, aby przejść do reguły
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties
index c5c12889680b..ff803579ed80 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/devtools/client/netmonitor.properties
@@ -767,7 +767,7 @@ netmonitor.ws.context.received.accesskey=O
 
 # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
 # on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Kontrola
+netmonitor.ws.context.controlFrames=Kontrolne
 
 # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
 # for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties
index e08e54f6212a..1c837f5c50e1 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Arkusz stylów %1$S został wczytany jako poprawny CSS pomimo teg
 
 PEUnexpEOF2=Niespodziewany koniec pliku podczas poszukiwania %1$S.
 PEParseRuleWSOnly=Do przetwarzania przekazano ciąg składający się wyłącznie ze znaków odstępu.
+
 PEDeclDropped=Deklaracja opuszczona.
 PEDeclSkipped=Przeskoczono do następnej deklaracji.
 PEUnknownProperty=Nieznana własność „%1$S”.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Tylko jedno wystąpienie „repeat(aut
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Tylko jedno wystąpienie „repeat(auto-fill, …)” oraz „repeat(auto-fit, …)” jest dozwolone na liście ścieżek.
 PEMoreThanOneGridRepeatTrackSize=Tylko jeden rozmiar ścieżki jest dozwolony wewnątrz „repeat(auto-fit/auto-fill, …)”.
 
+PEDisallowedImportRule=Reguły @import nie są jeszcze prawidłowe w zbudowanych arkuszach stylów.
+
 TooLargeDashedRadius=Promień obramowania jest zbyt duży dla stylu „dashed” (limit to 100000 px), wyświetlanie jako „solid”.
 TooLargeDottedRadius=Promień obramowania jest zbyt duży dla stylu „dotted” (limit to 100000 px), wyświetlanie jako „solid”.
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties
index 450e4c2e7d9d..9ec74fff52e7 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = X-Frame-Options odmówiło wczytania: „%1$S” z „%2$S”, witryn
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = X-Frame-Options odmówiło wczytania: „%1$S” z „%2$S”, witryna nie zezwala na ramki innego pochodzenia z „%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Podczas wczytywania „%2$S” znaleziono nieprawidłowy nagłówek X-Frame-Options: „%1$S” nie jest prawidłową dyrektywą.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Dyrektywa „X-Frame-Options” ustawiona na „%1$S” odmówiła wczytania „%2$S” w ramce.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Zmiana niezabezpieczonego żądania „%1$S” na „%2$S”.
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd
index 8eec18b0527d..a21f360a353d 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Wyszukaj wiadomości…">
 <!ENTITY searchMailCmd.accesskey "m">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Wyszukaj…">
+<!ENTITY glodaSearchCmd.accesskey "W">
 <!ENTITY searchAddressesCmd.label "Wyszukaj wizytówki…">
 <!ENTITY searchAddressesCmd.accesskey "a">
 
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties
index f90a6220abfd..75d2f244ed18 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/messengercompose/composeMsgs.properties
@@ -318,7 +318,7 @@ attachmentReminderMsg=Czy ta wiadomość nie powinna zawierać załączników?
 attachmentReminderKeywordsMsgs=Znaleziono słowo wskazujące na brakujący załącznik:;Znaleziono #1 słowa wskazujące na brakujący załącznik:;Znaleziono #1 słów wskazujących na brakujący załącznik:
 attachmentReminderOptionsMsg=Przypomnienia o brakujących załącznikach mogą zostać skonfigurowane w ustawieniach
 attachmentReminderYesIForgot=Faktycznie!
-attachmentReminderFalseAlarm=Nie, wyślij teraz
+attachmentReminderFalseAlarm=Nie, wyślij bez załączników
 
 # Strings used by the Filelink offer notification bar.
 learnMore.label=Więcej informacji…
@@ -485,12 +485,6 @@ blockedContentPrefAccesskeyUnix=P
 ## LOCALIZATION NOTE(identityWarning): %S will be replaced with the identity name.
 identityWarning=Nie odnaleziono unikalnej tożsamości pasującej do adresu nadawcy. Wiadomość zostanie wysłana za pomocą obecnego pola nadawcy i ustawień z tożsamości „%S”.
 
-## Recipient pills fileds.
-## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name.
-confirmRemoveRecipientRowTitle=Usuwanie pola „%S”
-## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle): %S will be replaced with the field name.
-confirmRemoveRecipientRowBody=Wszystkie adresy w polu „%S” zostaną usunięte. Czy chcesz kontynuować?
-
 ## Recipient pills fields.
 ## LOCALIZATION NOTE(confirmRemoveRecipientRowTitle2): %S will be replaced with the field name.
 confirmRemoveRecipientRowTitle2=Usuwanie adresów z pola „%S”
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties
index df351be1dfca..9dc2414a17e3 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/messenger/pgpmime.properties
@@ -2,4 +2,13 @@
 # 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/.
 
-pgpMimeNeedsAddon=Wiadomość zaszyfrowana przy użyciu OpenPGP.<br>W celu odszyfrowania tej wiadomości wymagana jest instalacja <a href="%S">dodatku OpenPGP</a>.
+#
+# The following are used by the pgpmime content type handler
+#
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+# %S is the url to Enigmail on AMO supplied from preferences.
+pgpMimeNeedsAddon=Wiadomość zaszyfrowana przy użyciu OpenPGP.<br>W celu odszyfrowania tej wiadomości wymagana jest instalacja <a href="%S">dodatku OpenPGP</a>.
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Wiadomość zaszyfrowana przy użyciu OpenPGP, ale obsługa odszyfrowywania OpenPGP jest niedostępna.
diff --git a/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties b/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties
index cdd560f50d68..406e5a7d12f8 100644
--- a/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties
+++ b/thunderbird-l10n/pl/chrome/pl/locale/pl/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Automatycznie zezwolono na dostęp do
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Automatycznie zezwolono na dostęp do przechowywania danych dla elementu śledzącego „%2$S” pod adresem „%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Automatycznie zezwolono na dostęp do przechowywania danych dla izolacji typu First-Party „%2$S” pod adresem „%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Ciasteczko „%1$S” zostało odrzucone, ponieważ ma atrybut „sameSite=none”, ale nie ma atrybutu „secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/pl/localization/pl/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/pl/localization/pl/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..fe59fdbfb781
--- /dev/null
+++ b/thunderbird-l10n/pl/localization/pl/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Przekierowanie adresu URI kalendarza
+calendar-uri-redirect-description =
+    Serwer przekierowuje adres URI kalendarza „{ $calendarName }”.
+    Czy zaakceptować przekierowanie i zacząć używać nowego adresu URI dla tego kalendarza?
+calendar-uri-redirect-original-uri-label = Obecny adres URI:
+calendar-uri-redirect-target-uri-label = Przekierowywanie do nowego adresu URI:
diff --git a/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl b/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl
index c793dd5030ab..b07caf481b1b 100644
--- a/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/pl/localization/pl/messenger/accountCentral.ftl
@@ -3,7 +3,13 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Witamy w programie { -brand-full-name }
-setup-title = Wybierz, co skonfigurować
+account-settings = Ustawienia konta
+#   $accounts (Number) - the number of configured accounts
+setup-title =
+    { $accounts ->
+        [0] Wybierz, co skonfigurować
+       *[other] Skonfiguruj następne konto
+    }
 about-title = O programie { -brand-full-name }
 resources-title = Więcej informacji
 release-notes =
@@ -40,3 +46,10 @@ explore-link = Odkrywaj możliwości
 support-link = Pomoc
 involved-link = Dołącz do nas
 developer-link = Dokumentacja dla programistów
+read = Przeczytaj wiadomości
+compose = Napisz nową wiadomość
+search = Wyszukaj wiadomości
+filter = Zarządzaj filtrami wiadomości
+nntp-subscription = Subskrybuj grupę dyskusyjną
+rss-subscription = Subskrybuj aktualności
+e2e = Szyfrowanie „end-to-end”
diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl
index fae2f0c5b200..8a68ef938cb2 100644
--- a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Zainstaluj dodatek z pliku…
     .accesskey = Z
 help-button = Wsparcie dla dodatków
+sidebar-help-button-title =
+    .title = Wsparcie dla dodatków
 preferences =
     { PLATFORM() ->
         [windows] Opcje programu
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Narzędzia dla wszystkich dodatków
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opcje programu
+           *[other] Preferencje programu
+        }
 show-unsigned-extensions-button =
     .label = Niektóre rozszerzenia nie mogły zostać zweryfikowane
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Dostępne aktualizacje
     .tooltiptext = Wyświetl dostępne aktualizacje
 addon-category-discover = Polecane
+addon-category-discover-title =
+    .title = Polecane
 addon-category-extension = Rozszerzenia
+addon-category-extension-title =
+    .title = Rozszerzenia
 addon-category-theme = Motywy
+addon-category-theme-title =
+    .title = Motywy
 addon-category-plugin = Wtyczki
+addon-category-plugin-title =
+    .title = Wtyczki
 addon-category-dictionary = Słowniki
+addon-category-dictionary-title =
+    .title = Słowniki
 addon-category-locale = Języki
+addon-category-locale-title =
+    .title = Języki
 addon-category-available-updates = Dostępne aktualizacje
+addon-category-available-updates-title =
+    .title = Dostępne aktualizacje
 addon-category-recent-updates = Ostatnie aktualizacje
+addon-category-recent-updates-title =
+    .title = Ostatnie aktualizacje
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Te rozszerzenia nie mają skrótów:
 shortcuts-input =
     .placeholder = Wprowadź skrót
 shortcuts-browserAction = Włącz rozszerzenie
+shortcuts-browserAction2 = Włącz przycisk na pasku narzędzi
 shortcuts-pageAction = Włącz działanie na stronie
 shortcuts-sidebarAction = Przełącz panel boczny
 shortcuts-modifier-mac = Uwzględnij Ctrl, Alt lub ⌘
@@ -313,6 +338,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mniej
 go-back-button =
     .tooltiptext = Wstecz
+header-back-button =
+    .title = Wstecz
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl
index dd99b67dca03..ab9d7b0e2de1 100644
--- a/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/pl/localization/pl/toolkit/about/aboutSupport.ftl
@@ -296,6 +296,11 @@ sandbox-proc-type-content = zawartość
 sandbox-proc-type-file = zawartość pliku
 sandbox-proc-type-media-plugin = wtyczka
 sandbox-proc-type-data-decoder = dekoder danych
+startup-cache-title = Pamięć podręczna uruchamiania
+startup-cache-disk-cache-path = Ścieżka do pamięci podręcznej na dysku
+startup-cache-ignore-disk-cache = Ignorowanie pamięci podręcznej na dysku
+startup-cache-found-disk-cache-on-init = Odnaleziono pamięć podręczną na dysku podczas inicjacji
+startup-cache-wrote-to-disk-cache = Zapisano do pamięci podręcznej na dysku
 launcher-process-status-0 = włączony
 launcher-process-status-1 = wyłączony z powodu awarii
 launcher-process-status-2 = wymuszone wyłączenie
@@ -319,6 +324,7 @@ touch-enabled = dotyk
 drag-enabled = pasek przewijania
 keyboard-enabled = klawiatura
 autoscroll-enabled = automatyczne przewijanie
+zooming-enabled = płynne powiększanie gestem
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl
index c4fd53963be8..35a393d70fef 100644
--- a/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/pl/localization/pl/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certyfikat)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (łańcuch)
     .download = { $fileName }-łańcuch.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = To rozszerzenie zostało oznaczone jako krytyczne, co oznacza, że klienci muszą odrzucić certyfikat, jeśli go nie rozumieją.
+certificate-viewer-export = Eksportuj
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Użytkownik
+certificate-viewer-tab-people = Osoby
+certificate-viewer-tab-servers = Serwery
+certificate-viewer-tab-ca = Organy certyfikacji
+certificate-viewer-tab-unkonwn = Nieznane
diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl
index d7150fca1bb7..f7abbac6ed45 100644
--- a/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/pl/localization/pl/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Wydzielone strony
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Gniazdo
diff --git a/thunderbird-l10n/pl/localization/pl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/pl/localization/pl/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..554e4fbda96b
--- /dev/null
+++ b/thunderbird-l10n/pl/localization/pl/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Uruchomiono starszą wersję programu { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Utwórz nowy profil
+profiledowngrade-sync = Używanie starszej wersji programu { -brand-product-name } może uszkodzić zakładki i historię przeglądania już zachowaną w istniejącym profilu programu { -brand-product-name }. Aby chronić swoje dane, utwórz nowy profil dla tej instalacji programu { -brand-short-name }. Zawsze można zalogować się na { -fxaccount-brand-name(case: "loc", capitalization: "lower") }, aby synchronizować zakładki i historię przeglądania między profilami.
+profiledowngrade-nosync = Używanie starszej wersji programu { -brand-product-name } może uszkodzić zakładki i historię przeglądania już zachowaną w istniejącym profilu programu { -brand-product-name }. Aby chronić swoje dane, utwórz nowy profil dla tej instalacji programu { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Zakończ
+           *[other] Zakończ
+        }
diff --git a/thunderbird-l10n/pl/manifest.json b/thunderbird-l10n/pl/manifest.json
index 21dd17c04d81..8f84345a0988 100644
--- a/thunderbird-l10n/pl/manifest.json
+++ b/thunderbird-l10n/pl/manifest.json
@@ -1,9 +1,11 @@
 {
+  "name": "Polski Language Pack",
+  "langpack_id": "pl",
   "applications": {
     "gecko": {
       "strict_min_version": "76.0",
-      "strict_max_version": "76.*",
-      "id": "langpack-pl@thunderbird.mozilla.org"
+      "id": "langpack-pl@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
     }
   },
   "sources": {
@@ -11,47 +13,45 @@
       "base_path": "browser/"
     }
   },
-  "langpack_id": "pl",
-  "author": "Aviary.pl (contributors: Aviary.pl, Piotr Komoda, Zbigniew Braniecki, Marek Wawoczny, Piotr Bartecki, Stefan Plewako)",
-  "name": "Polski Language Pack",
   "languages": {
     "pl": {
+      "version": "20200418114439",
       "chrome_resources": {
-        "branding": "chrome/pl/locale/pl/branding/",
-        "pippki": "chrome/pl/locale/pl/pippki/",
-        "messenger-region": "chrome/pl/locale/pl/messenger-region/",
-        "calendar": "chrome/pl/locale/pl/calendar/",
-        "mozldap": "chrome/pl/locale/pl/mozldap/",
-        "pluginproblem": "chrome/pl/locale/pl/pluginproblem/",
-        "pipnss": "chrome/pl/locale/pl/pipnss/",
-        "devtools": "chrome/pl/locale/pl/devtools/client/",
-        "messenger-mapi": "chrome/pl/locale/pl/messenger-mapi/",
-        "lightning": "chrome/pl/locale/pl/lightning/",
-        "necko": "chrome/pl/locale/pl/necko/",
-        "devtools-shared": "chrome/pl/locale/pl/devtools/shared/",
-        "communicator": "chrome/pl/locale/pl/communicator/",
-        "messenger-newsblog": "chrome/pl/locale/pl/messenger-newsblog/",
-        "devtools-startup": "chrome/pl/locale/pl/devtools/startup/",
+        "alerts": "chrome/pl/locale/pl/alerts/",
         "global-platform": {
-          "macosx": "chrome/pl/locale/pl/global-platform/mac/",
           "android": "chrome/pl/locale/pl/global-platform/unix/",
-          "win": "chrome/pl/locale/pl/global-platform/win/",
-          "linux": "chrome/pl/locale/pl/global-platform/unix/"
+          "macosx": "chrome/pl/locale/pl/global-platform/mac/",
+          "linux": "chrome/pl/locale/pl/global-platform/unix/",
+          "win": "chrome/pl/locale/pl/global-platform/win/"
         },
-        "places": "chrome/pl/locale/pl/places/",
-        "autoconfig": "chrome/pl/locale/pl/autoconfig/",
+        "pipnss": "chrome/pl/locale/pl/pipnss/",
+        "communicator": "chrome/pl/locale/pl/communicator/",
+        "global": "chrome/pl/locale/pl/global/",
+        "messenger-mapi": "chrome/pl/locale/pl/messenger-mapi/",
         "chat": "chrome/pl/locale/pl/chat/",
-        "passwordmgr": "chrome/pl/locale/pl/passwordmgr/",
         "mozapps": "chrome/pl/locale/pl/mozapps/",
+        "pluginproblem": "chrome/pl/locale/pl/pluginproblem/",
         "messenger": "chrome/pl/locale/pl/messenger/",
+        "lightning": "chrome/pl/locale/pl/lightning/",
+        "messenger-newsblog": "chrome/pl/locale/pl/messenger-newsblog/",
+        "devtools": "chrome/pl/locale/pl/devtools/client/",
+        "passwordmgr": "chrome/pl/locale/pl/passwordmgr/",
+        "devtools-shared": "chrome/pl/locale/pl/devtools/shared/",
+        "messenger-region": "chrome/pl/locale/pl/messenger-region/",
+        "pippki": "chrome/pl/locale/pl/pippki/",
+        "branding": "chrome/pl/locale/pl/branding/",
+        "devtools-startup": "chrome/pl/locale/pl/devtools/startup/",
+        "calendar": "chrome/pl/locale/pl/calendar/",
+        "autoconfig": "chrome/pl/locale/pl/autoconfig/",
+        "mozldap": "chrome/pl/locale/pl/mozldap/",
+        "places": "chrome/pl/locale/pl/places/",
         "messenger-smime": "chrome/pl/locale/pl/messenger-smime/",
-        "global": "chrome/pl/locale/pl/global/",
-        "alerts": "chrome/pl/locale/pl/alerts/"
-      },
-      "version": "20200404095343"
+        "necko": "chrome/pl/locale/pl/necko/"
+      }
     }
   },
   "description": "Language pack for Thunderbird for pl",
   "manifest_version": 2,
-  "version": "76.0buildid20200407173003"
+  "version": "76.0buildid20200420212409",
+  "author": "Aviary.pl (contributors: Aviary.pl, Piotr Komoda, Zbigniew Braniecki, Marek Wawoczny, Piotr Bartecki, Stefan Plewako)"
 }
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties
index c11c7bfbc3df..640ba027a1c2 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=No associated rule
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties
index 1709630c54fa..c75f2a0714b3 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type,
 
 PEUnexpEOF2=Unexpected end of file while searching for %1$S.
 PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule.
+
 PEDeclDropped=Declaration dropped.
 PEDeclSkipped=Skipped to next declaration.
 PEUnknownProperty=Unknown property ‘%1$S’.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Apenas um repeat(auto-fill, …) é ac
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Apenas um repeat(auto-fill, …) ou repeat(auto-fit, …) é aceito numa lista de faixas.
 PEMoreThanOneGridRepeatTrackSize=Apenas um tamanho de faixa é aceito dentro de repeat(auto-feit, /auto-fill,…).
 
+PEDisallowedImportRule=As regras @import ainda não são válidas nas folhas de estilo construídas.
+
 TooLargeDashedRadius=Border radius is too large for ‘dashed’ style (the limit is 100000px). Rendering as solid.
 TooLargeDottedRadius=Border radius is too large for ‘dotted’ style (the limit is 100000px). Rendering as solid.
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties
index cd7be6e06072..f78c5ab64e0d 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/nsWebBrowserPersist.properties
@@ -5,8 +5,8 @@
 readError=%S could not be saved, because the source file could not be read.\n\nTry again later, or contact the server administrator.
 writeError=%S could not be saved, because an unknown error occurred.\n\nTry saving to a different location.
 launchError=%S could not be opened, because an unknown error occurred.\n\nTry saving to disk first and then opening the file.
-diskFull=There is not enough room on the disk to save %S.\n\nRemove unnecessary files from the disk and try again, or try saving in a different location.
-readOnly=%S could not be saved, because the disk, folder, or file is write-protected.\n\nWrite-enable the disk and try again, or try saving in a different location.
+diskFull=Não há espaço suficiente no disco para salvar %S.\n\nRemova arquivos desnecessários e tente novamente, ou salve em outro local.
+readOnly=%S não pôde ser salvo porque o disco, a pasta ou o arquivo estão protegidos contra gravação.\n\nMude a permissão de escrita e tente novamente, ou salve em outro local.
 accessError=%S could not be saved, because you cannot change the contents of that folder.\n\nChange the folder properties and try again, or try saving in a different location.
 SDAccessErrorCardReadOnly=Cannot download file because the SD card is in use.
 SDAccessErrorCardMissing=Cannot download file because the SD card is missing.
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties
index 22fde750ae54..8395fe7c0945 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Carregamento negado pelo X-Frame-Options: “%1$S” de “%2$S”, o
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Carregamento negado pelo X-Frame-Options: “%1$S” de “%2$S”, o site não permite frames de origens diferentes em “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Cabeçalho X-Frame-Options inválido encontrado ao carregar “%2$S”: “%1$S” não é uma diretiva válida.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=O carregamento de “%2$S” em um frame é negado pela diretiva “X-Frame-Options“ definida como “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Atualizando solicitação insegura “%1$S” para usar “%2$S”.
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties
index 3e44f0575793..c2fdc6a6002b 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/addons.properties
@@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S não pôde ser instalada porque tem um elevado r
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header=Adicionar %S?
 
+# %S is brandShortName
+webextPerms.experimentWarning=Extensões maliciosas podem roubar suas informações privativas ou comprometer seu computador. Só instale esta extensão se confiar na origem.
 webextPerms.unsignedWarning=Cuidado: esta extensão não foi verificada. Extensões maliciosas podem roubar suas informações privativas ou comprometer seu computador. Somente instale esta extensão se você confiar na origem.
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -194,6 +196,9 @@ webextPerms.description.devtools=Estender as ferramentas de desenvolvimento para
 webextPerms.description.dns=Acessar o endereço IP e o nome do servidor
 webextPerms.description.downloads=Baixar arquivos, ler e modificar o histórico de download do navegador
 webextPerms.description.downloads.open=Abrir arquivos baixados no seu computador
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment=Ter acesso total e irrestrito ao %S e ao seu computador
 webextPerms.description.find=Ler o texto de todas as abas abertas
 webextPerms.description.geolocation=Acessar sua localização
 webextPerms.description.history=Acessar o histórico de navegação
@@ -258,9 +263,3 @@ webext.remove.confirmation.title=Remover %S
 # %2$S is brandShorterName
 webext.remove.confirmation.message=Remover %1$S do %2$S?
 webext.remove.confirmation.button=Remover
-
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd
index 60aba62ddc06..60e74f0168dc 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/customizeToolbar.dtd
@@ -15,8 +15,7 @@
 <!ENTITY addNewToolbar.label      "Adicionar nova barra de ferramentas">
 <!ENTITY showTitlebar.label       "Mostrar barra de título">
 <!ENTITY extraDragSpace.label     "Adicionar espaço para onde arrastar">
+<!ENTITY showTitlebar2.label      "Barra de titulo">
+<!ENTITY extraDragSpace2.label    "Borda de janela">
 <!ENTITY saveChanges.label        "Concluído">
 <!ENTITY undoChanges.label        "Desfazer alterações">
-
-<!ENTITY showTitlebar2.label      "Title Bar">
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties
index 31cca749426a..1df7a2325940 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/imapMsgs.properties
@@ -199,12 +199,22 @@ imapSubscribePrompt=Deseja inscrever %1$S?
 
 imapServerDroppedConnection=Não foi possível conectar ao seu servidor IMAP. Você pode ter excedido o número máximo de conexões desse servidor. Se sim, vá as Configurações Avançadas do Servidor IMAP para reduzir o número de conexões em cache.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Informação sobre a cota não está disponível pois a pasta não está aberta.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Esse servidor não suporta cotas.
 
 imapQuotaStatusNoQuota=Não há cotas de armazenamento definidas para essa pasta.
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2=Esta pasta não apresenta nenhuma informação de cota.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=Informações de cota ainda não disponíveis.
+
 # Out of memory
 imapOutOfMemory=O aplicativo excedeu a capacidade de memória.
 
@@ -256,9 +266,3 @@ imapFolderCommandFailed=A operação atual em '%2$S' não obteve sucesso. O serv
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert=Alerta da conta %1$S: %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd
index 70e5208ccf1b..95d00e2c875d 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Pesquisar mensagens…">
 <!ENTITY searchMailCmd.accesskey "P">
 <!ENTITY searchMailCmd.key "F">
+<!ENTITY glodaSearchCmd.label "Pesquisa global…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Pesquisar catálogo…">
 <!ENTITY searchAddressesCmd.accesskey "e">
 
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties
index 9f7c87a44dcf..fde09798edff 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/messenger.properties
@@ -311,6 +311,7 @@ nocachedbodybody2=O texto desta mensagem não foi baixado do servidor para leitu
 
 # accountCentral
 mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat=%1$S %2$S - %3$S
 mailAcctType=E-mail
@@ -458,11 +459,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=%S de %SKB usados
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=%S%% ocupado
 # for quota in main window (commandglue.js)
 percent=%S%%
 quotaTooltip=Cota IMAP: %SKB usados de um total de %SKB. Clique para detalhes.
 
+quotaTooltip2=Cota IMAP: usado %S do total de %S. Clique para ver detalhes.
+
 # for message views
 confirmViewDeleteTitle=Confirmar
 confirmViewDeleteMessage=Tem certeza de que deseja excluir este modo de visualização?
@@ -798,5 +803,3 @@ errorConsoleTitle = Console de erros
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = Voltar
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties
index 619481e20965..07e4924f5682 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Esta é uma mensagem OpenPGP criptografada.<br>Para decodificá-la, você precisa instalar uma <a href="%S">extensão OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Esta é uma mensagem criptografada com OpenPGP, mas o suporte à descriptografia do OpenPGP não está disponível.
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd
index aca2b0a21721..184319f20ed0 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label         "Remover">
 <!ENTITY removeSearchEngine.accesskey     "v">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
+<!ENTITY minimizeToTray.label             "Quando o &brandShortName; for minimizado, mover para a bandeja">
 <!ENTITY minimizeToTray.accesskey         "m">
diff --git a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties
index e9693deca31b..98d93d8ff4cd 100644
--- a/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties
+++ b/thunderbird-l10n/pt-BR/chrome/pt-BR/locale/pt-BR/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Acesso ao armazenamento concedido aut
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Acesso ao armazenamento concedido automaticamente para o rastreador “%2$S” em “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Acesso ao armazenamento concedido automaticamente para o isolamento próprio “%2$S” em “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Cookie “%1$S” rejeitado porque tem o atributo “sameSite=none”, mas falta o atributo “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..7e87c8f96744
--- /dev/null
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Redirecionamento de URI da agenda
+calendar-uri-redirect-description =
+    O servidor está redirecionando o URI da agenda "{ $calendarName }".
+    Aceita o redirecionamento, passando a usar o novo URI desta agenda?
+calendar-uri-redirect-original-uri-label = URI atual:
+calendar-uri-redirect-target-uri-label = Redirecionando para o novo URI:
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl
index 0db21e8cdaaa..84a1cf84a3a3 100644
--- a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Boas-vindas ao { -brand-full-name }
+account-settings = Configurações da conta
+#   $accounts (Number) - the number of configured accounts
 setup-title = Escolha o que configurar
 about-title = Sobre o { -brand-full-name }
 resources-title = Recursos
@@ -14,18 +16,36 @@ email-description = O { -brand-short-name } permite conectar-se à sua conta de
 calendar-label = Agenda
     .aria-label = Criar uma nova agenda
 calendar-description = O { -brand-short-name } permite gerenciar eventos e manter você organizado. A conexão com uma agenda remota mantém todos os seus eventos sincronizados em todos os seus dispositivos.
+chat-label = Bate-papo
+    .aria-label = Conectar-se à sua conta de conversas
 chat-description = O { -brand-short-name } permite conectar-se a várias contas de mensagens instantâneas, oferecendo suporte a várias plataformas.
+filelink-label = Filelink
+    .aria-label = Configurar anexos online
+filelink-description = O { -brand-short-name } permite configurar uma conveniente conta na nuvem de links de arquivos para enviar anexos grandes com facilidade.
 addressbook-label = Catálogo de endereços
     .aria-label = Criar um novo catálogo de endereços
 addressbook-description = O { -brand-short-name } permite organizar todos os seus contatos em um catálogo de endereços. Você também pode se conectar a um catálogo de endereços remoto para manter todos os seus contatos sincronizados.
+feeds-label = RSS
+    .aria-label = Conectar-se a RSS
+feeds-description = O { -brand-short-name } permite conectar-se a feeds RSS/Atom para obter notícias e atualizações de todos os lados.
 newsgroups-label = Grupos de notícias
     .aria-label = Conectar a um grupos de notícias
 newsgroups-description = O { -brand-short-name } permite conectar-se a todos os grupos de notícias que deseja.
 import-title = Importar de outro programa
+import-paragraph = O { -brand-short-name } permite importar mensagens de e-mail, itens do catálogo de endereços, assinaturas de feeds, preferências e/ou filtros de outros programas de e-mail e formatos comuns de catálogo de endereços.
 import-label = Importar
     .aria-label = Importar dados de outros programas
+about-paragraph = O Thunderbird é o principal cliente de e-mail e agenda de código aberto, multiplataforma e livre para uso comercial e pessoal. Queremos que ele permaneça seguro e melhore ainda mais. Uma doação nos permitirá contratar mais desenvolvedores, pagar a infraestrutura e continuar a aprimorar.
+about-paragraph-2 = <b>O Thunderbird é financiado por usuários como você! Se gosta de usar o Thunderbird, considere fazer uma doação.</b> A melhor maneira de garantir que o Thunderbird permaneça disponível é
 about-donation = fazer uma doação
 explore-link = Explorar recursos
 support-link = Suporte
 involved-link = Envolva-se
 developer-link = Documentação do desenvolvedor
+read = Ler mensagens
+compose = Escrever uma nova mensagem
+search = Pesquisar mensagens
+filter = Gerenciar filtros de mensagens
+nntp-subscription = Gerenciar inscrições em grupos de notícias
+rss-subscription = Gerenciar inscrições em RSS
+e2e = Criptografia de ponta a ponta
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl
index 2a3858f8a573..2d574241a032 100644
--- a/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/messenger/policies/policies-descriptions.ftl
@@ -21,6 +21,7 @@ policy-BlockAboutSupport = Bloquear acesso à página about:support.
 policy-CaptivePortal = Ativar ou desativar suporte a portal cativo
 policy-CertificatesDescription = Adicionar certificados ou usar certificados integrados.
 policy-Cookies = Permitir ou negar que sites criem cookies.
+policy-DisabledCiphers = Desativar algoritmos de criptografia.
 policy-DefaultDownloadDirectory = Definir o diretório padrão de download.
 policy-DisableAppUpdate = Impedir que o { -brand-short-name } seja atualizado.
 policy-DisableDeveloperTools = Bloquear acesso às ferramentas do desenvolvedor.
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl
index c3bb288a60f3..f47b0d6fc8da 100644
--- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalar de um arquivo…
     .accesskey = I
 help-button = Suporte para extensões
+sidebar-help-button-title =
+    .title = Suporte para extensões
 preferences =
     { PLATFORM() ->
         [windows] Opções do { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Ferramentas para todas as extensões
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opções do { -brand-short-name }
+           *[other] Preferências do { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Algumas extensões não puderam ser verificadas
 show-all-extensions-button =
@@ -173,13 +181,29 @@ extensions-view-available-updates =
     .name = Atualizações disponíveis
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recomendações
+addon-category-discover-title =
+    .title = Recomendações
 addon-category-extension = Extensões
+addon-category-extension-title =
+    .title = Extensões
 addon-category-theme = Temas
+addon-category-theme-title =
+    .title = Temas
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Dicionários
+addon-category-dictionary-title =
+    .title = Dicionários
 addon-category-locale = Idiomas
+addon-category-locale-title =
+    .title = Idiomas
 addon-category-available-updates = Atualizações disponíveis
+addon-category-available-updates-title =
+    .title = Atualizações disponíveis
 addon-category-recent-updates = Atualizações recentes
+addon-category-recent-updates-title =
+    .title = Atualizações recentes
 
 ## These are global warnings
 
@@ -292,6 +316,7 @@ shortcuts-no-commands = As seguintes extensões não têm atalhos de teclado:
 shortcuts-input =
     .placeholder = Digite um atalho
 shortcuts-browserAction = Ativar extensão
+shortcuts-browserAction2 = Ativar botão na barra de ferramentas
 shortcuts-pageAction = Ativar ação de página
 shortcuts-sidebarAction = Exibir/ocultar o painel lateral
 shortcuts-modifier-mac = Incluir Ctrl, Alt ou ⌘
@@ -317,6 +342,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mostrar menos
 go-back-button =
     .tooltiptext = Voltar
+header-back-button =
+    .title = Voltar
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl
index 6f45d6e443d4..2fd277794a5a 100644
--- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/aboutSupport.ftl
@@ -290,6 +290,11 @@ sandbox-proc-type-content = conteúdo
 sandbox-proc-type-file = conteúdo do arquivo
 sandbox-proc-type-media-plugin = plugin de mídia
 sandbox-proc-type-data-decoder = decodificador de dados
+startup-cache-title = Cache ao iniciar
+startup-cache-disk-cache-path = Caminho do cache em disco
+startup-cache-ignore-disk-cache = Ignorar cache em disco
+startup-cache-found-disk-cache-on-init = Cache em disco encontrado ao iniciar
+startup-cache-wrote-to-disk-cache = Gravado no cache em disco
 launcher-process-status-0 = Ativado
 launcher-process-status-1 = Desativado devido a falha
 launcher-process-status-2 = Desativado à força
@@ -313,6 +318,7 @@ touch-enabled = entrada touch ativada
 drag-enabled = arrasto da barra de rolagem ativado
 keyboard-enabled = teclado ativado
 autoscroll-enabled = rolagem automática ativada
+zooming-enabled = zoom suave com gesto de pinça ativado
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl
index d83fcb006647..5d1d16179397 100644
--- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certificado)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (cadeia)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Esta extensão foi marcada como crítica. Isso significa que os clientes devem rejeitar o certificado se não o entenderem.
+certificate-viewer-export = Exportar
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Seus certificados
+certificate-viewer-tab-people = Pessoas
+certificate-viewer-tab-servers = Servidores
+certificate-viewer-tab-ca = Autoridades
+certificate-viewer-tab-unkonwn = Desconhecido
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl
index b7f672afb52f..25d33f522248 100644
--- a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Conteúdo web isolado
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..9741a4cd5408
--- /dev/null
+++ b/thunderbird-l10n/pt-BR/localization/pt-BR/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Você lançou uma versão mais antiga do { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Criar novo perfil
+profiledowngrade-sync = Usar uma versão mais antiga do { -brand-product-name } pode corromper favoritos e o histórico de navegação já salvos em um perfil existente do { -brand-product-name }. Para proteger suas informações, crie um novo perfil para esta instalação do { -brand-short-name }. Você sempre pode entrar em uma { -fxaccount-brand-name } para sincronizar seus favoritos e o histórico de navegação entre os perfis.
+profiledowngrade-nosync = Usar uma versão mais antiga do { -brand-product-name } pode corromper favoritos e o histórico de navegação já salvos em um perfil existente do { -brand-product-name }. Para proteger suas informações, crie um novo perfil para esta instalação do { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Sair
+           *[other] Fechar
+        }
diff --git a/thunderbird-l10n/pt-BR/manifest.json b/thunderbird-l10n/pt-BR/manifest.json
index 952b9face260..66391f7e93e7 100644
--- a/thunderbird-l10n/pt-BR/manifest.json
+++ b/thunderbird-l10n/pt-BR/manifest.json
@@ -1,57 +1,57 @@
 {
+  "description": "Language pack for Thunderbird for pt-BR",
+  "author": "mozilla.org (contributors: Jeferson Hultmann, Fernando Pereira Silveira, Marco Aurélio Krause, Maykon Chagas)",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "id": "langpack-pt-BR@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
+    }
+  },
+  "langpack_id": "pt-BR",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
   "manifest_version": 2,
-  "name": "Português (pt-BR) Language Pack",
   "languages": {
     "pt-BR": {
-      "version": "20200406020830",
       "chrome_resources": {
-        "branding": "chrome/pt-BR/locale/pt-BR/branding/",
-        "devtools": "chrome/pt-BR/locale/pt-BR/devtools/client/",
-        "passwordmgr": "chrome/pt-BR/locale/pt-BR/passwordmgr/",
-        "autoconfig": "chrome/pt-BR/locale/pt-BR/autoconfig/",
         "places": "chrome/pt-BR/locale/pt-BR/places/",
+        "lightning": "chrome/pt-BR/locale/pt-BR/lightning/",
+        "chat": "chrome/pt-BR/locale/pt-BR/chat/",
+        "autoconfig": "chrome/pt-BR/locale/pt-BR/autoconfig/",
+        "mozldap": "chrome/pt-BR/locale/pt-BR/mozldap/",
+        "messenger-region": "chrome/pt-BR/locale/pt-BR/messenger-region/",
+        "messenger-mapi": "chrome/pt-BR/locale/pt-BR/messenger-mapi/",
+        "devtools-startup": "chrome/pt-BR/locale/pt-BR/devtools/startup/",
+        "calendar": "chrome/pt-BR/locale/pt-BR/calendar/",
         "global": "chrome/pt-BR/locale/pt-BR/global/",
+        "devtools": "chrome/pt-BR/locale/pt-BR/devtools/client/",
+        "mozapps": "chrome/pt-BR/locale/pt-BR/mozapps/",
+        "passwordmgr": "chrome/pt-BR/locale/pt-BR/passwordmgr/",
+        "messenger": "chrome/pt-BR/locale/pt-BR/messenger/",
+        "communicator": "chrome/pt-BR/locale/pt-BR/communicator/",
+        "necko": "chrome/pt-BR/locale/pt-BR/necko/",
+        "devtools-shared": "chrome/pt-BR/locale/pt-BR/devtools/shared/",
+        "alerts": "chrome/pt-BR/locale/pt-BR/alerts/",
         "pippki": "chrome/pt-BR/locale/pt-BR/pippki/",
         "messenger-smime": "chrome/pt-BR/locale/pt-BR/messenger-smime/",
-        "necko": "chrome/pt-BR/locale/pt-BR/necko/",
-        "messenger-region": "chrome/pt-BR/locale/pt-BR/messenger-region/",
+        "pluginproblem": "chrome/pt-BR/locale/pt-BR/pluginproblem/",
+        "pipnss": "chrome/pt-BR/locale/pt-BR/pipnss/",
         "global-platform": {
-          "macosx": "chrome/pt-BR/locale/pt-BR/global-platform/mac/",
-          "android": "chrome/pt-BR/locale/pt-BR/global-platform/unix/",
           "linux": "chrome/pt-BR/locale/pt-BR/global-platform/unix/",
-          "win": "chrome/pt-BR/locale/pt-BR/global-platform/win/"
+          "android": "chrome/pt-BR/locale/pt-BR/global-platform/unix/",
+          "win": "chrome/pt-BR/locale/pt-BR/global-platform/win/",
+          "macosx": "chrome/pt-BR/locale/pt-BR/global-platform/mac/"
         },
-        "alerts": "chrome/pt-BR/locale/pt-BR/alerts/",
-        "communicator": "chrome/pt-BR/locale/pt-BR/communicator/",
-        "messenger": "chrome/pt-BR/locale/pt-BR/messenger/",
-        "devtools-startup": "chrome/pt-BR/locale/pt-BR/devtools/startup/",
         "messenger-newsblog": "chrome/pt-BR/locale/pt-BR/messenger-newsblog/",
-        "calendar": "chrome/pt-BR/locale/pt-BR/calendar/",
-        "messenger-mapi": "chrome/pt-BR/locale/pt-BR/messenger-mapi/",
-        "lightning": "chrome/pt-BR/locale/pt-BR/lightning/",
-        "devtools-shared": "chrome/pt-BR/locale/pt-BR/devtools/shared/",
-        "pipnss": "chrome/pt-BR/locale/pt-BR/pipnss/",
-        "chat": "chrome/pt-BR/locale/pt-BR/chat/",
-        "mozapps": "chrome/pt-BR/locale/pt-BR/mozapps/",
-        "pluginproblem": "chrome/pt-BR/locale/pt-BR/pluginproblem/",
-        "mozldap": "chrome/pt-BR/locale/pt-BR/mozldap/"
-      }
+        "branding": "chrome/pt-BR/locale/pt-BR/branding/"
+      },
+      "version": "20200415164724"
     }
   },
-  "author": "mozilla.org (contributors: Jeferson Hultmann, Fernando Pereira Silveira, Marco Aurélio Krause, Maykon Chagas)",
-  "version": "76.0buildid20200407173003",
-  "description": "Language pack for Thunderbird for pt-BR",
-  "applications": {
-    "gecko": {
-      "id": "langpack-pt-BR@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "langpack_id": "pt-BR"
+  "name": "Português (pt-BR) Language Pack",
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties
index e5293f5cef8a..52355d660a06 100644
--- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties
+++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Este elemento tem excesso deslocável.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Nenhuma regra associada
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Pressione Shift e clique para ir para a regra
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties
index 777310972b98..5edbe9d1ab6e 100644
--- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties
+++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=A folha de estilo %1$S foi carregada como CSS ainda que o seu tip
 
 PEUnexpEOF2=Fim de ficheiro inesperado ao pesquisar por %1$S.
 PEParseRuleWSOnly=Uma string de espaço em branco dada para ser analisada como regra.
+
 PEDeclDropped=Declaração ignorada.
 PEDeclSkipped=Ignorado para a declaração seguinte.
 PEUnknownProperty=Propriedade desconhecida ‘%1$S’.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Apenas um repeat(auto-fill, ...) é pe
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Apenas um repeat(auto-fill, ...) ou repeat(auto-fit, ...) é permitido numa track list.
 PEMoreThanOneGridRepeatTrackSize=Apenas um track size é permitido dentro de repeat(auto-fit/auto-fill, ...).
 
+PEDisallowedImportRule=As regras @import ainda não são válidas em folhas de estilo construídas.
+
 TooLargeDashedRadius=O raio da borda é muito grande para o estilo ‘dashed’ (o limite é 100000px). A renderizar como sólido.
 TooLargeDottedRadius=O raio da borda é muito grande para o estilo ‘dotted’ (o limite é 100000px). A renderizar como sólido.
diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties
index 396d34197320..e5b1c008bc65 100644
--- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties
+++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Carregamento negado por X-Frame-Options: “%1$S” de “%2$S”, o s
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Carregamento negado por X-Frame-Options: “%1$S” de “%2$S”, o site não permite cross-origin framing de “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Foi encontrado um cabeçalho X-Frame-Options inválido ao carregar “%2$S”: “%1$S” não é uma diretiva válida.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=O carregamento de “%2$S” numa frame é impedido pela diretiva “X-Frame-Options“ definida como “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = A atualizar o pedido inseguro “%1$S” para utilizar “%2$S”.
diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd
index e78c4eb3126f..7323b6bd831a 100644
--- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd
+++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/global/videocontrols.dtd
@@ -38,7 +38,7 @@ the Picture-in-Picture video toggle button when the mouse is hovering it. -->
 <!ENTITY error.noSource2 "Não foi encontrado nenhum vídeo com um formato e tipo MIME suportado.">
 <!ENTITY error.generic "Reprodução de vídeo abortada devido a um erro desconhecido.">
 
-<!ENTITY status.pictureInPicture "Este vídeo está a ser reproduzido no modo vídeo em janela flutuante.">
+<!ENTITY status.pictureInPicture "Este vídeo está a ser reproduzido numa janela flutuante.">
 
 <!-- LOCALIZATION NOTE (scrubberScale.nameFormat): the #1 string is the current
 media position, and the #2 string is the total duration. For example, when at
diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd
index 1ffbd8feb1d9..90084971a3c8 100644
--- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd
+++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Pesquisar mensagens…">
 <!ENTITY searchMailCmd.accesskey "m">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Pesquisa global…">
+<!ENTITY glodaSearchCmd.accesskey "g">
 <!ENTITY searchAddressesCmd.label "Pesquisar endereços…">
 <!ENTITY searchAddressesCmd.accesskey "s">
 
diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties
index 6f0b3f259f77..da565ff69ebc 100644
--- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties
+++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Esta é uma mensagem OpenPGP encriptada.<br>Para poder desencriptar esta mensagem, tem de instalar um <a href="%S">extra OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Esta é uma mensagem encriptada com o OpenPGP, mas o suporte para a encriptação OpenPGP não está disponível.
diff --git a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties
index 32c6e8920519..72180c51218a 100644
--- a/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties
+++ b/thunderbird-l10n/pt-PT/chrome/pt-PT/locale/pt-PT/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Acesso ao armazenamento concedido aut
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Acesso ao armazenamento concedido automaticamente para o rastreador “%2$S” em “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Acesso de armazenamento concedido automaticamente para o isolamento de primeira linha “%2$S” em “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=A cookie “%1$S” foi rejeitada porque possui o atributo “sameSite=none”, mas o atributo “secure” está em falta.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..bc881a1e66d7
--- /dev/null
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Redirecionamento de URI do calendário
+calendar-uri-redirect-description =
+    O servidor está a redirecionar o URI para o calendário "{ $calendarName }".
+    Aceitar o redirecionamento e começar a utilizar o novo URI para este calendário?
+calendar-uri-redirect-original-uri-label = URI atual:
+calendar-uri-redirect-target-uri-label = A redirecionar para o novo URI:
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl
index 13ab37305c83..2d7ed063e47f 100644
--- a/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Bem-vindo ao { -brand-full-name }
+account-settings = Definições da conta
+#   $accounts (Number) - the number of configured accounts
 setup-title = Escolha o que configurar
 about-title = Sobre o { -brand-full-name }
 resources-title = Recursos
@@ -40,3 +42,10 @@ explore-link = Explorar as funcionalidades
 support-link = Apoio
 involved-link = Participar
 developer-link = Documentação do programador
+read = Ler mensagens
+compose = Escrever uma nova mensagem
+search = Pesquisar mensagens
+filter = Gerir filtros de mensagens
+nntp-subscription = Gerir subscrições de grupos de notícias
+rss-subscription = Gerir subscrições de fontes
+e2e = Criptografia de ponto a ponto
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl
index 7a9b4300e58e..4c0926b0e23a 100644
--- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalar extra a partir de ficheiro…
     .accesskey = I
 help-button = Apoio dos extras
+sidebar-help-button-title =
+    .title = Apoio dos extras
 preferences =
     { PLATFORM() ->
         [windows] Opções do { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Ferramentas para todos os extras
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opções do { -brand-short-name }
+           *[other] Preferências do { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Algumas extensões não foram verificadas
 show-all-extensions-button =
@@ -170,13 +178,29 @@ extensions-view-available-updates =
     .name = Atualizações disponíveis
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recomendações
+addon-category-discover-title =
+    .title = Recomendações
 addon-category-extension = Extensões
+addon-category-extension-title =
+    .title = Extensões
 addon-category-theme = Temas
+addon-category-theme-title =
+    .title = Temas
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Dicionários
+addon-category-dictionary-title =
+    .title = Dicionários
 addon-category-locale = Idiomas
+addon-category-locale-title =
+    .title = Idiomas
 addon-category-available-updates = Atualizações disponíveis
+addon-category-available-updates-title =
+    .title = Atualizações disponíveis
 addon-category-recent-updates = Atualizações recentes
+addon-category-recent-updates-title =
+    .title = Atualizações recentes
 
 ## These are global warnings
 
@@ -289,6 +313,7 @@ shortcuts-no-commands = As seguintes extensões não possuem atalhos:
 shortcuts-input =
     .placeholder = Escrever um atalho
 shortcuts-browserAction = Ativar extensão
+shortcuts-browserAction2 = Ativar botão da barra de ferramentas
 shortcuts-pageAction = Ativar ação da página
 shortcuts-sidebarAction = Alternar a barra lateral
 shortcuts-modifier-mac = Incluir Ctrl, Alt ou ⌘
@@ -314,6 +339,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mostrar menos
 go-back-button =
     .tooltiptext = Retroceder
+header-back-button =
+    .title = Retroceder
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl
index a04ce791adf8..437a35cd5e00 100644
--- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutRights.ftl
@@ -33,7 +33,7 @@ rights-webservices-unbranded =
     assim como instruções sobre como os desativar, se necessário, devem ser 
     colocados aqui.
 rights-webservices-term-unbranded = Quaisquer termos de serviço devem ser listados aqui.
-rights-webservices-term-1 = A { -vendor-short-name } os seus contribuidores, licenciadores e parceiros trabalham para fornecer os serviços mais precisos e atualizados.  No entanto, não podemos garantir que esta informação é abrangente e livre de erros.  Por exemplo, o serviço de navegação segura poderá não identificar alguns sites perigosos e pode identificar alguns sites seguros por engano e, no serviço de localização, todas as localizações devolvidas pelos nossos fornecedores do serviço são apenas estimativas e nem nós, nem os nossos fornecedores do serviço, garantimos a exatidão das localizações fornecidas.
+rights-webservices-term-1 = A { -vendor-short-name } os seus colaboradores, licenciadores e parceiros trabalham para fornecer os serviços mais precisos e atualizados.  No entanto, não podemos garantir que esta informação é abrangente e isenta de erros. Por exemplo o serviço de navegação segura, por engano, poderá não identificar alguns sites perigosos e pode identificar alguns sites seguros. No serviço de localização, todas as localizações devolvidas pelos nossos fornecedores do serviço são apenas estimativas e nem nós, nem os nossos fornecedores do serviço, garantimos a exatidão das localizações fornecidas.
 rights-webservices-term-2 = A { -vendor-short-name } pode descontinuar ou alterar os serviços a qualquer momento.
 rights-webservices-term-3 = Está à vontade para utilizar estes Serviços que acompanham a sua versão do { -brand-short-name }, e a { -vendor-short-name } concede-lhe os direitos necessários para o fazer.  A { -vendor-short-name } e os seus licenciantes reservam todos os outros direitos nos Serviços.  Estes termos não têm a intenção de limitar quaisquer direitos sobre as licenças de código aberto aplicáveis ao { -brand-short-name } e às correspondentes versões do código fonte do { -brand-short-name }.
 rights-webservices-term-4 = <strong>Os serviços são disponibilizados "as-is."  A { -vendor-short-name }, os seus contribuidores, licenciantes e distribuidores renunciam a todas as garantias, sejam elas explícitas ou implícitas, incluindo sem limites, garantias que o serviço é comercial e serve para os seus objetivos pessoais.  Você é responsável por selecionar os serviços para os seus propósitos, assim como a qualidade e o desempenho dos serviços. Algumas jurisdições não permitem a exclusão ou a limitação de garantias implícitas, como tal este aviso poderá não ser adequado para si.</strong>
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl
index 4e24b300cf54..0fe95fcbd8f9 100644
--- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/aboutSupport.ftl
@@ -290,6 +290,11 @@ sandbox-proc-type-content = conteúdo
 sandbox-proc-type-file = conteúdo de ficheiro
 sandbox-proc-type-media-plugin = plugin multimédia
 sandbox-proc-type-data-decoder = descodificador de dados
+startup-cache-title = Cache de inicialização
+startup-cache-disk-cache-path = Caminho da cache em disco
+startup-cache-ignore-disk-cache = Ignorar cache em disco
+startup-cache-found-disk-cache-on-init = Encontrada cache em disco na inicialização
+startup-cache-wrote-to-disk-cache = Gravado na cache em disco
 launcher-process-status-0 = Ativado
 launcher-process-status-1 = Desativado devido a falha
 launcher-process-status-2 = Desativado forçadamente
@@ -313,6 +318,7 @@ touch-enabled = introdução com toque ativada
 drag-enabled = arrasto da barra de deslocamento ativado
 keyboard-enabled = teclado ativado
 autoscroll-enabled = auto-deslocamento ativado
+zooming-enabled = beliscar para zoom suave ativado
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl
index 8730122a871f..77903717363c 100644
--- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (certificado)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (cadeia)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Esta extensão foi marcada como crítica, o que significa que os clientes devem rejeitar o certificado se não o entenderem.
+certificate-viewer-export = Exportar
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Os seus certificados
+certificate-viewer-tab-people = Pessoas
+certificate-viewer-tab-servers = Servidores
+certificate-viewer-tab-ca = Autoridades
+certificate-viewer-tab-unkonwn = Desconhecido
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl
index 000163bcd432..57520a4fd196 100644
--- a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Conteúdo web isolado
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..0db0a01a3457
--- /dev/null
+++ b/thunderbird-l10n/pt-PT/localization/pt-PT/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Iniciou uma versão antiga do { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Criar novo perfil
+profiledowngrade-sync = Utilizar uma versão antiga do { -brand-product-name } pode corromper marcadores e histórico de navegação já guardado num perfil do { -brand-product-name } existente. Para proteger a sua informação, crie um novo perfil para esta instalação do { -brand-short-name }. Pode sempre iniciar sessão com uma { -fxaccount-brand-name } para sincronizar os seus marcadores e histórico de navegação entre perfis.
+profiledowngrade-nosync = Utilizar uma versão antiga do { -brand-product-name } pode corromper marcadores e histórico de navegação já guardado num perfil do { -brand-product-name } existente. Para proteger a sua informação, crie um novo perfil para esta instalação do { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Sair
+           *[other] Sair
+        }
diff --git a/thunderbird-l10n/pt-PT/manifest.json b/thunderbird-l10n/pt-PT/manifest.json
index 3226093fff3f..1a154bd6ec74 100644
--- a/thunderbird-l10n/pt-PT/manifest.json
+++ b/thunderbird-l10n/pt-PT/manifest.json
@@ -1,57 +1,57 @@
 {
+  "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)",
   "manifest_version": 2,
+  "name": "Português (Europeu) Language Pack",
   "applications": {
     "gecko": {
       "id": "langpack-pt-PT@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0"
     }
   },
+  "version": "76.0buildid20200420212409",
+  "description": "Language pack for Thunderbird for pt-PT",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "description": "Language pack for Thunderbird for pt-PT",
   "langpack_id": "pt-PT",
-  "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)",
   "languages": {
     "pt-PT": {
       "chrome_resources": {
+        "branding": "chrome/pt-PT/locale/pt-PT/branding/",
+        "messenger-newsblog": "chrome/pt-PT/locale/pt-PT/messenger-newsblog/",
+        "devtools": "chrome/pt-PT/locale/pt-PT/devtools/client/",
         "places": "chrome/pt-PT/locale/pt-PT/places/",
-        "devtools-startup": "chrome/pt-PT/locale/pt-PT/devtools/startup/",
-        "mozldap": "chrome/pt-PT/locale/pt-PT/mozldap/",
-        "messenger-smime": "chrome/pt-PT/locale/pt-PT/messenger-smime/",
-        "devtools-shared": "chrome/pt-PT/locale/pt-PT/devtools/shared/",
-        "passwordmgr": "chrome/pt-PT/locale/pt-PT/passwordmgr/",
+        "calendar": "chrome/pt-PT/locale/pt-PT/calendar/",
         "global": "chrome/pt-PT/locale/pt-PT/global/",
-        "pipnss": "chrome/pt-PT/locale/pt-PT/pipnss/",
-        "chat": "chrome/pt-PT/locale/pt-PT/chat/",
+        "pluginproblem": "chrome/pt-PT/locale/pt-PT/pluginproblem/",
         "messenger": "chrome/pt-PT/locale/pt-PT/messenger/",
-        "branding": "chrome/pt-PT/locale/pt-PT/branding/",
         "global-platform": {
-          "linux": "chrome/pt-PT/locale/pt-PT/global-platform/unix/",
-          "android": "chrome/pt-PT/locale/pt-PT/global-platform/unix/",
           "win": "chrome/pt-PT/locale/pt-PT/global-platform/win/",
+          "android": "chrome/pt-PT/locale/pt-PT/global-platform/unix/",
+          "linux": "chrome/pt-PT/locale/pt-PT/global-platform/unix/",
           "macosx": "chrome/pt-PT/locale/pt-PT/global-platform/mac/"
         },
-        "messenger-newsblog": "chrome/pt-PT/locale/pt-PT/messenger-newsblog/",
-        "communicator": "chrome/pt-PT/locale/pt-PT/communicator/",
-        "calendar": "chrome/pt-PT/locale/pt-PT/calendar/",
         "lightning": "chrome/pt-PT/locale/pt-PT/lightning/",
-        "autoconfig": "chrome/pt-PT/locale/pt-PT/autoconfig/",
-        "alerts": "chrome/pt-PT/locale/pt-PT/alerts/",
-        "pippki": "chrome/pt-PT/locale/pt-PT/pippki/",
-        "devtools": "chrome/pt-PT/locale/pt-PT/devtools/client/",
-        "pluginproblem": "chrome/pt-PT/locale/pt-PT/pluginproblem/",
-        "messenger-region": "chrome/pt-PT/locale/pt-PT/messenger-region/",
+        "passwordmgr": "chrome/pt-PT/locale/pt-PT/passwordmgr/",
         "necko": "chrome/pt-PT/locale/pt-PT/necko/",
+        "pipnss": "chrome/pt-PT/locale/pt-PT/pipnss/",
+        "chat": "chrome/pt-PT/locale/pt-PT/chat/",
+        "messenger-smime": "chrome/pt-PT/locale/pt-PT/messenger-smime/",
+        "mozapps": "chrome/pt-PT/locale/pt-PT/mozapps/",
+        "pippki": "chrome/pt-PT/locale/pt-PT/pippki/",
+        "devtools-shared": "chrome/pt-PT/locale/pt-PT/devtools/shared/",
+        "devtools-startup": "chrome/pt-PT/locale/pt-PT/devtools/startup/",
         "messenger-mapi": "chrome/pt-PT/locale/pt-PT/messenger-mapi/",
-        "mozapps": "chrome/pt-PT/locale/pt-PT/mozapps/"
+        "messenger-region": "chrome/pt-PT/locale/pt-PT/messenger-region/",
+        "communicator": "chrome/pt-PT/locale/pt-PT/communicator/",
+        "alerts": "chrome/pt-PT/locale/pt-PT/alerts/",
+        "autoconfig": "chrome/pt-PT/locale/pt-PT/autoconfig/",
+        "mozldap": "chrome/pt-PT/locale/pt-PT/mozldap/"
       },
-      "version": "20200405212353"
+      "version": "20200415232442"
     }
-  },
-  "name": "Português (Europeu) Language Pack",
-  "version": "76.0buildid20200407173003"
+  }
 }
diff --git a/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties b/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties
index 0c95612fa79d..db503d0988f5 100644
--- a/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties
+++ b/thunderbird-l10n/rm/chrome/rm/locale/rm/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=This element has scrollable overflow.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=No associated rule
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Hold Shift and click to jump to rule
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl
index 86379a185140..dacea3249cbf 100644
--- a/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/rm/localization/rm/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Installar in supplement a basa dad ina datoteca…
     .accesskey = I
 help-button = Agid cun supplements
+sidebar-help-button-title =
+    .title = Agid cun supplements
 preferences =
     { PLATFORM() ->
         [windows] Preferenzas da { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Utensils per tut ils supplements
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Preferenzas da { -brand-short-name }
+           *[other] Preferenzas da { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Impussibel da verifitgar tschertas extensiuns
 show-all-extensions-button =
@@ -173,13 +181,29 @@ extensions-view-available-updates =
     .name = Actualisaziuns disponiblas
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recumandaziuns
+addon-category-discover-title =
+    .title = Recumandaziuns
 addon-category-extension = Extensiuns
+addon-category-extension-title =
+    .title = Extensiuns
 addon-category-theme = Designs
+addon-category-theme-title =
+    .title = Designs
 addon-category-plugin = Plug-ins
+addon-category-plugin-title =
+    .title = Plug-ins
 addon-category-dictionary = Dicziunaris
+addon-category-dictionary-title =
+    .title = Dicziunaris
 addon-category-locale = Linguas
+addon-category-locale-title =
+    .title = Linguas
 addon-category-available-updates = Actualisaziuns disponiblas
+addon-category-available-updates-title =
+    .title = Actualisaziuns disponiblas
 addon-category-recent-updates = Ultimas actualisaziuns
+addon-category-recent-updates-title =
+    .title = Ultimas actualisaziuns
 
 ## These are global warnings
 
@@ -317,6 +341,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Mussar damain
 go-back-button =
     .tooltiptext = Turnar
+header-back-button =
+    .title = Turnar
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/rm/localization/rm/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/rm/localization/rm/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..eba73698c808
--- /dev/null
+++ b/thunderbird-l10n/rm/localization/rm/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Ti has avià ina versiun pli veglia da { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Crear in nov profil
+profiledowngrade-sync = L'utilisaziun dad ina versiun veglia da { -brand-product-name } po donnegiar la cronologia da navigaziun ed ils segnapaginas gia memorisads en in profil existent da { -brand-product-name }. Per proteger questas infurmaziuns, crear in nov profil per questa installaziun da { -brand-short-name }. Igl è adina pussaivel da s'annunziar cun in { -fxaccount-brand-name } per sincronisar segnapaginas e la cronologia da navigaziun tranter differents profils.
+profiledowngrade-nosync = L'utilisaziun dad ina versiun veglia da { -brand-product-name } po donnegiar la cronologia da navigaziun ed ils segnapaginas gia memorisads en il profil existent da { -brand-product-name }. Per proteger questas infurmaziuns, crear in nov profil per questa installaziun da { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Terminar
+           *[other] Terminar
+        }
diff --git a/thunderbird-l10n/rm/manifest.json b/thunderbird-l10n/rm/manifest.json
index 7e873c60e331..53ea703409e2 100644
--- a/thunderbird-l10n/rm/manifest.json
+++ b/thunderbird-l10n/rm/manifest.json
@@ -1,57 +1,57 @@
 {
-  "manifest_version": 2,
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
+  "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)",
+  "langpack_id": "rm",
+  "name": "Rumantsch Language Pack",
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "id": "langpack-rm@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
     }
   },
+  "description": "Language pack for Thunderbird for rm",
   "languages": {
     "rm": {
       "chrome_resources": {
+        "pippki": "chrome/rm/locale/rm/pippki/",
+        "mozapps": "chrome/rm/locale/rm/mozapps/",
+        "devtools": "chrome/rm/locale/rm/devtools/client/",
         "global-platform": {
-          "macosx": "chrome/rm/locale/rm/global-platform/mac/",
-          "linux": "chrome/rm/locale/rm/global-platform/unix/",
           "android": "chrome/rm/locale/rm/global-platform/unix/",
-          "win": "chrome/rm/locale/rm/global-platform/win/"
+          "macosx": "chrome/rm/locale/rm/global-platform/mac/",
+          "win": "chrome/rm/locale/rm/global-platform/win/",
+          "linux": "chrome/rm/locale/rm/global-platform/unix/"
         },
-        "messenger-smime": "chrome/rm/locale/rm/messenger-smime/",
+        "pluginproblem": "chrome/rm/locale/rm/pluginproblem/",
         "lightning": "chrome/rm/locale/rm/lightning/",
-        "passwordmgr": "chrome/rm/locale/rm/passwordmgr/",
-        "messenger-newsblog": "chrome/rm/locale/rm/messenger-newsblog/",
-        "pippki": "chrome/rm/locale/rm/pippki/",
-        "messenger-region": "chrome/rm/locale/rm/messenger-region/",
-        "communicator": "chrome/rm/locale/rm/communicator/",
         "pipnss": "chrome/rm/locale/rm/pipnss/",
-        "branding": "chrome/rm/locale/rm/branding/",
-        "chat": "chrome/rm/locale/rm/chat/",
-        "messenger": "chrome/rm/locale/rm/messenger/",
         "calendar": "chrome/rm/locale/rm/calendar/",
-        "mozapps": "chrome/rm/locale/rm/mozapps/",
-        "places": "chrome/rm/locale/rm/places/",
-        "mozldap": "chrome/rm/locale/rm/mozldap/",
-        "devtools-startup": "chrome/rm/locale/rm/devtools/startup/",
-        "pluginproblem": "chrome/rm/locale/rm/pluginproblem/",
-        "autoconfig": "chrome/rm/locale/rm/autoconfig/",
         "global": "chrome/rm/locale/rm/global/",
-        "devtools": "chrome/rm/locale/rm/devtools/client/",
+        "messenger-newsblog": "chrome/rm/locale/rm/messenger-newsblog/",
+        "messenger-region": "chrome/rm/locale/rm/messenger-region/",
         "devtools-shared": "chrome/rm/locale/rm/devtools/shared/",
+        "devtools-startup": "chrome/rm/locale/rm/devtools/startup/",
         "necko": "chrome/rm/locale/rm/necko/",
         "alerts": "chrome/rm/locale/rm/alerts/",
-        "messenger-mapi": "chrome/rm/locale/rm/messenger-mapi/"
+        "passwordmgr": "chrome/rm/locale/rm/passwordmgr/",
+        "messenger-smime": "chrome/rm/locale/rm/messenger-smime/",
+        "mozldap": "chrome/rm/locale/rm/mozldap/",
+        "communicator": "chrome/rm/locale/rm/communicator/",
+        "autoconfig": "chrome/rm/locale/rm/autoconfig/",
+        "branding": "chrome/rm/locale/rm/branding/",
+        "messenger-mapi": "chrome/rm/locale/rm/messenger-mapi/",
+        "places": "chrome/rm/locale/rm/places/",
+        "chat": "chrome/rm/locale/rm/chat/",
+        "messenger": "chrome/rm/locale/rm/messenger/"
       },
-      "version": "20200405184430"
+      "version": "20200415064345"
     }
   },
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "rm",
-  "applications": {
-    "gecko": {
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0",
-      "id": "langpack-rm@thunderbird.mozilla.org"
+  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
     }
-  },
-  "name": "Rumantsch Language Pack",
-  "author": "mozilla.org (contributors: Joe Solon, Suzy Solon)",
-  "description": "Language pack for Thunderbird for rm"
+  }
 }
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties
index 7611a745c8ab..8708f27d72df 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/devtools/client/netmonitor.properties
@@ -765,6 +765,14 @@ netmonitor.ws.context.received=Primite
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=R
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+netmonitor.ws.context.controlFrames=Control
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey=o
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Copiază mesajul
@@ -1525,10 +1533,3 @@ netmonitor.cache.lastModified=Ultima modificare
 # LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
 # where a cached object was fetched from (e.g. "disk").
 netmonitor.cache.device=Dispozitiv
-
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
-# on the context menu that shows "Control Frames" WebSocket frames.
-netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties
index b988a19cf7f3..0b9bfeddb9bc 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Foaia de stil %1$S a fost încărcată ca și CSS deși tipul MIM
 
 PEUnexpEOF2=Sfârșit neașteptat de fișier în timpul căutării după %1$S.
 PEParseRuleWSOnly=S-a dat un text care conține doar spații pentru a fi prelucrat ca regulă.
+
 PEDeclDropped=Declarație abandonată.
 PEDeclSkipped=Salt la declarația următoare.
 PEUnknownProperty=Proprietate necunoscută „%1$S”.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Doar un singur repeat(auto-fill, …)
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Nu este permisă decât un singur repeat(auto-fill, …) sau repeat(auto-fit, …) într-un track list.
 PEMoreThanOneGridRepeatTrackSize=Doar un singur track size este permis în cadrul unui repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=Regulile @import nu sunt încă valabile în foile de stil construite.
+
 TooLargeDashedRadius=Border radius este prea mare pentru stilul „dashed” (limita este 100000px). Se redă ca solid.
 TooLargeDottedRadius=Border radius este prea mare pentru stilul „dotted” (limita este 100000px). Se redă ca solid.
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties
index be4351db1525..3ec1460e9cda 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/addons.properties
@@ -126,6 +126,8 @@ addonInstallErrorBlocklisted=%S nu a putut fi instalat deoarece prezintă un ris
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header=Adaugi %S?
 
+# %S is brandShortName
+webextPerms.experimentWarning=Suplimentele rău-intenționate îți pot fura informațiile private sau îți pot compromite calculatorul. Instalează acest supliment numai dacă ai încredere în sursă.
 webextPerms.unsignedWarning=Atenție: Acest supliment este neverificat. Suplimentele rău intenționate pot să îți fure informații private sau să îți compromită calculatorul. Instalează suplimentul doar dacă ai încredere în sursă.
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -194,6 +196,9 @@ webextPerms.description.devtools=Să extindă uneltele de dezvoltare pentru a-ț
 webextPerms.description.dns=Să acceseze adresa IP și informații despre denumirea gazdei
 webextPerms.description.downloads=Să descarce fișiere și să citească sau să modifice istoricul descărcărilor din browser
 webextPerms.description.downloads.open=Să deschidă fișiere descărcate pe calculator
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment=Acces complet, nerestricționat la %S și la calculator
 webextPerms.description.find=Să citească textul din toate filele deschise
 webextPerms.description.geolocation=Să îți acceseze locația
 webextPerms.description.history=Să acceseze istoricul de navigare
@@ -258,9 +263,3 @@ webext.remove.confirmation.title=Elimină %S
 # %2$S is brandShorterName
 webext.remove.confirmation.message=Elimini %1$S din %2$S?
 webext.remove.confirmation.button=Elimină
-
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd
index 8d4724150e66..5a04d5d033a8 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/customizeToolbar.dtd
@@ -15,8 +15,7 @@
 <!ENTITY addNewToolbar.label      "Adaugă o nouă bară de unelte">
 <!ENTITY showTitlebar.label       "Afișează bara de titlu">
 <!ENTITY extraDragSpace.label     "Adaugă spațiu de tragere">
+<!ENTITY showTitlebar2.label      "Bară de titlu">
+<!ENTITY extraDragSpace2.label    "Spațiu de tragere">
 <!ENTITY saveChanges.label        "Terminat">
 <!ENTITY undoChanges.label        "Anulează schimbările">
-
-<!ENTITY showTitlebar2.label      "Title Bar">
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties
index d5cd92fec3f0..62d386de3e6a 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/imapMsgs.properties
@@ -199,12 +199,22 @@ imapSubscribePrompt=Vrei să te abonezi la %1$S?
 
 imapServerDroppedConnection=Nu se poate conecta la serverul IMAP. Se poate să fi depășit numărul maxim de conexiuni cu acest server. În acest caz, reduceți numărul de conexiuni memorate în dialogul Setări avansate pentru serverul IMAP.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Nu există informații despre cotă deoarece dosarul nu este deschis.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Serverul nu suportă cote.
 
 imapQuotaStatusNoQuota=Nu există cotă de stocare pentru acest dosar.
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2=Acest dosar nu raportează informații despre spațiul disponibil.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=Informațiile despre spațiul disponibil nu sunt încă disponibile.
+
 # Out of memory
 imapOutOfMemory=Aplicația nu mai are memorie.
 
@@ -256,9 +266,3 @@ imapFolderCommandFailed=Operațiunea actuală privind „%2$S” nu a reușit. S
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert=Alertă de la contul %1$S: %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties
index 847d61be78c7..690a1715e47f 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/messenger.properties
@@ -459,11 +459,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=%S din %S KB folosiți
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=%S%% plin
 # for quota in main window (commandglue.js)
 percent=%S%%
 quotaTooltip=Cotă IMAP: %S KO folosiți din totalul de %S KO. Clic pentru detalii.
 
+quotaTooltip2=Spațiu IMAP: %S utilizat din totalul de %S. Dă clic pentru detalii.
+
 # for message views
 confirmViewDeleteTitle=Confirmare
 confirmViewDeleteMessage=Sigur vrei să ștergi această vizualizare?
@@ -799,5 +803,3 @@ errorConsoleTitle = Consola de erori
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = Înapoi
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties
index 0017eea8d83a..7256a6baee74 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/pgpmime.properties
@@ -9,3 +9,6 @@
 # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Acesta este un mesaj criptat OpenPGP.<br>Pentru a putea decripta acest mesaj, va trebui să instalezi un <a href="%S">supliment OpenPGP</a>.
+
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Acesta este un mesaj criptat OpenPGP, dar suportul pentru decriptarea OpenPGP nu este disponibil.
diff --git a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd
index 0d9c57f2e01a..2f0cfa59aafb 100644
--- a/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/ro/chrome/ro/locale/ro/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label         "Elimină">
 <!ENTITY removeSearchEngine.accesskey     "v">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
+<!ENTITY minimizeToTray.label             "Când &brandShortName; este minimalizat, mută-l în bara de sistem">
 <!ENTITY minimizeToTray.accesskey         "m">
diff --git a/thunderbird-l10n/ro/localization/ro/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ro/localization/ro/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..fef19b40451f
--- /dev/null
+++ b/thunderbird-l10n/ro/localization/ro/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Redirecționare URI calendar
+calendar-uri-redirect-description =
+    Serverul redirecționează URI pentru calendarul „{ $calendarName }”.
+    Accepți redirecționarea și începi să utilizezi noul URI pentru acest calendar?
+calendar-uri-redirect-original-uri-label = URI actual:
+calendar-uri-redirect-target-uri-label = Redirecționare către noul URI:
diff --git a/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl
index 6a5c98c8b21c..fbcfeda99d70 100644
--- a/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/ro/localization/ro/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Browserul conectat are o versiune vech
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = Este posibil ca panoul de depanare să nu funcționeze în browserul conectat. Te rugăm să folosești Firefox { $runtimeVersion } dacă trebuie să folosești Depanatorul în acest browser.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Această versiune de Firefox nu poate depana Firefox pentru Android (68). Recomandăm instalarea pentru testare pe telefon a versiunii Nightly de Firefox pentru Android. <a>Mai multe detalii</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl b/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl
index 9b41c8b6cc13..ddc7d804a559 100644
--- a/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/ro/localization/ro/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Bine ai venit la { -brand-full-name }
+account-settings = Setări cont
+#   $accounts (Number) - the number of configured accounts
 setup-title = Alege ce să setezi
 about-title = Despre { -brand-full-name }
 resources-title = Resurse
@@ -40,3 +42,10 @@ explore-link = Explorează funcționalitățile
 support-link = Asistență
 involved-link = Implică-te
 developer-link = Documentația dezvoltatorului
+read = Citește mesajele
+compose = Scrie un mesaj nou
+search = Caută în mesaje
+filter = Gestionează filtrele de mesaje
+nntp-subscription = Gestionează abonamentele la grupurile de știri
+rss-subscription = Gestionează abonamentele la fluxuri
+e2e = Criptare end-to-end
diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl
index 6c3b5d71f402..9b558a2c8a91 100644
--- a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instalează un supliment dintr-un fișier…
     .accesskey = I
 help-button = Suport pentru suplimente
+sidebar-help-button-title =
+    .title = Suport pentru suplimente
 preferences =
     { PLATFORM() ->
         [windows] Opțiuni { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Instrumente pentru toate suplimentele
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Opțiuni { -brand-short-name }
+           *[other] Preferințe { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Unele extensii nu au putut fi verificate
 show-all-extensions-button =
@@ -165,13 +173,29 @@ extensions-view-available-updates =
     .name = Actualizări disponibile
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Recomandări
+addon-category-discover-title =
+    .title = Recomandări
 addon-category-extension = Extensii
+addon-category-extension-title =
+    .title = Extensii
 addon-category-theme = Teme
+addon-category-theme-title =
+    .title = Teme
 addon-category-plugin = Pluginuri
+addon-category-plugin-title =
+    .title = Pluginuri
 addon-category-dictionary = Dicționare
+addon-category-dictionary-title =
+    .title = Dicționare
 addon-category-locale = Limbi
+addon-category-locale-title =
+    .title = Limbi
 addon-category-available-updates = Actualizări disponibile
+addon-category-available-updates-title =
+    .title = Actualizări disponibile
 addon-category-recent-updates = Actualizări recente
+addon-category-recent-updates-title =
+    .title = Actualizări recente
 
 ## These are global warnings
 
@@ -284,6 +308,7 @@ shortcuts-no-commands = Următoarele extensii nu au comenzi rapide:
 shortcuts-input =
     .placeholder = Tastează o comandă rapidă
 shortcuts-browserAction = Activează extensia
+shortcuts-browserAction2 = Activează butonul pentru bara de unelte
 shortcuts-pageAction = Activează acțiunea pe pagină
 shortcuts-sidebarAction = Comută bara laterală
 shortcuts-modifier-mac = Include Ctrl, Alt sau ⌘
@@ -310,6 +335,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Afișează mai puțin
 go-back-button =
     .tooltiptext = Înapoi
+header-back-button =
+    .title = Înapoi
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl
index 7e0830625551..49a6aa4163a4 100644
--- a/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/ro/localization/ro/toolkit/about/aboutSupport.ftl
@@ -295,6 +295,11 @@ sandbox-proc-type-content = conținut
 sandbox-proc-type-file = conținut fișier
 sandbox-proc-type-media-plugin = plugin media
 sandbox-proc-type-data-decoder = decodor de date
+startup-cache-title = Cache de pornire
+startup-cache-disk-cache-path = Cale de salvare locală pentru cache
+startup-cache-ignore-disk-cache = Ignoră cache-ul salvat local
+startup-cache-found-disk-cache-on-init = Cache local identificat la inițializare
+startup-cache-wrote-to-disk-cache = Cache salvat local
 launcher-process-status-0 = Activat
 launcher-process-status-1 = Dezactivat din cauza unei probleme
 launcher-process-status-2 = Dezactivat forțat
@@ -318,6 +323,7 @@ touch-enabled = intrare tactilă activată
 drag-enabled = tragerea barei de derulare activată
 keyboard-enabled = tastatură activată
 autoscroll-enabled = autoderulare activată
+zooming-enabled = Zoom lin prin pișcare activat
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl
index 62f11121663f..ed0351bcfb77 100644
--- a/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/ro/localization/ro/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Grup de schimb de chei
 certificate-viewer-key-id = ID cheie
 certificate-viewer-key-size = Mărime cheie
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Sediu social
 certificate-viewer-locality = Localitate
 certificate-viewer-location = Loc
 certificate-viewer-logid = ID de jurnal
diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl
index 790b2919c1ac..c28caed20661 100644
--- a/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/ro/localization/ro/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Conținut web izolat
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/ro/localization/ro/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ro/localization/ro/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..d0ab8e0e5246
--- /dev/null
+++ b/thunderbird-l10n/ro/localization/ro/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Ai lansat o versiune mai veche de { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Creează un profil nou
+profiledowngrade-sync = Folosirea unei versiuni mai vechi de { -brand-product-name } poate corupe marcajele și istoricul de navigare deja salvate într-un profil { -brand-product-name } existent. Pentru a-ți proteja informațiile, creează un profil nou pentru această instalare { -brand-short-name }. Te poți oricum autentifica oricând cu un { -fxaccount-brand-name } pentru a sincroniza marcajele și istoricul de navigare între profiluri.
+profiledowngrade-nosync = Folosirea unei versiuni mai vechi de { -brand-product-name } poate corupe marcajele și istoricul de navigare deja salvate într-un profil { -brand-product-name } existent. Pentru a-ți proteja informațiile, creează un profil nou pentru această instalare { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Ieșire
+           *[other] Închide
+        }
diff --git a/thunderbird-l10n/ro/manifest.json b/thunderbird-l10n/ro/manifest.json
index cce250406dc0..a98307e477ae 100644
--- a/thunderbird-l10n/ro/manifest.json
+++ b/thunderbird-l10n/ro/manifest.json
@@ -1,57 +1,57 @@
 {
-  "manifest_version": 2,
-  "name": "Română (România) Language Pack",
-  "author": "mozilla.org (contributors: Alexandru Szasz, Raul Nicolae Malea, Cristian Silaghi, Jobava)",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
   "description": "Language pack for Thunderbird for ro",
+  "manifest_version": 2,
   "languages": {
     "ro": {
       "chrome_resources": {
-        "devtools": "chrome/ro/locale/ro/devtools/client/",
-        "passwordmgr": "chrome/ro/locale/ro/passwordmgr/",
         "chat": "chrome/ro/locale/ro/chat/",
-        "messenger-region": "chrome/ro/locale/ro/messenger-region/",
         "pippki": "chrome/ro/locale/ro/pippki/",
+        "messenger-smime": "chrome/ro/locale/ro/messenger-smime/",
+        "devtools-shared": "chrome/ro/locale/ro/devtools/shared/",
+        "alerts": "chrome/ro/locale/ro/alerts/",
+        "lightning": "chrome/ro/locale/ro/lightning/",
+        "pipnss": "chrome/ro/locale/ro/pipnss/",
+        "pluginproblem": "chrome/ro/locale/ro/pluginproblem/",
+        "mozapps": "chrome/ro/locale/ro/mozapps/",
+        "passwordmgr": "chrome/ro/locale/ro/passwordmgr/",
+        "global": "chrome/ro/locale/ro/global/",
+        "calendar": "chrome/ro/locale/ro/calendar/",
+        "messenger-mapi": "chrome/ro/locale/ro/messenger-mapi/",
         "communicator": "chrome/ro/locale/ro/communicator/",
+        "devtools": "chrome/ro/locale/ro/devtools/client/",
         "global-platform": {
-          "macosx": "chrome/ro/locale/ro/global-platform/mac/",
-          "android": "chrome/ro/locale/ro/global-platform/unix/",
           "win": "chrome/ro/locale/ro/global-platform/win/",
-          "linux": "chrome/ro/locale/ro/global-platform/unix/"
+          "linux": "chrome/ro/locale/ro/global-platform/unix/",
+          "android": "chrome/ro/locale/ro/global-platform/unix/",
+          "macosx": "chrome/ro/locale/ro/global-platform/mac/"
         },
-        "mozapps": "chrome/ro/locale/ro/mozapps/",
-        "alerts": "chrome/ro/locale/ro/alerts/",
-        "necko": "chrome/ro/locale/ro/necko/",
         "mozldap": "chrome/ro/locale/ro/mozldap/",
-        "messenger-newsblog": "chrome/ro/locale/ro/messenger-newsblog/",
-        "messenger-smime": "chrome/ro/locale/ro/messenger-smime/",
-        "calendar": "chrome/ro/locale/ro/calendar/",
-        "messenger": "chrome/ro/locale/ro/messenger/",
         "devtools-startup": "chrome/ro/locale/ro/devtools/startup/",
-        "lightning": "chrome/ro/locale/ro/lightning/",
-        "pluginproblem": "chrome/ro/locale/ro/pluginproblem/",
+        "branding": "chrome/ro/locale/ro/branding/",
+        "messenger": "chrome/ro/locale/ro/messenger/",
+        "messenger-region": "chrome/ro/locale/ro/messenger-region/",
         "autoconfig": "chrome/ro/locale/ro/autoconfig/",
-        "places": "chrome/ro/locale/ro/places/",
-        "devtools-shared": "chrome/ro/locale/ro/devtools/shared/",
-        "pipnss": "chrome/ro/locale/ro/pipnss/",
-        "messenger-mapi": "chrome/ro/locale/ro/messenger-mapi/",
-        "global": "chrome/ro/locale/ro/global/",
-        "branding": "chrome/ro/locale/ro/branding/"
+        "messenger-newsblog": "chrome/ro/locale/ro/messenger-newsblog/",
+        "necko": "chrome/ro/locale/ro/necko/",
+        "places": "chrome/ro/locale/ro/places/"
       },
-      "version": "20200403080214"
+      "version": "20200415060958"
     }
   },
+  "author": "mozilla.org (contributors: Alexandru Szasz, Raul Nicolae Malea, Cristian Silaghi, Jobava)",
+  "version": "76.0buildid20200420212409",
   "langpack_id": "ro",
-  "version": "76.0buildid20200407173003",
   "applications": {
     "gecko": {
-      "strict_min_version": "76.0",
       "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
       "id": "langpack-ro@thunderbird.mozilla.org"
     }
   },
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  }
+  "name": "Română (România) Language Pack"
 }
diff --git a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd
index 955e2a2bbf9f..ad9cf8f4c597 100644
--- a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd
+++ b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Поиск сообщений…">
 <!ENTITY searchMailCmd.accesskey "П">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Глобальный поиск…">
+<!ENTITY glodaSearchCmd.accesskey "л">
 <!ENTITY searchAddressesCmd.label "Поиск адресов…">
 <!ENTITY searchAddressesCmd.accesskey "а">
 
diff --git a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties
index 69733029d283..de977199809d 100644
--- a/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties
+++ b/thunderbird-l10n/ru/chrome/ru/locale/ru/messenger/pgpmime.properties
@@ -8,5 +8,7 @@
 
 # LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
 # %S is the url to Enigmail on AMO supplied from preferences.
-pgpMimeNeedsAddon=Это зашифрованное сообщение OpenPGP.<br>Чтобы расшифровать это письмо, вам необходимо установить <a href="%S">дополнение OpenPGP</a>.
+pgpMimeNeedsAddon=Это сообщение зашифровано OpenPGP.<br>Чтобы расшифровать это письмо, вам необходимо установить <a href="%S">дополнение OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Это сообщение зашифровано OpenPGP, но поддержка расшифровки OpenPGP недоступна.
diff --git a/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties b/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties
index df12b8dba8f8..a1b54579185d 100644
--- a/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties
+++ b/thunderbird-l10n/ru/chrome/ru/locale/ru/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Автоматически предо
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Автоматически предоставлен доступ к хранилищу для трекера «%2$S» на «%1$S».
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Автоматически предоставлен доступ к хранилищу для First-Party изоляции «%2$S» на «%1$S».
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Кука «%1$S» отклонена, поскольку в ней присутствует атрибут «sameSite=none», но отсутствует атрибут «secure».
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/ru/localization/ru/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/ru/localization/ru/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..8d50209c5978
--- /dev/null
+++ b/thunderbird-l10n/ru/localization/ru/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Перенаправление URI календаря
+calendar-uri-redirect-description =
+    Сервер перенаправляет URI для календаря «{ $calendarName }».
+    Принять перенаправление и начать использовать новый URI для этого календаря?
+calendar-uri-redirect-original-uri-label = Текущий URI:
+calendar-uri-redirect-target-uri-label = Перенаправление на новый URI:
diff --git a/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl b/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl
index d319159c7eb9..f7e88d2c941f 100644
--- a/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/ru/localization/ru/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Добро пожаловать в { -brand-full-name }
+account-settings = Параметры учётной записи
+#   $accounts (Number) - the number of configured accounts
 setup-title = Выберите, что нужно настроить
 about-title = О { -brand-full-name }
 resources-title = Ресурсы
@@ -10,18 +12,25 @@ release-notes =
     .title = О { -brand-full-name }
 email-label = Электронная почта
     .aria-label = Подключиться к имеющейся у вас учётной записи электронной почты
+email-description = { -brand-short-name } позволяет вам подключить существующую учётную запись электронной почты для удобного и эффективного чтения ваших писем в приложении.
 calendar-label = Календарь
     .aria-label = Создать новый календарь
+calendar-description = { -brand-short-name } позволяет вам управлять вашими событиями и помогает в удобной их организации. Подключение удалённого календаря позволяет синхронизировать все ваши события на всех ваших устройствах.
 chat-label = Чат
     .aria-label = Подключить учётную запись чата
+chat-description = { -brand-short-name } позволяет вам подключить несколько учётных записей служб мгновенного обмена сообщениями, на различных платформах.
 filelink-label = Filelink
     .aria-label = Настроить Filelink
+filelink-description = { -brand-short-name } позволяет вам настроить удобную облачную учётную запись для лёгкой отправки больших вложений.
 addressbook-label = Адресная книга
     .aria-label = Создать новую адресную книгу
+addressbook-description = { -brand-short-name } позволяет организовать все ваши контакты в адресной книге. Вы также можете подключиться к удалённой адресной книге, чтобы синхронизировать все ваши контакты.
 feeds-label = Ленты новостей
     .aria-label = Подписаться на ленты новостей
+feeds-description = { -brand-short-name } позволяет вам подключаться к лентам новостей RSS/Atom для получения новостей и обновлений отовсюду сразу.
 newsgroups-label = Группы новостей
     .aria-label = Подключиться к группе новостей
+newsgroups-description = { -brand-short-name } позволяет вам подключаться ко всем нужным группам новостей.
 import-title = Импорт из другой программы
 import-paragraph = { -brand-short-name } может импортировать почтовые сообщения, содержимое адресных книг, подписки на ленты новостей, настройки и/или фильтры из других почтовых программ и распространённых форматов адресных книг.
 import-label = Импорт
@@ -33,3 +42,10 @@ explore-link = Узнать о возможностях
 support-link = Поддержка
 involved-link = Принять участие
 developer-link = Документация для разработчиков
+read = Чтение сообщений
+compose = Создание новых сообщений
+search = Поиск сообщений
+filter = Управление фильтрами сообщений
+nntp-subscription = Управление подписками на группы новостей
+rss-subscription = Управление подписками на ленты новостей
+e2e = Сквозное шифрование
diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl
index 06f30debc1d7..ed79a6a9bf2c 100644
--- a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Установить дополнение из файла…
     .accesskey = а
 help-button = Поддержка дополнений
+sidebar-help-button-title =
+    .title = Поддержка дополнений
 preferences =
     { PLATFORM() ->
         [windows] Настройки { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Инструменты для всех дополнений
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Настройки { -brand-short-name }
+           *[other] Настройки { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Некоторые расширения не могут быть проверены
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Доступные обновления
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Рекомендации
+addon-category-discover-title =
+    .title = Рекомендации
 addon-category-extension = Расширения
+addon-category-extension-title =
+    .title = Расширения
 addon-category-theme = Темы
+addon-category-theme-title =
+    .title = Темы
 addon-category-plugin = Плагины
+addon-category-plugin-title =
+    .title = Плагины
 addon-category-dictionary = Словари
+addon-category-dictionary-title =
+    .title = Словари
 addon-category-locale = Языки
+addon-category-locale-title =
+    .title = Языки
 addon-category-available-updates = Доступные обновления
+addon-category-available-updates-title =
+    .title = Доступные обновления
 addon-category-recent-updates = Недавние обновления
+addon-category-recent-updates-title =
+    .title = Недавние обновления
 
 ## These are global warnings
 
@@ -313,6 +337,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Показать меньше
 go-back-button =
     .tooltiptext = Вернуться назад
+header-back-button =
+    .title = Вернуться назад
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl
index 64a96daf4187..1efae4fb8e04 100644
--- a/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/ru/localization/ru/toolkit/about/aboutSupport.ftl
@@ -292,6 +292,8 @@ sandbox-proc-type-content = контент
 sandbox-proc-type-file = содержимое файла
 sandbox-proc-type-media-plugin = медиаплагин
 sandbox-proc-type-data-decoder = декодер данных
+startup-cache-disk-cache-path = Путь к дисковому кешу
+startup-cache-ignore-disk-cache = Игнорировать дисковый кэш
 launcher-process-status-0 = Включён
 launcher-process-status-1 = Отключён из-за сбоя
 launcher-process-status-2 = Принудительно отключён
diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl
index 6fd65a068ee2..e8f8f64955e2 100644
--- a/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/ru/localization/ru/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (сертификат)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (цепочка сертификатов)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Это расширение помечено как критическое, что означает, что клиенты должны отклонить сертификат, если они его не понимают.
+certificate-viewer-export = Экспортировать
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Ваши сертификаты
+certificate-viewer-tab-people = Люди
+certificate-viewer-tab-servers = Серверы
+certificate-viewer-tab-ca = Центры сертификации
+certificate-viewer-tab-unkonwn = Неизвестно
diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl
index e52c26612627..1c49d4824bdb 100644
--- a/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/ru/localization/ru/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Изолированное веб-содержимо
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Сокет
diff --git a/thunderbird-l10n/ru/localization/ru/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/ru/localization/ru/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..96928eab5f93
--- /dev/null
+++ b/thunderbird-l10n/ru/localization/ru/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Вы запустили устаревшую версию { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Создать новый профиль
+profiledowngrade-sync = Использование устаревшей версии { -brand-product-name } может повредить закладки и историю просмотра, уже сохранённые в существующем профиле { -brand-product-name }. Чтобы защитить вашу информацию, создайте новый профиль для этой установки { -brand-short-name }. Вы всегда можете войти в свой { -fxaccount-brand-name }, чтобы синхронизировать ваши закладки и историю просмотра между профилями.
+profiledowngrade-nosync = Использование устаревшей версии { -brand-product-name } может повредить закладки и историю просмотра, уже сохранённые в существующем профиле { -brand-product-name }. Чтобы защитить вашу информацию, создайте новый профиль для этой установки { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Выйти
+           *[other] Выйти
+        }
diff --git a/thunderbird-l10n/ru/manifest.json b/thunderbird-l10n/ru/manifest.json
index ddec1bd2c309..e6240a173790 100644
--- a/thunderbird-l10n/ru/manifest.json
+++ b/thunderbird-l10n/ru/manifest.json
@@ -1,57 +1,57 @@
 {
-  "applications": {
-    "gecko": {
-      "id": "langpack-ru@thunderbird.mozilla.org",
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
-    }
-  },
-  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
   "languages": {
     "ru": {
+      "version": "20200419145404",
       "chrome_resources": {
+        "passwordmgr": "chrome/ru/locale/ru/passwordmgr/",
+        "messenger-smime": "chrome/ru/locale/ru/messenger-smime/",
+        "chat": "chrome/ru/locale/ru/chat/",
+        "devtools-startup": "chrome/ru/locale/ru/devtools/startup/",
         "places": "chrome/ru/locale/ru/places/",
-        "lightning": "chrome/ru/locale/ru/lightning/",
-        "global": "chrome/ru/locale/ru/global/",
+        "alerts": "chrome/ru/locale/ru/alerts/",
         "devtools-shared": "chrome/ru/locale/ru/devtools/shared/",
+        "calendar": "chrome/ru/locale/ru/calendar/",
         "global-platform": {
           "android": "chrome/ru/locale/ru/global-platform/unix/",
+          "macosx": "chrome/ru/locale/ru/global-platform/mac/",
           "linux": "chrome/ru/locale/ru/global-platform/unix/",
-          "win": "chrome/ru/locale/ru/global-platform/win/",
-          "macosx": "chrome/ru/locale/ru/global-platform/mac/"
+          "win": "chrome/ru/locale/ru/global-platform/win/"
         },
-        "branding": "chrome/ru/locale/ru/branding/",
-        "pipnss": "chrome/ru/locale/ru/pipnss/",
-        "messenger-newsblog": "chrome/ru/locale/ru/messenger-newsblog/",
+        "necko": "chrome/ru/locale/ru/necko/",
         "autoconfig": "chrome/ru/locale/ru/autoconfig/",
-        "mozapps": "chrome/ru/locale/ru/mozapps/",
-        "passwordmgr": "chrome/ru/locale/ru/passwordmgr/",
+        "messenger-region": "chrome/ru/locale/ru/messenger-region/",
+        "lightning": "chrome/ru/locale/ru/lightning/",
+        "devtools": "chrome/ru/locale/ru/devtools/client/",
         "communicator": "chrome/ru/locale/ru/communicator/",
-        "devtools-startup": "chrome/ru/locale/ru/devtools/startup/",
-        "pluginproblem": "chrome/ru/locale/ru/pluginproblem/",
-        "necko": "chrome/ru/locale/ru/necko/",
-        "calendar": "chrome/ru/locale/ru/calendar/",
-        "mozldap": "chrome/ru/locale/ru/mozldap/",
+        "messenger-mapi": "chrome/ru/locale/ru/messenger-mapi/",
         "pippki": "chrome/ru/locale/ru/pippki/",
-        "devtools": "chrome/ru/locale/ru/devtools/client/",
-        "messenger-region": "chrome/ru/locale/ru/messenger-region/",
+        "branding": "chrome/ru/locale/ru/branding/",
+        "mozldap": "chrome/ru/locale/ru/mozldap/",
+        "mozapps": "chrome/ru/locale/ru/mozapps/",
+        "pipnss": "chrome/ru/locale/ru/pipnss/",
+        "messenger-newsblog": "chrome/ru/locale/ru/messenger-newsblog/",
+        "global": "chrome/ru/locale/ru/global/",
         "messenger": "chrome/ru/locale/ru/messenger/",
-        "alerts": "chrome/ru/locale/ru/alerts/",
-        "chat": "chrome/ru/locale/ru/chat/",
-        "messenger-mapi": "chrome/ru/locale/ru/messenger-mapi/",
-        "messenger-smime": "chrome/ru/locale/ru/messenger-smime/"
-      },
-      "version": "20200405222243"
+        "pluginproblem": "chrome/ru/locale/ru/pluginproblem/"
+      }
     }
   },
-  "version": "76.0buildid20200407173003",
   "description": "Language pack for Thunderbird for ru",
-  "langpack_id": "ru",
   "author": "Mozilla Russia (contributors: Александр Словесник)",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0",
+      "id": "langpack-ru@thunderbird.mozilla.org"
+    }
+  },
+  "langpack_id": "ru",
+  "name": "Russian (RU) Language Pack",
+  "manifest_version": 2,
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
-  },
-  "name": "Russian (RU) Language Pack"
+  }
 }
diff --git a/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl
index d42fb5585fca..87194fcd1d7c 100644
--- a/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/si/localization/si/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = ඇඩෝන ගොනුවෙන් ස්ථාපනය කරන්න…
     .accesskey = I
 help-button = ඇඩෝන සහාය
+sidebar-help-button-title =
+    .title = ඇඩෝන සහාය
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } විකල්ප
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = සියළු ඇඩෝන සඳහා මෙවලම්
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } විකල්ප
+           *[other] { -brand-short-name } අභිප්‍රේත
+        }
 show-unsigned-extensions-button =
     .label = ඇතැම් දිගු තහවුරු කළ නොහැක
 show-all-extensions-button =
@@ -147,11 +155,23 @@ extensions-view-available-updates =
     .name = පවතින යාවත්කාලීන
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-extension = දිගුකිරීම්
+addon-category-extension-title =
+    .title = දිගුකිරීම්
 addon-category-plugin = ප්ලගීන
+addon-category-plugin-title =
+    .title = ප්ලගීන
 addon-category-dictionary = ශබ්දකෝෂයන්
+addon-category-dictionary-title =
+    .title = ශබ්දකෝෂයන්
 addon-category-locale = භාෂාවන්
+addon-category-locale-title =
+    .title = භාෂාවන්
 addon-category-available-updates = පවතින යාවත්කාලීන
+addon-category-available-updates-title =
+    .title = පවතින යාවත්කාලීන
 addon-category-recent-updates = මෑතකාලීන යාවත්කාලීන
+addon-category-recent-updates-title =
+    .title = මෑතකාලීන යාවත්කාලීන
 
 ## These are global warnings
 
diff --git a/thunderbird-l10n/si/localization/si/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/si/localization/si/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..b3ea5c5e9c29
--- /dev/null
+++ b/thunderbird-l10n/si/localization/si/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,15 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = ඔබ පැරණි { -brand-product-name } නිකුතුවක් දියත් කරයි.
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = නව පැතිකඩක් තනන්න
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] පිටවීම
+           *[other] ඉවත්වීම
+        }
diff --git a/thunderbird-l10n/si/manifest.json b/thunderbird-l10n/si/manifest.json
index 02bc4b3b953c..dccc1db0447d 100644
--- a/thunderbird-l10n/si/manifest.json
+++ b/thunderbird-l10n/si/manifest.json
@@ -4,6 +4,10 @@
       "base_path": "browser/"
     }
   },
+  "name": "Sinhala (si-LK) Language Pack",
+  "manifest_version": 2,
+  "author": "mozilla.org (contributors: රෝහන දසනායක, මහේෂා හතරසිංහ, කසුන් කරුණාරත්න)",
+  "description": "Language pack for Thunderbird for si",
   "applications": {
     "gecko": {
       "strict_max_version": "76.*",
@@ -13,45 +17,41 @@
   },
   "languages": {
     "si": {
-      "version": "20200403080409",
       "chrome_resources": {
-        "messenger-mapi": "chrome/si/locale/si/messenger-mapi/",
-        "communicator": "chrome/si/locale/si/communicator/",
-        "mozldap": "chrome/si/locale/si/mozldap/",
-        "alerts": "chrome/si/locale/si/alerts/",
         "devtools-startup": "chrome/si/locale/si/devtools/startup/",
-        "devtools": "chrome/si/locale/si/devtools/client/",
-        "pluginproblem": "chrome/si/locale/si/pluginproblem/",
-        "branding": "chrome/si/locale/si/branding/",
+        "necko": "chrome/si/locale/si/necko/",
+        "messenger-mapi": "chrome/si/locale/si/messenger-mapi/",
         "messenger-region": "chrome/si/locale/si/messenger-region/",
-        "places": "chrome/si/locale/si/places/",
-        "messenger-smime": "chrome/si/locale/si/messenger-smime/",
-        "mozapps": "chrome/si/locale/si/mozapps/",
+        "branding": "chrome/si/locale/si/branding/",
         "calendar": "chrome/si/locale/si/calendar/",
-        "autoconfig": "chrome/si/locale/si/autoconfig/",
-        "lightning": "chrome/si/locale/si/lightning/",
+        "mozapps": "chrome/si/locale/si/mozapps/",
+        "mozldap": "chrome/si/locale/si/mozldap/",
+        "pluginproblem": "chrome/si/locale/si/pluginproblem/",
         "devtools-shared": "chrome/si/locale/si/devtools/shared/",
-        "messenger-newsblog": "chrome/si/locale/si/messenger-newsblog/",
-        "global": "chrome/si/locale/si/global/",
+        "pipnss": "chrome/si/locale/si/pipnss/",
+        "communicator": "chrome/si/locale/si/communicator/",
+        "places": "chrome/si/locale/si/places/",
         "passwordmgr": "chrome/si/locale/si/passwordmgr/",
+        "chat": "chrome/si/locale/si/chat/",
+        "lightning": "chrome/si/locale/si/lightning/",
+        "messenger": "chrome/si/locale/si/messenger/",
+        "messenger-smime": "chrome/si/locale/si/messenger-smime/",
         "global-platform": {
-          "macosx": "chrome/si/locale/si/global-platform/mac/",
-          "win": "chrome/si/locale/si/global-platform/win/",
           "android": "chrome/si/locale/si/global-platform/unix/",
-          "linux": "chrome/si/locale/si/global-platform/unix/"
+          "win": "chrome/si/locale/si/global-platform/win/",
+          "linux": "chrome/si/locale/si/global-platform/unix/",
+          "macosx": "chrome/si/locale/si/global-platform/mac/"
         },
-        "messenger": "chrome/si/locale/si/messenger/",
-        "pipnss": "chrome/si/locale/si/pipnss/",
-        "necko": "chrome/si/locale/si/necko/",
-        "chat": "chrome/si/locale/si/chat/",
-        "pippki": "chrome/si/locale/si/pippki/"
-      }
+        "messenger-newsblog": "chrome/si/locale/si/messenger-newsblog/",
+        "autoconfig": "chrome/si/locale/si/autoconfig/",
+        "global": "chrome/si/locale/si/global/",
+        "pippki": "chrome/si/locale/si/pippki/",
+        "devtools": "chrome/si/locale/si/devtools/client/",
+        "alerts": "chrome/si/locale/si/alerts/"
+      },
+      "version": "20200415061136"
     }
   },
-  "manifest_version": 2,
-  "name": "Sinhala (si-LK) Language Pack",
-  "author": "mozilla.org (contributors: රෝහන දසනායක, මහේෂා හතරසිංහ, කසුන් කරුණාරත්න)",
-  "description": "Language pack for Thunderbird for si",
-  "version": "76.0buildid20200407173003",
+  "version": "76.0buildid20200420212409",
   "langpack_id": "si"
 }
diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd
index 0abac67ce307..5fbc8ed02d1f 100644
--- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd
+++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/accountCreation.dtd
@@ -37,6 +37,7 @@
 <!ENTITY imapLong.label                  "IMAP (vzdialené priečinky)">
 <!ENTITY pop3Long.label                  "POP3 (uchováva poštu na disku počítača)">
 
+<!ENTITY manualConfigTable.summary       "Nastavenia servera">
 <!ENTITY incoming.label                  "Prijímanie:">
 <!ENTITY incomingColumn.label            "Prijímanie">
 <!ENTITY outgoing.label                  "Odosielanie:">
@@ -119,5 +120,3 @@
 <!ENTITY insecureUnencrypted.description "Vaša e-mailová adresa a prihlasovacie údaje sú odosielané nezašifrované, takže heslo (a vaša správa) môžu byť jednoducho prečítané inými ľuďmi. &brandShortName; vám umožní získať vaše e-mailové správy, ale mali by ste vášho poskytovateľa požiadať o zriadenie zabezpečeného pripojenia k poštovému serveru.">
 <!ENTITY insecureSelfSigned.description  "Server používa certifikát, ktorému nemôžeme dôverovať, takže nemôžeme zaručiť, že niekto nesleduje údaje posielané medzi &brandShortName;om a serverom. &brandShortName; vám umožní získať vaše e-mailové správy, ale mali by ste vášho poskytovateľa požiadať o zriadenie zabezpečeného pripojenia s platným certifikátom poštového servera.">
 <!ENTITY secureServer.description        "Gratulujeme! Toto je zabezpečený server.">
-
-<!ENTITY manualConfigTable.summary       "Server settings">
diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties
index 39270ffe7be8..16472a29a282 100644
--- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties
+++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/addons.properties
@@ -1,4 +1,15 @@
+# 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/.
+
 xpinstallPromptMessage=%S zabránil tejto stránke požiadať o inštaláciu softvéru.
+# LOCALIZATION NOTE (xpinstallPromptMessage.header)
+# The string contains the hostname of the site the add-on is being installed from.
+xpinstallPromptMessage.header=Chcete nainštalovať doplnok z %S?
+xpinstallPromptMessage.message=Pokúšate sa nainštalovať doplnok z %S. Uistite sa, že tejto stránke môžete dôverovať.
+xpinstallPromptMessage.header.unknown=Chcete nainštalovať doplnok z neznámej stránky?
+xpinstallPromptMessage.message.unknown=Pokúšate sa nainštalovať doplnok z neznámej stránky. Uistite sa, že tejto stránke môžete dôverovať.
+xpinstallPromptMessage.learnMore=Ďalšie informácie o bezpečnej inštalácii doplnkov
 xpinstallPromptMessage.dontAllow=Nepovoliť
 xpinstallPromptMessage.dontAllow.accesskey=N
 xpinstallPromptAllowButton=Povoliť
@@ -6,11 +17,29 @@ xpinstallPromptAllowButton=Povoliť
 # Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
 # See http://www.mozilla.org/access/keyboard/accesskey for details
 xpinstallPromptAllowButton.accesskey=P
+xpinstallPromptMessage.neverAllow=Nikdy nepovoliť
+xpinstallPromptMessage.neverAllow.accesskey=N
+# Accessibility Note:
+# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
+# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details
+xpinstallPromptMessage.install=Nainštalovať
+xpinstallPromptMessage.install.accesskey=a
+
+# Accessibility Note:
+# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
+# See http://www.mozilla.org/access/keyboard/accesskey for details
 xpinstallDisabledMessageLocked=Inštalácia softvéru bola vypnutá vaším správcom systému.
 xpinstallDisabledMessage=Inštalácia softvéru je momentálne vypnutá. Kliknite na tlačidlo Povoliť a skúste to znova.
 xpinstallDisabledButton=Povoliť
 xpinstallDisabledButton.accesskey=o
 
+# LOCALIZATION NOTE (addonInstallBlockedByPolicy)
+# This message is shown when the installation of an add-on is blocked by
+# enterprise policy. %1$S is replaced by the name of the add-on.
+# %2$S is replaced by the ID of add-on. %3$S is a custom message that
+# the administration can add to the message.
+addonInstallBlockedByPolicy=Doplnok %1$S (%2$S) bol zablokovaný správcom vášho počítača. %3$S
+
 # LOCALIZATION NOTE (addonPostInstall.message1)
 # %1$S is replaced with the localized named of the extension that was
 # just installed.
@@ -97,6 +126,8 @@ addonInstallErrorBlocklisted=Doplnok %S nebol byť nainštalovaný, pretože je
 # Note, this string will be used as raw markup. Avoid characters like <, >, &
 webextPerms.header=Chcete pridať %S?
 
+# %S is brandShortName
+webextPerms.experimentWarning=Škodlivé doplnky môžu ukradnúť vaše osobné informácie alebo nakaziť váš počítač. Tento doplnok nainštalujte iba ak pochádza z dôveryhodného zdroja.
 webextPerms.unsignedWarning=Upozornenie: Tento doplnok je neoverený. Škodlivé doplnky môžu ukradnúť vaše osobné informácie alebo nakaziť váš počítač. Tento doplnok nainštalujte iba ak pochádza z dôveryhodného zdroja.
 
 # LOCALIZATION NOTE (webextPerms.listIntro)
@@ -165,6 +196,9 @@ webextPerms.description.devtools=Rozšíriť vývojárske nástroje a získať p
 webextPerms.description.dns=Prístup k informáciám o IP adrese a názve hostiteľa
 webextPerms.description.downloads=Preberať súbory a čítať a upravovať históriu prevzatých súborov
 webextPerms.description.downloads.open=Otvárať súbory prevzaté do vášho počítača
+# LOCALIZATION NOTE (webextPerms.description.experiment)
+# %S will be replaced with the name of the application
+webextPerms.description.experiment=Mať úplný, neobmedzený prístup k %Su a k vášmu počítaču
 webextPerms.description.find=Prístup k textu všetkých otvorených kariet
 webextPerms.description.geolocation=Prístup k údajom o polohe
 webextPerms.description.history=Prístup k histórii prehliadania
@@ -229,29 +263,3 @@ webext.remove.confirmation.title=Odstrániť %S
 # %2$S is brandShorterName
 webext.remove.confirmation.message=Odstrániť %1$S z aplikácie %2$S?
 webext.remove.confirmation.button=Odstrániť
-
-# LOCALIZATION NOTE (xpinstallPromptMessage.header)
-# The string contains the hostname of the site the add-on is being installed from.
-xpinstallPromptMessage.header=Allow %S to install an add-on?
-xpinstallPromptMessage.message=You are attempting to install an add-on from %S. Make sure you trust this site before continuing.
-xpinstallPromptMessage.header.unknown=Allow an unknown site to install an add-on?
-xpinstallPromptMessage.message.unknown=You are attempting to install an add-on from an unknown site. Make sure you trust this site before continuing.
-xpinstallPromptMessage.learnMore=Learn more about installing add-ons safely
-xpinstallPromptMessage.neverAllow=Never Allow
-xpinstallPromptMessage.neverAllow.accesskey=N
-# Accessibility Note:
-# Be sure you do not choose an accesskey that is used elsewhere in the active context (e.g. main menu bar, submenu of the warning popup button)
-# See https://website-archive.mozilla.org/www.mozilla.org/access/access/keyboard/ for details
-xpinstallPromptMessage.install=Continue to Installation
-xpinstallPromptMessage.install.accesskey=C
-# LOCALIZATION NOTE (addonInstallBlockedByPolicy)
-# This message is shown when the installation of an add-on is blocked by
-# enterprise policy. %1$S is replaced by the name of the add-on.
-# %2$S is replaced by the ID of add-on. %3$S is a custom message that
-# the administration can add to the message.
-addonInstallBlockedByPolicy=%1$S (%2$S) is blocked by your system administrator.%3$S
-# %S is brandShortName
-webextPerms.experimentWarning=Malicious add-ons can steal your private information or compromise your computer. Only install this add-on if you trust the source.
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd
index c11f880bc263..3bae3bedc44b 100644
--- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd
+++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/customizeToolbar.dtd
@@ -15,8 +15,7 @@
 <!ENTITY addNewToolbar.label      "Pridať nový panel">
 <!ENTITY showTitlebar.label       "Zobraziť panel s titulkom okna">
 <!ENTITY extraDragSpace.label     "Pridať priestor na presunutie">
+<!ENTITY showTitlebar2.label      "Panel s titulkom okna">
+<!ENTITY extraDragSpace2.label    "Priestor na presunutie">
 <!ENTITY saveChanges.label        "Hotovo">
 <!ENTITY undoChanges.label        "Zrušiť zmeny">
-
-<!ENTITY showTitlebar2.label      "Title Bar">
-<!ENTITY extraDragSpace2.label    "Drag Space">
diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties
index a3bbc654aff8..da3f0f632681 100644
--- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/imapMsgs.properties
@@ -166,7 +166,7 @@ imapPersonalSharedFolderTypeDescription=Toto je osobný poštový priečinok. Je
 
 imapPublicFolderTypeDescription=Toto je verejný priečinok.
 
-imapOtherUsersFolderTypeDescription=Toto je poštový priečinok zdieľaný používateľom '%S'.
+imapOtherUsersFolderTypeDescription=Toto je poštový priečinok zdieľaný používateľom „%S“.
 
 imapAclFullRights=Úplná kontrola
 
@@ -199,12 +199,22 @@ imapSubscribePrompt=Chcete sa prihlásiť k odberu priečinka %1$S?
 
 imapServerDroppedConnection=Nepodarilo sa spojiť so serverom IMAP. Je možné, že bol prekročený maximálny povolený počet pripojení na tento server. Pokiaľ k tomu došlo, znížte počet pripojení v dialógovom okne Pokročilé nastavenie servera IMAP.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Informácie o kvóte nie sú k dispozícii, pretože priečinok nie je otvorený.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Tento server nepodporuje kvóty.
 
 imapQuotaStatusNoQuota=Na tomto priečinku nie sú nastavené žiadne kvóty.
 
+# The getqutaroot command succeeded but reported no quota information.
+imapQuotaStatusNoQuota2=Tento priečinok nehlási žiadne informácie o kvóte.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=Informácie o kvóte zatiaľ nie sú k dispozícii.
+
 # Out of memory
 imapOutOfMemory=Aplikácia má nedostatok pamäte.
 
@@ -256,9 +266,3 @@ imapFolderCommandFailed=Práve vykonávaná operácia na priečinku '%2$S' zlyha
 # Place the word %1$S in your translation where the name of the account should appear.
 # Place the word %2$S in your translation where the alert from the server should appear.
 imapServerAlert=Upozornenie z účtu %1$S: %2$S
-
-# The getqutaroot command succeeded but reported no quota information.
-imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties
index e8d9c37ff7b2..dc6c90a3db8f 100644
--- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties
+++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/messenger.properties
@@ -318,6 +318,7 @@ preberaniu veľkých správ.
 
 # accountCentral
 mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat=%2$S %1$S - %3$S
 mailAcctType=Pošta
@@ -465,11 +466,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=Využitých %S z %S
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=Zaplnené: %S%%
 # for quota in main window (commandglue.js)
 percent=%S%%
 quotaTooltip=Kvóta pre IMAP: využitých %S kB z celkovo %S kB. Kliknutím získate ďalšie informácie
 
+quotaTooltip2=Kvóta pre IMAP: využitých %S z celkovo %S. Kliknutím získate ďalšie informácie
+
 # for message views
 confirmViewDeleteTitle=Potvrdenie odstránenia
 confirmViewDeleteMessage=Naozaj chcete odstrániť tento pohľad?
@@ -805,5 +810,3 @@ errorConsoleTitle = Chybová konzola
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = Naspäť
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties
index 6515ec7b2c70..9a622146e112 100644
--- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties
+++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Toto je zašifrovaná správa OpenPGP.<br>Ak ju chcete odšifrovať, musíte si nainštalovať <a href="%S">doplnok OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Toto je správa zašifrovaná pomocou OpenPGP, no podpora pre dešifrovanie OpenPGP nie je k dispozícii.
diff --git a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd
index dd269305e809..13a5df21038e 100644
--- a/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/sk/chrome/sk/locale/sk/messenger/preferences/general.dtd
@@ -43,5 +43,6 @@
 <!ENTITY removeSearchEngine.label         "Odstrániť">
 <!ENTITY removeSearchEngine.accesskey     "i">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
 <!ENTITY minimizeToTray.accesskey         "m">
+
+<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
diff --git a/thunderbird-l10n/sk/localization/sk/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sk/localization/sk/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..d14b01959b9b
--- /dev/null
+++ b/thunderbird-l10n/sk/localization/sk/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Presmerovanie URI kalendára
+calendar-uri-redirect-description =
+    Server presmerováva URI pre kalendár „{ $calendarName }“.
+    Chcete prijať presmerovanie a začať používať nové URI pre tento kalendár?
+calendar-uri-redirect-original-uri-label = Súčasné URI:
+calendar-uri-redirect-target-uri-label = Presmerovanie na nové URI:
diff --git a/thunderbird-l10n/sk/localization/sk/calendar/calendar-widgets.ftl b/thunderbird-l10n/sk/localization/sk/calendar/calendar-widgets.ftl
new file mode 100644
index 000000000000..90caf9765dd5
--- /dev/null
+++ b/thunderbird-l10n/sk/localization/sk/calendar/calendar-widgets.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-deactivated-notification-events = Všetky kalendáre sú v súčasnosti zakázané. Pre pridanie alebo úpravu udalostí povoľte existujúci kalendár alebo pridajte nový.
+calendar-deactivated-notification-tasks = Všetky kalendáre sú v súčasnosti zakázané. Pre pridanie alebo úpravu úloh povoľte existujúci kalendár alebo pridajte nový.
diff --git a/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl
index 601cff3e2022..b65ceb2df659 100644
--- a/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/sk/localization/sk/devtools/client/aboutdebugging.ftl
@@ -153,6 +153,9 @@ about-debugging-runtime-processes =
 # target runtime is incompatible with service workers. "Learn more" points to MDN.
 # https://developer.mozilla.org/en-US/docs/Tools/about%3Adebugging#Service_workers_not_compatible
 about-debugging-runtime-service-workers-not-compatible = Konfigurácia vášho prehliadača nie je kompatibilná so službou Service Workers. <a>Ďalšie informácie</a>
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Táto verzia Firefoxu nemôže ladiť Firefox pre Android (68). Odporúčame vám nainštalovať Firefox pre Android Nightly. <a>Viac podrobností</a>
 # Displayed for runtime info in runtime pages.
 # { $name } is brand name such as "Firefox Nightly"
 # { $version } is version such as "64.0a1"
diff --git a/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl b/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl
index 491131abb831..4911c8903bfe 100644
--- a/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl
+++ b/thunderbird-l10n/sk/localization/sk/devtools/client/tooltips.ftl
@@ -28,20 +28,24 @@ inactive-css-not-grid-item = <strong>{ $property }</strong> nemá na tento prvok
 inactive-css-not-grid-container = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o grid kontajner.
 inactive-css-not-flex-item = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o flex položku.
 inactive-css-not-flex-container = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o flex kontajner.
+inactive-css-not-inline-or-tablecell = <strong>{ $property }</strong> nemá na tento prvok žiadny vplyv, pretože nejde o vložený prvok ani prvok tabuľky.
 
 ## In the Rule View when a CSS property cannot be successfully applied we display
 ## an icon. When this icon is hovered this message is displayed to explain how
 ## the problem can be solved.
 
 inactive-css-not-grid-or-flex-container-fix = Skúste pridať <strong>display:grid</strong> alebo <strong>display:flex</strong>. { learn-more }
-inactive-css-not-grid-or-flex-container-or-multicol-container-fix = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong> alebo <strong>columns:2</strong>. { learn-more }
 inactive-css-not-grid-or-flex-item-fix = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong>, <strong>display:inline-grid</strong> alebo <strong>display:inline-flex</strong>. { learn-more }
 inactive-css-not-grid-item-fix = Skúste pridať <strong>display:grid</strong> alebo <strong>display:inline-grid</strong> do nadradenej položky. { learn-more }
+inactive-css-not-grid-or-flex-container-or-multicol-container-fix = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong> alebo <strong>columns:2</strong>. { learn-more }
 inactive-css-not-grid-or-flex-item-fix-2 = Skúste pridať <strong>display:grid</strong>, <strong>display:flex</strong>, <strong>display:inline-grid</strong> alebo <strong>display:inline-flex</strong>. { learn-more }
+inactive-css-not-grid-item-fix-2 = Skúste pridať <strong>display:grid</strong> alebo <strong>display:inline-grid</strong> do nadradenej položky. { learn-more }
 inactive-css-not-grid-container-fix = Skúste pridať <strong>display:grid</strong> alebo <strong>display:inline-grid</strong>. { learn-more }
 inactive-css-not-flex-item-fix = Skúste pridať <strong>display:flex</strong> alebo <strong>display:inline-flex</strong> do nadradenej položky. { learn-more }
+inactive-css-not-flex-item-fix-2 = Skúste pridať <strong>display:flex</strong> alebo <strong>display:inline-flex</strong> do nadradenej položky. { learn-more }
 inactive-css-not-flex-container-fix = Skúste pridať <strong>display:flex</strong> alebo <strong>display:inline-flex</strong>. { learn-more }
 inactive-css-not-inline-or-tablecell-fix = Skúste pridať <strong>display:inline</strong> alebo <strong>display:table-cell</strong>. { learn-more }
 inactive-css-non-replaced-inline-or-table-row-or-row-group-fix = Skúste pridať <strong>display:inline-block</strong> alebo <strong>display:block</strong>. { learn-more }
 inactive-css-non-replaced-inline-or-table-column-or-column-group-fix = Skúste pridať <strong>display:inline-block</strong>. { learn-more }
 inactive-css-not-display-block-on-floated-fix = Skúste odstrániť <strong>float</strong> alebo pridať <strong>display:block</strong>. { learn-more }
+inactive-text-overflow-when-no-overflow-fix = Skúste pridať <strong>overflow:hidden</strong>. { learn-more }
diff --git a/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl b/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl
index fca3a4b92a22..927a69ff6381 100644
--- a/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/sk/localization/sk/messenger/accountCentral.ftl
@@ -3,6 +3,7 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Víta vás { -brand-full-name }
+account-settings = Nastavenia účtu
 about-title = O aplikácii { -brand-full-name }
 resources-title = Zdroje
 release-notes =
@@ -11,7 +12,14 @@ calendar-label = Kalendár
     .aria-label = Vytvoriť nový kalendár
 filelink-label = Filelink
     .aria-label = Nastaviť Filelink
+import-title = Importovať z inej aplikácie
+import-label = Importovať
+    .aria-label = Importovať údaje z iných aplikácii
+about-paragraph = Thunderbird je dôležitý open source a multiplatformový e-mailový klient s funkciou kalendára, ktorý je zadarmo pre osobné použitie i pre firmy. Chceme, aby ostal bezpečný a neustále sa zlepšoval. Príspevok nám umožní najať vývojárov, zaplatiť za infraštruktúru a pomôže nám rozvíjať sa.
+about-paragraph-2 = <b>Thunderbird je financovaný používateľmi, ako ste vy! Ak máte radi Thunderbird, zvážte poskytnutie príspevku. </b> Najlepším spôsobom, ako zaistiť, že Thunderbird ostane k dispozícii, je
+about-donation = poskytnutie príspevku
 explore-link = Spoznajte funkcie
 support-link = Podpora
 involved-link = Zapojte sa
 developer-link = Dokumentácia pre vývojárov
+e2e = End-to-end šifrovanie
diff --git a/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl
index c3482792fff0..0d2100963ff8 100644
--- a/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl
+++ b/thunderbird-l10n/sk/localization/sk/messenger/preferences/passwordManager.ftl
@@ -68,3 +68,15 @@ remove-all-shown =
 remove-all-passwords-prompt = Naozaj chcete odstrániť všetky heslá?
 remove-all-passwords-title = Odstrániť všetky heslá
 no-master-password-prompt = Naozaj chcete zobraziť svoje heslá?
+
+## OS Authentication dialog
+
+# This message can be seen by trying to show or copy the passwords.
+password-os-auth-dialog-message = Pre zobrazenie uložených hesiel najprv overte svoju totožnosť.
+# This message can be seen by trying to show or copy the passwords.
+# The macOS strings are preceded by the operating system with "Thunderbird is trying to "
+# and includes subtitle of "Enter password for the user "xxx" to allow this." These
+# notes are only valid for English. Please test in your locale.
+password-os-auth-dialog-message-macosx = zobraziť uložené heslá
+# Don't change this label.
+password-os-auth-dialog-caption = { -brand-full-name }
diff --git a/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl b/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl
index ab9c84556f14..4747053aae30 100644
--- a/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl
+++ b/thunderbird-l10n/sk/localization/sk/messenger/preferences/preferences.ftl
@@ -55,3 +55,15 @@ update-in-progress-ok-button = &Zrušiť
 # Continue is the cancel button so pressing escape or using a platform standard
 # method of closing the UI will not discard the update.
 update-in-progress-cancel-button = &Pokračovať
+
+## OS Authentication dialog
+
+# This message can be seen by trying to add a Master Password.
+master-password-os-auth-dialog-message = Pre vytvorenie hlavného hesla najprv overte svoju totožnosť.
+# This message can be seen by trying to add a Master Password.
+# The macOS strings are preceded by the operating system with "Thunderbird is trying to "
+# and includes subtitle of "Enter password for the user "xxx" to allow this." These
+# notes are only valid for English. Please test in your locale.
+master-password-os-auth-dialog-message-macosx = vytvoriť hlavné heslo
+# Don't change this label.
+master-password-os-auth-dialog-caption = { -brand-full-name }
diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl
index 6f7c226ea6e6..43dab3c726c2 100644
--- a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Nainštalovať doplnok zo súboru…
     .accesskey = N
 help-button = Podpora doplnkov
+sidebar-help-button-title =
+    .title = Podpora doplnkov
 preferences =
     { PLATFORM() ->
         [windows] Možnosti aplikácie
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Nástroje pre všetky doplnky
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Možnosti aplikácie
+           *[other] Možnosti aplikácie
+        }
 show-unsigned-extensions-button =
     .label = Niektoré rozšírenia nemohli byť overené
 show-all-extensions-button =
@@ -173,13 +181,29 @@ extensions-view-available-updates =
     .name = Dostupné aktualizácie
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Odporúčania
+addon-category-discover-title =
+    .title = Odporúčania
 addon-category-extension = Rozšírenia
+addon-category-extension-title =
+    .title = Rozšírenia
 addon-category-theme = Témy vzhľadu
+addon-category-theme-title =
+    .title = Témy vzhľadu
 addon-category-plugin = Zásuvné moduly
+addon-category-plugin-title =
+    .title = Zásuvné moduly
 addon-category-dictionary = Slovníky
+addon-category-dictionary-title =
+    .title = Slovníky
 addon-category-locale = Jazyky
+addon-category-locale-title =
+    .title = Jazyky
 addon-category-available-updates = Dostupné aktualizácie
+addon-category-available-updates-title =
+    .title = Dostupné aktualizácie
 addon-category-recent-updates = Nedávno aktualizované
+addon-category-recent-updates-title =
+    .title = Nedávno aktualizované
 
 ## These are global warnings
 
@@ -292,6 +316,7 @@ shortcuts-no-commands = Nasledujúce rozšírenia nemajú skratky:
 shortcuts-input =
     .placeholder = Zadajte klávesovú skratku
 shortcuts-browserAction = Aktivovať rozšírenie
+shortcuts-browserAction2 = Pridať tlačidlo na panel nástrojov
 shortcuts-pageAction = Aktivovať akciu stránky
 shortcuts-sidebarAction = Prepnúť zobrazenie bočného panela
 shortcuts-modifier-mac = Nezabudnite vložiť aj Ctrl, Alt alebo ⌘
@@ -318,6 +343,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Zobraziť menej
 go-back-button =
     .tooltiptext = Späť
+header-back-button =
+    .title = Späť
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl
index 6af91046ef07..a9bf107abdfb 100644
--- a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl
+++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutNetworking.ftl
@@ -9,6 +9,7 @@ ok = OK
 http = HTTP
 sockets = Sockety
 dns = DNS
+dnssuffix = Prípona DNS
 websockets = WebSockety
 refresh = Obnoviť
 auto-refresh = Automaticky obnoviť každé 3 sekundy
@@ -19,11 +20,13 @@ about-networking-title = O spojeniach
 about-networking-http = HTTP
 about-networking-sockets = Sockety
 about-networking-dns = DNS
+about-networking-dns-suffix = Prípona DNS
 about-networking-websockets = WebSockety
 about-networking-refresh = Obnoviť
 about-networking-auto-refresh = Automaticky obnoviť každé 3 sekundy
 about-networking-hostname = Názov servera
 about-networking-port = Port
+about-networking-http-version = Verzia HTTP
 ssl = SSL
 active = Aktívny
 idle = Nečinný
@@ -115,6 +118,10 @@ about-networking-networkid-id = ID siete
 
 ## Link is intended as "network link"
 
+networkid-isUp = Spojenie je aktívne
+networkid-statusKnown = Stav spojenia nie je známy
+about-networking-networkid-is-up = Spojenie je aktívne
+about-networking-networkid-status-known = Stav spojenia je známy
 
 ##
 
diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl
index 606121a1925b..c73c0b3836c7 100644
--- a/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl
+++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/aboutTelemetry.ftl
@@ -128,4 +128,9 @@ about-telemetry-category-header = kategória
 about-telemetry-method-header = metóda
 about-telemetry-object-header = objekt
 about-telemetry-extra-header = extra
+about-telemetry-origin-section = Origin telemetria
+about-telemetry-origin-origin = origin
 about-telemetry-origin-count = počet
+# Variables:
+#  $process (String): type of process in subsection headers ( e.g. "content", "parent" )
+about-telemetry-process = typ procesu: { $process }
diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl
index 105a0d78dfad..7ee887d69b0b 100644
--- a/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/sk/localization/sk/toolkit/about/certviewer.ftl
@@ -95,3 +95,12 @@ certificate-viewer-download-pem = PEM (certifikát)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (reťazec)
     .download = { $fileName }-chain.pem
+certificate-viewer-export = Exportovať
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Vaše certifikáty
+certificate-viewer-tab-people = Ľudia
+certificate-viewer-tab-servers = Servery
+certificate-viewer-tab-ca = Autority
diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl
index 016a550185bf..ba81e90b6859 100644
--- a/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/sk/localization/sk/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Izolovaný webový obsah
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/sk/localization/sk/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sk/localization/sk/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..5193490661d3
--- /dev/null
+++ b/thunderbird-l10n/sk/localization/sk/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Spustili ste staršiu verziu { -brand-product-name }u
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Vytvoriť nový profil
+profiledowngrade-sync = Používaním staršej verzie { -brand-product-name }u môžete poškodiť záložky a históriu prehliadania, ktoré sú uložené vo vašom existujúcom profile. Aby ste svoje údaje ochránili, vytvorte si nový profil pre túto verziu aplikácie { -brand-short-name }. Pomocou účtu { -brand-product-name } sa vždy môžete prihlásiť a zosynchronizovať svoje záložky a históriu prehliadania s ostatnými profilmi.
+profiledowngrade-nosync = Používaním staršej verzie { -brand-product-name }u môžete poškodiť záložky a históriu prehliadania, ktoré sú uložené vo vašom existujúcom profile. Aby ste svoje údaje ochránili, vytvorte si nový profil pre túto verziu aplikácie { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Ukončiť
+           *[other] Ukončiť
+        }
diff --git a/thunderbird-l10n/sk/manifest.json b/thunderbird-l10n/sk/manifest.json
index 144af7b8d2cd..76fe488ae91b 100644
--- a/thunderbird-l10n/sk/manifest.json
+++ b/thunderbird-l10n/sk/manifest.json
@@ -1,57 +1,57 @@
 {
-  "version": "76.0buildid20200407173003",
-  "langpack_id": "sk",
-  "description": "Language pack for Thunderbird for sk",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "id": "langpack-sk@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
+    }
+  },
+  "manifest_version": 2,
+  "name": "Slovak (SK) Language Pack",
+  "author": "Mozilla.sk (contributors: Team Mozilla.sk)",
+  "description": "Language pack for Thunderbird for sk",
   "languages": {
     "sk": {
       "chrome_resources": {
-        "communicator": "chrome/sk/locale/sk/communicator/",
-        "pipnss": "chrome/sk/locale/sk/pipnss/",
-        "messenger-region": "chrome/sk/locale/sk/messenger-region/",
-        "lightning": "chrome/sk/locale/sk/lightning/",
-        "mozapps": "chrome/sk/locale/sk/mozapps/",
-        "pluginproblem": "chrome/sk/locale/sk/pluginproblem/",
-        "places": "chrome/sk/locale/sk/places/",
-        "messenger-newsblog": "chrome/sk/locale/sk/messenger-newsblog/",
-        "branding": "chrome/sk/locale/sk/branding/",
+        "messenger-mapi": "chrome/sk/locale/sk/messenger-mapi/",
         "pippki": "chrome/sk/locale/sk/pippki/",
-        "global": "chrome/sk/locale/sk/global/",
-        "messenger": "chrome/sk/locale/sk/messenger/",
+        "branding": "chrome/sk/locale/sk/branding/",
         "messenger-smime": "chrome/sk/locale/sk/messenger-smime/",
-        "chat": "chrome/sk/locale/sk/chat/",
-        "devtools-shared": "chrome/sk/locale/sk/devtools/shared/",
         "global-platform": {
           "win": "chrome/sk/locale/sk/global-platform/win/",
-          "android": "chrome/sk/locale/sk/global-platform/unix/",
           "linux": "chrome/sk/locale/sk/global-platform/unix/",
-          "macosx": "chrome/sk/locale/sk/global-platform/mac/"
+          "macosx": "chrome/sk/locale/sk/global-platform/mac/",
+          "android": "chrome/sk/locale/sk/global-platform/unix/"
         },
+        "global": "chrome/sk/locale/sk/global/",
+        "chat": "chrome/sk/locale/sk/chat/",
         "passwordmgr": "chrome/sk/locale/sk/passwordmgr/",
+        "lightning": "chrome/sk/locale/sk/lightning/",
+        "devtools-startup": "chrome/sk/locale/sk/devtools/startup/",
+        "mozapps": "chrome/sk/locale/sk/mozapps/",
+        "messenger-region": "chrome/sk/locale/sk/messenger-region/",
+        "messenger": "chrome/sk/locale/sk/messenger/",
         "alerts": "chrome/sk/locale/sk/alerts/",
-        "autoconfig": "chrome/sk/locale/sk/autoconfig/",
-        "messenger-mapi": "chrome/sk/locale/sk/messenger-mapi/",
-        "necko": "chrome/sk/locale/sk/necko/",
+        "devtools-shared": "chrome/sk/locale/sk/devtools/shared/",
+        "pluginproblem": "chrome/sk/locale/sk/pluginproblem/",
         "devtools": "chrome/sk/locale/sk/devtools/client/",
+        "calendar": "chrome/sk/locale/sk/calendar/",
+        "communicator": "chrome/sk/locale/sk/communicator/",
+        "places": "chrome/sk/locale/sk/places/",
+        "pipnss": "chrome/sk/locale/sk/pipnss/",
+        "necko": "chrome/sk/locale/sk/necko/",
         "mozldap": "chrome/sk/locale/sk/mozldap/",
-        "devtools-startup": "chrome/sk/locale/sk/devtools/startup/",
-        "calendar": "chrome/sk/locale/sk/calendar/"
+        "autoconfig": "chrome/sk/locale/sk/autoconfig/",
+        "messenger-newsblog": "chrome/sk/locale/sk/messenger-newsblog/"
       },
-      "version": "20200404140740"
+      "version": "20200418170704"
     }
   },
-  "manifest_version": 2,
-  "author": "Mozilla.sk (contributors: Team Mozilla.sk)",
-  "name": "Slovak (SK) Language Pack",
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*",
-      "id": "langpack-sk@thunderbird.mozilla.org"
-    }
-  }
+  "langpack_id": "sk",
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd
index 5cdfacadc331..b643775ef097 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/calendar/preferences/general.dtd
@@ -16,7 +16,7 @@
 
 <!ENTITY pref.timezones.caption "Časovni pas">
 <!ENTITY pref.timezones.label "Izberite najbližje mesto v svojem časovnem pasu:">
-<!ENTITY pref.timezones.accesskey "z">
+<!ENTITY pref.timezones.accesskey "s">
 
 <!ENTITY pref.defaults.label "Privzete vrednosti za nove predmete">
 <!ENTITY pref.events.label "Dogodki">
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties
index 4e05532b9c6a..4fa46bb31772 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      razmejevalec
 tabPanel     =      plošča z zavihki
 # The roleDescription for the html:mark element
 highlight = označi
-
 # The roleDescription for the details element
-details = details
+details = podrobnosti
 # The roleDescription for the summary element
-summary = summary
+summary = povzetek
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties
index 81682742abee..4e61846ea01f 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/addons.properties
@@ -198,6 +198,7 @@ webextPerms.description.downloads=prenašanje datotek ter branje in spreminjanje
 webextPerms.description.downloads.open=odpiranje datotek, prenesenih na vaš računalnik
 # LOCALIZATION NOTE (webextPerms.description.experiment)
 # %S will be replaced with the name of the application
+webextPerms.description.experiment=popoln, neomejen dostop do %Sa in vašega računalnika
 webextPerms.description.find=branje besedila vseh odprtih zavihkov
 webextPerms.description.geolocation=dostop do vaše lokacije
 webextPerms.description.history=dostop do zgodovine brskanja
@@ -262,7 +263,3 @@ webext.remove.confirmation.title=Odstrani %S
 # %2$S is brandShorterName
 webext.remove.confirmation.message=Odstrani %1$S iz %2$Sa?
 webext.remove.confirmation.button=Odstrani
-
-# LOCALIZATION NOTE (webextPerms.description.experiment)
-# %S will be replaced with the name of the application
-webextPerms.description.experiment=Have full, unrestricted access to %S, and your computer
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd
index 680b3bcae954..d35b75fd6fe4 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/am-smime.dtd
@@ -54,6 +54,7 @@
 
 
 <!ENTITY openpgpKeys.label "OpenPGP">
+<!ENTITY manageKeys.label "Upravljaj ključe OpenPGP">
 
 <!-- Strings for the cert picker dialog -->
 <!ENTITY certPicker.title "Izberite potrdilo">
@@ -74,5 +75,4 @@
 <!ENTITY manageDevices2.accesskey "y">
 <!ENTITY technologySMIME.label "Prefer S/MIME">
 <!ENTITY technologyOpenPGP.label "Prefer OpenPGP">
-<!ENTITY manageKeys.label "Manage OpenPGP Keys">
 <!ENTITY manageKeys.accesskey "K">
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties
index d696295b0d97..e78be47e2aff 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/imapMsgs.properties
@@ -199,12 +199,21 @@ imapSubscribePrompt=Bi se radi naročili na %1$S?
 
 imapServerDroppedConnection=Povezava z vašim strežnikom IMAP ni mogoča. Morda ste presegli največje dovoljeno število povezav na ta strežnik. V tem primeru uporabite pogovorno okno za napredne nastavitve strežnika IMAP in znižajte število povezav v predpomnilniku.
 
+# This will occur when a folder that has never been imap selected or opened
+# (left-clicked) is first right-clicked to access quota properties.
 imapQuotaStatusFolderNotOpen=Podatek o količinski omejitvi ni na razpolago, ker mapa ni odprta.
 
+# The imap capability response reports that QUOTA is not supported.
 imapQuotaStatusNotSupported=Ta strežnik ne podpira količinskih omejitev.
 
 imapQuotaStatusNoQuota=V tej mapi ni količinskih omejitev za shrambo.
 
+# The getqutaroot command succeeded but reported no quota information.
+
+# Folder properties were requested by the user (right-click) before the getquotaroot
+# command was sent.
+imapQuotaStatusInProgress=Podatki o količinski omejitvi še niso na voljo.
+
 # Out of memory
 imapOutOfMemory=Programu je zmanjkalo pomnilnika.
 
@@ -259,6 +268,3 @@ imapServerAlert=Račun %1$S opozarja: %2$S
 
 # The getqutaroot command succeeded but reported no quota information.
 imapQuotaStatusNoQuota2=This folder reports no quota information.
-# Folder properties were requested by the user (right-click) before the getquotaroot
-# command was sent.
-imapQuotaStatusInProgress=Quota information not yet available.
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd
index d609f9b7a556..3a67dd5d5310 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.dtd
@@ -289,6 +289,7 @@
 <!ENTITY searchMailCmd.label "Išči po sporočilih …">
 <!ENTITY searchMailCmd.accesskey "s">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Splošno iskanje …">
 <!ENTITY searchAddressesCmd.label "Išči po naslovih …">
 <!ENTITY searchAddressesCmd.accesskey "n">
 
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties
index 319b228875d8..0bda7a1ed980 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/messenger.properties
@@ -311,6 +311,7 @@ nocachedbodybody2=Telo tega sporočila ni bilo naloženo iz strežnika, tako da
 
 # accountCentral
 mailnews.account_central_page.url=chrome://messenger/content/msgAccountCentral.xul
+
 # LOCALIZATION NOTE(acctCentralTitleFormat): %1$S is brand, %2$S is account type, %3$S is account name
 acctCentralTitleFormat=%1$S %2$S - %3$S
 mailAcctType=Pošta
@@ -458,11 +459,15 @@ macBiffNotification_separator=,\u0020
 
 # For the Quota tab in the mail folder properties dialog
 quotaUsedFree=uporabljeno %S od %S kB
+
+# For the Quota tab in the mail folder properties dialog
 quotaPercentUsed=Zasedenost: %S%%
 # for quota in main window (commandglue.js)
 percent=%S%%
 quotaTooltip=Količinska omejitev IMAP: porabljeno %S kB od skupno %S kB. Kliknite za podrobnosti.
 
+quotaTooltip2=Količinska omejitev IMAP: porabljeno %S od skupno %S. Kliknite za podrobnosti.
+
 # for message views
 confirmViewDeleteTitle=Potrdi
 confirmViewDeleteMessage=Ali res želite izbrisati ta pogled?
@@ -798,5 +803,3 @@ errorConsoleTitle = Konzola napak
 # This is used by screen readers to label the "back" button in various browser
 # popup panels, including the sliding subviews of the appmenu.
 panel.back = Nazaj
-
-quotaTooltip2=IMAP quota: %S used of %S total. Click for details.
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties
index d0688be7767a..f1141bc88bae 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=To sporočilo je šifrirano z OpenPGP.<br>Za dešifriranje te pošte morate namestiti <a href="%S">dodatek Enigmail</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=To sporočilo je šifrirano z OpenPGP, vendar podpora za dešifriranje OpenPGP ni na voljo.
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd
index 9a1711549122..474b17316056 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/chat.dtd
@@ -51,7 +51,7 @@ sentence. -->
 <!ENTITY messageStyleTheme.label           "Tema:">
 <!ENTITY messageStyleTheme.accesskey       "T">
 <!ENTITY messageStyleThunderbirdTheme.label "Thunderbird">
-<!ENTITY messageStyleBubblesTheme.label    "Mehurčki">
+<!ENTITY messageStyleBubblesTheme.label    "Oblački">
 <!ENTITY messageStyleDarkTheme.label       "Temno">
 <!ENTITY messageStylePaperSheetsTheme.label "Listi papirja">
 <!ENTITY messageStyleSimpleTheme.label     "Preprosto">
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd
index 371240379a4d..4bf327d9893e 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/messenger/preferences/general.dtd
@@ -43,5 +43,5 @@
 <!ENTITY removeSearchEngine.label         "Odstrani">
 <!ENTITY removeSearchEngine.accesskey     "s">
 
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
+<!ENTITY minimizeToTray.label             "Ob pomanjšanju premakni &brandShortName; v pladenj opravilne vrstice">
 <!ENTITY minimizeToTray.accesskey         "m">
diff --git a/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties b/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties
index f6dac14f88d2..87451aaaf332 100644
--- a/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties
+++ b/thunderbird-l10n/sl/chrome/sl/locale/sl/necko/necko.properties
@@ -57,22 +57,21 @@ CookieAllowedForOriginOnTrackerByHeuristic=Dostop do shrambe samodejno odobren 
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Dostop do shrambe samodejno odobren sledilcu “%2$S” na “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
+CookieRejectedNonRequiresSecure=Piškotek “%1$S” je zavrnjen, ker ima atribut “sameSite=none”, vendar manjka atribut “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
+CookieRejectedNonRequiresSecureForBeta=Piškotek “%1$S” bo kmalu zavrnjen, ker ima atribut “sameSite” nastavljen na “none” ali neveljavno vrednost brez atributa “secure”. Za več informacij o atributu “sameSite“ glejte %2$S
 # LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax".
+CookieLaxForced=Piškotek “%1$S” ima pravilnik “sameSite” nastavljen na “lax”, ker manjka atribut “sameSite”, “sameSite=lax” pa je njegova privzeta vrednost.
 # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none".
 # LOCALIZATION NOTE: %1$S is cookie name. Do not localize "sameSite", "lax", "strict" and "none"
 CookieSameSiteValueInvalid=Neveljavna vrednost “sameSite“ za piškotek “%1$S”. Podprte vrednosti so : “lax“, “strict“, “none“.
+# LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
+CookieOversize=Piškotek “%1$S” je neveljaven, ker je njegova velikost prevelika. Največja velikost je %2$S B.
+# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
+CookiePathOversize=Piškotek “%1$S” je neveljaven, ker je velikost njegove poti prevelika. Največja velikost je %2$S B.
 
-# LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
-CookieRejectedNonRequiresSecure=Cookie “%1$S” rejected because it has the “sameSite=none” attribute but is missing the “secure” attribute.
-# LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
-CookieRejectedNonRequiresSecureForBeta=Cookie “%1$S” will be soon rejected because it has the “sameSite” attribute set to “none” or an invalid value, without the “secure” attribute. To know more about the “sameSite“ attribute, read %2$S
-# LOCALIZATION NOTE(CookieLaxForced): %1$S is the cookie name. Do not localize "sameSite", "lax" and "sameSite=lax".
-CookieLaxForced=Cookie “%1$S” has “sameSite” policy set to “lax” because it is missing a “sameSite” attribute, and “sameSite=lax” is the default value for this attribute.
 # LOCALIZATION NOTE(CookieLaxForcedForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "lax" and "sameSite=lax", "sameSite=none".
 CookieLaxForcedForBeta=Cookie “%1$S” does not have a proper “sameSite” attribute value. Soon, cookies without the “sameSite” attribute or with an invalid value will be treated as “lax”. This means that the cookie will no longer be sent in third-party contexts. If your application depends on this cookie being available in such contexts, please add the “sameSite=none“ attribute to it. To know more about the “sameSite“ attribute, read %2$S
-# LOCALIZATION NOTE (CookieOversize): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookieOversize=Cookie “%1$S” is invalid because its size is too big. Max size is %2$S B.
-# LOCALIZATION NOTE (CookiePathOversiz): %1$S is the cookie name. %2$S is the number of bytes. "B" means bytes.
-CookiePathOversize=Cookie “%1$S” is invalid because its path size is too big. Max size is %2$S B.
diff --git a/thunderbird-l10n/sl/localization/sl/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sl/localization/sl/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..71bc3cb9cff0
--- /dev/null
+++ b/thunderbird-l10n/sl/localization/sl/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-uri-redirect-original-uri-label = Trenutni URI:
+calendar-uri-redirect-target-uri-label = Preusmerjanje na novi URI:
diff --git a/thunderbird-l10n/sl/localization/sl/calendar/calendar-widgets.ftl b/thunderbird-l10n/sl/localization/sl/calendar/calendar-widgets.ftl
new file mode 100644
index 000000000000..d27dd3e86bfe
--- /dev/null
+++ b/thunderbird-l10n/sl/localization/sl/calendar/calendar-widgets.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-deactivated-notification-events = Vsi koledarji so trenutno onemogočeni. Za ustvarjanje in urejanje dogodkov omogočite obstoječi koledar ali dodajte novega.
+calendar-deactivated-notification-tasks = Vsi koledarji so trenutno onemogočeni. Za ustvarjanje in urejanje opravil omogočite obstoječi koledar ali dodajte novega.
diff --git a/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl b/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl
index 418414f8b5fb..4f29daf81ec5 100644
--- a/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/sl/localization/sl/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Dobrodošli v { -brand-full-name }
+account-settings = Nastavitve računa
+#   $accounts (Number) - the number of configured accounts
 setup-title = Izberite, kaj nastaviti
 about-title = O { -brand-full-name }u
 resources-title = Viri
@@ -10,6 +12,17 @@ release-notes =
     .title = O { -brand-full-name }u
 email-label = E-pošta
     .aria-label = Poveži z obstoječim e-poštnim računom
+calendar-label = Koledar
+    .aria-label = Ustvari nov koledar
+chat-label = Klepet
+    .aria-label = Poveži račun za klepet
+filelink-label = Filelink
+    .aria-label = Nastavi Filelink
+addressbook-label = Imenik
+    .aria-label = Ustvari nov imenik
+import-title = Uvozi iz drugega programa
+import-label = Uvozi
+    .aria-label = Uvozi podatke iz drugih programov
 about-paragraph = Thunderbird je vodilni odprtokodni odjemalec za e-pošto in koledar, ki deluje v več okoljih ter je brezplačen tako za poslovno kot za osebno uporabo. Želimo, da ostane varen in postane še boljši. Donacija nam bo omogočala najeti razvijalce, plačati stroške infrastrukture in nadaljevati izboljševanje.
 explore-link = Raziščite možnosti
 support-link = Podpora
diff --git a/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl b/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl
index 2e2a70acc667..0fa47a2023f3 100644
--- a/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl
+++ b/thunderbird-l10n/sl/localization/sl/messenger/preferences/passwordManager.ftl
@@ -71,5 +71,7 @@ no-master-password-prompt = Ali ste prepričani, da želite pokazati svoja gesla
 
 ## OS Authentication dialog
 
+# This message can be seen by trying to show or copy the passwords.
+password-os-auth-dialog-message = Potrdite svojo identiteto za prikaz shranjenih gesel.
 # Don't change this label.
 password-os-auth-dialog-caption = { -brand-full-name }
diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl
index 669e07382542..5dd50862c701 100644
--- a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Namesti dodatek iz datoteke …
     .accesskey = I
 help-button = Podpora za dodatke
+sidebar-help-button-title =
+    .title = Podpora za dodatke
 preferences =
     { PLATFORM() ->
         [windows] Možnosti { -brand-short-name }a
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Orodja za vse dodatke
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Možnosti { -brand-short-name }a
+           *[other] Nastavitve { -brand-short-name }a
+        }
 show-unsigned-extensions-button =
     .label = Nekaterih razširitev ni bilo mogoče potrditi
 show-all-extensions-button =
@@ -169,13 +177,29 @@ extensions-view-available-updates =
     .name = Nove posodobitve
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Priporočila
+addon-category-discover-title =
+    .title = Priporočila
 addon-category-extension = Razširitve
+addon-category-extension-title =
+    .title = Razširitve
 addon-category-theme = Teme
+addon-category-theme-title =
+    .title = Teme
 addon-category-plugin = Vtičniki
+addon-category-plugin-title =
+    .title = Vtičniki
 addon-category-dictionary = Slovarji
+addon-category-dictionary-title =
+    .title = Slovarji
 addon-category-locale = Jeziki
+addon-category-locale-title =
+    .title = Jeziki
 addon-category-available-updates = Nove posodobitve
+addon-category-available-updates-title =
+    .title = Nove posodobitve
 addon-category-recent-updates = Nedavne posodobitve
+addon-category-recent-updates-title =
+    .title = Nedavne posodobitve
 
 ## These are global warnings
 
@@ -288,6 +312,7 @@ shortcuts-no-commands = Naslednje razširitve nimajo dodeljenih bližnjic:
 shortcuts-input =
     .placeholder = Vnesite bližnjico
 shortcuts-browserAction = Aktiviraj razširitev
+shortcuts-browserAction2 = Aktiviraj gumb orodne vrstice
 shortcuts-pageAction = Aktiviraj dejanje strani
 shortcuts-sidebarAction = Preklopi stransko vrstico
 shortcuts-modifier-mac = Vključi Ctrl, Alt ali ⌘
@@ -315,6 +340,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Prikaži manj
 go-back-button =
     .tooltiptext = Nazaj
+header-back-button =
+    .title = Nazaj
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl
index bbbe0760975f..40054f67e2cb 100644
--- a/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/sl/localization/sl/toolkit/about/aboutSupport.ftl
@@ -300,6 +300,11 @@ sandbox-proc-type-content = vsebina
 sandbox-proc-type-file = vsebina datoteke
 sandbox-proc-type-media-plugin = večpredstavni vtičnik
 sandbox-proc-type-data-decoder = podatkovni dekodirnik
+startup-cache-title = Predpomnilnik zagona
+startup-cache-disk-cache-path = Pot predpomnilnika diska
+startup-cache-ignore-disk-cache = Prezri predpomnilnik diska
+startup-cache-found-disk-cache-on-init = Najden predpomnilnik diska ob inicializaciji
+startup-cache-wrote-to-disk-cache = Zapisano v predpomnilnik diska
 launcher-process-status-0 = Omogočeno
 launcher-process-status-1 = Onemogočeno zaradi napake
 launcher-process-status-2 = Prisilno onemogočeno
@@ -323,6 +328,7 @@ touch-enabled = vnos na dotik omogočen
 drag-enabled = vlečenje drsnika omogočeno
 keyboard-enabled = tipkovnica omogočena
 autoscroll-enabled = samodrsenje omogočeno
+zooming-enabled = omogočeno gladko povečanje s približevanjem prstov
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl
index cc6fd10fa5ad..48a5ff627ff1 100644
--- a/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/sl/localization/sl/toolkit/about/certviewer.ftl
@@ -29,6 +29,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Skupina izmenjave ključev
 certificate-viewer-key-id = ID ključa
 certificate-viewer-key-size = Velikost ključa
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Kraj registracije
 certificate-viewer-locality = Kraj
 certificate-viewer-location = Lokacija
 certificate-viewer-logid = ID dnevnika
@@ -48,7 +50,7 @@ certificate-viewer-qualifiers = Kvalifikatorji
 certificate-viewer-required = Zahtevano
 certificate-viewer-unsupported = &lt;nepodprto&gt;
 # Inc. means Incorporated, e.g GitHub is incorporated in Delaware
-certificate-viewer-inc-state-province = Država/območje
+certificate-viewer-inc-state-province = Država/območje registracije
 certificate-viewer-state-province = Država/območje
 certificate-viewer-sha-1 = SHA-1
 certificate-viewer-sha-256 = SHA-256
@@ -95,3 +97,16 @@ certificate-viewer-download-pem = PEM (potrdilo)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (veriga)
     .download = { $fileName }-veriga.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Ta razširitev je bila označena kot kritična, kar pomeni, da morajo uporabniki zavrniti potrdilo, če ga ne razumejo.
+certificate-viewer-export = Izvozi
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Vaša digitalna potrdila
+certificate-viewer-tab-people = Ljudje
+certificate-viewer-tab-servers = Strežniki
+certificate-viewer-tab-ca = Overitelji
+certificate-viewer-tab-unkonwn = Neznano
diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl
index 082530f809de..ee6117b6257d 100644
--- a/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/sl/localization/sl/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Ločena spletna vsebina
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPE
+# process used to perform network operations
+process-type-socket = Vtičnica
diff --git a/thunderbird-l10n/sl/localization/sl/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sl/localization/sl/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..a20ffe35dd6a
--- /dev/null
+++ b/thunderbird-l10n/sl/localization/sl/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Zagnali ste starejšo različico { -brand-product-name }a
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Ustvari nov profil
+profiledowngrade-sync = Uporaba starejše različice { -brand-product-name }a lahko pokvari zgodovino brskanja in zaznamke, ki so že shranjeni v obstoječem { -brand-product-name }ovem profilu. Za zaščito svojih podatkov ustvarite nov profil za to namestitev { -brand-short-name }a. Svoje podatke lahko ohranite usklajene v vseh profilih s pomočjo { -fxaccount-brand-name }a.
+profiledowngrade-nosync = Uporaba starejše različice { -brand-product-name }a lahko pokvari zgodovino brskanja in zaznamke, ki so že shranjeni v obstoječem { -brand-product-name }ovem profilu. Za zaščito svojih podatkov ustvarite nov profil za to namestitev { -brand-short-name }a.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Izhod
+           *[other] Izhod
+        }
diff --git a/thunderbird-l10n/sl/manifest.json b/thunderbird-l10n/sl/manifest.json
index 0ea2dc5a754c..0c588667479c 100644
--- a/thunderbird-l10n/sl/manifest.json
+++ b/thunderbird-l10n/sl/manifest.json
@@ -1,57 +1,57 @@
 {
-  "langpack_id": "sl",
-  "author": "mozilla.org (contributors: Peter Klofutar, Vito Smolej)",
-  "name": "Slovenski jezik Language Pack",
-  "version": "76.0buildid20200407173003",
-  "description": "Language pack for Thunderbird for sl",
-  "applications": {
-    "gecko": {
-      "id": "langpack-sl@thunderbird.mozilla.org",
-      "strict_max_version": "76.*",
-      "strict_min_version": "76.0"
-    }
-  },
+  "manifest_version": 2,
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
+  "langpack_id": "sl",
+  "author": "mozilla.org (contributors: Peter Klofutar, Vito Smolej)",
   "languages": {
     "sl": {
       "chrome_resources": {
-        "mozapps": "chrome/sl/locale/sl/mozapps/",
-        "branding": "chrome/sl/locale/sl/branding/",
-        "places": "chrome/sl/locale/sl/places/",
+        "devtools": "chrome/sl/locale/sl/devtools/client/",
+        "necko": "chrome/sl/locale/sl/necko/",
+        "alerts": "chrome/sl/locale/sl/alerts/",
+        "messenger": "chrome/sl/locale/sl/messenger/",
         "messenger-newsblog": "chrome/sl/locale/sl/messenger-newsblog/",
+        "lightning": "chrome/sl/locale/sl/lightning/",
+        "devtools-startup": "chrome/sl/locale/sl/devtools/startup/",
+        "mozapps": "chrome/sl/locale/sl/mozapps/",
+        "communicator": "chrome/sl/locale/sl/communicator/",
+        "pipnss": "chrome/sl/locale/sl/pipnss/",
         "global-platform": {
           "android": "chrome/sl/locale/sl/global-platform/unix/",
-          "macosx": "chrome/sl/locale/sl/global-platform/mac/",
+          "win": "chrome/sl/locale/sl/global-platform/win/",
           "linux": "chrome/sl/locale/sl/global-platform/unix/",
-          "win": "chrome/sl/locale/sl/global-platform/win/"
+          "macosx": "chrome/sl/locale/sl/global-platform/mac/"
         },
-        "communicator": "chrome/sl/locale/sl/communicator/",
-        "alerts": "chrome/sl/locale/sl/alerts/",
-        "necko": "chrome/sl/locale/sl/necko/",
-        "calendar": "chrome/sl/locale/sl/calendar/",
-        "chat": "chrome/sl/locale/sl/chat/",
-        "pluginproblem": "chrome/sl/locale/sl/pluginproblem/",
-        "global": "chrome/sl/locale/sl/global/",
-        "messenger": "chrome/sl/locale/sl/messenger/",
-        "passwordmgr": "chrome/sl/locale/sl/passwordmgr/",
-        "mozldap": "chrome/sl/locale/sl/mozldap/",
+        "messenger-smime": "chrome/sl/locale/sl/messenger-smime/",
+        "branding": "chrome/sl/locale/sl/branding/",
+        "messenger-mapi": "chrome/sl/locale/sl/messenger-mapi/",
         "devtools-shared": "chrome/sl/locale/sl/devtools/shared/",
+        "passwordmgr": "chrome/sl/locale/sl/passwordmgr/",
+        "autoconfig": "chrome/sl/locale/sl/autoconfig/",
         "pippki": "chrome/sl/locale/sl/pippki/",
+        "chat": "chrome/sl/locale/sl/chat/",
+        "places": "chrome/sl/locale/sl/places/",
+        "calendar": "chrome/sl/locale/sl/calendar/",
         "messenger-region": "chrome/sl/locale/sl/messenger-region/",
-        "messenger-mapi": "chrome/sl/locale/sl/messenger-mapi/",
-        "pipnss": "chrome/sl/locale/sl/pipnss/",
-        "messenger-smime": "chrome/sl/locale/sl/messenger-smime/",
-        "devtools-startup": "chrome/sl/locale/sl/devtools/startup/",
-        "devtools": "chrome/sl/locale/sl/devtools/client/",
-        "autoconfig": "chrome/sl/locale/sl/autoconfig/",
-        "lightning": "chrome/sl/locale/sl/lightning/"
+        "mozldap": "chrome/sl/locale/sl/mozldap/",
+        "pluginproblem": "chrome/sl/locale/sl/pluginproblem/",
+        "global": "chrome/sl/locale/sl/global/"
       },
-      "version": "20200404140654"
+      "version": "20200420100552"
+    }
+  },
+  "description": "Language pack for Thunderbird for sl",
+  "name": "Slovenski jezik Language Pack",
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "strict_max_version": "76.*",
+      "id": "langpack-sl@thunderbird.mozilla.org"
     }
   },
-  "manifest_version": 2
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl
index b0a7960014e5..d5836a4cda3a 100644
--- a/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/sq/localization/sq/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Instaloni Shtesë Prej Kartele…
     .accesskey = I
 help-button = Asistencë Shtesash
+sidebar-help-button-title =
+    .title = Asistencë Shtesash
 preferences =
     { PLATFORM() ->
         [windows] Mundësi { -brand-short-name }-i
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Mjete për krejt shtesat
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Mundësi { -brand-short-name }-i
+           *[other] Parapëlqime { -brand-short-name }-i
+        }
 show-unsigned-extensions-button =
     .label = Disa nga shtesat nuk u verifikuan dot
 show-all-extensions-button =
@@ -166,13 +174,29 @@ extensions-view-available-updates =
     .name = Përditësime të Gatshme
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Rekomandime
+addon-category-discover-title =
+    .title = Rekomandime
 addon-category-extension = Zgjerime
+addon-category-extension-title =
+    .title = Zgjerime
 addon-category-theme = Tema
+addon-category-theme-title =
+    .title = Tema
 addon-category-plugin = Shtojca
+addon-category-plugin-title =
+    .title = Shtojca
 addon-category-dictionary = Fjalorë
+addon-category-dictionary-title =
+    .title = Fjalorë
 addon-category-locale = Gjuhë
+addon-category-locale-title =
+    .title = Gjuhë
 addon-category-available-updates = Përditësime të Gatshme
+addon-category-available-updates-title =
+    .title = Përditësime të Gatshme
 addon-category-recent-updates = Përditësime Së Fundi
+addon-category-recent-updates-title =
+    .title = Përditësime Së Fundi
 
 ## These are global warnings
 
@@ -310,6 +334,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Shfaq Më Pak
 go-back-button =
     .tooltiptext = Kthehuni mbrapsht
+header-back-button =
+    .title = Kthehuni mbrapsht
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/sq/localization/sq/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sq/localization/sq/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..b5cd71f4a96e
--- /dev/null
+++ b/thunderbird-l10n/sq/localization/sq/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Nisët një version të vjetër të { -brand-product-name }-it
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Krijoni Profil të Ri
+profiledowngrade-sync = Përdorimi i një versioni të vjetër të { -brand-product-name }-it mund të dëmtojë faqerojtës dhe historik shfletimi të ruajtur tashmë në një profil ekzistues të { -brand-product-name }-it. Që të mbroni të dhënat tuaja, krijoni një profil të ri për këtë instalim të { -brand-short-name }-it. Mundeni përherë të bëni hyrjen me një { -fxaccount-brand-name } për të kryer njëkohësim faqerojtësish dhe historiku shfletimesh mes profileve tuaj.
+profiledowngrade-nosync = Përdorimi i një versioni të vjetër të { -brand-product-name }-it mund të dëmtojë faqerojtës dhe historik shfletimi të ruajtur tashmë në një profil ekzistues të { -brand-product-name }-it. Që të mbroni të dhënat tuaja, krijoni një profil të ri për këtë instalim të { -brand-short-name }-it.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Dilni
+           *[other] Dilni
+        }
diff --git a/thunderbird-l10n/sq/manifest.json b/thunderbird-l10n/sq/manifest.json
index 121401e81f95..806d5b87aa54 100644
--- a/thunderbird-l10n/sq/manifest.json
+++ b/thunderbird-l10n/sq/manifest.json
@@ -1,57 +1,57 @@
 {
+  "author": "Besnik Bleta (contributors: Besnik Bleta)",
+  "version": "76.0buildid20200420212409",
+  "manifest_version": 2,
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
   "name": "Shqip Language Pack",
-  "langpack_id": "sq",
-  "description": "Language pack for Thunderbird for sq",
-  "manifest_version": 2,
-  "applications": {
-    "gecko": {
-      "id": "langpack-sq@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
   "languages": {
     "sq": {
-      "version": "20200403080516",
+      "version": "20200415061226",
       "chrome_resources": {
-        "devtools": "chrome/sq/locale/sq/devtools/client/",
-        "alerts": "chrome/sq/locale/sq/alerts/",
         "lightning": "chrome/sq/locale/sq/lightning/",
-        "pluginproblem": "chrome/sq/locale/sq/pluginproblem/",
-        "pippki": "chrome/sq/locale/sq/pippki/",
-        "passwordmgr": "chrome/sq/locale/sq/passwordmgr/",
+        "mozapps": "chrome/sq/locale/sq/mozapps/",
+        "messenger-newsblog": "chrome/sq/locale/sq/messenger-newsblog/",
+        "global": "chrome/sq/locale/sq/global/",
+        "calendar": "chrome/sq/locale/sq/calendar/",
         "messenger": "chrome/sq/locale/sq/messenger/",
         "global-platform": {
           "linux": "chrome/sq/locale/sq/global-platform/unix/",
+          "win": "chrome/sq/locale/sq/global-platform/win/",
           "android": "chrome/sq/locale/sq/global-platform/unix/",
-          "macosx": "chrome/sq/locale/sq/global-platform/mac/",
-          "win": "chrome/sq/locale/sq/global-platform/win/"
+          "macosx": "chrome/sq/locale/sq/global-platform/mac/"
         },
-        "messenger-smime": "chrome/sq/locale/sq/messenger-smime/",
-        "autoconfig": "chrome/sq/locale/sq/autoconfig/",
-        "calendar": "chrome/sq/locale/sq/calendar/",
-        "global": "chrome/sq/locale/sq/global/",
-        "messenger-newsblog": "chrome/sq/locale/sq/messenger-newsblog/",
-        "communicator": "chrome/sq/locale/sq/communicator/",
         "mozldap": "chrome/sq/locale/sq/mozldap/",
-        "branding": "chrome/sq/locale/sq/branding/",
-        "messenger-mapi": "chrome/sq/locale/sq/messenger-mapi/",
-        "devtools-shared": "chrome/sq/locale/sq/devtools/shared/",
+        "pippki": "chrome/sq/locale/sq/pippki/",
         "chat": "chrome/sq/locale/sq/chat/",
-        "devtools-startup": "chrome/sq/locale/sq/devtools/startup/",
-        "messenger-region": "chrome/sq/locale/sq/messenger-region/",
         "necko": "chrome/sq/locale/sq/necko/",
-        "places": "chrome/sq/locale/sq/places/",
+        "messenger-region": "chrome/sq/locale/sq/messenger-region/",
+        "devtools": "chrome/sq/locale/sq/devtools/client/",
+        "alerts": "chrome/sq/locale/sq/alerts/",
+        "branding": "chrome/sq/locale/sq/branding/",
+        "autoconfig": "chrome/sq/locale/sq/autoconfig/",
         "pipnss": "chrome/sq/locale/sq/pipnss/",
-        "mozapps": "chrome/sq/locale/sq/mozapps/"
+        "devtools-startup": "chrome/sq/locale/sq/devtools/startup/",
+        "communicator": "chrome/sq/locale/sq/communicator/",
+        "pluginproblem": "chrome/sq/locale/sq/pluginproblem/",
+        "devtools-shared": "chrome/sq/locale/sq/devtools/shared/",
+        "passwordmgr": "chrome/sq/locale/sq/passwordmgr/",
+        "places": "chrome/sq/locale/sq/places/",
+        "messenger-smime": "chrome/sq/locale/sq/messenger-smime/",
+        "messenger-mapi": "chrome/sq/locale/sq/messenger-mapi/"
       }
     }
   },
-  "author": "Besnik Bleta (contributors: Besnik Bleta)",
-  "version": "76.0buildid20200407173003"
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "id": "langpack-sq@thunderbird.mozilla.org",
+      "strict_max_version": "76.*"
+    }
+  },
+  "description": "Language pack for Thunderbird for sq",
+  "langpack_id": "sq"
 }
diff --git a/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties b/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties
index 96bc569a2313..6b55185f554c 100644
--- a/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties
+++ b/thunderbird-l10n/sr/chrome/sr/locale/sr/devtools/client/accessibility.properties
@@ -275,6 +275,7 @@ accessibility.documentation.label=Documentation…
 # LOCALIZATION NOTE (accessibility.simulation): A title text for the toolbar
 # within the main accessibility panel that contains a list of simulations for
 # vision deficiencies.
+accessibility.simulation=Симулирај:
 
 # LOCALIZATION NOTE (accessibility.simulation.deuteranomaly): This label is shown
 # in the "Simulate" menu in the accessibility panel and represent the deuteranomaly simulation option.
@@ -318,10 +319,6 @@ accessibility.badge.keyboard=keyboard
 # accessible row in the accessibility tree for a given accessible object that
 # does not satisfy the WCAG guideline for keyboard accessibility.
 accessibility.badge.keyboard.tooltip=Does not meet WCAG standards for keyboard accessibility.
-# LOCALIZATION NOTE (accessibility.simulation): A title text for the toolbar
-# within the main accessibility panel that contains a list of simulations for
-# vision deficiencies.
-accessibility.simulation=Simulate:
 # LOCALIZATION NOTE (accessibility.simulation.deuteranomaly): This label is shown
 # in the "Simulate" menu in the accessibility panel and represent the deuteranomaly simulation option.
 accessibility.simulation.deuteranomaly=Deuteranomaly (low green)
diff --git a/thunderbird-l10n/sr/localization/sr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sr/localization/sr/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..dc068e0e25c5
--- /dev/null
+++ b/thunderbird-l10n/sr/localization/sr/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Преусмеравање URI календара
+calendar-uri-redirect-description =
+    Сервер преусмерава URI за календар "{ $calendarName }".
+    Прихватити преусмеравање и почетак коришћења новог URI за овај календар?
+calendar-uri-redirect-original-uri-label = Тренутни URI:
+calendar-uri-redirect-target-uri-label = Преусмеравање на нови URI:
diff --git a/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl
index c05008deba81..44b3eb9d3608 100644
--- a/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/sr/localization/sr/devtools/client/aboutdebugging.ftl
@@ -154,7 +154,7 @@ about-debugging-runtime-extensions =
     .name = Extensions
 # Title of the tabs category.
 about-debugging-runtime-tabs =
-    .name = Tabs
+    .name = Језичци
 # Title of the service workers category.
 about-debugging-runtime-service-workers =
     .name = Service Workers
diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl
index 32b2567c91cf..357a14708f7c 100644
--- a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Инсталирај додатак из датотеке…
     .accesskey = И
 help-button = Подршка за додатке
+sidebar-help-button-title =
+    .title = Подршка за додатке
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } опције
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Алатке за све додатке
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } опције
+           *[other] { -brand-short-name } поставке
+        }
 show-unsigned-extensions-button =
     .label = Неке екстензије нису могле бити потврђене
 show-all-extensions-button =
@@ -174,13 +182,29 @@ extensions-view-available-updates =
     .name = Доступна ажурирања
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Препоруке
+addon-category-discover-title =
+    .title = Препоруке
 addon-category-extension = Екстензије
+addon-category-extension-title =
+    .title = Екстензије
 addon-category-theme = Теме
+addon-category-theme-title =
+    .title = Теме
 addon-category-plugin = Прикључци
+addon-category-plugin-title =
+    .title = Прикључци
 addon-category-dictionary = Речници
+addon-category-dictionary-title =
+    .title = Речници
 addon-category-locale = Језици
+addon-category-locale-title =
+    .title = Језици
 addon-category-available-updates = Доступна ажурирања
+addon-category-available-updates-title =
+    .title = Доступна ажурирања
 addon-category-recent-updates = Недавна ажурирања
+addon-category-recent-updates-title =
+    .title = Недавна ажурирања
 
 ## These are global warnings
 
@@ -319,6 +343,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Прикажи мање
 go-back-button =
     .tooltiptext = Иди назад
+header-back-button =
+    .title = Иди назад
 
 ## Recommended add-ons page
 
@@ -352,9 +378,15 @@ addon-options-button =
 
 report-addon-button = Пријави
 remove-addon-button = Уклони
+# The link will always be shown after the other text.
+remove-addon-disabled-button = Не може се уклонити. <a data-l10n-name="link">Зашто?</a>
 disable-addon-button = Онемогући
 enable-addon-button = Омогући
 expand-addon-button = Више опција
+# This is used for the toggle on the extension card, it's a checkbox and this
+# is always its label.
+extension-enable-addon-button-label =
+    .aria-label = Омогући
 preferences-addon-button =
     { PLATFORM() ->
         [windows] Подешавања
@@ -418,6 +450,11 @@ install-update-button = Ажурирај
 # badge is the private browsing icon included next to the extension's name.
 addon-badge-private-browsing-allowed =
     .title = Дозвољено у приватним прозорима
+# This is the tooltip text for the private browsing badge in about:addons. The
+# badge is the private browsing icon included next to the extension's name.
+addon-badge-private-browsing-allowed2 =
+    .title = Дозвољено у приватним прозорима
+    .aria-label = { addon-badge-private-browsing-allowed2.title }
 addon-detail-private-browsing-help = Када је дозвољено, проширење ће имати приступ вашим активностима на мрежи у приватном прегледавању. <a data-l10n-name="learn-more">Сазнај више</a>
 addon-detail-private-browsing-allow = Дозволи
 addon-detail-private-browsing-disallow = Не дозволи
@@ -426,6 +463,11 @@ addon-detail-private-browsing-disallow = Не дозволи
 addon-badge-recommended =
     .title = Препоручено
     .alt = Препоручено
+# This is the tooltip text for the recommended badge for an extension in about:addons. The
+# badge is a small icon displayed next to an extension when it is recommended on AMO.
+addon-badge-recommended2 =
+    .title = { -brand-product-name } препоручује само проширења која задовољавају наше стандарде сигурности и перформанси
+    .aria-label = { addon-badge-recommended2.title }
 available-updates-heading = Доступна ажурирања
 recent-updates-heading = Недавна ажурирања
 release-notes-loading = Учитава се...
@@ -444,10 +486,12 @@ theme-heading = Управљајте вашим темама
 plugin-heading = Управљајте вашим прикључцима
 dictionary-heading = Управљајте вашим речницима
 locale-heading = Управљајте вашим језицима
+updates-heading = Управљајте вашим ажурирањима
 discover-heading = Персонализујте ваш { -brand-short-name }
 shortcuts-heading = Управљај пречицама екстензија
 theme-heading-search-label = Нађите више тема
 extension-heading-search-label = Нађите више екстензија
+default-heading-search-label = Пронађите још додатака
 addons-heading-search-input =
     .placeholder = Претражи сајт addons.mozilla.org
 addon-page-options-button =
diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl
index c632a7367fe0..ebbf101ffec4 100644
--- a/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl
+++ b/thunderbird-l10n/sr/localization/sr/toolkit/about/aboutTelemetry.ftl
@@ -4,6 +4,7 @@
 
 about-telemetry-ping-data-source = Извор података пинга:
 about-telemetry-show-current-ping-data = Подаци тренутног пинга
+about-telemetry-show-current-data = Тренутни подаци
 about-telemetry-show-archived-ping-data = Архивирани подаци пинга
 about-telemetry-show-subsession-data = Прикажи податке сесије
 about-telemetry-choose-ping = Изабери пинг:
@@ -15,10 +16,12 @@ about-telemetry-option-group-older = Старије
 about-telemetry-previous-ping = <<
 about-telemetry-next-ping = >>
 about-telemetry-page-title = Подаци телеметрије
+about-telemetry-current-store = Тренутна продавница:
 about-telemetry-more-information = Тражите више података?
 about-telemetry-firefox-data-doc = <a data-l10n-name="data-doc-link">Firefox документација података</a> садржи водиче о томе како радити са нашим алатима за податке.
 about-telemetry-telemetry-client-doc = <a data-l10n-name="client-doc-link">Firefox документација телеметрије клијента</a> укључује дефиниције концепта, API документацију и референце података.
 about-telemetry-telemetry-dashboard = <a data-l10n-name="dashboard-link">Командна табла телеметрије</a> вам дозвољава да визуелно прикажете податке које Mozilla прима путем телеметрије.
+about-telemetry-telemetry-probe-dictionary = <a data-l10n-name="probe-dictionary-link">Речник узорака пружа детаље и описе за узорке прикупљене телеметријом.</a>
 about-telemetry-show-in-Firefox-json-viewer = Отвори у JSON приказивачу
 about-telemetry-home-section = Почетна
 about-telemetry-general-data-section = Општи подаци
@@ -55,6 +58,17 @@ about-telemetry-upload-type =
         [enabled] омогућено
        *[disabled] онемогућено
     }
+# Example Output: 1 sample, average = 0, sum = 0
+# Variables:
+#   $sampleCount (Integer): amount of histogram samples
+#   $prettyAverage (Integer): average of histogram samples
+#   $sum (Integer): sum of histogram samples
+about-telemetry-histogram-stats =
+    { $sampleCount ->
+        [one] { $sampleCount } узорак, просек = { $prettyAverage }, збир = { $sum }
+        [few] { $sampleCount } узорка, просек = { $prettyAverage }, збир = { $sum }
+       *[other] { $sampleCount } узорака, просек = { $prettyAverage }, збир = { $sum }
+    }
 # Variables:
 #   $telemetryServerOwner (String): the value of the toolkit.telemetry.server_owner preference. Typically "Mozilla"
 about-telemetry-page-subtitle = Ова страница ће приказати информације о перфомансама, хардверу, потрошњи и прилагођењу које је прикупила телеметрија. Ове информације ће бити послате { $telemetryServerOwner }-и да би се побољшао { -brand-full-name }.
@@ -64,6 +78,7 @@ about-telemetry-settings-explanation = Телеметрија сакупља { a
 #   $timeStamp (String): ping localized timestamp, e.g. “2017/07/08 10:40:46”
 about-telemetry-ping-details = Сваки део информације је послат у комплету у “<a data-l10n-name="ping-link">пингове</a>”. Ви гледате у { $name }, { $timestamp } пинг.
 about-telemetry-ping-details-current = Сваки део информације је послат у комплету у “<a data-l10n-name="ping-link">пингове</a>”. Ви гледате у тренутно пинг.
+about-telemetry-data-details-current = Сваки делић података се шаље у пакетима под називом"<a data-l10n-name="ping-link">пинг</a>“. Ви гледате тренутне податке.
 # string used as a placeholder for the search field
 # More info about it can be found here:
 # https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/telemetry/data/main-ping.html
@@ -90,6 +105,8 @@ about-telemetry-no-search-results-all = Жао нам је! Нема резул
 about-telemetry-no-data-to-display = Жао нам је! Тренутно нема доступних података у “{ $sectionName }”
 # used as a tooltip for the “current” ping title in the sidebar
 about-telemetry-current-ping-sidebar = тренутни пинг
+# used as a tooltip for the “current” ping title in the sidebar
+about-telemetry-current-data-sidebar = тренутни подаци
 # used in the “Ping Type” select
 about-telemetry-telemetry-ping-type-all = све
 # button label to copy the histogram
@@ -124,3 +141,12 @@ about-telemetry-category-header = категорија
 about-telemetry-method-header = метода
 about-telemetry-object-header = објекат
 about-telemetry-extra-header = додатно
+about-telemetry-origin-section = Origin Telemetry
+about-telemetry-origin-origin = извор
+about-telemetry-origin-count = број
+# Variables:
+#   $telemetryServerOwner (String): the value of the toolkit.telemetry.server_owner preference. Typically "Mozilla"
+about-telemetry-origins-explanation = <a data-l10n-name="origin-doc-link">Firefox Origin Telemetry</a> кодира податке пре слања тако да { $telemetryServerOwner } може пребројати ствари, али не може знати да ли неки { -brand-product-name } доприноси том броју. (<a data-l10n-name="prio-blog-link">сазнајте више</a>)
+# Variables:
+#  $process (String): type of process in subsection headers ( e.g. "content", "parent" )
+about-telemetry-process = { $process } процес
diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl
index e7ec22212a89..6df1f90d2921 100644
--- a/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl
+++ b/thunderbird-l10n/sr/localization/sr/toolkit/about/abuseReports.ftl
@@ -5,6 +5,18 @@
 abuse-report-title-extension = Пријави ово проширење продавцу { -vendor-short-name }
 abuse-report-title-theme = Пријави ову тему продавцу { -vendor-short-name }
 abuse-report-subtitle = У чему је проблем?
+# Variables:
+#   $author-name (string) - Name of the add-on author
+abuse-report-addon-authored-by = од <a data-l10n-name="author-name">{ $author-name }</a>
+abuse-report-learnmore =
+    Нисте сигурни шта да изаберете?
+    <a data-l10n-name="learnmore-link">Сазнајте више о пријављивању проширења и тема</a>
+abuse-report-submit-description = Опишите проблем (није обавезно)
+abuse-report-textarea =
+    .placeholder = Лакше нам је да решимо проблем ако знамо детаље. Опишите шта сте доживели. Хвала вам што нам помажете да одржимо веб здравим.
+abuse-report-submit-note =
+    Напомена: не уносите личне податке (као што су име, е-адреса, број телефона, физичка адреса).
+    { -vendor-short-name } води сталну евидденцију ових извештаја.
 
 ## Panel buttons.
 
@@ -19,7 +31,14 @@ abuse-report-submit-button = Пошаљи
 ## Variables:
 ##   $addon-name (string) - Name of the add-on
 
+abuse-report-messagebar-aborted = Пријава за <span data-l10n-name="addon-name">{ $addon-name }</span> је отказана.
+abuse-report-messagebar-submitting = Слање пријаве за <span data-l10n-name="addon-name">{ $addon-name }</span>.
 abuse-report-messagebar-submitted = Хвала вам што сте поднели пријаву. Да ли желите уклонити додатак <span data-l10n-name="addon-name">{ $addon-name }</span>?
+abuse-report-messagebar-submitted-noremove = Хвала вам што сте поднели пријаву.
+abuse-report-messagebar-removed-extension = Хвала вам што сте поднели пријаву. Уклонили сте <span data-l10n-name="addon-name">{ $addon-name }</span> проширење.
+abuse-report-messagebar-removed-theme = Хвала вам што сте поднели пријаву. Уклонили сте <span data-l10n-name="addon-name">{ $addon-name }</span> тему.
+abuse-report-messagebar-error = Дошло је до грешке приликом слања пријаве за <span data-l10n-name="addon-name">{ $addon-name }</span>.
+abuse-report-messagebar-error-recent-submit = Ваша пријава за <span data-l10n-name="addon-name">{ $addon-name }</span> није послана зато што је друга пријава поднета недавно.
 
 ## Message bars actions.
 
@@ -32,5 +51,29 @@ abuse-report-messagebar-action-cancel = Откажи
 
 ## Abuse report reasons (optionally paired with related examples and/or suggestions)
 
+abuse-report-damage-reason = Оштећује мој рачунар и податке
+abuse-report-damage-example = Пример: убризгани злонамерни програм тј. malware или украдени подаци
+abuse-report-spam-reason = Ствара нежељену пошту тј. spam или рекламе
+abuse-report-spam-example = Пример: умеће рекламе на веб странице
+abuse-report-settings-reason = Променио је мој претраживач, почетну страницу или нови језичак без обавештења или моје дозволе
+abuse-report-settings-suggestions = Пре пријављивања проширења можете покушати да промените подешавања:
 abuse-report-settings-suggestions-search = Промените подразумеване поставке претраге
+abuse-report-settings-suggestions-homepage = Промените почетну страницу и нови језичак
+abuse-report-deceptive-reason = Претвара се да је нешто што није
+abuse-report-deceptive-example = Пример: обмањујући опис или слике
+abuse-report-broken-reason-extension = Не ради, квари веб странице или успорава { -brand-product-name }
+abuse-report-broken-reason-theme = Не ради или квари приказ прегледача
+abuse-report-broken-example = Пример: функције су споре, тешке за употребу или не раде; делови веб страница се не учитавају или изгледају неуобичајено
+abuse-report-broken-suggestions-extension =
+    Звучи као да сте идентификовали грешку. Поред тога што овде подносите пријаву, најбољи начин
+    да решите проблем са функционалношћу је да контактирате програмера проширења.
+    <a data-l10n-name="support-link">Посетите страницу проширења</a> да бисте добили податке о програмеру.
+abuse-report-broken-suggestions-theme =
+    Звучи као да сте идентификовали грешку. Поред тога што овде подносите пријаву, најбољи начин
+    да решите проблем са функционалношћу је да контактирате програмера теме.
+    <a data-l10n-name="support-link">Посетите страницу теме</a> да бисте добили податке о програмеру.
+abuse-report-policy-reason = Садржај мржње или насиља и илегалан садржај
+abuse-report-policy-suggestions = Напомена: проблеми са ауторским правима и заштитним знаковима морају бити пријављени у одвојеном процесу. <a data-l10n-name="report-infringement-link">Користите ова упутства</a> да пријавите проблем.
+abuse-report-unwanted-reason = Никад нисам желео/ла ово проширење и не могу га се решити
+abuse-report-unwanted-example = Пример: апликација је инсталирала проширење без моје дозволе
 abuse-report-other-reason = Нешто друго
diff --git a/thunderbird-l10n/sr/localization/sr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sr/localization/sr/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..e6be2501eb83
--- /dev/null
+++ b/thunderbird-l10n/sr/localization/sr/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Покренули сте старију { -brand-product-name } верзију
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Направи нови профил
+profiledowngrade-sync = Коришћење старије верзије { -brand-product-name }-а може да оштети забелешке и историју прегледања који су већ сачувани у постојећем { -brand-product-name } профилу. Да бисте заштитили своје информације, направите нови профил за инсталацију { -brand-short-name }. Увек се можете пријавити помоћу { -fxaccount-brand-name } да синхронизујете своје забелешке и историју прегледања међу профилима.
+profiledowngrade-nosync = Коришћење старије верзије { -brand-product-name }-а може да оштети забелешке и историју прегледања који су већ сачувани у постојећем { -brand-product-name } профилу. Да бисте заштитили своје информације, направите нови профил за ову инсталацију { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Изађи
+           *[other] Напусти
+        }
diff --git a/thunderbird-l10n/sr/manifest.json b/thunderbird-l10n/sr/manifest.json
index 28560176b595..2f0e1672ea79 100644
--- a/thunderbird-l10n/sr/manifest.json
+++ b/thunderbird-l10n/sr/manifest.json
@@ -1,57 +1,57 @@
 {
-  "name": "српски (sr) Language Pack",
-  "manifest_version": 2,
-  "langpack_id": "sr",
   "sources": {
     "browser": {
       "base_path": "browser/"
     }
   },
-  "version": "76.0buildid20200407173003",
+  "description": "Language pack for Thunderbird for sr",
+  "manifest_version": 2,
+  "langpack_id": "sr",
   "languages": {
     "sr": {
-      "version": "20200406190608",
       "chrome_resources": {
-        "mozapps": "chrome/sr/locale/sr/mozapps/",
-        "global": "chrome/sr/locale/sr/global/",
-        "autoconfig": "chrome/sr/locale/sr/autoconfig/",
-        "devtools-shared": "chrome/sr/locale/sr/devtools/shared/",
+        "pluginproblem": "chrome/sr/locale/sr/pluginproblem/",
+        "places": "chrome/sr/locale/sr/places/",
         "messenger-newsblog": "chrome/sr/locale/sr/messenger-newsblog/",
         "devtools": "chrome/sr/locale/sr/devtools/client/",
-        "lightning": "chrome/sr/locale/sr/lightning/",
+        "messenger-smime": "chrome/sr/locale/sr/messenger-smime/",
+        "devtools-shared": "chrome/sr/locale/sr/devtools/shared/",
+        "devtools-startup": "chrome/sr/locale/sr/devtools/startup/",
+        "mozldap": "chrome/sr/locale/sr/mozldap/",
+        "chat": "chrome/sr/locale/sr/chat/",
+        "messenger": "chrome/sr/locale/sr/messenger/",
+        "autoconfig": "chrome/sr/locale/sr/autoconfig/",
+        "necko": "chrome/sr/locale/sr/necko/",
         "branding": "chrome/sr/locale/sr/branding/",
-        "pippki": "chrome/sr/locale/sr/pippki/",
-        "alerts": "chrome/sr/locale/sr/alerts/",
         "global-platform": {
           "macosx": "chrome/sr/locale/sr/global-platform/mac/",
-          "win": "chrome/sr/locale/sr/global-platform/win/",
+          "android": "chrome/sr/locale/sr/global-platform/unix/",
           "linux": "chrome/sr/locale/sr/global-platform/unix/",
-          "android": "chrome/sr/locale/sr/global-platform/unix/"
+          "win": "chrome/sr/locale/sr/global-platform/win/"
         },
+        "messenger-mapi": "chrome/sr/locale/sr/messenger-mapi/",
         "messenger-region": "chrome/sr/locale/sr/messenger-region/",
+        "pippki": "chrome/sr/locale/sr/pippki/",
+        "lightning": "chrome/sr/locale/sr/lightning/",
+        "pipnss": "chrome/sr/locale/sr/pipnss/",
         "communicator": "chrome/sr/locale/sr/communicator/",
-        "chat": "chrome/sr/locale/sr/chat/",
-        "necko": "chrome/sr/locale/sr/necko/",
         "passwordmgr": "chrome/sr/locale/sr/passwordmgr/",
-        "messenger": "chrome/sr/locale/sr/messenger/",
-        "mozldap": "chrome/sr/locale/sr/mozldap/",
-        "calendar": "chrome/sr/locale/sr/calendar/",
-        "pluginproblem": "chrome/sr/locale/sr/pluginproblem/",
-        "devtools-startup": "chrome/sr/locale/sr/devtools/startup/",
-        "messenger-mapi": "chrome/sr/locale/sr/messenger-mapi/",
-        "messenger-smime": "chrome/sr/locale/sr/messenger-smime/",
-        "pipnss": "chrome/sr/locale/sr/pipnss/",
-        "places": "chrome/sr/locale/sr/places/"
-      }
+        "global": "chrome/sr/locale/sr/global/",
+        "alerts": "chrome/sr/locale/sr/alerts/",
+        "mozapps": "chrome/sr/locale/sr/mozapps/",
+        "calendar": "chrome/sr/locale/sr/calendar/"
+      },
+      "version": "20200415061238"
     }
   },
-  "author": "mozilla.rs (contributors: Марко Костић, Марко Андрејић, Александра Узелац, Вања Тумбас)",
-  "description": "Language pack for Thunderbird for sr",
   "applications": {
     "gecko": {
-      "strict_min_version": "76.0",
       "strict_max_version": "76.*",
-      "id": "langpack-sr@thunderbird.mozilla.org"
+      "id": "langpack-sr@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
     }
-  }
+  },
+  "name": "српски (sr) Language Pack",
+  "author": "mozilla.rs (contributors: Марко Костић, Марко Андрејић, Александра Узелац, Вања Тумбас)",
+  "version": "76.0buildid20200420212409"
 }
diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties
index 80c712443f4c..6ef5700427ba 100644
--- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties
+++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Detta element har rullbar övergång.
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Ingen associerad regel
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Håll ner shift och klicka för att navigera till regeln
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties
index 6e1cce90d9ff..d850d07213e9 100644
--- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties
+++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Stilmallen %1$S laddades som CSS även fast dess MIME-typ, “%2$
 
 PEUnexpEOF2=Oväntat slut på filen vid sökning efter %1$S.
 PEParseRuleWSOnly=Sträng med endast blanka tecken angavs som en regel för tolkning.
+
 PEDeclDropped=Ignorerad deklaration.
 PEDeclSkipped=Hoppar till nästa deklaration.
 PEUnknownProperty=Okänd egenskap ‘%1$S’.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Endast en repeat(auto-fill, …) är t
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Endast en repeat(auto-fill, …) eller repeat(auto-fit, …) är tillåten i en tracklista.
 PEMoreThanOneGridRepeatTrackSize=Endast ett trackstorlek är tillåten inuti repeat(auto-fit/auto-fill, …).
 
+PEDisallowedImportRule=@importreglerna är ännu inte giltiga i konstruerade formatmallar.
+
 TooLargeDashedRadius=Gränsradie är för stor för ‘streckad’ stil (gränsen är 100000 px). Renderar som fylld.
 TooLargeDottedRadius=Gränsradie är för stor för ‘prickad’ stil (gränsen är 100000 px). Renderar som fylld.
diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties
index 5119a3849624..77f9a727cac2 100644
--- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties
+++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Laddning nekad av X-Frame-Options: “%1$S” från “%2$S”, webbpl
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Laddning nekad av X-Frame-Options: “%1$S” från “%2$S”, webbplats tillåter inte cross-origin ramning från “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Ogiltigt huvud X-Frame-Options hittades när “%2$S” laddades: “%1$S” är inte ett giltigt direktiv.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Laddningen av “%2$S” i en ram nekas av ett direktivet “X-Frame-Options“ satt till “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Uppgraderar osäker begäran “%1$S” att använda “%2$S”.
diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd
index 3531583ea46f..dd0b6e1ae699 100644
--- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd
+++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Sök meddelanden…">
 <!ENTITY searchMailCmd.accesskey "m">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Global sökning…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "Sök adresser…">
 <!ENTITY searchAddressesCmd.accesskey "S">
 
diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties
index f403f0f80482..352e773d6a2b 100644
--- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties
+++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Detta är ett krypterat OpenPGP-meddelande.<br>För att dekryptera meddelandet, behöver du installera en <a href="%S">OpenPGP-tillägg</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Detta är ett krypterat OpenPGP-meddelande, men stöd för OpenPGP-dekryptering är inte tillgängligt.
diff --git a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties
index d1d0f3b08239..55c6470a9ea3 100644
--- a/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties
+++ b/thunderbird-l10n/sv-SE/chrome/sv-SE/locale/sv-SE/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Lagringsåtkomst automatiskt beviljad
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Lagringsåtkomst automatiskt beviljad för spårare “%2$S” på “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Lagringsåtkomst beviljas automatiskt för förstapartisolering “%2$S” på “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Kaka “%1$S” avvisades eftersom den har attributet “sameSite=none” men saknar attributet “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..104ce6b6c66f
--- /dev/null
+++ b/thunderbird-l10n/sv-SE/localization/sv-SE/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Omdirigering av URI för kalender
+calendar-uri-redirect-description =
+    Servern omdirigerar URI för kalendern "{ $calendarName }".
+    Acceptera omdirigeringen och börja använda ny URI för den här kalendern?
+calendar-uri-redirect-original-uri-label = Aktuell URI:
+calendar-uri-redirect-target-uri-label = Omdirigerar till ny URI:
diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl
index bb868aeacbde..7590d9c57f95 100644
--- a/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/sv-SE/localization/sv-SE/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Välkommen till { -brand-full-name }
+account-settings = Kontoinställningar
+#   $accounts (Number) - the number of configured accounts
 setup-title = Välj vad du vill konfigurera
 about-title = Om { -brand-full-name }
 resources-title = Resurser
@@ -40,3 +42,10 @@ explore-link = Utforska funktioner
 support-link = Hjälp
 involved-link = Engagera dig
 developer-link = Dokumentation för utvecklare
+read = Lästa meddelanden
+compose = Skriv ett nytt meddelande
+search = Sök efter meddelanden
+filter = Hantera meddelandefilter
+nntp-subscription = Hantera prenumerationer på diskussionsgrupper
+rss-subscription = Hantera RSS-prenumerationer
+e2e = End-to-end-kryptering
diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl
index 37e65244afc9..0a16d7e3a746 100644
--- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Installera tillägg från fil…
     .accesskey = I
 help-button = Support för tillägg
+sidebar-help-button-title =
+    .title = Support för tillägg
 preferences =
     { PLATFORM() ->
         [windows] Inställningar för { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Verktyg för alla tillägg
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Inställningar för { -brand-short-name }
+           *[other] Inställningar för { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Vissa utökningar kunde inte verifieras
 show-all-extensions-button =
@@ -163,13 +171,29 @@ extensions-view-available-updates =
     .name = Tillgängliga uppdateringar
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Rekommendationer
+addon-category-discover-title =
+    .title = Rekommendationer
 addon-category-extension = Tillägg
+addon-category-extension-title =
+    .title = Tillägg
 addon-category-theme = Teman
+addon-category-theme-title =
+    .title = Teman
 addon-category-plugin = Insticksmoduler
+addon-category-plugin-title =
+    .title = Insticksmoduler
 addon-category-dictionary = Ordlistor
+addon-category-dictionary-title =
+    .title = Ordlistor
 addon-category-locale = Språk
+addon-category-locale-title =
+    .title = Språk
 addon-category-available-updates = Tillgängliga uppdateringar
+addon-category-available-updates-title =
+    .title = Tillgängliga uppdateringar
 addon-category-recent-updates = Senaste uppdateringar
+addon-category-recent-updates-title =
+    .title = Senaste uppdateringar
 
 ## These are global warnings
 
@@ -282,6 +306,7 @@ shortcuts-no-commands = Följande tillägg har inte genvägar:
 shortcuts-input =
     .placeholder = Skapa en genväg
 shortcuts-browserAction = Aktivera tillägg
+shortcuts-browserAction2 = Aktivera verktygsfältets knapp
 shortcuts-pageAction = Aktivera sidans åtgärd
 shortcuts-sidebarAction = Visa sidofält
 shortcuts-modifier-mac = Inkludera Ctrl, Alt eller ⌘
@@ -307,6 +332,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Visa mindre
 go-back-button =
     .tooltiptext = Gå tillbaka
+header-back-button =
+    .title = Gå tillbaka
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl
index 7e1d85f27982..4ec4260066fc 100644
--- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = innehåll
 sandbox-proc-type-file = filinnehåll
 sandbox-proc-type-media-plugin = insticksmodul media
 sandbox-proc-type-data-decoder = dataavkodare
+startup-cache-title = Startcache
+startup-cache-disk-cache-path = Sökväg diskcache
+startup-cache-ignore-disk-cache = Ignorera diskcache
+startup-cache-found-disk-cache-on-init = Hittade diskcache på Init
+startup-cache-wrote-to-disk-cache = Skrev till diskcache
 launcher-process-status-0 = Aktiverad
 launcher-process-status-1 = Inaktiverad på grund av fel
 launcher-process-status-2 = Inaktiverad med tvång
@@ -310,6 +315,7 @@ touch-enabled = tryckinmatning aktiverad
 drag-enabled = rullningslist är dragaktiverad
 keyboard-enabled = tangentbord aktiverad
 autoscroll-enabled = autoscroll aktiverad
+zooming-enabled = mjuk pinch-zoom aktiverad
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl
index 09fd7e5e557f..8eb22817dc35 100644
--- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (cert)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Denna utökning har markerats som kritisk, vilket innebär att klienter måste avvisa certifikatet om de inte förstår det.
+certificate-viewer-export = Exportera
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Dina certifikat
+certificate-viewer-tab-people = Personer
+certificate-viewer-tab-servers = Servrar
+certificate-viewer-tab-ca = Utfärdare
+certificate-viewer-tab-unkonwn = Okänt
diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl
index 4c7efb97c397..0ef8adf6ad2b 100644
--- a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Isolerat webbinnehåll
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..b7fee66f4e8a
--- /dev/null
+++ b/thunderbird-l10n/sv-SE/localization/sv-SE/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Du har startat en äldre version av { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Skapa ny profil
+profiledowngrade-sync = Genom att använda en äldre version av { -brand-product-name } kan korrupta bokmärken och surfhistorik redan ha sparats i en befintlig { -brand-product-name }-profil. För att skydda din information, skapa en ny profil för den här installationen av { -brand-short-name }. Du kan alltid logga in med ett { -fxaccount-brand-name } för att synkronisera dina bokmärken och surfhistorik mellan profiler.
+profiledowngrade-nosync = Genom att använda en äldre version av { -brand-product-name } kan korrupta bokmärken och surfhistorik redan sparats i en befintlig { -brand-product-name }-profil. För att skydda din information, skapa en ny profil för den här installationen av { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Avsluta
+           *[other] Avsluta
+        }
diff --git a/thunderbird-l10n/sv-SE/manifest.json b/thunderbird-l10n/sv-SE/manifest.json
index 0bf69a03b7e7..eaf581c9da4f 100644
--- a/thunderbird-l10n/sv-SE/manifest.json
+++ b/thunderbird-l10n/sv-SE/manifest.json
@@ -1,57 +1,57 @@
 {
-  "author": "Mozilla-sv (contributors: Andreas Pettersson)",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "description": "Language pack for Thunderbird for sv-SE",
-  "version": "76.0buildid20200407173003",
+  "manifest_version": 2,
   "languages": {
     "sv-SE": {
+      "version": "20200418165605",
       "chrome_resources": {
-        "global": "chrome/sv-SE/locale/sv-SE/global/",
-        "places": "chrome/sv-SE/locale/sv-SE/places/",
-        "autoconfig": "chrome/sv-SE/locale/sv-SE/autoconfig/",
-        "messenger-region": "chrome/sv-SE/locale/sv-SE/messenger-region/",
-        "devtools": "chrome/sv-SE/locale/sv-SE/devtools/client/",
-        "pippki": "chrome/sv-SE/locale/sv-SE/pippki/",
         "pipnss": "chrome/sv-SE/locale/sv-SE/pipnss/",
-        "pluginproblem": "chrome/sv-SE/locale/sv-SE/pluginproblem/",
+        "mozapps": "chrome/sv-SE/locale/sv-SE/mozapps/",
         "calendar": "chrome/sv-SE/locale/sv-SE/calendar/",
-        "mozldap": "chrome/sv-SE/locale/sv-SE/mozldap/",
-        "devtools-startup": "chrome/sv-SE/locale/sv-SE/devtools/startup/",
+        "messenger-mapi": "chrome/sv-SE/locale/sv-SE/messenger-mapi/",
         "branding": "chrome/sv-SE/locale/sv-SE/branding/",
-        "mozapps": "chrome/sv-SE/locale/sv-SE/mozapps/",
-        "necko": "chrome/sv-SE/locale/sv-SE/necko/",
-        "lightning": "chrome/sv-SE/locale/sv-SE/lightning/",
-        "messenger-smime": "chrome/sv-SE/locale/sv-SE/messenger-smime/",
-        "messenger": "chrome/sv-SE/locale/sv-SE/messenger/",
+        "passwordmgr": "chrome/sv-SE/locale/sv-SE/passwordmgr/",
+        "pippki": "chrome/sv-SE/locale/sv-SE/pippki/",
         "chat": "chrome/sv-SE/locale/sv-SE/chat/",
+        "mozldap": "chrome/sv-SE/locale/sv-SE/mozldap/",
+        "messenger-region": "chrome/sv-SE/locale/sv-SE/messenger-region/",
+        "pluginproblem": "chrome/sv-SE/locale/sv-SE/pluginproblem/",
         "alerts": "chrome/sv-SE/locale/sv-SE/alerts/",
-        "passwordmgr": "chrome/sv-SE/locale/sv-SE/passwordmgr/",
-        "devtools-shared": "chrome/sv-SE/locale/sv-SE/devtools/shared/",
-        "messenger-mapi": "chrome/sv-SE/locale/sv-SE/messenger-mapi/",
+        "messenger-newsblog": "chrome/sv-SE/locale/sv-SE/messenger-newsblog/",
+        "communicator": "chrome/sv-SE/locale/sv-SE/communicator/",
+        "devtools-startup": "chrome/sv-SE/locale/sv-SE/devtools/startup/",
+        "devtools": "chrome/sv-SE/locale/sv-SE/devtools/client/",
+        "messenger-smime": "chrome/sv-SE/locale/sv-SE/messenger-smime/",
+        "necko": "chrome/sv-SE/locale/sv-SE/necko/",
+        "autoconfig": "chrome/sv-SE/locale/sv-SE/autoconfig/",
         "global-platform": {
-          "android": "chrome/sv-SE/locale/sv-SE/global-platform/unix/",
-          "win": "chrome/sv-SE/locale/sv-SE/global-platform/win/",
           "linux": "chrome/sv-SE/locale/sv-SE/global-platform/unix/",
-          "macosx": "chrome/sv-SE/locale/sv-SE/global-platform/mac/"
+          "win": "chrome/sv-SE/locale/sv-SE/global-platform/win/",
+          "macosx": "chrome/sv-SE/locale/sv-SE/global-platform/mac/",
+          "android": "chrome/sv-SE/locale/sv-SE/global-platform/unix/"
         },
-        "communicator": "chrome/sv-SE/locale/sv-SE/communicator/",
-        "messenger-newsblog": "chrome/sv-SE/locale/sv-SE/messenger-newsblog/"
-      },
-      "version": "20200404145321"
+        "global": "chrome/sv-SE/locale/sv-SE/global/",
+        "devtools-shared": "chrome/sv-SE/locale/sv-SE/devtools/shared/",
+        "places": "chrome/sv-SE/locale/sv-SE/places/",
+        "lightning": "chrome/sv-SE/locale/sv-SE/lightning/",
+        "messenger": "chrome/sv-SE/locale/sv-SE/messenger/"
+      }
+    }
+  },
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
     }
   },
-  "langpack_id": "sv-SE",
-  "name": "Svenska (SE) Language Pack",
-  "manifest_version": 2,
   "applications": {
     "gecko": {
       "id": "langpack-sv-SE@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
+      "strict_max_version": "76.*",
+      "strict_min_version": "76.0"
     }
-  }
+  },
+  "langpack_id": "sv-SE",
+  "name": "Svenska (SE) Language Pack",
+  "description": "Language pack for Thunderbird for sv-SE",
+  "version": "76.0buildid20200420212409",
+  "author": "Mozilla-sv (contributors: Andreas Pettersson)"
 }
diff --git a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties
index 25224f5a2a06..ce8024898373 100644
--- a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties
+++ b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/debugger.properties
@@ -55,6 +55,41 @@ setDirectoryRoot.accesskey=k
 removeDirectoryRoot.label=Dizin kökünü kaldır
 removeDirectoryRoot.accesskey=d
 
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+blackBoxAll.label=Kara kutuya al
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+blackBoxAllInGroup.label=Bu gruptaki dosyaları kara kutuya al
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+unblackBoxAllInGroup.label=Bu gruptaki dosyaları kara kutudan çıkar
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+blackBoxAllOutsideGroup.label=Bu grup dışındaki dosyaları kara kutuya al
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
+unblackBoxAllOutsideGroup.label=Bu grup dışındaki dosyaları kara kutudan çıkar
+
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
+blackBoxAllInDir.label=Bu klasördeki dosyaları kara kutuya al
+
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+unblackBoxAllInDir.label=Bu klasördeki dosyaları kara kutudan çıkar
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+blackBoxAllOutsideDir.label=Bu klasör dışındaki dosyaları kara kutuya al
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+unblackBoxAllOutsideDir.label=Bu klasör dışındaki dosyaları kara kutudan çıkar
+
 # LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
 # context menu to copy the function the user selected
 copyFunction.label=Fonksiyonu kopyala
@@ -1054,11 +1089,6 @@ whyPaused.mutationBreakpointRemoved=Kaldırıldı:
 # a JS execution
 whyPaused.interrupted=Yürütme sırasında duraklatıldı
 
-# LOCALIZATION NOTE (whyPaused.replayForcedPause): The text that is displayed
-# in a info block explaining how the debugger is currently paused in a
-# recording.
-whyPaused.replayForcedPause=Kayıtta duraklatıldı
-
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -1287,30 +1317,3 @@ serviceWorkerInfo.redundant=gereksiz
 # LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
 # service worker that is in an unknown state.
 serviceWorkerInfo.unknown=bilinmiyor
-
-# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
-blackBoxAll.label=Blackbox
-# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected group
-blackBoxAllInGroup.label=Blackbox files in this group
-# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected group
-unblackBoxAllInGroup.label=Unblackbox files in this group
-# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected group
-blackBoxAllOutsideGroup.label=Blackbox files outside this group
-# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected group
-unblackBoxAllOutsideGroup.label=Unblackbox files outside this group
-# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
-# context submenu to blackbox all files inside of the selected directory
-blackBoxAllInDir.label=Blackbox files in this directory
-# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
-# context submenu to unblackbox all files inside of the selected directory
-unblackBoxAllInDir.label=Unblackbox files in this directory
-# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
-# context submenu to blackbox all files outside of the selected directory
-blackBoxAllOutsideDir.label=Blackbox files outside this directory
-# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
-# context submenu to unblackbox all files outside of the selected directory
-unblackBoxAllOutsideDir.label=Unblackbox files outside this directory
diff --git a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties
index 63b28b027703..33d1b23b32bf 100644
--- a/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/tr/chrome/tr/locale/tr/devtools/client/netmonitor.properties
@@ -765,6 +765,13 @@ netmonitor.ws.context.received=Alınan
 # for the "Received" menu item displayed in the context menu in the websocket toolbar.
 netmonitor.ws.context.received.accesskey=A
 
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+netmonitor.ws.context.controlFrames.accesskey=o
+
 # LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
 # on the context menu that shows "Copy Message".
 netmonitor.ws.context.copyFrame=Mesajı kopyala
@@ -1529,6 +1536,3 @@ netmonitor.cache.device=Cihaz
 # LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
 # on the context menu that shows "Control Frames" WebSocket frames.
 netmonitor.ws.context.controlFrames=Control
-# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
-# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
-netmonitor.ws.context.controlFrames.accesskey=o
diff --git a/thunderbird-l10n/tr/localization/tr/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/tr/localization/tr/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..4730cc2c92c5
--- /dev/null
+++ b/thunderbird-l10n/tr/localization/tr/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Takvim URI Yönlendirmesi
+calendar-uri-redirect-description =
+    Sunucu, "{ $calendarName }" takviminin URI'sini yeniden yönlendiriyor.
+    Yönlendirmeyi kabul edip bu takvim için yeni URI'yi kullanmaya başlamak ister misiniz?
+calendar-uri-redirect-original-uri-label = Mevcut URI:
+calendar-uri-redirect-target-uri-label = Yönlendirilen yeni URI:
diff --git a/thunderbird-l10n/tr/localization/tr/calendar/calendar-widgets.ftl b/thunderbird-l10n/tr/localization/tr/calendar/calendar-widgets.ftl
new file mode 100644
index 000000000000..d6759d59afb5
--- /dev/null
+++ b/thunderbird-l10n/tr/localization/tr/calendar/calendar-widgets.ftl
@@ -0,0 +1,6 @@
+# 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/.
+
+calendar-deactivated-notification-events = Şu anda tüm takvimler devre dışı. Etkinlik oluşturmak ve düzenlemek için bir takvimi etkinleştirin veya yeni takvim ekleyin.
+calendar-deactivated-notification-tasks = Şu anda tüm takvimler devre dışı. Görev oluşturmak ve düzenlemek için bir takvimi etkinleştirin veya yeni takvim ekleyin.
diff --git a/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl
index 441f8602f52c..ea2893c0bf1f 100644
--- a/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/tr/localization/tr/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Bağlı tarayıcının sürümü eski
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = Hata ayıklayıcı paneli bağlı tarayıcıyla çalışmayabilir. Bu tarayıcıyla hata ayıklayıcıyı kullanmak istiyorsanız lütfen Firefox { $runtimeVersion } sürümünü kullanın.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Firefox'un bu sürümü Android için Firefox'ta (68) hata ayıklayamıyor. Test için Firefox'un Android Nightly sürümünü telefonunuza yüklemenizi öneririz. <a>Daha fazla bilgi</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl
index bc431bd20935..8673aa4d40fa 100644
--- a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Dosyadan eklenti kur...
     .accesskey = k
 help-button = Eklenti desteği
+sidebar-help-button-title =
+    .title = Eklenti desteği
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } seçenekleri
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Tüm eklentiler için araçlar
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } seçenekleri
+           *[other] { -brand-short-name } tercihleri
+        }
 show-unsigned-extensions-button =
     .label = Bazı eklentiler doğrulanamadı
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Mevcut güncellemeler
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Öneriler
+addon-category-discover-title =
+    .title = Öneriler
 addon-category-extension = Eklentiler
+addon-category-extension-title =
+    .title = Eklentiler
 addon-category-theme = Temalar
+addon-category-theme-title =
+    .title = Temalar
 addon-category-plugin = Yan uygulamalar
+addon-category-plugin-title =
+    .title = Yan uygulamalar
 addon-category-dictionary = Sözlükler
+addon-category-dictionary-title =
+    .title = Sözlükler
 addon-category-locale = Diller
+addon-category-locale-title =
+    .title = Diller
 addon-category-available-updates = Mevcut güncellemeler
+addon-category-available-updates-title =
+    .title = Mevcut güncellemeler
 addon-category-recent-updates = Yakın zamandaki güncellemeler
+addon-category-recent-updates-title =
+    .title = Yakın zamandaki güncellemeler
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Aşağıdaki eklentilerin kısayolları yok:
 shortcuts-input =
     .placeholder = Bir kısayol girin
 shortcuts-browserAction = Eklentiyi etkinleştir
+shortcuts-browserAction2 = Araç çubuğu düğmesini etkinleştir
 shortcuts-pageAction = Sayfa eylemini etkinleştir
 shortcuts-sidebarAction = Kenar çubuğunu aç/kapat
 shortcuts-modifier-mac = Ctrl, Alt veya ⌘ kullanmalısınız
@@ -312,6 +337,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Daha az göster
 go-back-button =
     .tooltiptext = Geri dön
+header-back-button =
+    .title = Geri dön
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl
index 9ab3b5a0d796..56d1924aa7a7 100644
--- a/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/tr/localization/tr/toolkit/about/aboutSupport.ftl
@@ -287,6 +287,11 @@ sandbox-proc-type-content = içerik
 sandbox-proc-type-file = dosya içeriği
 sandbox-proc-type-media-plugin = ortam yan uygulaması
 sandbox-proc-type-data-decoder = veri çözücü
+startup-cache-title = Başlangıç önbelleği
+startup-cache-disk-cache-path = Disk önbellek yolu
+startup-cache-ignore-disk-cache = Disk önbelleğini yok say
+startup-cache-found-disk-cache-on-init = Başlangıçta disk önbelleği bulundu
+startup-cache-wrote-to-disk-cache = Disk önbelleğine yazıldı
 launcher-process-status-0 = Etkin
 launcher-process-status-1 = Hata nedeniyle devre dışı
 launcher-process-status-2 = Zorla devre dışı bırakıldı
diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl
index cb9fde60e6d8..7efba0878b99 100644
--- a/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/tr/localization/tr/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = İzole web içeriği
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Soket
diff --git a/thunderbird-l10n/tr/localization/tr/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/tr/localization/tr/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..088fe6c88990
--- /dev/null
+++ b/thunderbird-l10n/tr/localization/tr/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = { -brand-product-name }’un eski bir sürümünü başlattınız
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Yeni profil oluştur
+profiledowngrade-sync = { -brand-product-name }’un eski sürümlerini kullanmak, mevcut bir { -brand-product-name } profiline kaydedilmiş yer imlerinize ve gezinti geçmişinize zarar verebilir. Bilgilerinizi korumak için bu { -brand-short-name } kurulumuna özel bir profil oluşturun. İstediğiniz zaman { -fxaccount-brand-name } ile giriş yaparak profillerinizdeki yer imlerinizi ve gezinti geçmişinizi senkronize edebilirsiniz.
+profiledowngrade-nosync = { -brand-product-name }’un eski sürümlerini kullanmak, mevcut bir { -brand-product-name } profiline kaydedilmiş yer imlerinize ve gezinti geçmişinize zarar verebilir. Bilgilerinizi korumak için bu { -brand-short-name } kurulumuna özel bir profil oluşturun.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Çık
+           *[other] Çık
+        }
diff --git a/thunderbird-l10n/tr/manifest.json b/thunderbird-l10n/tr/manifest.json
index 1849511c5bb3..55a4e4a41cdb 100644
--- a/thunderbird-l10n/tr/manifest.json
+++ b/thunderbird-l10n/tr/manifest.json
@@ -1,57 +1,57 @@
 {
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "applications": {
-    "gecko": {
-      "id": "langpack-tr@thunderbird.mozilla.org",
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*"
-    }
-  },
-  "author": "mozilla.org (contributors: Mozilla Türkiye takımı)",
-  "name": "Türkçe (TR) Language Pack",
-  "manifest_version": 2,
-  "description": "Language pack for Thunderbird for tr",
-  "langpack_id": "tr",
   "languages": {
     "tr": {
+      "version": "20200415061504",
       "chrome_resources": {
-        "messenger-smime": "chrome/tr/locale/tr/messenger-smime/",
-        "messenger-newsblog": "chrome/tr/locale/tr/messenger-newsblog/",
-        "mozldap": "chrome/tr/locale/tr/mozldap/",
-        "pipnss": "chrome/tr/locale/tr/pipnss/",
-        "devtools": "chrome/tr/locale/tr/devtools/client/",
-        "global": "chrome/tr/locale/tr/global/",
-        "necko": "chrome/tr/locale/tr/necko/",
-        "passwordmgr": "chrome/tr/locale/tr/passwordmgr/",
         "global-platform": {
-          "linux": "chrome/tr/locale/tr/global-platform/unix/",
-          "macosx": "chrome/tr/locale/tr/global-platform/mac/",
           "android": "chrome/tr/locale/tr/global-platform/unix/",
+          "macosx": "chrome/tr/locale/tr/global-platform/mac/",
+          "linux": "chrome/tr/locale/tr/global-platform/unix/",
           "win": "chrome/tr/locale/tr/global-platform/win/"
         },
-        "branding": "chrome/tr/locale/tr/branding/",
-        "messenger": "chrome/tr/locale/tr/messenger/",
+        "messenger-newsblog": "chrome/tr/locale/tr/messenger-newsblog/",
+        "necko": "chrome/tr/locale/tr/necko/",
+        "messenger-smime": "chrome/tr/locale/tr/messenger-smime/",
+        "messenger-mapi": "chrome/tr/locale/tr/messenger-mapi/",
         "devtools-shared": "chrome/tr/locale/tr/devtools/shared/",
         "messenger-region": "chrome/tr/locale/tr/messenger-region/",
-        "communicator": "chrome/tr/locale/tr/communicator/",
-        "lightning": "chrome/tr/locale/tr/lightning/",
-        "messenger-mapi": "chrome/tr/locale/tr/messenger-mapi/",
-        "autoconfig": "chrome/tr/locale/tr/autoconfig/",
+        "global": "chrome/tr/locale/tr/global/",
         "pluginproblem": "chrome/tr/locale/tr/pluginproblem/",
         "chat": "chrome/tr/locale/tr/chat/",
+        "branding": "chrome/tr/locale/tr/branding/",
+        "devtools": "chrome/tr/locale/tr/devtools/client/",
+        "devtools-startup": "chrome/tr/locale/tr/devtools/startup/",
+        "passwordmgr": "chrome/tr/locale/tr/passwordmgr/",
+        "communicator": "chrome/tr/locale/tr/communicator/",
+        "messenger": "chrome/tr/locale/tr/messenger/",
         "places": "chrome/tr/locale/tr/places/",
-        "alerts": "chrome/tr/locale/tr/alerts/",
+        "lightning": "chrome/tr/locale/tr/lightning/",
         "pippki": "chrome/tr/locale/tr/pippki/",
-        "mozapps": "chrome/tr/locale/tr/mozapps/",
         "calendar": "chrome/tr/locale/tr/calendar/",
-        "devtools-startup": "chrome/tr/locale/tr/devtools/startup/"
-      },
-      "version": "20200403080822"
+        "mozldap": "chrome/tr/locale/tr/mozldap/",
+        "autoconfig": "chrome/tr/locale/tr/autoconfig/",
+        "pipnss": "chrome/tr/locale/tr/pipnss/",
+        "alerts": "chrome/tr/locale/tr/alerts/",
+        "mozapps": "chrome/tr/locale/tr/mozapps/"
+      }
+    }
+  },
+  "langpack_id": "tr",
+  "description": "Language pack for Thunderbird for tr",
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "strict_max_version": "76.*",
+      "id": "langpack-tr@thunderbird.mozilla.org"
     }
   },
-  "version": "76.0buildid20200407173003"
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "manifest_version": 2,
+  "author": "mozilla.org (contributors: Mozilla Türkiye takımı)",
+  "version": "76.0buildid20200420212409",
+  "name": "Türkçe (TR) Language Pack"
 }
diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties
index 3e36e20eb8c4..ab5ac933d825 100644
--- a/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties
+++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=Цей елемент має вміст, що
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=Немає пов'язаного правила
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=Утримуйте натиснутою Shift і клацніть, щоб перейти до правила
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties
index 0ff6365a2c75..02a69caa8404 100644
--- a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties
+++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=Таблицю стилів %1$S було завантажено,
 
 PEUnexpEOF2=Неочікуваний кінець файла під час пошуку %1$S.
 PEParseRuleWSOnly=Для розбору правила було передано рядок, що містить лише порожні місця.
+
 PEDeclDropped=Оголошення пропущено.
 PEDeclSkipped=Пропущено до наступного оголошення.
 PEUnknownProperty=Невідома властивість '%1$S'.
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=Лише одне повторення
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Лише одне повторення (автозаповнення, …) чи повторення (автопідбір розмірів, …) дозволено у трек-листі.
 PEMoreThanOneGridRepeatTrackSize=Лише один розмір треку дозволено всередині повтору (автопідбір розмірів /auto-fill, …).
 
+PEDisallowedImportRule=Правила @import ще не діють у створених таблицях стилів.
+
 TooLargeDashedRadius=Надто великий радіус границі для стилю ‘dashed’ (обмеження 100000px). Візуалізація як суцільний.
 TooLargeDottedRadius=Надто великий радіус границі для стилю ‘dotted’ (обмеження 100000px). Візуалізація як суцільний.
diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties
index e51b86656266..7a83783a05f0 100644
--- a/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties
+++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = Завантаження заборонено через X-Frame-Optio
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = Завантаження заборонено через X-Frame-Options: “%1$S” з “%2$S”, сайт не дозволяє cross-origin фреймінг з “%3$S”.
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = Знайдено недійсний заголовок X-Frame-Options при завантаженні “%2$S”: “%1$S” не є дійсною директивою.
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=Завантаження “%2$S” в фреймі заборонено директивою “X-Frame-Options“, встановленою на “%1$S“.
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = Оновлення незахищеного запиту “%1$S” для використання “%2$S”.
diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd
index 3d0801de8a9c..edaaa4efcf28 100644
--- a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd
+++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "Пошук листів…">
 <!ENTITY searchMailCmd.accesskey "П">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "Глобальний пошук…">
+<!ENTITY glodaSearchCmd.accesskey "Г">
 <!ENTITY searchAddressesCmd.label "Пошук адрес…">
 <!ENTITY searchAddressesCmd.accesskey "а">
 
diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd
index a1511282b595..91a580e83c1e 100644
--- a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd
+++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/messengercompose/EdDialogOverlay.dtd
@@ -14,7 +14,5 @@
 <!ENTITY makeUrlRelative.tooltip "Змінити абсолютний URL на відносний. Перед зміною вам потрібно зберегти сторінку.">
 
 <!-- Shared by Link and Image dialogs -->
-<!ENTITY LinkURLEditField.label "Введіть адресу веб-сторінки, локального файлу або виберіть якір або заголовок з ім’ям із списку:">
-<!ENTITY LinkURLEditField.accessKey "а">
-<!ENTITY LinkURLEditField2.label "Введіть адресу веб-сторінки, локального файлу або виберіть якір чи заголовок з іменем з контекстного меню поля:">
+<!ENTITY LinkURLEditField2.label "Введіть адресу вебсторінки, локального файлу або виберіть якір чи заголовок з іменем з контекстного меню поля:">
 <!ENTITY LinkURLEditField2.accessKey "а">
diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties
index 244fe15f3777..27072b662dbb 100644
--- a/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties
+++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=Цей лист зашифровано з допомогою OpenPGP.<br>Щоб розшифрувати цей лист, вам потрібно встановити <a href="%S">додаток OpenPGP</a>.
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=Це зашифроване OpenPGP повідомлення, але підтримка розшифрування OpenPGP недоступна.
diff --git a/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties b/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties
index 5b8ba0c26944..e7631ee1c0c7 100644
--- a/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties
+++ b/thunderbird-l10n/uk/chrome/uk/locale/uk/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=Автоматично надано 
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=Автоматично надано доступ до сховища для елемента стеження “%2$S” на “%1$S”.
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=Доступ до сховища автоматично надається для основної ізоляції “%2$S” на “%1$S”.
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=Куки “%1$S” відхилено, тому що вони містять атрибут “sameSite=none”, але відсутній атрибут “secure”.
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/uk/localization/uk/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/uk/localization/uk/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..b39360439261
--- /dev/null
+++ b/thunderbird-l10n/uk/localization/uk/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Перенаправлення URI календаря
+calendar-uri-redirect-description =
+    Сервер перенаправляє URI для календаря "{ $calendarName }".
+    Схвалити перенаправлення і почати використання нового URI для цього календаря?
+calendar-uri-redirect-original-uri-label = Поточний URI:
+calendar-uri-redirect-target-uri-label = Перенаправлення на новий URI:
diff --git a/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl b/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl
index 94d1b9016b1d..7cbc3385f925 100644
--- a/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/uk/localization/uk/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = Вітаємо в { -brand-full-name }
+account-settings = Налаштування облікового запису
+#   $accounts (Number) - the number of configured accounts
 setup-title = Виберіть що налаштувати
 about-title = Про { -brand-full-name }
 resources-title = Ресурси
@@ -40,3 +42,10 @@ explore-link = Дослідіть можливості
 support-link = Підтримка
 involved-link = Долучитися
 developer-link = Документація розробника
+read = Читати повідомлення
+compose = Написати лист
+search = Пошук повідомлень
+filter = Керувати фільтрами повідомлень
+nntp-subscription = Керувати підписками на групи новин
+rss-subscription = Керувати підписками стрічок
+e2e = Наскрізне шифрування
diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl
index e4379840dcde..5969b79d872b 100644
--- a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Встановити додаток з файлу…
     .accesskey = В
 help-button = Підтримка додатків
+sidebar-help-button-title =
+    .title = Підтримка додатків
 preferences =
     { PLATFORM() ->
         [windows] Налаштування { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Інструменти для всіх додатків
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Налаштування { -brand-short-name }
+           *[other] Налаштування { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Деякі розширення не можуть бути перевірені
 show-all-extensions-button =
@@ -173,13 +181,29 @@ extensions-view-available-updates =
     .name = Доступні оновлення
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Рекомендації
+addon-category-discover-title =
+    .title = Рекомендації
 addon-category-extension = Розширення
+addon-category-extension-title =
+    .title = Розширення
 addon-category-theme = Теми
+addon-category-theme-title =
+    .title = Теми
 addon-category-plugin = Плагіни
+addon-category-plugin-title =
+    .title = Плагіни
 addon-category-dictionary = Словники
+addon-category-dictionary-title =
+    .title = Словники
 addon-category-locale = Мови
+addon-category-locale-title =
+    .title = Мови
 addon-category-available-updates = Доступні оновлення
+addon-category-available-updates-title =
+    .title = Доступні оновлення
 addon-category-recent-updates = Недавні оновлення
+addon-category-recent-updates-title =
+    .title = Недавні оновлення
 
 ## These are global warnings
 
@@ -292,6 +316,7 @@ shortcuts-no-commands = Такі розширення не мають комбі
 shortcuts-input =
     .placeholder = Введіть комбінацію клавіш
 shortcuts-browserAction = Активувати розширення
+shortcuts-browserAction2 = Активувати кнопку панелі
 shortcuts-pageAction = Активувати дію сторінки
 shortcuts-sidebarAction = Перемкнути бічну панель
 shortcuts-modifier-mac = Додайте Ctrl, Alt, або ⌘
@@ -318,6 +343,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Показати менше
 go-back-button =
     .tooltiptext = Повернутись назад
+header-back-button =
+    .title = Повернутись назад
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl
index 595753451eec..af62199eaf96 100644
--- a/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/uk/localization/uk/toolkit/about/aboutSupport.ftl
@@ -295,6 +295,11 @@ sandbox-proc-type-content = вміст
 sandbox-proc-type-file = вміст файлу
 sandbox-proc-type-media-plugin = медіаплагін
 sandbox-proc-type-data-decoder = декодер даних
+startup-cache-title = Кеш запуску
+startup-cache-disk-cache-path = Шлях дискового кешу
+startup-cache-ignore-disk-cache = Ігнорувати дисковий кеш
+startup-cache-found-disk-cache-on-init = Знайдено дисковий кеш в Init
+startup-cache-wrote-to-disk-cache = Записано в дисковий кеш
 launcher-process-status-0 = Увімкнено
 launcher-process-status-1 = Вимкнено через збій
 launcher-process-status-2 = Примусово вимкнено
@@ -318,6 +323,7 @@ touch-enabled = сенсорне введення увімкнено
 drag-enabled = перетягування смуги прокручування увімкнено
 keyboard-enabled = клавіатура увімкнена
 autoscroll-enabled = авто-прокручування увімкнено
+zooming-enabled = smooth pinch-zoom увімкнено
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl
index 9796a192ec0f..b740b6fddec4 100644
--- a/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/uk/localization/uk/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM (сертифікат)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (ланцюжок сертифікатів)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Це розширення було позначене критичним, тобто клієнти повинні відхилити сертифікат, якщо вони його не розуміють.
+certificate-viewer-export = Експорт
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Ваші сертифікати
+certificate-viewer-tab-people = Люди
+certificate-viewer-tab-servers = Сервери
+certificate-viewer-tab-ca = Центри сертифікації
+certificate-viewer-tab-unkonwn = Невідомо
diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl
index b1a22d72d4f6..2c6c24ed8163 100644
--- a/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/uk/localization/uk/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Ізольований веб-вміст
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Сокет
diff --git a/thunderbird-l10n/uk/localization/uk/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/uk/localization/uk/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..7dff6a9b5051
--- /dev/null
+++ b/thunderbird-l10n/uk/localization/uk/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Ви запустили застарілу версію { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Створити новий профіль
+profiledowngrade-sync = Використання застарілої версії { -brand-product-name } може пошкодити закладки та історію перегляду, що раніше збережені в наявному профілі. Для захисту інформації, створіть новий профіль для цього встановлення { -brand-short-name }. Ви завжди можете виконати вхід в { -fxaccount-brand-name } для синхронізації своїх закладок та історії перегляду між різними профілями.
+profiledowngrade-nosync = Використання застарілої версії { -brand-product-name } може пошкодити закладки та історію перегляду, що раніше збережені в наявному профілі. Для захисту інформації, створіть новий профіль для цього встановлення { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Вийти
+           *[other] Вихід
+        }
diff --git a/thunderbird-l10n/uk/manifest.json b/thunderbird-l10n/uk/manifest.json
index 405455582542..6bada154d25e 100644
--- a/thunderbird-l10n/uk/manifest.json
+++ b/thunderbird-l10n/uk/manifest.json
@@ -1,57 +1,57 @@
 {
-  "description": "Language pack for Thunderbird for uk",
-  "langpack_id": "uk",
-  "version": "76.0buildid20200407173003",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
+  "author": "mozilla.org (contributors: Артем Поліванчук, Сергій Хоружин, Тимофій Бабич, Тимур Фараджев)",
   "applications": {
     "gecko": {
-      "strict_min_version": "76.0",
       "strict_max_version": "76.*",
-      "id": "langpack-uk@thunderbird.mozilla.org"
+      "id": "langpack-uk@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
     }
   },
-  "author": "mozilla.org (contributors: Артем Поліванчук, Сергій Хоружин, Тимофій Бабич, Тимур Фараджев)",
-  "name": "Ukrainian (UA) Language Pack",
   "languages": {
     "uk": {
-      "version": "20200403201442",
       "chrome_resources": {
-        "messenger-newsblog": "chrome/uk/locale/uk/messenger-newsblog/",
+        "passwordmgr": "chrome/uk/locale/uk/passwordmgr/",
         "devtools-shared": "chrome/uk/locale/uk/devtools/shared/",
+        "communicator": "chrome/uk/locale/uk/communicator/",
+        "pipnss": "chrome/uk/locale/uk/pipnss/",
+        "devtools-startup": "chrome/uk/locale/uk/devtools/startup/",
+        "places": "chrome/uk/locale/uk/places/",
         "global": "chrome/uk/locale/uk/global/",
-        "chat": "chrome/uk/locale/uk/chat/",
-        "mozldap": "chrome/uk/locale/uk/mozldap/",
-        "branding": "chrome/uk/locale/uk/branding/",
-        "mozapps": "chrome/uk/locale/uk/mozapps/",
+        "messenger": "chrome/uk/locale/uk/messenger/",
+        "alerts": "chrome/uk/locale/uk/alerts/",
         "pluginproblem": "chrome/uk/locale/uk/pluginproblem/",
-        "necko": "chrome/uk/locale/uk/necko/",
-        "pippki": "chrome/uk/locale/uk/pippki/",
         "messenger-mapi": "chrome/uk/locale/uk/messenger-mapi/",
         "calendar": "chrome/uk/locale/uk/calendar/",
+        "messenger-newsblog": "chrome/uk/locale/uk/messenger-newsblog/",
+        "pippki": "chrome/uk/locale/uk/pippki/",
+        "necko": "chrome/uk/locale/uk/necko/",
+        "messenger-region": "chrome/uk/locale/uk/messenger-region/",
+        "mozapps": "chrome/uk/locale/uk/mozapps/",
+        "branding": "chrome/uk/locale/uk/branding/",
+        "devtools": "chrome/uk/locale/uk/devtools/client/",
+        "lightning": "chrome/uk/locale/uk/lightning/",
+        "messenger-smime": "chrome/uk/locale/uk/messenger-smime/",
+        "mozldap": "chrome/uk/locale/uk/mozldap/",
+        "autoconfig": "chrome/uk/locale/uk/autoconfig/",
         "global-platform": {
-          "macosx": "chrome/uk/locale/uk/global-platform/mac/",
-          "linux": "chrome/uk/locale/uk/global-platform/unix/",
+          "win": "chrome/uk/locale/uk/global-platform/win/",
           "android": "chrome/uk/locale/uk/global-platform/unix/",
-          "win": "chrome/uk/locale/uk/global-platform/win/"
+          "macosx": "chrome/uk/locale/uk/global-platform/mac/",
+          "linux": "chrome/uk/locale/uk/global-platform/unix/"
         },
-        "places": "chrome/uk/locale/uk/places/",
-        "lightning": "chrome/uk/locale/uk/lightning/",
-        "autoconfig": "chrome/uk/locale/uk/autoconfig/",
-        "devtools": "chrome/uk/locale/uk/devtools/client/",
-        "pipnss": "chrome/uk/locale/uk/pipnss/",
-        "messenger": "chrome/uk/locale/uk/messenger/",
-        "alerts": "chrome/uk/locale/uk/alerts/",
-        "devtools-startup": "chrome/uk/locale/uk/devtools/startup/",
-        "messenger-region": "chrome/uk/locale/uk/messenger-region/",
-        "messenger-smime": "chrome/uk/locale/uk/messenger-smime/",
-        "communicator": "chrome/uk/locale/uk/communicator/",
-        "passwordmgr": "chrome/uk/locale/uk/passwordmgr/"
-      }
+        "chat": "chrome/uk/locale/uk/chat/"
+      },
+      "version": "20200416120505"
     }
-  }
+  },
+  "langpack_id": "uk",
+  "name": "Ukrainian (UA) Language Pack",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "manifest_version": 2,
+  "description": "Language pack for Thunderbird for uk"
 }
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties
index 1df3ffd9e1fd..64d07973f5cc 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/aboutdebugging.properties
@@ -49,10 +49,13 @@ addonDebugging.tooltip = Bu funksiyani yoqib qo‘ysangiz, qo‘shimcha dastur v
 # the MDN documentation page for about:debugging.
 # (https://developer.mozilla.org/docs/Tools/about:debugging#Enabling_add-on_debugging)
 
-# LOCALIZATION NOTE (loadTemporaryAddon):
+# LOCALIZATION NOTE (loadTemporaryAddon2):
 # This string is displayed as a label of a button that allows the user to
 # load additional add-ons.
-loadTemporaryAddon = Vaqtinchalik qo‘shimcha dasturni yuklash
+
+# LOCALIZATION NOTE (addonInstallError):
+# This string is displayed when an error occurs while installing an addon.
+# %S will be replaced with the error message.
 
 # LOCALIZATION NOTE (retryTemporaryInstall):
 # This string is displayed as a label of a button that allows the user to
@@ -65,6 +68,9 @@ extensions = Kengaytmalar
 # LOCALIZATION NOTE (temporaryExtensions):
 # This string is displayed as a header above the list of temporarily loaded add-ons.
 
+# LOCALIZATION NOTE (systemExtensions):
+# This string is displayed as a header above the list of system add-ons.
+
 # LOCALIZATION NOTE (internalUUID):
 # This string is displayed as a label for the internal UUID of an extension.
 # The UUID is generated for this profile on install.
@@ -93,6 +99,13 @@ extensions = Kengaytmalar
 # This string is displayed as a link next to the temporaryID message and leads
 # the user to MDN.
 
+# LOCALIZATION NOTE (legacyExtensionWarning):
+# This string is displayed as a warning message when loading a temporary legacy extension.
+
+# LOCALIZATION NOTE (legacyExtensionWarning.learnMore):
+# This string is displayed as a link next to the legacyExtensionWarning message and leads
+# the user to https://wiki.mozilla.org/Add-ons/Future_of_Bootstrap.
+
 # LOCALIZATION NOTE (selectAddonFromFile2):
 # This string is displayed as the title of the file picker that appears when
 # the user clicks the 'Load Temporary Add-on' button
@@ -129,7 +142,7 @@ otherWorkers = Other Workers
 
 # LOCALIZATION NOTE (tabs):
 # This string is displayed as a header of the about:debugging#tabs page.
-tabs = Ichki oynalar
+tabs = Varaqlar
 
 # LOCALIZATION NOTE (pageNotFound):
 # This string is displayed as the main message at any error/invalid page.
@@ -159,14 +172,14 @@ nothing = Hozircha hech narsa yo‘q.
 # This string is displayed as a warning message on top of the about:debugging#workers
 # page when multi-e10s is enabled
 
-# LOCALIZATION NOTE (multiProcessWarningMessage):
+# LOCALIZATION NOTE (multiProcessWarningMessage2):
 # This string is displayed in the warning section for multi-e10s in
 # about:debugging#workers
 
-# LOCALIZATION NOTE (multiProcessWarningLink):
+# LOCALIZATION NOTE (multiProcessWarningUpdateLink2):
 # This string is the text content of a link in the warning section for multi-e10s in
 # about:debugging#workers. The link updates the pref and restarts the browser.
 
-# LOCALIZATION NOTE (multiProcessWarningConfirmUpdate):
+# LOCALIZATION NOTE (multiProcessWarningConfirmUpdate2):
 # This string is displayed as a confirmation message when the user clicks on
 # the multiProcessWarningUpdateLink in about:debugging#workers
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd
index b8493089ac4b..6404f08c5bc2 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/connection-screen.dtd
@@ -1,29 +1,29 @@
 <!-- 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/. -->
+
 <!-- LOCALIZATION NOTE : FILE This file contains the Remote Connection strings.
   - The Remote Connection window can reached from the "connect…" menuitem
   - in the Web Developer menu.
   - -->
 
-
 <!ENTITY title      "Ulanish">
 <!ENTITY header     "Masofadagi qurilmaga ulanish.">
 <!ENTITY host       "Host:">
 <!ENTITY port       "Port:">
 <!ENTITY connect    "Ulanish">
 <!ENTITY connecting "Ulanmoqda...">
-<!ENTITY availableAddons "Mavjud masofadagi ichki oynalar:">
-<!ENTITY availableTabs "Mavjud masofadagi ichki oynalar:">
+<!ENTITY availableAddons "Mavjud masofadagi varaqlar:">
+<!ENTITY availableTabs "Mavjud masofadagi varaqlar:">
 <!ENTITY availableProcesses "Mavjud masofadagi jarayonlar:">
 <!ENTITY connectionError "Xato:">
 <!ENTITY errorTimeout "Xato: ulanish vaqti o‘tib ketdi">
 <!ENTITY errorRefused "Xato: ulanish rad etildi.">
 <!ENTITY errorUnexpected "Kutilmagan xato.">
+
 <!-- LOCALIZATION NOTE (remoteHelp, remoteDocumentation, remoteHelpSuffix):
 these strings will be concatenated in a single label, remoteDocumentation will
 be used as text for a link to MDN. -->
-
 <!ENTITY remoteHelp "Firefox dasturlash asboblari masofadagi qurilmalarni (masalan, Android va Firefox OS uchun Firefox) tuzata oladi. Masofadagi qurilmada &quot;Masofadan tuzatish&quot;ni yoqib qo‘yilganligiga ishonch hosil qiling. Ko‘proq ma’lumot olish uchun   ">
 <!ENTITY remoteDocumentation "qo‘llanmani ko‘ring">
 <!ENTITY remoteHelpSuffix ".">
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties
index 2913fb96cad8..d15526c4f57b 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/debugger.properties
@@ -10,25 +10,76 @@
 # A good criteria is the language in which you'd find the best
 # documentation on web development on the web.
 
-# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button
-# that collapses the left and right panes in the debugger UI.
-collapsePanes=Panellarni yig‘ish
+# LOCALIZATION NOTE (collapseSources): This is the tooltip for the button
+# that collapses the Sources and Outlines panes in the debugger UI.
+
+# LOCALIZATION NOTE (collapseBreakpoints): This is the tooltip for the button
+# that collapses the Breakpoints panes in the debugger UI.
+
+# LOCALIZATION NOTE (copyToClipboard.label): This is the text that appears in the
+# context menu to copy the complete source of the open file.
+
+# LOCALIZATION NOTE (copySource.label): This is the text that appears in the
+# context menu to copy the selected source of file open.
+
+# LOCALIZATION NOTE (copySource.label): This is the text that appears in the
+# context menu to copy the selected source of file open.
+
+# LOCALIZATION NOTE (copySourceUri2): This is the text that appears in the
+# context menu to copy the source URI of file open.
+
+# LOCALIZATION NOTE (collapseAll.label): This is the text that appears in the
+# context menu to collapse a directory and all of its subdirectories.
+
+# LOCALIZATION NOTE (expandAll.label): This is the text that appears in the
+# context menu to expand a directory and all of its subdirectories.
+
+# LOCALIZATION NOTE (setDirectoryRoot.label): This is the text that appears in the
+# context menu to set a directory as root directory
+
+# LOCALIZATION NOTE (removeDirectoryRoot.label): This is the text that appears in the
+# context menu to remove a directory as root directory
+
+# LOCALIZATION NOTE (blackBoxAll.label): Text associated with the blackbox context menu item
+
+# LOCALIZATION NOTE (blackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllInGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected group
+
+# LOCALIZATION NOTE (blackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected group
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideGroup.label): This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected group
 
-# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the
-# context menu to copy the source URL of file open.
+# LOCALIZATION NOTE (blackBoxAllInDir.label): This is the text that appears in the
+# context submenu to blackbox all files inside of the selected directory
 
-# LOCALIZATION NOTE (copySourceUrl.accesskey): Access key to copy the source URL of a file from
-# the context menu.
+# LOCALIZATION NOTE (unblackBoxAllInDir.label): This is the text that appears in the
+# context submenu to unblackbox all files inside of the selected directory
+
+# LOCALIZATION NOTE (blackBoxAllOutsideDir.label): This is the text that appears in the
+# context submenu to blackbox all files outside of the selected directory
+
+# LOCALIZATION NOTE (unblackBoxAllOutsideDir.label: This is the text that appears in the
+# context submenu to unblackbox all files outside of the selected directory
+
+# LOCALIZATION NOTE (copyFunction.label): This is the text that appears in the
+# context menu to copy the function the user selected
 
 # LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the
 # context menu to copy the stack trace methods, file names and row number.
 
-# LOCALIZATION NOTE (copyStackTrace.accesskey): Access key to copy the stack trace data from
-# the context menu.
+# LOCALIZATION NOTE (expandSources): This is the tooltip for the button
+# that expands the Sources and Outlines panes in the debugger UI.
+
+# LOCALIZATION NOTE (expandBreakpoints): This is the tooltip for the button
+# that expands the Breakpoints panes in the debugger UI.
 
-# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button
-# that expands the left and right panes in the debugger UI.
-expandPanes=Panellarni yoyish
+# LOCALIZATION NOTE (evaluateInConsole.label): Editor right-click menu item
+# to execute selected text in browser console.
 
 # LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause
 # button when the debugger is in a running state.
@@ -49,6 +100,38 @@ pausePendingButtonTooltip=Keyingi bajarish kutilmoqda
 # LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the
 # button that steps out of a function call.
 
+# LOCALIZATION NOTE (skipPausingTooltip.label): The tooltip text for disabling all
+# breakpoints and pausing triggers
+
+# LOCALIZATION NOTE (undoSkipPausingTooltip.label): The tooltip text for enabling all
+# breakpoints and pausing triggers
+
+# LOCALIZATION NOTE (pauseButtonItem): The label that is displayed for the dropdown pause
+# list item when the debugger is in a running state.
+
+# LOCALIZATION NOTE (ignoreExceptionsItem): The pause on exceptions button description
+# when the debugger will not pause on exceptions.
+
+# LOCALIZATION NOTE (pauseOnUncaughtExceptionsItem): The pause on exceptions dropdown
+# item shown when a user is adding a new breakpoint.
+
+# LOCALIZATION NOTE (pauseOnExceptionsItem2): The pause on exceptions checkbox description
+# when the debugger will pause on all exceptions.
+
+# LOCALIZATION NOTE (ignoreCaughtExceptionsItem): The pause on exceptions checkbox description
+# when the debugger will not pause on any caught exception
+
+# LOCALIZATION NOTE (pauseOnCaughtExceptionsItem): The pause on exceptions checkbox description
+# when the debugger should pause on caught exceptions
+
+# LOCALIZATION NOTE (workersHeader): The text to display in the events
+# header.
+
+# LOCALIZATION NOTE (threadsHeader): The text to describe the threads header
+
+# LOCALIZATION NOTE (mainThread): The text to describe the thread of the
+# program as opposed to worker threads.
+
 # LOCALIZATION NOTE (noWorkersText): The text to display in the workers list
 # when there are no workers.
 noWorkersText=Bu sahifada workers yo‘q.
@@ -117,35 +200,115 @@ otherEvents=Boshqa
 # the user hovers over the checkbox used to toggle blackboxing its associated
 # source.
 
+# LOCALIZATION NOTE (eventListenersHeader1): The text to display in the events
+# header.
+
+# LOCALIZATION NOTE (noDomMutationBreakpoints): The text to
+# display in the DOM Mutation Breakpoints pane when there are no events.
+# %S will be replaced by an active link using inspectorTool as text
+
+# LOCALIZATION NOTE (inspectorTool): The text to describe the the Inspector tool
+
+# LOCALIZATION NOTE (eventListenersHeader1.placeholder): The placeholder text in
+# the event search input bar
+
+# LOCALIZATION NOTE (domMutationHeader): The text to display in the
+# DOM Mutation Breakpoints header
+
+# LOCALIZATION NOTE (domMutationTypes.attribute): The text to display in the
+# DOM Mutation Breakpoints panel for an attribute change
+
+# LOCALIZATION NOTE (domMutationTypes.removal): The text to display in the
+# DOM Mutation Breakpoints panel for a DOM node removal
+
+# LOCALIZATION NOTE (domMutationTypes.subtree): The text to display in the
+# DOM Mutation Breakpoints panel for a DOM subtree change
+
 # LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for
 # searching all the source files the debugger has seen.
+# Do not localize "CmdOrCtrl+P", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
 
 # LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the
 # search for searching all the source files the debugger has seen.
+# Do not localize "CmdOrCtrl+O", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
 
 # LOCALIZATION NOTE (projectTextSearch.key): A key shortcut to open the
 # full project text search for searching all the files the debugger has seen.
+# Do not localize "CmdOrCtrl+Shift+F", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (allShortcut.key): A key shortcut to open the
+# modal of full shortcuts list.
+# Do not localize "CmdOrCtrl+/", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (functionSearch.key): A key shortcut to open the
+# modal for searching functions in a file.
+# Do not localize "CmdOrCtrl+Shift+O", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (toggleBreakpoint.key): A key shortcut to toggle
+# breakpoints.
+# Do not localize "CmdOrCtrl+B", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (toggleCondPanel.breakpoint.key): A key shortcut to toggle
+# the conditional panel for breakpoints.
+# Do not localize "CmdOrCtrl+Shift+B", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (toggleCondPanel.logPoint.key): A key shortcut to toggle
+# the conditional panel for log points.
+# Do not localize "CmdOrCtrl+Shift+Y", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (stepOut.key): A key shortcut to
+# step out.
+
+# LOCALIZATION NOTE (shortcuts.header.editor): Sections header in
+# the shortcuts modal for keyboard shortcuts related to editing.
+
+# LOCALIZATION NOTE (shortcuts.header.stepping): Sections header in
+# the shortcuts modal for keyboard shortcuts related to stepping.
+
+# LOCALIZATION NOTE (shortcuts.header.search): Sections header in
+# the shortcuts modal for keyboard shortcuts related to search.
+
+# LOCALIZATION NOTE (projectTextSearch.placeholder): A placeholder shown
+# when searching across all of the files in a project.
+
+# LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search
+# message when the query did not match any text of all files in a project.
 
 # LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger
 # does not have any sources.
 
-# LOCALIZATION NOTE (sourcesPane.showSourcesTooltip): The tooltip shown when
-# the user will navigate to the source tree view.
-
-# LOCALIZATION NOTE (sourcesPane.showOutlineTooltip): The tooltip shown when
-# the user will navigate to the source outline view.
+# LOCALIZATION NOTE (sources.noSourcesAvailableRoot): Text shown when the debugger
+# does not have any sources under a specific directory root.
 
 # LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search
 # for searching within a the currently opened files in the editor
+# Do not localize "CmdOrCtrl+F", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+sourceSearch.search.key2=CmdOrCtrl+F
 
 # LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in
 # the source search input bar
 
+# LOCALIZATION NOTE (sourceSearch.search.placeholder2): placeholder text in
+# the source search input bar
+
 # LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight
 # the next occurrence of the last search triggered from a source search
+# Do not localize "CmdOrCtrl+G", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
 
 # LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight
 # the previous occurrence of the last search triggered from a source search
+# Do not localize "CmdOrCtrl+Shift+G", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
 
 # LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of
 # the number of matches for autocomplete
@@ -178,9 +341,12 @@ searchPanelGlobal=Barcha fayllar ichidan izlash (%S)
 # filter panel popup for the function search operation.
 searchPanelFunction=Funksiyalarni aniqlashni izlash (%S)
 
+# LOCALIZATION NOTE (searchPanelFunction2): This is the text that appears in the
+# filter panel popup for the function search operation.
+
 # LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the
 # filter panel popup for the token search operation.
-searchPanelToken=Ushbu sahifadan topish (%S)
+searchPanelToken=%S fayli ichidan topish
 
 # LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the
 # filter panel popup for the line search operation.
@@ -190,9 +356,29 @@ searchPanelGoToLine=Qatorga o‘tish (%S)
 # filter panel popup for the variables search operation.
 searchPanelVariable=O‘zgaruvchan qiymatlar filteri (%S)
 
+# LOCALIZATION NOTE (sourceSearch.search.again.key3): Key shortcut to highlight
+# the next occurrence of the last search triggered from a source search
+# Do not localize "Cmd+G", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (sourceSearch.search.againPrev.key3): Key shortcut to highlight
+# the previous occurrence of the last search triggered from a source search
+# Do not localize "Cmd+Shift+G", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE (sourceSearch.resultsSummary2): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# Shows a summary of the number of matches for autocomplete
+
+# LOCALIZATION NOTE (breakpointHeadingMenuItem.*): The text for all the elements
+# that are displayed in the breakpoint headings menu item popup.
+
 # LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that
 # are displayed in the breakpoints menu item popup.
 breakpointMenuItem.setConditional=Muhit to‘xtash nuqtasini moslash
+
+# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that
+# are displayed in the breakpoints menu item popup.
 breakpointMenuItem.enableSelf=To‘xtash nuqtasini yoqib qo‘yish
 breakpointMenuItem.disableSelf=To‘xtash nuqtasini o‘chirib qo‘yish
 breakpointMenuItem.deleteSelf=To‘xtash nuqtasini olib tashlash
@@ -228,12 +414,31 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash
 # LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane
 # message to show more of the frames.
 
+# LOCALIZATION NOTE (callStack.group.expandTooltip): The text that will appear
+# when hovering a collapsed Group of frames in the callStack panel. `frames` is
+# always plural since a group can only exist if it contain more that 1 frame.
+# %S is replaced by the name of the library of the frames in the group.
+# example: `Show React frames`.
+
+# LOCALIZATION NOTE (callStack.group.collapseTooltip): The text that will appear
+# when hovering an expanded Group of frames in the callStack panel. `frames` is
+# always plural since a group can only exist if it contain more that 1 frame.
+# %S is replaced by the name of the library of the frames in the group.
+# example: `Collapse React frames`.
+
+# LOCALIZATION NOTE (components.header): Header for the
+# Framework Components pane in the right sidebar.
+
 # LOCALIZATION NOTE (editor.searchResults): Editor Search bar message
 # for the summarizing the selected search result. e.g. 5 of 10 results.
 
-# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.
+# LOCALIZATION NOTE (editor.singleResult): Copy shown when there is one result.
+
+# LOCALIZATION NOTE (editor.searchResults1): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# Editor Search bar message to summarize the selected search result. e.g. 5 of 10 results.
 
-# LOCALIZATION NOTE (editor.noResults): Editor Search bar message
+# LOCALIZATION NOTE (editor.noResultsFound): Editor Search bar message
 # for when no results found.
 
 # LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar
@@ -245,6 +450,9 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash
 # LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for
 # toggling search type buttons(function search, variable search)
 
+# LOCALIZATION NOTE (editor.continueToHere.label): Editor gutter context
+# menu item for jumping to a new paused location
+
 # LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item
 # for adding a breakpoint on a line.
 
@@ -257,33 +465,57 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash
 # LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item
 # for removing a breakpoint on a line.
 
-# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item
+# LOCALIZATION NOTE (editor.addConditionBreakpoint): Editor gutter context
+# menu item for adding a breakpoint condition on a line.
+
+# LOCALIZATION NOTE (editor.editConditionBreakpoint): Editor gutter context menu item
 # for setting a breakpoint condition on a line.
 
-# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context
-# menu item for adding a breakpoint condition on a line.
+# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context menu item
+# for creating a breakpoint with a condition
+
+# LOCALIZATION NOTE (editor.addLogBreakpoint): Editor gutter context menu item
+# for creating a breakpoint with a log
+
+# LOCALIZATION NOTE (editor.addLogPoint): Editor gutter context
+# menu item for adding a log point on a line.
+
+# LOCALIZATION NOTE (editor.editLogPoint): Editor gutter context menu item
+# for editing a log point already set on a line.
+
+# LOCALIZATION NOTE (editor.removeLogPoint): Context menu item for removing
+# a log point on a line.
 
-# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for
+# LOCALIZATION NOTE (editor.conditionalPanel.placeholder2): Placeholder text for
 # input element inside ConditionalPanel component
 
-# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for
+# LOCALIZATION NOTE (editor.conditionalPanel.logPoint.placeholder2): Placeholder text for
+# input element inside ConditionalPanel component when a log point is set
+
+# LOCALIZATION NOTE (editor.conditionalPanel.close): Tooltip text for
 # close button inside ConditionalPanel component
 
 # LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item
 # for navigating to a source mapped location
 
+# LOCALIZATION NOTE (downloadFile.label): Context menu item
+# for downloading a source's content
+
+# LOCALIZATION NOTE (inlinePreview.show.label): Context menu item
+# for showing the inline preview blocks
+
+# LOCALIZATION NOTE (inlinePreview.hide.label): Context menu item
+# for hiding the inline preview block
+
+# LOCALIZATION NOTE (preview.noProperties): Label shown in the preview
+# popup when there are no properties to show.
+
 # LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the
 # context menu to disable framework grouping.
 
-# LOCALIZATION NOTE (framework.disableGrouping.accesskey): Access key to toggle
-# framework grouping from the context menu.
-
 # LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the
 # context menu to enable framework grouping.
 
-# LOCALIZATION NOTE (framework.enableGrouping.accesskey): Access key to toggle
-# framework grouping from the context menu.
-
 # LOCALIZATION NOTE (generated): Source Map term for a server source location
 
 # LOCALIZATION NOTE (original): Source Map term for a debugger UI source location
@@ -291,69 +523,81 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash
 # LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression
 # input element
 
+# LOCALIZATION NOTE (expressions.errorMsg): Error text for expression
+# input element
+
+# LOCALIZATION NOTE (xhrBreakpoints.header): The pause on any XHR breakpoints headings
+
+# LOCALIZATION NOTE (xhrBreakpoints.item.label): message displayed when reaching a breakpoint for XHR requests. %S is replaced by the path provided as condition for the breakpoint.
+
+# LOCALIZATION NOTE (pauseOnAnyXHR): The pause on any XHR checkbox description
+# when the debugger will pause on any XHR requests.
+
+# LOCALIZATION NOTE (watchpoints.submenu): This is the text for the watchpoints sub-menu.
+
+# LOCALIZATION NOTE (watchpoints.getWatchpoint): This is the text that appears in the
+# watchpoints sub-menu to add a "get" watchpoint on an object property.
+
+# LOCALIZATION NOTE (watchpoints.setWatchpoint): This is the text that appears in the
+# watchpoints submenu to add a "set" watchpoint on an object property.
+
+# LOCALIZATION NOTE (watchpoints.removeWatchpoint): This is the text that appears in the
+# context menu to delete a watchpoint on an object property.
+
+# LOCALIZATION NOTE (watchpoints.removeWatchpointTooltip): This is the text that appears in the
+# tooltip to delete a watchpoint on an object property.
+
 # LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item
 # for closing the selected tab below the mouse.
 
-# LOCALIZATION NOTE (sourceTabs.closeTab.accesskey): Access key to close the currently select
-# source tab from the editor context menu item.
-
 # LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item
 # for closing the other tabs.
 
-# LOCALIZATION NOTE (sourceTabs.closeOtherTabs.accesskey): Access key to close other source tabs
-# from the editor context menu.
-
 # LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item
 # for closing the tabs to the end (the right for LTR languages) of the selected tab.
 
-# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd.accesskey): Access key to close source tabs
-# after the selected tab from the editor context menu.
-
 # LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item
 # for closing all tabs.
 
-# LOCALIZATION NOTE (sourceTabs.closeAllTabs.accesskey): Access key to close all tabs from the
-# editor context menu.
-
 # LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item
 # for revealing source in tree.
 
-# LOCALIZATION NOTE (sourceTabs.revealInTree.accesskey): Access key to reveal a source in the
-# tree from the context menu.
-
-# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item
-# for copying a link address.
-
-# LOCALIZATION NOTE (sourceTabs.copyLink.accesskey): Access key to copy a link addresss from the
-# editor context menu.
-
 # LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item
 # for pretty printing the source.
 
-# LOCALIZATION NOTE (sourceTabs.prettyPrint.accesskey): Access key to pretty print a source from
-# the editor context menu.
-
 # LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated
 # with the blackbox button
 
 # LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated
 # with the blackbox button
 
-# LOCALIZATION NOTE (sourceFooter.unblackbox.accesskey): Access key to blackbox
-# an associated source
+# LOCALIZATION NOTE (blackboxContextItem.blackbox): Text associated
+# with the blackbox context menu item
+
+# LOCALIZATION NOTE (blackboxContextItem.unblackbox): Text associated
+# with the unblackbox context menu item
+
+# LOCALIZATION NOTE (sourceFooter.mappedSource): Text associated
+# with a mapped source. %S is replaced by the source map origin.
+
+# LOCALIZATION NOTE (sourceFooter.mappedSourceTooltip): Tooltip text associated
+# with a mapped source. %S is replaced by the source map origin.
+
+# LOCALIZATION NOTE (sourceFooter.mappedSuffix): Text associated
+# with a mapped source.  Displays next to URLs in tree and tabs.
+
+# LOCALIZATION NOTE (sourceFooter.codeCoverage): Text associated
+# with a code coverage button
 
-# LOCALIZATION NOTE (sourceFooter.blackbox.accesskey): Access key to blackbox
-# an associated source
+# LOCALIZATION NOTE (sourceFooter.currentCursorPosition): Text associated
+# with the current cursor line and column
 
-# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated
-# with a blackboxed source
+# LOCALIZATION NOTE (sourceFooter.currentCursorPosition.tooltip): Text associated
+# with the current cursor line and column
 
 # LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed
 # for close tab button in source tabs.
 
-# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for
-# new tab button in source tabs.
-
 # LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.
 
 # LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message
@@ -362,14 +606,43 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash
 # LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message
 # for when the debugger is not paused.
 
+# LOCALIZATION NOTE (scopes.mapping.label): Scopes right sidebar pane
+# tooltip for checkbox and label
+
+# LOCALIZATION NOTE (eventlisteners.log.label): Event listeners tooltip for
+# checkbox and label
+
+# LOCALIZATION NOTE (eventlisteners.log): Checkbox label for logging events
+
+# LOCALIZATION NOTE (scopes.helpTooltip.label): Scopes right sidebar pane
+# icon tooltip for link to MDN
+
+# LOCALIZATION NOTE (scopes.map.label): Checkbox label to map scopes
+
 # LOCALIZATION NOTE (scopes.block): Refers to a block of code in
 # the scopes pane when the debugger is paused.
 
 # LOCALIZATION NOTE (sources.header): Sources left sidebar header
+sources.header=Manbalar
+
+# LOCALIZATION NOTE (outline.header): Outline left sidebar header
+outline.header=Kontur
+
+# LOCALIZATION NOTE (scopes.mapScopes): Label for toggling scope mappings
+
+# LOCALIZATION NOTE (outline.placeholder): Placeholder text for the filter input
+# element
+
+# LOCALIZATION NOTE (outline.sortLabel): Label for the sort button
+
+# LOCALIZATION NOTE (outline.noFunctions): Outline text when there are no functions to display
+
+# LOCALIZATION NOTE (outline.noFileSelected): Outline text when there are no files selected
 
 # LOCALIZATION NOTE (sources.search): Sources left sidebar prompt
 # e.g. Cmd+P to search. On a mac, we use the command unicode character.
 # On windows, it's ctrl.
+sources.search=%S uchun qidiruv
 
 # LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar
 # pane header.
@@ -381,10 +654,31 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash
 # search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on
 # a mac we use the unicode character.
 
+# LOCALIZATION NOTE (welcome.search2): The center pane welcome panel's
+# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on
+# a mac we use the unicode character.
+
+# LOCALIZATION NOTE (welcome.findInFiles): The center pane welcome panel's
+# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on
+# a mac we use the unicode character.
+
+# LOCALIZATION NOTE (welcome.findInFiles2): The center pane welcome panel's
+# search prompt. e.g. cmd+f to search for files. On windows, it's ctrl+shift+f, on
+# a mac we use the unicode character.
+
+# LOCALIZATION NOTE (welcome.searchFunction): Label displayed in the welcome
+# panel. %S is replaced by the keyboard shortcut to search for functions.
+
+# LOCALIZATION NOTE (welcome.allShortcuts): The label to open the modal of
+# shortcuts, displayed in the welcome panel.
+
 # LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search
 # prompt for searching for files.
 
-# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search
+# LOCALIZATION NOTE (sourceSearch.search2): The center pane Source Search
+# prompt for searching for files.
+
+# LOCALIZATION NOTE (sourceSearch.noResults2): The center pane Source Search
 # message when the query did not match any of the sources.
 
 # LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip
@@ -401,9 +695,11 @@ breakpointMenuItem.deleteAll=Barcha to‘xtash nuqtalarini olib tashlash
 # yet.
 loadingText=Yuklanmoqda...
 
-# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger
+# LOCALIZATION NOTE (wasmIsNotAvailable): The text that is displayed in the
+# script editor when the WebAssembly source is not available.
+
+# LOCALIZATION NOTE (errorLoadingText3): The text that is displayed in the debugger
 # viewer when there is an error loading a file
-errorLoadingText2=Ushbu URL manzilni yuklashda xatolik: %S
 
 # LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the
 # watch expressions list to add a new item.
@@ -413,88 +709,43 @@ addWatchExpressionText=Kuzatish ifodasini qo‘shish
 # variables view popup.
 addWatchExpressionButton=Kuzatish
 
-# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the
-# variables pane when there are no variables to display.
-emptyVariablesText=Ko‘rsatish uchun o‘zgaruvchan qiymat
-
-# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables
-# pane as a header for each variable scope (e.g. "Global scope, "With scope",
-# etc.).
-scopeLabel=%S harakat hududi
-
-# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch
-# expressions scope. This text is displayed in the variables pane as a header for
-# the watch expressions scope.
-watchExpressionsScopeLabel=Kuzatish uchun ifoda
-
-# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text
-# is added to scopeLabel and displayed in the variables pane as a header for
-# the global scope.
-globalScopeLabel=Global
-
-# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is
-# shown before the stack trace in an error.
-variablesViewErrorStacktrace=Stek-treys:
-
-# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed
-# when you have an object preview that does not show all of the elements. At the end of the list
-# you see "N more..." in the web console output.
-# This is a semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of remaining items in the object
-# example: 3 more…
-variablesViewMoreObjects=#1 ta ko‘proq…;#1 ta ko‘proq…
-
-# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed
-# in the variables list on an item with an editable name.
-variablesEditableNameTooltip=Tahrirlash uchun ikki marta bosing
+# LOCALIZATION NOTE (extensionsText): The text that is displayed to represent
+# "moz-extension" directories in the source tree
 
-# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed
-# in the variables list on an item with an editable value.
-variablesEditableValueTooltip=Qiymatni o‘zgartirish uchun bosing
+# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the
+# variables pane when there are no variables to display.
+emptyVariablesText=Ko‘rsatish uchun o‘zgaruvchan qiymat
 
-# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed
-# in the variables list on an item which can be removed.
-variablesCloseButtonTooltip=O‘chirish uchun bosing
+# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables
+# pane as a header for each variable scope (e.g. "Global scope, "With scope",
+# etc.).
+scopeLabel=%S harakat hududi
 
-# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed
-# in the variables list on a getter or setter which can be edited.
-variablesEditButtonTooltip=Qiymatni o‘rnatish uchun bosing
+# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch
+# expressions scope. This text is displayed in the variables pane as a header for
+# the watch expressions scope.
+watchExpressionsScopeLabel=Kuzatish uchun ifoda
 
-# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed
-# in a tooltip on the "open in inspector" button in the the variables list for a
-# DOMNode item.
-variablesDomNodeValueTooltip=Nazorat qilgichdagi tugunlarni tanlash uchun bosing
+# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text
+# is added to scopeLabel and displayed in the variables pane as a header for
+# the global scope.
+globalScopeLabel=Global
 
-# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed
-# in the variables list on certain variables or properties as tooltips.
-# Expanations of what these represent can be found at the following links:
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
-# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
-# It's probably best to keep these in English.
-configurableTooltip=configurable
-enumerableTooltip=enumerable
-writableTooltip=writable
-frozenTooltip=frozen
-sealedTooltip=sealed
-extensibleTooltip=extensible
-overriddenTooltip=overridden
-WebIDLTooltip=WebIDL
+# LOCALIZATION NOTE(gotoLineModal.placeholder): The placeholder
+# text displayed when the user searches for specific lines in a file
 
-# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed
-# in the variables list as a separator between the name and value.
-variablesSeparatorLabel=:
+# LOCALIZATION NOTE(gotoLineModal.title): The message shown to users
+# to open the go to line modal
 
-# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed
-# in the watch expressions list as a separator between the code and evaluation.
-watchExpressionsSeparatorLabel2=\u00A0→
+# LOCALIZATION NOTE(gotoLineModal.key2): The shortcut for opening the
+# go to line modal
+# Do not localize "CmdOrCtrl+;", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
 
-# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed
-# in the functions search panel as a separator between function's inferred name
-# and its real name (if available).
-functionSearchSeparatorLabel=←
+# LOCALIZATION NOTE(gotoLineModal.key3): The shortcut for opening the
+# go to line modal
+# Do not localize "Ctrl+G", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
 
 # LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder
 # text displayed when the user searches for functions in a file
@@ -504,6 +755,11 @@ functionSearchSeparatorLabel=←
 
 # LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for
 # searching for a function or variable
+# Do not localize "CmdOrCtrl+Shift+O", or change the format of the string. These are
+# key identifiers, not messages displayed to the user.
+
+# LOCALIZATION NOTE(symbolSearch.searchModifier.modifiersLabel): A label
+# preceding the group of modifiers
 
 # LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option
 # when searching text in a file
@@ -521,12 +777,6 @@ functionSearchSeparatorLabel=←
 # resumed first.
 resumptionOrderPanelTitle=Bir yoki bir nechta to‘xtatilgan tuzatgichlar bor. Avval eng so‘nggi to‘xtatilgan tuzatgichlarni davom ettiring: %S
 
-variablesViewOptimizedOut=(optimallashtirilganligini ifodalaydi)
-variablesViewUninitialized=(Ishga tushirib bo‘lmaydigan)
-variablesViewMissingArgs=(mavjud emas)
-
-anonymousSourcesLabel=Anonim manba
-
 experimental=Bu sinovdagi xususiyat
 
 # LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed
@@ -536,9 +786,27 @@ experimental=Bu sinovdagi xususiyat
 # LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed
 # in a info block explaining how the debugger is currently paused on a breakpoint
 
+# LOCALIZATION NOTE (whyPaused.eventBreakpoint): The text that is displayed
+# in a info block explaining how the debugger is currently paused on an event
+# breakpoint.
+
 # LOCALIZATION NOTE (whyPaused.exception): The text that is displayed
 # in a info block explaining how the debugger is currently paused on an exception
 
+# LOCALIZATION NOTE (whyPaused.mutationBreakpoint): The text that is displayed
+# in a info block explaining how the debugger is currently paused on a
+# DOM mutation breakpoint
+
+# LOCALIZATION NOTE (whyPaused.mutationBreakpointAdded): The text that
+# is displayed to describe an added node which triggers a subtree modification
+
+# LOCALIZATION NOTE (whyPaused.mutationBreakpointRemoved): The text that
+# is displayed to describe a removed node which triggers a subtree modification
+
+# LOCALIZATION NOTE (whyPaused.interrupted): The text that is displayed
+# in a info block explaining how the debugger is currently paused at
+# a JS execution
+
 # LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed
 # in a info block explaining how the debugger is currently paused while stepping
 # in or out of the stack
@@ -554,10 +822,22 @@ experimental=Bu sinovdagi xususiyat
 # in a info block explaining how the debugger is currently paused on an
 # xml http request
 
+# LOCALIZATION NOTE (whyPaused.XHR): The text that is displayed
+# in a info block explaining how the debugger is currently paused on an
+# xml http request
+
 # LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed
 # in a info block explaining how the debugger is currently paused on a
 # promise rejection
 
+# LOCALIZATION NOTE (whyPaused.getWatchpoint): The text that is displayed
+# in a info block explaining how the debugger is currently paused at a
+# watchpoint on an object property
+
+# LOCALIZATION NOTE (whyPaused.setWatchpoint): The text that is displayed
+# in an info block explaining how the debugger is currently paused at a
+# watchpoint on an object property
+
 # LOCALIZATION NOTE (whyPaused.assert): The text that is displayed
 # in a info block explaining how the debugger is currently paused on an
 # assert
@@ -573,6 +853,150 @@ experimental=Bu sinovdagi xususiyat
 # LOCALIZATION NOTE (ctrl): The text that is used for documenting
 # keyboard shortcuts that use the control key
 
+# LOCALIZATION NOTE (anonymousFunction): this string is used to display
+# JavaScript functions that have no given name - they are said to be
+# anonymous.
+
+# LOCALIZATION NOTE (stacktrace.asyncStack): this string is used to
+# indicate that a given stack frame has an async parent.
+# %S is the "Async Cause" of the frame.
+
+# LOCALIZATION NOTE (shortcuts.toggleBreakpoint): text describing
+# keyboard shortcut action for toggling breakpoint
+
+# LOCALIZATION NOTE (shortcuts.toggleCondPanel.breakpoint): text describing
+# keyboard shortcut action for toggling conditional panel for breakpoints
+
+# LOCALIZATION NOTE (shortcuts.toggleCondPanel.logPoint): text describing
+# keyboard shortcut action for toggling conditional panel for log points
+
+# LOCALIZATION NOTE (shortcuts.pauseOrResume): text describing
+# keyboard shortcut action for pause of resume
+
+# LOCALIZATION NOTE (shortcuts.stepOver): text describing
+# keyboard shortcut action for stepping over
+
+# LOCALIZATION NOTE (shortcuts.stepIn): text describing
+# keyboard shortcut action for stepping in
+
+# LOCALIZATION NOTE (shortcuts.stepOut): text describing
+# keyboard shortcut action for stepping out
+
+# LOCALIZATION NOTE (shortcuts.fileSearch): text describing
+# keyboard shortcut action for source file search
+
+# LOCALIZATION NOTE (shortcuts.fileSearch2): text describing
+# keyboard shortcut action for source file search
+
+# LOCALIZATION NOTE (shortcuts.gotoLine): text describing
+# keyboard shortcut for jumping to a specific line
+
+# LOCALIZATION NOTE (shortcuts.searchAgain): text describing
+# keyboard shortcut action for searching again
+
+# LOCALIZATION NOTE (shortcuts.searchAgain2): text describing
+# keyboard shortcut action for searching again
+
+# LOCALIZATION NOTE (shortcuts.projectSearch): text describing
+# keyboard shortcut action for full project search
+
+# LOCALIZATION NOTE (shortcuts.projectSearch2): text describing
+# keyboard shortcut action for full project search
+
+# LOCALIZATION NOTE (shortcuts.functionSearch): text describing
+# keyboard shortcut action for function search
+
+# LOCALIZATION NOTE (shortcuts.functionSearch2): text describing
+# keyboard shortcut action for function search
+
+# LOCALIZATION NOTE (shortcuts.buttonName): text describing
+# keyboard shortcut button text
+
+# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed
+# in the variables list as a separator between the name and value.
+variablesSeparatorLabel=:
+
+# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed
+# in the watch expressions list as a separator between the code and evaluation.
+watchExpressionsSeparatorLabel2=\u00A0→
+
+# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed
+# in the functions search panel as a separator between function's inferred name
+# and its real name (if available).
+functionSearchSeparatorLabel=←
+
+variablesViewOptimizedOut=(optimallashtirilganligini ifodalaydi)
+variablesViewUninitialized=(Ishga tushirib bo‘lmaydigan)
+variablesViewMissingArgs=(mavjud emas)
+
+anonymousSourcesLabel=Anonim manba
+
+# LOCALIZATION NOTE (variablesDomNodeValueTooltip): The text that is displayed
+# in a tooltip on the "open in inspector" button in the the variables list for a
+# DOMNode item.
+variablesDomNodeValueTooltip=Nazorat qilgichdagi tugunlarni tanlash uchun bosing
+
+# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed
+# in the variables list on a getter or setter which can be edited.
+variablesEditButtonTooltip=Qiymatni o‘rnatish uchun bosing
+
+# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is
+# shown before the stack trace in an error.
+variablesViewErrorStacktrace=Stek-treys:
+
+# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed
+# when you have an object preview that does not show all of the elements. At the end of the list
+# you see "N more..." in the web console output.
+# This is a semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 number of remaining items in the object
+# example: 3 more…
+variablesViewMoreObjects=#1 ta ko‘proq…;#1 ta ko‘proq…
+
+# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed
+# in the variables list on an item with an editable name.
+variablesEditableNameTooltip=Tahrirlash uchun ikki marta bosing
+
+# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed
+# in the variables list on an item with an editable value.
+variablesEditableValueTooltip=Qiymatni o‘zgartirish uchun bosing
+
+# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed
+# in the variables list on an item which can be removed.
+variablesCloseButtonTooltip=O‘chirish uchun bosing
+
+# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed
+# in the variables list on certain variables or properties as tooltips.
+# Explanations of what these represent can be found at the following links:
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
+# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
+# It's probably best to keep these in English.
+configurableTooltip=configurable
+enumerableTooltip=enumerable
+writableTooltip=writable
+frozenTooltip=frozen
+sealedTooltip=sealed
+extensibleTooltip=extensible
+overriddenTooltip=overridden
+WebIDLTooltip=WebIDL
+
+# LOCALIZATION NOTE (serviceWorkerInfo.parsed): State displayed for a service
+# worker that has been parsed.
+# LOCALIZATION NOTE (serviceWorkerInfo.installing): State displayed for a
+# service worker that is being installed.
+# LOCALIZATION NOTE (serviceWorkerInfo.installed): State displayed for a
+# service worker that has finished being installed.
+# LOCALIZATION NOTE (serviceWorkerInfo.activating): State displayed for a
+# service worker that is being activated.
+# LOCALIZATION NOTE (serviceWorkerInfo.activated): State displayed for a
+# service worker that has finished being activated.
+# LOCALIZATION NOTE (serviceWorkerInfo.redundant): State displayed for a
+# service worker that is redundant.
+# LOCALIZATION NOTE (serviceWorkerInfo.unknown): State displayed for a
+# service worker that is in an unknown state.
+
 # LOCALIZATION NOTE (collapseSources): This is the tooltip for the button
 # that collapses the Sources and Outlines panes in the debugger UI.
 collapseSources=Collapse Sources and Outline panes
@@ -761,11 +1185,6 @@ projectTextSearch.placeholder=Find in files…
 # LOCALIZATION NOTE (projectTextSearch.noResults): The center pane Text Search
 # message when the query did not match any text of all files in a project.
 projectTextSearch.noResults=No results found
-# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search
-# for searching within a the currently opened files in the editor
-# Do not localize "CmdOrCtrl+F", or change the format of the string. These are
-# key identifiers, not messages displayed to the user.
-sourceSearch.search.key2=CmdOrCtrl+F
 # LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in
 # the source search input bar
 sourceSearch.search.placeholder=Search in file…
@@ -1059,10 +1478,6 @@ scopes.map.label=Map
 # LOCALIZATION NOTE (scopes.block): Refers to a block of code in
 # the scopes pane when the debugger is paused.
 scopes.block=Block
-# LOCALIZATION NOTE (sources.header): Sources left sidebar header
-sources.header=Sources
-# LOCALIZATION NOTE (outline.header): Outline left sidebar header
-outline.header=Outline
 # LOCALIZATION NOTE (outline.placeholder): Placeholder text for the filter input
 # element
 outline.placeholder=Filter functions
@@ -1072,10 +1487,6 @@ outline.sortLabel=Sort by name
 outline.noFunctions=No functions
 # LOCALIZATION NOTE (outline.noFileSelected): Outline text when there are no files selected
 outline.noFileSelected=No file selected
-# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt
-# e.g. Cmd+P to search. On a mac, we use the command unicode character.
-# On windows, it's ctrl.
-sources.search=%S to search
 # LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar
 # pane header.
 watchExpressions.header=Watch expressions
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties
index 18460d812c80..4e9db0bc6211 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/filterwidget.properties
@@ -13,7 +13,7 @@ emptyFilterList=Filter ko‘rsatilmagan
 
 # LOCALIZATION NOTE (emptyPresetList):
 # This string is displayed when preset's list is empty
-emptyPresetList=Siz birorta ham tayyor sozlamalarni saqlamagansiz. Siz filter tayyor sozlamalarining nomini tanlab, so‘ngra ularni saqlab joylashtirishingiz mumkin. Tayyor sozlamalardan tezkor foydalanish mumkin va ulardan qayta foydalanish oson bo‘ladi.
+emptyPresetList=Siz birorta ham tayyor sozlamalarni saqlamagansiz. Siz filtr tayyor sozlamalarining nomini tanlab, soʻngra ularni saqlab joylashtirishingiz mumkin. Tayyor sozlamalardan tezkor foydalanish mumkin va ulardan qayta foydalanish oson bo‘ladi.
 
 # LOCALIZATION NOTE (addUsingList):
 # This string is displayed under [emptyFilterList] when filter's
@@ -34,7 +34,7 @@ dragHandleTooltipText=Filterni qayta tartiblash uchun uni sudrang yok itashlang
 # This string is used as a tooltip text (shown on mouse hover) on the
 # filters' labels which can be dragged left/right to increase/decrease
 # the filter's value (like photoshop)
-labelDragTooltipText=Qiymatni kattaalshtirish  yoki kichiklashtirish uchun chapga yoki o‘ngga buringl
+labelDragTooltipText=Qiymatni kattalshtirish  yoki kichiklashtirish uchun chapga yoki oʻngga buring
 
 # LOCALIZATION NOTE (filterListSelectPlaceholder):
 # This string is used as a preview option in the list of possible filters
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties
index 87f818624bcf..463f02571c17 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/netmonitor.properties
@@ -57,9 +57,8 @@ netmonitor.security.notAvailable=<Mavjud emas>
 # that collapses the network details pane in the UI.
 collapseDetailsPane=So‘rov tafsilotlarini yashirish
 
-# LOCALIZATION NOTE (expandDetailsPane): This is the tooltip for the button
-# that expands the network details pane in the UI.
-expandDetailsPane=So'rov tafsilotlarini ko‘rsatish
+# LOCALIZATION NOTE (collapseActionPane): This is the tooltip for the button
+# that collapses the network action pane in the UI.
 
 # LOCALIZATION NOTE (headersEmptyText): This is the text displayed in the
 # headers tab of the network details pane when there are no headers available.
@@ -69,6 +68,9 @@ headersEmptyText=Ushbu so‘rov uchun bosh qatorlar yo‘q
 # headers tab of the network details pane for the filtering input.
 headersFilterText=Filter boshlang‘ich qismi
 
+# LOCALIZATION NOTE (messagesEmptyText): This is the text displayed in the
+# WebSockets tab of the network details pane when there are no frames available.
+
 # LOCALIZATION NOTE (cookiesEmptyText): This is the text displayed in the
 # cookies tab of the network details pane when there are no cookies available.
 cookiesEmptyText=Ushbu so‘rov uchun kukilar yo‘q
@@ -77,6 +79,10 @@ cookiesEmptyText=Ushbu so‘rov uchun kukilar yo‘q
 # cookies tab of the network details pane for the filtering input.
 cookiesFilterText=Filter kukilari
 
+# LOCALIZATION NOTE (responseEmptyText): This is the text displayed in the
+# response tab of the network details pane when the response is empty or not
+# available for shown.
+
 # LOCALIZATION NOTE (paramsEmptyText): This is the text displayed in the
 # params tab of the network details pane when there are no params available.
 paramsEmptyText=Ushbu so‘rov uchun parametrlar yo‘q
@@ -133,6 +139,21 @@ jsonScopeName=JSON
 # in the response tab of the network details pane for a JSONP scope.
 jsonpScopeName=JSONP → teskari chaqiriq %S()
 
+# LOCALIZATION NOTE (responseTruncated): This is the text displayed
+# in the response tab of the network details pane when the response is over
+# the truncation limit and thus was truncated.
+
+# LOCALIZATION NOTE (requestTruncated): This is the text displayed
+# in the params tab of the network details pane when the request is over
+# the truncation limit and thus was truncated.
+
+# LOCALIZATION NOTE (responsePreview): This is the text displayed
+# in the response tab of the network details pane for an HTML preview.
+
+# LOCALIZATION NOTE (networkMenu.raced): This is the label displayed
+# in the network menu specifying the transfer or a request is
+# raced. %S refers to the current transfer size.
+
 # LOCALIZATION NOTE (networkMenu.sortedAsc): This is the tooltip displayed
 # in the network table toolbar, for any column that is sorted ascending.
 networkMenu.sortedAsc=Ortib borish tartibida saralangan
@@ -150,7 +171,7 @@ networkMenu.sortedDesc=Kamayib borish tartibida saralangan
 # LOCALIZATION NOTE (networkMenu.summary.tooltip.load): A tooltip explaining
 # what the load label displays
 
-# LOCALIZATION NOTE (networkMenu.summary.requestsCount): This label is displayed
+# LOCALIZATION NOTE (networkMenu.summary.requestsCount2): This label is displayed
 # in the network table footer providing the number of requests
 # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 
@@ -165,7 +186,7 @@ networkMenu.summary.requestsCountEmpty=Soʻrovlar yo‘q
 # in the network table footer providing the transferred size.
 
 # LOCALIZATION NOTE (networkMenu.summary.tooltip.transferred): A tooltip explaining
-# what the transferred  label displays
+# what the transferred label displays
 
 # LOCALIZATION NOTE (networkMenu.summary.finish): This label is displayed
 # in the network table footer providing the transfer time.
@@ -173,6 +194,26 @@ networkMenu.summary.requestsCountEmpty=Soʻrovlar yo‘q
 # LOCALIZATION NOTE (networkMenu.summary.tooltip.finish): A tooltip explaining
 # what the finish label displays
 
+# LOCALIZATION NOTE (networkMenu.ws.summary.framesCount2): This label is displayed
+# in the messages table footer providing the number of frames
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+
+# LOCALIZATION NOTE (networkMenu.ws.summary.framesCountEmpty): This label is displayed
+# in the messages table footer when there are no frames
+
+# LOCALIZATION NOTE (networkMenu.ws.summary.tooltip.framesCount): A tooltip explaining
+# what the framesCount label displays
+
+# LOCALIZATION NOTE (networkMenu.ws.summary.tooltip.framesTotalSize): A tooltip explaining
+# what the framesTotalSize label displays
+
+# LOCALIZATION NOTE (networkMenu.ws.summary.label.framesTranferredSize): A label showing
+# summary size info related to the current list of WS messages
+# %1$S is the total size of the transferred data, %2$S is the size of sent data, %3$S is the size of received data.
+
+# LOCALIZATION NOTE (networkMenu.ws.summary.tooltip.framesTotalTime): A tooltip explaining
+# what framesTotalTime displays
+
 # LOCALIZATION NOTE (networkMenu.sizeB): This is the label displayed
 # in the network menu specifying the size of a request (in bytes).
 
@@ -191,8 +232,12 @@ networkMenu.sizeKB=%S KB
 # unavailable.
 networkMenu.sizeUnavailable=—
 
+# LOCALIZATION NOTE (networkMenu.sizeUnavailable.title): This is the tooltip
+# displayed in the network menu specifying that the transferred size of a
+# request is unavailable.
+
 # LOCALIZATION NOTE (networkMenu.sizeCached): This is the label displayed
-# in the network menu specifying the transferred of a request is
+# in the network menu specifying the transfer or a request is
 # cached.
 
 # LOCALIZATION NOTE (networkMenu.sizeServiceWorker): This is the label displayed
@@ -200,9 +245,18 @@ networkMenu.sizeUnavailable=—
 # by a service worker.
 networkMenu.sizeServiceWorker=service worker
 
-# LOCALIZATION NOTE (networkMenu.totalMS): This is the label displayed
+# LOCALIZATION NOTE (networkMenu.sizeServiceWorker): This is the label displayed
+# in the network menu specifying the request was blocked by something.
+# %S is replaced by the blocked reason, which could be "DevTools", "CORS", etc.
+
+# LOCALIZATION NOTE (networkMenu.blocked2): This is a generic message for a
+# URL that has been blocked for an unknown reason
+
+# LOCALIZATION NOTE (networkMenu.blockedTooltip): This is a the text displayed
+# as a tooltip for the blocked icon in the request list
+
+# LOCALIZATION NOTE (networkMenu.totalMS2): This is the label displayed
 # in the network menu specifying the time for a request to finish (in milliseconds).
-networkMenu.totalMS=→ %S ms
 
 # This string is used to concatenate tooltips (netmonitor.waterfall.tooltip.*)
 # in the requests waterfall for total time (in milliseconds). \\u0020 represents
@@ -233,6 +287,26 @@ networkMenu.totalMS=→ %S ms
 # LOCALIZATION NOTE (netmonitor.waterfall.tooltip.receive): This is part of the tooltip
 # displayed in the requests waterfall for receive time (in milliseiconds).
 
+# LOCALIZATION NOTE (netmonitor.timings.requestTiming): This is the title of the existing
+# section in Timings side panel. This section contains request timings.
+
+# LOCALIZATION NOTE (netmonitor.timings.serverTiming): This is the title of a new section
+# in Timings side panel. This section contains server timings transferred from the server
+# through the "Server-Timing" header.
+
+# LOCALIZATION NOTE (netmonitor.timings.queuedAt): This is relative queued time to the
+# first request. %S is time expressed in milliseconds or minutes.
+
+# LOCALIZATION NOTE (netmonitor.timings.startedAt): Relative to the first request,
+# when the request actually started. %S is time expressed in milliseconds or minutes.
+
+# LOCALIZATION NOTE (netmonitor.timings.downloadedAt): Relative to first request,
+# when the request actually finished downloading.
+# %S is time expressed in milliseconds or minutes.
+
+# LOCALIZATION NOTE (netmonitor.timings.noTimings): Message that displays in the
+# timings pane when thea request has been blocked
+
 # LOCALIZATION NOTE (networkMenu.millisecond): This is the label displayed
 # in the network menu specifying timing interval divisions (in milliseconds).
 networkMenu.millisecond=%S ms
@@ -276,7 +350,7 @@ charts.sizeKB=%S KB
 # in pie or table charts specifying the time for a request to finish (in seconds).
 charts.totalS=%S s
 
-# LOCALIZATION NOTE (charts.totalTranferredSize): This is the label displayed
+# LOCALIZATION NOTE (charts.totalTransferredSize): This is the label displayed
 # in the performance analysis view for total transferred size, in kilobytes.
 
 # LOCALIZATION NOTE (charts.cacheEnabled): This is the label displayed
@@ -287,6 +361,9 @@ charts.cacheEnabled=Boshlang‘ich kesh
 # in the performance analysis view for "cache disabled" charts.
 charts.cacheDisabled=Keshni bo‘shatish
 
+# LOCALIZATION NOTE (charts.learnMore): This is the label displayed
+# in the performance analysis view, with a link to external documentation.
+
 # LOCALIZATION NOTE (charts.totalSize): This is the label displayed
 # in the performance analysis view for total requests size, in kilobytes.
 
@@ -296,6 +373,11 @@ charts.cacheDisabled=Keshni bo‘shatish
 # total requests time, in seconds.
 charts.totalSeconds=Vaqt: #1 soniya;Vaqt: #1 soniya
 
+# LOCALIZATION NOTE (charts.totalSecondsNonBlocking): Semi-colon list of plural forms.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# This is the label displayed in the performance analysis view for the
+# total requests time (non-blocking), in seconds.
+
 # LOCALIZATION NOTE (charts.totalCached): This is the label displayed
 # in the performance analysis view for total cached responses.
 charts.totalCached=Keshlangan javoblar: %S
@@ -304,19 +386,31 @@ charts.totalCached=Keshlangan javoblar: %S
 # in the performance analysis view for total requests.
 charts.totalCount=Barcha so‘rovlar: %S
 
-# LOCALIZATION NOTE (charts.totalCount): This is the label displayed
+# LOCALIZATION NOTE (charts.size): This is the label displayed
 # in the header column in the performance analysis view for size of the request.
 
-# LOCALIZATION NOTE (charts.totalCount): This is the label displayed
+# LOCALIZATION NOTE (charts.type): This is the label displayed
 # in the header column in the performance analysis view for type of request.
 
-# LOCALIZATION NOTE (charts.totalCount): This is the label displayed
+# LOCALIZATION NOTE (charts.transferred): This is the label displayed
 # in the header column in the performance analysis view for transferred
 # size of the request.
 
-# LOCALIZATION NOTE (charts.totalCount): This is the label displayed
+# LOCALIZATION NOTE (charts.time): This is the label displayed
 # in the header column in the performance analysis view for time of request.
 
+# LOCALIZATION NOTE (charts.nonBlockingTime): This is the label displayed
+# in the header column in the performance analysis view for non blocking
+# time of request.
+
+# LOCALIZATION NOTE (netRequest.originalFileURL.tooltip): This is the tooltip
+# displayed for the file's original URL value displayed in the file column of
+# a request.
+
+# LOCALIZATION NOTE (netRequest.decodedFileURL.tooltip): This is the tooltip
+# displayed for the file's decoded URL value displayed in the file column of
+# a request.
+
 # LOCALIZATION NOTE (netRequest.headers): A label used for Headers tab
 # This tab displays list of HTTP headers
 
@@ -380,10 +474,10 @@ charts.totalCount=Barcha so‘rovlar: %S
 # A label used for a certificate section in security tab
 # This section displays the valide period of this fingerprints
 
-# LOCALIZATION NOTE (certmgr.certdetail.cn):
+# LOCALIZATION NOTE (certmgr.begins):
 # A label used for Period of Validity sub-section in security tab
 
-# LOCALIZATION NOTE (certmgr.certdetail.cn):
+# LOCALIZATION NOTE (certmgr.expires):
 # A label used for Period of Validity sub-section in security tab
 
 # LOCALIZATION NOTE (certmgr.fingerprints.label):
@@ -396,6 +490,24 @@ charts.totalCount=Barcha so‘rovlar: %S
 # LOCALIZATION NOTE (certmgr.certdetail.sha1fingerprint):
 # A label used for Fingerprints sub-section in security tab
 
+# LOCALIZATION NOTE (certmgr.certificateTransparency.label):
+# This string is used as a label in the security tab.
+
+# LOCALIZATION NOTE (certmgr.certificateTransparency.status.ok):
+# This string is used to indicate that there are valid signed certificate
+# timestamps. This is a property for the 'Transparency'
+# field in the security tab.
+
+# LOCALIZATION NOTE (certmgr.certificateTransparency.status.notEnoughSCTS):
+# This string is used to indicate that there are not enough valid signed
+# certificate timestamps. This is a property for the 'Transparency'
+# field in the security tab.
+
+# LOCALIZATION NOTE (certmgr.certificateTransparency.status.notDiverseSCTS):
+# This string is used to indicate that there ar not enough diverse signed
+# certificate timestamps. This is a property for the 'Transparency'
+# field in the security tab.
+
 # LOCALIZATION NOTE (netmonitor.perfNotice1/2/3): These are the labels displayed
 # in the network table when empty to start performance analysis.
 netmonitor.perfNotice1=• Tugmaga
@@ -407,7 +519,7 @@ netmonitor.reloadNotice1=• So‘rovni amalga oshiring yoki
 netmonitor.reloadNotice2=Sahifani qayta yuklang -
 netmonitor.reloadNotice3=tarmoq faoliyati haqida batafsil ma’lumotlarni ko‘rish uchun
 
-# LOCALIZATION NOTE (netmonitor.toolbar.status2): This is the label displayed
+# LOCALIZATION NOTE (netmonitor.toolbar.status3): This is the label displayed
 # in the network table toolbar, above the "status" column.
 
 # LOCALIZATION NOTE (netmonitor.toolbar.method): This is the label displayed
@@ -418,6 +530,9 @@ netmonitor.toolbar.method=Usul
 # in the network table toolbar, above the "file" column.
 netmonitor.toolbar.file=Fayl
 
+# LOCALIZATION NOTE (netmonitor.toolbar.url): This is the label displayed
+# in the network table toolbar, above the "url" column.
+
 # LOCALIZATION NOTE (netmonitor.toolbar.protocol): This is the label displayed
 # in the network table toolbar, above the "protocol" column.
 
@@ -431,6 +546,9 @@ netmonitor.toolbar.domain=Domen
 # LOCALIZATION NOTE (netmonitor.toolbar.cause): This is the label displayed
 # in the network table toolbar, above the "cause" column.
 
+# LOCALIZATION NOTE (netmonitor.toolbar.initiator): This is the label displayed
+# in the network table toolbar, above the "initiator" column.
+
 # LOCALIZATION NOTE (netmonitor.toolbar.type): This is the label displayed
 # in the network table toolbar, above the "type" column.
 
@@ -477,12 +595,161 @@ netmonitor.toolbar.domain=Domen
 # in the network table toolbar, above the "waterfall" column.
 netmonitor.toolbar.waterfall=Yilnoma
 
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.size): This is the label displayed
+# in the websocket frame table header, above the "size" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.data): This is the label displayed
+# in the websocket frame table header, above the "data" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.opCode): This is the label displayed
+# in the websocket frame table header, above the "opCode" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.maskBit): This is the label displayed
+# in the websocket frame table header, above the "maskBit" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.finBit): This is the label displayed
+# in the websocket frame table header, above the "finBit" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.time): This is the label displayed
+# in the websocket frame table header, above the "time" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.clear): This is the label displayed
+# in the websocket toolbar for the "Clear" button.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.filterFreetext.label): This is the label
+# displayed in the websocket toolbar for the frames filtering textbox.
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.filterFreetext.key): This is the
+# shortcut key to focus on the websocket toolbar frames filtering textbox
+
+# LOCALIZATION NOTE (netmonitor.ws.toolbar.resetColumns): This is the label
+# displayed in the messages panel table header context menu.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.all): This is the label displayed
+# on the context menu that shows "All" WebSocket frames.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.all.accesskey): This is the access key
+# for the "All" menu item displayed in the context menu in the websocket toolbar.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.sent): This is the label displayed
+# on the context menu that shows "Sent" WebSocket frames.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.sent.accesskey): This is the access key
+# for the "Sent" menu item displayed in the context menu in the websocket toolbar.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.received): This is the label displayed
+# on the context menu that shows "Received" WebSocket frames.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.received.accesskey): This is the access key
+# for the "Received" menu item displayed in the context menu in the websocket toolbar.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames): This is the label displayed
+# on the context menu that shows "Control Frames" WebSocket frames.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.controlFrames.accesskey): This is the access key
+# for the "Control Frames" menu item displayed in the context menu in the websocket toolbar.
+
+# LOCALIZATION NOTE (netmonitor.ws.context.copyFrame): This is the label displayed
+# on the context menu that shows "Copy Message".
+
+# LOCALIZATION NOTE (netmonitor.ws.context.copyFrame.accesskey): This is the access key
+# for the "Copy Message" menu item displayed in the context menu of a WebSocket frame.
+
+# LOCALIZATION NOTE (netmonitor.ws.connection.closed): This is the text displayed in the
+# websocket messages panel when the connection is closed
+
+# LOCALIZATION NOTE (netmonitor.ws.type.sent): This is the label used as
+# accessible text for the "sent" type icon in the websocket table's "data" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.type.received): This is the label used as
+# accessible text for the "received" type icon in the websocket table's "data" column.
+
+# LOCALIZATION NOTE (netmonitor.ws.rawData.header): This is the label displayed
+# in the messages panel identifying the raw data.
+
+# LOCALIZATION NOTE (netmonitor.search.toolbar.inputPlaceholder): This is the label
+# displayed in the search toolbar for the search input as the placeholder.
+
+# LOCALIZATION NOTE (netmonitor.search.toolbar.close): This is the label
+# displayed in the search toolbar to close the search panel.
+
+# LOCALIZATION NOTE (netmonitor.search.toolbar.clear): This is the label
+# displayed in the search toolbar to clear the search panel.
+
+# LOCALIZATION NOTE (netmonitor.search.toolbar.caseSensitive): This is the label
+# displayed in the search toolbar to do a case sensitive search.
+
+# LOCALIZATION NOTE (netmonitor.search.status.labels.fetching): This is the label
+# displayed in the search results status bar when status is set to fetching.
+
+# LOCALIZATION NOTE (netmonitor.search.status.labels.canceled): This is the label
+# displayed in the search results status bar when status is set to cancelled.
+
+# LOCALIZATION NOTE (netmonitor.search.status.labels.done): This is the label
+# displayed in the search results status bar when status is set to done.
+# %1$S is the number of matching lines in search results (netmonitor.search.status.labels.matchingLines)
+# %2$S is the number of files in which matching lines were found (netmonitor.search.status.labels.fileCount)
+
+# LOCALIZATION NOTE (netmonitor.search.status.labels.matchingLines): Semi-colon list of plural forms.
+# This is the label displayed in the search results status bar showing matching lines found.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 is the number of matching lines found
+
+# LOCALIZATION NOTE (netmonitor.search.status.labels.fileCount): Semi-colon list of plural forms.
+# This is the label displayed in the search results status bar showing file count
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+# #1 is the number of files in which matching lines were found
+
+# LOCALIZATION NOTE (netmonitor.search.status.labels.error): This is the label
+# displayed in the search results status bar when status is set to error.
+
+# LOCALIZATION NOTE (netmonitor.toolbar.requestBlocking): This is the tooltip displayed
+# over the toolbar's Request Blocking buttonn
+
+# LOCALIZATION NOTE (netmonitor.actionbar.requestBlocking2): This is the label displayed
+# in the action bar's request blocking tab
+
+# LOCALIZATION NOTE (netmonitor.actionbar.enableBlocking): This is the label displayed
+# in request blocking tab to represent if requests blocking should be enabled
+
+# LOCALIZATION NOTE (netmonitor.actionbar.blockSearchPlaceholder): This is the
+# placeholder text for the request addition form
+
+# LOCALIZATION NOTE (netmonitor.actionbar.removeBlockedUrl): This is the
+# tooltip shown over the remove button for blocked URL item
+
+# LOCALIZATION NOTE (netmonitor.actionbar.addBlockedUrl): This is the
+# tooltip shown over the Add Blocked URL button
+
+# LOCALIZATION NOTE (netmonitor.actionbar.search): This is the label displayed
+# in the action bar's search tab
+
+# LOCALIZATION NOTE (messagesTruncated): This is the text displayed
+# in the messages panel when the number of messages is over the
+# truncation limit.
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+
+# LOCALIZATION NOTE (disableMessagesTruncation): This is the text displayed
+# in the messages panel checkbox label for toggling message truncation.
+
+# LOCALIZATION NOTE (toggleMessagesTruncation.title): This is the title used
+# to describe the checkbox used to toggle message truncation.
+
+# LOCALIZATION NOTE (messageDataTruncated): This is the text displayed
+# to describe to describe data truncation in the messages panel.
+
 # LOCALIZATION NOTE (netmonitor.tab.headers): This is the label displayed
 # in the network details pane identifying the headers tab.
 
+# LOCALIZATION NOTE (netmonitor.tab.messages): This is the label displayed
+# in the network details pane identifying the messages tab.
+
 # LOCALIZATION NOTE (netmonitor.tab.cookies): This is the label displayed
 # in the network details pane identifying the cookies tab.
 
+# LOCALIZATION NOTE (netmonitor.tab.cache): This is the label displayed
+# in the network details pane identifying the cache tab.
+
 # LOCALIZATION NOTE (netmonitor.tab.params): This is the label displayed
 # in the network details pane identifying the params tab.
 
@@ -548,6 +815,21 @@ netmonitor.toolbar.filter.other=Boshqa
 # LOCALIZATION NOTE (netmonitor.toolbar.filterFreetext.key): This is the
 # shortcut key to focus on the toolbar url filtering textbox
 
+# LOCALIZATION NOTE (netmonitor.toolbar.search.key): This is the
+# shortcut key to toggle the search panel
+
+# LOCALIZATION NOTE (netmonitor.toolbar.copy.key): This is the
+# shortcut key to copy a selected request url from the network table
+
+# LOCALIZATION NOTE (netmonitor.toolbar.filterFreetext.learnMore): This is
+# the title used for MDN icon in filtering textbox
+
+# LOCALIZATION NOTE (netmonitor.toolbar.enablePersistentLogs.label): This is the label
+# displayed for the checkbox for enabling persistent logs.
+
+# LOCALIZATION NOTE (netmonitor.toolbar.enablePersistentLogs.tooltip): This is the tooltip
+# displayed for the checkbox for enabling persistent logs.
+
 # LOCALIZATION NOTE (netmonitor.toolbar.disableCache.label): This is the label
 # displayed for the checkbox for disabling browser cache.
 
@@ -558,13 +840,28 @@ netmonitor.toolbar.filter.other=Boshqa
 # in the network toolbar for the "Clear" button.
 netmonitor.toolbar.clear=Tozalash
 
+# LOCALIZATION NOTE (netmonitor.toolbar.toggleRecording): This is the label displayed
+# in the network toolbar for the toggle recording button.
+
 # LOCALIZATION NOTE (netmonitor.toolbar.perf): This is the label displayed
 # in the network toolbar for the performance analysis button.
 netmonitor.toolbar.perf=Ishlash natijalarini ko‘rsatish/yashirish…
 
+# LOCALIZATION NOTE (netmonitor.toolbar.search): This is the tooltip label displayed
+# in the network toolbar for the search  button.
+
 # LOCALIZATION NOTE (netmonitor.toolbar.resetColumns): This is the label
 # displayed in the network table header context menu.
 
+# LOCALIZATION NOTE (netmonitor.toolbar.resetSorting): This is the label
+# displayed in the network table header context menu to reset sorting
+
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent): This is the label
+# displayed in the network table header context menu to resize a column to fit its content
+
+# LOCALIZATION NOTE (netmonitor.toolbar.resizeColumnToFitContent.title): This is the title
+# tooltip displayed when draggable resizer in network table headers is hovered
+
 # LOCALIZATION NOTE (netmonitor.toolbar.timings): This is the label
 # displayed in the network table header context menu for the timing submenu
 
@@ -592,6 +889,12 @@ netmonitor.summary.status=Holat kodi:
 # in the network details headers tab identifying the http version.
 netmonitor.summary.version=Versiyasi:
 
+# LOCALIZATION NOTE (netmonitor.summary.learnMore): This is the label displayed
+# in the network details headers tab, with a link to external documentation.
+
+# LOCALIZATION NOTE (netmonitor.summary.referrerPolicy): This is the label displayed
+# in the network details headers tab identifying the referrer policy.
+
 # LOCALIZATION NOTE (netmonitor.summary.editAndResend): This is the label displayed
 # on the button in the headers tab that opens a form to edit and resend the currently
 # displayed request
@@ -659,6 +962,9 @@ netmonitor.timings.wait=Kutilmoqda:
 # in a "receive" state.
 netmonitor.timings.receive=Qabul qilish:
 
+# LOCALIZATION NOTE (netmonitor.timings.learnMore): This is the label displayed
+# in the network details timings tab, with a link to external documentation
+
 # LOCALIZATION NOTE (netmonitor.security.warning.cipher): A tooltip
 # for warning icon that indicates a connection uses insecure cipher suite.
 netmonitor.security.warning.cipher=Kodlash uchun foydalanilgan kodlash usuli eskrigan yoki xavfsiz emas.
@@ -675,6 +981,30 @@ netmonitor.security.protocolVersion=Protocol versiyasi:
 # in the security tab describing the cipher suite used to secure this connection.
 netmonitor.security.cipherSuite=Kodlash moslamasi:
 
+# LOCALIZATION NOTE (netmonitor.security.keaGroup): This is the label displayed
+# in the security tab describing the key exchange group suite used to secure
+# this connection.
+
+# LOCALIZATION NOTE (netmonitor.security.keaGroup.none): This is the label
+# displayed in the security tab describing the case when no group was used.
+
+# LOCALIZATION NOTE (netmonitor.security.keaGroup.custom): This is the label
+# displayed in the security tab describing the case when a custom group was used.
+
+# LOCALIZATION NOTE (netmonitor.security.keaGroup.unknown): This is the value
+# displayed in the security tab describing an unknown group.
+
+# LOCALIZATION NOTE (netmonitor.security.signatureScheme): This is the label
+# displayed in the security tab describing the signature scheme used by for
+# the server certificate in this connection.
+
+# LOCALIZATION NOTE (netmonitor.security.signatureScheme.none): This is the
+# label displayed in the security tab describing the case when no signature
+# was used.
+
+# LOCALIZATION NOTE (netmonitor.security.signatureScheme.unknown): This is the
+# value displayed in the security tab describing an unknown signature scheme.
+
 # LOCALIZATION NOTE (netmonitor.security.hsts): This is the label displayed
 # in the security tab describing the usage of HTTP Strict Transport Security.
 netmonitor.security.hsts=HTTP mustahkam transport xavfsizligi:
@@ -692,11 +1022,14 @@ netmonitor.security.connection=Ulanish:
 # in the security tab describing the server certificate section.
 netmonitor.security.certificate=Sertifikat:
 
+# LOCALIZATION NOTE (netmonitor.trackingResource.tooltip): This is the label used
+# in the Network monitor panel as a tooltip for tracking resource icon.
+
 # LOCALIZATION NOTE (netmonitor.context.copy): This is the label displayed
 # for the copy sub-menu in the context menu for a request
 
 # LOCALIZATION NOTE (netmonitor.context.copy.accesskey): This is the access key
-# for the copy sub-menu displayed in the context menu for a request
+# for the copy menu/sub-menu displayed in the context menu for a request
 
 # LOCALIZATION NOTE (netmonitor.context.copyUrl): This is the label displayed
 # on the context menu that copies the selected request's url
@@ -714,11 +1047,11 @@ netmonitor.context.copyUrlParams=URL parametrlaridan nusxa olish
 # for the Copy URL Parameters menu item displayed in the context menu for a request
 netmonitor.context.copyUrlParams.accesskey=P
 
-# LOCALIZATION NOTE (netmonitor.context.copyPostData): This is the label displayed
-# on the context menu that copies the selected request's post data
+# LOCALIZATION NOTE (netmonitor.context.copyRequestData): This is the label displayed
+# on the context menu that copies the selected request's data
 
-# LOCALIZATION NOTE (netmonitor.context.copyPostData.accesskey): This is the access key
-# for the Copy POST Data menu item displayed in the context menu for a request
+# LOCALIZATION NOTE (netmonitor.context.copyRequestData.accesskey): This is the access key
+# for the Copy POST/PATCH/PUT/DELETE Data menu item displayed in the context menu for a request
 
 # LOCALIZATION NOTE (netmonitor.context.copyAsCurl): This is the label displayed
 # on the context menu that copies the selected request as a cURL command.
@@ -726,9 +1059,20 @@ netmonitor.context.copyUrlParams.accesskey=P
 # http://en.wikipedia.org/wiki/CURL
 netmonitor.context.copyAsCurl=cURL sifatida nusxa olish
 
-# LOCALIZATION NOTE (netmonitor.context.copyAsCUrl.accesskey): This is the access key
+# LOCALIZATION NOTE (netmonitor.context.copyAsCurl.accesskey): This is the access key
 # for the Copy as cURL menu item displayed in the context menu for a request
 
+# LOCALIZATION NOTE (netmonitor.context.copyAsCurl.*): This is the template used to add
+# a target platform to the label for "Copy as cURL" command
+# e.g. Copy as cURL (Windows)
+# Localized label for "Copy as cURL": %S
+
+# LOCALIZATION NOTE (netmonitor.context.copyAsFetch): This is the label displayed
+# on the context menu that copies the selected request as a fetch request.
+
+# LOCALIZATION NOTE (netmonitor.context.copyAsFetch.accesskey): This is the access key
+# for the Copy as fetch menu item displayed in the context menu for a request
+
 # LOCALIZATION NOTE (netmonitor.context.copyRequestHeaders): This is the label displayed
 # on the context menu that copies the selected item's request headers
 netmonitor.context.copyRequestHeaders=Yuqori qismlar so‘rovidan nusxa olish
@@ -747,7 +1091,7 @@ netmonitor.context.copyResponseHeaders=Javob beradigan yuqori qismlardan nusxa o
 # on the context menu that copies the selected response as a string
 netmonitor.context.copyResponse=Javobdan nusxa olish
 
-# LOCALIZATION NOTE (netmonitor.context.copyRespose.accesskey): This is the access key
+# LOCALIZATION NOTE (netmonitor.context.copyResponse.accesskey): This is the access key
 # for the Copy Response menu item displayed in the context menu for a request
 
 # LOCALIZATION NOTE (netmonitor.context.copyImageAsDataUri): This is the label displayed
@@ -758,12 +1102,23 @@ netmonitor.context.copyImageAsDataUri=Rasmdan URI ma’lumotlari sifatida nusxa
 # for the Copy Image As Data URI menu item displayed in the context menu for a request
 netmonitor.context.copyImageAsDataUri.accesskey=I
 
+# LOCALIZATION NOTE (netmonitor.context.useAsFetch): This is the label displayed
+# on the context menu that copies the selected request as a fetch command.
+
+# LOCALIZATION NOTE (netmonitor.context.useAsFetch.accesskey): This is the access key
+# for the Copy as fetch menu item displayed in the context menu for a request
+
 # LOCALIZATION NOTE (netmonitor.context.saveImageAs): This is the label displayed
 # on the context menu that save the Image
 
-# LOCALIZATION NOTE (netmonitor.context.copyImageAsDataUri.accesskey): This is the access key
+# LOCALIZATION NOTE (netmonitor.context.saveImageAs.accesskey): This is the access key
 # for the Copy Image As Data URI menu item displayed in the context menu for a request
 
+# LOCALIZATION NOTE (netmonitor.context.copyAll): This is the label displayed
+# on the context menu that copies all data
+
+# LOCALIZATION NOTE (netmonitor.context.copyAll.accesskey): This is the access key
+# for the Copy All menu item displayed in the context menu for a properties view panel
 
 # LOCALIZATION NOTE (netmonitor.context.copyAllAsHar): This is the label displayed
 # on the context menu that copies all as HAR format
@@ -777,6 +1132,27 @@ netmonitor.context.copyImageAsDataUri.accesskey=I
 # LOCALIZATION NOTE (netmonitor.context.saveAllAsHar.accesskey): This is the access key
 # for the Save All As HAR menu item displayed in the context menu for a network panel
 
+# LOCALIZATION NOTE (netmonitor.context.importHar): This is the label displayed
+# on the context menu that imports HAR files
+
+# LOCALIZATION NOTE (netmonitor.context.importHar.accesskey): This is the access key
+# for the Import HAR menu item displayed in the context menu for a network panel
+
+# LOCALIZATION NOTE (netmonitor.har.importHarDialogTitle): This is a label
+# used for import file open dialog
+
+# LOCALIZATION NOTE (netmonitor.har.importDialogHARFilter):
+# This string is displayed as a filter for importing HAR file
+
+# LOCALIZATION NOTE (netmonitor.har.importDialogAllFilter):
+# This string is displayed as a filter for importing HAR file
+
+# LOCALIZATION NOTE (netmonitor.context.resend.label): This is the label displayed
+# on the context menu that resends the currently displayed request immediately
+
+# LOCALIZATION NOTE (netmonitor.context.resend.accesskey): This is the access key
+# for the "Resend" menu item displayed in the context menu for a request
+
 # LOCALIZATION NOTE (netmonitor.context.editAndResend): This is the label displayed
 # on the context menu that opens a form to edit and resend the currently
 # displayed request
@@ -784,10 +1160,16 @@ netmonitor.context.copyImageAsDataUri.accesskey=I
 # LOCALIZATION NOTE (netmonitor.context.editAndResend.accesskey): This is the access key
 # for the "Edit and Resend" menu item displayed in the context menu for a request
 
+# LOCALIZATION NOTE (netmonitor.context.blockURL): This is the label displayed
+# on the context menu that blocks any requests matching the selected request's URL.
+
+# LOCALIZATION NOTE (netmonitor.context.unblockURL): This is the label displayed
+# on the context menu that unblocks any requests matching the selected request's URL.
+
 # LOCALIZATION NOTE (netmonitor.context.newTab):  This is the label
 # for the Open in New Tab menu item displayed in the context menu of the
 # network container
-netmonitor.context.newTab=Yangi ichki oynada ochish
+netmonitor.context.newTab=Yangi varaqda ochish
 
 # LOCALIZATION NOTE (netmonitor.context.newTab.accesskey): This is the access key
 # for the Open in New Tab menu item displayed in the context menu of the
@@ -797,7 +1179,7 @@ netmonitor.context.newTab=Yangi ichki oynada ochish
 # for the Open in Debugger menu item displayed in the context menu of the
 # network container
 
-# LOCALIZATION NOTE (netmonitor.openInDebugger.accesskey): This is the access key
+# LOCALIZATION NOTE (netmonitor.context.openInDebugger.accesskey): This is the access key
 # for the Open in Debugger menu item displayed in the context menu of the
 # network container
 
@@ -820,6 +1202,12 @@ netmonitor.context.perfTools=Ishlash natijalarini ishga tushirish…
 # as the title of the new custom request form
 netmonitor.custom.newRequest=Yangi so‘rov
 
+# LOCALIZATION NOTE (netmonitor.custom.newRequestMethodLabel): This is the label displayed
+# above the method text input field of the new custom request form
+
+# LOCALIZATION NOTE (netmonitor.custom.newRequestUrlLabel): This is the label displayed
+# above the url text input field of the new custom request form
+
 # LOCALIZATION NOTE (netmonitor.custom.query): This is the label displayed
 # above the query string entry in the custom request form
 netmonitor.custom.query=So‘rov satri:
@@ -863,6 +1251,40 @@ netmonitor.backButton=Orqaga
 # of the column status code, when the request is cached and is from a service worker
 # %1$S is the status code, %2$S is the status text.
 
+# LOCALIZATION NOTE (netmonitor.label.dropHarFiles): This is a label
+# rendered within the Network panel when *.har file(s) are dragged
+# over the content.
+
+# LOCALIZATION NOTE (netmonitor.label.har): This is a label used
+# as a tooltip for toolbar drop-down button with HAR actions
+
+# LOCALIZATION NOTE (netmonitor.cache.cache): This is the label text for the parent
+# node in the TreeView.
+
+# LOCALIZATION NOTE (netmonitor.cache.empty): This is the text displayed when cache
+# information is not available.
+
+# LOCALIZATION NOTE (netmonitor.cache.notAvailable): This is the text displayed under
+# a node that has no information available.
+
+# LOCALIZATION NOTE (netmonitor.cache.dataSize): This is the label text for
+# the datasize of the cached object.
+
+# LOCALIZATION NOTE (netmonitor.cache.expires): This is the label text for the
+# expires time of the cached object.
+
+# LOCALIZATION NOTE (netmonitor.cache.fetchCount): This is the label text for the
+# fetch count of the cached object.
+
+# LOCALIZATION NOTE (netmonitor.cache.lastFetched): This is the label text for the
+# last fetched date/time of the cached object.
+
+# LOCALIZATION NOTE (netmonitor.cache.lastModified): This is the label text for the
+# last modified date/time of the cached object.
+
+# LOCALIZATION NOTE (netmonitor.cache.device): This is the label text for the device
+# where a cached object was fetched from (e.g. "disk").
+
 # LOCALIZATION NOTE (netmonitor.security.state.insecure)
 # This string is used as an tooltip for request that was performed over insecure
 # channel i.e. the connection was not https
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd
index d8e8142846b1..bb72d2522041 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/devtools/client/storage.dtd
@@ -5,13 +5,17 @@
 <!-- LOCALIZATION NOTE : This file contains the Storage Inspector strings. -->
 
 <!-- LOCALIZATION NOTE : Placeholder for the searchbox that allows you to filter the table items. -->
-<!ENTITY searchBox.placeholder         "Filter Items">
+<!ENTITY searchBox.placeholder         "Elementlarni qidirish">
 
 <!-- LOCALIZATION NOTE : Label of popup menu action to delete all storage items. -->
-<!ENTITY storage.popupMenu.deleteAllLabel "Delete All">
 
 <!-- LOCALIZATION NOTE : Label of popup menu action to delete all session cookies. -->
-<!ENTITY storage.popupMenu.deleteAllSessionCookiesLabel "Delete All Session Cookies">
 
+<!-- LOCALIZATION NOTE : Label of popup menu action to copy a storage item. -->
+
+<!-- LOCALIZATION NOTE : Label of popup menu action to delete all storage items. -->
+<!ENTITY storage.popupMenu.deleteAllLabel "Delete All">
+<!-- LOCALIZATION NOTE : Label of popup menu action to delete all session cookies. -->
+<!ENTITY storage.popupMenu.deleteAllSessionCookiesLabel "Delete All Session Cookies">
 <!-- LOCALIZATION NOTE : Label of popup menu action to copy a storage item. -->
 <!ENTITY storage.popupMenu.copyLabel "Copy">
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties
index 188139fdda34..16673dc661fa 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutStudies.properties
@@ -3,11 +3,25 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 
+# LOCALIZATION NOTE (title): keep "Shield" in English. See
+# https://wiki.mozilla.org/Firefox/Shield/Shield_Studies for more information
+
+# LOCALIZATION NOTE (activeStudiesList): Title above a list of active studies
+# LOCALIZATION NOTE (activeStudiesList): Title above a list of completed studies
+# LOCALIZATION NOTE (activeStatus): Displayed for an active study
+# LOCALIZATION NOTE (completeStatus): Displayed for a study that is already complete
+
+# LOCALIZATION NOTE (enabledList): %S is brandShortName (e.g. Firefox)
+
+# LOCALIZATION NOTE (preferenceStudyDescription) $1%S will be replaced with the
+# name of a preference (such as "stream.improvesearch.topSiteSearchShortcuts")
+# and $2%S will be replaced with the value of that preference. Both values will
+# be formatted differently than the surrounding text.
+preferenceStudyDescription = Bu tadqiqot %1$S parametri uchun %2$S qiymatini oʻrnatadi.
 # LOCALIZATION NOTE (title): keep "Shield" in English. See
 # https://wiki.mozilla.org/Firefox/Shield/Shield_Studies for more information
 title = Shield Studies
 removeButton = Remove
-
 # LOCALIZATION NOTE (activeStudiesList): Title above a list of active studies
 activeStudiesList = Active studies
 # LOCALIZATION NOTE (activeStudiesList): Title above a list of completed studies
@@ -16,7 +30,6 @@ completedStudiesList = Completed studies
 activeStatus = Active
 # LOCALIZATION NOTE (completeStatus): Displayed for a study that is already complete
 completeStatus = Complete
-
 updateButtonWin = Update Options
 updateButtonUnix = Update Preferences
 learnMore = Learn more
@@ -24,9 +37,3 @@ noStudies = You have not participated in any studies.
 disabledList = This is a list of studies that you have participated in. No new studies will run.
 # LOCALIZATION NOTE (enabledList): %S is brandShortName (e.g. Firefox)
 enabledList = What’s this? %S may install and run studies from time to time.
-
-# LOCALIZATION NOTE (preferenceStudyDescription) $1%S will be replaced with the
-# name of a preference (such as "stream.improvesearch.topSiteSearchShortcuts")
-# and $2%S will be replaced with the value of that preference. Both values will
-# be formatted differently than the surrounding text.
-preferenceStudyDescription = This study sets %1$S to %2$S.
\ No newline at end of file
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties
index 768796f1b62c..5efdddbcfc9e 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/aboutWebrtc.properties
@@ -30,7 +30,7 @@ debug_mode_on_state_msg = tuzatish rejimi faol, kuzatish jurnali: %1$S
 aec_logging_msg_label = AEC jurnalga kiritish
 aec_logging_off_state_label = AEC jurnalga kiritishni boshlash
 aec_logging_on_state_label = AEC jurnalga kiritishni to‘xtatish
-aec_logging_on_state_msg = AEC jurnalga kiritish faol (chaqiruvchi bilan bir necha daqiqa gaplashing va so‘ngra yozib olishni to‘xtating)
+aec_logging_on_state_msg = AEC jurnalga kiritish faol (chaqiruvchi bilan bir necha daqiqa gaplashing va soʻngra yozib olishni toʻxtating)
 
 # LOCALIZATION NOTE (aec_logging_off_state_msg):
 # %1$S will be replaced by the full path to the directory containing the captured log files.
@@ -49,6 +49,11 @@ sdp_heading = SDP
 local_sdp_heading = Mahalliy SDP
 remote_sdp_heading = Masofadagi SDP
 
+# LOCALIZATION NOTE (offer, answer):
+# offer and answer describe whether the local sdp is an offer or answer or
+# the remote sdp is an offer or answer.  These are appended to the local and
+# remote sdp headings.
+
 # LOCALIZATION NOTE (rtp_stats_heading): "RTP" is an abbreviation for the
 # Real-time Transport Protocol, an IETF specification, and should not
 # normally be translated. "Stats" is an abbreviation for Statistics.
@@ -61,16 +66,6 @@ rtp_stats_heading = RTP statistikasi
 ice_state = ICE statistikasi
 ice_stats_heading = ICE statistikasi
 
-# LOCALIZATION NOTE (av_sync_label): "A/V" stands for Audio/Video.
-# "sync" is an abbreviation for sychronization. This is used as
-# a data label.
-av_sync_label = A/V sinxronlash
-
-# LOCALIZATION NOTE (jitter_buffer_delay_label): A jitter buffer is an
-# element in the processing chain, see http://wikipedia.org/wiki/Jitter
-# This is used as a data label.
-jitter_buffer_delay_label = Jitter-buffer kechikish
-
 # LOCALIZATION NOTE (avg_bitrate_label, avg_framerate_label): "Avg." is an abbreviation
 # for Average. These are used as data labels.
 avg_bitrate_label = O‘rtacha bitreyt
@@ -92,6 +87,13 @@ nominated = Belgilangan
 # or are left blank. This represents an attribute of an ICE candidate.
 selected = Tanlangan
 
+# LOCALIZATION NOTE (trickle_caption_msg2, trickle_highlight_color_name2): ICE
+# candidates arriving after the remote answer arrives are considered trickled
+# (an attribute of an ICE candidate). These are highlighted in the ICE stats
+# table with light blue background. %S is replaced by
+# trickle_highlight_color_name2 ("blue"), highlighted with a light blue
+# background to visually match the trickled ICE candidates.
+
 save_page_label = Sahifani saqlash
 debug_mode_msg_label = Tuzatish rejimi
 debug_mode_off_state_label = Tuzatish rejimini ishga tushirish
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties
index c29684d23169..c0d2b6d926c1 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/global/autocomplete.properties
@@ -2,10 +2,15 @@
 # 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/.
 
-# LOCALIZATION NOTE (searchWithEngine): %S will be replaced with
-# the search engine provider's name. This format was chosen because
-# the provider can also end with "Search" (e.g.: MSN Search).
-searchWithEngine = %S bilan izlash
+# LOCALIZATION NOTE (searchWithEngine, searchInPrivateWindowWithEngine): %S will
+# be replaced with the search engine provider's name. This format was chosen
+# because the provider can also end with "Search" (e.g.: MSN Search).
+searchWithEngine = %S orqali izlash
+
+searchInPrivateWindowWithEngine = Maxfiy oynada %S yordamida izlash
+
+# LOCALIZATION NOTE (searchInPrivateWindow): Used when the private browsing
+# engine is the same as the default engine.
 
 # LOCALIZATION NOTE (switchToTab2): This is the same as the older switchToTab
 # string that it's replacing, except it uses title case, so "Switch" and "Tab"
@@ -22,7 +27,6 @@ visit = Kirish
 # search text that the user is typing.  %2$S will not be empty.
 bookmarkKeywordSearch = %1$S: %2$S
 
-searchInPrivateWindowWithEngine = Search with %S in a Private Window
 # LOCALIZATION NOTE (searchInPrivateWindow): Used when the private browsing
 # engine is the same as the default engine.
 searchInPrivateWindow = Search in a Private Window
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties
index 488dd82a0a09..4f9839b972cb 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/downloads/downloads.properties
@@ -47,7 +47,7 @@ infiniteRate=Juda tez
 # LOCALIZATION NOTE (statusFormat3): — is the "em dash" (long dash)
 # %1$S transfer progress; %2$S rate number; %3$S rate unit; %4$S time left
 # example: 4 minutes left — 1.1 of 11.1 GB (2.2 MB/sec)
-statusFormat3=%4$S — %1$S (%2$S %3$S/sec)
+statusFormat3=%4$S — %1$S (%2$S %3$S/soniya
 
 # LOCALIZATION NOTE (statusFormatInfiniteRate): — is the "em dash" (long dash)
 # %1$S transfer progress; %2$S substitute phrase for Infinity speed; %3$S time left
@@ -81,12 +81,17 @@ transferNoTotal2=%1$S %2$S
 # example: 1m; 11h
 # LOCALIZATION NOTE (timeLeftSingle3): %1$S time left
 # example: 1m left; 11h left
+timeLeftSingle3=%1$S qoldi
 # LOCALIZATION NOTE (timeLeftDouble3): %1$S time left; %2$S time left sub units
 # example: 11h 2m left; 1d 22h left
+timeLeftDouble3=%1$S %2$S qoldi
+timeFewSeconds2=Bir necha soniya qoldi
+timeUnknown2=Qolgan vaqt nomaʼlum
 
 # LOCALIZATION NOTE (doneSize): #1 size number; #2 size unit
 doneSize=#1 #2
-# LOCALIZATION NOTE (doneScheme): #1 URI scheme like data: jar: about:
+
+# LOCALIZATION NOTE (doneScheme2): #1 URI scheme like data: jar: about:
 doneScheme2=%1$S resurs
 # LOCALIZATION NOTE (doneFileScheme): Special case of doneScheme for file:
 # This is used as an eTLD replacement for local files, so make it lower case
@@ -94,12 +99,9 @@ doneFileScheme=mahalliy fayl
 
 # LOCALIZATION NOTE (yesterday): Displayed time for files finished yesterday
 yesterday=Kecha
-# LOCALIZATION NOTE (monthDate): #1 month name; #2 date number; e.g., January 22
-monthDate2=%1$S %2$S
 
 fileExecutableSecurityWarning="%S" bajariladigan fayl. Bajariladigan fayllarda viruslar yoki kompyuteringizga zarar keltiradigan boshqa kodlar boʻlishi mumkin. Bu faylni ochishda ogohlantirishdan foydalaning.  "%S"ni ishga tushirishga rozimisiz?
 fileExecutableSecurityWarningTitle=Bajariladigan fayl ochilsinmi?
-fileExecutableSecurityWarningDontAsk=Bu mendan yana soʻralmasin
 
 # Desktop folder name for downloaded files
 downloadsFolder=Yuklab olishlar
@@ -123,11 +125,3 @@ shortDays=d;d
 # LOCALIZATION NOTE (timePair3): %1$S time number; %2$S time unit
 # example: 1m; 11h
 timePair3=%1$S%2$S
-# LOCALIZATION NOTE (timeLeftSingle3): %1$S time left
-# example: 1m left; 11h left
-timeLeftSingle3=%1$S left
-# LOCALIZATION NOTE (timeLeftDouble3): %1$S time left; %2$S time left sub units
-# example: 11h 2m left; 1d 22h left
-timeLeftDouble3=%1$S %2$S left
-timeFewSeconds2=A few seconds left
-timeUnknown2=Unknown time left
diff --git a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties
index eb13f2f29f29..0511246ba16a 100644
--- a/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties
+++ b/thunderbird-l10n/uz/chrome/uz/locale/uz/mozapps/extensions/extensions.properties
@@ -2,14 +2,6 @@
 # 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/.
 
-#LOCALIZATION NOTE (aboutWindowTitle) %S is the addon name
-aboutWindowTitle=%S haqida
-aboutWindowCloseButton=Yopish
-#LOCALIZATION NOTE (aboutWindowVersionString) %S is the addon version
-aboutWindowVersionString=%S versiyasi
-#LOCALIZATION NOTE (aboutAddon) %S is the addon name
-aboutAddon=%S haqida
-
 #LOCALIZATION NOTE (uninstallNotice) %S is the add-on name
 uninstallNotice=%S o'chirildi.
 
@@ -27,7 +19,6 @@ notification.incompatible=%1$S - %2$S %3$S bilan mos emas.
 notification.unsignedAndDisabled=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi, shuning uchun u o‘chirib qo‘yildi.
 notification.unsigned=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi. Jarayonni ehtiyotkorlik bilan davom ettiring.
 notification.unsigned.link=Batafsil ma’lumot
-#LOCALIZATION NOTE (notification.nonMpcDisabled) %1$S is the add-on name
 #LOCALIZATION NOTE (notification.blocked) %1$S is the add-on name
 notification.blocked=Xavfsizlik va ishonchlilik sabablariga koʻra %1$S oʻchirilgan
 notification.blocked.link=Koʻproq ma`lumot
@@ -43,16 +34,7 @@ notification.vulnerableUpdatable.link=Hozir yangilash
 #LOCALIZATION NOTE (notification.vulnerableNoUpdate) %1$S is the add-on name
 notification.vulnerableNoUpdate=%1$S zararli deb aniqlangan. Ehtiyot boʻlib foydalaning.
 notification.vulnerableNoUpdate.link=Koʻproq ma`lumot
-#LOCALIZATION NOTE (notification.enable) %1$S is the add-on name, %2$S is brand name
-notification.enable=%1$S %2$Sni qayta ishga tushirganingizdan soʻng oʻrnatiladi.
-#LOCALIZATION NOTE (notification.disable) %1$S is the add-on name, %2$S is brand name
-notification.disable=%1$S %2$Sni qayta ishga tushirganingizdan soʻng oʻchirib qoʻyiladi.
-#LOCALIZATION NOTE (notification.install) %1$S is the add-on name, %2$S is brand name
-notification.install=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng oʻrnatiladi.
-#LOCALIZATION NOTE (notification.uninstall) %1$S is the add-on name, %2$S is brand name
-notification.uninstall=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng oʻchiriladi.
-#LOCALIZATION NOTE (notification.upgrade) %1$S is the add-on name, %2$S is brand name
-notification.upgrade=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng yangilanadi.
+#LOCALIZATION NOTE (notification.restartless-uninstall) %1$S is the add-on name
 #LOCALIZATION NOTE (notification.downloadError) %1$S is the add-on name.
 notification.downloadError=%1$Sni yuklab olishda xato yuz berdi.
 notification.downloadError.retry=Yana urinib koʻrish
@@ -72,8 +54,6 @@ installDownloaded=Yuklab olindi
 installDownloadFailed=Yuklab olishda xato
 installVerifying=Tekshirilmoqda
 installInstalling=Oʻrnatilmoqda
-installEnablePending=Yoqish uchun qayta ishga tushirish
-installDisablePending=Oʻchirish uchun qayta ishga tushiring
 installFailed=Oʻrnatishda xato
 installCancelled=Oʻrnatish bekor qilindi
 
@@ -83,7 +63,6 @@ details.notification.incompatible=%1$S  - %2$S %3$S bilan mos emas.
 details.notification.unsignedAndDisabled=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi, shuning uchun u o‘chirib qo‘yildi.
 details.notification.unsigned=%1$S qo‘shimcha dasturi %2$S brauzerida foydalanish uchun tasdiqdan o‘tmadi. Jarayonni ehtiyotkorlik bilan davom ettiring.
 details.notification.unsigned.link=Batafsil ma’lumot
-#LOCALIZATION NOTE (details.notification.nonMpcDisabled) %1$S is the add-on name
 #LOCALIZATION NOTE (details.notification.blocked) %1$S is the add-on name
 details.notification.blocked=%1$S xavfsizlik va ishonchlilik sabablariga koʻra oʻchirib qoʻyildi.
 details.notification.blocked.link=Koʻproq ma`lumot
@@ -99,106 +78,44 @@ details.notification.vulnerableUpdatable.link=Hozir yangilash
 #LOCALIZATION NOTE (details.notification.vulnerableNoUpdate) %1$S is the add-on name
 details.notification.vulnerableNoUpdate=%1$S zararli dastur hisoblanadi. Ehtiyot boʻlib foydalaning.
 details.notification.vulnerableNoUpdate.link=Koʻproq ma`lumot
-#LOCALIZATION NOTE (details.notification.enable) %1$S is the add-on name, %2$S is brand name
-details.notification.enable=%1$S %2$S qayta ishga tushirilgandan keyin yoqiladi.
-#LOCALIZATION NOTE (details.notification.disable) %1$S is the add-on name, %2$S is brand name
-details.notification.disable=%1$S %2$S qayta ishga tushirilgandan soʻng oʻchiriladi.
-#LOCALIZATION NOTE (details.notification.install) %1$S is the add-on name, %2$S is brand name
-details.notification.install=%1$S %2$S qayta ishga tushirilgandan soʻng oʻrnatiladi.
-#LOCALIZATION NOTE (details.notification.uninstall) %1$S is the add-on name, %2$S is brand name
-details.notification.uninstall=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng oʻchiriladi.
-#LOCALIZATION NOTE (details.notification.upgrade) %1$S is the add-on name, %2$S is brand name
-details.notification.upgrade=%1$S - %2$Sni qayta ishga tushirganingizdan soʻng yangilanadi.
+#LOCALIZATION NOTE (details.notification.restartless-uninstall) %1$S is the add-on name.
 #LOCALIZATION NOTE (details.notification.gmpPending) %1$S is the add-on name
 details.notification.gmpPending=%1$S tezda o‘rnatiladi.
 
-# LOCALIZATION NOTE (details.experiment.time.daysRemaining):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days from now that the experiment will remain active (detail view).
-details.experiment.time.daysRemaining=#1 kun qolmoqda;#1 kun qolmoqda
-#LOCALIZATION NOTE (details.experiment.time.endsToday) The experiment will end in less than a day (detail view).
-details.experiment.time.endsToday=Bir kundan oz vaqt qolmoqda
-# LOCALIZATION NOTE (details.experiment.time.daysPassed):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days since the experiment ran (detail view).
-details.experiment.time.daysPassed=#1 kun oldin;#1 kun oldin
-#LOCALIZATION NOTE (details.experiment.time.endedToday) The experiment ended less than a day ago (detail view).
-details.experiment.time.endedToday=Bir kundan kamroq vaqt oldin
-#LOCALIZATION NOTE (details.experiment.state.active) This experiment is active (detail view).
-details.experiment.state.active=Faol
-#LOCALIZATION NOTE (details.experiment.state.complete) This experiment is complete (it was previously active) (detail view).
-details.experiment.state.complete=Tugadi
-
-# LOCALIZATION NOTE (experiment.time.daysRemaining):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days from now that the experiment will remain active (list view item).
-experiment.time.daysRemaining=#1 kun qolmoqda;#1 kun qolmoqda
-#LOCALIZATION NOTE (experiment.time.endsToday) The experiment will end in less than a day (list view item).
-experiment.time.endsToday=Bir kundan kam vaqt qolmoqda
-# LOCALIZATION NOTE (experiment.time.daysPassed):
-# Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of days since the experiment ran (list view item).
-experiment.time.daysPassed=#1 kun oldin;#1 kun oldin
-#LOCALIZATION NOTE (experiment.time.endedToday) The experiment ended less than a day ago (list view item).
-experiment.time.endedToday=Bir kundan kamroq vaqt oldin
-#LOCALIZATION NOTE (experiment.state.active) This experiment is active (list view item).
-experiment.state.active=Faol
-#LOCALIZATION NOTE (experiment.state.complete) This experiment is complete (it was previously active) (list view item).
-experiment.state.complete=Tugadi
-
 installFromFile.dialogTitle=Oʻrnatish uchun qoʻshimcha dasturni tanlang
 installFromFile.filterName=Qoʻshimcha dasturlar
 
 uninstallAddonTooltip=Bu qoʻshimcha dasturni oʻchirish
-uninstallAddonRestartRequiredTooltip=Bu qoʻshimcha dasturni oʻchirish (qayta ishga tushirish talab qilinadi)
 enableAddonTooltip=Bu qoʻshimcha dasturni yoqish
-enableAddonRestartRequiredTooltip=Bu qoʻshimcha dasturni yoqish (qayta ishga tushirish talab qilinadi)
 disableAddonTooltip=Bu qoʻshimcha dasturni oʻchirish
-disableAddonRestartRequiredTooltip=Bu qoʻshimcha dasturni oʻchirib qoʻyish (qayta ishga tushirish talab qilinadi)
-
-#LOCALIZATION NOTE (showAllSearchResults): Semicolon-separated list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the total number of search results
-showAllSearchResults=Bitta natijani koʻrish;Barcha #1 ta narijalarni koʻrish
-
-#LOCALIZATION NOTE (addon.purchase.label) displayed on a button in the list
-# view, %S is the price of the add-on including currency symbol
-addon.purchase.label=%Sni sotib olish…
-addon.purchase.tooltip=Bu qoʻshimcha dasturni sotib olish uchun qoʻshimcha dasturlar galeriyasiga tashrif buyuring
-#LOCALIZATION NOTE (cmd.purchaseAddon.label) displayed on a button in the detail
-# view, %S is the price of the add-on including currency symbol
-cmd.purchaseAddon.label=%Sni sotib olish…
-cmd.purchaseAddon.accesskey=s
-
-#LOCALIZATION NOTE (eulaHeader) %S is name of the add-on asking the user to agree to the EULA
-eulaHeader=Oʻrnatish davom etishi uchun %S quyidagi foydalanish litsenziyasiga rozi boʻlishingiz talab qiladi:
 
 type.extension.name=Kengaytmalar
-type.theme.name=Koʻrinish
+type.themes.name=Mavzular
 type.locale.name=Tillar
 type.plugin.name=Plaginlar
 type.dictionary.name=Lugʻatlar
 type.service.name=Xizmatlar
-type.experiment.name=Tajribalar
+
+#LOCALIZATION NOTE(legacyWarning.description) %S is the brandShortName
+#LOCALIZATION NOTE(legacyThemeWarning.description) %S is the brandShortName
+legacyThemeWarning.description=Biror narsa yetishmayaptimi? Ayrim mavzular endi %Sda ishlamaydi.
+
+#LOCALIZATION NOTE(listHeading.discover) %S is the brandShortName
+listHeading.theme=Mavzularni boshqarish
+
+searchLabel.theme=Yana mavzu topish
 
 #LOCALIZATION NOTE (notification.restartless-uninstall) %1$S is the add-on name
 notification.restartless-uninstall=%1$S will be uninstalled after you close this tab.
 #LOCALIZATION NOTE (details.notification.restartless-uninstall) %1$S is the add-on name.
 details.notification.restartless-uninstall=%1$S will be uninstalled after you close this tab.
-type.themes.name=Themes
 type.legacy.name=Legacy Extensions
 type.unsupported.name=Unsupported
 #LOCALIZATION NOTE(listHeading.discover) %S is the brandShortName
 listHeading.discover=Personalize Your %S
 listHeading.extension=Manage Your Extensions
 listHeading.shortcuts=Manage Extension Shortcuts
-listHeading.theme=Manage Your Themes
 listHeading.plugin=Manage Your Plugins
 listHeading.locale=Manage Your Languages
 listHeading.dictionary=Manage Your Dictionaries
 searchLabel.extension=Find more extensions
-searchLabel.theme=Find more themes
diff --git a/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl b/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl
index b876c2a5f04f..c212c4c6abf4 100644
--- a/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl
+++ b/thunderbird-l10n/uz/localization/uz/devtools/client/toolbox-options.ftl
@@ -62,7 +62,7 @@ options-sourceeditor-autoclosebrackets-label = Qavslarni avtomatik yopish
 options-sourceeditor-expandtab-tooltip =
     .title = Ichki oyna belgisi o‘rniga bo‘sh joylardan foydalanish
 options-sourceeditor-expandtab-label = Bo‘sh joylardan foydalanib xat boshidan boshlash
-options-sourceeditor-tabsize-label = Ichki oyna hajmi
+options-sourceeditor-tabsize-label = Varaq hajmi
 options-sourceeditor-keybinding-label = Tugmalar birikmasi
 options-sourceeditor-keybinding-default-label = Standart
 
@@ -88,9 +88,6 @@ options-enable-service-workers-http-tooltip =
     .title = Asboblar paneli bo‘lgan barcha ichki oynalar uchun HTTP ustida service workers ta’minotni yoqib qo‘yadi.
 # The message shown for settings that trigger page reload
 options-context-triggers-page-refresh = * Faqat joriy seans, sahifani qayta yuklaydi
-
-##
-
 # The label for the checkbox that toggles the display of the platform data in the
 # Profiler i.e. devtools.profiler.ui.show-platform-data a boolean preference in about:config
 options-show-platform-data-label = Gecko platformasi ma’lumotlarini koʻrsatish
diff --git a/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl
index 483f8679bd4e..fed91769b072 100644
--- a/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/uz/localization/uz/toolkit/about/aboutAddons.ftl
@@ -117,18 +117,39 @@ disabled-unsigned-heading =
 disabled-unsigned-description = Quyidagi qo‘shimcha dasturlar { -brand-short-name } brauzerida foydalanish uchun tasdiqdan o‘tmagan. Siz <label data-l10n-name="find-addons">almashtiriladiganlarini topishingiz</label> yoki dasturchidan ularni tasdiqlashini so‘rashingiz mumkin.
 disabled-unsigned-learn-more = Onlayn xavfsizligingizni ta’minlash uchun qilayotgan harakatlarimiz haqida batafsil ma’lumot oling.
 disabled-unsigned-devinfo = Dasturchilar qo‘shimcha dasturlarini bizning qo‘llanmamizni o‘qib, tasdiqdan o‘tkazishga <label data-l10n-name="learn-more">qiziqishadi</label>.
+extensions-view-discopane =
+    .name = Tavsiyalar
+    .tooltiptext = { extensions-view-discopane.name }
 extensions-view-recent-updates =
     .name = Soʻnggi yangilanishlar
     .tooltiptext = { extensions-view-recent-updates.name }
 extensions-view-available-updates =
     .name = Mavjud yangilanishlar
     .tooltiptext = { extensions-view-available-updates.name }
+addon-category-discover = Tavsiyalar
+addon-category-discover-title =
+    .title = Tavsiyalar
 addon-category-extension = Kengaytmalar
+addon-category-extension-title =
+    .title = Kengaytmalar
+addon-category-theme = Mavzular
+addon-category-theme-title =
+    .title = Mavzular
 addon-category-plugin = Plaginlar
+addon-category-plugin-title =
+    .title = Plaginlar
 addon-category-dictionary = Lugʻatlar
+addon-category-dictionary-title =
+    .title = Lugʻatlar
 addon-category-locale = Tillar
+addon-category-locale-title =
+    .title = Tillar
 addon-category-available-updates = Mavjud yangilanishlar
+addon-category-available-updates-title =
+    .title = Mavjud yangilanishlar
 addon-category-recent-updates = Soʻnggi yangilanishlar
+addon-category-recent-updates-title =
+    .title = Soʻnggi yangilanishlar
 
 ## These are global warnings
 
@@ -233,14 +254,31 @@ addon-open-about-debugging = Qo‘shimcha dasturlarni tuzatish
 
 ## Recommended add-ons page
 
+# Explanatory introduction to the list of recommended add-ons. The action word
+# ("recommends") in the final sentence is a link to external documentation.
+discopane-intro =
+    Kengaytmalar va mavzular brauzeringiz uchun ilovalarga oʻxshaydi.
+    Ular parollaringizni himoya qiladi, videolarni yuklab oladi, chegirmalarni topadi,
+    asabbuzar reklamalarni bloklaydi, brauzer koʻrinishini oʻzgartiradi.
+    Bunday kichik dasturiy taʼminotlarni begona dasturchilar ishlab chiqadi.
+    Bu yerdan mutlaq xavfsizligingiz, samaradorlik va funksionallik uchun { -brand-product-name }
+    <a data-l10n-name="learn-more-trigger">tavsiya etiladigan</a> kengaytma
+    va mavzular toʻplamini topish mumkin.
+# Notice to make user aware that the recommendations are personalized.
+discopane-notice-recommendations =
+    Ayrim tavsiyalar aynan siz uchun moslashtirilgan. Ular siz oʻrnatgan boshqa 
+    kengaytmalar, profil sozlamalari va foydalanish statistikasi asosida tavsiya etiladi.
 
 ## Add-on actions
 
 
 ## Pending uninstall message bar
 
+recommended-themes-heading = Tavsiya etilgan mavzular
 
 ## Page headings
 
+theme-heading = Mavzularni boshqarish
+theme-heading-search-label = Yana mavzu topish
 addon-page-options-button =
     .title = Barcha qoʻshimcha dasturlar uchun asboblar
diff --git a/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl b/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl
index 6fbe8159b2db..dba234989c30 100644
--- a/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl
+++ b/thunderbird-l10n/uz/localization/uz/toolkit/about/abuseReports.ftl
@@ -1,3 +1,26 @@
 # 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/.
+
+abuse-report-learnmore =
+    Qaysi muammoni tanlashni bilamayapsizmi?
+    <a data-l10n-name="learnmore-link">Kengaytma va mavzular ustidan shikoyat qilish haqida batafsil</a>
+
+## Panel buttons.
+
+
+## Message bars descriptions.
+
+
+## Variables:
+##   $addon-name (string) - Name of the add-on
+
+
+## Message bars actions.
+
+
+## Abuse report reasons (optionally paired with related examples and/or suggestions)
+
+abuse-report-settings-reason = Qidiruv tizimi, bosh sahifa va yangi varaqlarni mendan soʻramasdan va menga xabar bermay oʻzgartiryapti
+abuse-report-settings-reason-v2 = Qidiruv tizimi, bosh sahifa va yangi varaqlarni mendan soʻramasdan va menga xabar bermay oʻzgartiryapti
+abuse-report-settings-suggestions-search = Qidiruv tizimi sozlamalari standart holat boʻyicha oʻzgaryapti
diff --git a/thunderbird-l10n/uz/localization/uz/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/uz/localization/uz/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..6fbe8159b2db
--- /dev/null
+++ b/thunderbird-l10n/uz/localization/uz/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,3 @@
+# 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/.
diff --git a/thunderbird-l10n/uz/manifest.json b/thunderbird-l10n/uz/manifest.json
index 7abec26c6a4b..a09aed06573d 100644
--- a/thunderbird-l10n/uz/manifest.json
+++ b/thunderbird-l10n/uz/manifest.json
@@ -1,57 +1,57 @@
 {
+  "langpack_id": "uz",
+  "version": "76.0buildid20200420212409",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "description": "Language pack for Thunderbird for uz",
+  "applications": {
+    "gecko": {
+      "strict_min_version": "76.0",
+      "strict_max_version": "76.*",
+      "id": "langpack-uz@thunderbird.mozilla.org"
+    }
+  },
+  "manifest_version": 2,
   "name": "Uzbek Language Pack",
   "languages": {
     "uz": {
+      "version": "20200417010542",
       "chrome_resources": {
-        "devtools-startup": "chrome/uz/locale/uz/devtools/startup/",
+        "communicator": "chrome/uz/locale/uz/communicator/",
         "messenger": "chrome/uz/locale/uz/messenger/",
+        "messenger-region": "chrome/uz/locale/uz/messenger-region/",
         "devtools-shared": "chrome/uz/locale/uz/devtools/shared/",
+        "calendar": "chrome/uz/locale/uz/calendar/",
+        "messenger-newsblog": "chrome/uz/locale/uz/messenger-newsblog/",
+        "pluginproblem": "chrome/uz/locale/uz/pluginproblem/",
+        "necko": "chrome/uz/locale/uz/necko/",
         "mozapps": "chrome/uz/locale/uz/mozapps/",
-        "communicator": "chrome/uz/locale/uz/communicator/",
-        "global": "chrome/uz/locale/uz/global/",
-        "autoconfig": "chrome/uz/locale/uz/autoconfig/",
-        "mozldap": "chrome/uz/locale/uz/mozldap/",
-        "messenger-smime": "chrome/uz/locale/uz/messenger-smime/",
+        "branding": "chrome/uz/locale/uz/branding/",
         "devtools": "chrome/uz/locale/uz/devtools/client/",
-        "messenger-mapi": "chrome/uz/locale/uz/messenger-mapi/",
+        "passwordmgr": "chrome/uz/locale/uz/passwordmgr/",
+        "messenger-smime": "chrome/uz/locale/uz/messenger-smime/",
+        "mozldap": "chrome/uz/locale/uz/mozldap/",
+        "devtools-startup": "chrome/uz/locale/uz/devtools/startup/",
+        "pipnss": "chrome/uz/locale/uz/pipnss/",
+        "places": "chrome/uz/locale/uz/places/",
         "pippki": "chrome/uz/locale/uz/pippki/",
+        "messenger-mapi": "chrome/uz/locale/uz/messenger-mapi/",
+        "chat": "chrome/uz/locale/uz/chat/",
         "lightning": "chrome/uz/locale/uz/lightning/",
-        "messenger-newsblog": "chrome/uz/locale/uz/messenger-newsblog/",
-        "pluginproblem": "chrome/uz/locale/uz/pluginproblem/",
-        "necko": "chrome/uz/locale/uz/necko/",
         "global-platform": {
-          "macosx": "chrome/uz/locale/uz/global-platform/mac/",
           "linux": "chrome/uz/locale/uz/global-platform/unix/",
+          "macosx": "chrome/uz/locale/uz/global-platform/mac/",
           "win": "chrome/uz/locale/uz/global-platform/win/",
           "android": "chrome/uz/locale/uz/global-platform/unix/"
         },
-        "places": "chrome/uz/locale/uz/places/",
-        "messenger-region": "chrome/uz/locale/uz/messenger-region/",
-        "calendar": "chrome/uz/locale/uz/calendar/",
-        "branding": "chrome/uz/locale/uz/branding/",
-        "chat": "chrome/uz/locale/uz/chat/",
         "alerts": "chrome/uz/locale/uz/alerts/",
-        "pipnss": "chrome/uz/locale/uz/pipnss/",
-        "passwordmgr": "chrome/uz/locale/uz/passwordmgr/"
-      },
-      "version": "20200403080946"
-    }
-  },
-  "manifest_version": 2,
-  "author": "mozilla.org (contributors: Akmal Xushvaqov, Akmal Xushvaqov)",
-  "version": "76.0buildid20200407173003",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "strict_max_version": "76.*",
-      "id": "langpack-uz@thunderbird.mozilla.org"
+        "autoconfig": "chrome/uz/locale/uz/autoconfig/",
+        "global": "chrome/uz/locale/uz/global/"
+      }
     }
   },
-  "description": "Language pack for Thunderbird for uz",
-  "langpack_id": "uz"
+  "author": "mozilla.org (contributors: Akmal Xushvaqov, Akmal Xushvaqov)"
 }
diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties
index 0c7517c17514..cf0b61e58037 100644
--- a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties
+++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/jsonview.properties
@@ -32,6 +32,8 @@ jsonViewer.Copy=Sao chép
 # LOCALIZATION NOTE (jsonViewer.ExpandAll): Label for expanding all nodes
 jsonViewer.ExpandAll=Mở rộng tất cả
 
+jsonViewer.ExpandAllSlow=Mở rộng tất cả (chậm)
+
 # LOCALIZATION NOTE (jsonViewer.CollapseAll): Label for collapsing all nodes
 jsonViewer.CollapseAll=Thu gọn tất cả
 
@@ -50,5 +52,3 @@ jsonViewer.filterJSON=Bộ lọc JSON
 # LOCALIZATION NOTE (jsonViewer.reps.reference): Label used for cycle
 # references in an array.
 jsonViewer.reps.reference=Tham khảo chu kỳ
-
-jsonViewer.ExpandAllSlow=Expand All (slow)
diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties
index 83682197f756..07c91b5b8686 100644
--- a/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties
+++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/devtools/client/webconsole.properties
@@ -27,6 +27,7 @@ browserConsole.title=Dòng lệnh của trình duyệt
 # Console window when the pref `devtools.browsertoolbox.fission` is true. This
 # Browser Console will log messages from all processes, not just the the parent
 # process.
+multiProcessBrowserConsole.title=Bảng điều khiển trình duyệt đa tiến trình
 
 # LOCALIZATION NOTE (timestampFormat): %1$02S = hours (24-hour clock),
 # %2$02S = minutes, %3$02S = seconds, %4$03S = milliseconds.
@@ -191,6 +192,12 @@ webconsole.menu.openInNetworkPanel.accesskey=N
 webconsole.menu.resendNetworkRequest.label=Gửi lại yêu cầu
 webconsole.menu.resendNetworkRequest.accesskey=n
 
+# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label)
+# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will 
+# reveal that specific DOM Node in the Inspector.
+webconsole.menu.openNodeInInspector.label=Hiển thị trong trình kiểm tra
+webconsole.menu.openNodeInInspector.accesskey=Q
+
 # LOCALIZATION NOTE (webconsole.menu.storeAsGlobalVar.label)
 # Label used for a context-menu item displayed for object/variable logs. Clicking on it
 # creates a new global variable pointing to the logged variable.
@@ -226,6 +233,19 @@ webconsole.menu.openInSidebar.accesskey=V
 # copies the entire output of the console to the clipboard.
 webconsole.menu.exportClipboard.label=Xuất tin nhắn có thể hiển thị vào clipboard
 
+# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
+# Label used for a context-menu item displayed for any log. Clicking on it will
+# jump to the execution point where the log item was generated.
+webconsole.menu.timeWarp.label=Nhảy tới đây
+
+# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
+# Label used for the tooltip on the "jump" button in the console. It's displayed when
+# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
+# message in the console output. Clicking on it will jump to the execution point where the
+# log item was generated.
+# Parameters: %S is the level of the message.
+webconsole.jumpButton.tooltip=%S - Nhảy tới đây
+
 # LOCALIZATION NOTE (webconsole.menu.exportSubmenu.label)
 # Label used for a context-menu item displayed on the output. Clicking on it
 # opens a submenu where the user can select how to export messages.
@@ -242,19 +262,6 @@ webconsole.menu.exportSubmenu.exportCliboard.label=Clipboard
 # the output of the console.
 webconsole.menu.exportSubmenu.exportFile.label=Tập tin
 
-# LOCALIZATION NOTE (webconsole.menu.timeWarp.label)
-# Label used for a context-menu item displayed for any log. Clicking on it will
-# jump to the execution point where the log item was generated.
-webconsole.menu.timeWarp.label=Nhảy tới đây
-
-# LOCALIZATION NOTE (webconsole.jumpButton.tooltip)
-# Label used for the tooltip on the "jump" button in the console. It's displayed when
-# the user recorded execution with WebReplay, is now paused in the debugger, and hover a
-# message in the console output. Clicking on it will jump to the execution point where the
-# log item was generated.
-# Parameters: %S is the level of the message.
-webconsole.jumpButton.tooltip=%S - Nhảy tới đây
-
 # LOCALIZATION NOTE (webconsole.clearButton.tooltip)
 # Label used for the tooltip on the clear logs button in the console top toolbar bar.
 # Clicking on it will clear the content of the console.
@@ -355,31 +362,40 @@ webconsole.filteredMessagesByText.tooltip=#1 đã ẩn bởi bộ lọc văn b
 # LOCALIZATION NOTE (webconsole.console.settings.menu.menuButton.tooltip)
 # Tooltip for the filter bar preferences menu. This menu will display multiple perefences for the
 # filter bar, such as enabling the compact toolbar mode, enable the timestamps, persist logs, etc
+webconsole.console.settings.menu.button.tooltip=Cài đặt bảng điều khiển
 
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.compactToolbar.label)
 # Label for the `Compact Toolbar` preference option. This will turn the message filters buttons
 # into a Menu Button, making the filter bar more compact.
+webconsole.console.settings.menu.item.compactToolbar.label=Thanh công cụ thu gọn
 
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.label)
 # Label for enabling the timestamps in the Web Console.
+webconsole.console.settings.menu.item.timestamps.label=Hiển thị dấu thời gian
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.tooltip)
+webconsole.console.settings.menu.item.timestamps.tooltip=Nếu bạn bật lệnh tùy chọn này và đầu ra trong bảng điều khiển Web sẽ hiển thị dấu thời gian
 
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.label)
 # Label for grouping the similar messages in the Web Console
+webconsole.console.settings.menu.item.warningGroups.label=Gộp thông báo tương tự
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.tooltip)
+webconsole.console.settings.menu.item.warningGroups.tooltip=Khi được bật, các thông báo tương tự được đặt thành các nhóm
 
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.label)
 # Label for enabling autocomplete for input in the Web Console
+webconsole.console.settings.menu.item.autocomplete.label=Kích hoạt tự động hoàn thành
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.tooltip)
+webconsole.console.settings.menu.item.autocomplete.tooltip=Nếu bạn bật tùy chọn này, đầu vào sẽ hiển thị các đề xuất khi bạn nhập vào nó
 
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.label)
+webconsole.console.settings.menu.item.enablePersistentLogs.label=Nhật ký liên tục
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip)
-
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.label)
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.eagerEvaluation.tooltip)
+webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=Nếu bạn bật tùy chọn này, danh sách thông tin ra sẽ không bị xóa mỗi lần bạn điều hướng đến một trang mới
 
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label)
+webconsole.console.settings.menu.item.instantEvaluation.label=Đánh giá tức thì
 # LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip)
+webconsole.console.settings.menu.item.instantEvaluation.tooltip=Nếu bạn bật tùy chọn này, đầu vào sẽ được đánh giá ngay lập tức khi bạn nhập vào nó
 
 # LOCALIZATION NOTE (browserconsole.contentMessagesCheckbox.label)
 # Label used in the browser console filter bar. This label is used for a checkbox that
@@ -553,58 +569,26 @@ webconsole.enterKey=Enter
 # LOCALIZATION NOTE (webconsole.input.openJavaScriptFile): This is a label
 # used for opening a file in the console input (Ctrl+O or Cmd+O on OSX while
 # being focused on the input).
+webconsole.input.openJavaScriptFile=Mở tập tin JavaScript
 
 # LOCALIZATION NOTE (webconsole.input.openJavaScriptFileFilter):
 # This string is displayed as a filter when opening a file in the console input.
+webconsole.input.openJavaScriptFileFilter=Tập tin JavaScript
 
 # LOCALIZATION NOTE (webconsole.input.selector.top): This is the term used
 # to describe the primary thread of execution in the page
+webconsole.input.selector.top=Trên cùng
 
 # LOCALIZATION NOTE (webconsole.input.selector.tooltip): This is the tooltip
 # shown when users select a thread that they want to evaluate an
 # expression for.
+webconsole.input.selector.tooltip=Chọn bối cảnh đánh giá
+
+# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'.
+webconsole.group.cookieSameSiteLaxByDefaultEnabled=Một số cookie đang sử dụng sai thuộc tính “sameSite“, do đó có thể không hoạt động như mong đợi
+# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'.
+webconsole.group.cookieSameSiteLaxByDefaultDisabled=Một số cookie đang sử dụng sai thuộc tính được đề xuất “sameSite“
 
-# LOCALIZATION NOTE (multiProcessBrowserConsole.title): Title of the Browser
-# Console window when the pref `devtools.browsertoolbox.fission` is true. This
-# Browser Console will log messages from all processes, not just the the parent
-# process.
-multiProcessBrowserConsole.title=Multiprocess Browser Console
-# LOCALIZATION NOTE (webconsole.menu.openNodeInInspector.label)
-# Label used for a context-menu item displayed for DOM Node logs. Clicking on it will 
-# reveal that specific DOM Node in the Inspector.
-webconsole.menu.openNodeInInspector.label=Reveal in Inspector
-webconsole.menu.openNodeInInspector.accesskey=Q
-# LOCALIZATION NOTE (webconsole.console.settings.menu.menuButton.tooltip)
-# Tooltip for the filter bar preferences menu. This menu will display multiple perefences for the
-# filter bar, such as enabling the compact toolbar mode, enable the timestamps, persist logs, etc
-webconsole.console.settings.menu.button.tooltip=Console Settings
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.compactToolbar.label)
-# Label for the `Compact Toolbar` preference option. This will turn the message filters buttons
-# into a Menu Button, making the filter bar more compact.
-webconsole.console.settings.menu.item.compactToolbar.label=Compact Toolbar
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.label)
-# Label for enabling the timestamps in the Web Console.
-webconsole.console.settings.menu.item.timestamps.label=Show Timestamps
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.timestamps.tooltip)
-webconsole.console.settings.menu.item.timestamps.tooltip=If you enable this option commands and output in the Web Console will display a timestamp
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.label)
-# Label for grouping the similar messages in the Web Console
-webconsole.console.settings.menu.item.warningGroups.label=Group Similar Messages
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.warningGroups.tooltip)
-webconsole.console.settings.menu.item.warningGroups.tooltip=When enabled, similar messages are placed into groups
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.label)
-# Label for enabling autocomplete for input in the Web Console
-webconsole.console.settings.menu.item.autocomplete.label=Enable Autocompletion
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.autocomplete.tooltip)
-webconsole.console.settings.menu.item.autocomplete.tooltip=If you enable this option the input will display suggestions as you type in it
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.label)
-webconsole.console.settings.menu.item.enablePersistentLogs.label=Persist Logs
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.enablePersistentLogs.tooltip)
-webconsole.console.settings.menu.item.enablePersistentLogs.tooltip=If you enable this option the output will not be cleared each time you navigate to a new page
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.label)
-webconsole.console.settings.menu.item.instantEvaluation.label=Instant Evaluation
-# LOCALIZATION NOTE (webconsole.console.settings.menu.item.instantEvaluation.tooltip)
-webconsole.console.settings.menu.item.instantEvaluation.tooltip=If you enable this option the input will be instantly evaluated as you type in it
 # LOCALIZATION NOTE (webconsole.editor.toolbar.reverseSearchButton.openReverseSearch.tooltip)
 # Label used for the tooltip on the reverse search button for opening the Reverse Search UI.
 # The Reverse Search is a feature that mimics the bash-like reverse search of
@@ -627,21 +611,3 @@ webconsole.editor.toolbar.closeButton.tooltip2=Switch back to inline mode (%S)
 # displayed when the console is in regular mode.
 # Parameters: %S is the keyboard shortcut.
 webconsole.input.openEditorButton.tooltip2=Switch to multi-line editor mode (%S)
-# LOCALIZATION NOTE (webconsole.input.openJavaScriptFile): This is a label
-# used for opening a file in the console input (Ctrl+O or Cmd+O on OSX while
-# being focused on the input).
-webconsole.input.openJavaScriptFile=Open JavaScript File
-# LOCALIZATION NOTE (webconsole.input.openJavaScriptFileFilter):
-# This string is displayed as a filter when opening a file in the console input.
-webconsole.input.openJavaScriptFileFilter=JavaScript Files
-# LOCALIZATION NOTE (webconsole.input.selector.top): This is the term used
-# to describe the primary thread of execution in the page
-webconsole.input.selector.top=Top
-# LOCALIZATION NOTE (webconsole.input.selector.tooltip): This is the tooltip
-# shown when users select a thread that they want to evaluate an
-# expression for.
-webconsole.input.selector.tooltip=Select evaluation context
-# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultEnabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultEnabled=Some cookies are misusing the “sameSite“ attribute, so it won’t work as expected
-# LOCALIZATION NOTE (webconsole.group.cookieSameSiteLaxByDefaultDisabled): do not translate 'sameSite'.
-webconsole.group.cookieSameSiteLaxByDefaultDisabled=Some cookies are misusing the recommended “sameSite“ attribute
diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties
index 999b70a046ef..9879da35c4c2 100644
--- a/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties
+++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/global-platform/mac/accessible.properties
@@ -58,8 +58,7 @@ separator    =      dấu ngăn cách
 tabPanel     =      bảng thẻ
 # The roleDescription for the html:mark element
 highlight = tô sáng
-
 # The roleDescription for the details element
-details = details
+details = chi tiết
 # The roleDescription for the summary element
-summary = summary
+summary = tóm tắt
diff --git a/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties b/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties
index 9f1a4f16ac15..63ee2aaba257 100644
--- a/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties
+++ b/thunderbird-l10n/vi/chrome/vi/locale/vi/global/dom/dom.properties
@@ -55,6 +55,7 @@ FormValidationDateTimeRangeUnderflow=Vui lòng chọn một ngày không sớm h
 FormValidationStepMismatch=Vui lòng chọn một giá trị hợp lệ. Hai giá trị hợp lệ gần nhất là %S và %S.
 # LOCALIZATION NOTE (FormValidationStepMismatchOneValue): %S can be a number, a date or a time. This is called instead of FormValidationStepMismatch when the second value is the same as the first.
 FormValidationStepMismatchOneValue=Vui lòng chọn một giá trị hợp lệ. Giá trị hợp lệ gần nhất là %S.
+# LOCALIZATION NOTE (FormValidationTimeReversedRangeUnderflowAndOverflow): %1$S,%2$S are time.
 FormValidationBadInputNumber=Vui lòng nhập số.
 EnablePrivilegeWarning=Việc sử dụng enablePrivilege không được khuyến khích.  Vui lòng sử dụng đoạn mã chạy với thành phần cơ bản của hệ thống (vd. một phần mở rộng).
 FullscreenDeniedDisabled=Yêu cầu toàn màn hình đã bị từ chối vì API toàn màn hình bị tắt theo ưu tiên của người dùng.
@@ -197,6 +198,9 @@ ManifestInvalidCSSColor=%1$S: %2$S không phải là màu CSS hợp lệ.
 # LOCALIZATION NOTE: %1$S is the name of the property whose value is invalid. %2$S is the (invalid) value of the property. E.g. "lang: 42 is not a valid language code."
 ManifestLangIsInvalid=%1$S: %2$S không phải là mã ngôn ngữ hợp lệ.
 # LOCALIZATION NOTE: %1$S is the name of the parent property whose value is invalid (e.g., "icons"). %2$S is the index of the image object that is invalid (from 0). %3$S is the name of actual member that is invalid. %4$S is the invalid value. E.g. "icons item at index 2 is invalid. The src member is an invalid URL http://:Invalid"
+# LOCALIZATION NOTE: %1$S is the name of the parent property that that contains the unusable image object (e.g., "icons"). %2$S is the index of the image object that is unusable (from 0). E.g. "icons item at index 2 lacks a usable purpose. It will be ignored."
+# LOCALIZATION NOTE: %1$S is the name of the parent property that contains the unsupported value (e.g., "icons"). %2$S is the index of the image object that has the unsupported value (from 0). %3$S are the unknown purposes. E.g. "icons item at index 2 includes unsupported purpose(s): a b."
+# LOCALIZATION NOTE: %1$S is the name of the parent property that has a repeated purpose (e.g., "icons"). %2$S is the index of the image object that has the repeated purpose (from 0). %3$S is the repeated purposes. E.g. "icons item at index 2 includes repeated purpose(s): a b."
 # LOCALIZATION NOTE: Do not translate "postMessage" or DOMWindow. %S values are origins, like https://domain.com:port
 # LOCALIZATION NOTE: Do not translate 'YouTube'. %S values are origins, like https://domain.com:port
 # LOCALIZATION NOTE: Do not translate 'YouTube'. %S values are origins, like https://domain.com:port
@@ -260,7 +264,10 @@ NotificationsInsecureRequestIsForbidden=Quyền thông báo chỉ có thể đư
 # LOCALIZATION NOTE: Do not translate "<script>".
 # LOCALIZATION NOTE: Do not translate "<script>".
 # LOCALIZATION NOTE: Do not translate "<script>".
+ModuleSourceMalformed=URI nguồn module không đúng định dạng: “%S”.
 # LOCALIZATION NOTE: Do not translate "<script>".
+ScriptSourceNotAllowed=URI nguồn <script> không được phép trong tài liệu này: “%S”.
+ModuleSourceNotAllowed=URI nguồn module không được phép trong tài liệu này: “%S”.
 # LOCALIZATION NOTE: %1$S is the invalid property value and %2$S is the property name.
 # LOCALIZATION NOTE: Do not translate "ReadableStream".
 ReadableStreamReadingFailed=Không thể đọc dữ liệu từ ReadableStream: “%S”.
@@ -273,7 +280,12 @@ OrientationEventWarning=Các cảm biến định hướng không còn được
 ProximityEventWarning=Các cảm biến tiệm cận không còn được sử dụng nữa.
 AmbientLightEventWarning=Các cảm biến ánh sáng xung quanh không còn được sử dụng nữa.
 # LOCALIZATION NOTE: Do not translate "storage", "indexedDB.open" and "navigator.storage.persist()".
+IDBOpenDBOptions_StorageTypeWarning=Thuộc tính ‘storage’ trong tùy chọn được truyền cho indexedDB.open không còn được dùng nữa và sẽ sớm bị xóa. Để có được dung lượng lưu trữ liên tục, vui lòng thay thế thành navigator.storage.persist().
+DOMQuadBoundsAttrWarning=DOMQuad.bounds không còn được dùng nữa, sử dụng DOMQuad.getBounds() để thay thế
 UnsupportedEntryTypesIgnored=Bỏ qua entryTypes không được hỗ trợ: %S.
+AllEntryTypesIgnored=Không có entryTypes hợp lệ; hủy bỏ đăng ký.
+
+# LOCALIZATION NOTE: do not localize key=“%S” modifiers=“%S” id=“%S”
 
 #LOCALIZATION NOTE(DeprecatedTestingInterfaceWarning): Do not translate this message. It's just testing only.
 DeprecatedTestingInterfaceWarning=TestingDeprecatedInterface là một giao diện chỉ dành cho thử nghiệm và đây là thông báo không dùng thử.
@@ -292,6 +304,18 @@ MozfullscreenerrorDeprecatedPrefixWarning=onmozfullscreenerror không còn đư
 # LOCALIZATION NOTE(External_AddSearchProviderWarning): Do not translate AddSearchProvider.
 External_AddSearchProviderWarning=AddSearchProvider không còn được dùng nữa.
 # LOCALIZATION NOTE: Do not translate "MouseEvent.mozPressure" and "PointerEvent.pressure".
+# LOCALIZATION NOTE: Do not translate MathML, align, numalign and denomalign.
+# LOCALIZATION NOTE: Do not translate MathML and bevelled.
+# LOCALIZATION NOTE: Do not translate thin, medium, thick and linethickness.
+# LOCALIZATION NOTE: Do not translate small, normal, big and mathsize.
+# LOCALIZATION NOTE: Do not translate veryverythinmathspace, verythinmathspace,
+# thinmathspace, mediummathspace, thickmathspace, verythickmathspace, veryverythickmathspace and MathML.
+# LOCALIZATION NOTE: Do not translate radical, notation and menclose.
+# LOCALIZATION NOTE: Do not translate MathML or mfenced.
+# LOCALIZATION NOTE: Do not translate MathML, subscriptshift and superscriptshift.
+# LOCALIZATION NOTE: Do not translate MathML, background, color, fontfamily, fontsize, fontstyle and fontweight.
+# LOCALIZATION NOTE: Do not translate MathML and XLink.
+# LOCALIZATION NOTE (UnknownProtocolNavigationPrevented): %1$S is the destination URL.
 
 # LOCALIZATION NOTE (EditorFileDropFailed): Do not translate contenteditable, %S is the error message explaining why the drop failed.
 EditorFileDropFailed=Dropping a file into a contenteditable element failed: %S.
@@ -461,16 +485,9 @@ ScriptSourceLoadFailed=Loading failed for the <script> with source “%S”.
 ModuleSourceLoadFailed=Loading failed for the module with source “%S”.
 # LOCALIZATION NOTE: Do not translate "<script>".
 ScriptSourceMalformed=<script> source URI is malformed: “%S”.
-ModuleSourceMalformed=Module source URI is malformed: “%S”.
-# LOCALIZATION NOTE: Do not translate "<script>".
-ScriptSourceNotAllowed=<script> source URI is not allowed in this document: “%S”.
-ModuleSourceNotAllowed=Module source URI is not allowed in this document: “%S”.
 # LOCALIZATION NOTE: %1$S is the invalid property value and %2$S is the property name.
 InvalidKeyframePropertyValue=Keyframe property value “%1$S” is invalid according to the syntax for “%2$S”.
 MixedDisplayObjectSubrequestWarning=Loading insecure content within a plugin embedded in a secure connection is going to be removed.
-# LOCALIZATION NOTE: Do not translate "storage", "indexedDB.open" and "navigator.storage.persist()".
-IDBOpenDBOptions_StorageTypeWarning=The ‘storage’ attribute in options passed to indexedDB.open is deprecated and will soon be removed. To get persistent storage, please use navigator.storage.persist() instead.
-AllEntryTypesIgnored=No valid entryTypes; aborting registration.
 # LOCALIZATION NOTE: do not localize key=“%S” modifiers=“%S” id=“%S”
 GTK2Conflict2=Key event not available on GTK2: key=“%S” modifiers=“%S” id=“%S”
 WinConflict2=Key event not available on some keyboard layouts: key=“%S” modifiers=“%S” id=“%S”
diff --git a/thunderbird-l10n/vi/localization/vi/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/vi/localization/vi/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..728cd482c617
--- /dev/null
+++ b/thunderbird-l10n/vi/localization/vi/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Chuyển hướng URI lịch
+calendar-uri-redirect-description =
+    Máy chủ đang chuyển hướng URI cho lịch "{ $calendarName }".
+    Chấp nhận chuyển hướng và bắt đầu sử dụng URI mới cho lịch này?
+calendar-uri-redirect-original-uri-label = URI hiện tại:
+calendar-uri-redirect-target-uri-label = Chuyển hướng đến URI mới:
diff --git a/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl b/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl
index 622d29da8ade..5aa334926c46 100644
--- a/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl
+++ b/thunderbird-l10n/vi/localization/vi/devtools/client/aboutdebugging.ftl
@@ -186,6 +186,9 @@ about-debugging-browser-version-too-old = Trình duyệt được kết nối c
 # backward compatible changes broke the debugger in those scenarios (Bug 1528219).
 # { $runtimeVersion } is the version of the remote browser (for instance "67.0a1")
 about-debugging-browser-version-too-old-67-debugger = Bảng trình gỡ lỗi có thể không hoạt động với trình duyệt được kết nối. Vui lòng sử dụng Firefox { $runtimeVersion } nếu bạn cần sử dụng trình gỡ lỗi với trình duyệt này.
+# Dedicated message for a backward compatibility issue that occurs when connecting:
+# from Fx 70+ to the old Firefox for Android (aka Fennec) which uses Fx 68.
+about-debugging-browser-version-too-old-fennec = Phiên bản Firefox này không thể gỡ lỗi Firefox dành cho Android (68). Chúng tôi khuyên bạn nên cài đặt Firefox Nightly dành cho Android trên điện thoại để thử nghiệm. <a>Chi tiết khác</a>
 # This string is displayed in the runtime page if the remote browser version is too recent.
 # "Troubleshooting" link points to https://developer.mozilla.org/docs/Tools/about:debugging#Troubleshooting
 # { $runtimeID } is the build ID of the remote browser (for instance "20181231", format is yyyyMMdd)
diff --git a/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl b/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl
index 10b945539784..4def49fa989f 100644
--- a/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl
+++ b/thunderbird-l10n/vi/localization/vi/messenger/preferences/preferences.ftl
@@ -25,7 +25,7 @@ privacy-data-collection-header = Thu thập và sử dụng dữ liệu
 privacy-security-header = Bảo mật
 privacy-scam-detection-title = Phát hiện lừa đảo
 privacy-anti-virus-title = Trình chống vi-rút
-privacy-certificates-title = Chứng chỉ
+privacy-certificates-title = Chứng nhận
 chat-pane-header = Trò chuyện
 chat-status-title = Trạng thái
 chat-notifications-title = Thông báo
diff --git a/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl b/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl
index 7fbc7f8f41e0..193402abcc93 100644
--- a/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl
+++ b/thunderbird-l10n/vi/localization/vi/security/certificates/certManager.ftl
@@ -24,14 +24,6 @@ certmgr-detail-pretty-print-tab-title =
     .accesskey = C
 certmgr-pending-label =
     .value = Hiện đang xác minh chứng chỉ…
-certmgr-subject-info-label =
-    .value = Cấp cho
-certmgr-issuer-info-label =
-    .value = Cấp bởi
-certmgr-period-of-validity-label =
-    .value = Thời gian hiệu lực
-certmgr-fingerprints-label =
-    .value = Vân tay
 certmgr-subject-label = Cấp cho
 certmgr-issuer-label = Cấp bởi
 certmgr-period-of-validity = Thời gian hiệu lực
@@ -40,18 +32,6 @@ certmgr-cert-detail =
     .title = Chi tiết chứng chỉ
     .buttonlabelaccept = Đóng
     .buttonaccesskeyaccept = C
-certmgr-cert-detail-cn =
-    .value = Tên thông thường (CN)
-certmgr-cert-detail-o =
-    .value = Tổ chức (O)
-certmgr-cert-detail-ou =
-    .value = Đơn vị tổ chức (OU)
-certmgr-cert-detail-serialnumber =
-    .value = Số sê-ri
-certmgr-cert-detail-sha256-fingerprint =
-    .value = Vân tay SHA-256
-certmgr-cert-detail-sha1-fingerprint =
-    .value = Vân tay SHA1
 certmgr-cert-detail-commonname = Tên thông thường (CN)
 certmgr-cert-detail-org = Tổ chức (O)
 certmgr-cert-detail-orgunit = Đơn vị tổ chức (OU)
@@ -67,10 +47,10 @@ certmgr-edit-cert-trust-ssl =
 certmgr-edit-cert-trust-email =
     .label = Chứng chỉ này có thể nhận diện người dùng email.
 certmgr-delete-cert =
-    .title = Xóa chứng chỉ
+    .title = Xóa chứng nhận
     .style = width: 48em; height: 24em;
 certmgr-cert-name =
-    .label = Tên chứng chỉ
+    .label = Tên chứng nhận
 certmgr-cert-server =
     .label = Máy chủ
 certmgr-override-lifetime =
@@ -80,13 +60,9 @@ certmgr-token-name =
 certmgr-begins-on = Bắt đầu
 certmgr-begins-label =
     .label = Bắt đầu
-certmgr-begins-value =
-    .value = { certmgr-begins-label.label }
 certmgr-expires-on = Hết hạn vào
 certmgr-expires-label =
     .label = Hết hạn vào
-certmgr-expires-value =
-    .value = { certmgr-expires-label.label }
 certmgr-email =
     .label = Địa chỉ email
 certmgr-serial =
@@ -116,7 +92,7 @@ certmgr-restore =
     .label = Nhập…
     .accesskey = N
 certmgr-details =
-    .value = Trường chứng chỉ
+    .value = Trường chứng nhận
     .accesskey = F
 certmgr-fields =
     .value = Giá trị trường
@@ -136,7 +112,7 @@ exception-mgr-supplemental-warning = Ngân hàng, cửa hiệu và trang công c
 exception-mgr-cert-location-url =
     .value = Địa chỉ:
 exception-mgr-cert-location-download =
-    .label = Nhận chứng chỉ
+    .label = Nhận chứng nhận
     .accesskey = G
 exception-mgr-cert-status-view-cert =
     .label = Xem…
diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl
index 9300147fd98b..cb8d66c74368 100644
--- a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = Cài đặt tiện ích từ tập tin…
     .accesskey = I
 help-button = Hỗ trợ tiện ích
+sidebar-help-button-title =
+    .title = Hỗ trợ tiện ích
 preferences =
     { PLATFORM() ->
         [windows] Tùy chọn { -brand-short-name }
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = Công cụ cho tất cả tiện ích
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] Tùy chọn { -brand-short-name }
+           *[other] Tùy chỉnh { -brand-short-name }
+        }
 show-unsigned-extensions-button =
     .label = Không thể xác thực một số tiện ích
 show-all-extensions-button =
@@ -168,13 +176,29 @@ extensions-view-available-updates =
     .name = Cập nhật có sẵn
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = Đề xuất
+addon-category-discover-title =
+    .title = Đề xuất
 addon-category-extension = Tiện ích mở rộng
+addon-category-extension-title =
+    .title = Tiện ích mở rộng
 addon-category-theme = Chủ đề
+addon-category-theme-title =
+    .title = Chủ đề
 addon-category-plugin = Phần bổ trợ
+addon-category-plugin-title =
+    .title = Phần bổ trợ
 addon-category-dictionary = Từ điển
+addon-category-dictionary-title =
+    .title = Từ điển
 addon-category-locale = Ngôn ngữ
+addon-category-locale-title =
+    .title = Ngôn ngữ
 addon-category-available-updates = Cập nhật có sẵn
+addon-category-available-updates-title =
+    .title = Cập nhật có sẵn
 addon-category-recent-updates = Cập nhật gần đây
+addon-category-recent-updates-title =
+    .title = Cập nhật gần đây
 
 ## These are global warnings
 
@@ -287,6 +311,7 @@ shortcuts-no-commands = Các tiện ích mở rộng sau không có phím tắt:
 shortcuts-input =
     .placeholder = Nhập một phím tắt
 shortcuts-browserAction = Kích hoạt tiện ích mở rộng
+shortcuts-browserAction2 = Kích hoạt nút thanh công cụ
 shortcuts-pageAction = Kích hoạt hành động trang
 shortcuts-sidebarAction = Chuyển đến thanh lề
 shortcuts-modifier-mac = Bao gồmCtrl, Alt, hoặc ⌘
@@ -311,6 +336,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = Hiện ít hơn
 go-back-button =
     .tooltiptext = Quay lại
+header-back-button =
+    .title = Quay lại
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl
index 15593bfcd09e..03dc6330b50b 100644
--- a/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/vi/localization/vi/toolkit/about/aboutSupport.ftl
@@ -160,7 +160,7 @@ intl-regional-prefs = Cài đặt khu vực
 ## See also https://firefox-source-docs.mozilla.org/remote/
 
 remote-debugging-title = Gỡ lỗi từ xa (Giao thức Chromium)
-remote-debugging-accepting-connections = Đang cho phép kết nối
+remote-debugging-accepting-connections = Cho phép kết nối
 remote-debugging-url = URL
 
 ##
@@ -267,6 +267,11 @@ sandbox-proc-type-content = nội dung
 sandbox-proc-type-file = nội dung tập tin
 sandbox-proc-type-media-plugin = phần bổ trợ phương tiện
 sandbox-proc-type-data-decoder = bộ giải mã dữ liệu
+startup-cache-title = Bộ nhớ đệm khởi động
+startup-cache-disk-cache-path = Đường dẫn bộ nhớ đệm trên đĩa
+startup-cache-ignore-disk-cache = Bỏ qua bộ nhớ đệm trên đĩa
+startup-cache-found-disk-cache-on-init = Tìm thấy bộ nhớ đệm trên đĩa khi khởi tạo
+startup-cache-wrote-to-disk-cache = Ghi vào bộ nhớ đệm trên đĩa
 launcher-process-status-0 = Đã bật
 launcher-process-status-1 = Vô hiệu hóa do thất bại
 launcher-process-status-2 = Bắt buộc vô hiệu hóa
@@ -290,6 +295,7 @@ touch-enabled = cảm ứng đã bật
 drag-enabled = thanh cuộn kéo đã bật
 keyboard-enabled = bàn phím đã bật
 autoscroll-enabled = tự động cuộn đã bật
+zooming-enabled = pinch-zoom mượt được kích hoạt
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl
index c4810d967f7c..3aa87a226a69 100644
--- a/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/vi/localization/vi/toolkit/about/certviewer.ftl
@@ -28,6 +28,8 @@ certificate-viewer-id = ID
 certificate-viewer-key-exchange-group = Nhóm trao đổi khóa
 certificate-viewer-key-id = ID khóa
 certificate-viewer-key-size = Kích thước khóa
+# Inc. means Incorporated, e.g GitHub is incorporated in Delaware
+certificate-viewer-inc-locality = Địa phương hợp nhất
 certificate-viewer-locality = Thành phố
 certificate-viewer-location = Địa chỉ
 certificate-viewer-logid = ID bản ghi
@@ -94,3 +96,16 @@ certificate-viewer-download-pem = PEM (chứng chỉ)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM (chain)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = Tiện ích mở rộng này đã được đánh dấu là nghiêm trọng, có nghĩa là khách hàng phải từ chối chứng chỉ nếu họ không hiểu nó.
+certificate-viewer-export = Xuất
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = Chứng nhận của bạn
+certificate-viewer-tab-people = Mọi người
+certificate-viewer-tab-servers = Máy chủ
+certificate-viewer-tab-ca = Nhà thẩm định
+certificate-viewer-tab-unkonwn = Không rõ
diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl
index cd4d46d93f4a..ad505d678047 100644
--- a/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/vi/localization/vi/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = Nội dung web bị cô lập
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/vi/localization/vi/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/vi/localization/vi/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..518983ec988d
--- /dev/null
+++ b/thunderbird-l10n/vi/localization/vi/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = Bạn vừa chạy phiên bản cũ của { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = Tạo hồ sơ mới
+profiledowngrade-sync = Sử dụng phiên bản { -brand-product-name } cũ hơn có thể làm hỏng dấu trang và lịch sử duyệt web đã được lưu vào cấu hình { -brand-product-name } hiện có. Để bảo vệ thông tin của bạn, hãy tạo một hồ sơ mới cho bản cài đặt này của { -brand-short-name }. Bạn luôn có thể đăng nhập bằng { -fxaccount-brand-name } để đồng bộ hóa dấu trang và lịch sử duyệt giữa các hồ sơ.
+profiledowngrade-nosync = Sử dụng phiên bản { -brand-product-name } cũ hơn có thể làm hỏng dấu trang và lịch sử duyệt web đã được lưu vào cấu hình { -brand-product-name } hiện có. Để bảo vệ thông tin của bạn, hãy tạo một hồ sơ mới cho bản cài đặt này của { -brand-short-name }.
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] Thoát
+           *[other] Thoát
+        }
diff --git a/thunderbird-l10n/vi/manifest.json b/thunderbird-l10n/vi/manifest.json
index 5af068973850..60e3aafed0b8 100644
--- a/thunderbird-l10n/vi/manifest.json
+++ b/thunderbird-l10n/vi/manifest.json
@@ -1,11 +1,5 @@
 {
   "manifest_version": 2,
-  "name": "Tiếng Việt Language Pack",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
   "applications": {
     "gecko": {
       "strict_max_version": "76.*",
@@ -14,44 +8,50 @@
     }
   },
   "langpack_id": "vi",
-  "author": "mozilla.org (contributors: Nguyễn Xuân Minh, Quế Tùng, Nguyễn Mạnh Hùng, Huỳnh Hải Đăng, Bùi Việt Khoa, Trần Nguyễn Sơn, Pierre Neter)",
   "languages": {
     "vi": {
+      "version": "20200419151411",
       "chrome_resources": {
-        "branding": "chrome/vi/locale/vi/branding/",
-        "pippki": "chrome/vi/locale/vi/pippki/",
-        "global-platform": {
-          "android": "chrome/vi/locale/vi/global-platform/unix/",
-          "macosx": "chrome/vi/locale/vi/global-platform/mac/",
-          "linux": "chrome/vi/locale/vi/global-platform/unix/",
-          "win": "chrome/vi/locale/vi/global-platform/win/"
-        },
+        "necko": "chrome/vi/locale/vi/necko/",
+        "pluginproblem": "chrome/vi/locale/vi/pluginproblem/",
         "messenger-smime": "chrome/vi/locale/vi/messenger-smime/",
-        "devtools-startup": "chrome/vi/locale/vi/devtools/startup/",
-        "mozldap": "chrome/vi/locale/vi/mozldap/",
+        "devtools-shared": "chrome/vi/locale/vi/devtools/shared/",
         "messenger-region": "chrome/vi/locale/vi/messenger-region/",
-        "autoconfig": "chrome/vi/locale/vi/autoconfig/",
-        "messenger": "chrome/vi/locale/vi/messenger/",
-        "calendar": "chrome/vi/locale/vi/calendar/",
+        "mozldap": "chrome/vi/locale/vi/mozldap/",
         "lightning": "chrome/vi/locale/vi/lightning/",
-        "alerts": "chrome/vi/locale/vi/alerts/",
-        "necko": "chrome/vi/locale/vi/necko/",
-        "pipnss": "chrome/vi/locale/vi/pipnss/",
-        "messenger-mapi": "chrome/vi/locale/vi/messenger-mapi/",
-        "devtools-shared": "chrome/vi/locale/vi/devtools/shared/",
-        "communicator": "chrome/vi/locale/vi/communicator/",
-        "messenger-newsblog": "chrome/vi/locale/vi/messenger-newsblog/",
-        "pluginproblem": "chrome/vi/locale/vi/pluginproblem/",
+        "messenger": "chrome/vi/locale/vi/messenger/",
         "chat": "chrome/vi/locale/vi/chat/",
+        "messenger-mapi": "chrome/vi/locale/vi/messenger-mapi/",
+        "autoconfig": "chrome/vi/locale/vi/autoconfig/",
+        "global-platform": {
+          "linux": "chrome/vi/locale/vi/global-platform/unix/",
+          "macosx": "chrome/vi/locale/vi/global-platform/mac/",
+          "win": "chrome/vi/locale/vi/global-platform/win/",
+          "android": "chrome/vi/locale/vi/global-platform/unix/"
+        },
         "global": "chrome/vi/locale/vi/global/",
+        "branding": "chrome/vi/locale/vi/branding/",
+        "communicator": "chrome/vi/locale/vi/communicator/",
+        "passwordmgr": "chrome/vi/locale/vi/passwordmgr/",
+        "pipnss": "chrome/vi/locale/vi/pipnss/",
         "places": "chrome/vi/locale/vi/places/",
+        "calendar": "chrome/vi/locale/vi/calendar/",
+        "pippki": "chrome/vi/locale/vi/pippki/",
+        "alerts": "chrome/vi/locale/vi/alerts/",
+        "messenger-newsblog": "chrome/vi/locale/vi/messenger-newsblog/",
         "mozapps": "chrome/vi/locale/vi/mozapps/",
-        "passwordmgr": "chrome/vi/locale/vi/passwordmgr/",
+        "devtools-startup": "chrome/vi/locale/vi/devtools/startup/",
         "devtools": "chrome/vi/locale/vi/devtools/client/"
-      },
-      "version": "20200406030724"
+      }
     }
   },
-  "version": "76.0buildid20200407173003",
+  "author": "mozilla.org (contributors: Nguyễn Xuân Minh, Quế Tùng, Nguyễn Mạnh Hùng, Huỳnh Hải Đăng, Bùi Việt Khoa, Trần Nguyễn Sơn, Pierre Neter)",
+  "version": "76.0buildid20200420212409",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
+  "name": "Tiếng Việt Language Pack",
   "description": "Language pack for Thunderbird for vi"
 }
diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties
index 1050a9524ac3..828b7b7948af 100644
--- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties
+++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=此元素有可滚动的溢出内容。
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=无相关规则
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=按住 Shift 键点击,即可跳至规则
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties
index 26266e5394f9..702fa6c37ffc 100644
--- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties
+++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/css.properties
@@ -7,6 +7,7 @@ MimeNotCssWarn=样式表单 %1$S 已作为 CSS 载入,虽然它的 MIME 类型
 
 PEUnexpEOF2=搜索 %1$S 时遇到不期望的文件结束符。
 PEParseRuleWSOnly=空白字符串不能作为规则解析。
+
 PEDeclDropped=声明被丢弃。
 PEDeclSkipped=跳过至下一个声明。
 PEUnknownProperty=未知属性 '%1$S'。
@@ -179,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=只允许一个 repeat(auto-fill, …)
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=只允许一个 repeat(auto-fill, …) 或 repeat(auto-fit, …) 出现在跟踪列表中。
 PEMoreThanOneGridRepeatTrackSize=只允许一个跟踪大小出现在 repeat(auto-fit/auto-fill, …) 中。
 
+PEDisallowedImportRule=@import 规则在构造的样式表中尚未生效。
+
 TooLargeDashedRadius=‘dashed’ 样式的边框半径太大(限制为 100000px)。渲染为 solid。
 TooLargeDottedRadius=‘dotted’ 样式的边框半径太大(限制为 100000px)。渲染为 solid。
diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties
index 80310b847ed7..7032b5f7a88a 100644
--- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties
+++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = 网站 “%2$S”的 X-Frame-Options 设为“%1$S”,不允许载
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = 网站“%2$S”的 X-Frame-Options 设为“%1$S”,不允许载入来自“%3$S”的跨源框架。
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = 载入“%2$S”时发现无效的 X-Frame-Options 头:“%1$S”指令无效。
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=由于“X-Frame-Options“指令设为“%1$S“,已拒绝在框架中载入“%2$S”。
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = 已将不安全的请求“%1$S”升级为“%2$S”。
diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd
index 6571da392cc7..93738e796617 100644
--- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd
+++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "搜索消息…">
 <!ENTITY searchMailCmd.accesskey "M">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "全局搜索…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "搜索地址…">
 <!ENTITY searchAddressesCmd.accesskey "S">
 
diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties
index 21c879858593..b9f32b1c00ec 100644
--- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties
+++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/messenger/pgpmime.properties
@@ -10,3 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=这是一封 OpenPGP 加密的邮件。<br>要解密这封邮件,您需要安装 <a href="%S">OpenPGP 附加组件</a>。
 
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=此消息由 OpenPGP 加密,但客户端尚不支持 OpenPGP 解密。
diff --git a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties
index f8abb0a357ed..cd41b51dfc65 100644
--- a/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties
+++ b/thunderbird-l10n/zh-CN/chrome/zh-CN/locale/zh-CN/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=已自动允许位于“%1$S”的跟
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=已自动允许位于“%1$S”的跟踪器“%2$S”访问存储空间。
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=已自动允许位于“%1$S”上第一方隔离的“%2$S”访问存储空间。
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=因为设置了“sameSite=none”属性,但缺少“secure”属性,已拒绝 Cookie “%1$S”。
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..9209fa3f9fe3
--- /dev/null
+++ b/thunderbird-l10n/zh-CN/localization/zh-CN/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = 日历 URI 重定向
+calendar-uri-redirect-description =
+    服务器正在重定向日历“{ $calendarName }”的 URI。
+    接受重定向并开始为此日历使用新的 URI?
+calendar-uri-redirect-original-uri-label = 当前 URI:
+calendar-uri-redirect-target-uri-label = 重定向到新的 URI:
diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl
index 256c2cf86581..a7472eb78f9f 100644
--- a/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/zh-CN/localization/zh-CN/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = 欢迎使用 { -brand-full-name }
+account-settings = 账户设置
+#   $accounts (Number) - the number of configured accounts
 setup-title = 选择要设置的账户
 about-title = 关于 { -brand-full-name }
 resources-title = 资源
@@ -40,3 +42,10 @@ explore-link = 探索功能
 support-link = 用户支持
 involved-link = 参与进来
 developer-link = 开发者文档
+read = 阅读消息
+compose = 编写新消息
+search = 搜索消息
+filter = 管理消息过滤器
+nntp-subscription = 管理新闻组订阅
+rss-subscription = 管理收取点订阅
+e2e = 端到端加密
diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl
index 2735de5b1f0d..225c59834828 100644
--- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = 从文件安装附加组件…
     .accesskey = I
 help-button = 附加组件帮助
+sidebar-help-button-title =
+    .title = 附加组件帮助
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } 选项
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = 用于所有附加组件的工具
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } 选项
+           *[other] { -brand-short-name } 首选项
+        }
 show-unsigned-extensions-button =
     .label = 一些扩展未通过验证
 show-all-extensions-button =
@@ -165,13 +173,29 @@ extensions-view-available-updates =
     .name = 可用更新
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = 推荐
+addon-category-discover-title =
+    .title = 推荐
 addon-category-extension = 扩展
+addon-category-extension-title =
+    .title = 扩展
 addon-category-theme = 主题
+addon-category-theme-title =
+    .title = 主题
 addon-category-plugin = 插件
+addon-category-plugin-title =
+    .title = 插件
 addon-category-dictionary = 字典
+addon-category-dictionary-title =
+    .title = 字典
 addon-category-locale = 语言
+addon-category-locale-title =
+    .title = 语言
 addon-category-available-updates = 可用更新
+addon-category-available-updates-title =
+    .title = 可用更新
 addon-category-recent-updates = 最近更新
+addon-category-recent-updates-title =
+    .title = 最近更新
 
 ## These are global warnings
 
@@ -284,6 +308,7 @@ shortcuts-no-commands = 下列扩展没有快捷键:
 shortcuts-input =
     .placeholder = 输入一个快捷键
 shortcuts-browserAction = 激活扩展
+shortcuts-browserAction2 = 激活工具栏按钮
 shortcuts-pageAction = 激活页面动作
 shortcuts-sidebarAction = 切换侧栏
 shortcuts-modifier-mac = 包括 Ctrl、Alt 或 ⌘
@@ -308,6 +333,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = 显示更少
 go-back-button =
     .tooltiptext = 返回
+header-back-button =
+    .title = 返回
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl
index 3815f24262f0..523dbb84b0b5 100644
--- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/aboutSupport.ftl
@@ -270,6 +270,11 @@ sandbox-proc-type-content = 内容
 sandbox-proc-type-file = 文件内容
 sandbox-proc-type-media-plugin = 媒体插件
 sandbox-proc-type-data-decoder = 数据解码器
+startup-cache-title = 启动缓存
+startup-cache-disk-cache-path = 磁盘缓存路径
+startup-cache-ignore-disk-cache = 忽略磁盘缓存
+startup-cache-found-disk-cache-on-init = 在初始化时发现磁盘缓存
+startup-cache-wrote-to-disk-cache = 已写入磁盘缓存
 launcher-process-status-0 = 启用
 launcher-process-status-1 = 因故障而禁用
 launcher-process-status-2 = 强制禁用
@@ -293,6 +298,7 @@ touch-enabled = 触摸输入已启用
 drag-enabled = 滚动条拖动已启用
 keyboard-enabled = 键盘已启用
 autoscroll-enabled = 自动滚动已启用
+zooming-enabled = 已启用平滑捏合缩放
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl
index 81a019ad9196..cb1519509b2d 100644
--- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM(证书)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM(证书链)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = 此扩展字段标记为“关键”,即代表若客户端不理解此字段内容,则必须拒绝该证书。
+certificate-viewer-export = 导出
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = 您的证书
+certificate-viewer-tab-people = 个人
+certificate-viewer-tab-servers = 服务器
+certificate-viewer-tab-ca = 证书机构
+certificate-viewer-tab-unkonwn = 未知
diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl
index 057edc5afae3..e32243c58e98 100644
--- a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = 已隔离网络内容
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = 套接字
diff --git a/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..604f0e6e9d00
--- /dev/null
+++ b/thunderbird-l10n/zh-CN/localization/zh-CN/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = 您启动了旧版的 { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = 创建新配置文件
+profiledowngrade-sync = 使用旧版的 { -brand-product-name } 可能造成现有 { -brand-product-name } 配置文件中保存的书签和历史记录损坏。为了保护您的信息,请为此版 { -brand-short-name } 创建新的配置文件。您可以随时登录 { -fxaccount-brand-name },在不同的配置之间同步书签与历史记录。
+profiledowngrade-nosync = 使用旧版的 { -brand-product-name } 可能造成现有 { -brand-product-name } 配置文件中保存的书签和历史记录损坏。为了保护您的信息,请为此版 { -brand-short-name } 创建新的配置文件。
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] 退出
+           *[other] 退出
+        }
diff --git a/thunderbird-l10n/zh-CN/manifest.json b/thunderbird-l10n/zh-CN/manifest.json
index e7b94fb946ea..c05b6c3ab4da 100644
--- a/thunderbird-l10n/zh-CN/manifest.json
+++ b/thunderbird-l10n/zh-CN/manifest.json
@@ -1,57 +1,57 @@
 {
+  "name": "Chinese Simplified (zh-CN) Language Pack",
+  "description": "Language pack for Thunderbird for zh-CN",
+  "sources": {
+    "browser": {
+      "base_path": "browser/"
+    }
+  },
   "languages": {
     "zh-CN": {
       "chrome_resources": {
+        "lightning": "chrome/zh-CN/locale/zh-CN/lightning/",
+        "messenger": "chrome/zh-CN/locale/zh-CN/messenger/",
+        "passwordmgr": "chrome/zh-CN/locale/zh-CN/passwordmgr/",
         "autoconfig": "chrome/zh-CN/locale/zh-CN/autoconfig/",
-        "chat": "chrome/zh-CN/locale/zh-CN/chat/",
-        "global": "chrome/zh-CN/locale/zh-CN/global/",
-        "messenger-region": "chrome/zh-CN/locale/zh-CN/messenger-region/",
-        "devtools-shared": "chrome/zh-CN/locale/zh-CN/devtools/shared/",
-        "messenger-newsblog": "chrome/zh-CN/locale/zh-CN/messenger-newsblog/",
-        "mozapps": "chrome/zh-CN/locale/zh-CN/mozapps/",
         "places": "chrome/zh-CN/locale/zh-CN/places/",
-        "necko": "chrome/zh-CN/locale/zh-CN/necko/",
-        "pippki": "chrome/zh-CN/locale/zh-CN/pippki/",
-        "lightning": "chrome/zh-CN/locale/zh-CN/lightning/",
         "messenger-smime": "chrome/zh-CN/locale/zh-CN/messenger-smime/",
-        "devtools-startup": "chrome/zh-CN/locale/zh-CN/devtools/startup/",
-        "pipnss": "chrome/zh-CN/locale/zh-CN/pipnss/",
-        "messenger": "chrome/zh-CN/locale/zh-CN/messenger/",
         "branding": "chrome/zh-CN/locale/zh-CN/branding/",
+        "pippki": "chrome/zh-CN/locale/zh-CN/pippki/",
+        "necko": "chrome/zh-CN/locale/zh-CN/necko/",
         "calendar": "chrome/zh-CN/locale/zh-CN/calendar/",
-        "mozldap": "chrome/zh-CN/locale/zh-CN/mozldap/",
+        "devtools": "chrome/zh-CN/locale/zh-CN/devtools/client/",
+        "alerts": "chrome/zh-CN/locale/zh-CN/alerts/",
+        "chat": "chrome/zh-CN/locale/zh-CN/chat/",
+        "mozapps": "chrome/zh-CN/locale/zh-CN/mozapps/",
         "pluginproblem": "chrome/zh-CN/locale/zh-CN/pluginproblem/",
+        "global": "chrome/zh-CN/locale/zh-CN/global/",
+        "mozldap": "chrome/zh-CN/locale/zh-CN/mozldap/",
+        "devtools-shared": "chrome/zh-CN/locale/zh-CN/devtools/shared/",
+        "messenger-newsblog": "chrome/zh-CN/locale/zh-CN/messenger-newsblog/",
         "messenger-mapi": "chrome/zh-CN/locale/zh-CN/messenger-mapi/",
-        "alerts": "chrome/zh-CN/locale/zh-CN/alerts/",
+        "pipnss": "chrome/zh-CN/locale/zh-CN/pipnss/",
         "global-platform": {
+          "linux": "chrome/zh-CN/locale/zh-CN/global-platform/unix/",
           "android": "chrome/zh-CN/locale/zh-CN/global-platform/unix/",
           "macosx": "chrome/zh-CN/locale/zh-CN/global-platform/mac/",
-          "win": "chrome/zh-CN/locale/zh-CN/global-platform/win/",
-          "linux": "chrome/zh-CN/locale/zh-CN/global-platform/unix/"
+          "win": "chrome/zh-CN/locale/zh-CN/global-platform/win/"
         },
-        "communicator": "chrome/zh-CN/locale/zh-CN/communicator/",
-        "passwordmgr": "chrome/zh-CN/locale/zh-CN/passwordmgr/",
-        "devtools": "chrome/zh-CN/locale/zh-CN/devtools/client/"
+        "devtools-startup": "chrome/zh-CN/locale/zh-CN/devtools/startup/",
+        "messenger-region": "chrome/zh-CN/locale/zh-CN/messenger-region/",
+        "communicator": "chrome/zh-CN/locale/zh-CN/communicator/"
       },
-      "version": "20200403111304"
+      "version": "20200418022603"
     }
   },
-  "name": "Chinese Simplified (zh-CN) Language Pack",
-  "sources": {
-    "browser": {
-      "base_path": "browser/"
-    }
-  },
-  "manifest_version": 2,
-  "description": "Language pack for Thunderbird for zh-CN",
   "langpack_id": "zh-CN",
   "author": "mozilla.org (contributors: Wen Shaohua)",
+  "manifest_version": 2,
+  "version": "76.0buildid20200420212409",
   "applications": {
     "gecko": {
-      "strict_min_version": "76.0",
+      "strict_max_version": "76.*",
       "id": "langpack-zh-CN@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
+      "strict_min_version": "76.0"
     }
-  },
-  "version": "76.0buildid20200407173003"
+  }
 }
diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties
index 261cd23e7255..a21b38348819 100644
--- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties
+++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/devtools/client/inspector.properties
@@ -548,6 +548,10 @@ markupView.scrollableBadge.tooltip=此元素有可滾動的溢出內容。
 # the RulePreviewTooltip when a rule cannot be found for a CSS property declaration.
 rulePreviewTooltip.noAssociatedRule=沒有相關規則
 
+# LOCALIZATION NOTE (rulePreviewTooltip.jumpToRule): This is the text displayed inside
+# the RulePreviewTooltip footer, describing the keyboard shortcut to jump to a rule.
+rulePreviewTooltip.jumpToRuleShortcut=按住 Shift 然後點擊,即可跳到規則
+
 # LOCALIZATION NOTE (colorPickerTooltip.contrastAgainstBgTitle): A title text for the
 # contrast ratio value description that labels the background the color contrast ratio is calculated
 # against, used together with the actual background color. %S in the content will be replaced by a
diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties
index 38b8e3d6815d..c2df0241a250 100644
--- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties
+++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/css.properties
@@ -180,5 +180,7 @@ PEMoreThanOneGridRepeatAutoFillInNameList=subgrid 的名稱清單中僅允許一
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=track 清單中僅允許一個 repeat(auto-fill, …) 或 repeat(auto-fit, …)。
 PEMoreThanOneGridRepeatTrackSize=repeat(auto-fit/auto-fill, …) 中僅允許一個 track 大小。
 
+PEDisallowedImportRule=@import 規則在建構的樣式表中尚未生效。
+
 TooLargeDashedRadius=「dashed」樣式的邊框半徑太大(限制為 100000px),以 solid 描繪。
 TooLargeDottedRadius=「dotted」樣式的邊框半徑太大(限制為 100000px),以 solid 描繪。
diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties
index e5ecb45d988a..2c0681d910f9 100644
--- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties
+++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/global/security/security.properties
@@ -147,6 +147,12 @@ XFODeny = 因「%2$S」網站的 X-Frame-Options 設定為「%1$S」,不允許
 # LOCALIZATION NOTE: %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI.
 XFOSameOrigin = 因「%2$S」網站的 X-Frame-Options 設定為「%1$S」,不允許跨來源載入於「%3$S」。
 
+# X-Frame-Options
+# LOCALIZATION NOTE(XFrameOptionsInvalid): %1$S is the header value, %2$S is frame URI. Do not translate "X-Frame-Options".
+XFrameOptionsInvalid = 載入「%2$S」時發現無效的 X-Frame-Options 檔頭:「%1$S」指示無效。
+# LOCALIZATION NOTE(XFrameOptionsDeny): %1$S is the header value, %2$S is frame URI and %3$S is the parent document URI. Do not translate "X-Frame-Options".
+XFrameOptionsDeny=由於「X-Frame-Options」指示設定為「%1$S」,已拒絕在畫框中載入「%2$S」。
+
 # HTTPS-Only Mode
 # LOCALIZATION NOTE: %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
 HTTPSOnlyUpgradeRequest = 已將不安全的請求「%1$S」升級為「%2$S」。
diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd
index 97c5dda78319..9b99ea111f55 100644
--- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd
+++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/messenger.dtd
@@ -289,6 +289,8 @@
 <!ENTITY searchMailCmd.label "搜尋訊息…">
 <!ENTITY searchMailCmd.accesskey "M">
 <!ENTITY searchMailCmd.key "f">
+<!ENTITY glodaSearchCmd.label "全域搜尋…">
+<!ENTITY glodaSearchCmd.accesskey "G">
 <!ENTITY searchAddressesCmd.label "搜尋地址…">
 <!ENTITY searchAddressesCmd.accesskey "S">
 
diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties
index 3b8d70d443b7..51cddceabd8a 100644
--- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties
+++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/messenger/pgpmime.properties
@@ -10,4 +10,5 @@
 # %S is the url to Enigmail on AMO supplied from preferences.
 pgpMimeNeedsAddon=這是加密過的 OpenPGP 訊息。<br>您必須安裝 <a href="%S">OpenPGP 附加元件</a> 才能解密此郵件。
 
-
+# LOCALIZATION NOTE(pgpMimeNeedsAddon): The text can contain HTML tags.
+pgpNotAvailable=這是一封加密過的 OpenPGP 訊息,但目前不支援 OpenPGP 解密。
diff --git a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties
index d2c020163338..629fa879e3ab 100644
--- a/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties
+++ b/thunderbird-l10n/zh-TW/chrome/zh-TW/locale/zh-TW/necko/necko.properties
@@ -57,6 +57,9 @@ CookieAllowedForOriginOnTrackerByHeuristic=已自動允許位於「%1$S」的追
 # LOCALIZATION NOTE (CookieAllowedForTrackerByHeuristic): %2$S and %1$S are URLs.
 CookieAllowedForTrackerByHeuristic=已自動允許位於「%1$S」的追蹤器「%2$S」存取儲存空間。
 
+# LOCALIZATION NOTE (CookieAllowedForFpiByHeuristic): %2$S and %1$S are URLs.
+CookieAllowedForFpiByHeuristic=已自動針對位於「%1$S」上第一方隔離的「%2$S」允許存取儲存空間。
+
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecure): %1$S is the cookie name. Do not localize "sameSite=none" and "secure".
 CookieRejectedNonRequiresSecure=因為設定了「sameSite=none」屬性,但缺少「secure」屬性,已拒絕 Cookie「%1$S」
 # LOCALIZATION NOTE(CookieRejectedNonRequiresSecureForBeta): %1$S is the cookie name. %2$S is a URL. Do not localize "sameSite", "sameSite=none" and "secure".
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/calendar/calendar-uri-redirect-dialog.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/calendar/calendar-uri-redirect-dialog.ftl
new file mode 100644
index 000000000000..72ec69e2c038
--- /dev/null
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/calendar/calendar-uri-redirect-dialog.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+calendar-uri-redirect-window =
+    .title = Calendar URI 重新導向
+calendar-uri-redirect-description =
+    此伺服器重新導向了行事曆「{ $calendarName }」的 URI。
+    要接受更改為使用新的 URI 嗎?
+calendar-uri-redirect-original-uri-label = 目前 URI:
+calendar-uri-redirect-target-uri-label = 重新導向到新的 URI:
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl
index f8e94796adb6..030e24b69c78 100644
--- a/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/messenger/accountCentral.ftl
@@ -3,6 +3,8 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 account-central-title = 歡迎使用 { -brand-full-name }
+account-settings = 帳號設定
+#   $accounts (Number) - the number of configured accounts
 setup-title = 選擇要設定哪些帳號
 about-title = 關於 { -brand-full-name }
 resources-title = 資源
@@ -40,3 +42,10 @@ explore-link = 探索功能
 support-link = 技術支援
 involved-link = 參與我們
 developer-link = 技術文件
+read = 讀取郵件
+compose = 發新郵件
+search = 搜尋訊息
+filter = 管理篩選條件
+nntp-subscription = 管理新聞群組訂閱狀況
+rss-subscription = 管理資訊來源訂閱項目
+e2e = 端到端加密
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl
index e9ad019cea65..88d6fed53f23 100644
--- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutAddons.ftl
@@ -26,6 +26,8 @@ install-addon-from-file =
     .label = 從檔案安裝附加元件…
     .accesskey = I
 help-button = 附加元件支援
+sidebar-help-button-title =
+    .title = 附加元件支援
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } 選項
@@ -33,6 +35,12 @@ preferences =
     }
 tools-menu =
     .tooltiptext = 所有附加元件的工具
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } 選項
+           *[other] { -brand-short-name } 偏好設定
+        }
 show-unsigned-extensions-button =
     .label = 無法驗證某些擴充套件
 show-all-extensions-button =
@@ -167,13 +175,29 @@ extensions-view-available-updates =
     .name = 可用的更新
     .tooltiptext = { extensions-view-available-updates.name }
 addon-category-discover = 推薦項目
+addon-category-discover-title =
+    .title = 推薦項目
 addon-category-extension = 擴充套件
+addon-category-extension-title =
+    .title = 擴充套件
 addon-category-theme = 佈景主題
+addon-category-theme-title =
+    .title = 佈景主題
 addon-category-plugin = 外掛程式
+addon-category-plugin-title =
+    .title = 外掛程式
 addon-category-dictionary = 字典
+addon-category-dictionary-title =
+    .title = 字典
 addon-category-locale = 語言套件
+addon-category-locale-title =
+    .title = 語言套件
 addon-category-available-updates = 可用的更新
+addon-category-available-updates-title =
+    .title = 可用的更新
 addon-category-recent-updates = 最近的更新
+addon-category-recent-updates-title =
+    .title = 最近的更新
 
 ## These are global warnings
 
@@ -286,6 +310,7 @@ shortcuts-no-commands = 下列擴充套件沒有快速鍵:
 shortcuts-input =
     .placeholder = 輸入快速鍵
 shortcuts-browserAction = 啟用快速鍵
+shortcuts-browserAction2 = 開啟工具列按鈕
 shortcuts-pageAction = 啟用頁面操作
 shortcuts-sidebarAction = 切換側邊欄
 shortcuts-modifier-mac = 包含 Ctrl、Alt 或 ⌘
@@ -310,6 +335,8 @@ shortcuts-card-expand-button =
 shortcuts-card-collapse-button = 顯示更少
 go-back-button =
     .tooltiptext = 回上一頁
+header-back-button =
+    .title = 回上一頁
 
 ## Recommended add-ons page
 
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl
index b2acb0513ab8..7bb4945bb302 100644
--- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutSupport.ftl
@@ -270,6 +270,11 @@ sandbox-proc-type-content = 內容
 sandbox-proc-type-file = 檔案內容
 sandbox-proc-type-media-plugin = 媒體外掛程式
 sandbox-proc-type-data-decoder = 資料解碼器
+startup-cache-title = 啟動快取
+startup-cache-disk-cache-path = 磁碟快取路徑
+startup-cache-ignore-disk-cache = 忽略磁碟快取
+startup-cache-found-disk-cache-on-init = 在初始化時找到磁碟快取
+startup-cache-wrote-to-disk-cache = 已寫入磁碟快取
 launcher-process-status-0 = 啟用
 launcher-process-status-1 = 由於失敗而停用
 launcher-process-status-2 = 強制停用
@@ -293,6 +298,7 @@ touch-enabled = 已啟用觸控輸入
 drag-enabled = 已開啟捲動列拖曳
 keyboard-enabled = 已啟用鍵盤
 autoscroll-enabled = 已開啟自動捲動
+zooming-enabled = 已開啟平滑手指縮放
 
 ## Variables
 ## $preferenceKey (string) - String ID of preference
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl
index 21e33aded4ac..236ac2ea351b 100644
--- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/aboutTelemetry.ftl
@@ -30,7 +30,7 @@ about-telemetry-session-info-section = 使用階段資訊
 about-telemetry-scalar-section = Scalars
 about-telemetry-keyed-scalar-section = Keyed Scalars
 about-telemetry-histograms-section = 柱狀圖
-about-telemetry-keyed-histogram-section = Keyed Histograms
+about-telemetry-keyed-histogram-section = 分類柱狀圖
 about-telemetry-events-section = 事件
 about-telemetry-simple-measurements-section = 簡易測量
 about-telemetry-slow-sql-section = 慢速的 SQL 陳述句
@@ -39,7 +39,7 @@ about-telemetry-captured-stacks-section = 捕捉到的堆疊
 about-telemetry-late-writes-section = 慢速寫入
 about-telemetry-raw-payload-section = 原始酬載
 about-telemetry-raw = 原始 JSON
-about-telemetry-full-sql-warning = 注意: 已啟用慢速 SQL 除錯。完整的 SQL 字串將會在下面顯示,但將不會被送出給 Telemetry。
+about-telemetry-full-sql-warning = 註: 已開啟慢速 SQL 除錯。將在下面顯示完整 SQL 字串,但不會送出到 Telemetry。
 about-telemetry-fetch-stack-symbols = 取得堆疊的函數名稱
 about-telemetry-hide-stack-symbols = 顯示原始堆疊資料
 # Selects the correct release version
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl
index 69a76ed3de97..ba272231f710 100644
--- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/about/certviewer.ftl
@@ -97,3 +97,16 @@ certificate-viewer-download-pem = PEM(憑證)
     .download = { $fileName }.pem
 certificate-viewer-download-pem-chain = PEM(金鑰鏈)
     .download = { $fileName }-chain.pem
+# The title attribute for Critical Extension icon
+certificate-viewer-critical-extension =
+    .title = 此擴充欄位標示為重要,代表客戶端若無法理解此欄位內容就必須拒絕接受憑證。
+certificate-viewer-export = 匯出
+    .download = { $fileName }.pem
+
+## Labels for tabs displayed in stand-alone about:certificate page
+
+certificate-viewer-tab-mine = 您的憑證
+certificate-viewer-tab-people = 人員
+certificate-viewer-tab-servers = 伺服器
+certificate-viewer-tab-ca = 憑證機構
+certificate-viewer-tab-unkonwn = 未知
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl
index 340e6b390d5b..623b416cb492 100644
--- a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/processTypes.ftl
@@ -24,3 +24,5 @@ process-type-webisolated = 隔離的網頁內容
 # process used to communicate with the GPU for
 # graphics acceleration
 process-type-gpu = GPU
+# process used to perform network operations
+process-type-socket = Socket
diff --git a/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/profileDowngrade.ftl b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/profileDowngrade.ftl
new file mode 100644
index 000000000000..6384a68ebe45
--- /dev/null
+++ b/thunderbird-l10n/zh-TW/localization/zh-TW/toolkit/global/profileDowngrade.ftl
@@ -0,0 +1,17 @@
+# 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/.
+
+profiledowngrade-window =
+    .title = 您啟動了舊版的 { -brand-product-name }
+    .style = width: 490px;
+profiledowngrade-window-create =
+    .label = 建立新設定檔
+profiledowngrade-sync = 使用舊版的 { -brand-product-name } 可能會造成現有 { -brand-product-name } 設定檔當中的書籤、上網紀錄毀損。為了保護您的資訊,請為這份 { -brand-short-name } 建立新的設定檔。您可隨時登入 { -fxaccount-brand-name },在不同的設定檔之間同步書籤與上網紀錄。
+profiledowngrade-nosync = 使用舊版的 { -brand-product-name } 可能會造成現有 { -brand-product-name } 設定檔當中的書籤、上網紀錄毀損。為了保護您的資訊,請為這份 { -brand-short-name } 建立新的設定檔。
+profiledowngrade-quit =
+    .label =
+        { PLATFORM() ->
+            [windows] 結束
+           *[other] 離開
+        }
diff --git a/thunderbird-l10n/zh-TW/manifest.json b/thunderbird-l10n/zh-TW/manifest.json
index c7d131d69f6e..3bb6b2b8fa2e 100644
--- a/thunderbird-l10n/zh-TW/manifest.json
+++ b/thunderbird-l10n/zh-TW/manifest.json
@@ -1,4 +1,12 @@
 {
+  "author": "Mozilla Taiwan Community (MozTW) (contributors: Hung-Te Lin(piaip), Wei-Lun Sun(josesun), Wei-Chen Lai(abev66), Tim Guan-Tin Chien(timdream), Peter Pin-Guang Chen(petercpg))",
+  "applications": {
+    "gecko": {
+      "strict_max_version": "76.*",
+      "id": "langpack-zh-TW@thunderbird.mozilla.org",
+      "strict_min_version": "76.0"
+    }
+  },
   "sources": {
     "browser": {
       "base_path": "browser/"
@@ -8,50 +16,42 @@
     "zh-TW": {
       "chrome_resources": {
         "messenger-smime": "chrome/zh-TW/locale/zh-TW/messenger-smime/",
-        "pluginproblem": "chrome/zh-TW/locale/zh-TW/pluginproblem/",
-        "passwordmgr": "chrome/zh-TW/locale/zh-TW/passwordmgr/",
-        "mozldap": "chrome/zh-TW/locale/zh-TW/mozldap/",
+        "messenger-mapi": "chrome/zh-TW/locale/zh-TW/messenger-mapi/",
+        "pippki": "chrome/zh-TW/locale/zh-TW/pippki/",
         "places": "chrome/zh-TW/locale/zh-TW/places/",
-        "chat": "chrome/zh-TW/locale/zh-TW/chat/",
-        "devtools-startup": "chrome/zh-TW/locale/zh-TW/devtools/startup/",
+        "messenger": "chrome/zh-TW/locale/zh-TW/messenger/",
+        "branding": "chrome/zh-TW/locale/zh-TW/branding/",
         "alerts": "chrome/zh-TW/locale/zh-TW/alerts/",
-        "global": "chrome/zh-TW/locale/zh-TW/global/",
-        "pipnss": "chrome/zh-TW/locale/zh-TW/pipnss/",
-        "lightning": "chrome/zh-TW/locale/zh-TW/lightning/",
+        "passwordmgr": "chrome/zh-TW/locale/zh-TW/passwordmgr/",
+        "chat": "chrome/zh-TW/locale/zh-TW/chat/",
+        "autoconfig": "chrome/zh-TW/locale/zh-TW/autoconfig/",
         "messenger-newsblog": "chrome/zh-TW/locale/zh-TW/messenger-newsblog/",
-        "communicator": "chrome/zh-TW/locale/zh-TW/communicator/",
-        "calendar": "chrome/zh-TW/locale/zh-TW/calendar/",
-        "devtools": "chrome/zh-TW/locale/zh-TW/devtools/client/",
-        "messenger-mapi": "chrome/zh-TW/locale/zh-TW/messenger-mapi/",
-        "messenger": "chrome/zh-TW/locale/zh-TW/messenger/",
+        "pluginproblem": "chrome/zh-TW/locale/zh-TW/pluginproblem/",
         "mozapps": "chrome/zh-TW/locale/zh-TW/mozapps/",
+        "devtools": "chrome/zh-TW/locale/zh-TW/devtools/client/",
+        "pipnss": "chrome/zh-TW/locale/zh-TW/pipnss/",
+        "necko": "chrome/zh-TW/locale/zh-TW/necko/",
+        "communicator": "chrome/zh-TW/locale/zh-TW/communicator/",
+        "devtools-shared": "chrome/zh-TW/locale/zh-TW/devtools/shared/",
+        "global": "chrome/zh-TW/locale/zh-TW/global/",
+        "lightning": "chrome/zh-TW/locale/zh-TW/lightning/",
+        "mozldap": "chrome/zh-TW/locale/zh-TW/mozldap/",
         "global-platform": {
+          "macosx": "chrome/zh-TW/locale/zh-TW/global-platform/mac/",
           "linux": "chrome/zh-TW/locale/zh-TW/global-platform/unix/",
           "android": "chrome/zh-TW/locale/zh-TW/global-platform/unix/",
-          "macosx": "chrome/zh-TW/locale/zh-TW/global-platform/mac/",
           "win": "chrome/zh-TW/locale/zh-TW/global-platform/win/"
         },
-        "devtools-shared": "chrome/zh-TW/locale/zh-TW/devtools/shared/",
-        "autoconfig": "chrome/zh-TW/locale/zh-TW/autoconfig/",
-        "necko": "chrome/zh-TW/locale/zh-TW/necko/",
-        "pippki": "chrome/zh-TW/locale/zh-TW/pippki/",
-        "branding": "chrome/zh-TW/locale/zh-TW/branding/",
+        "devtools-startup": "chrome/zh-TW/locale/zh-TW/devtools/startup/",
+        "calendar": "chrome/zh-TW/locale/zh-TW/calendar/",
         "messenger-region": "chrome/zh-TW/locale/zh-TW/messenger-region/"
       },
-      "version": "20200403125542"
+      "version": "20200415073517"
     }
   },
-  "version": "76.0buildid20200407173003",
-  "name": "Traditional Chinese (zh-TW) Language Pack",
   "description": "Language pack for Thunderbird for zh-TW",
-  "applications": {
-    "gecko": {
-      "strict_min_version": "76.0",
-      "id": "langpack-zh-TW@thunderbird.mozilla.org",
-      "strict_max_version": "76.*"
-    }
-  },
   "langpack_id": "zh-TW",
-  "author": "Mozilla Taiwan Community (MozTW) (contributors: Hung-Te Lin(piaip), Wei-Lun Sun(josesun), Wei-Chen Lai(abev66), Tim Guan-Tin Chien(timdream), Peter Pin-Guang Chen(petercpg))",
-  "manifest_version": 2
+  "name": "Traditional Chinese (zh-TW) Language Pack",
+  "manifest_version": 2,
+  "version": "76.0buildid20200420212409"
 }
diff --git a/toolkit/components/extensions/ExtensionChild.jsm b/toolkit/components/extensions/ExtensionChild.jsm
index 7c5e2224e2c0..6513069ef86e 100644
--- a/toolkit/components/extensions/ExtensionChild.jsm
+++ b/toolkit/components/extensions/ExtensionChild.jsm
@@ -286,9 +286,11 @@ class NativeMessenger {
 
   recvPortConnect({ portId, name, sender }) {
     let ex = sender.id === this.context.extension.id;
-    let port = new Port(this.context, portId, name, false, sender);
     let event = ex ? this.onConnect : this.onConnectEx;
-    return event.emit(port.api).length;
+    if (this.context.active && event.fires.size) {
+      let port = new Port(this.context, portId, name, false, sender);
+      return event.emit(port.api).length;
+    }
   }
 }
 
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_runtime_ports.js b/toolkit/components/extensions/test/xpcshell/test_ext_runtime_ports.js
new file mode 100644
index 000000000000..7365a13f93ce
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_runtime_ports.js
@@ -0,0 +1,69 @@
+"use strict";
+
+add_task(async function test_port_disconnected_from_wrong_window() {
+  let extensionData = {
+    background() {
+      let num = 0;
+      let ports = {};
+      let done = false;
+
+      browser.runtime.onConnect.addListener(port => {
+        num++;
+        ports[num] = port;
+
+        port.onMessage.addListener(msg => {
+          browser.test.assertEq(msg, "port-2-response", "Got port 2 response");
+          browser.test.sendMessage(msg + "-received");
+          done = true;
+        });
+
+        port.onDisconnect.addListener(err => {
+          if (port === ports[1]) {
+            browser.test.log("Port 1 disconnected, sending message via port 2");
+            ports[2].postMessage("port-2-msg");
+          } else {
+            browser.test.assertTrue(
+              done,
+              "Port 2 disconnected only after a full roundtrip received"
+            );
+          }
+        });
+
+        browser.test.sendMessage("port-connect-" + num);
+      });
+    },
+    files: {
+      "page.html": `
+        <!DOCTYPE html><meta charset="utf8">
+        <script src="script.js"></script>
+      `,
+      "script.js"() {
+        let port = browser.runtime.connect();
+        port.onMessage.addListener(msg => {
+          browser.test.assertEq(msg, "port-2-msg", "Got message via port 2");
+          port.postMessage("port-2-response");
+        });
+      },
+    },
+  };
+
+  let extension = ExtensionTestUtils.loadExtension(extensionData);
+  let url = `moz-extension://${extension.uuid}/page.html`;
+  await extension.startup();
+
+  let page1 = await ExtensionTestUtils.loadContentPage(url, { extension });
+  await extension.awaitMessage("port-connect-1");
+  info("First page opened port 1");
+
+  let page2 = await ExtensionTestUtils.loadContentPage(url, { extension });
+  await extension.awaitMessage("port-connect-2");
+  info("Second page opened port 2");
+
+  info("Closing the first page should not close port 2");
+  await page1.close();
+  await extension.awaitMessage("port-2-response-received");
+  info("Roundtrip message through port 2 received");
+
+  await page2.close();
+  await extension.unload();
+});
diff --git a/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini b/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
index a9cfc1df9cee..43ed44a21b9f 100644
--- a/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
+++ b/toolkit/components/extensions/test/xpcshell/xpcshell-common.ini
@@ -120,6 +120,7 @@ skip-if = os == "android" && debug
 [test_ext_runtime_id.js]
 skip-if = ccov && os == 'linux' # bug 1607581
 [test_ext_runtime_onInstalled_and_onStartup.js]
+[test_ext_runtime_ports.js]
 [test_ext_runtime_sendMessage.js]
 [test_ext_runtime_sendMessage_errors.js]
 [test_ext_runtime_sendMessage_no_receiver.js]
diff --git a/toolkit/components/passwordmgr/LoginHelper.jsm b/toolkit/components/passwordmgr/LoginHelper.jsm
index 4897dc742db8..75abce8aeaa5 100644
--- a/toolkit/components/passwordmgr/LoginHelper.jsm
+++ b/toolkit/components/passwordmgr/LoginHelper.jsm
@@ -38,6 +38,8 @@ this.LoginHelper = {
   privateBrowsingCaptureEnabled: null,
   schemeUpgrades: null,
   showAutoCompleteFooter: null,
+  testOnlyUserHasInteractedWithDocument: null,
+  userInputRequiredToCapture: null,
 
   init() {
     // Watch for pref changes to update cached pref values.
@@ -80,6 +82,9 @@ this.LoginHelper = {
       "signon.management.overrideURI",
       null
     );
+    this.passwordEditCaptureEnabled = Services.prefs.getBoolPref(
+      "signon.passwordEditCapture.enabled"
+    );
     this.privateBrowsingCaptureEnabled = Services.prefs.getBoolPref(
       "signon.privateBrowsingCapture.enabled"
     );
@@ -90,12 +95,28 @@ this.LoginHelper = {
     this.storeWhenAutocompleteOff = Services.prefs.getBoolPref(
       "signon.storeWhenAutocompleteOff"
     );
+
+    if (
+      Services.prefs.getBoolPref(
+        "signon.testOnlyUserHasInteractedByPrefValue",
+        false
+      )
+    ) {
+      this.testOnlyUserHasInteractedWithDocument = Services.prefs.getBoolPref(
+        "signon.testOnlyUserHasInteractedWithDocument",
+        false
+      );
+      log.debug(
+        "updateSignonPrefs, using pref value for testOnlyUserHasInteractedWithDocument",
+        this.testOnlyUserHasInteractedWithDocument
+      );
+    } else {
+      this.testOnlyUserHasInteractedWithDocument = null;
+    }
+
     this.userInputRequiredToCapture = Services.prefs.getBoolPref(
       "signon.userInputRequiredToCapture.enabled"
     );
-    this.passwordEditCaptureEnabled = Services.prefs.getBoolPref(
-      "signon.passwordEditCapture.enabled"
-    );
   },
 
   createLogger(aLogPrefix) {
@@ -1183,8 +1204,6 @@ this.LoginHelper = {
   },
 };
 
-LoginHelper.init();
-
 XPCOMUtils.defineLazyPreferenceGetter(
   LoginHelper,
   "showInsecureFieldWarning",
@@ -1192,5 +1211,11 @@ XPCOMUtils.defineLazyPreferenceGetter(
 );
 
 XPCOMUtils.defineLazyGetter(this, "log", () => {
-  return LoginHelper.createLogger("LoginHelper");
+  let processName =
+    Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_DEFAULT
+      ? "Main"
+      : "Content";
+  return LoginHelper.createLogger(`LoginHelper(${processName})`);
 });
+
+LoginHelper.init();
diff --git a/toolkit/components/passwordmgr/LoginManagerChild.jsm b/toolkit/components/passwordmgr/LoginManagerChild.jsm
index 34eb134fec2a..864bf07a77c2 100644
--- a/toolkit/components/passwordmgr/LoginManagerChild.jsm
+++ b/toolkit/components/passwordmgr/LoginManagerChild.jsm
@@ -1564,6 +1564,19 @@ this.LoginManagerChild = class LoginManagerChild extends JSWindowActorChild {
       dismissedPrompt = true;
     }
 
+    let docState = this.stateForDocument(doc);
+    let fieldsModified = this._formHasModifiedFields(form);
+    if (!fieldsModified && LoginHelper.userInputRequiredToCapture) {
+      if (targetField) {
+        throw new Error("No user input on targetField");
+      }
+      // we know no fields in this form had user modifications, so don't prompt
+      log(
+        `(${logMessagePrefix} ignored -- submitting values that are not changed by the user)`
+      );
+      return;
+    }
+
     if (
       this._compareAndUpdatePreviouslySentValues(
         form.rootElement,
@@ -1578,19 +1591,6 @@ this.LoginManagerChild = class LoginManagerChild extends JSWindowActorChild {
       return;
     }
 
-    let docState = this.stateForDocument(doc);
-    let fieldsModified = this._formHasModifiedFields(form);
-    if (!fieldsModified && LoginHelper.userInputRequiredToCapture) {
-      if (targetField) {
-        throw new Error("No user input on targetField");
-      }
-      // we know no fields in this form had user modifications, so don't prompt
-      log(
-        `(${logMessagePrefix} ignored -- submitting values that are not changed by the user)`
-      );
-      return;
-    }
-
     let { login: autoFilledLogin } =
       docState.fillsByRootElement.get(form.rootElement) || {};
     let browsingContextId = win.windowGlobalChild.browsingContext.id;
@@ -2181,7 +2181,23 @@ this.LoginManagerChild = class LoginManagerChild extends JSWindowActorChild {
   }
 
   _formHasModifiedFields(form) {
-    let state = this.stateForDocument(form.rootElement.ownerDocument);
+    let doc = form.rootElement.ownerDocument;
+    let userHasInteracted;
+    let testOnlyUserHasInteracted =
+      LoginHelper.testOnlyUserHasInteractedWithDocument;
+    if (Cu.isInAutomation && testOnlyUserHasInteracted !== null) {
+      userHasInteracted = testOnlyUserHasInteracted;
+    } else {
+      userHasInteracted = doc.userHasInteracted;
+    }
+
+    log("_formHasModifiedFields, userHasInteracted:", userHasInteracted);
+
+    // If the user hasn't interacted at all with the page, we don't need to check futher
+    if (!userHasInteracted) {
+      return false;
+    }
+    let state = this.stateForDocument(doc);
     // check for user inputs to the form fields
     let fieldsModified = state.fieldModificationsByRootElement.get(
       form.rootElement
diff --git a/toolkit/components/passwordmgr/LoginManagerPrompter.jsm b/toolkit/components/passwordmgr/LoginManagerPrompter.jsm
index 8c25ebabf1dd..a641b0281f9e 100644
--- a/toolkit/components/passwordmgr/LoginManagerPrompter.jsm
+++ b/toolkit/components/passwordmgr/LoginManagerPrompter.jsm
@@ -383,6 +383,10 @@ class LoginManagerPrompter {
         histogram.add(PROMPT_ADD_OR_UPDATE);
         if (histogramName == "PWMGR_PROMPT_REMEMBER_ACTION") {
           Services.obs.notifyObservers(browser, "LoginStats:NewSavedPassword");
+        } else if (histogramName == "PWMGR_PROMPT_UPDATE_ACTION") {
+          Services.obs.notifyObservers(browser, "LoginStats:LoginUpdateSaved");
+        } else {
+          throw new Error("Unknown histogram");
         }
         readDataFromUI();
         persistData();
diff --git a/toolkit/components/passwordmgr/NewPasswordModel.jsm b/toolkit/components/passwordmgr/NewPasswordModel.jsm
index 0d71e0152e67..26a3bb8674a0 100644
--- a/toolkit/components/passwordmgr/NewPasswordModel.jsm
+++ b/toolkit/components/passwordmgr/NewPasswordModel.jsm
@@ -23,7 +23,7 @@ const {
   ruleset,
   score,
   type,
-  utils: { identity, isVisible, min },
+  utils: { identity, isVisible, min, setDefault },
   clusters: { euclidean },
 } = fathom;
 
@@ -31,7 +31,7 @@ const {
  * ----- Start of model -----
  *
  * Everything below this comment up to the "End of model" comment is copied from:
- * https://github.com/mozilla-services/fathom-login-forms/blob/4a2349963df5d3c428847565f44d3d4ec65ae38b/new-password/rulesets.js#L6-L271
+ * https://github.com/mozilla-services/fathom-login-forms/blob/96d83b26e06587e28baecf404c1058132d5e5ec7/new-password/rulesets.js#L14-L498
  * Deviations from that file:
  *   - Remove import statements, instead using ``ChromeUtils.defineModuleGetter`` and destructuring assignments above.
  *   - Set ``DEVELOPMENT`` constant to ``false``.
@@ -109,8 +109,21 @@ const registerFormAttrRegex = /signup|join|register|regform|registration|new_use
 const rememberMeAttrRegex = /remember|auto_login|auto-login|save_mail|save-mail|ricordami|manter|mantenha|savelogin|auto login/i;
 const rememberMeStringRegex = /remember me|keep me logged in|keep me signed in|save email address|save id|stay signed in|ricordami|次回からログオンIDの入力を省略する|メールアドレスを保存する|を保存|아이디저장|아이디 저장|로그인 상태 유지|lembrar|manter conectado|mantenha-me conectado|Запомни меня|запомнить меня|Запомните меня|Не спрашивать в следующий раз|下次自动登录|记住我/i;
 const newsletterStringRegex = /newsletter|ニュースレター/i;
+const passwordStringAndAttrRegex = new RegExp(
+  passwordStringRegex.source + "|" + passwordAttrRegex.source,
+  "i"
+);
 
 function makeRuleset(coeffs, biases) {
+  // HTMLElement => (selector => Array<HTMLElement>) nested map to cache querySelectorAll calls.
+  let elementToSelectors;
+  // We want to clear the cache each time the model is executed to get the latest DOM snapshot
+  // for each classification.
+  function clearCache() {
+    // WeakMaps do not have a clear method
+    elementToSelectors = new WeakMap();
+  }
+
   function hasLabelMatchingRegex(element, regex) {
     // Check element.labels
     const labels = element.labels;
@@ -248,16 +261,33 @@ function makeRuleset(coeffs, biases) {
     return fnode.element.autocomplete === "current-password";
   }
 
+  // Check cache before calling querySelectorAll on element
+  function getElementDescendants(element, selector) {
+    // Use the element to look up the selector map:
+    const selectorToDescendants = setDefault(
+      elementToSelectors,
+      element,
+      () => new Map()
+    );
+
+    // Use the selector to grab the descendants:
+    return setDefault(
+      selectorToDescendants, // eslint-disable-line prettier/prettier
+      selector,
+      () => Array.from(element.querySelectorAll(selector))
+    );
+  }
+
   function hasSomeMatchingPredicateForSelectorWithinElement(
     element,
     selector,
     matchingPredicate
   ) {
-    if (element !== null) {
-      const selectorArray = Array.from(element.querySelectorAll(selector));
-      return selectorArray.some(matchingPredicate);
+    if (element === null) {
+      return false;
     }
-    return false;
+    const elements = getElementDescendants(element, selector);
+    return elements.some(matchingPredicate);
   }
 
   function textContentMatchesRegexes(element, ...regexes) {
@@ -302,6 +332,17 @@ function makeRuleset(coeffs, biases) {
     return false;
   }
 
+  /**
+   * Let us compactly represent a collection of rules that all take a single
+   * type with no .when() clause and have only a score() call on the right-hand
+   * side.
+   */
+  function* simpleScoringRulesTakingType(inType, ruleMap) {
+    for (const [name, scoringCallback] of Object.entries(ruleMap)) {
+      yield rule(type(inType), score(scoringCallback), { name });
+    }
+  }
+
   return ruleset(
     [
       rule(
@@ -310,152 +351,67 @@ function makeRuleset(coeffs, biases) {
               "input[type=password]:not([disabled]):not([aria-hidden=true]"
             ).when(isVisible)
           : element("input"),
-        type("new")
-      ),
-      rule(
-        type("new"),
-        score(fnode => hasLabelMatchingRegex(fnode.element, newStringRegex)),
-        { name: "hasNewLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasLabelMatchingRegex(fnode.element, confirmStringRegex)
-        ),
-        { name: "hasConfirmLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasLabelMatchingRegex(fnode.element, currentAttrAndStringRegex)
-        ),
-        { name: "hasCurrentLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode => closestLabelMatchesRegex(fnode.element, newStringRegex)),
-        { name: "closestLabelMatchesNew" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          closestLabelMatchesRegex(fnode.element, confirmStringRegex)
-        ),
-        { name: "closestLabelMatchesConfirm" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          closestLabelMatchesRegex(fnode.element, currentAttrAndStringRegex)
-        ),
-        { name: "closestLabelMatchesCurrent" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasAriaLabelMatchingRegex(fnode.element, newStringRegex)
-        ),
-        { name: "hasNewAriaLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasAriaLabelMatchingRegex(fnode.element, confirmStringRegex)
-        ),
-        { name: "hasConfirmAriaLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasAriaLabelMatchingRegex(fnode.element, currentAttrAndStringRegex)
-        ),
-        { name: "hasCurrentAriaLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasPlaceholderMatchingRegex(fnode.element, newStringRegex)
-        ),
-        { name: "hasNewPlaceholder" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasPlaceholderMatchingRegex(fnode.element, confirmStringRegex)
-        ),
-        { name: "hasConfirmPlaceholder" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          hasPlaceholderMatchingRegex(fnode.element, currentAttrAndStringRegex)
-        ),
-        { name: "hasCurrentPlaceholder" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+        type("new").note(clearCache)
+      ),
+      ...simpleScoringRulesTakingType("new", {
+        hasNewLabel: fnode =>
+          hasLabelMatchingRegex(fnode.element, newStringRegex),
+        hasConfirmLabel: fnode =>
+          hasLabelMatchingRegex(fnode.element, confirmStringRegex),
+        hasCurrentLabel: fnode =>
+          hasLabelMatchingRegex(fnode.element, currentAttrAndStringRegex),
+        closestLabelMatchesNew: fnode =>
+          closestLabelMatchesRegex(fnode.element, newStringRegex),
+        closestLabelMatchesConfirm: fnode =>
+          closestLabelMatchesRegex(fnode.element, confirmStringRegex),
+        closestLabelMatchesCurrent: fnode =>
+          closestLabelMatchesRegex(fnode.element, currentAttrAndStringRegex),
+        hasNewAriaLabel: fnode =>
+          hasAriaLabelMatchingRegex(fnode.element, newStringRegex),
+        hasConfirmAriaLabel: fnode =>
+          hasAriaLabelMatchingRegex(fnode.element, confirmStringRegex),
+        hasCurrentAriaLabel: fnode =>
+          hasAriaLabelMatchingRegex(fnode.element, currentAttrAndStringRegex),
+        hasNewPlaceholder: fnode =>
+          hasPlaceholderMatchingRegex(fnode.element, newStringRegex),
+        hasConfirmPlaceholder: fnode =>
+          hasPlaceholderMatchingRegex(fnode.element, confirmStringRegex),
+        hasCurrentPlaceholder: fnode =>
+          hasPlaceholderMatchingRegex(fnode.element, currentAttrAndStringRegex),
+        forgotPasswordInFormLinkTextContent: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "textContent",
             fnode.element.form,
             passwordStringRegex,
             forgotStringRegex
-          )
-        ),
-        { name: "forgotPasswordInFormLinkTextContent" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotPasswordInFormLinkHref: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "href",
             fnode.element.form,
-            new RegExp(
-              passwordStringRegex.source + "|" + passwordAttrRegex.source,
-              "i"
-            ),
+            passwordStringAndAttrRegex,
             forgotHrefRegex
-          )
-        ),
-        { name: "forgotPasswordInFormLinkHref" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotPasswordInFormLinkTitle: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "title",
             fnode.element.form,
             passwordStringRegex,
             forgotStringRegex
-          )
-        ),
-        { name: "forgotPasswordInFormLinkTitle" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotInFormLinkTextContent: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "textContent",
             fnode.element.form,
             forgotStringRegex
-          )
-        ),
-        { name: "forgotInFormLinkTextContent" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotInFormLinkHref: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "href",
             fnode.element.form,
             forgotHrefRegex
-          )
-        ),
-        { name: "forgotInFormLinkHref" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotPasswordInFormButtonTextContent: fnode =>
           hasSomeMatchingPredicateForSelectorWithinElement(
             fnode.element.form,
             "button",
@@ -465,52 +421,29 @@ function makeRuleset(coeffs, biases) {
                 passwordStringRegex,
                 forgotStringRegex
               )
-          )
-        ),
-        { name: "forgotPasswordInFormButtonTextContent" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotPasswordOnPageLinkTextContent: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "textContent",
             fnode.element.ownerDocument,
             passwordStringRegex,
             forgotStringRegex
-          )
-        ),
-        { name: "forgotPasswordOnPageLinkTextContent" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotPasswordOnPageLinkHref: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "href",
             fnode.element.ownerDocument,
-            new RegExp(
-              passwordStringRegex.source + "|" + passwordAttrRegex.source,
-              "i"
-            ),
+            passwordStringAndAttrRegex,
             forgotHrefRegex
-          )
-        ),
-        { name: "forgotPasswordOnPageLinkHref" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotPasswordOnPageLinkTitle: fnode =>
           testRegexesAgainstAnchorPropertyWithinElement(
             "title",
             fnode.element.ownerDocument,
             passwordStringRegex,
             forgotStringRegex
-          )
-        ),
-        { name: "forgotPasswordOnPageLinkTitle" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        forgotPasswordOnPageButtonTextContent: fnode =>
           hasSomeMatchingPredicateForSelectorWithinElement(
             fnode.element.ownerDocument,
             "button",
@@ -520,151 +453,69 @@ function makeRuleset(coeffs, biases) {
                 passwordStringRegex,
                 forgotStringRegex
               )
-          )
-        ),
-        { name: "forgotPasswordOnPageButtonTextContent" }
-      ),
-      rule(
-        type("new"),
-        score(fnode => elementAttrsMatchRegex(fnode.element, newAttrRegex)),
-        { name: "elementAttrsMatchNew" }
-      ),
-      rule(
-        type("new"),
-        score(fnode => elementAttrsMatchRegex(fnode.element, confirmAttrRegex)),
-        { name: "elementAttrsMatchConfirm" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          elementAttrsMatchRegex(fnode.element, currentAttrAndStringRegex)
-        ),
-        { name: "elementAttrsMatchCurrent" }
-      ),
-      rule(
-        type("new"),
-        score(fnode => elementAttrsMatchRegex(fnode.element, password1Regex)),
-        { name: "elementAttrsMatchPassword1" }
-      ),
-      rule(
-        type("new"),
-        score(fnode => elementAttrsMatchRegex(fnode.element, password2Regex)),
-        { name: "elementAttrsMatchPassword2" }
-      ),
-      rule(
-        type("new"),
-        score(fnode => elementAttrsMatchRegex(fnode.element, loginRegex)),
-        { name: "elementAttrsMatchLogin" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          elementAttrsMatchRegex(fnode.element.form, registerFormAttrRegex)
-        ),
-        { name: "formAttrsMatchRegister" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        elementAttrsMatchNew: fnode =>
+          elementAttrsMatchRegex(fnode.element, newAttrRegex),
+        elementAttrsMatchConfirm: fnode =>
+          elementAttrsMatchRegex(fnode.element, confirmAttrRegex),
+        elementAttrsMatchCurrent: fnode =>
+          elementAttrsMatchRegex(fnode.element, currentAttrAndStringRegex),
+        elementAttrsMatchPassword1: fnode =>
+          elementAttrsMatchRegex(fnode.element, password1Regex),
+        elementAttrsMatchPassword2: fnode =>
+          elementAttrsMatchRegex(fnode.element, password2Regex),
+        elementAttrsMatchLogin: fnode =>
+          elementAttrsMatchRegex(fnode.element, loginRegex),
+        formAttrsMatchRegister: fnode =>
+          elementAttrsMatchRegex(fnode.element.form, registerFormAttrRegex),
+        formHasRegisterAction: fnode =>
           containsRegex(
             registerActionRegex,
             fnode.element.form,
             form => form.action
-          )
-        ),
-        { name: "formHasRegisterAction" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          testFormButtonsAgainst(fnode.element, registerStringRegex)
-        ),
-        { name: "formButtonIsRegister" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          elementAttrsMatchRegex(fnode.element.form, loginFormAttrRegex)
-        ),
-        { name: "formAttrsMatchLogin" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          containsRegex(loginRegex, fnode.element.form, form => form.action)
-        ),
-        { name: "formHasLoginAction" }
-      ),
-      rule(
-        type("new"),
-        score(fnode => testFormButtonsAgainst(fnode.element, loginRegex)),
-        { name: "formButtonIsLogin" }
-      ),
-      rule(type("new"), score(hasAutocompleteCurrentPassword), {
-        name: "hasAutocompleteCurrentPassword",
-      }),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        formButtonIsRegister: fnode =>
+          testFormButtonsAgainst(fnode.element, registerStringRegex),
+        formAttrsMatchLogin: fnode =>
+          elementAttrsMatchRegex(fnode.element.form, loginFormAttrRegex),
+        formHasLoginAction: fnode =>
+          containsRegex(loginRegex, fnode.element.form, form => form.action),
+        formButtonIsLogin: fnode =>
+          testFormButtonsAgainst(fnode.element, loginRegex),
+        hasAutocompleteCurrentPassword,
+        formHasRememberMeCheckbox: fnode =>
           hasSomeMatchingPredicateForSelectorWithinElement(
             fnode.element.form,
             "input[type=checkbox]",
             checkbox =>
               rememberMeAttrRegex.test(checkbox.id) ||
               rememberMeAttrRegex.test(checkbox.name)
-          )
-        ),
-        { name: "formHasRememberMeCheckbox" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        formHasRememberMeLabel: fnode =>
           hasSomeMatchingPredicateForSelectorWithinElement(
             fnode.element.form,
             "label",
             label => rememberMeStringRegex.test(label.textContent)
-          )
-        ),
-        { name: "formHasRememberMeLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        formHasNewsletterCheckbox: fnode =>
           hasSomeMatchingPredicateForSelectorWithinElement(
             fnode.element.form,
             "input[type=checkbox]",
             checkbox =>
               checkbox.id.includes("newsletter") ||
               checkbox.name.includes("newsletter")
-          )
-        ),
-        { name: "formHasNewsletterCheckbox" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
+          ),
+        formHasNewsletterLabel: fnode =>
           hasSomeMatchingPredicateForSelectorWithinElement(
             fnode.element.form,
             "label",
             label => newsletterStringRegex.test(label.textContent)
-          )
-        ),
-        { name: "formHasNewsletterLabel" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          closestHeaderAboveMatchesRegex(fnode.element, loginRegex)
-        ),
-        { name: "closestHeaderAboveIsLoginy" }
-      ),
-      rule(
-        type("new"),
-        score(fnode =>
-          closestHeaderAboveMatchesRegex(fnode.element, registerStringRegex)
-        ),
-        { name: "closestHeaderAboveIsRegistery" }
-      ),
+          ),
+        closestHeaderAboveIsLoginy: fnode =>
+          closestHeaderAboveMatchesRegex(fnode.element, loginRegex),
+        closestHeaderAboveIsRegistery: fnode =>
+          closestHeaderAboveMatchesRegex(fnode.element, registerStringRegex),
+      }),
       rule(type("new"), out("new")),
     ],
     coeffs,
diff --git a/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js b/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js
index 765c7666e70c..78015faa78a9 100644
--- a/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_doorhanger_remembering.js
@@ -508,7 +508,12 @@ add_task(async function test_changeUPLoginOnUPForm_change() {
     is(notif.message, "Would you like to update this login?", "Check message");
 
     await checkDoorhangerUsernamePassword("notifyu1", "pass2");
+    let promiseLoginUpdateSaved = TestUtils.topicObserved(
+      "LoginStats:LoginUpdateSaved",
+      (subject, data) => subject == gBrowser.selectedBrowser
+    );
     clickDoorhangerButton(notif, CHANGE_BUTTON);
+    await promiseLoginUpdateSaved;
 
     ok(!getCaptureDoorhanger("password-change"), "popup should be gone");
   });
diff --git a/toolkit/components/passwordmgr/test/browser/head.js b/toolkit/components/passwordmgr/test/browser/head.js
index e65e0a397392..ea49469b84e3 100644
--- a/toolkit/components/passwordmgr/test/browser/head.js
+++ b/toolkit/components/passwordmgr/test/browser/head.js
@@ -12,6 +12,8 @@ add_task(async function common_initialize() {
   await SpecialPowers.pushPrefEnv({
     set: [
       ["signon.rememberSignons", true],
+      ["signon.testOnlyUserHasInteractedByPrefValue", true],
+      ["signon.testOnlyUserHasInteractedWithDocument", true],
       ["toolkit.telemetry.ipcBatchTimeout", 0],
     ],
   });
diff --git a/toolkit/components/passwordmgr/test/mochitest/mochitest.ini b/toolkit/components/passwordmgr/test/mochitest/mochitest.ini
index 04dd5cfa01f9..873d75eed4fd 100644
--- a/toolkit/components/passwordmgr/test/mochitest/mochitest.ini
+++ b/toolkit/components/passwordmgr/test/mochitest/mochitest.ini
@@ -3,6 +3,8 @@ prefs =
   signon.rememberSignons=true
   signon.autofillForms.http=true
   signon.showAutoCompleteFooter=true
+  signon.testOnlyUserHasInteractedByPrefValue=true
+  signon.testOnlyUserHasInteractedWithDocument=true
   security.insecure_field_warning.contextual.enabled=false
   network.auth.non-web-content-triggered-resources-http-auth-allow=true
 
@@ -27,7 +29,7 @@ skip-if = toolkit == 'android' && !is_fennec # Don't run on GeckoView
 # Note: new tests should use scheme = https unless they have a specific reason not to
 
 [test_autocomplete_basic_form.html]
-skip-if = toolkit == 'android' # android:autocomplete
+skip-if = toolkit == 'android' || debug && (os == 'linux' || os == 'win') # android:autocomplete. Bug 1541945
 scheme = https
 [test_autocomplete_basic_form_insecure.html]
 skip-if = toolkit == 'android' || os == 'linux' # android:autocomplete., linux: bug 1325778
diff --git a/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html b/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html
index c187c4bbc087..92cee77b626b 100644
--- a/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html
+++ b/toolkit/components/passwordmgr/test/mochitest/test_submit_without_field_modifications.html
@@ -37,6 +37,31 @@ function waitForLoad() {
   });
 }
 
+async function setupWithOneLogin(pageUrl) {
+  let chromeScript = runInParent(function testSetup() {
+    const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+    let login = Cc["@mozilla.org/login-manager/loginInfo;1"]
+                        .createInstance(Ci.nsILoginInfo);
+    login.init("https://example.com", "https://example.com", null,
+               "user1", "pass1");
+
+    Services.logins.addLogin(login);
+    for (let l of Services.logins.getAllLogins()) {
+      info("Got login: " + l.username + ", " + l.password);
+    }
+  });
+  await setup(pageUrl);
+  return chromeScript;
+}
+
+function resetSavedLogins() {
+  let chromeScript = runInParent(function testTeardown() {
+    const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
+    Services.logins.removeAllLogins();
+  });
+  chromeScript.destroy();
+}
+
 async function setup(pageUrl) {
   let loadPromise = waitForLoad();
   let processedFormPromise = promiseFormsProcessed();
@@ -53,25 +78,63 @@ async function setup(pageUrl) {
   });
 }
 
-async function clickLink() {
+async function navigateWithoutUserInteraction() {
   let loadPromise = waitForLoad();
   await SpecialPowers.spawn(getIframeBrowsingContext(window), [], function() {
     let doc = this.content.document;
-    doc.querySelector("a[href]").click();
+    let hadInteracted = doc.userHasInteracted;
+    let target = doc.querySelector("a[href]");
+    if (target) {
+      target.click();
+    } else {
+      target = doc.querySelector("form");
+      target.submit();
+    }
+    is(doc.userHasInteracted, hadInteracted, "document.userHasInteracted shouldn't have changed");
   });
   await loadPromise;
 }
 
 async function userInput(selector, value) {
-  await SpecialPowers.spawn(getIframeBrowsingContext(window), [selector, value], function(sel, val) {
-    this.content.document.querySelector(sel).setUserInput(val);
+  await SpecialPowers.spawn(getIframeBrowsingContext(window), [selector, value], async function(sel, val) {
+    // use "real" synthesized events rather than setUserInput to ensure
+    // document.userHasInteracted is flipped true
+    let EventUtils = ContentTaskUtils.getEventUtils(content);
+    let target = this.content.document.querySelector(sel);
+    target.focus();
+    target.select();
+    await EventUtils.synthesizeKey("KEY_Backspace", {}, this.content);
+    await EventUtils.sendString(val, this.content);
+    info(
+      `userInput: new target.value: ${target.value}`
+    );
+    target.blur();
+    return Promise.resolve();
+  });
+}
+
+function checkDocumentUserHasInteracted() {
+  return SpecialPowers.spawn(getIframeBrowsingContext(window), [], function() {
+    return this.content.document.userHasInteracted;
   });
 }
 
 add_task(async function test_init() {
+  // For this test, we'll be testing with & without user document interaction.
+  // So we'll reset the pref which dictates the behavior of LMC._formHasModifiedFields in automation
+  // and ensure all interactions are properly emulated
+  ok(SpecialPowers.getBoolPref("signon.testOnlyUserHasInteractedByPrefValue"), "signon.testOnlyUserHasInteractedByPrefValue should default to true");
+  info("test_init, flipping the signon.testOnlyUserHasInteractedByPrefValue pref");
   await SpecialPowers.pushPrefEnv({"set": [
-    ["signon.userInputRequiredToCapture.enabled", true],
+    ["signon.testOnlyUserHasInteractedByPrefValue", false],
   ]});
+  SimpleTest.registerCleanupFunction(async function cleanup_pref() {
+    await SpecialPowers.popPrefEnv();
+  });
+
+  await SimpleTest.promiseWaitForCondition(() => LoginHelper.testOnlyUserHasInteractedWithDocument === null);
+  is(LoginHelper.testOnlyUserHasInteractedWithDocument, null,
+    "LoginHelper.testOnlyUserHasInteractedWithDocument should be null for this set of tests");
 });
 
 add_task(async function test_no_message_on_navigation() {
@@ -83,7 +146,7 @@ add_task(async function test_no_message_on_navigation() {
   getSubmitMessage().then(value => {
     submitMessageSent = true;
   });
-  await clickLink();
+  await navigateWithoutUserInteraction();
 
   // allow time to pass before concluding no onFormSubmit message was sent
   await new Promise(res => setTimeout(res, 1000));
@@ -98,7 +161,7 @@ add_task(async function test_prefd_off_message_on_navigation() {
   await setup(PREFILLED_FORM_URL);
 
   let promiseSubmitMessage = getSubmitMessage();
-  await clickLink();
+  await navigateWithoutUserInteraction();
   await promiseSubmitMessage;
   info("onFormSubmit message was sent as expected after navigation");
 
@@ -110,7 +173,7 @@ add_task(async function test_message_with_user_interaction_on_navigation() {
   await userInput("#form-basic-username", "foo");
 
   let promiseSubmitMessage = getSubmitMessage();
-  await clickLink();
+  await navigateWithoutUserInteraction();
   await promiseSubmitMessage;
   info("onFormSubmit message was sent as expected after user interaction");
 });
@@ -121,47 +184,77 @@ add_task(async function test_empty_form_with_input_handler() {
   await userInput("#form-basic-password", "pass");
 
   let promiseSubmitMessage = getSubmitMessage();
-  await clickLink();
+  await navigateWithoutUserInteraction();
   await promiseSubmitMessage;
   info("onFormSubmit message was sent as expected after user interaction");
 });
 
-add_task(async function test_message_on_autofill_without_user_interaction() {
-  runInParent(function addLogin() {
-    const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
-    let login = Cc["@mozilla.org/login-manager/loginInfo;1"]
-                        .createInstance(Ci.nsILoginInfo);
-    login.init("https://example.com", "https://example.com", null,
-               "user1", "pass1", "", "");
+add_task(async function test_no_message_on_autofill_without_user_interaction() {
+  let chromeScript = await setupWithOneLogin(EXAMPLE_COM + "form_basic.html");
+  // Check for autofilled values.
+  await checkLoginFormInChildFrame(getIframeBrowsingContext(window, 0),
+                                   "form-basic-username", "user1",
+                                   "form-basic-password", "pass1");
 
-    Services.logins.addLogin(login);
+  info("LoginHelper.testOnlyUserHasInteractedWithDocument:" +
+      LoginHelper.testOnlyUserHasInteractedWithDocument
+  );
+  ok(!(await checkDocumentUserHasInteracted()), "document.userHasInteracted should be initially false");
+  let submitMessageSent = false;
+  getSubmitMessage().then(value => {
+    submitMessageSent = true;
   });
+  info("Navigating the page")
+  await navigateWithoutUserInteraction();
+
+  // allow time to pass before concluding no onFormSubmit message was sent
+  await new Promise(res => setTimeout(res, 1000));
+
+  chromeScript.destroy();
+  resetSavedLogins();
+
+  ok(!submitMessageSent, "onFormSubmit message is not sent on navigation since the document had no user interaction");
+});
 
-  await setup(EXAMPLE_COM + "form_basic.html");
+add_task(async function test_message_on_autofill_with_document_interaction() {
+  // We expect that as long as the form values !== their defaultValues,
+  // any document interaction allows the submit message to be sent
+
+  let chromeScript = await setupWithOneLogin(EXAMPLE_COM + "form_basic.html");
   // Check for autofilled values.
   await checkLoginFormInChildFrame(getIframeBrowsingContext(window, 0),
                                    "form-basic-username", "user1",
                                    "form-basic-password", "pass1");
 
+  let userInteracted = await checkDocumentUserHasInteracted();
+  ok(!userInteracted, "document.userHasInteracted should be initially false");
+
+  await SpecialPowers.spawn(getIframeBrowsingContext(window), ["#form-basic-username"], async function(sel) {
+    // Click somewhere in the document to ensure document.userHasInteracted is flipped to true
+    let EventUtils = ContentTaskUtils.getEventUtils(content);
+    let target = this.content.document.querySelector(sel);
+
+    await EventUtils.synthesizeMouseAtCenter(target, {}, this.content);
+  });
+
+  userInteracted = await checkDocumentUserHasInteracted();
+  ok(userInteracted, "After synthesizeMouseAtCenter, document.userHasInteracted should be true");
+
   let promiseSubmitMessage = getSubmitMessage();
-  await clickLink();
+  await navigateWithoutUserInteraction();
 
   let messageData = await promiseSubmitMessage;
   ok(messageData.autoFilledLoginGuid, "Message was sent with autoFilledLoginGuid");
+  info("Message was sent as expected after document user interaction");
+
+  chromeScript.destroy();
+  resetSavedLogins();
 });
 
 add_task(async function test_message_on_autofill_with_user_interaction() {
-  runInParent(function addLogin() {
-    const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
-    let login = Cc["@mozilla.org/login-manager/loginInfo;1"]
-                        .createInstance(Ci.nsILoginInfo);
-    login.init("https://example.com", "https://example.com", null,
-               "user1", "pass1", "", "");
-
-    Services.logins.addLogin(login);
-  });
-
-  await setup(EXAMPLE_COM + "form_basic.html");
+  // Editing a field value causes the submit message to be sent as
+  // there is both document interaction and field modification
+  let chromeScript = await setupWithOneLogin(EXAMPLE_COM + "form_basic.html");
   // Check for autofilled values.
   await checkLoginFormInChildFrame(getIframeBrowsingContext(window, 0),
                                    "form-basic-username", "user1",
@@ -169,12 +262,15 @@ add_task(async function test_message_on_autofill_with_user_interaction() {
 
   userInput("#form-basic-username", "newuser");
   let promiseSubmitMessage = getSubmitMessage();
-  await clickLink();
+  await navigateWithoutUserInteraction();
 
   let messageData = await promiseSubmitMessage;
   ok(messageData.autoFilledLoginGuid, "Message was sent with autoFilledLoginGuid");
   is(messageData.usernameField.value, "newuser", "Message was sent with correct usernameField.value");
-  info("Message was sent as expected after user interaction");
+  info("Message was sent as expected after user form interaction");
+
+  chromeScript.destroy();
+  resetSavedLogins();
 });
 
 add_task(async function test_no_message_on_user_input_from_other_form() {
@@ -207,7 +303,7 @@ add_task(async function test_no_message_on_user_input_from_other_form() {
   });
 
   info("submitting the form");
-  await clickLink();
+  await navigateWithoutUserInteraction();
 
   // allow time to pass before concluding no onFormSubmit message was sent
   await new Promise(res => setTimeout(res, 1000));
diff --git a/toolkit/components/pictureinpicture/content/player.js b/toolkit/components/pictureinpicture/content/player.js
index 5c6c9b1ca0e3..888bef64bf71 100644
--- a/toolkit/components/pictureinpicture/content/player.js
+++ b/toolkit/components/pictureinpicture/content/player.js
@@ -68,6 +68,8 @@ let Player = {
     "dblclick",
     "keydown",
     "mouseout",
+    "MozDOMFullscreen:Entered",
+    "MozDOMFullscreen:Exited",
     "resize",
     "unload",
   ],
@@ -208,6 +210,28 @@ let Player = {
         break;
       }
 
+      // Normally, the DOMFullscreenParent / DOMFullscreenChild actors
+      // would take care of firing the `fullscreen-painted` notification,
+      // however, those actors are only ever instantiated when a <browser>
+      // is fullscreened, and not a <body> element in a parent-process
+      // chrome privileged DOM window.
+      //
+      // Rather than trying to re-engineer JSWindowActors to be re-usable for
+      // this edge-case, we do the work of firing fullscreen-painted when
+      // transitioning in and out of fullscreen ourselves here.
+      case "MozDOMFullscreen:Entered":
+      // Intentional fall-through
+      case "MozDOMFullscreen:Exited": {
+        let { lastTransactionId } = window.windowUtils;
+        window.addEventListener("MozAfterPaint", function onPainted(event) {
+          if (event.transactionId > lastTransactionId) {
+            window.removeEventListener("MozAfterPaint", onPainted);
+            Services.obs.notifyObservers(window, "fullscreen-painted");
+          }
+        });
+        break;
+      }
+
       case "oop-browser-crashed": {
         PictureInPicture.closePipWindow({ reason: "browser-crash" });
         break;
diff --git a/toolkit/components/places/PageIconProtocolHandler.cpp b/toolkit/components/places/PageIconProtocolHandler.cpp
index 9e30fda1d32a..d3300d0c2c6c 100644
--- a/toolkit/components/places/PageIconProtocolHandler.cpp
+++ b/toolkit/components/places/PageIconProtocolHandler.cpp
@@ -4,6 +4,7 @@
 
 #include "PageIconProtocolHandler.h"
 
+#include "mozilla/NullPrincipal.h"
 #include "mozilla/ScopeExit.h"
 #include "mozilla/Services.h"
 #include "nsFaviconService.h"
@@ -196,12 +197,17 @@ nsresult PageIconProtocolHandler::NewChannelInternal(nsIURI* aURI,
 
   // Create our channel.
   nsCOMPtr<nsIChannel> channel;
-  rv = NS_NewInputStreamChannel(
-      getter_AddRefs(channel), aURI, pipeIn.forget(),
-      aLoadInfo->LoadingPrincipal(),
-      nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED,
-      nsIContentPolicy::TYPE_INTERNAL_IMAGE);
-  NS_ENSURE_SUCCESS(rv, rv);
+  {
+    // We override the channel's loadinfo below anyway, so using a null
+    // principal here is alright.
+    nsCOMPtr<nsIPrincipal> loadingPrincipal =
+      NullPrincipal::CreateWithoutOriginAttributes();
+    rv = NS_NewInputStreamChannel(
+        getter_AddRefs(channel), aURI, pipeIn.forget(),
+        loadingPrincipal, nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED,
+        nsIContentPolicy::TYPE_INTERNAL_IMAGE);
+    NS_ENSURE_SUCCESS(rv, rv);
+  }
 
   rv = channel->SetLoadInfo(aLoadInfo);
   NS_ENSURE_SUCCESS(rv, rv);
diff --git a/toolkit/components/printing/content/printUtils.js b/toolkit/components/printing/content/printUtils.js
index f8729f6575cc..1405d0e67f34 100644
--- a/toolkit/components/printing/content/printUtils.js
+++ b/toolkit/components/printing/content/printUtils.js
@@ -279,16 +279,7 @@ var PrintUtils = {
   _originalURL: "",
   _shouldSimplify: false,
 
-  _displayPrintingError(nsresult, isPrinting) {
-    // The nsresults from a printing error are mapped to strings that have
-    // similar names to the errors themselves. For example, for error
-    // NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE, the name of the string
-    // for the error message is: PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE. What's
-    // more, if we're in the process of doing a print preview, it's possible
-    // that there are strings specific for print preview for these errors -
-    // if so, the names of those strings have _PP as a suffix. It's possible
-    // that no print preview specific strings exist, in which case it is fine
-    // to fall back to the original string name.
+  _getErrorCodeForNSResult(nsresult) {
     const MSG_CODES = [
       "GFX_PRINTER_NO_PRINTER_AVAILABLE",
       "GFX_PRINTER_NAME_NOT_FOUND",
@@ -304,20 +295,30 @@ var PrintUtils = {
       "UNEXPECTED",
     ];
 
-    // PERR_FAILURE is the catch-all error message if we've gotten one that
-    // we don't recognize.
-    let msgName = "PERR_FAILURE";
-
     for (let code of MSG_CODES) {
       let nsErrorResult = "NS_ERROR_" + code;
       if (Cr[nsErrorResult] == nsresult) {
-        msgName = "PERR_" + code;
-        break;
+        return code;
       }
     }
 
-    let msg, title;
+    // PERR_FAILURE is the catch-all error message if we've gotten one that
+    // we don't recognize.
+    return "FAILURE";
+  },
 
+  _displayPrintingError(nsresult, isPrinting) {
+    // The nsresults from a printing error are mapped to strings that have
+    // similar names to the errors themselves. For example, for error
+    // NS_ERROR_GFX_PRINTER_NO_PRINTER_AVAILABLE, the name of the string
+    // for the error message is: PERR_GFX_PRINTER_NO_PRINTER_AVAILABLE. What's
+    // more, if we're in the process of doing a print preview, it's possible
+    // that there are strings specific for print preview for these errors -
+    // if so, the names of those strings have _PP as a suffix. It's possible
+    // that no print preview specific strings exist, in which case it is fine
+    // to fall back to the original string name.
+    let msgName = "PERR_" + this._getErrorCodeForNSResult(nsresult);
+    let msg, title;
     if (!isPrinting) {
       // Try first with _PP suffix.
       let ppMsgName = msgName + "_PP";
@@ -348,6 +349,11 @@ var PrintUtils = {
         aMessage.data.nsresult,
         aMessage.data.isPrinting
       );
+      Services.telemetry.keyedScalarAdd(
+        "printing.error",
+        this._getErrorCodeForNSResult(aMessage.data.nsresult),
+        1
+      );
       return undefined;
     }
 
diff --git a/toolkit/components/telemetry/Events.yaml b/toolkit/components/telemetry/Events.yaml
index 3f721fc693b7..03c36d2e1b6d 100644
--- a/toolkit/components/telemetry/Events.yaml
+++ b/toolkit/components/telemetry/Events.yaml
@@ -628,16 +628,37 @@ pwmgr:
     record_in_processes: [main, content]
     release_channel_collection: opt-out
     expiry_version: never
+  reauthenticate:
+    description: >
+      Measure how often users are asked to authenticate with their Operating System or Master Password to gain access to stored passwords.
+      Possible values are as follows,
+        "success_no_prompt" should be used when the feature is enabled but no prompt is given to the user because they have recently authenticated.
+        "success_disabled" is used when the feature is disabled.
+        "success_unsupported_platform" should be set when the user attempts to authenticate on an unsupported platform.
+        "success_no_password" should be used when the user doesn't have an OS password set.
+    objects: [
+      "master_password",
+      "os_auth",
+    ]
+    methods: ["reauthenticate"]
+    bug_numbers:
+      - 1628029
+      - 1623745
+    expiry_version: never
+    notification_emails: ["loines@mozilla.com", "passwords-dev@mozilla.org", "jaws@mozilla.com"]
+    release_channel_collection: opt-out
+    products:
+      - "firefox"
+    record_in_processes: [content]
   mgmt_interaction:
     description: >
-      These events record interactions on the about:logins page. Sort methods have an accompanying
-      value that specifies what order the list of logins is sorted with: {last_changed, last_used, title}.
+      These events record interactions on the about:logins page.
     extra_keys:
       breached: >
         Whether the login is marked as breached or not. If a login is both breached and vulnerable, it will only be reported as breached.
       vulnerable: >
         Whether the login is marked as vulnerable or not. If a login is both breached and vulnerable, it will only be reported as breached.
-      sort_key: The key that is used for sorting the login-list
+      sort_key: The key that is used for sorting the login-list. Should only be set with the "sort" method.
     objects: [
       "existing_login",
       "list",
@@ -654,6 +675,7 @@ pwmgr:
       "filter",
       "hide",
       "learn_more_breach",
+      "learn_more_vuln",
       "new",
       "open_site",
       "save",
@@ -664,13 +686,13 @@ pwmgr:
     bug_numbers:
       - 1548463
       - 1600958
+      - 1549115
+      - 1628165
     expiry_version: never
     notification_emails: ["loines@mozilla.com", "passwords-dev@mozilla.org", "jaws@mozilla.com"]
     release_channel_collection: opt-out
     products:
       - "firefox"
-      - "fennec"
-      - "geckoview"
     record_in_processes: [content]
   autocomplete_field:
     objects: ["generatedpassword"]
diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json
index e7d4a523a0f3..3bef140effaf 100644
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -5368,9 +5368,10 @@
     "record_in_processes": ["main"],
     "products": ["firefox", "geckoview"],
     "alert_emails": ["necko@mozilla.com", "mnovotny@mozilla.com"],
-    "bug_numbers": [1622335],
+    "bug_numbers": [1622335, 1630899],
     "expires_in_version": "82",
     "kind": "categorical",
+    "releaseChannelCollection": "opt-out",
     "labels": ["ftp", "other"],
     "description": "Whether the scheme of the PAC URL was FTP"
   },
@@ -7543,13 +7544,6 @@
     "keyed": true,
     "description": "Number of toplevel location changes in tablet and desktop mode (only used on win10 where tablet mode is available)"
   },
-  "FX_TOUCH_USED": {
-    "record_in_processes": ["main", "content"],
-    "products": ["firefox", "fennec", "geckoview"],
-    "expires_in_version": "46",
-    "kind": "count",
-    "description": "Windows only. Counts occurrences of touch events"
-  },
   "FX_URLBAR_SELECTED_RESULT_INDEX": {
     "record_in_processes": ["main", "content"],
     "products": ["firefox", "fennec", "geckoview"],
diff --git a/toolkit/components/telemetry/Scalars.yaml b/toolkit/components/telemetry/Scalars.yaml
index cb5b1f16d35d..df8dc14535de 100644
--- a/toolkit/components/telemetry/Scalars.yaml
+++ b/toolkit/components/telemetry/Scalars.yaml
@@ -575,6 +575,26 @@ browser.usage:
       - 'main'
       - 'content'
 
+browser.input:
+  touch_event_count:
+    bug_numbers:
+      - 1626099
+    description: >-
+      Windows only.
+      Counts occurrences of touch events,
+      measured when user starts a touch event.
+    expires: "90"
+    kind: uint
+    notification_emails:
+      - gfx-telemetry-alerts@mozilla.com
+      - ktaeleman@mozilla.com
+    release_channel_collection: opt-out
+    products:
+      - 'firefox'
+    record_in_processes:
+      - 'main'
+      - 'content'
+
 gecko:
   version:
     bug_numbers:
@@ -3302,6 +3322,41 @@ pdf.viewer:
       - 'main'
       - 'content'
 
+# The following section contains scalars for printing.
+printing:
+  error:
+    bug_numbers:
+      - 1630105
+    description: >
+      A counter incremented every time the user encounters an error printing.
+      The result is split into keys which represent the values of
+      error codes related to printing. Possible values are listed in 'keys'.
+      "FAILURE" is a catch-all code for an error we don't recognize.
+    keyed: true
+    keys:
+      - 'GFX_PRINTER_NO_PRINTER_AVAILABLE'
+      - 'GFX_PRINTER_NAME_NOT_FOUND'
+      - 'GFX_PRINTER_COULD_NOT_OPEN_FILE'
+      - 'GFX_PRINTER_STARTDOC'
+      - 'GFX_PRINTER_ENDDOC'
+      - 'GFX_PRINTER_STARTPAGE'
+      - 'GFX_PRINTER_DOC_IS_BUSY'
+      - 'ABORT'
+      - 'NOT_AVAILABLE'
+      - 'NOT_IMPLEMENTED'
+      - 'OUT_OF_MEMORY'
+      - 'UNEXPECTED'
+      - 'FAILURE'
+    expires: never
+    kind: uint
+    notification_emails:
+      - jaws@mozilla.com
+    release_channel_collection: opt-out
+    products:
+      - 'firefox'
+    record_in_processes:
+      - 'main'
+
 # The following section contains probes that record timestamps.
 timestamps:
   first_paint:
diff --git a/toolkit/components/telemetry/histogram-allowlists.json b/toolkit/components/telemetry/histogram-allowlists.json
index 7c320b67a42a..3f4e7f30dbfd 100644
--- a/toolkit/components/telemetry/histogram-allowlists.json
+++ b/toolkit/components/telemetry/histogram-allowlists.json
@@ -127,7 +127,6 @@
     "FX_THUMBNAILS_HIT_OR_MISS",
     "FX_THUMBNAILS_STORE_TIME_MS",
     "FX_TOTAL_TOP_VISITS",
-    "FX_TOUCH_USED",
     "GDI_INITFONTLIST_TOTAL",
     "GEOLOCATION_ERROR",
     "GEOLOCATION_OSX_SOURCE_IS_MLS",
@@ -558,7 +557,6 @@
     "FX_THUMBNAILS_HIT_OR_MISS",
     "FX_THUMBNAILS_STORE_TIME_MS",
     "FX_TOTAL_TOP_VISITS",
-    "FX_TOUCH_USED",
     "GC_BUDGET_MS",
     "GC_COMPACT_MS",
     "GC_INCREMENTAL_DISABLED",
@@ -1212,7 +1210,6 @@
     "FX_CONTENT_CRASH_NOT_SUBMITTED",
     "FX_CONTENT_CRASH_PRESENTED",
     "FX_SESSION_RESTORE_SEND_UPDATE_CAUSED_OOM",
-    "FX_TOUCH_USED",
     "GEOLOCATION_ERROR",
     "MASTER_PASSWORD_ENABLED",
     "MEDIA_CODEC_USED",
diff --git a/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl b/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl
index 0611bf1322ed..8e4613f96afa 100644
--- a/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl
+++ b/toolkit/locales/en-US/toolkit/about/aboutAddons.ftl
@@ -29,12 +29,20 @@ list-empty-button =
     .label = Learn more about add-ons
 
 help-button = Add-ons Support
+sidebar-help-button-title =
+    .title = Add-ons Support
 
 preferences =
     { PLATFORM() ->
         [windows] { -brand-short-name } Options
        *[other] { -brand-short-name } Preferences
     }
+sidebar-preferences-button-title =
+    .title =
+        { PLATFORM() ->
+            [windows] { -brand-short-name } Options
+           *[other] { -brand-short-name } Preferences
+        }
 
 show-unsigned-extensions-button =
     .label = Some extensions could not be verified
@@ -198,13 +206,29 @@ private-browsing-description2 =
     <label data-l10n-name="private-browsing-learn-more">Learn how to manage extension settings</label>
 
 addon-category-discover = Recommendations
+addon-category-discover-title =
+    .title = Recommendations
 addon-category-extension = Extensions
+addon-category-extension-title =
+    .title = Extensions
 addon-category-theme = Themes
+addon-category-theme-title =
+    .title = Themes
 addon-category-plugin = Plugins
+addon-category-plugin-title =
+    .title = Plugins
 addon-category-dictionary = Dictionaries
+addon-category-dictionary-title =
+    .title = Dictionaries
 addon-category-locale = Languages
+addon-category-locale-title =
+    .title = Languages
 addon-category-available-updates = Available Updates
+addon-category-available-updates-title =
+    .title = Available Updates
 addon-category-recent-updates = Recent Updates
+addon-category-recent-updates-title =
+    .title = Recent Updates
 
 ## These are global warnings
 
@@ -298,8 +322,8 @@ shortcuts-card-expand-button =
 
 shortcuts-card-collapse-button = Show Less
 
-go-back-button =
-    .tooltiptext = Go back
+header-back-button =
+    .title = Go back
 
 ## Recommended add-ons page
 
diff --git a/toolkit/modules/OSKeyStore.jsm b/toolkit/modules/OSKeyStore.jsm
index 2d30bce1f7f0..efb5de861660 100644
--- a/toolkit/modules/OSKeyStore.jsm
+++ b/toolkit/modules/OSKeyStore.jsm
@@ -93,7 +93,7 @@ var OSKeyStore = {
           "oskeystore-testonly-reauth",
           "pass"
         );
-        break;
+        return { authenticated: true, auth_details: "success" };
       case "cancel":
         Services.obs.notifyObservers(
           null,
@@ -145,9 +145,9 @@ var OSKeyStore = {
    *                                  the key storage. If we start creating keys on macOS by running
    *                                  this code we'll potentially have to do extra work to cleanup
    *                                  the mess later.
-   * @returns {Promise<boolean>}      True if it's logged in or no password is set
-   *                                  and false if it's still not logged in (prompt
-   *                                  canceled or other error).
+   * @returns {Promise<Object>}       Object with the following properties:
+   *                                    authenticated: {boolean} Set to true if the user successfully authenticated.
+   *                                    auth_details: {String?} Details of the authentication result.
    */
   async ensureLoggedIn(
     reauth = false,
@@ -195,23 +195,34 @@ var OSKeyStore = {
         unlockPromise = osReauthenticator
           .asyncReauthenticateUser(reauth, dialogCaption, parentWindow)
           .then(reauthResult => {
-            if (typeof reauthResult == "boolean" && !reauthResult) {
+            if (typeof reauthResult[0] == "boolean" && !reauthResult[0]) {
               throw new Components.Exception(
                 "User canceled OS reauth entry",
                 Cr.NS_ERROR_FAILURE
               );
             }
+            let result = {
+              authenticated: true,
+              auth_details: "success",
+            };
+            if (reauthResult.length == 2 && reauthResult[1]) {
+              result.auth_details += "_no_password";
+            }
+            return result;
           });
       } else {
         log.debug("ensureLoggedIn: Skipping reauth on unsupported platforms");
-        unlockPromise = Promise.resolve();
+        unlockPromise = Promise.resolve({
+          authenticated: true,
+          auth_details: "success_unsupported_platform",
+        });
       }
     } else {
-      unlockPromise = Promise.resolve();
+      unlockPromise = Promise.resolve({ authenticated: true });
     }
 
     if (generateKeyIfNotAvailable) {
-      unlockPromise = unlockPromise.then(async () => {
+      unlockPromise = unlockPromise.then(async reauthResult => {
         if (!(await nativeOSKeyStore.asyncSecretAvailable(this.STORE_LABEL))) {
           log.debug(
             "ensureLoggedIn: Secret unavailable, attempt to generate new secret."
@@ -227,23 +238,24 @@ var OSKeyStore = {
               recoveryPhrase.length
           );
         }
+        return reauthResult;
       });
     }
 
     unlockPromise = unlockPromise.then(
-      () => {
+      reauthResult => {
         log.debug("ensureLoggedIn: Logged in");
         this._pendingUnlockPromise = null;
         this._isLocked = false;
 
-        return true;
+        return reauthResult;
       },
       err => {
         log.debug("ensureLoggedIn: Not logged in", err);
         this._pendingUnlockPromise = null;
         this._isLocked = true;
 
-        return false;
+        return { authenticated: false, auth_details: "fail" };
       }
     );
 
@@ -267,7 +279,7 @@ var OSKeyStore = {
    * @returns {Promise<string>}           resolves to the decrypted string, or rejects otherwise.
    */
   async decrypt(cipherText, reauth = false) {
-    if (!(await this.ensureLoggedIn(reauth))) {
+    if (!(await this.ensureLoggedIn(reauth)).authenticated) {
       throw Components.Exception(
         "User canceled OS unlock entry",
         Cr.NS_ERROR_ABORT
@@ -287,7 +299,7 @@ var OSKeyStore = {
    * @returns {Promise<string>} resolves to the encrypted string (with algorithm), otherwise rejects.
    */
   async encrypt(plainText) {
-    if (!(await this.ensureLoggedIn())) {
+    if (!(await this.ensureLoggedIn()).authenticated) {
       throw Components.Exception(
         "User canceled OS unlock entry",
         Cr.NS_ERROR_ABORT
diff --git a/toolkit/modules/tests/xpcshell/test_osKeyStore.js b/toolkit/modules/tests/xpcshell/test_osKeyStore.js
index 8c237395237f..82d567f5d7eb 100644
--- a/toolkit/modules/tests/xpcshell/test_osKeyStore.js
+++ b/toolkit/modules/tests/xpcshell/test_osKeyStore.js
@@ -34,7 +34,11 @@ const testText = "test string";
 let cipherText;
 
 add_task(async function test_encrypt_decrypt() {
-  Assert.equal(await OSKeyStore.ensureLoggedIn(), true, "Started logged in.");
+  Assert.equal(
+    (await OSKeyStore.ensureLoggedIn()).authenticated,
+    true,
+    "Started logged in."
+  );
 
   cipherText = await OSKeyStore.encrypt(testText);
   Assert.notEqual(testText, cipherText);
@@ -67,7 +71,7 @@ add_task(async function test_reauth() {
   reauthObserved = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(false);
   await new Promise(resolve => TestUtils.executeSoon(resolve));
   Assert.equal(
-    await OSKeyStore.ensureLoggedIn("test message"),
+    (await OSKeyStore.ensureLoggedIn("test message")).authenticated,
     false,
     "Reauth cancelled."
   );
@@ -82,7 +86,7 @@ add_task(async function test_reauth() {
   reauthObserved = OSKeyStoreTestUtils.waitForOSKeyStoreLogin(true);
   await new Promise(resolve => TestUtils.executeSoon(resolve));
   Assert.equal(
-    await OSKeyStore.ensureLoggedIn("test message"),
+    (await OSKeyStore.ensureLoggedIn("test message")).authenticated,
     true,
     "Reauth logged in."
   );
diff --git a/toolkit/mozapps/defaultagent/Telemetry.cpp b/toolkit/mozapps/defaultagent/Telemetry.cpp
index 6313801a6ce9..1aacf1c5c549 100644
--- a/toolkit/mozapps/defaultagent/Telemetry.cpp
+++ b/toolkit/mozapps/defaultagent/Telemetry.cpp
@@ -31,8 +31,8 @@
 
 // This is almost the complete URL, just needs a UUID appended.
 #define TELEMETRY_PING_URL                                              \
-  TELEMETRY_BASE_URL "/" TELEMETRY_NAMESPACE "/" TELEMETRY_PING_VERSION \
-                     "/" TELEMETRY_PING_DOCTYPE "/"
+  TELEMETRY_BASE_URL "/" TELEMETRY_NAMESPACE "/" TELEMETRY_PING_DOCTYPE \
+                     "/" TELEMETRY_PING_VERSION "/"
 
 #if !defined(RRF_SUBKEY_WOW6464KEY)
 #  define RRF_SUBKEY_WOW6464KEY 0x00010000
@@ -309,7 +309,7 @@ static mozilla::WindowsError SendPing(std::string defaultBrowser,
   // Fill in the ping JSON object.
   Json::Value ping;
   ping["build_channel"] = MOZ_STRINGIFY(MOZ_UPDATE_CHANNEL);
-  ping["version"] = MOZILLA_VERSION;
+  ping["build_version"] = MOZILLA_VERSION;
   ping["default_browser"] = defaultBrowser;
   ping["previous_default_browser"] = previousDefaultBrowser;
   ping["os_version"] = osVersion;
diff --git a/toolkit/mozapps/extensions/content/aboutaddons.html b/toolkit/mozapps/extensions/content/aboutaddons.html
index 2c9c8880eb6a..97f68e68044b 100644
--- a/toolkit/mozapps/extensions/content/aboutaddons.html
+++ b/toolkit/mozapps/extensions/content/aboutaddons.html
@@ -69,7 +69,7 @@
           <search-addons data-l10n-id="search-header-shortcut" data-l10n-attrs="key"></search-addons>
         </div>
         <div class="main-heading">
-          <button class="back-button" action="go-back" data-l10n-id="go-back-button" hidden></button>
+          <button class="back-button" action="go-back" data-l10n-id="header-back-button" hidden></button>
           <h1 class="header-name"></h1>
           <div class="spacer"></div>
           <addon-updates-message id="updates-message" hidden></addon-updates-message>
diff --git a/toolkit/mozapps/extensions/content/aboutaddons.js b/toolkit/mozapps/extensions/content/aboutaddons.js
index 927173b2a746..b3e3490fec65 100644
--- a/toolkit/mozapps/extensions/content/aboutaddons.js
+++ b/toolkit/mozapps/extensions/content/aboutaddons.js
@@ -1642,6 +1642,8 @@ class CategoryButton extends HTMLButtonElement {
     // Make sure the aria-selected attribute is set correctly.
     this.selected = this.hasAttribute("selected");
 
+    document.l10n.setAttributes(this, `addon-category-${this.name}-title`);
+
     let text = document.createElement("span");
     text.classList.add("category-name");
     document.l10n.setAttributes(text, `addon-category-${this.name}`);
@@ -1920,6 +1922,7 @@ class SidebarFooter extends HTMLElement {
     prefsLink.classList.add("sidebar-footer-link", "preferences-icon");
     prefsLink.id = "preferencesButton";
     prefsLink.href = "about:preferences";
+    document.l10n.setAttributes(prefsLink, "sidebar-preferences-button-title");
     let systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
     prefsLink.addEventListener("click", e => {
       e.preventDefault();
@@ -1944,6 +1947,7 @@ class SidebarFooter extends HTMLElement {
     let supportItem = document.createElement("li");
     supportItem.classList.add("sidebar-footer-item");
     let supportLink = document.createElement("a", { is: "support-link" });
+    document.l10n.setAttributes(supportLink, "sidebar-help-button-title");
     supportLink.classList.add("sidebar-footer-link", "help-icon");
     supportLink.id = "help-button";
     supportLink.setAttribute("support-page", "addons-help");
diff --git a/widget/cocoa/nsCocoaUtils.mm b/widget/cocoa/nsCocoaUtils.mm
index a54d50c7f31d..689ff5a46d67 100644
--- a/widget/cocoa/nsCocoaUtils.mm
+++ b/widget/cocoa/nsCocoaUtils.mm
@@ -1254,7 +1254,7 @@ nsresult nsCocoaUtils::GetScreenCapturePermissionState(uint16_t& aPermissionStat
     // screen. We use the window name, window level, and owning PID as
     // heuristics to determine if we have screen recording permission.
     AutoCFRelease<CFArrayRef> windowArray =
-        CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
+        CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID);
     if (!windowArray) {
       LOG("GetScreenCapturePermissionState() ERROR: got NULL window info list");
       return NS_ERROR_UNEXPECTED;
@@ -1449,6 +1449,7 @@ void nsCocoaUtils::ResolveAudioCapturePromises(bool aGranted) {
 // in which case macOS does not display the dialog again.
 //
 nsresult nsCocoaUtils::MaybeRequestScreenCapturePermission() {
+  LOG("MaybeRequestScreenCapturePermission()");
   AutoCFRelease<CGImageRef> image =
       CGDisplayCreateImageForRect(kCGDirectMainDisplay, CGRectMake(0, 0, 1, 1));
   return NS_OK;
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
index 522c51b98e21..aaa88a316277 100644
--- a/widget/cocoa/nsCocoaWindow.mm
+++ b/widget/cocoa/nsCocoaWindow.mm
@@ -496,6 +496,9 @@ nsresult nsCocoaWindow::CreateNativeWindow(const NSRect& aRect, nsBorderStyle aB
 
   if (mAlwaysOnTop) {
     [mWindow setLevel:NSFloatingWindowLevel];
+    NSWindowCollectionBehavior newBehavior = [mWindow collectionBehavior];
+    newBehavior |= NSWindowCollectionBehaviorCanJoinAllSpaces;
+    [mWindow setCollectionBehavior:newBehavior];
   }
 
   [mWindow setContentMinSize:NSMakeSize(60, 60)];
diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp
index 22fbd0718d31..372158c9f0f3 100644
--- a/widget/gtk/WindowSurfaceWayland.cpp
+++ b/widget/gtk/WindowSurfaceWayland.cpp
@@ -649,13 +649,14 @@ WindowBackBuffer* WindowSurfaceWayland::SetNewWaylandBuffer(
   LOGWAYLAND(
       ("WindowSurfaceWayland::NewWaylandBuffer [%p] Requested buffer [%d "
        "x %d] DMABuf %d\n",
-       (void*)this, mWidgetRect.width, mWidgetRect.height, aUseDMABufBackend));
+       (void*)this, mWLBufferRect.width, mWLBufferRect.height,
+       aUseDMABufBackend));
 
   mWaylandBuffer = WaylandBufferFindAvailable(
-      mWidgetRect.width, mWidgetRect.height, aUseDMABufBackend);
+      mWLBufferRect.width, mWLBufferRect.height, aUseDMABufBackend);
   if (!mWaylandBuffer) {
-    mWaylandBuffer = CreateWaylandBuffer(mWidgetRect.width, mWidgetRect.height,
-                                         aUseDMABufBackend);
+    mWaylandBuffer = CreateWaylandBuffer(
+        mWLBufferRect.width, mWLBufferRect.height, aUseDMABufBackend);
   }
 
   return mWaylandBuffer;
@@ -665,7 +666,7 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferRecent() {
   LOGWAYLAND(
       ("WindowSurfaceWayland::GetWaylandBufferRecent [%p] Requested buffer [%d "
        "x %d]\n",
-       (void*)this, mWidgetRect.width, mWidgetRect.height));
+       (void*)this, mWLBufferRect.width, mWLBufferRect.height));
 
   // There's no buffer created yet, create a new one for partial screen updates.
   if (!mWaylandBuffer) {
@@ -677,9 +678,10 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferRecent() {
     return nullptr;
   }
 
-  if (mWaylandBuffer->IsMatchingSize(mWidgetRect.width, mWidgetRect.height)) {
-    LOGWAYLAND(("    Size is ok, use the buffer [%d x %d]\n", mWidgetRect.width,
-                mWidgetRect.height));
+  if (mWaylandBuffer->IsMatchingSize(mWLBufferRect.width,
+                                     mWLBufferRect.height)) {
+    LOGWAYLAND(("    Size is ok, use the buffer [%d x %d]\n",
+                mWLBufferRect.width, mWLBufferRect.height));
     return mWaylandBuffer;
   }
 
@@ -694,7 +696,7 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferWithSwitch() {
   LOGWAYLAND(
       ("WindowSurfaceWayland::GetWaylandBufferWithSwitch [%p] Requested buffer "
        "[%d x %d]\n",
-       (void*)this, mWidgetRect.width, mWidgetRect.height));
+       (void*)this, mWLBufferRect.width, mWLBufferRect.height));
 
   // There's no buffer created yet or actual buffer is attached, get a new one.
   // Use DMABuf for fullscreen updates only.
@@ -703,20 +705,21 @@ WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferWithSwitch() {
   }
 
   // Reuse existing buffer
-  LOGWAYLAND(("    Reuse buffer with resize [%d x %d]\n", mWidgetRect.width,
-              mWidgetRect.height));
+  LOGWAYLAND(("    Reuse buffer with resize [%d x %d]\n", mWLBufferRect.width,
+              mWLBufferRect.height));
 
   // OOM here, just return null to skip this frame.
-  if (!mWaylandBuffer->Resize(mWidgetRect.width, mWidgetRect.height)) {
+  if (!mWaylandBuffer->Resize(mWLBufferRect.width, mWLBufferRect.height)) {
     return nullptr;
   }
   return mWaylandBuffer;
 }
 
 already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::LockWaylandBuffer() {
-  // Allocated wayland buffer must match widget size, otherwise wayland
-  // compositor is confused and may produce various rendering artifacts.
-  mWidgetRect = mWindow->GetMozContainerSize();
+  // Allocated wayland buffer can't be bigger than mozilla widget size.
+  LayoutDeviceIntRegion region;
+  region.And(mLockedScreenRect, mWindow->GetMozContainerSize());
+  mWLBufferRect = LayoutDeviceIntRect(region.GetBounds());
 
   // mCanSwitchWaylandBuffer set means we're getting buffer for fullscreen
   // update. We can use DMABuf and we can get a new buffer for drawing.
@@ -883,8 +886,8 @@ already_AddRefed<gfx::DrawTarget> WindowSurfaceWayland::Lock(
 
   // We can draw directly only when widget has the same size as wl_buffer
   LayoutDeviceIntRect size = mWindow->GetMozContainerSize();
-  mDrawToWaylandBufferDirectly = (size.width == mLockedScreenRect.width &&
-                                  size.height == mLockedScreenRect.height);
+  mDrawToWaylandBufferDirectly = (size.width >= mLockedScreenRect.width &&
+                                  size.height >= mLockedScreenRect.height);
 
   // We can draw directly only when we redraw significant part of the window
   // to avoid flickering or do only fullscreen updates in smooth mode.
diff --git a/widget/gtk/WindowSurfaceWayland.h b/widget/gtk/WindowSurfaceWayland.h
index d9f06db24a37..299f22b83528 100644
--- a/widget/gtk/WindowSurfaceWayland.h
+++ b/widget/gtk/WindowSurfaceWayland.h
@@ -264,11 +264,11 @@ class WindowSurfaceWayland : public WindowSurface {
   // mLockedScreenRect is window size when our wayland buffer was allocated.
   LayoutDeviceIntRect mLockedScreenRect;
 
-  // WidgetRect is an actual size of mozcontainer widget. It can be
-  // different than mLockedScreenRect during resize when mBounds are updated
-  // immediately but actual GtkWidget size is updated asynchronously
-  // (see Bug 1489463).
-  LayoutDeviceIntRect mWidgetRect;
+  // mWLBufferRect is an intersection of mozcontainer widgetsize and
+  // mLockedScreenRect size. It can be different than mLockedScreenRect
+  // during resize when mBounds are updated immediately but actual
+  // GtkWidget size is updated asynchronously (see Bug 1489463).
+  LayoutDeviceIntRect mWLBufferRect;
   nsWaylandDisplay* mWaylandDisplay;
 
   // Actual buffer (backed by wl_buffer) where all drawings go into.
diff --git a/widget/windows/GfxInfo.cpp b/widget/windows/GfxInfo.cpp
index f6748dbe69ca..bc668257c837 100644
--- a/widget/windows/GfxInfo.cpp
+++ b/widget/windows/GfxInfo.cpp
@@ -1254,12 +1254,6 @@ const nsTArray<GfxDriverInfo>& GfxInfo::GetGfxDriverInfo() {
         DRIVER_BETWEEN_INCLUSIVE_START, V(8, 17, 10, 0000), V(8, 17, 11, 8745),
         "FEATURE_FAILURE_NV_W7_17", "nVidia driver > 187.45");
 
-    // Bug 1625857 - Rendering is very distorted with this particular driver.
-    APPEND_TO_DRIVER_BLOCKLIST2(
-        OperatingSystem::Windows, DeviceFamily::NvidiaAll,
-        GfxDriverInfo::allFeatures, nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION,
-        DRIVER_EQUAL, V(26, 21, 14, 4575), "NVIDIA driver != 26.21.14.4575");
-
     /*
      * AMD/ATI entries. 8.56.1.15 is the driver that shipped with Windows 7 RTM
      */
diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp
index 4964cb82edff..74e02f82f7ba 100644
--- a/widget/windows/nsWindow.cpp
+++ b/widget/windows/nsWindow.cpp
@@ -4215,7 +4215,8 @@ bool nsWindow::DispatchMouseEvent(EventMessage aEventMessage, WPARAM wParam,
 
   if (WinUtils::GetIsMouseFromTouch(aEventMessage)) {
     if (aEventMessage == eMouseDown) {
-      Telemetry::Accumulate(Telemetry::FX_TOUCH_USED, 1);
+      Telemetry::ScalarAdd(Telemetry::ScalarID::BROWSER_INPUT_TOUCH_EVENT_COUNT,
+                           1);
     }
 
     // Fire an observer when the user initially touches a touch screen. Front
diff --git a/xpcom/io/SlicedInputStream.cpp b/xpcom/io/SlicedInputStream.cpp
index d24edcba43e3..be23c95c8644 100644
--- a/xpcom/io/SlicedInputStream.cpp
+++ b/xpcom/io/SlicedInputStream.cpp
@@ -70,6 +70,8 @@ SlicedInputStream::SlicedInputStream()
       mWeakSeekableInputStream(nullptr),
       mWeakTellableInputStream(nullptr),
       mWeakAsyncInputStream(nullptr),
+      mWeakInputStreamLength(nullptr),
+      mWeakAsyncInputStreamLength(nullptr),
       mStart(0),
       mLength(0),
       mCurPos(0),
-- 
GitLab